Index: src/stub-cache-ia32.cc |
=================================================================== |
--- src/stub-cache-ia32.cc (revision 469) |
+++ src/stub-cache-ia32.cc (working copy) |
@@ -232,52 +232,10 @@ |
Register scratch1, |
Register scratch2, |
Label* miss_label) { |
- // Check that the receiver isn't a smi. |
- __ test(receiver, Immediate(kSmiTagMask)); |
- __ j(zero, miss_label, not_taken); |
- // Check that the receiver is a function. |
- __ mov(scratch1, FieldOperand(receiver, HeapObject::kMapOffset)); |
- __ movzx_b(scratch2, FieldOperand(scratch1, Map::kInstanceTypeOffset)); |
- __ cmp(scratch2, JS_FUNCTION_TYPE); |
- __ j(not_equal, miss_label, not_taken); |
- |
- // Make sure that the function has an instance prototype. |
- Label non_instance; |
- __ movzx_b(scratch2, FieldOperand(scratch1, Map::kBitFieldOffset)); |
- __ test(scratch2, Immediate(1 << Map::kHasNonInstancePrototype)); |
- __ j(not_zero, &non_instance, not_taken); |
- |
- // Get the prototype or initial map from the function. |
- __ mov(scratch1, |
- FieldOperand(receiver, JSFunction::kPrototypeOrInitialMapOffset)); |
- |
- // If the prototype or initial map is the hole, don't return it and |
- // simply miss the cache instead. This will allow us to allocate a |
- // prototype object on-demand in the runtime system. |
- __ cmp(Operand(scratch1), Immediate(Factory::the_hole_value())); |
- __ j(equal, miss_label, not_taken); |
+ __ TryGetFunctionPrototype(receiver, scratch1, scratch2, miss_label); |
__ mov(eax, Operand(scratch1)); |
- |
- // If the function does not have an initial map, we're done. |
- Label done; |
- __ mov(scratch1, FieldOperand(eax, HeapObject::kMapOffset)); |
- __ movzx_b(scratch2, FieldOperand(scratch1, Map::kInstanceTypeOffset)); |
- __ cmp(scratch2, MAP_TYPE); |
- __ j(not_equal, &done); |
- |
- // Get the prototype from the initial map. |
- __ mov(eax, FieldOperand(eax, Map::kPrototypeOffset)); |
- |
- // All done: Return the prototype. |
- __ bind(&done); |
__ ret(0); |
- |
- // Non-instance prototype: Fetch prototype from constructor field |
- // in initial map. |
- __ bind(&non_instance); |
- __ mov(eax, FieldOperand(scratch1, Map::kConstructorOffset)); |
- __ ret(0); |
} |