| Index: src/runtime/runtime-classes.cc
|
| diff --git a/src/runtime/runtime-classes.cc b/src/runtime/runtime-classes.cc
|
| index 357a0934d9d4c099ca8ab426e79be5703faed311..cbbec4f90658a00d1d79411d1319d9d11dd1ee55 100644
|
| --- a/src/runtime/runtime-classes.cc
|
| +++ b/src/runtime/runtime-classes.cc
|
| @@ -27,7 +27,6 @@ RUNTIME_FUNCTION(Runtime_ThrowNonMethodError) {
|
| isolate, NewReferenceError(MessageTemplate::kNonMethod));
|
| }
|
|
|
| -
|
| RUNTIME_FUNCTION(Runtime_ThrowUnsupportedSuperError) {
|
| HandleScope scope(isolate);
|
| DCHECK(args.length() == 0);
|
| @@ -60,6 +59,47 @@ RUNTIME_FUNCTION(Runtime_ThrowStaticPrototypeError) {
|
| isolate, NewTypeError(MessageTemplate::kStaticPrototype));
|
| }
|
|
|
| +namespace {
|
| +
|
| +Object* ThrowNotSuperConstructor(Isolate* isolate, Handle<Object> constructor,
|
| + Handle<JSFunction> function) {
|
| + Handle<Object> super_name;
|
| + if (constructor->IsJSFunction()) {
|
| + super_name = handle(Handle<JSFunction>::cast(constructor)->shared()->name(),
|
| + isolate);
|
| + } else if (constructor->IsOddball()) {
|
| + DCHECK(constructor->IsNull(isolate));
|
| + super_name = isolate->factory()->null_string();
|
| + } else {
|
| + super_name = Object::NoSideEffectsToString(isolate, constructor);
|
| + }
|
| + // null constructor
|
| + if (Handle<String>::cast(super_name)->length() == 0) {
|
| + super_name = isolate->factory()->null_string();
|
| + }
|
| + Handle<Object> function_name(function->shared()->name(), isolate);
|
| + // anonymous class
|
| + if (Handle<String>::cast(function_name)->length() == 0) {
|
| + THROW_NEW_ERROR_RETURN_FAILURE(
|
| + isolate,
|
| + NewTypeError(MessageTemplate::kNotSuperConstructorAnonymousClass,
|
| + super_name));
|
| + }
|
| + THROW_NEW_ERROR_RETURN_FAILURE(
|
| + isolate, NewTypeError(MessageTemplate::kNotSuperConstructor, super_name,
|
| + function_name));
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +RUNTIME_FUNCTION(Runtime_ThrowNotSuperConstructor) {
|
| + HandleScope scope(isolate);
|
| + DCHECK(args.length() == 2);
|
| + CONVERT_ARG_HANDLE_CHECKED(Object, constructor, 0);
|
| + CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 1);
|
| + return ThrowNotSuperConstructor(isolate, constructor, function);
|
| +}
|
| +
|
| RUNTIME_FUNCTION(Runtime_HomeObjectSymbol) {
|
| DCHECK(args.length() == 0);
|
| return isolate->heap()->home_object_symbol();
|
| @@ -422,8 +462,14 @@ RUNTIME_FUNCTION(Runtime_StoreKeyedToSuper_Sloppy) {
|
| RUNTIME_FUNCTION(Runtime_GetSuperConstructor) {
|
| SealHandleScope shs(isolate);
|
| DCHECK_EQ(1, args.length());
|
| - CONVERT_ARG_CHECKED(JSFunction, active_function, 0);
|
| - return active_function->map()->prototype();
|
| + CONVERT_ARG_HANDLE_CHECKED(JSFunction, active_function, 0);
|
| + Object* prototype = active_function->map()->prototype();
|
| + if (!prototype->IsConstructor()) {
|
| + return ThrowNotSuperConstructor(
|
| + isolate, Handle<JSFunction>::cast(handle(prototype, isolate)),
|
| + active_function);
|
| + }
|
| + return prototype;
|
| }
|
|
|
| RUNTIME_FUNCTION(Runtime_NewWithSpread) {
|
|
|