Merge squirrelfish branch into trunk.


git-svn-id: http://svn.webkit.org/repository/webkit/trunk@33979 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/JavaScriptCore/kjs/nodes.h b/JavaScriptCore/kjs/nodes.h
index 6a086d0..ddebedf 100644
--- a/JavaScriptCore/kjs/nodes.h
+++ b/JavaScriptCore/kjs/nodes.h
@@ -28,7 +28,10 @@
 
 #include "internal.h"
 #include "regexp.h"
+#include "RegisterID.h"
+#include "SourceRange.h"
 #include "SymbolTable.h"
+#include <wtf/UnusedParam.h>
 #include <wtf/ListRefPtr.h>
 #include <wtf/MathExtras.h>
 #include <wtf/OwnPtr.h>
@@ -43,9 +46,13 @@
 namespace KJS {
 
     class ArgumentsNode;
+    class CodeBlock;
+    class CodeGenerator;
     class ConstDeclNode;
     class FuncDeclNode;
     class Node;
+    class EvalCodeBlock;
+    class ProgramCodeBlock;
     class PropertyListNode;
     class SourceStream;
 
@@ -137,40 +144,74 @@
         {
         }
 
+        /*
+            Return value: The register holding the production's value.
+                     dst: An optional parameter specifying the most efficient
+                          destination at which to store the production's value.
+                          The callee must honor dst.
+
+            dst provides for a crude form of copy propagation. For example,
+
+            x = 1
+
+            becomes
+            
+            load r[x], 1
+            
+            instead of 
+
+            load r0, 1
+            mov r[x], r0
+            
+            because the assignment node, "x =", passes r[x] as dst to the number
+            node, "1".
+        */
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* dst = 0) KJS_FAST_CALL 
+        {
+            ASSERT_WITH_MESSAGE(0, "Don't know how to generate code for:\n%s\n", toString().ascii());
+            UNUSED_PARAM(dst); 
+            return 0; 
+        } // FIXME: Make this pure virtual.
+
         UString toString() const KJS_FAST_CALL;
         int lineNo() const KJS_FAST_CALL { return m_line; }
 
+        virtual bool isReturnNode() const KJS_FAST_CALL { return false; }
+
         // Serialization.
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL = 0;
         virtual Precedence precedence() const = 0;
         virtual bool needsParensIfLeftmost() const { return false; }
-
+        
         // Used for iterative, depth-first traversal of the node tree. Does not cross function call boundaries.
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL { }
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL { }
 
     protected:
         Node(JSType) KJS_FAST_CALL; // used by ExpressionNode
 
         // for use in execute()
-        JSValue* setErrorCompletion(ExecState*, ErrorType, const char* msg) KJS_FAST_CALL;
-        JSValue* setErrorCompletion(ExecState*, ErrorType, const char* msg, const Identifier&) KJS_FAST_CALL;
+        JSValue* setErrorCompletion(OldInterpreterExecState*, ErrorType, const char* msg) KJS_FAST_CALL;
+        JSValue* setErrorCompletion(OldInterpreterExecState*, ErrorType, const char* msg, const Identifier&) KJS_FAST_CALL;
 
         // for use in evaluate()
-        JSValue* throwError(ExecState*, ErrorType, const char* msg) KJS_FAST_CALL;
-        JSValue* throwError(ExecState*, ErrorType, const char* msg, const char*) KJS_FAST_CALL;
-        JSValue* throwError(ExecState*, ErrorType, const char* msg, JSValue*, Node*) KJS_FAST_CALL;
-        JSValue* throwError(ExecState*, ErrorType, const char* msg, const Identifier&) KJS_FAST_CALL;
-        JSValue* throwError(ExecState*, ErrorType, const char* msg, JSValue*, const Identifier&) KJS_FAST_CALL;
-        JSValue* throwError(ExecState*, ErrorType, const char* msg, JSValue*, Node*, Node*) KJS_FAST_CALL;
-        JSValue* throwError(ExecState*, ErrorType, const char* msg, JSValue*, Node*, const Identifier&) KJS_FAST_CALL;
+        JSValue* throwError(OldInterpreterExecState*, ErrorType, const char* msg) KJS_FAST_CALL;
+        JSValue* throwError(OldInterpreterExecState*, ErrorType, const char* msg, const char*) KJS_FAST_CALL;
+        JSValue* throwError(OldInterpreterExecState*, ErrorType, const char* msg, JSValue*, Node*) KJS_FAST_CALL;
+        JSValue* throwError(OldInterpreterExecState*, ErrorType, const char* msg, const Identifier&) KJS_FAST_CALL;
+        JSValue* throwError(OldInterpreterExecState*, ErrorType, const char* msg, JSValue*, const Identifier&) KJS_FAST_CALL;
+        JSValue* throwError(OldInterpreterExecState*, ErrorType, const char* msg, JSValue*, Node*, Node*) KJS_FAST_CALL;
+        JSValue* throwError(OldInterpreterExecState*, ErrorType, const char* msg, JSValue*, Node*, const Identifier&) KJS_FAST_CALL;
+        
+        RegisterID* emitThrowError(CodeGenerator&, ErrorType, const char* msg);
+        RegisterID* emitThrowError(CodeGenerator&, ErrorType, const char* msg, const Identifier&);
 
-        JSValue* throwUndefinedVariableError(ExecState*, const Identifier&) KJS_FAST_CALL;
+        JSValue* throwUndefinedVariableError(OldInterpreterExecState*, const Identifier&) KJS_FAST_CALL;
 
-        void handleException(ExecState*) KJS_FAST_CALL;
-        void handleException(ExecState*, JSValue*) KJS_FAST_CALL;
+        void handleException(OldInterpreterExecState*) KJS_FAST_CALL;
+        void handleException(OldInterpreterExecState*, JSValue*) KJS_FAST_CALL;
 
         // for use in execute()
-        JSValue* rethrowException(ExecState*) KJS_FAST_CALL;
+        JSValue* rethrowException(OldInterpreterExecState*) KJS_FAST_CALL;
 
         int m_line : 28;
         unsigned m_expectedReturnType : 3; // JSType
@@ -198,11 +239,11 @@
 
         JSType expectedReturnType() const KJS_FAST_CALL { return static_cast<JSType>(m_expectedReturnType); }
 
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL = 0;
-        virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL;
-        virtual int32_t evaluateToInt32(ExecState*) KJS_FAST_CALL;
-        virtual uint32_t evaluateToUInt32(ExecState*) KJS_FAST_CALL;
-        virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL = 0;
+        virtual double evaluateToNumber(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual int32_t evaluateToInt32(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual uint32_t evaluateToUInt32(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual bool evaluateToBoolean(OldInterpreterExecState*) KJS_FAST_CALL;
 
         // Used to optimize those nodes that do extra work when returning a result, even if the result has no semantic relevance
         virtual void optimizeForUnnecessaryResult() { }
@@ -210,7 +251,7 @@
         // This needs to be in public in order to compile using GCC 3.x 
         typedef enum { EvalOperator, FunctionCall } CallerType;
     protected:
-        template <CallerType, bool> inline JSValue* resolveAndCall(ExecState*, const Identifier&, ArgumentsNode*, size_t = 0);
+        template <CallerType, bool> inline JSValue* resolveAndCall(OldInterpreterExecState*, const Identifier&, ArgumentsNode*, size_t = 0);
     };
 
     class StatementNode : public Node {
@@ -219,7 +260,9 @@
         void setLoc(int line0, int line1) KJS_FAST_CALL;
         int firstLine() const KJS_FAST_CALL { return lineNo(); }
         int lastLine() const KJS_FAST_CALL { return m_lastLine; }
-        virtual JSValue* execute(ExecState *exec) KJS_FAST_CALL = 0;
+
+        virtual JSValue* execute(OldInterpreterExecState *exec) KJS_FAST_CALL = 0;
+
         virtual void pushLabel(const Identifier& ident) KJS_FAST_CALL { m_labelStack.push(ident); }
         virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; }
         virtual bool isEmptyStatement() const KJS_FAST_CALL { return false; }
@@ -233,8 +276,14 @@
 
     class NullNode : public ExpressionNode {
     public:
-        NullNode() KJS_FAST_CALL : ExpressionNode(NullType) {}
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
+        NullNode() KJS_FAST_CALL
+            : ExpressionNode(NullType)
+        {
+        }
+
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecPrimary; }
     };
@@ -246,8 +295,10 @@
         {
         }
 
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
-        virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL { return false; }
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual bool evaluateToBoolean(OldInterpreterExecState*) KJS_FAST_CALL { return false; }
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecPrimary; }
     };
