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

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

2008-06-24 Cameron Zwarich <[email protected]>

Rubber stamped by Oliver.

Roll out r34777 due to multiple assertion failures on tests.

  • ChangeLog:
  • VM/CodeGenerator.cpp: (KJS::CodeGenerator::emitJump): (KJS::CodeGenerator::emitJumpIfTrueMayCombine): (KJS::CodeGenerator::emitJumpIfTrue): (KJS::CodeGenerator::emitJumpIfFalse): (KJS::CodeGenerator::emitJumpScopes):
  • VM/LabelID.h:
  • VM/Machine.cpp: (KJS::Machine::privateExecute):
  • VM/Machine.h:
  • VM/Opcode.h:
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 <kjs/list.h>
35#include <wtf/HashMap.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 WillExecuteProgram,
51 DidExecuteProgram,
52 DidEnterCallFrame,
53 DidReachBreakpoint,
54 WillLeaveCallFrame,
55 WillExecuteStatement
56 };
57
58 enum { MaxReentryDepth = 128 };
59
60 class Machine {
61 public:
62 enum {
63 CallerCodeBlock = 0,
64 ReturnVPC,
65 CallerScopeChain,
66 CallerRegisterOffset,
67 ReturnValueRegister,
68 ArgumentStartRegister,
69 ArgumentCount,
70 CalledAsConstructor,
71 Callee,
72 OptionalCalleeActivation,
73 CallFrameHeaderSize
74 };
75
76 enum { ProgramCodeThisRegister = -1 };
77
78 Machine();
79
80 Opcode getOpcode(OpcodeID id)
81 {
82 #if HAVE(COMPUTED_GOTO)
83 return m_opcodeTable[id];
84 #else
85 return id;
86 #endif
87 }
88
89 OpcodeID getOpcodeID(Opcode opcode)
90 {
91 #if HAVE(COMPUTED_GOTO)
92 ASSERT(isOpcode(opcode));
93 return m_opcodeIDTable.get(opcode);
94 #else
95 return opcode;
96 #endif
97 }
98
99 bool isOpcode(Opcode opcode);
100
101 JSValue* execute(ProgramNode*, ExecState*, ScopeChainNode*, JSObject* thisObj, RegisterFileStack*, JSValue** exception);
102 JSValue* execute(FunctionBodyNode*, ExecState*, JSFunction*, JSObject* thisObj, const ArgList& args, RegisterFileStack*, ScopeChainNode*, JSValue** exception);
103 JSValue* execute(EvalNode*, ExecState*, JSObject* thisObj, RegisterFile*, int registerOffset, ScopeChainNode*, JSValue** exception);
104 JSValue* execute(EvalNode*, ExecState*, JSObject* thisObj, RegisterFileStack*, ScopeChainNode*, JSValue** exception);
105
106 JSValue* retrieveArguments(ExecState*, JSFunction*) const;
107 JSValue* retrieveCaller(ExecState*, JSFunction*) const;
108
109 void getFunctionAndArguments(Register** registerBase, Register* callFrame, JSFunction*&, Register*& argv, int& argc);
110
111 private:
112 enum ExecutionFlag { Normal, InitializeAndReturn };
113
114 ALWAYS_INLINE void setScopeChain(ExecState* exec, ScopeChainNode*&, ScopeChainNode*);
115 NEVER_INLINE void debug(ExecState*, const Instruction*, const CodeBlock*, ScopeChainNode*, Register**, Register*);
116
117 NEVER_INLINE bool unwindCallFrame(ExecState*, JSValue*, Register**, const Instruction*&, CodeBlock*&, JSValue**&, ScopeChainNode*&, Register*&);
118 NEVER_INLINE Instruction* throwException(ExecState*, JSValue*, Register**, const Instruction*, CodeBlock*&, JSValue**&, ScopeChainNode*&, Register*&);
119
120 bool getCallFrame(ExecState*, JSFunction*, Register**& registerBase, int& callFrameOffset) const;
121
122 JSValue* privateExecute(ExecutionFlag, ExecState* = 0, RegisterFile* = 0, Register* = 0, ScopeChainNode* = 0, CodeBlock* = 0, JSValue** exception = 0);
123
124 void dumpCallFrame(const CodeBlock*, ScopeChainNode*, RegisterFile*, const Register*);
125 void dumpRegisters(const CodeBlock*, RegisterFile*, const Register*);
126
127 bool isGlobalCallFrame(Register** registerBase, const Register* r) const { return (*registerBase) == r; }
128
129 int m_reentryDepth;
130#if HAVE(COMPUTED_GOTO)
131 Opcode m_opcodeTable[numOpcodeIDs]; // Maps OpcodeID => Opcode for compiling
132 HashMap<Opcode, OpcodeID> m_opcodeIDTable; // Maps Opcode => OpcodeID for decompiling
133#endif
134 };
135
136} // namespace KJS
137
138#endif // Machine_h
Note: See TracBrowser for help on using the repository browser.