Move 'length' property to the prototype
authorcdumez@apple.com <cdumez@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 11 Feb 2016 18:23:25 +0000 (18:23 +0000)
committercdumez@apple.com <cdumez@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 11 Feb 2016 18:23:25 +0000 (18:23 +0000)
https://bugs.webkit.org/show_bug.cgi?id=154051
<rdar://problem/24577385>

Reviewed by Darin Adler.

LayoutTests/imported/w3c:

Rebaseline several W3C tests now that more checks are passing.

* web-platform-tests/dom/collections/HTMLCollection-supported-property-names-expected.txt:
* web-platform-tests/dom/collections/namednodemap-supported-property-names-expected.txt:
* web-platform-tests/dom/interfaces-expected.txt:
* web-platform-tests/dom/nodes/Element-children-expected.txt:
* web-platform-tests/dom/nodes/Element-getElementsByTagName-expected.txt:
* web-platform-tests/dom/nodes/attributes-expected.txt:
* web-platform-tests/html/dom/documents/dom-tree-accessors/document.forms-expected.txt:
* web-platform-tests/html/dom/interfaces-expected.txt:

Source/WebCore:

Move 'length' property to the prototype, where it should be. We used to
keep it on the instance because our implementation of
getOwnPropertySlot() was wrong for interfaces with a named property
getter. However, our implementation of getOwnPropertySlot() is now
spec-compliant so this should be OK.

Moving 'length' to the prototype is also a little bit risky in terms of
performance, especially for HTMLCollection / NodeList. However, I did
not see an impact on realistic benchmarks like Speedometer and only saw
a small impact (< 5%) on micro-benchmarks. I propose we make our behavior
correct and monitor performance. If we see any benchmark we care about
regress then we should try and optimize while keeping the attribute on
the prototype.

No new tests, already covered by existing tests.

* bindings/js/JSDOMBinding.h:
(WebCore::getStaticValueSlotEntryWithoutCaching):
* bindings/js/JSHTMLDocumentCustom.cpp:
(WebCore::JSHTMLDocument::getOwnPropertySlot):
(WebCore::JSHTMLDocument::nameGetter): Deleted.
* bindings/js/JSLocationCustom.cpp:
(WebCore::JSLocation::putDelegate):
* bindings/js/JSPluginElementFunctions.h:
(WebCore::pluginElementCustomGetOwnPropertySlot):
* bindings/js/JSStorageCustom.cpp:
(WebCore::JSStorage::deleteProperty):
(WebCore::JSStorage::deletePropertyByIndex):
(WebCore::JSStorage::putDelegate):
Leverage the new hasStaticPropertyTable static property in the
generated bindings for performance.

* bindings/scripts/CodeGeneratorJS.pm:
(GenerateHeader):
Generate a "hasStaticPropertyTable" static const boolean property
for each bindings class so we can check at build time if
ClassInfo::staticPropHashTable is null.

(AttributeShouldBeOnInstance):
Move "length" to the prototype.

* bindings/scripts/test/JS/JSTestActiveDOMObject.h:
* bindings/scripts/test/JS/JSTestClassWithJSBuiltinConstructor.h:
* bindings/scripts/test/JS/JSTestCustomConstructorWithNoInterfaceObject.h:
* bindings/scripts/test/JS/JSTestCustomNamedGetter.h:
* bindings/scripts/test/JS/JSTestEventConstructor.h:
* bindings/scripts/test/JS/JSTestEventTarget.h:
* bindings/scripts/test/JS/JSTestException.h:
* bindings/scripts/test/JS/JSTestGenerateIsReachable.h:
* bindings/scripts/test/JS/JSTestInterface.h:
* bindings/scripts/test/JS/JSTestJSBuiltinConstructor.h:
* bindings/scripts/test/JS/JSTestMediaQueryListListener.h:
* bindings/scripts/test/JS/JSTestNamedConstructor.h:
* bindings/scripts/test/JS/JSTestNode.h:
* bindings/scripts/test/JS/JSTestNondeterministic.h:
* bindings/scripts/test/JS/JSTestObj.h:
* bindings/scripts/test/JS/JSTestOverloadedConstructors.h:
* bindings/scripts/test/JS/JSTestOverrideBuiltins.h:
* bindings/scripts/test/JS/JSTestSerializedScriptValueInterface.h:
* bindings/scripts/test/JS/JSTestTypedefs.h:
* bindings/scripts/test/JS/JSattribute.h:
* bindings/scripts/test/JS/JSreadonly.h:
Rebaseline bindings tests.

LayoutTests:

Rebaseline a couple of existing layout tests now that 'length' is
on the prototype.

* fast/dom/htmlcollection-getownpropertynames-expected.txt:
* storage/domstorage/localstorage/delete-defineproperty-removal-expected.txt:

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

40 files changed:
LayoutTests/ChangeLog
LayoutTests/fast/dom/htmlcollection-getownpropertynames-expected.txt
LayoutTests/imported/w3c/ChangeLog
LayoutTests/imported/w3c/web-platform-tests/dom/collections/HTMLCollection-supported-property-names-expected.txt
LayoutTests/imported/w3c/web-platform-tests/dom/collections/namednodemap-supported-property-names-expected.txt
LayoutTests/imported/w3c/web-platform-tests/dom/interfaces-expected.txt
LayoutTests/imported/w3c/web-platform-tests/dom/nodes/Element-children-expected.txt
LayoutTests/imported/w3c/web-platform-tests/dom/nodes/Element-getElementsByTagName-expected.txt
LayoutTests/imported/w3c/web-platform-tests/dom/nodes/attributes-expected.txt
LayoutTests/imported/w3c/web-platform-tests/html/dom/documents/dom-tree-accessors/document.forms-expected.txt
LayoutTests/imported/w3c/web-platform-tests/html/dom/interfaces-expected.txt
LayoutTests/storage/domstorage/localstorage/delete-defineproperty-removal-expected.txt
Source/WebCore/ChangeLog
Source/WebCore/bindings/js/JSDOMBinding.h
Source/WebCore/bindings/js/JSHTMLDocumentCustom.cpp
Source/WebCore/bindings/js/JSLocationCustom.cpp
Source/WebCore/bindings/js/JSPluginElementFunctions.h
Source/WebCore/bindings/js/JSStorageCustom.cpp
Source/WebCore/bindings/scripts/CodeGeneratorJS.pm
Source/WebCore/bindings/scripts/test/JS/JSTestActiveDOMObject.h
Source/WebCore/bindings/scripts/test/JS/JSTestClassWithJSBuiltinConstructor.h
Source/WebCore/bindings/scripts/test/JS/JSTestCustomConstructorWithNoInterfaceObject.h
Source/WebCore/bindings/scripts/test/JS/JSTestCustomNamedGetter.h
Source/WebCore/bindings/scripts/test/JS/JSTestEventConstructor.h
Source/WebCore/bindings/scripts/test/JS/JSTestEventTarget.h
Source/WebCore/bindings/scripts/test/JS/JSTestException.h
Source/WebCore/bindings/scripts/test/JS/JSTestGenerateIsReachable.h
Source/WebCore/bindings/scripts/test/JS/JSTestInterface.h
Source/WebCore/bindings/scripts/test/JS/JSTestJSBuiltinConstructor.h
Source/WebCore/bindings/scripts/test/JS/JSTestMediaQueryListListener.h
Source/WebCore/bindings/scripts/test/JS/JSTestNamedConstructor.h
Source/WebCore/bindings/scripts/test/JS/JSTestNode.h
Source/WebCore/bindings/scripts/test/JS/JSTestNondeterministic.h
Source/WebCore/bindings/scripts/test/JS/JSTestObj.h
Source/WebCore/bindings/scripts/test/JS/JSTestOverloadedConstructors.h
Source/WebCore/bindings/scripts/test/JS/JSTestOverrideBuiltins.h
Source/WebCore/bindings/scripts/test/JS/JSTestSerializedScriptValueInterface.h
Source/WebCore/bindings/scripts/test/JS/JSTestTypedefs.h
Source/WebCore/bindings/scripts/test/JS/JSattribute.h
Source/WebCore/bindings/scripts/test/JS/JSreadonly.h

index b1eedb0..d480a00 100644 (file)
@@ -1,3 +1,17 @@
+2016-02-11  Chris Dumez  <cdumez@apple.com>
+
+        Move 'length' property to the prototype
+        https://bugs.webkit.org/show_bug.cgi?id=154051
+        <rdar://problem/24577385>
+
+        Reviewed by Darin Adler.
+
+        Rebaseline a couple of existing layout tests now that 'length' is
+        on the prototype.
+
+        * fast/dom/htmlcollection-getownpropertynames-expected.txt:
+        * storage/domstorage/localstorage/delete-defineproperty-removal-expected.txt:
+
 2016-02-11  Frederic Wang  <fred.wang@free.fr>
 
         Use Testharness.js for the MathML script tests
index 3361031..b9f2f61 100644 (file)
@@ -4,7 +4,7 @@ On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE
 
 
 * Own properties
-Actual:   ['0', '1', '2', '3', '4', '5', '6', '7', 'some-id', 'some-name', 'another-id', 'another-name', 'length']
+Actual:   ['0', '1', '2', '3', '4', '5', '6', '7', 'some-id', 'some-name', 'another-id', 'another-name']
 Expected: ['0', '1', '2', '3', '4', '5', '6', '7', 'some-id', 'some-name', 'another-id', 'another-name']
 
 * Enumerated properties
index 9747df9..6e126a2 100644 (file)
@@ -1,3 +1,22 @@
+2016-02-11  Chris Dumez  <cdumez@apple.com>
+
+        Move 'length' property to the prototype
+        https://bugs.webkit.org/show_bug.cgi?id=154051
+        <rdar://problem/24577385>
+
+        Reviewed by Darin Adler.
+
+        Rebaseline several W3C tests now that more checks are passing.
+
+        * web-platform-tests/dom/collections/HTMLCollection-supported-property-names-expected.txt:
+        * web-platform-tests/dom/collections/namednodemap-supported-property-names-expected.txt:
+        * web-platform-tests/dom/interfaces-expected.txt:
+        * web-platform-tests/dom/nodes/Element-children-expected.txt:
+        * web-platform-tests/dom/nodes/Element-getElementsByTagName-expected.txt:
+        * web-platform-tests/dom/nodes/attributes-expected.txt:
+        * web-platform-tests/html/dom/documents/dom-tree-accessors/document.forms-expected.txt:
+        * web-platform-tests/html/dom/interfaces-expected.txt:
+
 2016-02-10  Chris Dumez  <cdumez@apple.com>
 
         [Web IDL] interface objects should be Function objects
index b703bb1..d97b21e 100644 (file)
@@ -1,5 +1,5 @@
 
-FAIL Object.getOwnPropertyNames on HTMLCollection assert_array_equals: lengths differ, expected 12 got 13
-FAIL Object.getOwnPropertyNames on HTMLCollection with non-HTML namespace assert_array_equals: lengths differ, expected 1 got 2
-FAIL Object.getOwnPropertyNames on HTMLCollection with expando object assert_array_equals: lengths differ, expected 2 got 3
+PASS Object.getOwnPropertyNames on HTMLCollection 
+PASS Object.getOwnPropertyNames on HTMLCollection with non-HTML namespace 
+PASS Object.getOwnPropertyNames on HTMLCollection with expando object 
 
index 8dedcd0..dc28a1d 100644 (file)
@@ -1,7 +1,7 @@
 Simple
 
 
-FAIL Object.getOwnPropertyNames on NamedNodeMap assert_array_equals: lengths differ, expected 4 got 3
-FAIL Object.getOwnPropertyNames on NamedNodeMap of input assert_array_equals: lengths differ, expected 8 got 5
-FAIL Object.getOwnPropertyNames on NamedNodeMap after attribute removal assert_array_equals: lengths differ, expected 6 got 4
+FAIL Object.getOwnPropertyNames on NamedNodeMap assert_array_equals: lengths differ, expected 4 got 2
+FAIL Object.getOwnPropertyNames on NamedNodeMap of input assert_array_equals: lengths differ, expected 8 got 4
+FAIL Object.getOwnPropertyNames on NamedNodeMap after attribute removal assert_array_equals: lengths differ, expected 6 got 3
 
index 9d5449d..03a745d 100644 (file)
@@ -123,23 +123,23 @@ PASS NodeList interface object name
 PASS NodeList interface: existence and properties of interface prototype object 
 PASS NodeList interface: existence and properties of interface prototype object's "constructor" property 
 PASS NodeList interface: operation item(unsigned long) 
-FAIL NodeList interface: attribute length assert_true: The prototype object must have a property "length" expected true got false
+PASS NodeList interface: attribute length 
 PASS NodeList must be primary interface of document.querySelectorAll("script") 
 PASS Stringification of document.querySelectorAll("script") 
 PASS NodeList interface: document.querySelectorAll("script") must inherit property "item" with the proper type (0) 
 PASS NodeList interface: calling item(unsigned long) on document.querySelectorAll("script") with too few arguments must throw TypeError 
-FAIL NodeList interface: document.querySelectorAll("script") must inherit property "length" with the proper type (1) assert_inherits: property "length" found on object expected in prototype chain
+PASS NodeList interface: document.querySelectorAll("script") must inherit property "length" with the proper type (1) 
 PASS HTMLCollection interface: existence and properties of interface object 
 PASS HTMLCollection interface object length 
 PASS HTMLCollection interface object name 
 PASS HTMLCollection interface: existence and properties of interface prototype object 
 PASS HTMLCollection interface: existence and properties of interface prototype object's "constructor" property 
-FAIL HTMLCollection interface: attribute length assert_true: The prototype object must have a property "length" expected true got false
+PASS HTMLCollection interface: attribute length 
 FAIL HTMLCollection interface: operation item(unsigned long) assert_equals: property has wrong .length expected 1 but got 0
 FAIL HTMLCollection interface: operation namedItem(DOMString) assert_equals: property has wrong .length expected 1 but got 0
 PASS HTMLCollection must be primary interface of document.body.children 
 PASS Stringification of document.body.children 
