Chromium Code Reviews| Index: src/ia32/macro-assembler-ia32.cc | 
| diff --git a/src/ia32/macro-assembler-ia32.cc b/src/ia32/macro-assembler-ia32.cc | 
| index 2012a5ad9d304b0c5c3ebb47c5c4c4283b64d4cc..21ba1d154040dc07c93feafc8ade302acdd2b482 100644 | 
| --- a/src/ia32/macro-assembler-ia32.cc | 
| +++ b/src/ia32/macro-assembler-ia32.cc | 
| @@ -669,6 +669,19 @@ void MacroAssembler::AbortIfNotSmi(Register object) { | 
| } | 
| +void MacroAssembler::AbortIfNotFixedArray(Register object) { | 
| + Label ok, fail; | 
| + CheckMap(object, | 
| + isolate()->factory()->fixed_array_map(), | 
| + &fail, | 
| + DONT_DO_SMI_CHECK); | 
| + jmp(&ok); | 
| + bind(&fail); | 
| + Abort("Operand is not a fixed array"); | 
| + bind(&ok); | 
| +} | 
| + | 
| + | 
| void MacroAssembler::AbortIfNotString(Register object) { | 
| test(object, Immediate(kSmiTagMask)); | 
| Assert(not_equal, "Operand is not a string"); | 
| @@ -2518,12 +2531,22 @@ void MacroAssembler::Abort(const char* msg) { | 
| void MacroAssembler::LoadInstanceDescriptors(Register map, | 
| Register descriptors) { | 
| - mov(descriptors, | 
| - FieldOperand(map, Map::kInstanceDescriptorsOrBitField3Offset)); | 
| - Label not_smi; | 
| - JumpIfNotSmi(descriptors, ¬_smi); | 
| + mov(descriptors, FieldOperand(map, | 
| + Map::kInstanceDescriptorsOrBackPointerOffset)); | 
| + | 
| + Label ok, fail; | 
| + CheckMap(descriptors, | 
| + isolate()->factory()->fixed_array_map(), | 
| + &fail, | 
| + DONT_DO_SMI_CHECK); | 
| + jmp(&ok); | 
| + bind(&fail); | 
| mov(descriptors, isolate()->factory()->empty_descriptor_array()); | 
| - bind(¬_smi); | 
| + bind(&ok); | 
| + | 
| + if (emit_debug_code()) { | 
| + AbortIfNotFixedArray(descriptors); | 
| 
 
Jakob Kummerow
2012/07/10 12:26:25
This check is pretty pointless, don't you think? Y
 
Toon Verwaest
2012/07/10 13:28:28
Done.
 
Toon Verwaest
2012/07/10 13:28:28
Done.
 
 | 
| + } | 
| } | 
| @@ -2886,8 +2909,15 @@ void MacroAssembler::CheckEnumCache(Label* call_runtime) { | 
| // check for an enum cache. Leave the map in ebx for the subsequent | 
| // prototype load. | 
| mov(ebx, FieldOperand(ecx, HeapObject::kMapOffset)); | 
| - mov(edx, FieldOperand(ebx, Map::kInstanceDescriptorsOrBitField3Offset)); | 
| - JumpIfSmi(edx, call_runtime); | 
| + mov(edx, FieldOperand(ebx, Map::kInstanceDescriptorsOrBackPointerOffset)); | 
| + CheckMap(edx, | 
| + isolate()->factory()->fixed_array_map(), | 
| + call_runtime, | 
| + DONT_DO_SMI_CHECK); | 
| + | 
| + if (emit_debug_code()) { | 
| + AbortIfNotFixedArray(edx); | 
| 
 
Jakob Kummerow
2012/07/10 12:26:25
This check is entirely pointless. We just did a ma
 
Toon Verwaest
2012/07/10 13:28:28
Done.
 
Toon Verwaest
2012/07/10 13:28:28
Done.
 
 | 
| + } | 
| // Check that there is an enum cache in the non-empty instance | 
| // descriptors (edx). This is the case if the next enumeration |