Changeset 233426 in webkit


Ignore:
Timestamp:
Jul 2, 2018, 10:51:21 AM (7 years ago)
Author:
mark.lam@apple.com
Message:

Builtins and host functions should get their own structures.
https://bugs.webkit.org/show_bug.cgi?id=187211
<rdar://problem/41646336>

Reviewed by Saam Barati.

JSTests:

  • stress/regress-187211.js: Added.

Source/JavaScriptCore:

JSFunctions do lazy reification of properties, but ordinary functions applies
different rules of property reification than builtin and host functions. Hence,
we should give builtins and host functions their own structures.

  • runtime/JSFunction.cpp:

(JSC::JSFunction::selectStructureForNewFuncExp):
(JSC::JSFunction::create):
(JSC::JSFunction::getOwnPropertySlot):

  • runtime/JSGlobalObject.cpp:

(JSC::JSGlobalObject::init):
(JSC::JSGlobalObject::visitChildren):

  • runtime/JSGlobalObject.h:

(JSC::JSGlobalObject::hostFunctionStructure const):
(JSC::JSGlobalObject::arrowFunctionStructure const):
(JSC::JSGlobalObject::sloppyFunctionStructure const):
(JSC::JSGlobalObject::strictFunctionStructure const):

Location:
trunk
Files:
1 added
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/JSTests/ChangeLog

    r233377 r233426  
     12018-06-30  Mark Lam  <mark.lam@apple.com>
     2
     3        Builtins and host functions should get their own structures.
     4        https://bugs.webkit.org/show_bug.cgi?id=187211
     5        <rdar://problem/41646336>
     6
     7        Reviewed by Saam Barati.
     8
     9        * stress/regress-187211.js: Added.
     10
    1112018-06-29  Saam Barati  <sbarati@apple.com>
    212
  • trunk/Source/JavaScriptCore/ChangeLog

    r233410 r233426  
     12018-07-01  Mark Lam  <mark.lam@apple.com>
     2
     3        Builtins and host functions should get their own structures.
     4        https://bugs.webkit.org/show_bug.cgi?id=187211
     5        <rdar://problem/41646336>
     6
     7        Reviewed by Saam Barati.
     8
     9        JSFunctions do lazy reification of properties, but ordinary functions applies
     10        different rules of property reification than builtin and host functions.  Hence,
     11        we should give builtins and host functions their own structures.
     12
     13        * runtime/JSFunction.cpp:
     14        (JSC::JSFunction::selectStructureForNewFuncExp):
     15        (JSC::JSFunction::create):
     16        (JSC::JSFunction::getOwnPropertySlot):
     17        * runtime/JSGlobalObject.cpp:
     18        (JSC::JSGlobalObject::init):
     19        (JSC::JSGlobalObject::visitChildren):
     20        * runtime/JSGlobalObject.h:
     21        (JSC::JSGlobalObject::hostFunctionStructure const):
     22        (JSC::JSGlobalObject::arrowFunctionStructure const):
     23        (JSC::JSGlobalObject::sloppyFunctionStructure const):
     24        (JSC::JSGlobalObject::strictFunctionStructure const):
     25
    1262018-07-01  David Kilzer  <ddkilzer@apple.com>
    227
  • trunk/Source/JavaScriptCore/runtime/JSFunction.cpp

    r233122 r233426  
    22 *  Copyright (C) 1999-2002 Harri Porten (porten@kde.org)
    33 *  Copyright (C) 2001 Peter Kelly (pmk@post.com)
    4  *  Copyright (C) 2003-2009, 2015-2017 Apple Inc. All rights reserved.
     4 *  Copyright (C) 2003-2018 Apple Inc. All rights reserved.
    55 *  Copyright (C) 2007 Cameron Zwarich (cwzwarich@uwaterloo.ca)
    66 *  Copyright (C) 2007 Maks Orlovich
     
    6868Structure* JSFunction::selectStructureForNewFuncExp(JSGlobalObject* globalObject, FunctionExecutable* executable)
    6969{
     70    ASSERT(!executable->isHostFunction());
     71    bool isBuiltin = executable->isBuiltinFunction();
    7072    if (executable->isArrowFunction())
    71         return globalObject->arrowFunctionStructure();
     73        return globalObject->arrowFunctionStructure(isBuiltin);
    7274    if (executable->isStrictMode())
    73         return globalObject->strictFunctionStructure();
    74     return globalObject->sloppyFunctionStructure();
     75        return globalObject->strictFunctionStructure(isBuiltin);
     76    return globalObject->sloppyFunctionStructure(isBuiltin);
    7577}
    7678
     
    9092{
    9193    NativeExecutable* executable = vm.getHostFunction(nativeFunction, intrinsic, nativeConstructor, signature, name);
    92     Structure* structure = globalObject->strictFunctionStructure();
     94    Structure* structure = globalObject->hostFunctionStructure();
    9395    JSFunction* function = new (NotNull, allocateCell<JSFunction>(vm.heap)) JSFunction(vm, globalObject, structure);
    9496    // Can't do this during initialization because getHostFunction might do a GC allocation.
     
    437439        slot.setCacheableCustom(thisObject, PropertyAttribute::ReadOnly | PropertyAttribute::DontEnum | PropertyAttribute::DontDelete, argumentsGetter);
    438440        return true;
    439     }
    440 
    441     if (propertyName == vm.propertyNames->caller) {
     441
     442    } else if (propertyName == vm.propertyNames->caller) {
    442443        if (!thisObject->jsExecutable()->hasCallerAndArgumentsProperties())
    443444            return Base::getOwnPropertySlot(thisObject, exec, propertyName, slot);
  • trunk/Source/JavaScriptCore/runtime/JSGlobalObject.cpp

    r233245 r233426  
    417417    ExecState* exec = JSGlobalObject::globalExec();
    418418
    419     m_strictFunctionStructure.set(vm, this, JSFunction::createStructure(vm, this, m_functionPrototype.get()));
    420     m_sloppyFunctionStructure.set(vm, this, JSFunction::createStructure(vm, this, m_functionPrototype.get()));
    421     m_arrowFunctionStructure.set(vm, this, JSFunction::createStructure(vm, this, m_functionPrototype.get()));
     419    m_hostFunctionStructure.set(vm, this, JSFunction::createStructure(vm, this, m_functionPrototype.get()));
     420
     421    auto initFunctionStructures = [&] (FunctionStructures& structures) {
     422        structures.strictFunctionStructure.set(vm, this, JSFunction::createStructure(vm, this, m_functionPrototype.get()));
     423        structures.sloppyFunctionStructure.set(vm, this, JSFunction::createStructure(vm, this, m_functionPrototype.get()));
     424        structures.arrowFunctionStructure.set(vm, this, JSFunction::createStructure(vm, this, m_functionPrototype.get()));
     425    };
     426    initFunctionStructures(m_builtinFunctions);
     427    initFunctionStructures(m_ordinaryFunctions);
     428
    422429    m_customGetterSetterFunctionStructure.initLater(
    423430        [] (const Initializer<Structure>& init) {
     
    13951402    visitor.append(thisObject->m_errorStructure);
    13961403    visitor.append(thisObject->m_calleeStructure);
    1397     visitor.append(thisObject->m_strictFunctionStructure);
    1398     visitor.append(thisObject->m_sloppyFunctionStructure);
    1399     visitor.append(thisObject->m_arrowFunctionStructure);
     1404
     1405    visitor.append(thisObject->m_hostFunctionStructure);
     1406    auto visitFunctionStructures = [&] (FunctionStructures& structures) {
     1407        visitor.append(structures.arrowFunctionStructure);
     1408        visitor.append(structures.sloppyFunctionStructure);
     1409        visitor.append(structures.strictFunctionStructure);
     1410    };
     1411    visitFunctionStructures(thisObject->m_builtinFunctions);
     1412    visitFunctionStructures(thisObject->m_ordinaryFunctions);
     1413
    14001414    thisObject->m_customGetterSetterFunctionStructure.visit(visitor);
    14011415    thisObject->m_boundFunctionStructure.visit(visitor);
  • trunk/Source/JavaScriptCore/runtime/JSGlobalObject.h

    r232442 r233426  
    342342    WriteBarrier<Structure> m_nullPrototypeObjectStructure;
    343343    WriteBarrier<Structure> m_calleeStructure;
    344     WriteBarrier<Structure> m_strictFunctionStructure;
    345     WriteBarrier<Structure> m_arrowFunctionStructure;
    346     WriteBarrier<Structure> m_sloppyFunctionStructure;
     344
     345    WriteBarrier<Structure> m_hostFunctionStructure;
     346
     347    struct FunctionStructures {
     348        WriteBarrier<Structure> arrowFunctionStructure;
     349        WriteBarrier<Structure> sloppyFunctionStructure;
     350        WriteBarrier<Structure> strictFunctionStructure;
     351    };
     352    FunctionStructures m_builtinFunctions;
     353    FunctionStructures m_ordinaryFunctions;
     354
    347355    LazyProperty<JSGlobalObject, Structure> m_boundFunctionStructure;
    348356    LazyProperty<JSGlobalObject, Structure> m_customGetterSetterFunctionStructure;
     
    658666    Structure* errorStructure() const { return m_errorStructure.get(); }
    659667    Structure* calleeStructure() const { return m_calleeStructure.get(); }
    660     Structure* strictFunctionStructure() const { return m_strictFunctionStructure.get(); }
    661     Structure* sloppyFunctionStructure() const { return m_sloppyFunctionStructure.get(); }
    662     Structure* arrowFunctionStructure() const { return m_arrowFunctionStructure.get(); }
     668    Structure* hostFunctionStructure() const { return m_hostFunctionStructure.get(); }
     669
     670    Structure* arrowFunctionStructure(bool isBuiltin) const
     671    {
     672        if (isBuiltin)
     673            return m_builtinFunctions.arrowFunctionStructure.get();
     674        return m_ordinaryFunctions.arrowFunctionStructure.get();
     675    }
     676    Structure* sloppyFunctionStructure(bool isBuiltin) const
     677    {
     678        if (isBuiltin)
     679            return m_builtinFunctions.sloppyFunctionStructure.get();
     680        return m_ordinaryFunctions.sloppyFunctionStructure.get();
     681    }
     682    Structure* strictFunctionStructure(bool isBuiltin) const
     683    {
     684        if (isBuiltin)
     685            return m_builtinFunctions.strictFunctionStructure.get();
     686        return m_ordinaryFunctions.strictFunctionStructure.get();
     687    }
     688
    663689    Structure* boundFunctionStructure() const { return m_boundFunctionStructure.get(this); }
    664690    Structure* customGetterSetterFunctionStructure() const { return m_customGetterSetterFunctionStructure.get(this); }
Note: See TracChangeset for help on using the changeset viewer.