| Index: src/arm/fast-codegen-arm.cc
|
| ===================================================================
|
| --- src/arm/fast-codegen-arm.cc (revision 3659)
|
| +++ src/arm/fast-codegen-arm.cc (working copy)
|
| @@ -52,7 +52,7 @@
|
| //
|
| // The function builds a JS frame. Please see JavaScriptFrameConstants in
|
| // frames-arm.h for its layout.
|
| -void FastCodeGenerator::Generate(FunctionLiteral* fun) {
|
| +void FullCodeGenerator::Generate(FunctionLiteral* fun) {
|
| function_ = fun;
|
| SetFunctionPosition(fun);
|
| int locals_count = fun->scope()->num_stack_slots();
|
| @@ -167,7 +167,7 @@
|
| }
|
|
|
|
|
| -void FastCodeGenerator::EmitReturnSequence(int position) {
|
| +void FullCodeGenerator::EmitReturnSequence(int position) {
|
| Comment cmnt(masm_, "[ Return sequence");
|
| if (return_label_.is_bound()) {
|
| __ b(&return_label_);
|
| @@ -214,7 +214,7 @@
|
| }
|
|
|
|
|
| -void FastCodeGenerator::Apply(Expression::Context context, Register reg) {
|
| +void FullCodeGenerator::Apply(Expression::Context context, Register reg) {
|
| switch (context) {
|
| case Expression::kUninitialized:
|
| UNREACHABLE();
|
| @@ -250,7 +250,7 @@
|
| }
|
|
|
|
|
| -void FastCodeGenerator::Apply(Expression::Context context, Slot* slot) {
|
| +void FullCodeGenerator::Apply(Expression::Context context, Slot* slot) {
|
| switch (context) {
|
| case Expression::kUninitialized:
|
| UNREACHABLE();
|
| @@ -270,7 +270,7 @@
|
| }
|
|
|
|
|
| -void FastCodeGenerator::Apply(Expression::Context context, Literal* lit) {
|
| +void FullCodeGenerator::Apply(Expression::Context context, Literal* lit) {
|
| switch (context) {
|
| case Expression::kUninitialized:
|
| UNREACHABLE();
|
| @@ -290,7 +290,7 @@
|
| }
|
|
|
|
|
| -void FastCodeGenerator::ApplyTOS(Expression::Context context) {
|
| +void FullCodeGenerator::ApplyTOS(Expression::Context context) {
|
| switch (context) {
|
| case Expression::kUninitialized:
|
| UNREACHABLE();
|
| @@ -323,7 +323,7 @@
|
| }
|
|
|
|
|
| -void FastCodeGenerator::DropAndApply(int count,
|
| +void FullCodeGenerator::DropAndApply(int count,
|
| Expression::Context context,
|
| Register reg) {
|
| ASSERT(count > 0);
|
| @@ -371,7 +371,7 @@
|
| }
|
|
|
|
|
| -void FastCodeGenerator::Apply(Expression::Context context,
|
| +void FullCodeGenerator::Apply(Expression::Context context,
|
| Label* materialize_true,
|
| Label* materialize_false) {
|
| switch (context) {
|
| @@ -432,7 +432,7 @@
|
| }
|
|
|
|
|
| -void FastCodeGenerator::DoTest(Expression::Context context) {
|
| +void FullCodeGenerator::DoTest(Expression::Context context) {
|
| // The value to test is pushed on the stack, and duplicated on the stack
|
| // if necessary (for value/test and test/value contexts).
|
| ASSERT_NE(NULL, true_label_);
|
| @@ -495,7 +495,7 @@
|
| }
|
|
|
|
|
| -MemOperand FastCodeGenerator::EmitSlotSearch(Slot* slot, Register scratch) {
|
| +MemOperand FullCodeGenerator::EmitSlotSearch(Slot* slot, Register scratch) {
|
| switch (slot->type()) {
|
| case Slot::PARAMETER:
|
| case Slot::LOCAL:
|
| @@ -514,14 +514,14 @@
|
| }
|
|
|
|
|
| -void FastCodeGenerator::Move(Register destination, Slot* source) {
|
| +void FullCodeGenerator::Move(Register destination, Slot* source) {
|
| // Use destination as scratch.
|
| MemOperand slot_operand = EmitSlotSearch(source, destination);
|
| __ ldr(destination, slot_operand);
|
| }
|
|
|
|
|
| -void FastCodeGenerator::Move(Slot* dst,
|
| +void FullCodeGenerator::Move(Slot* dst,
|
| Register src,
|
| Register scratch1,
|
| Register scratch2) {
|
| @@ -537,7 +537,7 @@
|
| }
|
|
|
|
|
| -void FastCodeGenerator::VisitDeclaration(Declaration* decl) {
|
| +void FullCodeGenerator::VisitDeclaration(Declaration* decl) {
|
| Comment cmnt(masm_, "[ Declaration");
|
| Variable* var = decl->proxy()->var();
|
| ASSERT(var != NULL); // Must have been resolved.
|
| @@ -637,7 +637,7 @@
|
| }
|
|
|
|
|
| -void FastCodeGenerator::DeclareGlobals(Handle<FixedArray> pairs) {
|
| +void FullCodeGenerator::DeclareGlobals(Handle<FixedArray> pairs) {
|
| // Call the runtime to declare the globals.
|
| // The context is the first argument.
|
| __ mov(r1, Operand(pairs));
|
| @@ -648,7 +648,7 @@
|
| }
|
|
|
|
|
| -void FastCodeGenerator::VisitFunctionLiteral(FunctionLiteral* expr) {
|
| +void FullCodeGenerator::VisitFunctionLiteral(FunctionLiteral* expr) {
|
| Comment cmnt(masm_, "[ FunctionLiteral");
|
|
|
| // Build the function boilerplate and instantiate it.
|
| @@ -666,13 +666,13 @@
|
| }
|
|
|
|
|
| -void FastCodeGenerator::VisitVariableProxy(VariableProxy* expr) {
|
| +void FullCodeGenerator::VisitVariableProxy(VariableProxy* expr) {
|
| Comment cmnt(masm_, "[ VariableProxy");
|
| EmitVariableLoad(expr->var(), context_);
|
| }
|
|
|
|
|
| -void FastCodeGenerator::EmitVariableLoad(Variable* var,
|
| +void FullCodeGenerator::EmitVariableLoad(Variable* var,
|
| Expression::Context context) {
|
| Expression* rewrite = var->rewrite();
|
| if (rewrite == NULL) {
|
| @@ -745,7 +745,7 @@
|
| }
|
|
|
|
|
| -void FastCodeGenerator::VisitRegExpLiteral(RegExpLiteral* expr) {
|
| +void FullCodeGenerator::VisitRegExpLiteral(RegExpLiteral* expr) {
|
| Comment cmnt(masm_, "[ RegExpLiteral");
|
| Label done;
|
| // Registers will be used as follows:
|
| @@ -772,7 +772,7 @@
|
| }
|
|
|
|
|
| -void FastCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) {
|
| +void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) {
|
| Comment cmnt(masm_, "[ ObjectLiteral");
|
| __ ldr(r2, MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset));
|
| __ ldr(r2, FieldMemOperand(r2, JSFunction::kLiteralsOffset));
|
| @@ -847,7 +847,7 @@
|
| }
|
|
|
|
|
| -void FastCodeGenerator::VisitArrayLiteral(ArrayLiteral* expr) {
|
| +void FullCodeGenerator::VisitArrayLiteral(ArrayLiteral* expr) {
|
| Comment cmnt(masm_, "[ ArrayLiteral");
|
| __ ldr(r3, MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset));
|
| __ ldr(r3, FieldMemOperand(r3, JSFunction::kLiteralsOffset));
|
| @@ -900,7 +900,7 @@
|
| }
|
|
|
|
|
| -void FastCodeGenerator::EmitNamedPropertyLoad(Property* prop) {
|
| +void FullCodeGenerator::EmitNamedPropertyLoad(Property* prop) {
|
| SetSourcePosition(prop->position());
|
| Literal* key = prop->key()->AsLiteral();
|
| __ mov(r2, Operand(key->handle()));
|
| @@ -909,14 +909,14 @@
|
| }
|
|
|
|
|
| -void FastCodeGenerator::EmitKeyedPropertyLoad(Property* prop) {
|
| +void FullCodeGenerator::EmitKeyedPropertyLoad(Property* prop) {
|
| SetSourcePosition(prop->position());
|
| Handle<Code> ic(Builtins::builtin(Builtins::KeyedLoadIC_Initialize));
|
| __ Call(ic, RelocInfo::CODE_TARGET);
|
| }
|
|
|
|
|
| -void FastCodeGenerator::EmitBinaryOp(Token::Value op,
|
| +void FullCodeGenerator::EmitBinaryOp(Token::Value op,
|
| Expression::Context context) {
|
| __ pop(r1);
|
| GenericBinaryOpStub stub(op, NO_OVERWRITE);
|
| @@ -925,7 +925,7 @@
|
| }
|
|
|
|
|
| -void FastCodeGenerator::EmitVariableAssignment(Variable* var,
|
| +void FullCodeGenerator::EmitVariableAssignment(Variable* var,
|
| Expression::Context context) {
|
| ASSERT(var != NULL);
|
| ASSERT(var->is_global() || var->slot() != NULL);
|
| @@ -975,7 +975,7 @@
|
| }
|
|
|
|
|
| -void FastCodeGenerator::EmitNamedPropertyAssignment(Assignment* expr) {
|
| +void FullCodeGenerator::EmitNamedPropertyAssignment(Assignment* expr) {
|
| // Assignment to a property, using a named store IC.
|
| Property* prop = expr->target()->AsProperty();
|
| ASSERT(prop != NULL);
|
| @@ -1011,7 +1011,7 @@
|
| }
|
|
|
|
|
| -void FastCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) {
|
| +void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) {
|
| // Assignment to a property, using a keyed store IC.
|
|
|
| // If the assignment starts a block of assignments to the same object,
|
| @@ -1046,7 +1046,7 @@
|
| }
|
|
|
|
|
| -void FastCodeGenerator::VisitProperty(Property* expr) {
|
| +void FullCodeGenerator::VisitProperty(Property* expr) {
|
| Comment cmnt(masm_, "[ Property");
|
| Expression* key = expr->key();
|
|
|
| @@ -1065,7 +1065,7 @@
|
| }
|
| }
|
|
|
| -void FastCodeGenerator::EmitCallWithIC(Call* expr,
|
| +void FullCodeGenerator::EmitCallWithIC(Call* expr,
|
| Handle<Object> ignored,
|
| RelocInfo::Mode mode) {
|
| // Code common for calls using the IC.
|
| @@ -1087,7 +1087,7 @@
|
| }
|
|
|
|
|
| -void FastCodeGenerator::EmitCallWithStub(Call* expr) {
|
| +void FullCodeGenerator::EmitCallWithStub(Call* expr) {
|
| // Code common for calls using the call stub.
|
| ZoneList<Expression*>* args = expr->arguments();
|
| int arg_count = args->length();
|
| @@ -1105,7 +1105,7 @@
|
| }
|
|
|
|
|
| -void FastCodeGenerator::VisitCall(Call* expr) {
|
| +void FullCodeGenerator::VisitCall(Call* expr) {
|
| Comment cmnt(masm_, "[ Call");
|
| Expression* fun = expr->expression();
|
| Variable* var = fun->AsVariableProxy()->AsVariable();
|
| @@ -1176,7 +1176,7 @@
|
| }
|
|
|
|
|
| -void FastCodeGenerator::VisitCallNew(CallNew* expr) {
|
| +void FullCodeGenerator::VisitCallNew(CallNew* expr) {
|
| Comment cmnt(masm_, "[ CallNew");
|
| // According to ECMA-262, section 11.2.2, page 44, the function
|
| // expression in new calls must be evaluated before the
|
| @@ -1211,7 +1211,7 @@
|
| }
|
|
|
|
|
| -void FastCodeGenerator::VisitCallRuntime(CallRuntime* expr) {
|
| +void FullCodeGenerator::VisitCallRuntime(CallRuntime* expr) {
|
| Comment cmnt(masm_, "[ CallRuntime");
|
| ZoneList<Expression*>* args = expr->arguments();
|
|
|
| @@ -1246,7 +1246,7 @@
|
| }
|
|
|
|
|
| -void FastCodeGenerator::VisitUnaryOperation(UnaryOperation* expr) {
|
| +void FullCodeGenerator::VisitUnaryOperation(UnaryOperation* expr) {
|
| switch (expr->op()) {
|
| case Token::VOID: {
|
| Comment cmnt(masm_, "[ UnaryOperation (VOID)");
|
| @@ -1357,7 +1357,7 @@
|
| }
|
|
|
|
|
| -void FastCodeGenerator::VisitCountOperation(CountOperation* expr) {
|
| +void FullCodeGenerator::VisitCountOperation(CountOperation* expr) {
|
| Comment cmnt(masm_, "[ CountOperation");
|
|
|
| // Expression can only be a property, a global or a (parameter or local)
|
| @@ -1483,7 +1483,7 @@
|
| }
|
|
|
|
|
| -void FastCodeGenerator::VisitBinaryOperation(BinaryOperation* expr) {
|
| +void FullCodeGenerator::VisitBinaryOperation(BinaryOperation* expr) {
|
| Comment cmnt(masm_, "[ BinaryOperation");
|
| switch (expr->op()) {
|
| case Token::COMMA:
|
| @@ -1518,7 +1518,7 @@
|
| }
|
|
|
|
|
| -void FastCodeGenerator::VisitCompareOperation(CompareOperation* expr) {
|
| +void FullCodeGenerator::VisitCompareOperation(CompareOperation* expr) {
|
| Comment cmnt(masm_, "[ CompareOperation");
|
|
|
| // Always perform the comparison for its control flow. Pack the result
|
| @@ -1633,25 +1633,25 @@
|
| }
|
|
|
|
|
| -void FastCodeGenerator::VisitThisFunction(ThisFunction* expr) {
|
| +void FullCodeGenerator::VisitThisFunction(ThisFunction* expr) {
|
| __ ldr(r0, MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset));
|
| Apply(context_, r0);
|
| }
|
|
|
|
|
| -Register FastCodeGenerator::result_register() { return r0; }
|
| +Register FullCodeGenerator::result_register() { return r0; }
|
|
|
|
|
| -Register FastCodeGenerator::context_register() { return cp; }
|
| +Register FullCodeGenerator::context_register() { return cp; }
|
|
|
|
|
| -void FastCodeGenerator::StoreToFrameField(int frame_offset, Register value) {
|
| +void FullCodeGenerator::StoreToFrameField(int frame_offset, Register value) {
|
| ASSERT_EQ(POINTER_SIZE_ALIGN(frame_offset), frame_offset);
|
| __ str(value, MemOperand(fp, frame_offset));
|
| }
|
|
|
|
|
| -void FastCodeGenerator::LoadContextField(Register dst, int context_index) {
|
| +void FullCodeGenerator::LoadContextField(Register dst, int context_index) {
|
| __ ldr(dst, CodeGenerator::ContextOperand(cp, context_index));
|
| }
|
|
|
| @@ -1659,7 +1659,7 @@
|
| // ----------------------------------------------------------------------------
|
| // Non-local control flow support.
|
|
|
| -void FastCodeGenerator::EnterFinallyBlock() {
|
| +void FullCodeGenerator::EnterFinallyBlock() {
|
| ASSERT(!result_register().is(r1));
|
| // Store result register while executing finally block.
|
| __ push(result_register());
|
| @@ -1672,7 +1672,7 @@
|
| }
|
|
|
|
|
| -void FastCodeGenerator::ExitFinallyBlock() {
|
| +void FullCodeGenerator::ExitFinallyBlock() {
|
| ASSERT(!result_register().is(r1));
|
| // Restore result register from stack.
|
| __ pop(r1);
|
|
|