| Index: src/runtime/runtime-classes.cc
|
| diff --git a/src/runtime/runtime-classes.cc b/src/runtime/runtime-classes.cc
|
| index 7b42c1df3877c0b143be460c511b325a4fa0f90b..92df7fe0645d1e4e43017fe68c2ea8e109c0a4a1 100644
|
| --- a/src/runtime/runtime-classes.cc
|
| +++ b/src/runtime/runtime-classes.cc
|
| @@ -521,8 +521,49 @@ RUNTIME_FUNCTION(Runtime_HandleStepInForDerivedConstructors) {
|
|
|
|
|
| RUNTIME_FUNCTION(Runtime_DefaultConstructorCallSuper) {
|
| - UNIMPLEMENTED();
|
| - return nullptr;
|
| + HandleScope scope(isolate);
|
| + DCHECK(args.length() == 2);
|
| + CONVERT_ARG_HANDLE_CHECKED(JSFunction, original_constructor, 0);
|
| + CONVERT_ARG_HANDLE_CHECKED(JSFunction, actual_constructor, 1);
|
| + JavaScriptFrameIterator it(isolate);
|
| +
|
| + // Prepare the callee to the super call. The super constructor is stored as
|
| + // the prototype of the constructor we are currently executing.
|
| + Handle<Object> super_constructor;
|
| + ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
|
| + isolate, super_constructor,
|
| + Runtime::GetPrototype(isolate, actual_constructor));
|
| +
|
| + // Find the frame that holds the actual arguments passed to the function.
|
| + it.AdvanceToArgumentsFrame();
|
| + JavaScriptFrame* frame = it.frame();
|
| +
|
| + // Prepare the array containing all passed arguments.
|
| + int argument_count = frame->GetArgumentsLength();
|
| + Handle<FixedArray> elements =
|
| + isolate->factory()->NewUninitializedFixedArray(argument_count);
|
| + for (int i = 0; i < argument_count; ++i) {
|
| + elements->set(i, frame->GetParameter(i));
|
| + }
|
| + Handle<JSArray> arguments = isolate->factory()->NewJSArrayWithElements(
|
| + elements, FAST_ELEMENTS, argument_count);
|
| +
|
| + // Call $reflectConstruct(<super>, <args>, <new.target>) now.
|
| + Handle<Object> reflect;
|
| + ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
|
| + isolate, reflect,
|
| + Object::GetProperty(isolate,
|
| + handle(isolate->native_context()->builtins()),
|
| + "$reflectConstruct"));
|
| + RUNTIME_ASSERT(reflect->IsJSFunction()); // Depends on --harmony-reflect.
|
| + Handle<Object> argv[] = {super_constructor, arguments, original_constructor};
|
| + Handle<Object> result;
|
| + ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
|
| + isolate, result,
|
| + Execution::Call(isolate, reflect, isolate->factory()->undefined_value(),
|
| + arraysize(argv), argv));
|
| +
|
| + return *result;
|
| }
|
| } // namespace internal
|
| } // namespace v8
|
|
|