Changeset 109240 in webkit


Ignore:
Timestamp:
Feb 29, 2012 11:59:43 AM (12 years ago)
Author:
barraclough@apple.com
Message:

Writable attribute not set correctly when redefining an accessor to a data descriptor
https://bugs.webkit.org/show_bug.cgi?id=79931

Reviewed by Oliver Hunt.

Source/JavaScriptCore:

  • runtime/JSObject.cpp:

(JSC::JSObject::defineOwnProperty):

  • use attributesOverridingCurrent instead of attributesWithOverride.
  • runtime/PropertyDescriptor.cpp:
  • runtime/PropertyDescriptor.h:
    • remove attributesWithOverride - attributesOverridingCurrent does the same thing.

LayoutTests:

  • fast/js/Object-defineProperty-expected.txt:
  • fast/js/script-tests/Object-defineProperty.js:
    • Added tests.
Location:
trunk
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r109238 r109240  
     12012-02-29  Gavin Barraclough  <barraclough@apple.com>
     2
     3        Writable attribute not set correctly when redefining an accessor to a data descriptor
     4        https://bugs.webkit.org/show_bug.cgi?id=79931
     5
     6        Reviewed by Oliver Hunt.
     7
     8        * fast/js/Object-defineProperty-expected.txt:
     9        * fast/js/script-tests/Object-defineProperty.js:
     10            - Added tests.
     11
    1122012-02-29  Max Feil  <mfeil@rim.com>
    213
  • trunk/LayoutTests/fast/js/Object-defineProperty-expected.txt

    r108427 r109240  
    117117PASS var o = {}; o.readOnly = false; o.readOnly is true
    118118PASS 'use strict'; var o = {}; o.readOnly = false; o.readOnly threw exception TypeError: Attempted to assign to readonly property..
     119PASS Object.getOwnPropertyDescriptor(Object.defineProperty(Object.defineProperty({}, 'foo', {get: function() { return false; }, configurable: true}), 'foo', {value:false}), 'foo').writable is false
     120PASS Object.getOwnPropertyDescriptor(Object.defineProperty(Object.defineProperty({}, 'foo', {get: function() { return false; }, configurable: true}), 'foo', {value:false, writable: false}), 'foo').writable is false
     121PASS Object.getOwnPropertyDescriptor(Object.defineProperty(Object.defineProperty({}, 'foo', {get: function() { return false; }, configurable: true}), 'foo', {value:false, writable: true}), 'foo').writable is true
    119122PASS successfullyParsed is true
    120123
  • trunk/LayoutTests/fast/js/script-tests/Object-defineProperty.js

    r108427 r109240  
    168168delete Object.prototype.readOnly;
    169169
    170 
     170// Check the writable attribute is set correctly when redefining an accessor as a data descriptor.
     171shouldBeFalse("Object.getOwnPropertyDescriptor(Object.defineProperty(Object.defineProperty({}, 'foo', {get: function() { return false; }, configurable: true}), 'foo', {value:false}), 'foo').writable");
     172shouldBeFalse("Object.getOwnPropertyDescriptor(Object.defineProperty(Object.defineProperty({}, 'foo', {get: function() { return false; }, configurable: true}), 'foo', {value:false, writable: false}), 'foo').writable");
     173shouldBeTrue("Object.getOwnPropertyDescriptor(Object.defineProperty(Object.defineProperty({}, 'foo', {get: function() { return false; }, configurable: true}), 'foo', {value:false, writable: true}), 'foo').writable");
  • trunk/Source/JavaScriptCore/ChangeLog

    r109224 r109240  
     12012-02-29  Gavin Barraclough  <barraclough@apple.com>
     2
     3        Writable attribute not set correctly when redefining an accessor to a data descriptor
     4        https://bugs.webkit.org/show_bug.cgi?id=79931
     5
     6        Reviewed by Oliver Hunt.
     7
     8        * runtime/JSObject.cpp:
     9        (JSC::JSObject::defineOwnProperty):
     10            - use attributesOverridingCurrent instead of attributesWithOverride.
     11        * runtime/PropertyDescriptor.cpp:
     12        * runtime/PropertyDescriptor.h:
     13            - remove attributesWithOverride - attributesOverridingCurrent does the same thing.
     14
    1152012-02-29  Kevin Ollivier  <kevino@theolliviers.com>
    216
  • trunk/Source/JavaScriptCore/runtime/JSObject.cpp

    r109177 r109240  
    703703        if (!current.attributesEqual(descriptor)) {
    704704            object->methodTable()->deleteProperty(object, exec, propertyName);
    705             return putDescriptor(exec, object, propertyName, descriptor, current.attributesWithOverride(descriptor), current);
     705            return putDescriptor(exec, object, propertyName, descriptor, descriptor.attributesOverridingCurrent(current), current);
    706706        }
    707707        return true;
     
    716716        }
    717717        object->methodTable()->deleteProperty(object, exec, propertyName);
    718         return putDescriptor(exec, object, propertyName, descriptor, current.attributesWithOverride(descriptor), current);
     718        return putDescriptor(exec, object, propertyName, descriptor, descriptor.attributesOverridingCurrent(current), current);
    719719    }
    720720
     
    738738            return true;
    739739        object->methodTable()->deleteProperty(object, exec, propertyName);
    740         return putDescriptor(exec, object, propertyName, descriptor, current.attributesWithOverride(descriptor), current);
     740        return putDescriptor(exec, object, propertyName, descriptor, descriptor.attributesOverridingCurrent(current), current);
    741741    }
    742742
  • trunk/Source/JavaScriptCore/runtime/PropertyDescriptor.cpp

    r107956 r109240  
    207207}
    208208
    209 unsigned PropertyDescriptor::attributesWithOverride(const PropertyDescriptor& other) const
    210 {
    211     unsigned mismatch = other.m_attributes ^ m_attributes;
    212     unsigned sharedSeen = other.m_seenAttributes & m_seenAttributes;
    213     unsigned newAttributes = m_attributes & defaultAttributes;
    214     if (sharedSeen & WritablePresent && mismatch & ReadOnly)
    215         newAttributes ^= ReadOnly;
    216     if (sharedSeen & ConfigurablePresent && mismatch & DontDelete)
    217         newAttributes ^= DontDelete;
    218     if (sharedSeen & EnumerablePresent && mismatch & DontEnum)
    219         newAttributes ^= DontEnum;
    220     if (isAccessorDescriptor() && other.isDataDescriptor())
    221         newAttributes |= ReadOnly;
    222     return newAttributes;
    223 }
    224 
    225209unsigned PropertyDescriptor::attributesOverridingCurrent(const PropertyDescriptor& current) const
    226210{
  • trunk/Source/JavaScriptCore/runtime/PropertyDescriptor.h

    r104900 r109240  
    7171        bool equalTo(ExecState* exec, const PropertyDescriptor& other) const;
    7272        bool attributesEqual(const PropertyDescriptor& other) const;
    73         unsigned attributesWithOverride(const PropertyDescriptor& other) const;
    7473        unsigned attributesOverridingCurrent(const PropertyDescriptor& current) const;
    7574
Note: See TracChangeset for help on using the changeset viewer.