Ignore:
Timestamp:
Aug 26, 2009, 9:52:15 AM (16 years ago)
Author:
[email protected]
Message:

[ES5] Implement getOwnPropertyDescriptor
https://bugs.webkit.org/show_bug.cgi?id=28724

Reviewed by Gavin Barraclough.

JavaScriptCore:
Implement the core runtime support for getOwnPropertyDescriptor.
This adds a virtual getOwnPropertyDescriptor method to every class
that implements getOwnPropertySlot that shadows the behaviour of
getOwnPropertySlot. The alternative would be to make getOwnPropertySlot
(or PropertySlots in general) provide property attribute information,
but quick testing showed this to be a regression.

WebCore:
Implement the WebCore side of getOwnPropertyDescriptor. This
requires a custom implementation of getOwnPropertyDescriptor
for every class with a custom implementation of getOwnPropertySlot.

The bindings generator has been updated to generate appropriate
versions of getOwnPropertyDescriptor for the general case where
a custom getOwnPropertyDescriptor is not needed. ES5 is vague
about how getOwnPropertyDescriptor should work in the context of
"host" functions with polymorphic GetOwnProperty, so it seems
okay that occasionally we "guess" what attributes -- eg. determining
whether a property is writable.

Test: fast/js/getOwnPropertyDescriptor.html

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/runtime/JSString.cpp

    r43506 r47780  
    104104}
    105105
     106bool JSString::getStringPropertyDescriptor(ExecState* exec, const Identifier& propertyName, PropertyDescriptor& descriptor)
     107{
     108    if (propertyName == exec->propertyNames().length) {
     109        descriptor.setDescriptor(jsNumber(exec, m_value.size()), DontEnum | DontDelete | ReadOnly);
     110        return true;
     111    }
     112   
     113    bool isStrictUInt32;
     114    unsigned i = propertyName.toStrictUInt32(&isStrictUInt32);
     115    if (isStrictUInt32 && i < static_cast<unsigned>(m_value.size())) {
     116        descriptor.setDescriptor(jsSingleCharacterSubstring(exec, m_value, i), DontDelete | ReadOnly);
     117        return true;
     118    }
     119   
     120    return false;
     121}
     122
     123bool JSString::getOwnPropertyDescriptor(ExecState* exec, const Identifier& propertyName, PropertyDescriptor& descriptor)
     124{
     125    if (getStringPropertyDescriptor(exec, propertyName, descriptor))
     126        return true;
     127    if (propertyName != exec->propertyNames().underscoreProto)
     128        return false;
     129    descriptor.setDescriptor(exec->lexicalGlobalObject()->stringPrototype(), DontEnum);
     130    return true;
     131}
     132
    106133bool JSString::getOwnPropertySlot(ExecState* exec, unsigned propertyName, PropertySlot& slot)
    107134{
Note: See TracChangeset for help on using the changeset viewer.