| Index: src/arm/full-codegen-arm.cc
|
| ===================================================================
|
| --- src/arm/full-codegen-arm.cc (revision 9006)
|
| +++ src/arm/full-codegen-arm.cc (working copy)
|
| @@ -752,9 +752,9 @@
|
| __ mov(r2, Operand(variable->name()));
|
| // Declaration nodes are always introduced in one of two modes.
|
| ASSERT(mode == Variable::VAR ||
|
| - mode == Variable::CONST);
|
| - PropertyAttributes attr =
|
| - (mode == Variable::VAR) ? NONE : READ_ONLY;
|
| + mode == Variable::CONST ||
|
| + mode == Variable::LET);
|
| + PropertyAttributes attr = (mode == Variable::CONST) ? READ_ONLY : NONE;
|
| __ mov(r1, Operand(Smi::FromInt(attr)));
|
| // Push initial value, if any.
|
| // Note: For variables we must not push an initial value (such as
|
| @@ -888,7 +888,7 @@
|
| __ bind(&next_test);
|
| __ Drop(1); // Switch value is no longer needed.
|
| if (default_clause == NULL) {
|
| - __ b(nested_statement.break_target());
|
| + __ b(nested_statement.break_label());
|
| } else {
|
| __ b(default_clause->body_target());
|
| }
|
| @@ -902,7 +902,7 @@
|
| VisitStatements(clause->statements());
|
| }
|
|
|
| - __ bind(nested_statement.break_target());
|
| + __ bind(nested_statement.break_label());
|
| PrepareForBailoutForId(stmt->ExitId(), NO_REGISTERS);
|
| }
|
|
|
| @@ -1033,7 +1033,7 @@
|
| // Load the current count to r0, load the length to r1.
|
| __ Ldrd(r0, r1, MemOperand(sp, 0 * kPointerSize));
|
| __ cmp(r0, r1); // Compare to the array length.
|
| - __ b(hs, loop_statement.break_target());
|
| + __ b(hs, loop_statement.break_label());
|
|
|
| // Get the current entry of the array into register r3.
|
| __ ldr(r2, MemOperand(sp, 2 * kPointerSize));
|
| @@ -1059,7 +1059,7 @@
|
| __ push(r3); // Current entry.
|
| __ InvokeBuiltin(Builtins::FILTER_KEY, CALL_FUNCTION);
|
| __ mov(r3, Operand(r0), SetCC);
|
| - __ b(eq, loop_statement.continue_target());
|
| + __ b(eq, loop_statement.continue_label());
|
|
|
| // Update the 'each' property or variable from the possibly filtered
|
| // entry in register r3.
|
| @@ -1075,7 +1075,7 @@
|
|
|
| // Generate code for the going to the next element by incrementing
|
| // the index (smi) stored on top of the stack.
|
| - __ bind(loop_statement.continue_target());
|
| + __ bind(loop_statement.continue_label());
|
| __ pop(r0);
|
| __ add(r0, r0, Operand(Smi::FromInt(1)));
|
| __ push(r0);
|
| @@ -1084,7 +1084,7 @@
|
| __ b(&loop);
|
|
|
| // Remove the pointers stored on the stack.
|
| - __ bind(loop_statement.break_target());
|
| + __ bind(loop_statement.break_label());
|
| __ Drop(5);
|
|
|
| // Exit and decrement the loop depth.
|
| @@ -4054,6 +4054,10 @@
|
| __ b(eq, if_true);
|
| __ CompareRoot(r0, Heap::kFalseValueRootIndex);
|
| Split(eq, if_true, if_false, fall_through);
|
| + } else if (FLAG_harmony_typeof &&
|
| + check->Equals(isolate()->heap()->null_symbol())) {
|
| + __ CompareRoot(r0, Heap::kNullValueRootIndex);
|
| + Split(eq, if_true, if_false, fall_through);
|
| } else if (check->Equals(isolate()->heap()->undefined_symbol())) {
|
| __ CompareRoot(r0, Heap::kUndefinedValueRootIndex);
|
| __ b(eq, if_true);
|
| @@ -4071,8 +4075,10 @@
|
|
|
| } else if (check->Equals(isolate()->heap()->object_symbol())) {
|
| __ JumpIfSmi(r0, if_false);
|
| - __ CompareRoot(r0, Heap::kNullValueRootIndex);
|
| - __ b(eq, if_true);
|
| + if (!FLAG_harmony_typeof) {
|
| + __ CompareRoot(r0, Heap::kNullValueRootIndex);
|
| + __ b(eq, if_true);
|
| + }
|
| // Check for JS objects => true.
|
| __ CompareObjectType(r0, r0, r1, FIRST_NONCALLABLE_SPEC_OBJECT_TYPE);
|
| __ b(lt, if_false);
|
| @@ -4147,11 +4153,8 @@
|
| default: {
|
| VisitForAccumulatorValue(expr->right());
|
| Condition cond = eq;
|
| - bool strict = false;
|
| switch (op) {
|
| case Token::EQ_STRICT:
|
| - strict = true;
|
| - // Fall through
|
| case Token::EQ:
|
| cond = eq;
|
| __ pop(r1);
|
|
|