-FAIL HTMLCollection interface: document.body.children must inherit property "length" with the proper type (0) assert_inherits: property "length" found on object expected in prototype chain
+PASS HTMLCollection interface: document.body.children must inherit property "length" with the proper type (0) 
 PASS HTMLCollection interface: document.body.children must inherit property "item" with the proper type (1) 
 FAIL HTMLCollection interface: calling item(unsigned long) on document.body.children with too few arguments must throw TypeError assert_throws: Called with 0 arguments function "function () {
     [native code]
@@ -932,7 +932,7 @@ PASS NamedNodeMap interface object length
 PASS NamedNodeMap interface object name 
 PASS NamedNodeMap interface: existence and properties of interface prototype object 
 PASS NamedNodeMap interface: existence and properties of interface prototype object's "constructor" property 
-FAIL NamedNodeMap interface: attribute length assert_true: The prototype object must have a property "length" expected true got false
+PASS NamedNodeMap interface: attribute length 
 FAIL NamedNodeMap interface: operation item(unsigned long) assert_equals: property has wrong .length expected 1 but got 0
 FAIL NamedNodeMap interface: operation getNamedItem(DOMString) assert_equals: property has wrong .length expected 1 but got 0
 FAIL NamedNodeMap interface: operation getNamedItemNS(DOMString,DOMString) assert_equals: property has wrong .length expected 2 but got 0
@@ -1561,7 +1561,7 @@ PASS DOMTokenList interface object length
 PASS DOMTokenList interface object name 
 PASS DOMTokenList interface: existence and properties of interface prototype object 
 PASS DOMTokenList interface: existence and properties of interface prototype object's "constructor" property 
-FAIL DOMTokenList interface: attribute length assert_true: The prototype object must have a property "length" expected true got false
+PASS DOMTokenList interface: attribute length 
 PASS DOMTokenList interface: operation item(unsigned long) 
 PASS DOMTokenList interface: operation contains(DOMString) 
 PASS DOMTokenList interface: operation add(DOMString) 
@@ -1573,7 +1573,7 @@ PASS DOMTokenList interface: attribute value
 FAIL DOMTokenList interface: stringifier assert_true: property is not enumerable expected true got false
 PASS DOMTokenList must be primary interface of document.body.classList 
 PASS Stringification of document.body.classList 
-FAIL DOMTokenList interface: document.body.classList must inherit property "length" with the proper type (0) assert_inherits: property "length" found on object expected in prototype chain
+PASS DOMTokenList interface: document.body.classList must inherit property "length" with the proper type (0) 
 PASS DOMTokenList interface: document.body.classList must inherit property "item" with the proper type (1) 
 PASS DOMTokenList interface: calling item(unsigned long) on document.body.classList with too few arguments must throw TypeError 
 PASS DOMTokenList interface: document.body.classList must inherit property "contains" with the proper type (2) 
index bc21593..d4186be 100644 (file)
@@ -1,5 +1,5 @@
 
 
 PASS HTMLCollection edge cases 
-FAIL HTMLCollection edge cases 1 assert_array_equals: lengths differ, expected 6 got 7
+FAIL HTMLCollection edge cases 1 assert_false: expected false got true
 
index e99346f..4c152d0 100644 (file)
@@ -8,7 +8,7 @@ FAIL Shouldn't be able to set unsigned properties on a HTMLCollection (strict mo
     }" did not throw
 PASS Should be able to set expando shadowing a proto prop (item) 
 PASS Should be able to set expando shadowing a proto prop (namedItem) 
-FAIL hasOwnProperty, getOwnPropertyDescriptor, getOwnPropertyNames assert_array_equals: lengths differ, expected 7 got 8
+FAIL hasOwnProperty, getOwnPropertyDescriptor, getOwnPropertyNames assert_true: desc.configurable expected true got false
 PASS HTML element with uppercase tagName never matches in HTML Documents 
 PASS Element in non-HTML namespace, no prefix, lowercase name 
 PASS Element in non-HTML namespace, no prefix, uppercase name 
index 3638fda..c2eb3a3 100644 (file)
@@ -47,11 +47,11 @@ PASS setAttributeNode, if it fires mutation events, should fire one with the new
 PASS setAttributeNode, if it fires mutation events, should fire one with the new node when resetting an existing attribute (outer shell) 
 PASS setAttributeNode called with an Attr that has the same name as an existing one should not change attribute order 
 FAIL getAttributeNames tests el.getAttributeNames is not a function. (In 'el.getAttributeNames()', 'el.getAttributeNames' is undefined)
-FAIL Own property correctness with basic attributes assert_array_equals: lengths differ, expected 2 got 3
-FAIL Own property correctness with non-namespaced attribute before same-name namespaced one assert_array_equals: lengths differ, expected 3 got 4
-FAIL Own property correctness with namespaced attribute before same-name non-namespaced one assert_array_equals: lengths differ, expected 3 got 4
-FAIL Own property correctness with two namespaced attributes with the same name-with-prefix assert_array_equals: lengths differ, expected 3 got 4
-FAIL Own property names should only include all-lowercase qualified names for an HTML element in an HTML document assert_array_equals: lengths differ, expected 8 got 7
-FAIL Own property names should include all qualified names for a non-HTML element in an HTML document assert_array_equals: lengths differ, expected 12 got 7
-FAIL Own property names should include all qualified names for an HTML element in a non-HTML document assert_array_equals: lengths differ, expected 12 got 7
+FAIL Own property correctness with basic attributes assert_array_equals: lengths differ, expected 4 got 2
+FAIL Own property correctness with non-namespaced attribute before same-name namespaced one assert_array_equals: lengths differ, expected 5 got 3
+FAIL Own property correctness with namespaced attribute before same-name non-namespaced one assert_array_equals: lengths differ, expected 5 got 3
+FAIL Own property correctness with two namespaced attributes with the same name-with-prefix assert_array_equals: lengths differ, expected 5 got 3
+FAIL Own property names should only include all-lowercase qualified names for an HTML element in an HTML document assert_array_equals: lengths differ, expected 8 got 6
+FAIL Own property names should include all qualified names for a non-HTML element in an HTML document assert_array_equals: lengths differ, expected 12 got 6
+FAIL Own property names should include all qualified names for an HTML element in a non-HTML document assert_array_equals: lengths differ, expected 12 got 6
 
index b69b102..cb6620e 100644 (file)
@@ -5,5 +5,5 @@ PASS document.forms
 PASS document.forms.item with string arg 
 PASS document.forms with empty string 
 FAIL document.forms iteration assert_array_equals: property 3, expected "item" but got "length"
-FAIL document.forms getOwnPropertyNames assert_array_equals: lengths differ, expected 5 got 6
+PASS document.forms getOwnPropertyNames 
 
