Ignore:
Timestamp:
Mar 1, 2016, 12:11:20 AM (9 years ago)
Author:
[email protected]
Message:

PreventExtensions should be a virtual method in the method table.
https://bugs.webkit.org/show_bug.cgi?id=154800

Reviewed by Yusuke Suzuki.

This patch makes us more consistent with how the ES6 specification models the
PreventExtensions trap. Moving this method into ClassInfo::methodTable
is a prerequisite for implementing Proxy.PreventExtensions.

  • runtime/ClassInfo.h:
  • runtime/JSCell.cpp:

(JSC::JSCell::getGenericPropertyNames):
(JSC::JSCell::preventExtensions):

  • runtime/JSCell.h:
  • runtime/JSModuleNamespaceObject.cpp:

(JSC::JSModuleNamespaceObject::JSModuleNamespaceObject):
(JSC::JSModuleNamespaceObject::finishCreation):
(JSC::JSModuleNamespaceObject::destroy):

  • runtime/JSModuleNamespaceObject.h:

(JSC::JSModuleNamespaceObject::create):
(JSC::JSModuleNamespaceObject::moduleRecord):

  • runtime/JSObject.cpp:

(JSC::JSObject::freeze):
(JSC::JSObject::preventExtensions):
(JSC::JSObject::reifyAllStaticProperties):

  • runtime/JSObject.h:

(JSC::JSObject::isSealed):
(JSC::JSObject::isFrozen):
(JSC::JSObject::isExtensible):

  • runtime/ObjectConstructor.cpp:

(JSC::objectConstructorSeal):
(JSC::objectConstructorFreeze):
(JSC::objectConstructorPreventExtensions):
(JSC::objectConstructorIsSealed):

  • runtime/ReflectObject.cpp:

(JSC::reflectObjectPreventExtensions):

  • runtime/Structure.cpp:

(JSC::Structure::Structure):
(JSC::Structure::preventExtensionsTransition):

  • runtime/Structure.h:
