Chromium Code Reviews| Index: src/arm64/builtins-arm64.cc |
| diff --git a/src/arm64/builtins-arm64.cc b/src/arm64/builtins-arm64.cc |
| index 278ebf7e77976897671ebfbaf32765ee22ffa14a..f162186116a269399a27ee6702a18df342a4572a 100644 |
| --- a/src/arm64/builtins-arm64.cc |
| +++ b/src/arm64/builtins-arm64.cc |
| @@ -390,18 +390,24 @@ static void Generate_JSConstructStubHelper(MacroAssembler* masm, |
| __ Ldr(x2, MemOperand(x2)); |
| __ Cbnz(x2, &rt_call); |
| - // Fall back to runtime if the original constructor and function differ. |
| - __ Cmp(constructor, original_constructor); |
| - __ B(ne, &rt_call); |
| + // Verify that the original constructor is a JSFunction. |
| + __ JumpIfNotObjectType(x3, x10, x11, JS_FUNCTION_TYPE, &rt_call); |
|
Igor Sheludko
2015/11/10 08:08:53
x3 -> original_constructor
Toon Verwaest
2015/11/10 08:13:04
Done.
|
| // Load the initial map and verify that it is in fact a map. |
| Register init_map = x2; |
| __ Ldr(init_map, |
| - FieldMemOperand(constructor, |
| + FieldMemOperand(original_constructor, |
| JSFunction::kPrototypeOrInitialMapOffset)); |
| __ JumpIfSmi(init_map, &rt_call); |
| __ JumpIfNotObjectType(init_map, x10, x11, MAP_TYPE, &rt_call); |
| + // Fall back to runtime if the expected base constructor and base |
| + // constructor differ. |
| + __ Ldr(x10, |
| + FieldMemOperand(init_map, Map::kConstructorOrBackPointerOffset)); |
| + __ Cmp(constructor, x10); |
| + __ B(ne, &rt_call); |
| + |
| // Check that the constructor is not constructing a JSFunction (see |
| // comments in Runtime_NewObject in runtime.cc). In which case the initial |
| // map's instance type would be JS_FUNCTION_TYPE. |
| @@ -424,9 +430,9 @@ static void Generate_JSConstructStubHelper(MacroAssembler* masm, |
| __ Cmp(constructon_count, Operand(Map::kSlackTrackingCounterEnd)); |
| __ B(ne, &allocate); |
| - // Push the constructor and map to the stack, and the constructor again |
| + // Push the constructor and map to the stack, and the map again |
| // as argument to the runtime call. |
| - __ Push(constructor, init_map, constructor); |
| + __ Push(constructor, init_map, init_map); |
| __ CallRuntime(Runtime::kFinalizeInstanceSize, 1); |
| __ Pop(init_map, constructor); |
| __ Mov(constructon_count, Operand(Map::kSlackTrackingCounterEnd - 1)); |