index e5d581e..e5e6604 100644 (file)
@@ -12,7 +12,7 @@ PASS NodeList must be primary interface of document.getElementsByName("name")
 PASS Stringification of document.getElementsByName("name") 
 PASS NodeList interface: document.getElementsByName("name") must inherit property "item" with the proper type (0) 
 PASS NodeList interface: calling item(unsigned long) on document.getElementsByName("name") with too few arguments must throw TypeError 
-FAIL NodeList interface: document.getElementsByName("name") must inherit property "length" with the proper type (1) assert_inherits: property "length" found on object expected in prototype chain
+PASS NodeList interface: document.getElementsByName("name") must inherit property "length" with the proper type (1) 
 PASS Document interface: attribute domain 
 PASS Document interface: attribute referrer 
 PASS Document interface: attribute cookie 
@@ -802,7 +802,7 @@ PASS HTMLOptionsCollection interface object length
 PASS HTMLOptionsCollection interface object name 
 PASS HTMLOptionsCollection interface: existence and properties of interface prototype object 
 PASS HTMLOptionsCollection interface: existence and properties of interface prototype object's "constructor" property 
-FAIL HTMLOptionsCollection interface: attribute length assert_true: The prototype object must have a property "length" expected true got false
+PASS HTMLOptionsCollection interface: attribute length 
 PASS HTMLOptionsCollection interface: operation add([object Object],[object Object],[object Object],[object Object]) 
 FAIL HTMLOptionsCollection interface: operation remove(long) assert_equals: property has wrong .length expected 1 but got 0
 PASS HTMLOptionsCollection interface: attribute selectedIndex 
@@ -2321,14 +2321,14 @@ PASS TextTrackList interface object length
 PASS TextTrackList interface object name 
 FAIL TextTrackList interface: existence and properties of interface prototype object assert_equals: prototype of TextTrackList.prototype is not EventTarget.prototype expected object "[object EventTargetPrototype]" but got object "[object Object]"
 PASS TextTrackList interface: existence and properties of interface prototype object's "constructor" property 
-FAIL TextTrackList interface: attribute length assert_true: The prototype object must have a property "length" expected true got false
+PASS TextTrackList interface: attribute length 
 PASS TextTrackList interface: operation getTrackById(DOMString) 
 PASS TextTrackList interface: attribute onchange 
 PASS TextTrackList interface: attribute onaddtrack 
 PASS TextTrackList interface: attribute onremovetrack 
 PASS TextTrackList must be primary interface of document.createElement("video").textTracks 
 PASS Stringification of document.createElement("video").textTracks 
-FAIL TextTrackList interface: document.createElement("video").textTracks must inherit property "length" with the proper type (0) assert_inherits: property "length" found on object expected in prototype chain
+PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "length" with the proper type (0) 
 PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "getTrackById" with the proper type (2) 
 PASS TextTrackList interface: calling getTrackById(DOMString) on document.createElement("video").textTracks with too few arguments must throw TypeError 
 PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "onchange" with the proper type (3) 
@@ -2398,11 +2398,11 @@ PASS TextTrackCueList interface object length
 PASS TextTrackCueList interface object name 
 PASS TextTrackCueList interface: existence and properties of interface prototype object 
 PASS TextTrackCueList interface: existence and properties of interface prototype object's "constructor" property 
-FAIL TextTrackCueList interface: attribute length assert_true: The prototype object must have a property "length" expected true got false
+PASS TextTrackCueList interface: attribute length 
 PASS TextTrackCueList interface: operation getCueById(DOMString) 
 PASS TextTrackCueList must be primary interface of document.createElement("video").addTextTrack("subtitles").cues 
 PASS Stringification of document.createElement("video").addTextTrack("subtitles").cues 
-FAIL TextTrackCueList interface: document.createElement("video").addTextTrack("subtitles").cues must inherit property "length" with the proper type (0) assert_inherits: property "length" found on object expected in prototype chain
+PASS TextTrackCueList interface: document.createElement("video").addTextTrack("subtitles").cues must inherit property "length" with the proper type (0) 
 PASS TextTrackCueList interface: document.createElement("video").addTextTrack("subtitles").cues must inherit property "getCueById" with the proper type (2) 
 PASS TextTrackCueList interface: calling getCueById(DOMString) on document.createElement("video").addTextTrack("subtitles").cues with too few arguments must throw TypeError 
 FAIL TextTrackCue interface: existence and properties of interface object assert_equals: prototype of TextTrackCue is not EventTarget expected function "function EventTarget() {
@@ -2426,12 +2426,12 @@ PASS TimeRanges interface object length
 PASS TimeRanges interface object name 
 PASS TimeRanges interface: existence and properties of interface prototype object 
 PASS TimeRanges interface: existence and properties of interface prototype object's "constructor" property 
-FAIL TimeRanges interface: attribute length assert_true: The prototype object must have a property "length" expected true got false
+PASS TimeRanges interface: attribute length 
 PASS TimeRanges interface: operation start(unsigned long) 
 PASS TimeRanges interface: operation end(unsigned long) 
 PASS TimeRanges must be primary interface of document.createElement("video").buffered 
 PASS Stringification of document.createElement("video").buffered 
-FAIL TimeRanges interface: document.createElement("video").buffered must inherit property "length" with the proper type (0) assert_inherits: property "length" found on object expected in prototype chain
+PASS TimeRanges interface: document.createElement("video").buffered must inherit property "length" with the proper type (0) 
 PASS TimeRanges interface: document.createElement("video").buffered must inherit property "start" with the proper type (1) 
 PASS TimeRanges interface: calling start(unsigned long) on document.createElement("video").buffered with too few arguments must throw TypeError 
 PASS TimeRanges interface: document.createElement("video").buffered must inherit property "end" with the proper type (2) 
@@ -2785,7 +2785,7 @@ PASS HTMLFormElement interface: attribute name
 PASS HTMLFormElement interface: attribute noValidate 
 PASS HTMLFormElement interface: attribute target 
 PASS HTMLFormElement interface: attribute elements 
-FAIL HTMLFormElement interface: attribute length assert_true: The prototype object must have a property "length" expected true got false
+PASS HTMLFormElement interface: attribute length 
 PASS HTMLFormElement interface: operation submit() 
 PASS HTMLFormElement interface: operation reset() 
 PASS HTMLFormElement interface: operation checkValidity() 
@@ -2803,7 +2803,7 @@ PASS HTMLFormElement interface: document.createElement("form") must inherit prop
 PASS HTMLFormElement interface: document.createElement("form") must inherit property "noValidate" with the proper type (7) 
 PASS HTMLFormElement interface: document.createElement("form") must inherit property "target" with the proper type (8) 
 PASS HTMLFormElement interface: document.createElement("form") must inherit property "elements" with the proper type (9) 
