| Index: src/mips/full-codegen-mips.cc
|
| diff --git a/src/mips/full-codegen-mips.cc b/src/mips/full-codegen-mips.cc
|
| index d6e7a440e6a93d1fb4d707bef09b08a47057da24..5559788b361e31d86e957951f080797282bc3ffc 100644
|
| --- a/src/mips/full-codegen-mips.cc
|
| +++ b/src/mips/full-codegen-mips.cc
|
| @@ -952,7 +952,8 @@ void FullCodeGenerator::VisitForInStatement(ForInStatement* stmt) {
|
| Register null_value = t1;
|
| __ LoadRoot(null_value, Heap::kNullValueRootIndex);
|
| __ Branch(&exit, eq, a0, Operand(null_value));
|
| -
|
| + PrepareForBailoutForId(stmt->PrepareId(), TOS_REG);
|
| + __ mov(a0, v0);
|
| // Convert the object to a JS object.
|
| Label convert, done_convert;
|
| __ JumpIfSmi(a0, &convert);
|
| @@ -975,44 +976,7 @@ void FullCodeGenerator::VisitForInStatement(ForInStatement* stmt) {
|
| // the JSObject::IsSimpleEnum cache validity checks. If we cannot
|
| // guarantee cache validity, call the runtime system to check cache
|
| // validity or get the property names in a fixed array.
|
| - Label next;
|
| - // Preload a couple of values used in the loop.
|
| - Register empty_fixed_array_value = t2;
|
| - __ LoadRoot(empty_fixed_array_value, Heap::kEmptyFixedArrayRootIndex);
|
| - Register empty_descriptor_array_value = t3;
|
| - __ LoadRoot(empty_descriptor_array_value,
|
| - Heap::kEmptyDescriptorArrayRootIndex);
|
| - __ mov(a1, a0);
|
| - __ bind(&next);
|
| -
|
| - // Check that there are no elements. Register a1 contains the
|
| - // current JS object we've reached through the prototype chain.
|
| - __ lw(a2, FieldMemOperand(a1, JSObject::kElementsOffset));
|
| - __ Branch(&call_runtime, ne, a2, Operand(empty_fixed_array_value));
|
| -
|
| - // Check that instance descriptors are not empty so that we can
|
| - // check for an enum cache. Leave the map in a2 for the subsequent
|
| - // prototype load.
|
| - __ lw(a2, FieldMemOperand(a1, HeapObject::kMapOffset));
|
| - __ lw(a3, FieldMemOperand(a2, Map::kInstanceDescriptorsOrBitField3Offset));
|
| - __ JumpIfSmi(a3, &call_runtime);
|
| -
|
| - // Check that there is an enum cache in the non-empty instance
|
| - // descriptors (a3). This is the case if the next enumeration
|
| - // index field does not contain a smi.
|
| - __ lw(a3, FieldMemOperand(a3, DescriptorArray::kEnumerationIndexOffset));
|
| - __ JumpIfSmi(a3, &call_runtime);
|
| -
|
| - // For all objects but the receiver, check that the cache is empty.
|
| - Label check_prototype;
|
| - __ Branch(&check_prototype, eq, a1, Operand(a0));
|
| - __ lw(a3, FieldMemOperand(a3, DescriptorArray::kEnumCacheBridgeCacheOffset));
|
| - __ Branch(&call_runtime, ne, a3, Operand(empty_fixed_array_value));
|
| -
|
| - // Load the prototype from the map and loop if non-null.
|
| - __ bind(&check_prototype);
|
| - __ lw(a1, FieldMemOperand(a2, Map::kPrototypeOffset));
|
| - __ Branch(&next, ne, a1, Operand(null_value));
|
| + __ CheckEnumCache(null_value, &call_runtime);
|
|
|
| // The enum cache is valid. Load the map of the object being
|
| // iterated over and use the cache for the iteration.
|
| @@ -1064,6 +1028,7 @@ void FullCodeGenerator::VisitForInStatement(ForInStatement* stmt) {
|
| __ Push(a1, a0); // Fixed array length (as smi) and initial index.
|
|
|
| // Generate code for doing the condition check.
|
| + PrepareForBailoutForId(stmt->BodyId(), NO_REGISTERS);
|
| __ bind(&loop);
|
| // Load the current count to a0, load the length to a1.
|
| __ lw(a0, MemOperand(sp, 0 * kPointerSize));
|
| @@ -1108,7 +1073,7 @@ void FullCodeGenerator::VisitForInStatement(ForInStatement* stmt) {
|
| __ mov(result_register(), a3);
|
| // Perform the assignment as if via '='.
|
| { EffectContext context(this);
|
| - EmitAssignment(stmt->each(), stmt->AssignmentId());
|
| + EmitAssignment(stmt->each());
|
| }
|
|
|
| // Generate code for the body of the loop.
|
| @@ -1129,6 +1094,7 @@ void FullCodeGenerator::VisitForInStatement(ForInStatement* stmt) {
|
| __ Drop(5);
|
|
|
| // Exit and decrement the loop depth.
|
| + PrepareForBailoutForId(stmt->ExitId(), NO_REGISTERS);
|
| __ bind(&exit);
|
| decrement_loop_depth();
|
| }
|
| @@ -1899,7 +1865,7 @@ void FullCodeGenerator::EmitBinaryOp(BinaryOperation* expr,
|
| }
|
|
|
|
|
| -void FullCodeGenerator::EmitAssignment(Expression* expr, int bailout_ast_id) {
|
| +void FullCodeGenerator::EmitAssignment(Expression* expr) {
|
| // Invalid left-hand sides are rewritten to have a 'throw
|
| // ReferenceError' on the left-hand side.
|
| if (!expr->IsValidLeftHandSide()) {
|
| @@ -1951,7 +1917,6 @@ void FullCodeGenerator::EmitAssignment(Expression* expr, int bailout_ast_id) {
|
| break;
|
| }
|
| }
|
| - PrepareForBailoutForId(bailout_ast_id, TOS_REG);
|
| context()->Plug(v0);
|
| }
|
|
|
|
|