Ignore:
Timestamp:
Jun 24, 2009, 12:26:58 AM (16 years ago)
Author:
[email protected]
Message:

2009-06-24 Norbert Leser <[email protected]>

Reviewed by Maciej Stachoviak.

The BytecodeGenerator objects were instantiated on stack, which takes up ~38kB per instance
(each instance includes copy of JSC::CodeBlock with large SymbolTable, etc.).
Specifically, since there is nested invocation (e.g., GlobalCode --> FunctionCode),
the stack overflows immediately on Symbian hardware (max. 80 kB).
Proposed change allocates generator objects on heap.
Performance impact (if any) should be negligible and change is proposed as general fix,
rather than ifdef'd for SYMBIAN.

  • parser/Nodes.cpp: (JSC::ProgramNode::generateBytecode): (JSC::EvalNode::generateBytecode): (JSC::EvalNode::bytecodeForExceptionInfoReparse): (JSC::FunctionBodyNode::generateBytecode): (JSC::FunctionBodyNode::bytecodeForExceptionInfoReparse):
File:
1 edited

Legend:

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

    r44844 r45066  
    18901890    m_code.set(new ProgramCodeBlock(this, GlobalCode, globalObject, source().provider()));
    18911891   
    1892     BytecodeGenerator generator(this, globalObject->debugger(), scopeChain, &globalObject->symbolTable(), m_code.get());
    1893     generator.generate();
     1892    OwnPtr<BytecodeGenerator> generator(new BytecodeGenerator(this, globalObject->debugger(), scopeChain, &globalObject->symbolTable(), m_code.get()));
     1893    generator->generate();
    18941894
    18951895    destroyData();
     
    19451945    m_code.set(new EvalCodeBlock(this, globalObject, source().provider(), scopeChain.localDepth()));
    19461946
    1947     BytecodeGenerator generator(this, globalObject->debugger(), scopeChain, &m_code->symbolTable(), m_code.get());
    1948     generator.generate();
     1947    OwnPtr<BytecodeGenerator> generator(new BytecodeGenerator(this, globalObject->debugger(), scopeChain, &m_code->symbolTable(), m_code.get()));
     1948    generator->generate();
    19491949
    19501950    // Eval code needs to hang on to its declaration stacks to keep declaration info alive until Interpreter::execute time,
     
    19621962    m_code.set(new EvalCodeBlock(this, globalObject, source().provider(), scopeChain.localDepth()));
    19631963
    1964     BytecodeGenerator generator(this, globalObject->debugger(), scopeChain, &m_code->symbolTable(), m_code.get());
    1965     generator.setRegeneratingForExceptionInfo(codeBlockBeingRegeneratedFrom);
    1966     generator.generate();
     1964    OwnPtr<BytecodeGenerator> generator(new BytecodeGenerator(this, globalObject->debugger(), scopeChain, &m_code->symbolTable(), m_code.get()));
     1965    generator->setRegeneratingForExceptionInfo(codeBlockBeingRegeneratedFrom);
     1966    generator->generate();
    19671967
    19681968    return *m_code;
     
    20782078    m_code.set(new CodeBlock(this, FunctionCode, source().provider(), source().startOffset()));
    20792079
    2080     BytecodeGenerator generator(this, globalObject->debugger(), scopeChain, &m_code->symbolTable(), m_code.get());
    2081     generator.generate();
     2080    OwnPtr<BytecodeGenerator> generator(new BytecodeGenerator(this, globalObject->debugger(), scopeChain, &m_code->symbolTable(), m_code.get()));
     2081    generator->generate();
    20822082
    20832083    destroyData();
     
    21042104    m_code.set(new CodeBlock(this, FunctionCode, source().provider(), source().startOffset()));
    21052105
    2106     BytecodeGenerator generator(this, globalObject->debugger(), scopeChain, &m_code->symbolTable(), m_code.get());
    2107     generator.setRegeneratingForExceptionInfo(codeBlockBeingRegeneratedFrom);
    2108     generator.generate();
     2106    OwnPtr<BytecodeGenerator> generator(new BytecodeGenerator(this, globalObject->debugger(), scopeChain, &m_code->symbolTable(), m_code.get()));
     2107    generator->setRegeneratingForExceptionInfo(codeBlockBeingRegeneratedFrom);
     2108    generator->generate();
    21092109
    21102110    return *m_code;
Note: See TracChangeset for help on using the changeset viewer.