Chromium Code Reviews| Index: src/arm/fast-codegen-arm.cc |
| =================================================================== |
| --- src/arm/fast-codegen-arm.cc (revision 3220) |
| +++ src/arm/fast-codegen-arm.cc (working copy) |
| @@ -732,7 +732,7 @@ |
| if (key->AsLiteral() != NULL && key->AsLiteral()->handle()->IsSymbol() && |
| !String::cast(*(key->AsLiteral()->handle()))->AsArrayIndex(&dummy)) { |
| // Do a NAMED property load. |
| - // The IC expects the property name in ecx and the receiver on the stack. |
| + // The IC expects the property name in r2 and the receiver on the stack. |
| __ mov(r2, Operand(key->AsLiteral()->handle())); |
| Handle<Code> ic(Builtins::builtin(Builtins::LoadIC_Initialize)); |
| __ Call(ic, RelocInfo::CODE_TARGET); |
| @@ -915,9 +915,9 @@ |
| void FastCodeGenerator::VisitUnaryOperation(UnaryOperation* expr) { |
| - Comment cmnt(masm_, "[ UnaryOperation"); |
| switch (expr->op()) { |
| - case Token::VOID: |
| + case Token::VOID: { |
| + Comment cmnt(masm_, "[ UnaryOperation (VOID)"); |
| Visit(expr->expression()); |
| ASSERT_EQ(Expression::kEffect, expr->expression()->context()); |
| switch (expr->context()) { |
| @@ -940,8 +940,10 @@ |
| break; |
| } |
| break; |
| + } |
| case Token::NOT: { |
| + Comment cmnt(masm_, "[ UnaryOperation (NOT)"); |
| ASSERT_EQ(Expression::kTest, expr->expression()->context()); |
| Label push_true; |
| @@ -1006,6 +1008,37 @@ |
| break; |
| } |
| + case Token::TYPEOF: { |
| + Comment cmnt(masm_, "[ UnaryOperation (TYPEOF)"); |
| + ASSERT_EQ(Expression::kValue, expr->expression()->context()); |
| + |
| + VariableProxy* proxy = expr->expression()->AsVariableProxy(); |
| + if (proxy != NULL && proxy->var()->is_global()) { |
| + Comment cmnt(masm_, "Global variable"); |
| + __ ldr(r0, CodeGenerator::GlobalObject()); |
| + __ push(r0); |
| + __ mov(r2, Operand(proxy->name())); |
| + Handle<Code> ic(Builtins::builtin(Builtins::LoadIC_Initialize)); |
| + // Use a regular load, not a contextual load, to avoid reference error. |
|
Kevin Millikin (Chromium)
2009/11/05 10:10:26
error => errors :)
|
| + __ Call(ic, RelocInfo::CODE_TARGET); |
| + __ str(r0, MemOperand(sp)); |
| + } else if (proxy != NULL && |
| + proxy->var()->slot() != NULL && |
| + proxy->var()->slot()->type() == Slot::LOOKUP) { |
| + __ mov(r0, Operand(proxy->name())); |
| + __ stm(db_w, sp, cp.bit() | r0.bit()); |
| + __ CallRuntime(Runtime::kLoadContextSlotNoReferenceError, 2); |
| + __ push(r0); |
| + } else { |
| + // This expression cannot throw a reference error at the top level. |
| + Visit(expr->expression()); |
| + } |
| + |
| + __ CallRuntime(Runtime::kTypeof, 1); |
| + Move(expr->context(), r0); |
| + break; |
| + } |
| + |
| default: |
| UNREACHABLE(); |
| } |