Chromium Code Reviews| 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. |
|
adamk
2015/07/17 20:04:01
--harmony-reflect isn't shipping soon, I think you
Michael Starzinger
2015/07/20 09:03:56
I think I am confused about what is shipping and w
Michael Starzinger
2015/07/20 09:14:39
Oh boy, in Genesis::InitializeGlobal_harmony_refle
Michael Starzinger
2015/07/20 09:42:38
Done. I did so on the third patch set.
|
| + 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 |