OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved.7 | 1 // Copyright 2012 the V8 project authors. All rights reserved.7 |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 5452 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5463 DCHECK(!environment->HasBeenRegistered()); | 5463 DCHECK(!environment->HasBeenRegistered()); |
5464 RegisterEnvironmentForDeoptimization(environment, Safepoint::kNoLazyDeopt); | 5464 RegisterEnvironmentForDeoptimization(environment, Safepoint::kNoLazyDeopt); |
5465 | 5465 |
5466 GenerateOsrPrologue(); | 5466 GenerateOsrPrologue(); |
5467 } | 5467 } |
5468 | 5468 |
5469 | 5469 |
5470 void LCodeGen::DoForInPrepareMap(LForInPrepareMap* instr) { | 5470 void LCodeGen::DoForInPrepareMap(LForInPrepareMap* instr) { |
5471 Register result = ToRegister(instr->result()); | 5471 Register result = ToRegister(instr->result()); |
5472 Register object = ToRegister(instr->object()); | 5472 Register object = ToRegister(instr->object()); |
5473 __ And(at, object, kSmiTagMask); | |
5474 DeoptimizeIf(eq, instr, Deoptimizer::kSmi, at, Operand(zero_reg)); | |
5475 | |
5476 STATIC_ASSERT(JS_PROXY_TYPE == FIRST_JS_RECEIVER_TYPE); | |
5477 __ GetObjectType(object, a1, a1); | |
5478 DeoptimizeIf(le, instr, Deoptimizer::kNotAJavaScriptObject, a1, | |
5479 Operand(JS_PROXY_TYPE)); | |
5480 | 5473 |
5481 Label use_cache, call_runtime; | 5474 Label use_cache, call_runtime; |
5482 DCHECK(object.is(a0)); | 5475 DCHECK(object.is(a0)); |
5483 Register null_value = t1; | 5476 __ CheckEnumCache(&call_runtime); |
5484 __ LoadRoot(null_value, Heap::kNullValueRootIndex); | |
5485 __ CheckEnumCache(null_value, &call_runtime); | |
5486 | 5477 |
5487 __ lw(result, FieldMemOperand(object, HeapObject::kMapOffset)); | 5478 __ lw(result, FieldMemOperand(object, HeapObject::kMapOffset)); |
5488 __ Branch(&use_cache); | 5479 __ Branch(&use_cache); |
5489 | 5480 |
5490 // Get the set of properties to enumerate. | 5481 // Get the set of properties to enumerate. |
5491 __ bind(&call_runtime); | 5482 __ bind(&call_runtime); |
5492 __ push(object); | 5483 __ push(object); |
5493 CallRuntime(Runtime::kGetPropertyNamesFast, instr); | 5484 CallRuntime(Runtime::kGetPropertyNamesFast, instr); |
5494 | |
5495 __ lw(a1, FieldMemOperand(v0, HeapObject::kMapOffset)); | |
5496 DCHECK(result.is(v0)); | |
5497 __ LoadRoot(at, Heap::kMetaMapRootIndex); | |
5498 DeoptimizeIf(ne, instr, Deoptimizer::kWrongMap, a1, Operand(at)); | |
5499 __ bind(&use_cache); | 5485 __ bind(&use_cache); |
5500 } | 5486 } |
5501 | 5487 |
5502 | 5488 |
5503 void LCodeGen::DoForInCacheArray(LForInCacheArray* instr) { | 5489 void LCodeGen::DoForInCacheArray(LForInCacheArray* instr) { |
5504 Register map = ToRegister(instr->map()); | 5490 Register map = ToRegister(instr->map()); |
5505 Register result = ToRegister(instr->result()); | 5491 Register result = ToRegister(instr->result()); |
5506 Label load_cache, done; | 5492 Label load_cache, done; |
5507 __ EnumLength(result, map); | 5493 __ EnumLength(result, map); |
5508 __ Branch(&load_cache, ne, result, Operand(Smi::FromInt(0))); | 5494 __ Branch(&load_cache, ne, result, Operand(Smi::FromInt(0))); |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5616 __ Push(at, ToRegister(instr->function())); | 5602 __ Push(at, ToRegister(instr->function())); |
5617 CallRuntime(Runtime::kPushBlockContext, instr); | 5603 CallRuntime(Runtime::kPushBlockContext, instr); |
5618 RecordSafepoint(Safepoint::kNoLazyDeopt); | 5604 RecordSafepoint(Safepoint::kNoLazyDeopt); |
5619 } | 5605 } |
5620 | 5606 |
5621 | 5607 |
5622 #undef __ | 5608 #undef __ |
5623 | 5609 |
5624 } // namespace internal | 5610 } // namespace internal |
5625 } // namespace v8 | 5611 } // namespace v8 |
OLD | NEW |