Index: src/ia32/fast-codegen-ia32.cc |
=================================================================== |
--- src/ia32/fast-codegen-ia32.cc (revision 3445) |
+++ src/ia32/fast-codegen-ia32.cc (working copy) |
@@ -549,14 +549,20 @@ |
void FastCodeGenerator::VisitVariableProxy(VariableProxy* expr) { |
Comment cmnt(masm_, "[ VariableProxy"); |
- Expression* rewrite = expr->var()->rewrite(); |
+ EmitVariableLoad(expr->var(), expr->context()); |
+} |
+ |
+ |
+void FastCodeGenerator::EmitVariableLoad(Variable* var, |
+ Expression::Context context) { |
+ Expression* rewrite = var->rewrite(); |
if (rewrite == NULL) { |
- ASSERT(expr->var()->is_global()); |
+ ASSERT(var->is_global()); |
Comment cmnt(masm_, "Global variable"); |
// Use inline caching. Variable name is passed in ecx and the global |
// object on the stack. |
__ push(CodeGenerator::GlobalObject()); |
- __ mov(ecx, expr->name()); |
+ __ mov(ecx, var->name()); |
Handle<Code> ic(Builtins::builtin(Builtins::LoadIC_Initialize)); |
__ call(ic, RelocInfo::CODE_TARGET_CONTEXT); |
// By emitting a nop we make sure that we do not have a test eax |
@@ -564,8 +570,7 @@ |
// Remember that the assembler may choose to do peephole optimization |
// (eg, push/pop elimination). |
__ nop(); |
- |
- DropAndMove(expr->context(), eax); |
+ DropAndMove(context, eax); |
} else if (rewrite->AsSlot() != NULL) { |
Slot* slot = rewrite->AsSlot(); |
if (FLAG_debug_code) { |
@@ -586,7 +591,7 @@ |
UNREACHABLE(); |
} |
} |
- Move(expr->context(), slot, eax); |
+ Move(context, slot, eax); |
} else { |
Comment cmnt(masm_, "Variable rewritten to Property"); |
// A variable has been rewritten into an explicit access to |
@@ -620,9 +625,8 @@ |
// Notice: We must not have a "test eax, ..." instruction after |
// the call. It is treated specially by the LoadIC code. |
__ nop(); |
- |
- // Drop key and object left on the stack by IC, and push the result. |
- DropAndMove(expr->context(), eax, 2); |
+ // Drop key and object left on the stack by IC. |
+ DropAndMove(context, eax, 2); |
} |
} |
@@ -836,6 +840,32 @@ |
} |
+void FastCodeGenerator::EmitNamedPropertyLoad(Property* prop, Expression::Context context) { |
+ Literal* key = prop->key()->AsLiteral(); |
+ __ mov(ecx, Immediate(key->handle())); |
+ Handle<Code> ic(Builtins::builtin(Builtins::LoadIC_Initialize)); |
+ __ call(ic, RelocInfo::CODE_TARGET); |
+ Move(context, eax); |
+} |
+ |
+ |
+void FastCodeGenerator::EmitKeyedPropertyLoad(Expression::Context context) { |
+ Handle<Code> ic(Builtins::builtin(Builtins::KeyedLoadIC_Initialize)); |
+ __ call(ic, RelocInfo::CODE_TARGET); |
+ Move(context, eax); |
+} |
+ |
+ |
+void FastCodeGenerator::EmitCompoundAssignmentOp(Token::Value op, |
+ Expression::Context context) { |
+ GenericBinaryOpStub stub(op, |
+ NO_OVERWRITE, |
+ NO_GENERIC_BINARY_FLAGS); |
+ __ CallStub(&stub); |
+ Move(context, eax); |
+} |
+ |
+ |
void FastCodeGenerator::EmitVariableAssignment(Assignment* expr) { |
Variable* var = expr->target()->AsVariableProxy()->AsVariable(); |
ASSERT(var != NULL); |