Location:
trunk/Source/JavaScriptCore/runtime
Files:
11 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/runtime/ClassInfo.h

    r197379 r197391  
    103103    typedef PassRefPtr<ArrayBufferView> (*GetTypedArrayImpl)(JSArrayBufferView*);
    104104    GetTypedArrayImpl getTypedArrayImpl;
     105
     106    typedef bool (*PreventExtensionsFunctionPtr)(JSObject*, ExecState*);
     107    PreventExtensionsFunctionPtr preventExtensions;
    105108
    106109    typedef void (*DumpToStreamFunctionPtr)(const JSCell*, PrintStream&);
     
    155158        &ClassName::slowDownAndWasteMemory, \
    156159        &ClassName::getTypedArrayImpl, \
     160        &ClassName::preventExtensions, \
    157161        &ClassName::dumpToStream, \
    158162        &ClassName::estimatedSize \
  • trunk/Source/JavaScriptCore/runtime/JSCell.cpp

    r197379 r197391  
    271271}
    272272
     273bool JSCell::preventExtensions(JSObject*, ExecState*)
     274{
     275    RELEASE_ASSERT_NOT_REACHED();
     276}
     277
    273278} // namespace JSC
  • trunk/Source/JavaScriptCore/runtime/JSCell.h

    r197379 r197391  
    207207    static NO_RETURN_DUE_TO_CRASH void getStructurePropertyNames(JSObject*, ExecState*, PropertyNameArray&, EnumerationMode);
    208208    static NO_RETURN_DUE_TO_CRASH void getGenericPropertyNames(JSObject*, ExecState*, PropertyNameArray&, EnumerationMode);
     209    static NO_RETURN_DUE_TO_CRASH bool preventExtensions(JSObject*, ExecState*);
    209210
    210211    static String className(const JSObject*);
  • trunk/Source/JavaScriptCore/runtime/JSModuleNamespaceObject.cpp

    r196722 r197391  
    5050}
    5151
    52 void JSModuleNamespaceObject::finishCreation(VM& vm, JSGlobalObject* globalObject, JSModuleRecord* moduleRecord, const IdentifierSet& exports)
     52void JSModuleNamespaceObject::finishCreation(ExecState* exec, JSGlobalObject* globalObject, JSModuleRecord* moduleRecord, const IdentifierSet& exports)
    5353{
     54    VM& vm = exec->vm();
    5455    Base::finishCreation(vm);
    5556    ASSERT(inherits(info()));
     
    7980    // http://www.ecma-international.org/ecma-262/6.0/#sec-module-namespace-exotic-objects-isextensible
    8081    // http://www.ecma-international.org/ecma-262/6.0/#sec-module-namespace-exotic-objects-preventextensions
    81     preventExtensions(vm);
     82    methodTable(vm)->preventExtensions(this, exec);
     83    ASSERT(!exec->hadException());
    8284}
    8385
  • trunk/Source/JavaScriptCore/runtime/JSModuleNamespaceObject.h

    r189429 r197391  
    4242    {
    4343        JSModuleNamespaceObject* object = new (NotNull, allocateCell<JSModuleNamespaceObject>(exec->vm().heap)) JSModuleNamespaceObject(exec->vm(), structure);
    44         object->finishCreation(exec->vm(), globalObject, moduleRecord, exports);
     44        object->finishCreation(exec, globalObject, moduleRecord, exports);
    4545        return object;
    4646    }
     
    6363
    6464protected:
    65     JS_EXPORT_PRIVATE void finishCreation(VM&, JSGlobalObject*, JSModuleRecord*, const IdentifierSet& exports);
     65    JS_EXPORT_PRIVATE void finishCreation(ExecState*, JSGlobalObject*, JSModuleRecord*, const IdentifierSet& exports);
    6666    JS_EXPORT_PRIVATE JSModuleNamespaceObject(VM&, Structure*);
    6767
  • trunk/Source/JavaScriptCore/runtime/JSObject.cpp

    r197379 r197391  
    16761676}
    16771677
    1678 void JSObject::preventExtensions(VM& vm)
    1679 {
    1680     if (!isExtensible())
    1681         return;
    1682     enterDictionaryIndexingMode(vm);
    1683     setStructure(vm, Structure::preventExtensionsTransition(vm, structure(vm)));
     1678bool JSObject::preventExtensions(JSObject* object, ExecState* exec)
     1679{
     1680    if (!object->isExtensible())
     1681        return true;
     1682
     1683    VM& vm = exec->vm();
     1684    object->enterDictionaryIndexingMode(vm);
     1685    object->setStructure(vm, Structure::preventExtensionsTransition(vm, object->structure(vm)));
     1686    return true;
    16841687}
    16851688
  • trunk/Source/JavaScriptCore/runtime/JSObject.h

    r197379 r197391  
    615615    JS_EXPORT_PRIVATE void seal(VM&);
    616616    JS_EXPORT_PRIVATE void freeze(VM&);
    617     JS_EXPORT_PRIVATE void preventExtensions(VM&);
     617    JS_EXPORT_PRIVATE static bool preventExtensions(JSObject*, ExecState*);
    618618    bool isSealed(VM& vm) { return structure(vm)->isSealed(vm); }
    619619    bool isFrozen(VM& vm) { return structure(vm)->isFrozen(vm); }
  • trunk/Source/JavaScriptCore/runtime/ObjectConstructor.cpp

    r197295 r197391  
    517517
    518518    // 3. Set the [[Extensible]] internal property of O to false.
    519     object->preventExtensions(exec->vm());
     519    object->methodTable(exec->vm())->preventExtensions(object, exec);
     520    if (exec->hadException())
     521        return JSValue::encode(JSValue());
    520522
    521523    // 4. Return O.
     
    555557
    556558    // 3. Set the [[Extensible]] internal property of O to false.
    557     object->preventExtensions(exec->vm());
     559    object->methodTable(exec->vm())->preventExtensions(object, exec);
     560    if (exec->hadException())
     561        return nullptr;
    558562
    559563    // 4. Return O.
     
    567571    if (!obj.isObject())
    568572        return JSValue::encode(obj);
    569     return JSValue::encode(objectConstructorFreeze(exec, asObject(obj)));
     573    JSObject* result = objectConstructorFreeze(exec, asObject(obj));
     574    if (exec->hadException())
     575        return JSValue::encode(JSValue());
     576    return JSValue::encode(result);
    570577}
    571578
    572579EncodedJSValue JSC_HOST_CALL objectConstructorPreventExtensions(ExecState* exec)
    573580{
    574     JSValue obj = exec->argument(0);
    575     if (!obj.isObject())
    576         return JSValue::encode(obj);
    577     asObject(obj)->preventExtensions(exec->vm());
    578     return JSValue::encode(obj);
     581    JSValue argument = exec->argument(0);
     582    if (!argument.isObject())
     583        return JSValue::encode(argument);
     584    JSObject* object = asObject(argument);
     585    object->methodTable(exec->vm())->preventExtensions(object, exec);
     586    return JSValue::encode(object);
    579587}
    580588
  • trunk/Source/JavaScriptCore/runtime/ReflectObject.cpp

    r196722 r197391  
    187187    if (!target.isObject())
    188188        return JSValue::encode(throwTypeError(exec, ASCIILiteral("Reflect.preventExtensions requires the first argument be an object")));
    189     asObject(target)->preventExtensions(exec->vm());
    190     return JSValue::encode(jsBoolean(true));
     189    JSObject* object = asObject(target);
     190    bool result = object->methodTable(exec->vm())->preventExtensions(object, exec);
     191    if (exec->hadException())
     192        return JSValue::encode(JSValue());
     193    return JSValue::encode(jsBoolean(result));
    191194}
    192195
  • trunk/Source/JavaScriptCore/runtime/Structure.cpp

    r197210 r197391  
    204204    setHasNonEnumerableProperties(false);
    205205    setAttributesInPrevious(0);
    206     setPreventExtensions(false);
     206    setDidPreventExtensions(false);
    207207    setDidTransition(false);
    208208    setStaticFunctionsReified(false);
     
    236236    setHasNonEnumerableProperties(false);
    237237    setAttributesInPrevious(0);
    238     setPreventExtensions(false);
     238    setDidPreventExtensions(false);
    239239    setDidTransition(false);
    240240    setStaticFunctionsReified(false);
     
    267267    setHasNonEnumerableProperties(previous->hasNonEnumerableProperties());
    268268    setAttributesInPrevious(0);
    269     setPreventExtensions(previous->preventExtensions());
     269    setDidPreventExtensions(previous->didPreventExtensions());
    270270    setDidTransition(true);
    271271    setStaticFunctionsReified(previous->staticFunctionsReified());
     
    626626    transition->propertyTable().set(vm, transition, structure->copyPropertyTableForPinning(vm));
    627627    transition->m_offset = structure->m_offset;
    628     transition->setPreventExtensions(true);
     628    transition->setDidPreventExtensions(true);
    629629    transition->pin();
    630630
  • trunk/Source/JavaScriptCore/runtime/Structure.h

    r196179 r197391  
    184184    JS_EXPORT_PRIVATE bool isSealed(VM&);
    185185    JS_EXPORT_PRIVATE bool isFrozen(VM&);
    186     bool isExtensible() const { return !preventExtensions(); }
     186    bool isExtensible() const { return !didPreventExtensions(); }
    187187    bool putWillGrowOutOfLineStorage();
    188188    size_t suggestedNewOutOfLineStorageCapacity();
     
    580580    DEFINE_BITFIELD(bool, hasNonEnumerableProperties, HasNonEnumerableProperties, 1, 5);
    581581    DEFINE_BITFIELD(unsigned, attributesInPrevious, AttributesInPrevious, 14, 6);
    582     DEFINE_BITFIELD(bool, preventExtensions, PreventExtensions, 1, 20);
     582    DEFINE_BITFIELD(bool, didPreventExtensions, DidPreventExtensions, 1, 20);
    583583    DEFINE_BITFIELD(bool, didTransition, DidTransition, 1, 21);
    584584    DEFINE_BITFIELD(bool, staticFunctionsReified, StaticFunctionsReified, 1, 22);
Note: See TracChangeset for help on using the changeset viewer.