X-Git-Url: https://git.saurik.com/apple/javascriptcore.git/blobdiff_plain/9dae56ea45a0f5f8136a5c93d6f3a7f99399ca73..1981f5dfe8d77d97469d20652f712a09400c48ed:/profiler/ProfileGenerator.cpp diff --git a/profiler/ProfileGenerator.cpp b/profiler/ProfileGenerator.cpp index b1d5d48..5db38bc 100644 --- a/profiler/ProfileGenerator.cpp +++ b/profiler/ProfileGenerator.cpp @@ -27,6 +27,7 @@ #include "ProfileGenerator.h" #include "CallFrame.h" +#include "CodeBlock.h" #include "JSGlobalObject.h" #include "JSStringRef.h" #include "JSFunction.h" @@ -39,19 +40,19 @@ namespace JSC { static const char* NonJSExecution = "(idle)"; -PassRefPtr ProfileGenerator::create(const UString& title, ExecState* originatingExec, unsigned uid) +PassRefPtr ProfileGenerator::create(ExecState* exec, const UString& title, unsigned uid) { - return adoptRef(new ProfileGenerator(title, originatingExec, uid)); + return adoptRef(new ProfileGenerator(exec, title, uid)); } -ProfileGenerator::ProfileGenerator(const UString& title, ExecState* originatingExec, unsigned uid) - : m_originatingGlobalExec(originatingExec ? originatingExec->lexicalGlobalObject()->globalExec() : 0) - , m_profileGroup(originatingExec ? originatingExec->lexicalGlobalObject()->profileGroup() : 0) +ProfileGenerator::ProfileGenerator(ExecState* exec, const UString& title, unsigned uid) + : m_origin(exec ? exec->lexicalGlobalObject() : 0) + , m_profileGroup(exec ? exec->lexicalGlobalObject()->profileGroup() : 0) { m_profile = Profile::create(title, uid); m_currentNode = m_head = m_profile->head(); - if (originatingExec) - addParentForConsoleStart(originatingExec); + if (exec) + addParentForConsoleStart(exec); } void ProfileGenerator::addParentForConsoleStart(ExecState* exec) @@ -59,10 +60,10 @@ void ProfileGenerator::addParentForConsoleStart(ExecState* exec) int lineNumber; intptr_t sourceID; UString sourceURL; - JSValuePtr function; + JSValue function; exec->interpreter()->retrieveLastCaller(exec, lineNumber, sourceID, sourceURL, function); - m_currentNode = ProfileNode::create(Profiler::createCallIdentifier(&exec->globalData(), function ? function.toThisObject(exec) : 0, sourceURL, lineNumber), m_head.get(), m_head.get()); + m_currentNode = ProfileNode::create(exec, Profiler::createCallIdentifier(exec, function ? function.toThisObject(exec) : 0, sourceURL, lineNumber), m_head.get(), m_head.get()); m_head->insertNode(m_currentNode.get()); } @@ -71,35 +72,35 @@ const UString& ProfileGenerator::title() const return m_profile->title(); } -void ProfileGenerator::willExecute(const CallIdentifier& callIdentifier) +void ProfileGenerator::willExecute(ExecState* callerCallFrame, const CallIdentifier& callIdentifier) { if (JAVASCRIPTCORE_PROFILE_WILL_EXECUTE_ENABLED()) { - CString name = callIdentifier.m_name.UTF8String(); - CString url = callIdentifier.m_url.UTF8String(); - JAVASCRIPTCORE_PROFILE_WILL_EXECUTE(m_profileGroup, const_cast(name.c_str()), const_cast(url.c_str()), callIdentifier.m_lineNumber); + CString name = callIdentifier.m_name.utf8(); + CString url = callIdentifier.m_url.utf8(); + JAVASCRIPTCORE_PROFILE_WILL_EXECUTE(m_profileGroup, const_cast(name.data()), const_cast(url.data()), callIdentifier.m_lineNumber); } - if (!m_originatingGlobalExec) + if (!m_origin) return; - ASSERT_ARG(m_currentNode, m_currentNode); - m_currentNode = m_currentNode->willExecute(callIdentifier); + ASSERT(m_currentNode); + m_currentNode = m_currentNode->willExecute(callerCallFrame, callIdentifier); } -void ProfileGenerator::didExecute(const CallIdentifier& callIdentifier) +void ProfileGenerator::didExecute(ExecState* callerCallFrame, const CallIdentifier& callIdentifier) { if (JAVASCRIPTCORE_PROFILE_DID_EXECUTE_ENABLED()) { - CString name = callIdentifier.m_name.UTF8String(); - CString url = callIdentifier.m_url.UTF8String(); - JAVASCRIPTCORE_PROFILE_DID_EXECUTE(m_profileGroup, const_cast(name.c_str()), const_cast(url.c_str()), callIdentifier.m_lineNumber); + CString name = callIdentifier.m_name.utf8(); + CString url = callIdentifier.m_url.utf8(); + JAVASCRIPTCORE_PROFILE_DID_EXECUTE(m_profileGroup, const_cast(name.data()), const_cast(url.data()), callIdentifier.m_lineNumber); } - if (!m_originatingGlobalExec) + if (!m_origin) return; - ASSERT_ARG(m_currentNode, m_currentNode); + ASSERT(m_currentNode); if (m_currentNode->callIdentifier() != callIdentifier) { - RefPtr returningNode = ProfileNode::create(callIdentifier, m_head.get(), m_currentNode.get()); + RefPtr returningNode = ProfileNode::create(callerCallFrame, callIdentifier, m_head.get(), m_currentNode.get()); returningNode->setStartTime(m_currentNode->startTime()); returningNode->didExecute(); m_currentNode->insertNode(returningNode.release()); @@ -109,6 +110,17 @@ void ProfileGenerator::didExecute(const CallIdentifier& callIdentifier) m_currentNode = m_currentNode->didExecute(); } +void ProfileGenerator::exceptionUnwind(ExecState* handlerCallFrame, const CallIdentifier&) +{ + // If the current node was called by the handler (==) or any + // more nested function (>) the we have exited early from it. + ASSERT(m_currentNode); + while (m_currentNode->callerCallFrame() >= handlerCallFrame) { + didExecute(m_currentNode->callerCallFrame(), m_currentNode->callIdentifier()); + ASSERT(m_currentNode); + } +} + void ProfileGenerator::stopProfiling() { m_profile->forEach(&ProfileNode::stopProfiling); @@ -116,14 +128,14 @@ void ProfileGenerator::stopProfiling() removeProfileStart(); removeProfileEnd(); - ASSERT_ARG(m_currentNode, m_currentNode); + ASSERT(m_currentNode); // Set the current node to the parent, because we are in a call that // will not get didExecute call. m_currentNode = m_currentNode->parent(); if (double headSelfTime = m_head->selfTime()) { - RefPtr idleNode = ProfileNode::create(CallIdentifier(NonJSExecution, 0, 0), m_head.get(), m_head.get()); + RefPtr idleNode = ProfileNode::create(0, CallIdentifier(NonJSExecution, UString(), 0), m_head.get(), m_head.get()); idleNode->setTotalTime(headSelfTime); idleNode->setSelfTime(headSelfTime);