Ignore:
Timestamp:
Jan 27, 2013, 10:46:36 PM (12 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.h

    r140594 r140947  
    13941394    };
    13951395
    1396     class FunctionParameters : public Vector<Identifier>, public RefCounted<FunctionParameters> {
     1396    class FunctionParameters : public RefCounted<FunctionParameters> {
    13971397        WTF_MAKE_FAST_ALLOCATED;
    13981398    public:
    1399         static PassRefPtr<FunctionParameters> create(ParameterNode* firstParameter) { return adoptRef(new FunctionParameters(firstParameter)); }
    1400 
    1401     private:
    1402         FunctionParameters(ParameterNode*);
     1399        static PassRefPtr<FunctionParameters> create(ParameterNode*);
     1400        ~FunctionParameters();
     1401
     1402        unsigned size() const { return m_size; }
     1403        const Identifier& at(unsigned index) const { ASSERT(index < m_size); return identifiers()[index]; }
     1404
     1405    private:
     1406        FunctionParameters(ParameterNode*, unsigned size);
     1407
     1408        Identifier* identifiers() { return reinterpret_cast<Identifier*>(&m_storage); }
     1409        const Identifier* identifiers() const { return reinterpret_cast<const Identifier*>(&m_storage); }
     1410
     1411        unsigned m_size;
     1412        void* m_storage;
    14031413    };
    14041414
Note: See TracChangeset for help on using the changeset viewer.