@@ -259,8 +310,10 @@
         {
         }
 
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
-        virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL { return true; }
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual bool evaluateToBoolean(OldInterpreterExecState*) KJS_FAST_CALL { return true; }
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecPrimary; }
     };
@@ -284,11 +337,13 @@
         {
         }
 
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
-        virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL;
-        virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL;
-        virtual int32_t evaluateToInt32(ExecState*) KJS_FAST_CALL;
-        virtual uint32_t evaluateToUInt32(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual double evaluateToNumber(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual bool evaluateToBoolean(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual int32_t evaluateToInt32(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual uint32_t evaluateToUInt32(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { return signbit(m_double) ? PrecUnary : PrecPrimary; }
 
@@ -309,9 +364,9 @@
             ASSERT(v == JSImmediate::from(d));
         }
 
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
-        virtual int32_t evaluateToInt32(ExecState*) KJS_FAST_CALL;
-        virtual uint32_t evaluateToUInt32(ExecState*) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual int32_t evaluateToInt32(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual uint32_t evaluateToUInt32(OldInterpreterExecState*) KJS_FAST_CALL;
 
         virtual void setValue(double d) KJS_FAST_CALL { m_double = d; m_value = JSImmediate::from(d); ASSERT(m_value); }
 
@@ -327,9 +382,11 @@
         {
         }
 
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
-        virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL;
-        virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual double evaluateToNumber(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual bool evaluateToBoolean(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecPrimary; }
 
@@ -344,7 +401,9 @@
         {
         }
 
-        JSValue* evaluate(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+
+        JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecPrimary; }
 
@@ -358,7 +417,9 @@
         {
         }
 
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecPrimary; }
     };
@@ -377,13 +438,14 @@
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
 
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
-        virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL;
-        virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL;
-        virtual int32_t evaluateToInt32(ExecState*) KJS_FAST_CALL;
-        virtual uint32_t evaluateToUInt32(ExecState*) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual bool evaluateToBoolean(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual double evaluateToNumber(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual int32_t evaluateToInt32(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual uint32_t evaluateToUInt32(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecPrimary; }
 
@@ -392,36 +454,36 @@
         const Identifier& identifier() const KJS_FAST_CALL { return m_ident; }
 
     protected:
-        ALWAYS_INLINE JSValue* inlineEvaluate(ExecState*);
+        ALWAYS_INLINE JSValue* inlineEvaluate(OldInterpreterExecState*);
         Identifier m_ident;
-        size_t m_index; // Used by LocalVarAccessNode and ScopedVarAccessNode.
+        int m_index; // Used by LocalVarAccessNode and ScopedVarAccessNode.
         size_t m_scopeDepth; // Used by ScopedVarAccessNode
     };
 
     class LocalVarAccessNode : public ResolveNode {
     public:
         // Overwrites a ResolveNode in place.
-        LocalVarAccessNode(size_t i) KJS_FAST_CALL
+        LocalVarAccessNode(int i) KJS_FAST_CALL
             : ResolveNode(PlacementNewAdopt)
         {
             ASSERT(i != missingSymbolMarker());
             m_index = i;
         }
 
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
-        virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL;
-        virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL;
-        virtual int32_t evaluateToInt32(ExecState*) KJS_FAST_CALL;
-        virtual uint32_t evaluateToUInt32(ExecState*) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual double evaluateToNumber(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual bool evaluateToBoolean(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual int32_t evaluateToInt32(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual uint32_t evaluateToUInt32(OldInterpreterExecState*) KJS_FAST_CALL;
 
     private:
-        ALWAYS_INLINE JSValue* inlineEvaluate(ExecState*);
+        ALWAYS_INLINE JSValue* inlineEvaluate(OldInterpreterExecState*);
     };
     
     class ScopedVarAccessNode : public ResolveNode {
     public:
         // Overwrites a ResolveNode in place.
-        ScopedVarAccessNode(size_t i, size_t scopeDepth) KJS_FAST_CALL
+        ScopedVarAccessNode(int i, size_t scopeDepth) KJS_FAST_CALL
         : ResolveNode(PlacementNewAdopt)
         {
             ASSERT(i != missingSymbolMarker());
@@ -429,14 +491,14 @@
             m_scopeDepth = scopeDepth;
         }
         
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
-        virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL;
-        virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL;
-        virtual int32_t evaluateToInt32(ExecState*) KJS_FAST_CALL;
-        virtual uint32_t evaluateToUInt32(ExecState*) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual double evaluateToNumber(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual bool evaluateToBoolean(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual int32_t evaluateToInt32(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual uint32_t evaluateToUInt32(OldInterpreterExecState*) KJS_FAST_CALL;
         
     private:
-        ALWAYS_INLINE JSValue* inlineEvaluate(ExecState*);
+        ALWAYS_INLINE JSValue* inlineEvaluate(OldInterpreterExecState*);
     };
     
     class NonLocalVarAccessNode : public ResolveNode {
@@ -449,14 +511,14 @@
             m_scopeDepth = scopeDepth;
         }
         
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
-        virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL;
-        virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL;
-        virtual int32_t evaluateToInt32(ExecState*) KJS_FAST_CALL;
-        virtual uint32_t evaluateToUInt32(ExecState*) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual double evaluateToNumber(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual bool evaluateToBoolean(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual int32_t evaluateToInt32(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual uint32_t evaluateToUInt32(OldInterpreterExecState*) KJS_FAST_CALL;
         
     private:
-        ALWAYS_INLINE JSValue* inlineEvaluate(ExecState*);
+        ALWAYS_INLINE JSValue* inlineEvaluate(OldInterpreterExecState*);
     };
 
     class ElementNode : public Node {
@@ -476,11 +538,11 @@
 
         virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; }
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
 
         PassRefPtr<ElementNode> releaseNext() KJS_FAST_CALL { return m_next.release(); }
 
-        JSValue* evaluate(ExecState*) KJS_FAST_CALL;
+        JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
 
     private:
         friend class ArrayNode;
@@ -511,8 +573,10 @@
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecPrimary; }
 
@@ -533,11 +597,11 @@
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; }
 
-        JSValue* evaluate(ExecState*) KJS_FAST_CALL;
+        JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
         const Identifier& name() const { return m_name; }
 
     private:
@@ -560,11 +624,12 @@
             list->m_next = this;
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; }
 
-        JSValue* evaluate(ExecState*) KJS_FAST_CALL;
+        JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
         PassRefPtr<PropertyListNode> releaseNext() KJS_FAST_CALL { return m_next.release(); }
 
     private:
@@ -584,8 +649,9 @@
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecPrimary; }
         virtual bool needsParensIfLeftmost() const { return true; }
@@ -602,12 +668,14 @@
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
-        virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL;
-        virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL;
-        virtual int32_t evaluateToInt32(ExecState*) KJS_FAST_CALL;
-        virtual uint32_t evaluateToUInt32(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual double evaluateToNumber(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual bool evaluateToBoolean(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual int32_t evaluateToInt32(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual uint32_t evaluateToUInt32(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecMember; }
 
@@ -617,7 +685,7 @@
         ExpressionNode* subscript() KJS_FAST_CALL { return m_subscript.get(); }
 
     private:
-        ALWAYS_INLINE JSValue* inlineEvaluate(ExecState*);
+        ALWAYS_INLINE JSValue* inlineEvaluate(OldInterpreterExecState*);
 
         RefPtr<ExpressionNode> m_base;
         RefPtr<ExpressionNode> m_subscript;
@@ -631,12 +699,13 @@
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
-        virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL;
-        virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL;
-        virtual int32_t evaluateToInt32(ExecState*) KJS_FAST_CALL;
-        virtual uint32_t evaluateToUInt32(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual bool evaluateToBoolean(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual double evaluateToNumber(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual int32_t evaluateToInt32(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual uint32_t evaluateToUInt32(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecMember; }
 
@@ -646,7 +715,7 @@
         const Identifier& identifier() const KJS_FAST_CALL { return m_ident; }
 
     private:
-        ALWAYS_INLINE JSValue* inlineEvaluate(ExecState*);
+        ALWAYS_INLINE JSValue* inlineEvaluate(OldInterpreterExecState*);
 
         RefPtr<ExpressionNode> m_base;
         Identifier m_ident;
@@ -665,15 +734,14 @@
             listNode->m_next = this;
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; }
 
-        void evaluateList(ExecState*, List&) KJS_FAST_CALL;
+        void evaluateList(OldInterpreterExecState*, List&) KJS_FAST_CALL;
         PassRefPtr<ArgumentListNode> releaseNext() KJS_FAST_CALL { return m_next.release(); }
 
-    private:
-        friend class ArgumentsNode;
         ListRefPtr<ArgumentListNode> m_next;
         RefPtr<ExpressionNode> m_expr;
     };
@@ -689,13 +757,12 @@
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; }
 
-        void evaluateList(ExecState* exec, List& list) KJS_FAST_CALL { if (m_listNode) m_listNode->evaluateList(exec, list); }
+        void evaluateList(OldInterpreterExecState* exec, List& list) KJS_FAST_CALL { if (m_listNode) m_listNode->evaluateList(exec, list); }
 
-    private:
         RefPtr<ArgumentListNode> m_listNode;
     };
 
@@ -712,17 +779,19 @@
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
-        virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL;
-        virtual int32_t evaluateToInt32(ExecState*) KJS_FAST_CALL;
-        virtual uint32_t evaluateToUInt32(ExecState*) KJS_FAST_CALL;
-        virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual double evaluateToNumber(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual int32_t evaluateToInt32(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual uint32_t evaluateToUInt32(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual bool evaluateToBoolean(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecLeftHandSide; }
 
     private:
-        ALWAYS_INLINE JSValue* inlineEvaluate(ExecState*);
+        ALWAYS_INLINE JSValue* inlineEvaluate(OldInterpreterExecState*);
 
         RefPtr<ExpressionNode> m_expr;
         RefPtr<ArgumentsNode> m_args;
@@ -735,8 +804,9 @@
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecCall; }
 
@@ -752,8 +822,9 @@
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecCall; }
 
@@ -777,17 +848,19 @@
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
-        virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL;
-        virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL;
-        virtual int32_t evaluateToInt32(ExecState*) KJS_FAST_CALL;
-        virtual uint32_t evaluateToUInt32(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual double evaluateToNumber(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual bool evaluateToBoolean(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual int32_t evaluateToInt32(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual uint32_t evaluateToUInt32(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecCall; }
 
     protected:
-        ALWAYS_INLINE JSValue* inlineEvaluate(ExecState*);
+        ALWAYS_INLINE JSValue* inlineEvaluate(OldInterpreterExecState*);
 
         Identifier m_ident;
         RefPtr<ArgumentsNode> m_args;
@@ -797,26 +870,26 @@
     
     class LocalVarFunctionCallNode : public FunctionCallResolveNode {
     public:
-        LocalVarFunctionCallNode(size_t i) KJS_FAST_CALL
+        LocalVarFunctionCallNode(int i) KJS_FAST_CALL
             : FunctionCallResolveNode(PlacementNewAdopt)
         {
             ASSERT(i != missingSymbolMarker());
             m_index = i;
         }
         
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
-        virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL;
-        virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL;
-        virtual int32_t evaluateToInt32(ExecState*) KJS_FAST_CALL;
-        virtual uint32_t evaluateToUInt32(ExecState*) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual bool evaluateToBoolean(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual double evaluateToNumber(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual int32_t evaluateToInt32(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual uint32_t evaluateToUInt32(OldInterpreterExecState*) KJS_FAST_CALL;
         
     private:
-        ALWAYS_INLINE JSValue* inlineEvaluate(ExecState*);
+        ALWAYS_INLINE JSValue* inlineEvaluate(OldInterpreterExecState*);
     };
     
     class ScopedVarFunctionCallNode : public FunctionCallResolveNode {
     public:
-        ScopedVarFunctionCallNode(size_t i, size_t depth) KJS_FAST_CALL
+        ScopedVarFunctionCallNode(int i, size_t depth) KJS_FAST_CALL
             : FunctionCallResolveNode(PlacementNewAdopt)
         {
             ASSERT(i != missingSymbolMarker());
@@ -824,14 +897,14 @@
             m_scopeDepth = depth;
         }
         
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
-        virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL;
-        virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL;
-        virtual int32_t evaluateToInt32(ExecState*) KJS_FAST_CALL;
-        virtual uint32_t evaluateToUInt32(ExecState*) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual bool evaluateToBoolean(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual double evaluateToNumber(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual int32_t evaluateToInt32(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual uint32_t evaluateToUInt32(OldInterpreterExecState*) KJS_FAST_CALL;
         
     private:
-        ALWAYS_INLINE JSValue* inlineEvaluate(ExecState*);
+        ALWAYS_INLINE JSValue* inlineEvaluate(OldInterpreterExecState*);
     };
     
     class NonLocalVarFunctionCallNode : public FunctionCallResolveNode {
@@ -842,14 +915,14 @@
             m_scopeDepth = depth;
         }
         
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
-        virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL;
-        virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL;
-        virtual int32_t evaluateToInt32(ExecState*) KJS_FAST_CALL;
-        virtual uint32_t evaluateToUInt32(ExecState*) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual bool evaluateToBoolean(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual double evaluateToNumber(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual int32_t evaluateToInt32(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual uint32_t evaluateToUInt32(OldInterpreterExecState*) KJS_FAST_CALL;
         
     private:
-        ALWAYS_INLINE JSValue* inlineEvaluate(ExecState*);
+        ALWAYS_INLINE JSValue* inlineEvaluate(OldInterpreterExecState*);
     };
 
     class FunctionCallBracketNode : public ExpressionNode {
@@ -861,8 +934,9 @@
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecCall; }
 
@@ -881,17 +955,18 @@
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
-        virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL;
-        virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL;
-        virtual int32_t evaluateToInt32(ExecState*) KJS_FAST_CALL;
-        virtual uint32_t evaluateToUInt32(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual bool evaluateToBoolean(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual double evaluateToNumber(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual int32_t evaluateToInt32(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual uint32_t evaluateToUInt32(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecCall; }
 
     private:
-        ALWAYS_INLINE JSValue* inlineEvaluate(ExecState*);
+        ALWAYS_INLINE JSValue* inlineEvaluate(OldInterpreterExecState*);
 
         RefPtr<ExpressionNode> m_base;
         Identifier m_ident;
@@ -929,8 +1004,9 @@
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecPostfix; }
         virtual void optimizeForUnnecessaryResult();
@@ -938,27 +1014,27 @@
 
     class PostIncLocalVarNode : public PostIncResolveNode {
     public:
-        PostIncLocalVarNode(size_t i) KJS_FAST_CALL
+        PostIncLocalVarNode(int i) KJS_FAST_CALL
             : PostIncResolveNode(PlacementNewAdopt)
         {
             ASSERT(i != missingSymbolMarker());
             m_index = i;
         }
 
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void optimizeForUnnecessaryResult();
     };
 
     class PostIncConstNode : public PostIncResolveNode {
     public:
-        PostIncConstNode(size_t i) KJS_FAST_CALL
+        PostIncConstNode(int i) KJS_FAST_CALL
             : PostIncResolveNode(PlacementNewAdopt)
         {
             ASSERT(i != missingSymbolMarker());
             m_index = i;
         }
 
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
     };
 
     class PostDecResolveNode : public PrePostResolveNode {
@@ -973,8 +1049,10 @@
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecPostfix; }
         virtual void optimizeForUnnecessaryResult();
@@ -982,34 +1060,34 @@
 
     class PostDecLocalVarNode : public PostDecResolveNode {
     public:
-        PostDecLocalVarNode(size_t i) KJS_FAST_CALL
+        PostDecLocalVarNode(int i) KJS_FAST_CALL
             : PostDecResolveNode(PlacementNewAdopt)
         {
             ASSERT(i != missingSymbolMarker());
             m_index = i;
         }
 
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
-        virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL;
-        virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL;
-        virtual int32_t evaluateToInt32(ExecState*) KJS_FAST_CALL;
-        virtual uint32_t evaluateToUInt32(ExecState*) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual bool evaluateToBoolean(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual double evaluateToNumber(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual int32_t evaluateToInt32(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual uint32_t evaluateToUInt32(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void optimizeForUnnecessaryResult();
 
     private:
-        ALWAYS_INLINE double inlineEvaluateToNumber(ExecState*);
+        ALWAYS_INLINE double inlineEvaluateToNumber(OldInterpreterExecState*);
     };
 
     class PostDecConstNode : public PostDecResolveNode {
     public:
-        PostDecConstNode(size_t i) KJS_FAST_CALL
+        PostDecConstNode(int i) KJS_FAST_CALL
             : PostDecResolveNode(PlacementNewAdopt)
         {
             ASSERT(i != missingSymbolMarker());
             m_index = i;
         }
 
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
     };
 
     class PostfixBracketNode : public ExpressionNode {
@@ -1020,7 +1098,7 @@
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecPostfix; }
 
     protected:
@@ -1035,7 +1113,9 @@
         {
         }
 
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
     };
 
@@ -1046,7 +1126,9 @@
         {
         }
 
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
     };
 
@@ -1058,7 +1140,7 @@
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecPostfix; }
 
     protected:
@@ -1073,7 +1155,9 @@
         {
         }
 
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
     };
 
@@ -1084,7 +1168,9 @@
         {
         }
 
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
     };
 
@@ -1096,7 +1182,8 @@
         {
         }
 
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecPostfix; }
 
@@ -1118,8 +1205,10 @@
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecUnary; }
 
@@ -1134,7 +1223,7 @@
         {
         }
 
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
     };
 
     class DeleteBracketNode : public ExpressionNode {
@@ -1145,8 +1234,10 @@
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecUnary; }
 
@@ -1163,8 +1254,10 @@
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecUnary; }
 
@@ -1180,8 +1273,10 @@
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecUnary; }
 
@@ -1196,8 +1291,10 @@
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecUnary; }
 
@@ -1220,9 +1317,10 @@
             m_expectedReturnType = StringType;
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
 
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecUnary; }
 
@@ -1235,7 +1333,7 @@
 
     class LocalVarTypeOfNode : public TypeOfResolveNode {
     public:
-        LocalVarTypeOfNode(size_t i) KJS_FAST_CALL
+        LocalVarTypeOfNode(int i) KJS_FAST_CALL
             : TypeOfResolveNode(PlacementNewAdopt)
         {
             m_expectedReturnType = StringType;
@@ -1243,7 +1341,7 @@
             m_index = i;
         }
 
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
     };
 
     class TypeOfValueNode : public ExpressionNode {
@@ -1254,8 +1352,10 @@
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecUnary; }
 
@@ -1275,35 +1375,36 @@
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
 
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecUnary; }
     };
 
     class PreIncLocalVarNode : public PreIncResolveNode {
     public:
-        PreIncLocalVarNode(size_t i) KJS_FAST_CALL
+        PreIncLocalVarNode(int i) KJS_FAST_CALL
             : PreIncResolveNode(PlacementNewAdopt)
         {
             ASSERT(i != missingSymbolMarker());
             m_index = i;
         }
 
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
     };
 
     class PreIncConstNode : public PreIncResolveNode {
     public:
-        PreIncConstNode(size_t i) KJS_FAST_CALL
+        PreIncConstNode(int i) KJS_FAST_CALL
             : PreIncResolveNode(PlacementNewAdopt)
         {
             ASSERT(i != missingSymbolMarker());
             m_index = i;
         }
 
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
     };
 
     class PreDecResolveNode : public PrePostResolveNode {
@@ -1318,35 +1419,36 @@
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
 
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecUnary; }
     };
 
     class PreDecLocalVarNode : public PreDecResolveNode {
     public:
-        PreDecLocalVarNode(size_t i) KJS_FAST_CALL
+        PreDecLocalVarNode(int i) KJS_FAST_CALL
             : PreDecResolveNode(PlacementNewAdopt)
         {
             ASSERT(i != missingSymbolMarker());
             m_index = i;
         }
 
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
     };
 
     class PreDecConstNode : public PreDecResolveNode {
     public:
-        PreDecConstNode(size_t i) KJS_FAST_CALL
+        PreDecConstNode(int i) KJS_FAST_CALL
             : PreDecResolveNode(PlacementNewAdopt)
         {
             ASSERT(i != missingSymbolMarker());
             m_index = i;
         }
 
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
     };
 
     class PrefixBracketNode : public ExpressionNode {
@@ -1357,7 +1459,7 @@
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecUnary; }
 
     protected:
@@ -1372,7 +1474,9 @@
         {
         }
 
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
     };
 
@@ -1383,7 +1487,9 @@
         {
         }
 
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
     };
 
@@ -1395,7 +1501,7 @@
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecPostfix; }
 
     protected:
@@ -1410,7 +1516,9 @@
         {
         }
 
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
     };
 
@@ -1421,7 +1529,9 @@
         {
         }
 
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
     };
 
@@ -1433,7 +1543,8 @@
         {
         }
 
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecUnary; }
 
@@ -1450,12 +1561,13 @@
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
-        virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL;
-        virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL;
-        virtual int32_t evaluateToInt32(ExecState*) KJS_FAST_CALL;
-        virtual uint32_t evaluateToUInt32(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual bool evaluateToBoolean(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual double evaluateToNumber(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual int32_t evaluateToInt32(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual uint32_t evaluateToUInt32(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecUnary; }
 
@@ -1471,9 +1583,10 @@
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
-        virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual double evaluateToNumber(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecUnary; }
 
@@ -1489,17 +1602,18 @@
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
-        virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL;
-        virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL;
-        virtual int32_t evaluateToInt32(ExecState*) KJS_FAST_CALL;
-        virtual uint32_t evaluateToUInt32(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual double evaluateToNumber(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual bool evaluateToBoolean(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual int32_t evaluateToInt32(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual uint32_t evaluateToUInt32(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecUnary; }
 
     private:
-        ALWAYS_INLINE int32_t inlineEvaluateToInt32(ExecState*);
+        ALWAYS_INLINE int32_t inlineEvaluateToInt32(OldInterpreterExecState*);
 
         RefPtr<ExpressionNode> m_expr;
     };
@@ -1512,9 +1626,10 @@
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
-        virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual bool evaluateToBoolean(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecUnary; }
 
@@ -1531,17 +1646,18 @@
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
-        virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL;
-        virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL;
-        virtual int32_t evaluateToInt32(ExecState*) KJS_FAST_CALL;
-        virtual uint32_t evaluateToUInt32(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual double evaluateToNumber(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual bool evaluateToBoolean(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual int32_t evaluateToInt32(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual uint32_t evaluateToUInt32(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecMultiplicitave; }
 
     private:
-        ALWAYS_INLINE double inlineEvaluateToNumber(ExecState*);
+        ALWAYS_INLINE double inlineEvaluateToNumber(OldInterpreterExecState*);
 
         RefPtr<ExpressionNode> m_term1;
         RefPtr<ExpressionNode> m_term2;
@@ -1556,16 +1672,17 @@
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
-        virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL;
-        virtual int32_t evaluateToInt32(ExecState*) KJS_FAST_CALL;
-        virtual uint32_t evaluateToUInt32(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual double evaluateToNumber(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual int32_t evaluateToInt32(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual uint32_t evaluateToUInt32(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecMultiplicitave; }
 
     private:
-        ALWAYS_INLINE double inlineEvaluateToNumber(ExecState*);
+        ALWAYS_INLINE double inlineEvaluateToNumber(OldInterpreterExecState*);
 
         RefPtr<ExpressionNode> m_term1;
         RefPtr<ExpressionNode> m_term2;
@@ -1580,17 +1697,18 @@
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
-        virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL;
-        virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL;
-        virtual int32_t evaluateToInt32(ExecState*) KJS_FAST_CALL;
-        virtual uint32_t evaluateToUInt32(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual double evaluateToNumber(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual bool evaluateToBoolean(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual int32_t evaluateToInt32(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual uint32_t evaluateToUInt32(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecMultiplicitave; }
 
     private:
-        ALWAYS_INLINE double inlineEvaluateToNumber(ExecState*);
+        ALWAYS_INLINE double inlineEvaluateToNumber(OldInterpreterExecState*);
 
         RefPtr<ExpressionNode> m_term1;
         RefPtr<ExpressionNode> m_term2;
@@ -1604,11 +1722,12 @@
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
-        virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL;
-        virtual int32_t evaluateToInt32(ExecState*) KJS_FAST_CALL;
-        virtual uint32_t evaluateToUInt32(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual double evaluateToNumber(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual int32_t evaluateToInt32(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual uint32_t evaluateToUInt32(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecAdditive; }
 
@@ -1624,7 +1743,7 @@
         RefPtr<ExpressionNode> m_term2;
 
     private:
-        ALWAYS_INLINE double inlineEvaluateToNumber(ExecState*);
+        ALWAYS_INLINE double inlineEvaluateToNumber(OldInterpreterExecState*);
     };
 
     class AddNumbersNode : public AddNode {
@@ -1634,13 +1753,13 @@
         {
         }
 
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
-        virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL;
-        virtual int32_t evaluateToInt32(ExecState*) KJS_FAST_CALL;
-        virtual uint32_t evaluateToUInt32(ExecState*) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual double evaluateToNumber(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual int32_t evaluateToInt32(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual uint32_t evaluateToUInt32(OldInterpreterExecState*) KJS_FAST_CALL;
 
     private:
-        ALWAYS_INLINE double inlineEvaluateToNumber(ExecState*) KJS_FAST_CALL;
+        ALWAYS_INLINE double inlineEvaluateToNumber(OldInterpreterExecState*) KJS_FAST_CALL;
     };
 
     class AddStringLeftNode : public AddNode {
@@ -1650,7 +1769,7 @@
         {
         }
 
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
     };
 
     class AddStringRightNode : public AddNode {
@@ -1660,7 +1779,7 @@
         {
         }
 
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
     };
 
     class AddStringsNode : public AddNode {
@@ -1670,7 +1789,7 @@
         {
         }
 
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
     };
 
     class SubNode : public ExpressionNode {
@@ -1682,16 +1801,17 @@
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
-        virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL;
-        virtual int32_t evaluateToInt32(ExecState*) KJS_FAST_CALL;
-        virtual uint32_t evaluateToUInt32(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual double evaluateToNumber(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual int32_t evaluateToInt32(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual uint32_t evaluateToUInt32(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecAdditive; }
 
     private:
-        ALWAYS_INLINE double inlineEvaluateToNumber(ExecState*);
+        ALWAYS_INLINE double inlineEvaluateToNumber(OldInterpreterExecState*);
 
         RefPtr<ExpressionNode> m_term1;
         RefPtr<ExpressionNode> m_term2;
@@ -1706,16 +1826,17 @@
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
-        virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL;
-        virtual int32_t evaluateToInt32(ExecState*) KJS_FAST_CALL;
-        virtual uint32_t evaluateToUInt32(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual double evaluateToNumber(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual int32_t evaluateToInt32(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual uint32_t evaluateToUInt32(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecShift; }
 
     private:
-        ALWAYS_INLINE int32_t inlineEvaluateToInt32(ExecState*);
+        ALWAYS_INLINE int32_t inlineEvaluateToInt32(OldInterpreterExecState*);
 
         RefPtr<ExpressionNode> m_term1;
         RefPtr<ExpressionNode> m_term2;
@@ -1730,16 +1851,17 @@
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
-        virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL;
-        virtual int32_t evaluateToInt32(ExecState*) KJS_FAST_CALL;
-        virtual uint32_t evaluateToUInt32(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual double evaluateToNumber(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual int32_t evaluateToInt32(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual uint32_t evaluateToUInt32(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecShift; }
 
     private:
-        ALWAYS_INLINE int32_t inlineEvaluateToInt32(ExecState*);
+        ALWAYS_INLINE int32_t inlineEvaluateToInt32(OldInterpreterExecState*);
 
         RefPtr<ExpressionNode> m_term1;
         RefPtr<ExpressionNode> m_term2;
@@ -1754,15 +1876,16 @@
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
-        virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL;
-        virtual int32_t evaluateToInt32(ExecState*) KJS_FAST_CALL;
-        virtual uint32_t evaluateToUInt32(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual double evaluateToNumber(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual int32_t evaluateToInt32(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual uint32_t evaluateToUInt32(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecShift; }
     private:
-        ALWAYS_INLINE uint32_t inlineEvaluateToUInt32(ExecState*);
+        ALWAYS_INLINE uint32_t inlineEvaluateToUInt32(OldInterpreterExecState*);
 
         RefPtr<ExpressionNode> m_term1;
         RefPtr<ExpressionNode> m_term2;
@@ -1777,14 +1900,15 @@
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
-        virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual bool evaluateToBoolean(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecRelational; }
 
     private:
-        ALWAYS_INLINE bool inlineEvaluateToBoolean(ExecState*);
+        ALWAYS_INLINE bool inlineEvaluateToBoolean(OldInterpreterExecState*);
 
     protected:
         RefPtr<ExpressionNode> m_expr1;
@@ -1798,11 +1922,11 @@
         {
         }
 
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
-        virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual bool evaluateToBoolean(OldInterpreterExecState*) KJS_FAST_CALL;
 
     private:
-        ALWAYS_INLINE bool inlineEvaluateToBoolean(ExecState*);
+        ALWAYS_INLINE bool inlineEvaluateToBoolean(OldInterpreterExecState*);
     };
 
     class LessStringsNode : public LessNode {
@@ -1812,11 +1936,11 @@
         {
         }
 
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
-        virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual bool evaluateToBoolean(OldInterpreterExecState*) KJS_FAST_CALL;
 
     private:
-        ALWAYS_INLINE bool inlineEvaluateToBoolean(ExecState*);
+        ALWAYS_INLINE bool inlineEvaluateToBoolean(OldInterpreterExecState*);
     };
 
     class GreaterNode : public ExpressionNode {
@@ -1827,14 +1951,15 @@
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
-        virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual bool evaluateToBoolean(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecRelational; }
 
     private:
-        ALWAYS_INLINE bool inlineEvaluateToBoolean(ExecState*);
+        ALWAYS_INLINE bool inlineEvaluateToBoolean(OldInterpreterExecState*);
 
         RefPtr<ExpressionNode> m_expr1;
         RefPtr<ExpressionNode> m_expr2;
@@ -1848,14 +1973,15 @@
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
-        virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual bool evaluateToBoolean(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecRelational; }
 
     private:
-        ALWAYS_INLINE bool inlineEvaluateToBoolean(ExecState*);
+        ALWAYS_INLINE bool inlineEvaluateToBoolean(OldInterpreterExecState*);
 
         RefPtr<ExpressionNode> m_expr1;
         RefPtr<ExpressionNode> m_expr2;
@@ -1869,14 +1995,15 @@
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
-        virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual bool evaluateToBoolean(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecRelational; }
 
     private:
-        ALWAYS_INLINE bool inlineEvaluateToBoolean(ExecState*);
+        ALWAYS_INLINE bool inlineEvaluateToBoolean(OldInterpreterExecState*);
 
         RefPtr<ExpressionNode> m_expr1;
         RefPtr<ExpressionNode> m_expr2;
@@ -1891,9 +2018,10 @@
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
-        virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual bool evaluateToBoolean(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecRelational; }
 
@@ -1910,9 +2038,11 @@
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
-        virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual bool evaluateToBoolean(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecRelational; }
 
@@ -1930,14 +2060,15 @@
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
-        virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual bool evaluateToBoolean(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecEquality; }
 
     private:
-        ALWAYS_INLINE bool inlineEvaluateToBoolean(ExecState*);
+        ALWAYS_INLINE bool inlineEvaluateToBoolean(OldInterpreterExecState*);
 
         RefPtr<ExpressionNode> m_expr1;
         RefPtr<ExpressionNode> m_expr2;
@@ -1952,14 +2083,15 @@
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
-        virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual bool evaluateToBoolean(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecEquality; }
 
     private:
-        ALWAYS_INLINE bool inlineEvaluateToBoolean(ExecState*);
+        ALWAYS_INLINE bool inlineEvaluateToBoolean(OldInterpreterExecState*);
 
         RefPtr<ExpressionNode> m_expr1;
         RefPtr<ExpressionNode> m_expr2;
@@ -1974,14 +2106,15 @@
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
-        virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual bool evaluateToBoolean(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecEquality; }
 
     private:
-        ALWAYS_INLINE bool inlineEvaluateToBoolean(ExecState*);
+        ALWAYS_INLINE bool inlineEvaluateToBoolean(OldInterpreterExecState*);
 
         RefPtr<ExpressionNode> m_expr1;
         RefPtr<ExpressionNode> m_expr2;
@@ -1996,14 +2129,15 @@
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
-        virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual bool evaluateToBoolean(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecEquality; }
 
     private:
-        ALWAYS_INLINE bool inlineEvaluateToBoolean(ExecState*);
+        ALWAYS_INLINE bool inlineEvaluateToBoolean(OldInterpreterExecState*);
 
         RefPtr<ExpressionNode> m_expr1;
         RefPtr<ExpressionNode> m_expr2;
@@ -2018,17 +2152,18 @@
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
-        virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL;
-        virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL;
-        virtual int32_t evaluateToInt32(ExecState*) KJS_FAST_CALL;
-        virtual uint32_t evaluateToUInt32(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual double evaluateToNumber(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual bool evaluateToBoolean(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual int32_t evaluateToInt32(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual uint32_t evaluateToUInt32(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecBitwiseAnd; }
 
     private:
-        ALWAYS_INLINE int32_t inlineEvaluateToInt32(ExecState*);
+        ALWAYS_INLINE int32_t inlineEvaluateToInt32(OldInterpreterExecState*);
 
         RefPtr<ExpressionNode> m_expr1;
         RefPtr<ExpressionNode> m_expr2;
@@ -2043,17 +2178,18 @@
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
-        virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL;
-        virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL;
-        virtual int32_t evaluateToInt32(ExecState*) KJS_FAST_CALL;
-        virtual uint32_t evaluateToUInt32(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual double evaluateToNumber(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual bool evaluateToBoolean(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual int32_t evaluateToInt32(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual uint32_t evaluateToUInt32(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecBitwiseOr; }
 
     private:
-        ALWAYS_INLINE int32_t inlineEvaluateToInt32(ExecState*);
+        ALWAYS_INLINE int32_t inlineEvaluateToInt32(OldInterpreterExecState*);
 
         RefPtr<ExpressionNode> m_expr1;
         RefPtr<ExpressionNode> m_expr2;
@@ -2068,17 +2204,18 @@
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
-        virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL;
-        virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL;
-        virtual int32_t evaluateToInt32(ExecState*) KJS_FAST_CALL;
-        virtual uint32_t evaluateToUInt32(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual double evaluateToNumber(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual bool evaluateToBoolean(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual int32_t evaluateToInt32(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual uint32_t evaluateToUInt32(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecBitwiseXor; }
 
     private:
-        ALWAYS_INLINE int32_t inlineEvaluateToInt32(ExecState*);
+        ALWAYS_INLINE int32_t inlineEvaluateToInt32(OldInterpreterExecState*);
 
         RefPtr<ExpressionNode> m_expr1;
         RefPtr<ExpressionNode> m_expr2;
@@ -2096,14 +2233,15 @@
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
-        virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual bool evaluateToBoolean(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecLogicalAnd; }
 
     private:
-        ALWAYS_INLINE bool inlineEvaluateToBoolean(ExecState*);
+        ALWAYS_INLINE bool inlineEvaluateToBoolean(OldInterpreterExecState*);
 
         RefPtr<ExpressionNode> m_expr1;
         RefPtr<ExpressionNode> m_expr2;
@@ -2118,14 +2256,15 @@
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
-        virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual bool evaluateToBoolean(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecLogicalOr; }
 
     private:
-        ALWAYS_INLINE bool inlineEvaluateToBoolean(ExecState*);
+        ALWAYS_INLINE bool inlineEvaluateToBoolean(OldInterpreterExecState*);
 
         RefPtr<ExpressionNode> m_expr1;
         RefPtr<ExpressionNode> m_expr2;
@@ -2143,12 +2282,13 @@
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
-        virtual bool evaluateToBoolean(ExecState*) KJS_FAST_CALL;
-        virtual double evaluateToNumber(ExecState*) KJS_FAST_CALL;
-        virtual int32_t evaluateToInt32(ExecState*) KJS_FAST_CALL;
-        virtual uint32_t evaluateToUInt32(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual bool evaluateToBoolean(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual double evaluateToNumber(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual int32_t evaluateToInt32(OldInterpreterExecState*) KJS_FAST_CALL;
+        virtual uint32_t evaluateToUInt32(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecConditional; }
 
@@ -2160,10 +2300,11 @@
 
     class ReadModifyResolveNode : public ExpressionNode {
     public:
-        ReadModifyResolveNode(const Identifier& ident, Operator oper, ExpressionNode*  right) KJS_FAST_CALL
+        ReadModifyResolveNode(const Identifier& ident, Operator oper, ExpressionNode*  right, bool rightHasAssignments) KJS_FAST_CALL
             : m_ident(ident)
-            , m_operator(oper)
             , m_right(right)
+            , m_operator(oper)
+            , m_rightHasAssignments(rightHasAssignments)
         {
         }
 
@@ -2171,50 +2312,55 @@
             : ExpressionNode(PlacementNewAdopt)
             , m_ident(PlacementNewAdopt)
             , m_right(PlacementNewAdopt)
+            , m_rightHasAssignments(true)
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecAssignment; }
 
     protected:
         Identifier m_ident;
-        Operator m_operator;
         RefPtr<ExpressionNode> m_right;
         size_t m_index; // Used by ReadModifyLocalVarNode.
+        Operator m_operator : 31;
+        bool m_rightHasAssignments : 1;
     };
 
     class ReadModifyLocalVarNode : public ReadModifyResolveNode {
     public:
-        ReadModifyLocalVarNode(size_t i) KJS_FAST_CALL
+        ReadModifyLocalVarNode(int i) KJS_FAST_CALL
             : ReadModifyResolveNode(PlacementNewAdopt)
         {
             ASSERT(i != missingSymbolMarker());
             m_index = i;
         }
 
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
     };
 
     class ReadModifyConstNode : public ReadModifyResolveNode {
     public:
-        ReadModifyConstNode(size_t i) KJS_FAST_CALL
+        ReadModifyConstNode(int i) KJS_FAST_CALL
             : ReadModifyResolveNode(PlacementNewAdopt)
         {
             ASSERT(i != missingSymbolMarker());
             m_index = i;
         }
 
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
     };
 
     class AssignResolveNode : public ExpressionNode {
     public:
-        AssignResolveNode(const Identifier& ident, ExpressionNode* right) KJS_FAST_CALL
+        AssignResolveNode(const Identifier& ident, ExpressionNode* right, bool rightHasAssignments) KJS_FAST_CALL
             : m_ident(ident)
             , m_right(right)
+            , m_rightHasAssignments(rightHasAssignments)
         {
         }
 
@@ -2224,9 +2370,11 @@
             , m_right(PlacementNewAdopt)
         {
         }
+        
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecAssignment; }
 
@@ -2234,18 +2382,19 @@
         Identifier m_ident;
         RefPtr<ExpressionNode> m_right;
         size_t m_index; // Used by ReadModifyLocalVarNode.
+        bool m_rightHasAssignments;
     };
 
     class AssignLocalVarNode : public AssignResolveNode {
     public:
-        AssignLocalVarNode(size_t i) KJS_FAST_CALL
+        AssignLocalVarNode(int i) KJS_FAST_CALL
             : AssignResolveNode(PlacementNewAdopt)
         {
             ASSERT(i != missingSymbolMarker());
             m_index = i;
         }
 
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
     };
 
     class AssignConstNode : public AssignResolveNode {
@@ -2255,42 +2404,52 @@
         {
         }
 
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
     };
 
     class ReadModifyBracketNode : public ExpressionNode {
     public:
-        ReadModifyBracketNode(ExpressionNode* base, ExpressionNode* subscript, Operator oper, ExpressionNode* right) KJS_FAST_CALL
+        ReadModifyBracketNode(ExpressionNode* base, ExpressionNode* subscript, Operator oper, ExpressionNode* right, bool subscriptHasAssignments, bool rightHasAssignments) KJS_FAST_CALL
             : m_base(base)
             , m_subscript(subscript)
-            , m_operator(oper)
             , m_right(right)
+            , m_operator(oper)
+            , m_subscriptHasAssignments(subscriptHasAssignments)
+            , m_rightHasAssignments(rightHasAssignments)
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecAssignment; }
 
     protected:
         RefPtr<ExpressionNode> m_base;
         RefPtr<ExpressionNode> m_subscript;
-        Operator m_operator;
         RefPtr<ExpressionNode> m_right;
+        Operator m_operator : 30;
+        bool m_subscriptHasAssignments : 1;
+        bool m_rightHasAssignments : 1;
     };
 
     class AssignBracketNode : public ExpressionNode {
     public:
-        AssignBracketNode(ExpressionNode* base, ExpressionNode* subscript, ExpressionNode* right) KJS_FAST_CALL
+        AssignBracketNode(ExpressionNode* base, ExpressionNode* subscript, ExpressionNode* right, bool subscriptHasAssignments, bool rightHasAssignments) KJS_FAST_CALL
             : m_base(base)
             , m_subscript(subscript)
             , m_right(right)
+            , m_subscriptHasAssignments(subscriptHasAssignments)
+            , m_rightHasAssignments(rightHasAssignments)
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecAssignment; }
 
@@ -2298,19 +2457,23 @@
         RefPtr<ExpressionNode> m_base;
         RefPtr<ExpressionNode> m_subscript;
         RefPtr<ExpressionNode> m_right;
+        bool m_subscriptHasAssignments : 1;
+        bool m_rightHasAssignments : 1;
     };
 
     class AssignDotNode : public ExpressionNode {
     public:
-        AssignDotNode(ExpressionNode* base, const Identifier& ident, ExpressionNode* right) KJS_FAST_CALL
+        AssignDotNode(ExpressionNode* base, const Identifier& ident, ExpressionNode* right, bool rightHasAssignments) KJS_FAST_CALL
             : m_base(base)
             , m_ident(ident)
             , m_right(right)
+            , m_rightHasAssignments(rightHasAssignments)
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecAssignment; }
 
@@ -2318,28 +2481,33 @@
         RefPtr<ExpressionNode> m_base;
         Identifier m_ident;
         RefPtr<ExpressionNode> m_right;
+        bool m_rightHasAssignments;
     };
 
     class ReadModifyDotNode : public ExpressionNode {
     public:
-        ReadModifyDotNode(ExpressionNode* base, const Identifier& ident, Operator oper, ExpressionNode* right) KJS_FAST_CALL
+        ReadModifyDotNode(ExpressionNode* base, const Identifier& ident, Operator oper, ExpressionNode* right, bool rightHasAssignments) KJS_FAST_CALL
             : m_base(base)
             , m_ident(ident)
-            , m_operator(oper)
             , m_right(right)
+            , m_operator(oper)
+            , m_rightHasAssignments(rightHasAssignments)
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecAssignment; }
 
     protected:
         RefPtr<ExpressionNode> m_base;
         Identifier m_ident;
-        Operator m_operator;
         RefPtr<ExpressionNode> m_right;
+        Operator m_operator : 31;
+        bool m_rightHasAssignments : 1;
     };
 
     class AssignErrorNode : public ExpressionNode {
@@ -2351,7 +2519,8 @@
         {
         }
 
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecAssignment; }
 
@@ -2370,8 +2539,9 @@
             m_expr1->optimizeForUnnecessaryResult();
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecExpression; }
 
@@ -2393,9 +2563,9 @@
     public:
         ConstDeclNode(const Identifier& ident, ExpressionNode* in) KJS_FAST_CALL;
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        virtual KJS::JSValue* evaluate(ExecState*) KJS_FAST_CALL;
-        void evaluateSingle(ExecState*) KJS_FAST_CALL;
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual KJS::JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
+        void evaluateSingle(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; }
         PassRefPtr<ConstDeclNode> releaseNext() KJS_FAST_CALL { return m_next.release(); }
@@ -2403,9 +2573,11 @@
         Identifier m_ident;
         ListRefPtr<ConstDeclNode> m_next;
         RefPtr<ExpressionNode> m_init;
-
+        
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+        virtual RegisterID* emitCodeSingle(CodeGenerator&) KJS_FAST_CALL;
     private:
-        void handleSlowCase(ExecState*, const ScopeChain&, JSValue*) KJS_FAST_CALL NEVER_INLINE;
+        void handleSlowCase(OldInterpreterExecState*, const ScopeChain&, JSValue*) KJS_FAST_CALL NEVER_INLINE;
     };
 
     class ConstStatementNode : public StatementNode {
@@ -2415,10 +2587,11 @@
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        virtual JSValue* execute(ExecState*) KJS_FAST_CALL;
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* execute(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
-
+        
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
     private:
         RefPtr<ConstDeclNode> m_next;
     };
@@ -2442,8 +2615,9 @@
     public:
         BlockNode(SourceElements* children) KJS_FAST_CALL;
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        virtual JSValue* execute(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* execute(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
 
     protected:
@@ -2456,7 +2630,9 @@
         {
         }
 
-        virtual JSValue* execute(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+
+        virtual JSValue* execute(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual bool isEmptyStatement() const KJS_FAST_CALL { return true; }
     };
@@ -2468,8 +2644,9 @@
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        virtual JSValue* execute(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* execute(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
 
     private:
@@ -2482,9 +2659,11 @@
             : m_expr(expr)
         {
         }
+        
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        virtual JSValue* execute(ExecState*) KJS_FAST_CALL;
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* execute(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
 
     private:
@@ -2499,8 +2678,9 @@
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        virtual JSValue* execute(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* execute(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
 
     protected:
@@ -2516,8 +2696,9 @@
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        virtual JSValue* execute(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* execute(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
 
     private:
@@ -2532,8 +2713,9 @@
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        virtual JSValue* execute(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* execute(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
 
     private:
@@ -2549,8 +2731,9 @@
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        virtual JSValue* execute(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* execute(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
 
     private:
@@ -2576,8 +2759,9 @@
             m_expr3->optimizeForUnnecessaryResult();
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        virtual JSValue* execute(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* execute(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
 
     private:
@@ -2592,9 +2776,10 @@
     public:
         ForInNode(ExpressionNode*, ExpressionNode*, StatementNode*) KJS_FAST_CALL;
         ForInNode(const Identifier&, ExpressionNode*, ExpressionNode*, StatementNode*) KJS_FAST_CALL;
-
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        virtual JSValue* execute(ExecState*) KJS_FAST_CALL;
+        
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* execute(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
 
     private:
@@ -2616,8 +2801,9 @@
             : m_ident(ident)
         {
         }
-
-        virtual JSValue* execute(ExecState*) KJS_FAST_CALL;
+        
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+        virtual JSValue* execute(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
 
     private:
@@ -2634,8 +2820,9 @@
             : m_ident(ident)
         {
         }
-
-        virtual JSValue* execute(ExecState*) KJS_FAST_CALL;
+        
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+        virtual JSValue* execute(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
 
     private:
@@ -2649,9 +2836,11 @@
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        virtual JSValue* execute(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* execute(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
+        virtual bool isReturnNode() const KJS_FAST_CALL { return true; }
 
     private:
         RefPtr<ExpressionNode> m_value;
@@ -2665,8 +2854,9 @@
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        virtual JSValue* execute(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* execute(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
 
     private:
@@ -2682,8 +2872,9 @@
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        virtual JSValue* execute(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* execute(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual void pushLabel(const Identifier& ident) KJS_FAST_CALL { m_statement->pushLabel(ident); }
 
@@ -2699,8 +2890,9 @@
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        virtual JSValue* execute(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* execute(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
 
     private:
@@ -2717,10 +2909,12 @@
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        virtual JSValue* execute(ExecState*) KJS_FAST_CALL;
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* execute(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
 
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* dst = 0) KJS_FAST_CALL;
+
     private:
         RefPtr<StatementNode> m_tryBlock;
         Identifier m_exceptionIdent;
@@ -2764,12 +2958,13 @@
         
         bool usesEval() const { return m_usesEval; }
         bool needsClosure() const { return m_needsClosure; }
-        
+
     protected:
-        void optimizeVariableAccess(ExecState*) KJS_FAST_CALL;
+        void optimizeVariableAccess(OldInterpreterExecState*) KJS_FAST_CALL;
 
         VarStack m_varStack;
         FunctionStack m_functionStack;
+
     private:
         UString m_sourceURL;
         int m_sourceId;
@@ -2780,69 +2975,119 @@
     class ProgramNode : public ScopeNode {
     public:
         static ProgramNode* create(SourceElements*, VarStack*, FunctionStack*, bool usesEval, bool needsClosure) KJS_FAST_CALL;
+        virtual ~ProgramNode();
+        
+        virtual JSValue* execute(OldInterpreterExecState*) KJS_FAST_CALL;
 
-        virtual JSValue* execute(ExecState*) KJS_FAST_CALL;
+        ProgramCodeBlock& code(ScopeChainNode* scopeChain, bool canCreateGlobals) KJS_FAST_CALL
+        {
+            if (!m_code)
+                generateCode(scopeChain, canCreateGlobals);
+            return *m_code;
+        }
 
     private:
         ProgramNode(SourceElements*, VarStack*, FunctionStack*, bool usesEval, bool needsClosure) KJS_FAST_CALL;
 
-        void initializeSymbolTable(ExecState*) KJS_FAST_CALL;
-        ALWAYS_INLINE void processDeclarations(ExecState*) KJS_FAST_CALL;
+        void generateCode(ScopeChainNode*, bool) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+
+        void initializeSymbolTable(OldInterpreterExecState*) KJS_FAST_CALL;
+        ALWAYS_INLINE void processDeclarations(OldInterpreterExecState*) KJS_FAST_CALL;
 
         Vector<size_t> m_varIndexes; // Storage indexes belonging to the nodes in m_varStack. (Recorded to avoid double lookup.)
         Vector<size_t> m_functionIndexes; // Storage indexes belonging to the nodes in m_functionStack. (Recorded to avoid double lookup.)
+
+        OwnPtr<ProgramCodeBlock> m_code;
     };
 
     class EvalNode : public ScopeNode {
     public:
         static EvalNode* create(SourceElements*, VarStack*, FunctionStack*, bool usesEval, bool needsClosure) KJS_FAST_CALL;
+        virtual ~EvalNode();
+        
+        virtual JSValue* execute(OldInterpreterExecState*) KJS_FAST_CALL;
 
-        virtual JSValue* execute(ExecState*) KJS_FAST_CALL;
+        EvalCodeBlock& code(ScopeChainNode* scopeChain) KJS_FAST_CALL
+        {
+            if (!m_code)
+                generateCode(scopeChain);
+            return *m_code;
+        }
 
     private:
         EvalNode(SourceElements*, VarStack*, FunctionStack*, bool usesEval, bool needsClosure) KJS_FAST_CALL;
 
-        ALWAYS_INLINE void processDeclarations(ExecState*) KJS_FAST_CALL;
+        ALWAYS_INLINE void processDeclarations(OldInterpreterExecState*) KJS_FAST_CALL;
+        void generateCode(ScopeChainNode*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+
+        OwnPtr<EvalCodeBlock> m_code;
     };
 
     class FunctionBodyNode : public ScopeNode {
     public:
         static FunctionBodyNode* create(SourceElements*, VarStack*, FunctionStack*, bool usesEval, bool needsClosure) KJS_FAST_CALL;
-
-        virtual JSValue* execute(ExecState*) KJS_FAST_CALL;
-
-        SymbolTable& symbolTable() KJS_FAST_CALL { return m_symbolTable; }
-
+        virtual ~FunctionBodyNode();
+        
         Vector<Identifier>& parameters() KJS_FAST_CALL { return m_parameters; }
         UString paramString() const KJS_FAST_CALL;
 
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+        
+        SymbolTable& symbolTable() { return m_symbolTable; } // FIXME: Remove this
+        
+        CodeBlock& code(ScopeChainNode* scopeChain) KJS_FAST_CALL
+        {
+            ASSERT(scopeChain);
+            if (!m_code)
+                generateCode(scopeChain);
+            return *m_code;
+        }
+
+        CodeBlock& generatedCode() KJS_FAST_CALL
+        {
+            ASSERT(m_code);
+            return *m_code;
+        }
+
+        void mark();
+
+        void setSource(const SourceRange& source) { m_source = source; } 
+        UString toSourceString() const KJS_FAST_CALL { return UString("{") + m_source.toString() + UString("}"); }
+
     protected:
         FunctionBodyNode(SourceElements*, VarStack*, FunctionStack*, bool usesEval, bool needsClosure) KJS_FAST_CALL;
 
     private:
-        void initializeSymbolTable(ExecState*) KJS_FAST_CALL;
-        ALWAYS_INLINE void processDeclarations(ExecState*) KJS_FAST_CALL;
-
-        bool m_initialized;
+        void generateCode(ScopeChainNode*) KJS_FAST_CALL;
+        
         Vector<Identifier> m_parameters;
         SymbolTable m_symbolTable;
+        OwnPtr<CodeBlock> m_code;
+        SourceRange m_source;
     };
 
     class FuncExprNode : public ExpressionNode {
     public:
-        FuncExprNode(const Identifier& ident, FunctionBodyNode* body, ParameterNode* parameter = 0) KJS_FAST_CALL
+        FuncExprNode(const Identifier& ident, FunctionBodyNode* body, const SourceRange& source, ParameterNode* parameter = 0) KJS_FAST_CALL
             : m_ident(ident)
             , m_parameter(parameter)
             , m_body(body)
         {
             addParams();
+            m_body->setSource(source);
         }
 
-        virtual JSValue* evaluate(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+        FunctionImp* makeFunction(ExecState*, ScopeChainNode*) KJS_FAST_CALL;
+        virtual JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { return PrecMember; }
         virtual bool needsParensIfLeftmost() const { return true; }
 
+        FunctionBodyNode* body() { return m_body.get(); }
+
     private:
         void addParams() KJS_FAST_CALL;
 
@@ -2855,27 +3100,25 @@
 
     class FuncDeclNode : public StatementNode {
     public:
-        FuncDeclNode(const Identifier& ident, FunctionBodyNode* body) KJS_FAST_CALL
-            : m_ident(ident)
-            , m_body(body)
-        {
-            addParams();
-        }
-
-        FuncDeclNode(const Identifier& ident, ParameterNode* parameter, FunctionBodyNode* body) KJS_FAST_CALL
+        FuncDeclNode(const Identifier& ident, FunctionBodyNode* body, const SourceRange& source, ParameterNode* parameter = 0) KJS_FAST_CALL
             : m_ident(ident)
             , m_parameter(parameter)
             , m_body(body)
         {
             addParams();
+            m_body->setSource(source);
         }
 
-        virtual JSValue* execute(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+
+        virtual JSValue* execute(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
-        ALWAYS_INLINE FunctionImp* makeFunction(ExecState*) KJS_FAST_CALL;
+        FunctionImp* makeFunction(ExecState*, ScopeChainNode*) KJS_FAST_CALL;
 
         Identifier m_ident;
 
+        FunctionBodyNode* body() { return m_body.get(); }
+
     private:
         void addParams() KJS_FAST_CALL;
 
@@ -2897,12 +3140,15 @@
                 children->releaseContentsIntoVector(m_children);
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; }
 
-        JSValue* evaluate(ExecState*) KJS_FAST_CALL;
-        JSValue* executeStatements(ExecState*) KJS_FAST_CALL;
+        JSValue* evaluate(OldInterpreterExecState*) KJS_FAST_CALL;
+        JSValue* executeStatements(OldInterpreterExecState*) KJS_FAST_CALL;
+
+        ExpressionNode* expr() const { return m_expr.get(); }
+        StatementVector& children() { return m_children; }
 
     private:
         RefPtr<ExpressionNode> m_expr;
@@ -2922,7 +3168,7 @@
             clauseList->m_next = this;
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
         CaseClauseNode* getClause() const KJS_FAST_CALL { return m_clause.get(); }
         ClauseListNode* getNext() const KJS_FAST_CALL { return m_next.get(); }
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
@@ -2937,10 +3183,17 @@
 
     class CaseBlockNode : public Node {
     public:
-        CaseBlockNode(ClauseListNode* list1, CaseClauseNode* defaultClause, ClauseListNode* list2) KJS_FAST_CALL;
+        CaseBlockNode(ClauseListNode* list1, CaseClauseNode* defaultClause, ClauseListNode* list2) KJS_FAST_CALL
+            : m_list1(list1)
+            , m_defaultClause(defaultClause)
+            , m_list2(list2)
+        {
+        }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        JSValue* executeBlock(ExecState*, JSValue *input) KJS_FAST_CALL;
+        RegisterID* emitCodeForBlock(CodeGenerator&, RegisterID* input, RegisterID* dst = 0) KJS_FAST_CALL;
+
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        JSValue* executeBlock(OldInterpreterExecState*, JSValue *input) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
         virtual Precedence precedence() const { ASSERT_NOT_REACHED(); return PrecExpression; }
 
@@ -2958,8 +3211,10 @@
         {
         }
 
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
-        virtual JSValue* execute(ExecState*) KJS_FAST_CALL;
+        virtual RegisterID* emitCode(CodeGenerator&, RegisterID* = 0) KJS_FAST_CALL;
+
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual JSValue* execute(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
 
     private:
@@ -2971,9 +3226,9 @@
     public:
         BreakpointCheckStatement(PassRefPtr<StatementNode>) KJS_FAST_CALL;
 
-        virtual JSValue* execute(ExecState*) KJS_FAST_CALL;
+        virtual JSValue* execute(OldInterpreterExecState*) KJS_FAST_CALL;
         virtual void streamTo(SourceStream&) const KJS_FAST_CALL;
-        virtual void optimizeVariableAccess(ExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
+        virtual void optimizeVariableAccess(OldInterpreterExecState*, const SymbolTable&, const LocalStorage&, NodeStack&) KJS_FAST_CALL;
 
     private:
         RefPtr<StatementNode> m_statement;