Changeset 104602 in webkit
- Timestamp:
- Jan 10, 2012 11:22:54 AM (12 years ago)
- Location:
- trunk
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r104601 r104602 1 2012-01-10 Gavin Barraclough <barraclough@apple.com> 2 3 Use SameValue to compare property descriptor values 4 https://bugs.webkit.org/show_bug.cgi?id=75975 5 6 Reviewed by Sam Weinig. 7 8 * fast/js/array-defineOwnProperty-expected.txt: 9 * fast/js/script-tests/array-defineOwnProperty.js: 10 - Add new test cases. 11 1 12 2012-01-10 Tony Chang <tony@chromium.org> 2 13 -
trunk/LayoutTests/fast/js/array-defineOwnProperty-expected.txt
r104488 r104602 18 18 PASS Object.defineProperty([], '0', { get:function(){return true;} })[0] is true 19 19 PASS Object.defineProperty(Object.defineProperty([true], '0', { configurable:true, writable: false }), '0', { writable: true })[0] is true 20 PASS Object.defineProperty(Object.defineProperty([true], '0', { configurable:false, writable: false }), '0', { writable: true })[0] threw exception TypeError: Attempting to change configurable attribute of unconfigurable property.. 20 PASS Object.defineProperty(Object.defineProperty([true], '0', { configurable:false, writable: false }), '0', { writable: true })[0] threw exception TypeError: Attempting to change writable attribute of unconfigurable property.. 21 PASS Object.defineProperty(Object.defineProperty([], '0', { value: 1, writable:true }), '0', { value: 2 })[0] is 2 22 PASS Object.defineProperty(Object.defineProperty([], '0', { value: 1 }), '0', { value: 1 })[0] is 1 23 PASS Object.defineProperty(Object.defineProperty([], '0', { value: Number.NaN }), '0', { value: -Number.NaN })[0] is Number.NaN 24 PASS Object.defineProperty(Object.defineProperty([], '0', { value: 'okay'.substring(0,2) }), '0', { value: 'not ok'.substring(4,6) })[0] is "ok" 25 PASS Object.defineProperty(Object.defineProperty([], '0', { value: true }), '0', { value: true })[0] is true 26 PASS Object.defineProperty(Object.defineProperty([], '0', { value: false }), '0', { value: false })[0] is false 27 PASS Object.defineProperty(Object.defineProperty([], '0', { value: null }), '0', { value: null })[0] is null 28 PASS Object.defineProperty(Object.defineProperty([], '0', { value: undefined }), '0', { value: undefined })[0] is undefined 29 PASS Object.defineProperty(Object.defineProperty([], '0', { value: Math }), '0', { value: Math })[0] is Math 30 PASS Object.defineProperty(Object.defineProperty([], '0', { value: 1 }), '0', { value: 2 })[0] threw exception TypeError: Attempting to change value of a readonly property.. 31 PASS Object.defineProperty(Object.defineProperty([], '0', { value: 'okay' }), '0', { value: 'not ok' })[0] threw exception TypeError: Attempting to change value of a readonly property.. 32 PASS Object.defineProperty(Object.defineProperty([], '0', { value: true }), '0', { value: false })[0] threw exception TypeError: Attempting to change value of a readonly property.. 33 PASS Object.defineProperty(Object.defineProperty([], '0', { value: false }), '0', { value: true })[0] threw exception TypeError: Attempting to change value of a readonly property.. 34 PASS Object.defineProperty(Object.defineProperty([], '0', { value: Math }), '0', { value: Object })[0] threw exception TypeError: Attempting to change value of a readonly property.. 35 PASS Object.defineProperty(Object.defineProperty([], '0', { value: null }), '0', { value: undefined })[0] threw exception TypeError: Attempting to change value of a readonly property.. 36 PASS Object.defineProperty(Object.defineProperty([], '0', { value: undefined }), '0', { value: null })[0] threw exception TypeError: Attempting to change value of a readonly property.. 21 37 PASS successfullyParsed is true 22 38 -
trunk/LayoutTests/fast/js/script-tests/array-defineOwnProperty.js
r104488 r104602 31 31 shouldThrow("Object.defineProperty(Object.defineProperty([true], '0', { configurable:false, writable: false }), '0', { writable: true })[0]"); 32 32 33 // Reassigning the value is okay if the property is writable. 34 shouldBe("Object.defineProperty(Object.defineProperty([], '0', { value: 1, writable:true }), '0', { value: 2 })[0]", '2'); 35 // Reassigning the value is okay if the value doesn't change. 36 shouldBe("Object.defineProperty(Object.defineProperty([], '0', { value: 1 }), '0', { value: 1 })[0]", '1'); 37 shouldBe("Object.defineProperty(Object.defineProperty([], '0', { value: Number.NaN }), '0', { value: -Number.NaN })[0]", 'Number.NaN'); 38 shouldBe("Object.defineProperty(Object.defineProperty([], '0', { value: 'okay'.substring(0,2) }), '0', { value: 'not ok'.substring(4,6) })[0]", '"ok"'); 39 shouldBe("Object.defineProperty(Object.defineProperty([], '0', { value: true }), '0', { value: true })[0]", 'true'); 40 shouldBe("Object.defineProperty(Object.defineProperty([], '0', { value: false }), '0', { value: false })[0]", 'false'); 41 shouldBe("Object.defineProperty(Object.defineProperty([], '0', { value: null }), '0', { value: null })[0]", 'null'); 42 shouldBe("Object.defineProperty(Object.defineProperty([], '0', { value: undefined }), '0', { value: undefined })[0]", 'undefined'); 43 shouldBe("Object.defineProperty(Object.defineProperty([], '0', { value: Math }), '0', { value: Math })[0]", 'Math'); 44 // Reassigning the value is not okay if the value changes. 45 shouldThrow("Object.defineProperty(Object.defineProperty([], '0', { value: 1 }), '0', { value: 2 })[0]"); 46 shouldThrow("Object.defineProperty(Object.defineProperty([], '0', { value: 'okay' }), '0', { value: 'not ok' })[0]"); 47 shouldThrow("Object.defineProperty(Object.defineProperty([], '0', { value: true }), '0', { value: false })[0]"); 48 shouldThrow("Object.defineProperty(Object.defineProperty([], '0', { value: false }), '0', { value: true })[0]"); 49 shouldThrow("Object.defineProperty(Object.defineProperty([], '0', { value: Math }), '0', { value: Object })[0]"); 50 // Reassigning the value is not okay if the type changes. 51 shouldThrow("Object.defineProperty(Object.defineProperty([], '0', { value: null }), '0', { value: undefined })[0]"); 52 shouldThrow("Object.defineProperty(Object.defineProperty([], '0', { value: undefined }), '0', { value: null })[0]"); 33 53 34 54 successfullyParsed = true; -
trunk/Source/JavaScriptCore/ChangeLog
r104527 r104602 1 2012-01-10 Gavin Barraclough <barraclough@apple.com> 2 3 Use SameValue to compare property descriptor values 4 https://bugs.webkit.org/show_bug.cgi?id=75975 5 6 Reviewed by Sam Weinig. 7 8 Rather than strictEqual. 9 10 * runtime/JSArray.cpp: 11 (JSC::JSArray::defineOwnNumericProperty): 12 - Missing configurablePresent() check. 13 * runtime/JSObject.cpp: 14 (JSC::JSObject::defineOwnProperty): 15 - call sameValue. 16 * runtime/PropertyDescriptor.cpp: 17 (JSC::sameValue): 18 - Moved from JSArray.cpp, fix NaN comparison. 19 (JSC::PropertyDescriptor::equalTo): 20 - call sameValue. 21 * runtime/PropertyDescriptor.h: 22 - Added declaration for sameValue. 1 23 2012-01-09 Gavin Barraclough <barraclough@apple.com> 2 24 -
trunk/Source/JavaScriptCore/runtime/JSArray.cpp
r104488 r104602 382 382 } 383 383 384 static bool sameValue(ExecState* exec, JSValue a, JSValue b)385 {386 if (a.isNumber())387 return b.isNumber() && bitwise_cast<uint64_t>(a.asNumber()) == bitwise_cast<uint64_t>(b.asNumber());388 return JSValue::strictEqual(exec, a, b);389 }390 391 384 static bool reject(ExecState* exec, bool throwException, const char* message) 392 385 { … … 462 455 if (!current.configurable()) { 463 456 // 7.a. Reject, if the [[Configurable]] field of Desc is true. 464 if ( !descriptor.configurable())457 if (descriptor.configurablePresent() && !descriptor.configurable()) 465 458 return reject(exec, throwException, "Attempting to change configurable attribute of unconfigurable property."); 466 459 // 7.b. Reject, if the [[Enumerable]] field of Desc is present and the [[Enumerable]] fields of current and Desc are the Boolean negation of each other. -
trunk/Source/JavaScriptCore/runtime/JSObject.cpp
r104488 r104602 787 787 } 788 788 if (!current.writable()) { 789 if (descriptor.value() || ! JSValue::strictEqual(exec, current.value(), descriptor.value())) {789 if (descriptor.value() || !sameValue(exec, current.value(), descriptor.value())) { 790 790 if (throwException) 791 791 throwError(exec, createTypeError(exec, "Attempting to change value of a readonly property.")); -
trunk/Source/JavaScriptCore/runtime/PropertyDescriptor.cpp
r104488 r104602 163 163 } 164 164 165 // See ES5.1 9.12 166 bool sameValue(ExecState* exec, JSValue a, JSValue b) 167 { 168 if (!a.isNumber()) 169 return JSValue::strictEqual(exec, a, b); 170 if (!b.isNumber()) 171 return false; 172 double x = a.asNumber(); 173 double y = b.asNumber(); 174 if (isnan(x)) 175 return isnan(y); 176 return bitwise_cast<uint64_t>(x) == bitwise_cast<uint64_t>(y); 177 } 178 165 179 bool PropertyDescriptor::equalTo(ExecState* exec, const PropertyDescriptor& other) const 166 180 { … … 169 183 !other.m_setter == m_setter) 170 184 return false; 171 return (!m_value || JSValue::strictEqual(exec, other.m_value, m_value)) &&172 (!m_getter || JSValue::strictEqual(exec, other.m_getter, m_getter)) &&173 (!m_setter || JSValue::strictEqual(exec, other.m_setter, m_setter)) &&174 185 return (!m_value || sameValue(exec, other.m_value, m_value)) 186 && (!m_getter || JSValue::strictEqual(exec, other.m_getter, m_getter)) 187 && (!m_setter || JSValue::strictEqual(exec, other.m_setter, m_setter)) 188 && attributesEqual(other); 175 189 } 176 190 -
trunk/Source/JavaScriptCore/runtime/PropertyDescriptor.h
r104488 r104602 31 31 namespace JSC { 32 32 class GetterSetter; 33 34 // See ES5.1 9.12 35 bool sameValue(ExecState*, JSValue, JSValue); 33 36 34 37 class PropertyDescriptor {
Note: See TracChangeset
for help on using the changeset viewer.