-FAIL HTMLFormElement interface: document.createElement("form") must inherit property "length" with the proper type (10) assert_inherits: property "length" found on object expected in prototype chain
+PASS HTMLFormElement interface: document.createElement("form") must inherit property "length" with the proper type (10) 
 PASS HTMLFormElement interface: document.createElement("form") must inherit property "submit" with the proper type (13) 
 PASS HTMLFormElement interface: document.createElement("form") must inherit property "reset" with the proper type (14) 
 PASS HTMLFormElement interface: document.createElement("form") must inherit property "checkValidity" with the proper type (15) 
@@ -3016,7 +3016,7 @@ PASS HTMLSelectElement interface: attribute required
 PASS HTMLSelectElement interface: attribute size 
 PASS HTMLSelectElement interface: attribute type 
 PASS HTMLSelectElement interface: attribute options 
-FAIL HTMLSelectElement interface: attribute length assert_true: The prototype object must have a property "length" expected true got false
+PASS HTMLSelectElement interface: attribute length 
 PASS HTMLSelectElement interface: operation item(unsigned long) 
 FAIL HTMLSelectElement interface: operation namedItem(DOMString) assert_equals: property has wrong .length expected 1 but got 0
 PASS HTMLSelectElement interface: operation add([object Object],[object Object],[object Object],[object Object]) 
@@ -3044,7 +3044,7 @@ PASS HTMLSelectElement interface: document.createElement("select") must inherit
 PASS HTMLSelectElement interface: document.createElement("select") must inherit property "size" with the proper type (7) 
 PASS HTMLSelectElement interface: document.createElement("select") must inherit property "type" with the proper type (8) 
 PASS HTMLSelectElement interface: document.createElement("select") must inherit property "options" with the proper type (9) 
-FAIL HTMLSelectElement interface: document.createElement("select") must inherit property "length" with the proper type (10) assert_inherits: property "length" found on object expected in prototype chain
+PASS HTMLSelectElement interface: document.createElement("select") must inherit property "length" with the proper type (10) 
 PASS HTMLSelectElement interface: document.createElement("select") must inherit property "item" with the proper type (11) 
 PASS HTMLSelectElement interface: calling item(unsigned long) on document.createElement("select") with too few arguments must throw TypeError 
 PASS HTMLSelectElement interface: document.createElement("select") must inherit property "namedItem" with the proper type (12) 
@@ -4113,7 +4113,7 @@ PASS History interface object length
 PASS History interface object name 
 PASS History interface: existence and properties of interface prototype object 
 PASS History interface: existence and properties of interface prototype object's "constructor" property 
-FAIL History interface: attribute length assert_true: The prototype object must have a property "length" expected true got false
+PASS History interface: attribute length 
 FAIL History interface: attribute scrollRestoration assert_true: The prototype object must have a property "scrollRestoration" expected true got false
 PASS History interface: attribute state 
 PASS History interface: operation go(long) 
@@ -4123,7 +4123,7 @@ PASS History interface: operation pushState(any,DOMString,DOMString)
 PASS History interface: operation replaceState(any,DOMString,DOMString) 
 PASS History must be primary interface of window.history 
 PASS Stringification of window.history 
-FAIL History interface: window.history must inherit property "length" with the proper type (0) assert_inherits: property "length" found on object expected in prototype chain
+PASS History interface: window.history must inherit property "length" with the proper type (0) 
 FAIL History interface: window.history must inherit property "scrollRestoration" with the proper type (1) assert_inherits: property "scrollRestoration" not found in prototype chain
 PASS History interface: window.history must inherit property "state" with the proper type (2) 
 PASS History interface: window.history must inherit property "go" with the proper type (3) 
@@ -4344,7 +4344,7 @@ PASS PluginArray interface object name
 PASS PluginArray interface: existence and properties of interface prototype object 
 PASS PluginArray interface: existence and properties of interface prototype object's "constructor" property 
 PASS PluginArray interface: operation refresh(boolean) 
-FAIL PluginArray interface: attribute length assert_true: The prototype object must have a property "length" expected true got false
+PASS PluginArray interface: attribute length 
 FAIL PluginArray interface: operation item(unsigned long) assert_equals: property has wrong .length expected 1 but got 0
 FAIL PluginArray interface: operation namedItem(DOMString) assert_equals: property has wrong .length expected 1 but got 0
 PASS MimeTypeArray interface: existence and properties of interface object 
@@ -4352,7 +4352,7 @@ PASS MimeTypeArray interface object length
 PASS MimeTypeArray interface object name 
 PASS MimeTypeArray interface: existence and properties of interface prototype object 
 PASS MimeTypeArray interface: existence and properties of interface prototype object's "constructor" property 
-FAIL MimeTypeArray interface: attribute length assert_true: The prototype object must have a property "length" expected true got false
+PASS MimeTypeArray interface: attribute length 
 FAIL MimeTypeArray interface: operation item(unsigned long) assert_equals: property has wrong .length expected 1 but got 0
 FAIL MimeTypeArray interface: operation namedItem(DOMString) assert_equals: property has wrong .length expected 1 but got 0
 PASS Plugin interface: existence and properties of interface object 
@@ -4363,7 +4363,7 @@ PASS Plugin interface: existence and properties of interface prototype object's
 PASS Plugin interface: attribute name 
 PASS Plugin interface: attribute description 
 PASS Plugin interface: attribute filename 
-FAIL Plugin interface: attribute length assert_true: The prototype object must have a property "length" expected true got false
+PASS Plugin interface: attribute length 
 FAIL Plugin interface: operation item(unsigned long) assert_equals: property has wrong .length expected 1 but got 0
 FAIL Plugin interface: operation namedItem(DOMString) assert_equals: property has wrong .length expected 1 but got 0
 PASS MimeType interface: existence and properties of interface object 
@@ -4655,7 +4655,7 @@ PASS Storage interface object length
 PASS Storage interface object name 
 PASS Storage interface: existence and properties of interface prototype object 
 PASS Storage interface: existence and properties of interface prototype object's "constructor" property 
-FAIL Storage interface: attribute length assert_true: The prototype object must have a property "length" expected true got false
+PASS Storage interface: attribute length 
 PASS Storage interface: operation key(unsigned long) 
 PASS Storage interface: operation getItem(DOMString) 
 PASS Storage interface: operation setItem(DOMString,DOMString) 
index c1371a1..2bea589 100644 (file)
@@ -1,10 +1,10 @@
-CONSOLE MESSAGE: line 12: length
-CONSOLE MESSAGE: line 15: 1,length
-CONSOLE MESSAGE: line 18: 1,length
-CONSOLE MESSAGE: line 21: 1,2,length
-CONSOLE MESSAGE: line 24: 1,length
-CONSOLE MESSAGE: line 27: 1,length,Test
-CONSOLE MESSAGE: line 30: 1,length
-CONSOLE MESSAGE: line 33: 1,length,Test1
-CONSOLE MESSAGE: line 36: 1,length,Test1
+CONSOLE MESSAGE: line 12: 
+CONSOLE MESSAGE: line 15: 1
+CONSOLE MESSAGE: line 18: 1
+CONSOLE MESSAGE: line 21: 1,2
+CONSOLE MESSAGE: line 24: 1,2
+CONSOLE MESSAGE: line 27: 1,2,Test
+CONSOLE MESSAGE: line 30: 1,2,Test
+CONSOLE MESSAGE: line 33: 1,2,Test,Test1
+CONSOLE MESSAGE: line 36: 1,2,Test,Test1
 
