Index: src/runtime/runtime-function.cc |
diff --git a/src/runtime/runtime-function.cc b/src/runtime/runtime-function.cc |
index df717842636b25f37ac942aa1b288534039ea04f..936aebdd1f543104df433598e2ae07731d161f8e 100644 |
--- a/src/runtime/runtime-function.cc |
+++ b/src/runtime/runtime-function.cc |
@@ -55,25 +55,26 @@ RUNTIME_FUNCTION(Runtime_CompleteFunctionConstruction) { |
CONVERT_ARG_HANDLE_CHECKED(Object, unchecked_new_target, 2); |
func->shared()->set_name_should_print_as_anonymous(true); |
+ if (unchecked_new_target->IsUndefined()) return *func; |
+ |
+ Handle<JSReceiver> new_target = |
+ Handle<JSReceiver>::cast(unchecked_new_target); |
// If new.target is equal to |constructor| then the function |func| created |
// is already correctly setup and nothing else should be done here. |
// But if new.target is not equal to |constructor| then we are have a |
// Function builtin subclassing case and therefore the function |func| |
// has wrong initial map. To fix that we create a new function object with |
// correct initial map. |
- if (unchecked_new_target->IsUndefined() || |
- *constructor == *unchecked_new_target) { |
- return *func; |
- } |
+ if (*constructor == *new_target) return *func; |
// Create a new JSFunction object with correct initial map. |
HandleScope handle_scope(isolate); |
- Handle<JSFunction> new_target = |
- Handle<JSFunction>::cast(unchecked_new_target); |
DCHECK(constructor->has_initial_map()); |
- Handle<Map> initial_map = |
- JSFunction::EnsureDerivedHasInitialMap(new_target, constructor); |
+ Handle<Map> initial_map; |
+ ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
+ isolate, initial_map, |
+ JSFunction::GetDerivedMap(isolate, constructor, new_target)); |
Handle<SharedFunctionInfo> shared_info(func->shared(), isolate); |
Handle<Context> context(func->context(), isolate); |