| Index: src/arm64/builtins-arm64.cc
 | 
| diff --git a/src/arm64/builtins-arm64.cc b/src/arm64/builtins-arm64.cc
 | 
| index 278ebf7e77976897671ebfbaf32765ee22ffa14a..f7ea89d8074f8ddcb2833e5aab6ea6898bed2368 100644
 | 
| --- a/src/arm64/builtins-arm64.cc
 | 
| +++ b/src/arm64/builtins-arm64.cc
 | 
| @@ -390,18 +390,25 @@ 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(original_constructor, x10, x11, JS_FUNCTION_TYPE,
 | 
| +                             &rt_call);
 | 
|  
 | 
|        // 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 +431,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));
 | 
| 
 |