index fab33ac..df58c9b 100644 (file)
@@ -1,3 +1,76 @@
+2016-02-11  Chris Dumez  <cdumez@apple.com>
+
+        Move 'length' property to the prototype
+        https://bugs.webkit.org/show_bug.cgi?id=154051
+        <rdar://problem/24577385>
+
+        Reviewed by Darin Adler.
+
+        Move 'length' property to the prototype, where it should be. We used to
+        keep it on the instance because our implementation of
+        getOwnPropertySlot() was wrong for interfaces with a named property
+        getter. However, our implementation of getOwnPropertySlot() is now
+        spec-compliant so this should be OK.
+
+        Moving 'length' to the prototype is also a little bit risky in terms of
+        performance, especially for HTMLCollection / NodeList. However, I did
+        not see an impact on realistic benchmarks like Speedometer and only saw
+        a small impact (< 5%) on micro-benchmarks. I propose we make our behavior
+        correct and monitor performance. If we see any benchmark we care about
+        regress then we should try and optimize while keeping the attribute on
+        the prototype.
+
+        No new tests, already covered by existing tests.
+
+        * bindings/js/JSDOMBinding.h:
+        (WebCore::getStaticValueSlotEntryWithoutCaching):
+        * bindings/js/JSHTMLDocumentCustom.cpp:
+        (WebCore::JSHTMLDocument::getOwnPropertySlot):
+        (WebCore::JSHTMLDocument::nameGetter): Deleted.
+        * bindings/js/JSLocationCustom.cpp:
+        (WebCore::JSLocation::putDelegate):
+        * bindings/js/JSPluginElementFunctions.h:
+        (WebCore::pluginElementCustomGetOwnPropertySlot):
+        * bindings/js/JSStorageCustom.cpp:
+        (WebCore::JSStorage::deleteProperty):
+        (WebCore::JSStorage::deletePropertyByIndex):
+        (WebCore::JSStorage::putDelegate):
+        Leverage the new hasStaticPropertyTable static property in the
+        generated bindings for performance.
+
+        * bindings/scripts/CodeGeneratorJS.pm:
+        (GenerateHeader):
+        Generate a "hasStaticPropertyTable" static const boolean property
+        for each bindings class so we can check at build time if
+        ClassInfo::staticPropHashTable is null.
+
+        (AttributeShouldBeOnInstance):
+        Move "length" to the prototype.
+
+        * bindings/scripts/test/JS/JSTestActiveDOMObject.h:
+        * bindings/scripts/test/JS/JSTestClassWithJSBuiltinConstructor.h:
+        * bindings/scripts/test/JS/JSTestCustomConstructorWithNoInterfaceObject.h:
+        * bindings/scripts/test/JS/JSTestCustomNamedGetter.h:
+        * bindings/scripts/test/JS/JSTestEventConstructor.h:
+        * bindings/scripts/test/JS/JSTestEventTarget.h:
+        * bindings/scripts/test/JS/JSTestException.h:
+        * bindings/scripts/test/JS/JSTestGenerateIsReachable.h:
+        * bindings/scripts/test/JS/JSTestInterface.h:
+        * bindings/scripts/test/JS/JSTestJSBuiltinConstructor.h:
+        * bindings/scripts/test/JS/JSTestMediaQueryListListener.h:
+        * bindings/scripts/test/JS/JSTestNamedConstructor.h:
+        * bindings/scripts/test/JS/JSTestNode.h:
+        * bindings/scripts/test/JS/JSTestNondeterministic.h:
+        * bindings/scripts/test/JS/JSTestObj.h:
+        * bindings/scripts/test/JS/JSTestOverloadedConstructors.h:
+        * bindings/scripts/test/JS/JSTestOverrideBuiltins.h:
+        * bindings/scripts/test/JS/JSTestSerializedScriptValueInterface.h:
+        * bindings/scripts/test/JS/JSTestTypedefs.h:
+        * bindings/scripts/test/JS/JSattribute.h:
+        * bindings/scripts/test/JS/JSreadonly.h:
+        Rebaseline bindings tests.
+
+
 2016-02-11  Csaba Osztrogon√°c  <ossy@webkit.org>
 
         Fix the !(ENABLE(SHADOW_DOM) || ENABLE(DETAILS_ELEMENT)) after r196281
index 0fe1645..1bb3dc6 100644 (file)
@@ -671,13 +671,11 @@ inline AtomicString propertyNameToAtomicString(JSC::PropertyName propertyName)
 
 template<typename DOMClass> inline const JSC::HashTableValue* getStaticValueSlotEntryWithoutCaching(JSC::ExecState* exec, JSC::PropertyName propertyName)
 {
-    const JSC::HashTable* table = DOMClass::info()->staticPropHashTable;
-    if (!table)
-        return getStaticValueSlotEntryWithoutCaching<typename DOMClass::Base>(exec, propertyName);
-    const JSC::HashTableValue* entry = table->entry(propertyName);
-    if (!entry) // not found, forward to parent
-        return getStaticValueSlotEntryWithoutCaching<typename DOMClass::Base>(exec, propertyName);
-    return entry;
+    if (DOMClass::hasStaticPropertyTable) {
+        if (auto* entry = DOMClass::info()->staticPropHashTable->entry(propertyName))
+            return entry;
+    }
+    return getStaticValueSlotEntryWithoutCaching<typename DOMClass::Base>(exec, propertyName);
 }
 
 template<> inline const JSC::HashTableValue* getStaticValueSlotEntryWithoutCaching<JSDOMObject>(JSC::ExecState*, JSC::PropertyName)
index 4d4e982..f64e5fc 100644 (file)
@@ -71,12 +71,7 @@ bool JSHTMLDocument::getOwnPropertySlot(JSObject* object, ExecState* exec, Prope
         return true;
     }
 
-    if (auto* table = JSHTMLDocument::info()->staticPropHashTable) {
-        if (const HashTableValue* entry = table->entry(propertyName)) {
-            slot.setCacheableCustom(thisObject, entry->attributes(), entry->propertyGetter());
-            return true;
-        }
-    }
+    static_assert(!hasStaticPropertyTable, "This method does not handle static instance properties");
 
     return Base::getOwnPropertySlot(thisObject, exec, propertyName, slot);
 }
