Changeset 104602 in webkit


Ignore:
Timestamp:
Jan 10, 2012 11:22:54 AM (12 years ago)
Author:
barraclough@apple.com
Message:

Use SameValue to compare property descriptor values
https://bugs.webkit.org/show_bug.cgi?id=75975

Reviewed by Sam Weinig.

Source/JavaScriptCore:

Rather than strictEqual.

  • runtime/JSArray.cpp:

(JSC::JSArray::defineOwnNumericProperty):

  • Missing configurablePresent() check.
  • runtime/JSObject.cpp:

(JSC::JSObject::defineOwnProperty):

  • call sameValue.
  • runtime/PropertyDescriptor.cpp:

(JSC::sameValue):

  • Moved from JSArray.cpp, fix NaN comparison.

(JSC::PropertyDescriptor::equalTo):

  • call sameValue.
  • runtime/PropertyDescriptor.h:
    • Added declaration for sameValue.

LayoutTests:

  • fast/js/array-defineOwnProperty-expected.txt:
  • fast/js/script-tests/array-defineOwnProperty.js:
    • Add new test cases.
Location:
trunk
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r104601 r104602  
     12012-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
    1122012-01-10  Tony Chang  <tony@chromium.org>
    213
  • trunk/LayoutTests/fast/js/array-defineOwnProperty-expected.txt

    r104488 r104602  
    1818PASS Object.defineProperty([], '0', { get:function(){return true;} })[0] is true
    1919PASS 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..
     20PASS 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..
     21PASS Object.defineProperty(Object.defineProperty([], '0', { value: 1, writable:true }), '0', { value: 2 })[0] is 2
     22PASS Object.defineProperty(Object.defineProperty([], '0', { value: 1 }), '0', { value: 1 })[0] is 1
     23PASS Object.defineProperty(Object.defineProperty([], '0', { value: Number.NaN }), '0', { value: -Number.NaN })[0] is Number.NaN
     24PASS Object.defineProperty(Object.defineProperty([], '0', { value: 'okay'.substring(0,2) }), '0', { value: 'not ok'.substring(4,6) })[0] is "ok"
     25PASS Object.defineProperty(Object.defineProperty([], '0', { value: true }), '0', { value: true })[0] is true
     26PASS Object.defineProperty(Object.defineProperty([], '0', { value: false }), '0', { value: false })[0] is false
     27PASS Object.defineProperty(Object.defineProperty([], '0', { value: null }), '0', { value: null })[0] is null
     28PASS Object.defineProperty(Object.defineProperty([], '0', { value: undefined }), '0', { value: undefined })[0] is undefined
     29PASS Object.defineProperty(Object.defineProperty([], '0', { value: Math }), '0', { value: Math })[0] is Math
     30PASS Object.defineProperty(Object.defineProperty([], '0', { value: 1 }), '0', { value: 2 })[0] threw exception TypeError: Attempting to change value of a readonly property..
     31PASS Object.defineProperty(Object.defineProperty([], '0', { value: 'okay' }), '0', { value: 'not ok' })[0] threw exception TypeError: Attempting to change value of a readonly property..
     32PASS Object.defineProperty(Object.defineProperty([], '0', { value: true }), '0', { value: false })[0] threw exception TypeError: Attempting to change value of a readonly property..
     33PASS Object.defineProperty(Object.defineProperty([], '0', { value: false }), '0', { value: true })[0] threw exception TypeError: Attempting to change value of a readonly property..
     34PASS Object.defineProperty(Object.defineProperty([], '0', { value: Math }), '0', { value: Object })[0] threw exception TypeError: Attempting to change value of a readonly property..
     35PASS Object.defineProperty(Object.defineProperty([], '0', { value: null }), '0', { value: undefined })[0] threw exception TypeError: Attempting to change value of a readonly property..
     36PASS Object.defineProperty(Object.defineProperty([], '0', { value: undefined }), '0', { value: null })[0] threw exception TypeError: Attempting to change value of a readonly property..
    2137PASS successfullyParsed is true
    2238
  • trunk/LayoutTests/fast/js/script-tests/array-defineOwnProperty.js

    r104488 r104602  
    3131shouldThrow("Object.defineProperty(Object.defineProperty([true], '0', { configurable:false, writable: false }), '0', { writable: true })[0]");
    3232
     33// Reassigning the value is okay if the property is writable.
     34shouldBe("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.
     36shouldBe("Object.defineProperty(Object.defineProperty([], '0', { value: 1 }), '0', { value: 1 })[0]", '1');
     37shouldBe("Object.defineProperty(Object.defineProperty([], '0', { value: Number.NaN }), '0', { value: -Number.NaN })[0]", 'Number.NaN');
     38shouldBe("Object.defineProperty(Object.defineProperty([], '0', { value: 'okay'.substring(0,2) }), '0', { value: 'not ok'.substring(4,6) })[0]", '"ok"');
     39shouldBe("Object.defineProperty(Object.defineProperty([], '0', { value: true }), '0', { value: true })[0]", 'true');
     40shouldBe("Object.defineProperty(Object.defineProperty([], '0', { value: false }), '0', { value: false })[0]", 'false');
     41shouldBe("Object.defineProperty(Object.defineProperty([], '0', { value: null }), '0', { value: null })[0]", 'null');
     42shouldBe("Object.defineProperty(Object.defineProperty([], '0', { value: undefined }), '0', { value: undefined })[0]", 'undefined');
     43shouldBe("Object.defineProperty(Object.defineProperty([], '0', { value: Math }), '0', { value: Math })[0]", 'Math');
     44// Reassigning the value is not okay if the value changes.
     45shouldThrow("Object.defineProperty(Object.defineProperty([], '0', { value: 1 }), '0', { value: 2 })[0]");
     46shouldThrow("Object.defineProperty(Object.defineProperty([], '0', { value: 'okay' }), '0', { value: 'not ok' })[0]");
     47shouldThrow("Object.defineProperty(Object.defineProperty([], '0', { value: true }), '0', { value: false })[0]");
     48shouldThrow("Object.defineProperty(Object.defineProperty([], '0', { value: false }), '0', { value: true })[0]");
     49shouldThrow("Object.defineProperty(Object.defineProperty([], '0', { value: Math }), '0', { value: Object })[0]");
     50// Reassigning the value is not okay if the type changes.
     51shouldThrow("Object.defineProperty(Object.defineProperty([], '0', { value: null }), '0', { value: undefined })[0]");
     52shouldThrow("Object.defineProperty(Object.defineProperty([], '0', { value: undefined }), '0', { value: null })[0]");
    3353
    3454successfullyParsed = true;
  • trunk/Source/JavaScriptCore/ChangeLog

    r104527 r104602  
     12012-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.
    1232012-01-09  Gavin Barraclough  <barraclough@apple.com>
    224
  • trunk/Source/JavaScriptCore/runtime/JSArray.cpp

    r104488 r104602  
    382382}
    383383
    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 
    391384static bool reject(ExecState* exec, bool throwException, const char* message)
    392385{
     
    462455    if (!current.configurable()) {
    463456        // 7.a. Reject, if the [[Configurable]] field of Desc is true.
    464         if (!descriptor.configurable())
     457        if (descriptor.configurablePresent() && !descriptor.configurable())
    465458            return reject(exec, throwException, "Attempting to change configurable attribute of unconfigurable property.");
    466459        // 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  
    787787            }
    788788            if (!current.writable()) {
    789                 if (descriptor.value() || !JSValue::strictEqual(exec, current.value(), descriptor.value())) {
     789                if (descriptor.value() || !sameValue(exec, current.value(), descriptor.value())) {
    790790                    if (throwException)
    791791                        throwError(exec, createTypeError(exec, "Attempting to change value of a readonly property."));
  • trunk/Source/JavaScriptCore/runtime/PropertyDescriptor.cpp

    r104488 r104602  
    163163}
    164164
     165// See ES5.1 9.12
     166bool 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
    165179bool PropertyDescriptor::equalTo(ExecState* exec, const PropertyDescriptor& other) const
    166180{
     
    169183        !other.m_setter == m_setter)
    170184        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           attributesEqual(other);
     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);
    175189}
    176190
  • trunk/Source/JavaScriptCore/runtime/PropertyDescriptor.h

    r104488 r104602  
    3131namespace JSC {
    3232    class GetterSetter;
     33
     34    // See ES5.1 9.12
     35    bool sameValue(ExecState*, JSValue, JSValue);
    3336
    3437    class PropertyDescriptor {
Note: See TracChangeset for help on using the changeset viewer.