| Index: src/arm/fast-codegen-arm.cc
|
| ===================================================================
|
| --- src/arm/fast-codegen-arm.cc (revision 3203)
|
| +++ src/arm/fast-codegen-arm.cc (working copy)
|
| @@ -769,30 +769,40 @@
|
|
|
|
|
| void FastCodeGenerator::VisitCall(Call* expr) {
|
| + Comment cmnt(masm_, "[ Call");
|
| Expression* fun = expr->expression();
|
| Variable* var = fun->AsVariableProxy()->AsVariable();
|
|
|
| - if (var != NULL &&
|
| - var->is_possibly_eval()) {
|
| - // Call to eval.
|
| + if (var != NULL && var->is_possibly_eval()) {
|
| + // Call to the identifier 'eval'.
|
| UNREACHABLE();
|
| + } else if (var != NULL && !var->is_this() && var->is_global()) {
|
| + // Call to a global variable.
|
| + __ mov(r1, Operand(var->name()));
|
| + // Push global object as receiver for the call IC lookup.
|
| + __ ldr(r0, CodeGenerator::GlobalObject());
|
| + __ stm(db_w, sp, r1.bit() | r0.bit());
|
| + EmitCallWithIC(expr, RelocInfo::CODE_TARGET_CONTEXT);
|
| + } else if (var != NULL && var->slot() != NULL &&
|
| + var->slot()->type() == Slot::LOOKUP) {
|
| + // Call to a lookup slot.
|
| + UNREACHABLE();
|
| } else if (fun->AsProperty() != NULL) {
|
| - // Call on a property.
|
| + // Call to an object property.
|
| Property* prop = fun->AsProperty();
|
| Literal* key = prop->key()->AsLiteral();
|
| if (key != NULL && key->handle()->IsSymbol()) {
|
| - // Call on a named property: foo.x(1,2,3)
|
| + // Call to a named property, use call IC.
|
| __ mov(r0, Operand(key->handle()));
|
| __ push(r0);
|
| Visit(prop->obj());
|
| - // Use call IC.
|
| EmitCallWithIC(expr, RelocInfo::CODE_TARGET);
|
| } else {
|
| - // Call on a keyed property : foo[key](1,2,3)
|
| - // Use a keyed load IC followed by a call IC.
|
| + // Call to a keyed property, use keyed load IC followed by function
|
| + // call.
|
| Visit(prop->obj());
|
| Visit(prop->key());
|
| - // Record source position of property.
|
| + // Record source code position for IC call.
|
| SetSourcePosition(prop->position());
|
| Handle<Code> ic(Builtins::builtin(Builtins::KeyedLoadIC_Initialize));
|
| __ Call(ic, RelocInfo::CODE_TARGET);
|
| @@ -807,21 +817,8 @@
|
| __ str(r1, MemOperand(sp));
|
| EmitCallWithStub(expr);
|
| }
|
| - } else if (var != NULL) {
|
| - // Call on a global variable
|
| - ASSERT(var != NULL && !var->is_this() && var->is_global());
|
| - ASSERT(!var->is_possibly_eval());
|
| - __ mov(r1, Operand(var->name()));
|
| - // Push global object as receiver.
|
| - __ ldr(r0, CodeGenerator::GlobalObject());
|
| - __ stm(db_w, sp, r1.bit() | r0.bit());
|
| - EmitCallWithIC(expr, RelocInfo::CODE_TARGET_CONTEXT);
|
| - } else if (var != NULL && var->slot() != NULL &&
|
| - var->slot()->type() == Slot::LOOKUP) {
|
| - // Call inside a with-statement
|
| - UNREACHABLE();
|
| } else {
|
| - // Call with an arbitrary function expression.
|
| + // Call to some other function expression.
|
| Visit(expr->expression());
|
| // Load global receiver object.
|
| __ ldr(r1, CodeGenerator::GlobalObject());
|
|
|