Index: src/arm64/macro-assembler-arm64.cc |
diff --git a/src/arm64/macro-assembler-arm64.cc b/src/arm64/macro-assembler-arm64.cc |
index ff5efd531bdd90a3dda059d39fa9139a4a1bc23d..083f7747e8426bdd0db2c10e97fbe2c18d04b9ca 100644 |
--- a/src/arm64/macro-assembler-arm64.cc |
+++ b/src/arm64/macro-assembler-arm64.cc |
@@ -3816,13 +3816,14 @@ void MacroAssembler::TryGetFunctionPrototype(Register function, |
BoundFunctionAction action) { |
ASSERT(!AreAliased(function, result, scratch)); |
- // Check that the receiver isn't a smi. |
- JumpIfSmi(function, miss); |
+ Label non_instance; |
+ if (action == kMissOnBoundFunction) { |
+ // Check that the receiver isn't a smi. |
+ JumpIfSmi(function, miss); |
- // Check that the function really is a function. Load map into result reg. |
- JumpIfNotObjectType(function, result, scratch, JS_FUNCTION_TYPE, miss); |
+ // Check that the function really is a function. Load map into result reg. |
+ JumpIfNotObjectType(function, result, scratch, JS_FUNCTION_TYPE, miss); |
- if (action == kMissOnBoundFunction) { |
Register scratch_w = scratch.W(); |
Ldr(scratch, |
FieldMemOperand(function, JSFunction::kSharedFunctionInfoOffset)); |
@@ -3831,12 +3832,11 @@ void MacroAssembler::TryGetFunctionPrototype(Register function, |
Ldr(scratch_w, |
FieldMemOperand(scratch, SharedFunctionInfo::kCompilerHintsOffset)); |
Tbnz(scratch, SharedFunctionInfo::kBoundFunction, miss); |
- } |
- // Make sure that the function has an instance prototype. |
- Label non_instance; |
- Ldrb(scratch, FieldMemOperand(result, Map::kBitFieldOffset)); |
- Tbnz(scratch, Map::kHasNonInstancePrototype, &non_instance); |
+ // Make sure that the function has an instance prototype. |
+ Ldrb(scratch, FieldMemOperand(result, Map::kBitFieldOffset)); |
+ Tbnz(scratch, Map::kHasNonInstancePrototype, &non_instance); |
+ } |
// Get the prototype or initial map from the function. |
Ldr(result, |
@@ -3853,12 +3853,15 @@ void MacroAssembler::TryGetFunctionPrototype(Register function, |
// Get the prototype from the initial map. |
Ldr(result, FieldMemOperand(result, Map::kPrototypeOffset)); |
- B(&done); |
- // Non-instance prototype: fetch prototype from constructor field in initial |
- // map. |
- Bind(&non_instance); |
- Ldr(result, FieldMemOperand(result, Map::kConstructorOffset)); |
+ if (action == kMissOnBoundFunction) { |
+ B(&done); |
+ |
+ // Non-instance prototype: fetch prototype from constructor field in initial |
+ // map. |
+ Bind(&non_instance); |
+ Ldr(result, FieldMemOperand(result, Map::kConstructorOffset)); |
+ } |
// All done. |
Bind(&done); |