Ignore:
Timestamp:
Jan 27, 2013, 10:46:36 PM (13 years ago)
Author:
[email protected]
Message:

JSC: FunctionParameters are memory hungry.
<http://webkit.org/b/108033>
<rdar://problem/13094803>

Reviewed by Sam Weinig.

Instead of inheriting from Vector<Identifier>, make FunctionParameters a simple fixed-size array
with a custom-allocating create() function. Removes one step of indirection and cuts memory usage
roughly in half.

2.73 MB progression on Membuster3.

  • bytecode/UnlinkedCodeBlock.cpp:

(JSC::UnlinkedFunctionExecutable::paramString):

  • bytecompiler/BytecodeGenerator.cpp:

(JSC::BytecodeGenerator::BytecodeGenerator):

  • parser/Nodes.cpp:

(JSC::FunctionParameters::create):
(JSC::FunctionParameters::FunctionParameters):
(JSC::FunctionParameters::~FunctionParameters):

  • parser/Nodes.h:

(FunctionParameters):
(JSC::FunctionParameters::size):
(JSC::FunctionParameters::at):
(JSC::FunctionParameters::identifiers):

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/parser/Nodes.cpp

    r136860 r140947  
    152152// ------------------------------ FunctionBodyNode -----------------------------
    153153
    154 FunctionParameters::FunctionParameters(ParameterNode* firstParameter)
     154PassRefPtr<FunctionParameters> FunctionParameters::create(ParameterNode* firstParameter)
    155155{
    156156    unsigned parameterCount = 0;
     
    158158        ++parameterCount;
    159159
    160     reserveInitialCapacity(parameterCount);
    161 
     160    size_t objectSize = sizeof(FunctionParameters) - sizeof(void*) + sizeof(StringImpl*) * parameterCount;
     161    void* slot = fastMalloc(objectSize);
     162    return adoptRef(new (slot) FunctionParameters(firstParameter, parameterCount));
     163}
     164
     165FunctionParameters::FunctionParameters(ParameterNode* firstParameter, unsigned size)
     166    : m_size(size)
     167{
     168    unsigned i = 0;
    162169    for (ParameterNode* parameter = firstParameter; parameter; parameter = parameter->nextParam())
    163         uncheckedAppend(parameter->ident());
     170        new (&identifiers()[i++]) Identifier(parameter->ident());
     171}
     172
     173FunctionParameters::~FunctionParameters()
     174{
     175    for (unsigned i = 0; i < m_size; ++i)
     176        identifiers()[i].~Identifier();
    164177}
    165178
Note: See TracChangeset for help on using the changeset viewer.