source: webkit/trunk/JavaScriptCore/VM/Machine.h@ 33979

Last change on this file since 33979 was 33979, checked in by [email protected], 17 years ago

Merge squirrelfish branch into trunk.

File size: 5.3 KB
Line 
1/*
2 * Copyright (C) 2008 Apple Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
14 * its contributors may be used to endorse or promote products derived
15 * from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
18 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
21 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29#ifndef Machine_h
30#define Machine_h
31
32#include "Opcode.h"
33#include "RegisterFileStack.h"
34#include <wtf/HashMap.h>
35#include <kjs/list.h>
36
37namespace KJS {
38
39 class CodeBlock;
40 class EvalNode;
41 class ExecState;
42 class FunctionBodyNode;
43 class ProgramNode;
44 class Register;
45 class RegisterFile;
46 class RegisterFileStack;
47 class ScopeChainNode;
48
49 enum DebugHookID {
50 WillExecuteStatement,
51 DidEnterCallFrame,
52 WillLeaveCallFrame
53 };
54
55 class Machine {
56 public:
57 enum { CallerCodeBlock = 0,
58 ReturnVPC,
59 CallerScopeChain,
60 CallerRegisterOffset,
61 ReturnValueRegister,
62 ArgumentStartRegister,
63 ArgumentCount,
64 CalledAsConstructor,
65 Callee,
66 OptionalCalleeActivation,
67 CallFrameHeaderSize};
68
69 enum { ProgramCodeThisRegister = -1 };
70
71 Machine();
72
73 Opcode getOpcode(OpcodeID id) {
74 #if HAVE(COMPUTED_GOTO)
75 return m_opcodeTable[id];
76 #else
77 return id;
78 #endif
79 }
80
81 OpcodeID getOpcodeID(Opcode opcode) {
82 #if HAVE(COMPUTED_GOTO)
83 ASSERT(isOpcode(opcode));
84 return m_opcodeIDTable.get(opcode);
85 #else
86 return opcode;
87 #endif
88 }
89
90 bool isOpcode(Opcode opcode);
91
92 JSValue* execute(ProgramNode*, ExecState*, ScopeChainNode*, JSObject* thisObj, RegisterFileStack*, JSValue** exception);
93 JSValue* execute(FunctionBodyNode*, ExecState*, FunctionImp*, JSObject* thisObj, const List& args, RegisterFileStack*, ScopeChainNode*, JSValue** exception);
94 JSValue* execute(EvalNode*, ExecState*, JSObject* thisObj, RegisterFile*, int registerOffset, ScopeChainNode*, JSValue** exception);
95 JSValue* execute(EvalNode*, ExecState*, JSObject* thisObj, RegisterFileStack*, ScopeChainNode*, JSValue** exception);
96
97 JSValue* retrieveArguments(ExecState*, FunctionImp*) const;
98 JSValue* retrieveCaller(ExecState*, FunctionImp*) const;
99
100 void getFunctionAndArguments(Register** registerBase, Register* callFrame, FunctionImp*&, Register*& argv, int& argc);
101
102 private:
103 enum { MaxReentryDepth = 128 };
104 typedef enum { Normal, InitializeAndReturn } ExecutionFlag;
105
106 ALWAYS_INLINE void setScopeChain(ExecState* exec, ScopeChainNode*&, ScopeChainNode*);
107 NEVER_INLINE void debug(ExecState*, const Instruction*, const CodeBlock*, ScopeChainNode*, Register**, Register*);
108
109 NEVER_INLINE bool unwindCallFrame(ExecState*, JSValue*, Register**, const Instruction*&, CodeBlock*&, JSValue**&, ScopeChainNode*&, Register*&);
110 NEVER_INLINE Instruction* throwException(ExecState*, JSValue*, Register**, const Instruction*, CodeBlock*&, JSValue**&, ScopeChainNode*&, Register*&);
111
112 bool getCallFrame(ExecState*, FunctionImp*, Register**& registerBase, int& callFrameOffset) const;
113
114 JSValue* privateExecute(ExecutionFlag, ExecState* = 0, RegisterFile* = 0, Register* = 0, ScopeChainNode* = 0, CodeBlock* = 0, JSValue** exception = 0);
115
116 void dumpCallFrame(const CodeBlock*, ScopeChainNode*, RegisterFile*, const Register*);
117 void dumpRegisters(const CodeBlock*, RegisterFile*, const Register*);
118
119 bool isGlobalCallFrame(Register** registerBase, const Register* r) const { return (*registerBase) == r; }
120
121 int m_reentryDepth;
122#if HAVE(COMPUTED_GOTO)
123 Opcode m_opcodeTable[numOpcodeIDs]; // Maps OpcodeID => Opcode for compiling
124 HashMap<Opcode, OpcodeID> m_opcodeIDTable; // Maps Opcode => OpcodeID for decompiling
125#endif
126 };
127
128 Machine& machine();
129
130} // namespace KJS
131
132#endif // Machine_h
Note: See TracBrowser for help on using the repository browser.