diff options
Diffstat (limited to 'Source/JavaScriptCore/interpreter/Interpreter.h')
-rw-r--r-- | Source/JavaScriptCore/interpreter/Interpreter.h | 99 |
1 files changed, 87 insertions, 12 deletions
diff --git a/Source/JavaScriptCore/interpreter/Interpreter.h b/Source/JavaScriptCore/interpreter/Interpreter.h index 884c4248e..51881a565 100644 --- a/Source/JavaScriptCore/interpreter/Interpreter.h +++ b/Source/JavaScriptCore/interpreter/Interpreter.h @@ -31,8 +31,10 @@ #include "ArgList.h" #include "JSCell.h" +#include "JSFunction.h" #include "JSValue.h" #include "JSObject.h" +#include "LLIntData.h" #include "Opcode.h" #include "RegisterFile.h" @@ -42,9 +44,10 @@ namespace JSC { class CodeBlock; class EvalExecutable; + class ExecutableBase; class FunctionExecutable; - class JSFunction; class JSGlobalObject; + class LLIntOffsetsExtractor; class ProgramExecutable; class Register; class ScopeChainNode; @@ -62,6 +65,63 @@ namespace JSC { WillExecuteStatement }; + enum StackFrameCodeType { + StackFrameGlobalCode, + StackFrameEvalCode, + StackFrameFunctionCode, + StackFrameNativeCode + }; + + struct StackFrame { + Strong<JSObject> callee; + StackFrameCodeType codeType; + Strong<ExecutableBase> executable; + int line; + UString sourceURL; + UString toString(CallFrame* callFrame) const + { + bool hasSourceURLInfo = !sourceURL.isNull() && !sourceURL.isEmpty(); + bool hasLineInfo = line > -1; + String traceLine; + JSObject* stackFrameCallee = callee.get(); + + switch (codeType) { + case StackFrameEvalCode: + if (hasSourceURLInfo) { + traceLine = hasLineInfo ? String::format("eval code@%s:%d", sourceURL.ascii().data(), line) + : String::format("eval code@%s", sourceURL.ascii().data()); + } else + traceLine = String::format("eval code"); + break; + case StackFrameNativeCode: { + if (callee) { + UString functionName = getCalculatedDisplayName(callFrame, stackFrameCallee); + traceLine = String::format("%s@[native code]", functionName.ascii().data()); + } else + traceLine = "[native code]"; + break; + } + case StackFrameFunctionCode: { + UString functionName = getCalculatedDisplayName(callFrame, stackFrameCallee); + if (hasSourceURLInfo) { + traceLine = hasLineInfo ? String::format("%s@%s:%d", functionName.ascii().data(), sourceURL.ascii().data(), line) + : String::format("%s@%s", functionName.ascii().data(), sourceURL.ascii().data()); + } else + traceLine = String::format("%s\n", functionName.ascii().data()); + break; + } + case StackFrameGlobalCode: + if (hasSourceURLInfo) { + traceLine = hasLineInfo ? String::format("global code@%s:%d", sourceURL.ascii().data(), line) + : String::format("global code@%s", sourceURL.ascii().data()); + } else + traceLine = String::format("global code"); + + } + return traceLine.impl(); + } + }; + class TopCallFrameSetter { public: TopCallFrameSetter(JSGlobalData& global, CallFrame* callFrame) @@ -90,29 +150,31 @@ namespace JSC { } }; -#if PLATFORM(IOS) // We use a smaller reentrancy limit on iPhone because of the high amount of // stack space required on the web thread. - enum { MaxLargeThreadReentryDepth = 93, MaxSmallThreadReentryDepth = 16 }; +#if PLATFORM(IOS) + enum { MaxLargeThreadReentryDepth = 64, MaxSmallThreadReentryDepth = 16 }; #else enum { MaxLargeThreadReentryDepth = 256, MaxSmallThreadReentryDepth = 16 }; #endif // PLATFORM(IOS) class Interpreter { WTF_MAKE_FAST_ALLOCATED; - friend class JIT; friend class CachedCall; + friend class LLIntOffsetsExtractor; + friend class JIT; public: Interpreter(); + ~Interpreter(); - void initialize(bool canUseJIT); + void initialize(LLInt::Data*, bool canUseJIT); RegisterFile& registerFile() { return m_registerFile; } Opcode getOpcode(OpcodeID id) { ASSERT(m_initialized); -#if ENABLE(COMPUTED_GOTO_INTERPRETER) +#if ENABLE(COMPUTED_GOTO_CLASSIC_INTERPRETER) || ENABLE(LLINT) return m_opcodeTable[id]; #else return id; @@ -122,9 +184,12 @@ namespace JSC { OpcodeID getOpcodeID(Opcode opcode) { ASSERT(m_initialized); -#if ENABLE(COMPUTED_GOTO_INTERPRETER) +#if ENABLE(LLINT) + ASSERT(isOpcode(opcode)); + return m_opcodeIDTable.get(opcode); +#elif ENABLE(COMPUTED_GOTO_CLASSIC_INTERPRETER) ASSERT(isOpcode(opcode)); - if (!m_enabled) + if (!m_classicEnabled) return static_cast<OpcodeID>(bitwise_cast<uintptr_t>(opcode)); return m_opcodeIDTable.get(opcode); @@ -132,6 +197,11 @@ namespace JSC { return opcode; #endif } + + bool classicEnabled() + { + return m_classicEnabled; + } bool isOpcode(Opcode); @@ -151,6 +221,8 @@ namespace JSC { NEVER_INLINE HandlerInfo* throwException(CallFrame*&, JSValue&, unsigned bytecodeOffset); NEVER_INLINE void debug(CallFrame*, DebugHookID, int firstLine, int lastLine); + static const UString getTraceLine(CallFrame*, StackFrameCodeType, const UString&, int); + JS_EXPORT_PRIVATE static void getStackTrace(JSGlobalData*, int line, Vector<StackFrame>& results); void dumpSampleData(ExecState* exec); void startSampling(); @@ -162,7 +234,7 @@ namespace JSC { void endRepeatCall(CallFrameClosure&); JSValue execute(CallFrameClosure&); -#if ENABLE(INTERPRETER) +#if ENABLE(CLASSIC_INTERPRETER) NEVER_INLINE bool resolve(CallFrame*, Instruction*, JSValue& exceptionValue); NEVER_INLINE bool resolveSkip(CallFrame*, Instruction*, JSValue& exceptionValue); NEVER_INLINE bool resolveGlobal(CallFrame*, Instruction*, JSValue& exceptionValue); @@ -176,7 +248,7 @@ namespace JSC { void uncacheGetByID(CodeBlock*, Instruction* vPC); void tryCachePutByID(CallFrame*, CodeBlock*, Instruction*, JSValue baseValue, const PutPropertySlot&); void uncachePutByID(CodeBlock*, Instruction* vPC); -#endif // ENABLE(INTERPRETER) +#endif // ENABLE(CLASSIC_INTERPRETER) NEVER_INLINE bool unwindCallFrame(CallFrame*&, JSValue, unsigned& bytecodeOffset, CodeBlock*&); @@ -199,7 +271,10 @@ namespace JSC { RegisterFile m_registerFile; -#if ENABLE(COMPUTED_GOTO_INTERPRETER) +#if ENABLE(LLINT) + Opcode* m_opcodeTable; // Maps OpcodeID => Opcode for compiling + HashMap<Opcode, OpcodeID> m_opcodeIDTable; // Maps Opcode => OpcodeID for decompiling +#elif ENABLE(COMPUTED_GOTO_CLASSIC_INTERPRETER) Opcode m_opcodeTable[numOpcodeIDs]; // Maps OpcodeID => Opcode for compiling HashMap<Opcode, OpcodeID> m_opcodeIDTable; // Maps Opcode => OpcodeID for decompiling #endif @@ -207,7 +282,7 @@ namespace JSC { #if !ASSERT_DISABLED bool m_initialized; #endif - bool m_enabled; + bool m_classicEnabled; }; // This value must not be an object that would require this conversion (WebCore's global object). |