[ES6] Date.prototype should be a plain object
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 6 Jan 2016 12:17:05 +0000 (12:17 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 6 Jan 2016 12:17:05 +0000 (12:17 +0000)
https://bugs.webkit.org/show_bug.cgi?id=152574

Patch by Andy VanWagoner <thetalecrafter@gmail.com> on 2016-01-06
Reviewed by Benjamin Poulain.

Source/JavaScriptCore:

* runtime/DateConstructor.cpp:
(JSC::DateConstructor::finishCreation):
* runtime/DatePrototype.cpp:
(JSC::DatePrototype::DatePrototype):
* runtime/DatePrototype.h:
* tests/mozilla/mozilla-tests.yaml: Expect errors from old Date.prototype as Date instance tests.

LayoutTests:

Test that the non-generic Date.prototype methods throw when invoked
from the now generic object Date.prototype. Also test that this change
preserves correct instanceof behavior.

* js/date-proto-generic-invocation-expected.txt:
* js/script-tests/date-proto-generic-invocation.js:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@194636 268f45cc-cd09-0410-ab3c-d52691b4dbfc

LayoutTests/ChangeLog
LayoutTests/js/date-proto-generic-invocation-expected.txt
LayoutTests/js/script-tests/date-proto-generic-invocation.js
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/runtime/DateConstructor.cpp
Source/JavaScriptCore/runtime/DatePrototype.cpp
Source/JavaScriptCore/runtime/DatePrototype.h
Source/JavaScriptCore/tests/mozilla/mozilla-tests.yaml

index e12dd38..d3cd275 100644 (file)
@@ -1,3 +1,17 @@
+2016-01-06  Andy VanWagoner  <thetalecrafter@gmail.com>
+
+        [ES6] Date.prototype should be a plain object
+        https://bugs.webkit.org/show_bug.cgi?id=152574
+
+        Reviewed by Benjamin Poulain.
+
+        Test that the non-generic Date.prototype methods throw when invoked
+        from the now generic object Date.prototype. Also test that this change
+        preserves correct instanceof behavior.
+
+        * js/date-proto-generic-invocation-expected.txt:
+        * js/script-tests/date-proto-generic-invocation.js:
+
 2016-01-05  Brady Eidson  <beidson@apple.com>
 
         Unreviewed IndexedDB test gardening
index 90fc1c2..0d891da 100644 (file)
@@ -1,4 +1,4 @@
-This test verifies that the functions of the Date prototype object are not generic, as documented in ECMA-262 rev3 section 15.9.5 Properties of the Date Prototype Object.
+This test verifies that the functions of the Date prototype object are not generic, and the prototype is a plain object, as documented in ECMA-262 rev6 section 20.3.4 Properties of the Date Prototype Object.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
 
@@ -31,6 +31,38 @@ PASS o.__proto__.setDate() threw exception TypeError: Type error.
 PASS o.__proto__.setMonth() threw exception TypeError: Type error.
 PASS o.__proto__.setFullYear() threw exception TypeError: Type error.
 PASS o.__proto__.setYear() threw exception TypeError: Type error.
+PASS Date.prototype.toString() threw exception TypeError: Type error.
+PASS Date.prototype.toDateString() threw exception TypeError: Type error.
+PASS Date.prototype.toTimeString() threw exception TypeError: Type error.
+PASS Date.prototype.toGMTString() threw exception TypeError: Type error.
+PASS Date.prototype.toUTCString() threw exception TypeError: Type error.
+PASS Date.prototype.toLocaleString() threw exception TypeError: Type error.
+PASS Date.prototype.toLocaleDateString() threw exception TypeError: Type error.
+PASS Date.prototype.toLocaleTimeString() threw exception TypeError: Type error.
+PASS Date.prototype.getTime() threw exception TypeError: Type error.
+PASS Date.prototype.getYear() threw exception TypeError: Type error.
+PASS Date.prototype.getFullYear() threw exception TypeError: Type error.
+PASS Date.prototype.getMonth() threw exception TypeError: Type error.
+PASS Date.prototype.getDate() threw exception TypeError: Type error.
+PASS Date.prototype.getDay() threw exception TypeError: Type error.
+PASS Date.prototype.getHours() threw exception TypeError: Type error.
+PASS Date.prototype.getMinutes() threw exception TypeError: Type error.
+PASS Date.prototype.getSeconds() threw exception TypeError: Type error.
+PASS Date.prototype.getMilliseconds() threw exception TypeError: Type error.
+PASS Date.prototype.getTimezoneOffset() threw exception TypeError: Type error.
+PASS Date.prototype.setTime() threw exception TypeError: Type error.
+PASS Date.prototype.setMilliseconds() threw exception TypeError: Type error.
+PASS Date.prototype.setSeconds() threw exception TypeError: Type error.
+PASS Date.prototype.setMinutes() threw exception TypeError: Type error.
+PASS Date.prototype.setHours() threw exception TypeError: Type error.
+PASS Date.prototype.setDate() threw exception TypeError: Type error.
+PASS Date.prototype.setMonth() threw exception TypeError: Type error.
+PASS Date.prototype.setFullYear() threw exception TypeError: Type error.
+PASS Date.prototype.setYear() threw exception TypeError: Type error.
+PASS new Date instanceof Date is true
+PASS (new Date).__proto__ is Date.prototype
+PASS (new Date).__proto__ instanceof Date is false
+PASS Date.prototype instanceof Date is false
 PASS successfullyParsed is true
 
 TEST COMPLETE
index 3206bf0..160107d 100644 (file)
@@ -1,4 +1,4 @@
-description("This test verifies that the functions of the Date prototype object are not generic, as documented in ECMA-262 rev3 section 15.9.5 Properties of the Date Prototype Object.");
+description("This test verifies that the functions of the Date prototype object are not generic, and the prototype is a plain object, as documented in ECMA-262 rev6 section 20.3.4 Properties of the Date Prototype Object.");
 
 var functionNames = [
         "Date.prototype.toString",
@@ -38,3 +38,11 @@ for (var i = 0; i < functionNames.length; i++) {
     eval(testFunctionName + " = " + functionNames[i]);
     shouldThrow(testFunctionName + "()", '"TypeError: Type error"');
 }
+for (var i = 0; i < functionNames.length; i++) {
+    shouldThrow(functionNames[i] + "()", '"TypeError: Type error"');
+}
+
+shouldBeTrue("new Date instanceof Date");
+shouldBe("(new Date).__proto__", "Date.prototype");
+shouldBeFalse("(new Date).__proto__ instanceof Date");
+shouldBeFalse("Date.prototype instanceof Date");
index b2b6360..a1e09a8 100644 (file)
@@ -1,3 +1,17 @@
+2016-01-06  Andy VanWagoner  <thetalecrafter@gmail.com>
+
+        [ES6] Date.prototype should be a plain object
+        https://bugs.webkit.org/show_bug.cgi?id=152574
+
+        Reviewed by Benjamin Poulain.
+
+        * runtime/DateConstructor.cpp:
+        (JSC::DateConstructor::finishCreation):
+        * runtime/DatePrototype.cpp:
+        (JSC::DatePrototype::DatePrototype):
+        * runtime/DatePrototype.h:
+        * tests/mozilla/mozilla-tests.yaml: Expect errors from old Date.prototype as Date instance tests.
+
 2016-01-06  Benjamin Poulain  <bpoulain@apple.com>
 
         [JSC] Get more of testb3 to pass on ARM64
index 74a8278..3afd1c5 100644 (file)
@@ -102,7 +102,7 @@ DateConstructor::DateConstructor(VM& vm, Structure* structure)
 
 void DateConstructor::finishCreation(VM& vm, DatePrototype* datePrototype)
 {
-    Base::finishCreation(vm, datePrototype->classInfo()->className);
+    Base::finishCreation(vm, "Date");
     putDirectWithoutTransition(vm, vm.propertyNames->prototype, datePrototype, DontEnum | DontDelete | ReadOnly);
     putDirectWithoutTransition(vm, vm.propertyNames->length, jsNumber(7), ReadOnly | DontEnum | DontDelete);
 }
index fe87479..53f7ea3 100644 (file)
@@ -425,7 +425,7 @@ static bool fillStructuresUsingDateArgs(ExecState *exec, int maxArgs, double *ms
     return ok;
 }
 
-const ClassInfo DatePrototype::s_info = {"Date", &DateInstance::s_info, &dateTable, CREATE_METHOD_TABLE(DatePrototype)};
+const ClassInfo DatePrototype::s_info = {"Object", &JSNonFinalObject::s_info, &dateTable, CREATE_METHOD_TABLE(DatePrototype)};
 
 /* Source for DatePrototype.lut.h
 @begin dateTable
@@ -481,7 +481,7 @@ const ClassInfo DatePrototype::s_info = {"Date", &DateInstance::s_info, &dateTab
 // ECMA 15.9.4
 
 DatePrototype::DatePrototype(VM& vm, Structure* structure)
-    : DateInstance(vm, structure)
+    : Base(vm, structure)
 {
 }
 
index 6714d7e..7225ac5 100644 (file)
@@ -27,12 +27,12 @@ namespace JSC {
 
 class ObjectPrototype;
 
-class DatePrototype : public DateInstance {
+class DatePrototype : public JSNonFinalObject {
 private:
     DatePrototype(VM&, Structure*);
 
 public:
-    typedef DateInstance Base;
+    typedef JSNonFinalObject Base;
     static const unsigned StructureFlags = Base::StructureFlags | OverridesGetOwnPropertySlot;
 
     static DatePrototype* create(VM& vm, JSGlobalObject* globalObject, Structure* structure)
index 4d16466..736c1bf 100644 (file)
 - path: ecma/Date/15.9.5.9.js
   cmd: defaultRunMozillaTest :normal, "../shell.js"
 - path: ecma/Date/15.9.5.js
-  cmd: defaultRunMozillaTest :normal, "../shell.js"
+  cmd: defaultRunMozillaTest :negative, "../shell.js"
 - path: ecma/ExecutionContexts/10.1.3-1.js
   cmd: defaultRunMozillaTest :normal, "../shell.js"
 - path: ecma/ExecutionContexts/10.1.3.js