Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(108)

Unified Diff: src/codegen-ia32.h

Issue 7076: Add a VirtualFrame class to the IA32 code generator. All frame... (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: Created 12 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | src/codegen-ia32.cc » ('j') | src/codegen-ia32.cc » ('J')
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/codegen-ia32.h
===================================================================
--- src/codegen-ia32.h (revision 483)
+++ src/codegen-ia32.h (working copy)
@@ -38,8 +38,65 @@
// Mode to overwrite BinaryExpression values.
enum OverwriteMode { NO_OVERWRITE, OVERWRITE_LEFT, OVERWRITE_RIGHT };
+enum InitState { CONST_INIT, NOT_CONST_INIT };
+enum TypeofState { INSIDE_TYPEOF, NOT_INSIDE_TYPEOF };
-// -----------------------------------------------------------------------------
+
+// -------------------------------------------------------------------------
+// Virtual frame
+
+class VirtualFrame BASE_EMBEDDED {
+ public:
+ explicit VirtualFrame(CodeGenerator* cgen);
+
+ void Enter();
+ void Exit();
+
+ void AllocateLocals();
+
+ Operand Top() const { return Operand(esp, 0); }
+
+ Operand Element(int index) const {
+ return Operand(esp, index * kPointerSize);
+ }
+
+ Operand Local(int index) const {
+ ASSERT(0 <= index && index < frame_local_count_);
+ return Operand(ebp, kLocal0Offset - index * kPointerSize);
+ }
+
+ Operand Function() const { return Operand(ebp, kFunctionOffset); }
+
+ Operand Context() const { return Operand(ebp, kContextOffset); }
+
+ Operand Parameter(int index) const {
+ ASSERT(-1 <= index && index < parameter_count_);
+ return Operand(ebp, (1 + parameter_count_ - index) * kPointerSize);
+ }
+
+ Operand Receiver() const { return Parameter(-1); }
+
+ inline void Drop(int count);
+
+ inline void Pop(Register reg);
+ inline void Pop(Operand operand);
+
+ inline void Push(Register reg);
+ inline void Push(Operand operand);
+ inline void Push(Immediate immediate);
+
+ private:
+ static const int kLocal0Offset = JavaScriptFrameConstants::kLocal0Offset;
+ static const int kFunctionOffset = JavaScriptFrameConstants::kFunctionOffset;
+ static const int kContextOffset = StandardFrameConstants::kContextOffset;
+
+ MacroAssembler* masm_;
+ int frame_local_count_;
+ int parameter_count_;
+};
+
+
+// -------------------------------------------------------------------------
// Reference support
// A reference is a C++ stack-allocated object that keeps an ECMA
@@ -49,9 +106,6 @@
// For properties, we keep either one (named) or two (indexed) values
// on the execution stack to represent the reference.
-enum InitState { CONST_INIT, NOT_CONST_INIT };
-enum TypeofState { INSIDE_TYPEOF, NOT_INSIDE_TYPEOF };
-
class Reference BASE_EMBEDDED {
public:
// The values of the types is important, see size().
@@ -135,10 +189,9 @@
-// -----------------------------------------------------------------------------
+// -------------------------------------------------------------------------
// CodeGenerator
-//
class CodeGenerator: public Visitor {
public:
// Takes a function literal, generates code for it. This function should only
@@ -159,6 +212,8 @@
// Accessors
MacroAssembler* masm() { return masm_; }
+ VirtualFrame* frame() const { return frame_; }
+
CodeGenState* state() { return state_; }
void set_state(CodeGenState* state) { state_ = state; }
@@ -196,19 +251,6 @@
void LoadReference(Reference* ref);
void UnloadReference(Reference* ref);
- // Support functions for accessing parameters and other operands.
- Operand ParameterOperand(int index) const {
- int num_parameters = scope()->num_parameters();
- ASSERT(-2 <= index && index < num_parameters);
- return Operand(ebp, (1 + num_parameters - index) * kPointerSize);
- }
-
- Operand ReceiverOperand() const { return ParameterOperand(-1); }
-
- Operand FunctionOperand() const {
- return Operand(ebp, JavaScriptFrameConstants::kFunctionOffset);
- }
-
Operand ContextOperand(Register context, int index) const {
return Operand(context, Context::SlotOffset(index));
}
@@ -349,11 +391,6 @@
// should be generated or not.
void RecordStatementPosition(Node* node);
- // Activation frames.
- void EnterJSFrame();
- void ExitJSFrame();
-
-
bool is_eval_; // Tells whether code is generated for eval.
Handle<Script> script_;
List<DeferredCode*> deferred_;
@@ -363,6 +400,7 @@
// Code generation state
Scope* scope_;
+ VirtualFrame* frame_;
Condition cc_reg_;
CodeGenState* state_;
bool is_inside_try_;
@@ -371,10 +409,8 @@
// Labels
Label function_return_;
+ friend class VirtualFrame;
friend class Reference;
- friend class Property;
- friend class VariableProxy;
- friend class Slot;
DISALLOW_COPY_AND_ASSIGN(CodeGenerator);
};
« no previous file with comments | « no previous file | src/codegen-ia32.cc » ('j') | src/codegen-ia32.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698