index 0083e0c..b9a7033 100644 (file)
@@ -82,6 +82,7 @@ bool JSLocation::putDelegate(ExecState* exec, PropertyName propertyName, JSValue
 
     bool sameDomainAccess = shouldAllowAccessToFrame(exec, frame);
 
+    static_assert(hasStaticPropertyTable, "The implementation dereferences ClassInfo::staticPropHashTable without null check");
     const HashTableValue* entry = JSLocation::info()->staticPropHashTable->entry(propertyName);
     if (!entry) {
         if (sameDomainAccess)
index 5be6f8c..dda3d0c 100644 (file)
@@ -47,7 +47,7 @@ namespace WebCore {
     template <class Type, class Base> bool pluginElementCustomGetOwnPropertySlot(JSC::ExecState* exec, JSC::PropertyName propertyName, JSC::PropertySlot& slot, Type* element)
     {
         if (!element->globalObject()->world().isNormal()) {
-            if (Type::info()->staticPropHashTable && JSC::getStaticValueSlot<Type, Base>(exec, *Type::info()->staticPropHashTable, element, propertyName, slot))
+            if (Type::hasStaticPropertyTable && JSC::getStaticValueSlot<Type, Base>(exec, *Type::info()->staticPropHashTable, element, propertyName, slot))
                 return true;
 
             JSC::JSValue proto = element->prototype();
index 7cb458e..7df8afa 100644 (file)
@@ -58,11 +58,9 @@ bool JSStorage::deleteProperty(JSCell* cell, ExecState* exec, PropertyName prope
     // Since hasProperty() would end up calling canGetItemsForName() and be fooled, we need to check
     // the native property slots manually.
     PropertySlot slot(thisObject);
-    if (getStaticValueSlot<JSStorage, Base>(exec, *s_info.staticPropHashTable, thisObject, propertyName, slot)) {
-        if (Optional<uint32_t> index = parseIndex(propertyName))
-            return Base::deletePropertyByIndex(thisObject, exec, index.value());
-        return Base::deleteProperty(thisObject, exec, propertyName);
-    }
+
+    static_assert(!hasStaticPropertyTable, "This function does not handle static instance properties");
+
     JSValue prototype = thisObject->prototype();
     if (prototype.isObject() && asObject(prototype)->getPropertySlot(exec, propertyName, slot))
         return Base::deleteProperty(thisObject, exec, propertyName);
@@ -80,8 +78,7 @@ bool JSStorage::deletePropertyByIndex(JSCell* cell, ExecState* exec, unsigned pr
 {
     JSStorage* thisObject = jsCast<JSStorage*>(cell);
     PropertySlot slot(thisObject);
-    if (getStaticValueSlot<JSStorage, Base>(exec, *s_info.staticPropHashTable, thisObject, Identifier::from(exec, propertyName), slot))
-        return Base::deletePropertyByIndex(thisObject, exec, propertyName);
+    static_assert(!hasStaticPropertyTable, "This function does not handle static instance properties");
     return deleteProperty(cell, exec, Identifier::from(exec, propertyName));
 }
 
@@ -109,8 +106,7 @@ bool JSStorage::putDelegate(ExecState* exec, PropertyName propertyName, JSValue
     // Since hasProperty() would end up calling canGetItemsForName() and be fooled, we need to check
     // the native property slots manually.
     PropertySlot slot(this);
-    if (getStaticValueSlot<JSStorage, Base>(exec, *s_info.staticPropHashTable, this, propertyName, slot))
-        return false;
+    static_assert(!hasStaticPropertyTable, "This function does not handle static instance properties");
 
     JSValue prototype = this->prototype();
     if (prototype.isObject() && asObject(prototype)->getPropertySlot(exec, propertyName, slot))
index 02cda4c..a2d5bef 100644 (file)
@@ -711,12 +711,6 @@ sub AttributeShouldBeOnInstance
     # https://heycam.github.io/webidl/#Unforgeable
     return 1 if $attribute->signature->extendedAttributes->{"Unforgeable"} || $interface->extendedAttributes->{"Unforgeable"};
 
-    # FIXME: Length is a tricky attribute to handle correctly as it is frequently tied to
-    # objects which also have magic named attributes that can end up being named "length"
-    # and so interfere with lookup ordering.  I'm not sure what the correct solution is
-    # here.
-    return 1 if ($attribute->signature->name eq "length") && $interface->name ne "CharacterData";
-    
     # It becomes hard to reason about attributes that require security checks if we push
     # them down the prototype chain, so before we do these we'll need to carefully consider
     # the possible pitfalls.
@@ -949,6 +943,9 @@ sub GenerateHeader
         push(@headerContent, "    static const bool needsDestruction = false;\n\n");
     }
 
+    my $hasStaticPropertyTable = InstanceAttributeCount($interface) > 0 ? "true" : "false";
+    push(@headerContent, "    static const bool hasStaticPropertyTable = $hasStaticPropertyTable;\n\n");
+
     # Prototype
     unless (IsDOMGlobalObject($interface)) {
         push(@headerContent, "    static JSC::JSObject* createPrototype(JSC::VM&, JSC::JSGlobalObject*);\n");
index ec65201..11745b5 100644 (file)
@@ -37,6 +37,8 @@ public:
         return ptr;
     }
 
+    static const bool hasStaticPropertyTable = true;
+
     static JSC::JSObject* createPrototype(JSC::VM&, JSC::JSGlobalObject*);
     static JSC::JSObject* getPrototype(JSC::VM&, JSC::JSGlobalObject*);
     static TestActiveDOMObject* toWrapped(JSC::JSValue);
index 36704b1..fcd337c 100644 (file)
@@ -37,6 +37,8 @@ public:
         return ptr;
     }
 
+    static const bool hasStaticPropertyTable = false;
+
     static JSC::JSObject* createPrototype(JSC::VM&, JSC::JSGlobalObject*);
     static JSC::JSObject* getPrototype(JSC::VM&, JSC::JSGlobalObject*);
     static TestClassWithJSBuiltinConstructor* toWrapped(JSC::JSValue);
index 6b3ddb4..00ca2a0 100644 (file)
@@ -37,6 +37,8 @@ public:
         return ptr;
     }
 
+    static const bool hasStaticPropertyTable = false;
+
     static JSC::JSObject* createPrototype(JSC::VM&, JSC::JSGlobalObject*);
     static JSC::JSObject* getPrototype(JSC::VM&, JSC::JSGlobalObject*);
     static TestCustomConstructorWithNoInterfaceObject* toWrapped(JSC::JSValue);
index e3901d9..abe44d2 100644 (file)
@@ -37,6 +37,8 @@ public:
         return ptr;
     }
 
+    static const bool hasStaticPropertyTable = false;
+
     static JSC::JSObject* createPrototype(JSC::VM&, JSC::JSGlobalObject*);
     static JSC::JSObject* getPrototype(JSC::VM&, JSC::JSGlobalObject*);
     static TestCustomNamedGetter* toWrapped(JSC::JSValue);
index 166faae..41c4f0c 100644 (file)
@@ -39,6 +39,8 @@ public:
         return ptr;
     }
 
+    static const bool hasStaticPropertyTable = false;
+
     static JSC::JSObject* createPrototype(JSC::VM&, JSC::JSGlobalObject*);
     static JSC::JSObject* getPrototype(JSC::VM&, JSC::JSGlobalObject*);
     static TestEventConstructor* toWrapped(JSC::JSValue);
index 33fd07e..f385622 100644 (file)
@@ -38,6 +38,8 @@ public:
         return ptr;
     }
 
+    static const bool hasStaticPropertyTable = false;
+
     static JSC::JSObject* createPrototype(JSC::VM&, JSC::JSGlobalObject*);
     static JSC::JSObject* getPrototype(JSC::VM&, JSC::JSGlobalObject*);
     static TestEventTarget* toWrapped(JSC::JSValue);
index 8bc773b..b1b6fc6 100644 (file)
@@ -38,6 +38,8 @@ public:
         return ptr;
     }
 
+    static const bool hasStaticPropertyTable = true;
+
     static JSC::JSObject* createPrototype(JSC::VM&, JSC::JSGlobalObject*);
     static JSC::JSObject* getPrototype(JSC::VM&, JSC::JSGlobalObject*);
     static TestException* toWrapped(JSC::JSValue);
index b361ee3..26bffdd 100644 (file)
@@ -37,6 +37,8 @@ public:
         return ptr;
     }
 
