Ignore:
Timestamp:
Feb 28, 2016, 9:26:05 PM (9 years ago)
Author:
[email protected]
Message:

Make JSFunction.name allocation fully lazy.
<https://webkit.org/b/154806>

Reviewed by Saam Barati.

We were reifying the "name" field on functions lazily, but created the string
value itself up front. This patch gets rid of the up-front allocation,
saving us a JSString allocation per function in most cases.

  • builtins/BuiltinExecutables.cpp:

(JSC::createExecutableInternal):

  • bytecode/UnlinkedFunctionExecutable.cpp:

(JSC::UnlinkedFunctionExecutable::visitChildren):

  • bytecode/UnlinkedFunctionExecutable.h:
  • runtime/CodeCache.cpp:

(JSC::CodeCache::getFunctionExecutableFromGlobalCode):

  • runtime/Executable.h:
  • runtime/JSFunction.cpp:

(JSC::JSFunction::reifyName):

Location:
trunk/Source/JavaScriptCore/runtime
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/runtime/CodeCache.cpp

    r196272 r197308  
    188188        return nullptr;
    189189   
     190    metadata->overrideName(name);
    190191    metadata->setEndPosition(positionBeforeLastNewline);
    191192    // The Function constructor only has access to global variables, so no variables will be under TDZ.
     
    193194    UnlinkedFunctionExecutable* functionExecutable = UnlinkedFunctionExecutable::create(&vm, source, metadata, UnlinkedNormalFunction, ConstructAbility::CanConstruct, emptyTDZVariables, DerivedContextType::None);
    194195
    195     functionExecutable->m_nameValue.set(vm, functionExecutable, jsString(&vm, name.string()));
    196 
    197196    m_sourceCode.addCache(key, SourceCodeValue(vm, functionExecutable, m_sourceCode.age()));
    198197    return functionExecutable;
  • trunk/Source/JavaScriptCore/runtime/Executable.h

    r195876 r197308  
    668668    const Identifier& name() { return m_unlinkedExecutable->name(); }
    669669    const Identifier& inferredName() { return m_unlinkedExecutable->inferredName(); }
    670     JSString* nameValue() const { return m_unlinkedExecutable->nameValue(); }
    671670    size_t parameterCount() const { return m_unlinkedExecutable->parameterCount(); } // Excluding 'this'!
    672671    SourceParseMode parseMode() const { return m_unlinkedExecutable->parseMode(); }
  • trunk/Source/JavaScriptCore/runtime/JSFunction.cpp

    r197205 r197308  
    590590    ASSERT(!hasReifiedName());
    591591    ASSERT(!isHostFunction());
    592     JSValue initialValue = jsExecutable()->nameValue();
    593592    unsigned initialAttributes = DontEnum | ReadOnly;
    594593    const Identifier& identifier = exec->propertyNames().name;
    595     putDirect(vm, identifier, initialValue, initialAttributes);
     594    putDirect(vm, identifier, jsString(exec, jsExecutable()->name().string()), initialAttributes);
    596595
    597596    rareData->setHasReifiedName();
Note: See TracChangeset for help on using the changeset viewer.