Initial port of VirtualFrame to the ARM architecture. To reduce the

size of the change, the initial implementation provides read access to
the frame (eg, locals, parameters, and expression stack elements) but
no mutation.
Review URL: http://codereview.chromium.org/7302

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@694 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 31520bc3
This diff is collapsed.
......@@ -38,8 +38,50 @@ class DeferredCode;
// 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);
MemOperand Top() const { return MemOperand(sp, 0); }
MemOperand Element(int index) const {
return MemOperand(sp, index * kPointerSize);
}
MemOperand Local(int index) const {
ASSERT(0 <= index && index < frame_local_count_);
return MemOperand(fp, kLocal0Offset - index * kPointerSize);
}
MemOperand Function() const { return MemOperand(fp, kFunctionOffset); }
MemOperand Context() const { return MemOperand(fp, kContextOffset); }
MemOperand Parameter(int index) const {
// Index -1 corresponds to the receiver.
ASSERT(-1 <= index && index <= parameter_count_);
return MemOperand(fp, (1 + parameter_count_ - index) * kPointerSize);
}
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 +91,6 @@ enum OverwriteMode { NO_OVERWRITE, OVERWRITE_LEFT, OVERWRITE_RIGHT };
// 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().
......@@ -133,7 +172,7 @@ class CodeGenState BASE_EMBEDDED {
};
// -----------------------------------------------------------------------------
// -------------------------------------------------------------------------
// CodeGenerator
class CodeGenerator: public Visitor {
......@@ -193,20 +232,6 @@ class CodeGenerator: public Visitor {
void LoadReference(Reference* ref);
void UnloadReference(Reference* ref);
// Support functions for accessing parameters and other operands.
MemOperand ParameterOperand(int index) const {
int num_parameters = scope()->num_parameters();
// index -2 corresponds to the activated closure, -1 corresponds
// to the receiver
ASSERT(-2 <= index && index < num_parameters);
int offset = (1 + num_parameters - index) * kPointerSize;
return MemOperand(fp, offset);
}
MemOperand FunctionOperand() const {
return MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset);
}
MemOperand ContextOperand(Register context, int index) const {
return MemOperand(context, Context::SlotOffset(index));
}
......@@ -355,6 +380,7 @@ class CodeGenerator: public Visitor {
// Code generation state
Scope* scope_;
VirtualFrame* frame_;
Condition cc_reg_;
CodeGenState* state_;
bool is_inside_try_;
......@@ -363,10 +389,8 @@ class CodeGenerator: public Visitor {
// Labels
Label function_return_;
friend class VirtualFrame;
friend class Reference;
friend class Property;
friend class VariableProxy;
friend class Slot;
DISALLOW_COPY_AND_ASSIGN(CodeGenerator);
};
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment