Chromium Code Reviews| Index: src/runtime/runtime-function.cc |
| diff --git a/src/runtime/runtime-function.cc b/src/runtime/runtime-function.cc |
| index f994ee336561a3c51da186de4783480b75bf0a92..7221cd660c060ffbd8ac91f3e1943574143159d5 100644 |
| --- a/src/runtime/runtime-function.cc |
| +++ b/src/runtime/runtime-function.cc |
| @@ -47,12 +47,40 @@ RUNTIME_FUNCTION(Runtime_FunctionNameShouldPrintAsAnonymous) { |
| } |
| -RUNTIME_FUNCTION(Runtime_FunctionMarkNameShouldPrintAsAnonymous) { |
| +RUNTIME_FUNCTION(Runtime_CompleteFunctionConstruction) { |
| SealHandleScope shs(isolate); |
| - DCHECK(args.length() == 1); |
| - CONVERT_ARG_CHECKED(JSFunction, f, 0); |
| - f->shared()->set_name_should_print_as_anonymous(true); |
| - return isolate->heap()->undefined_value(); |
| + DCHECK(args.length() == 3); |
| + CONVERT_ARG_HANDLE_CHECKED(JSFunction, func, 0); |
| + CONVERT_ARG_HANDLE_CHECKED(JSFunction, constructor, 1); |
| + CONVERT_ARG_HANDLE_CHECKED(Object, new_target, 2); |
| + func->shared()->set_name_should_print_as_anonymous(true); |
| + |
| + // 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 (!new_target->IsJSFunction() || *constructor == *new_target) { |
|
Toon Verwaest
2015/10/30 10:58:01
new_target->IsUndefined() ?
Igor Sheludko
2015/10/30 11:08:57
Done.
|
| + return *func; |
| + } |
| + |
| + // Create a new JSFunction object with correct initial map. |
| + HandleScope handle_scope(isolate); |
| + Handle<JSFunction> original_constructor = |
| + Handle<JSFunction>::cast(new_target); |
| + |
| + DCHECK(constructor->has_initial_map()); |
| + Handle<Map> initial_map = |
| + JSFunction::EnsureDerivedHasInitialMap(original_constructor, constructor); |
| + |
| + Handle<SharedFunctionInfo> shared_info(func->shared(), isolate); |
| + Handle<Context> context(func->context(), isolate); |
| + Handle<JSFunction> result = |
| + isolate->factory()->NewFunctionFromSharedFunctionInfo( |
| + initial_map, shared_info, context, NOT_TENURED); |
| + DCHECK_EQ(func->IsConstructor(), result->IsConstructor()); |
| + return *result; |
| } |