Changeset 37323 in webkit for trunk/JavaScriptCore/VM/Machine.cpp


Ignore:
Timestamp:
Oct 5, 2008, 7:48:08 PM (17 years ago)
Author:
[email protected]
Message:

2008-10-05 Maciej Stachowiak <[email protected]>

Reviewed by Oliver Hunt.



The problem is that dynamicGlobalObject had become O(N) in number
of call frames, but unwinding the stack for an exception called it
for every call frame, resulting in O(N2) behavior for an
exception thrown from inside deep recursion.

Instead of doing it that way, stash the dynamic global object in JSGlobalData.


  • JavaScriptCore.exp:
  • VM/Machine.cpp: (JSC::DynamicGlobalObjectScope::DynamicGlobalObjectScope): Helper class to temporarily store and later restore a dynamicGlobalObject in JSGlobalData. (JSC::DynamicGlobalObjectScope::~DynamicGlobalObjectScope): (JSC::Machine::execute): In each version, establish a DynamicGlobalObjectScope. For ProgramNode, always establish set new dynamicGlobalObject, for FunctionBody and Eval, only if none is currently set.
  • VM/Machine.h:
  • kjs/ExecState.h:
  • kjs/JSGlobalData.cpp: (JSC::JSGlobalData::JSGlobalData): Ininitalize new dynamicGlobalObject field to 0.
  • kjs/JSGlobalData.h:
  • kjs/JSGlobalObject.h: (JSC::ExecState::dynamicGlobalObject): Moved here from ExecState for benefit of inlining. Return lexical global object if this is a globalExec(), otherwise look in JSGlobalData for the one stashed there.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/VM/Machine.cpp

    r37297 r37323  
    869869}
    870870
     871class DynamicGlobalObjectScope {
     872public:
     873    DynamicGlobalObjectScope(ExecState* exec, JSGlobalObject* dynamicGlobalObject)
     874        : m_exec(exec)
     875        , m_savedGlobalObject(exec->globalData().dynamicGlobalObject)
     876    {
     877        exec->globalData().dynamicGlobalObject = dynamicGlobalObject;
     878    }
     879
     880    ~DynamicGlobalObjectScope()
     881    {
     882        m_exec->globalData().dynamicGlobalObject = m_savedGlobalObject;
     883    }
     884
     885private:
     886    ExecState* m_exec;
     887    JSGlobalObject* m_savedGlobalObject;
     888};
     889
    871890JSValue* Machine::execute(ProgramNode* programNode, ExecState* exec, ScopeChainNode* scopeChain, JSObject* thisObj, JSValue** exception)
    872891{
     
    886905        return jsNull();
    887906    }
     907
     908    DynamicGlobalObjectScope globalObjectScope(exec, scopeChain->globalObject());
    888909
    889910    JSGlobalObject* lastGlobalObject = m_registerFile.globalObject();
     
    921942
    922943    m_registerFile.shrink(oldEnd);
     944
    923945    return result;
    924946}
     
    940962        return jsNull();
    941963    }
     964
     965    DynamicGlobalObjectScope globalObjectScope(exec, exec->globalData().dynamicGlobalObject ? exec->globalData().dynamicGlobalObject : scopeChain->globalObject());
    942966
    943967    Register* argv = oldEnd;
     
    9921016        return jsNull();
    9931017    }
     1018
     1019    DynamicGlobalObjectScope globalObjectScope(exec, exec->globalData().dynamicGlobalObject ? exec->globalData().dynamicGlobalObject : scopeChain->globalObject());
    9941020
    9951021    EvalCodeBlock* codeBlock = &evalNode->byteCode(scopeChain);
     
    39493975}
    39503976
    3951 const Register* Machine::firstCallFrame(const Register* callFrame)
    3952 {
    3953     const Register* first = 0;
    3954     for (const Register* frame = callFrame; frame; frame = stripHostCallFrameBit(frame[RegisterFile::CallerRegisters].r()))
    3955         first = frame;
    3956     return first;
    3957 }
    3958 
    39593977Register* Machine::callFrame(ExecState* exec, InternalFunction* function) const
    39603978{
Note: See TracChangeset for help on using the changeset viewer.