+    static const bool hasStaticPropertyTable = false;
+
     static JSC::JSObject* createPrototype(JSC::VM&, JSC::JSGlobalObject*);
     static JSC::JSObject* getPrototype(JSC::VM&, JSC::JSGlobalObject*);
     static TestGenerateIsReachable* toWrapped(JSC::JSValue);
index d72aed6..9b295f6 100644 (file)
@@ -39,6 +39,8 @@ public:
         return ptr;
     }
 
+    static const bool hasStaticPropertyTable = false;
+
     static JSC::JSObject* createPrototype(JSC::VM&, JSC::JSGlobalObject*);
     static JSC::JSObject* getPrototype(JSC::VM&, JSC::JSGlobalObject*);
     static TestInterface* toWrapped(JSC::JSValue);
index c53f69a..99d531d 100644 (file)
@@ -35,6 +35,8 @@ public:
         return ptr;
     }
 
+    static const bool hasStaticPropertyTable = false;
+
     static JSC::JSObject* createPrototype(JSC::VM&, JSC::JSGlobalObject*);
     static JSC::JSObject* getPrototype(JSC::VM&, JSC::JSGlobalObject*);
     static void destroy(JSC::JSCell*);
index e74792e..b4644c3 100644 (file)
@@ -37,6 +37,8 @@ public:
         return ptr;
     }
 
+    static const bool hasStaticPropertyTable = false;
+
     static JSC::JSObject* createPrototype(JSC::VM&, JSC::JSGlobalObject*);
     static JSC::JSObject* getPrototype(JSC::VM&, JSC::JSGlobalObject*);
     static TestMediaQueryListListener* toWrapped(JSC::JSValue);
index a9881ad..a709cd1 100644 (file)
@@ -37,6 +37,8 @@ public:
         return ptr;
     }
 
+    static const bool hasStaticPropertyTable = false;
+
     static JSC::JSObject* createPrototype(JSC::VM&, JSC::JSGlobalObject*);
     static JSC::JSObject* getPrototype(JSC::VM&, JSC::JSGlobalObject*);
     static TestNamedConstructor* toWrapped(JSC::JSValue);
index cb57d74..9118d15 100644 (file)
@@ -36,6 +36,8 @@ public:
         return ptr;
     }
 
+    static const bool hasStaticPropertyTable = false;
+
     static JSC::JSObject* createPrototype(JSC::VM&, JSC::JSGlobalObject*);
     static JSC::JSObject* getPrototype(JSC::VM&, JSC::JSGlobalObject*);
 
index d2caece..d47466d 100644 (file)
@@ -37,6 +37,8 @@ public:
         return ptr;
     }
 
+    static const bool hasStaticPropertyTable = false;
+
     static JSC::JSObject* createPrototype(JSC::VM&, JSC::JSGlobalObject*);
     static JSC::JSObject* getPrototype(JSC::VM&, JSC::JSGlobalObject*);
     static TestNondeterministic* toWrapped(JSC::JSValue);
index 21ed35c..59ca494 100644 (file)
@@ -37,6 +37,8 @@ public:
         return ptr;
     }
 
+    static const bool hasStaticPropertyTable = true;
+
     static JSC::JSObject* createPrototype(JSC::VM&, JSC::JSGlobalObject*);
     static JSC::JSObject* getPrototype(JSC::VM&, JSC::JSGlobalObject*);
     static TestObj* toWrapped(JSC::JSValue);
index bd4ec4c..1252f41 100644 (file)
@@ -37,6 +37,8 @@ public:
         return ptr;
     }
 
+    static const bool hasStaticPropertyTable = false;
+
     static JSC::JSObject* createPrototype(JSC::VM&, JSC::JSGlobalObject*);
     static JSC::JSObject* getPrototype(JSC::VM&, JSC::JSGlobalObject*);
     static TestOverloadedConstructors* toWrapped(JSC::JSValue);
index 7486510..b4e2532 100644 (file)
@@ -37,6 +37,8 @@ public:
         return ptr;
     }
 
+    static const bool hasStaticPropertyTable = false;
+
     static JSC::JSObject* createPrototype(JSC::VM&, JSC::JSGlobalObject*);
     static JSC::JSObject* getPrototype(JSC::VM&, JSC::JSGlobalObject*);
     static TestOverrideBuiltins* toWrapped(JSC::JSValue);
index e6f5540..5d4f96d 100644 (file)
@@ -39,6 +39,8 @@ public:
         return ptr;
     }
 
+    static const bool hasStaticPropertyTable = false;
+
     static JSC::JSObject* createPrototype(JSC::VM&, JSC::JSGlobalObject*);
     static JSC::JSObject* getPrototype(JSC::VM&, JSC::JSGlobalObject*);
     static TestSerializedScriptValueInterface* toWrapped(JSC::JSValue);
index 930d845..48a9344 100644 (file)
@@ -37,6 +37,8 @@ public:
         return ptr;
     }
 
+    static const bool hasStaticPropertyTable = true;
+
     static JSC::JSObject* createPrototype(JSC::VM&, JSC::JSGlobalObject*);
     static JSC::JSObject* getPrototype(JSC::VM&, JSC::JSGlobalObject*);
     static TestTypedefs* toWrapped(JSC::JSValue);
index 2b9f731..7a4aad0 100644 (file)
@@ -38,6 +38,8 @@ public:
         return ptr;
     }
 
+    static const bool hasStaticPropertyTable = false;
+
     static JSC::JSObject* createPrototype(JSC::VM&, JSC::JSGlobalObject*);
     static JSC::JSObject* getPrototype(JSC::VM&, JSC::JSGlobalObject*);
     static attribute* toWrapped(JSC::JSValue);
index 669feaa..b942f1a 100644 (file)
@@ -37,6 +37,8 @@ public:
         return ptr;
     }
 
+    static const bool hasStaticPropertyTable = false;
+
     static JSC::JSObject* createPrototype(JSC::VM&, JSC::JSGlobalObject*);
     static JSC::JSObject* getPrototype(JSC::VM&, JSC::JSGlobalObject*);
     static readonly* toWrapped(JSC::JSValue);