2008-12-09 Sam Weinig <sam@webkit.org>
Reviewed by Geoffrey Garen.
Remove unnecessary extra lookup when throwing an exception.
We used to first lookup the target offset using getHandlerForVPC
and then we would lookup the native code stub using
nativeExceptionCodeForHandlerVPC. Instead, we can just pass around
the HandlerInfo.
* bytecode/CodeBlock.cpp:
(JSC::CodeBlock::handlerForVPC): Return the HandlerInfo.
* bytecode/CodeBlock.h: Remove nativeExceptionCodeForHandlerVPC.
* interpreter/Interpreter.cpp:
(JSC::Interpreter::throwException): Return a HandlerInfo instead of
and Instruction offset.
(JSC::Interpreter::privateExecute): Get the offset from HandlerInfo.
(JSC::Interpreter::cti_op_throw): Get the native code from the HandleInfo.
(JSC::Interpreter::cti_vm_throw): Ditto.
* interpreter/Interpreter.h:
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@39156 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/JavaScriptCore/bytecode/CodeBlock.cpp b/JavaScriptCore/bytecode/CodeBlock.cpp
index 5125d2f..01d452d 100644
--- a/JavaScriptCore/bytecode/CodeBlock.cpp
+++ b/JavaScriptCore/bytecode/CodeBlock.cpp
@@ -1194,40 +1194,20 @@
}
}
-bool CodeBlock::getHandlerForVPC(const Instruction* vPC, Instruction*& target, int& scopeDepth)
-{
- if (!m_rareData)
- return false;
-
- Vector<HandlerInfo>::iterator ptr = m_rareData->m_exceptionHandlers.begin();
- Vector<HandlerInfo>::iterator end = m_rareData->m_exceptionHandlers.end();
- unsigned addressOffset = vPC - m_instructions.begin();
- ASSERT(addressOffset < m_instructions.size());
-
- for (; ptr != end; ++ptr) {
- // Handlers are ordered innermost first, so the first handler we encounter
- // that contains the source address is the correct handler to use.
- if (ptr->start <= addressOffset && ptr->end >= addressOffset) {
- scopeDepth = ptr->scopeDepth;
- target = m_instructions.begin() + ptr->target;
- return true;
- }
- }
- return false;
-}
-
-void* CodeBlock::nativeExceptionCodeForHandlerVPC(const Instruction* handlerVPC)
+HandlerInfo* CodeBlock::handlerForVPC(const Instruction* vPC)
{
if (!m_rareData)
return 0;
- Vector<HandlerInfo>::iterator ptr = m_rareData->m_exceptionHandlers.begin();
- Vector<HandlerInfo>::iterator end = m_rareData->m_exceptionHandlers.end();
+ unsigned addressOffset = vPC - m_instructions.begin();
+ ASSERT(addressOffset < m_instructions.size());
- for (; ptr != end; ++ptr) {
- Instruction*target = m_instructions.begin() + ptr->target;
- if (handlerVPC == target)
- return ptr->nativeCode;
+ Vector<HandlerInfo>& exceptionHandlers = m_rareData->m_exceptionHandlers;
+ for (size_t i = 0; i < exceptionHandlers.size(); ++i) {
+ // Handlers are ordered innermost first, so the first handler we encounter
+ // that contains the source address is the correct handler to use.
+ if (exceptionHandlers[i].start <= addressOffset && exceptionHandlers[i].end >= addressOffset)
+ return &exceptionHandlers[i];
}
return 0;
diff --git a/JavaScriptCore/bytecode/CodeBlock.h b/JavaScriptCore/bytecode/CodeBlock.h
index 36fdae0..efc0b0f 100644
--- a/JavaScriptCore/bytecode/CodeBlock.h
+++ b/JavaScriptCore/bytecode/CodeBlock.h
@@ -219,8 +219,7 @@
#endif
int expressionRangeForVPC(const Instruction*, int& divot, int& startOffset, int& endOffset);
int lineNumberForVPC(const Instruction* vPC);
- bool getHandlerForVPC(const Instruction* vPC, Instruction*& target, int& scopeDepth);
- void* nativeExceptionCodeForHandlerVPC(const Instruction* handlerVPC);
+ HandlerInfo* handlerForVPC(const Instruction* vPC);
void mark();
void refStructures(Instruction* vPC) const;