| Index: src/runtime/runtime-classes.cc | 
| diff --git a/src/runtime/runtime-classes.cc b/src/runtime/runtime-classes.cc | 
| index 97a19c1bc78ac84f1aadb2dcd55efee343725a7c..159614875e2fe0ab10ad3a843b4b651c846c2810 100644 | 
| --- a/src/runtime/runtime-classes.cc | 
| +++ b/src/runtime/runtime-classes.cc | 
| @@ -93,16 +93,11 @@ RUNTIME_FUNCTION(Runtime_HomeObjectSymbol) { | 
| } | 
|  | 
|  | 
| -RUNTIME_FUNCTION(Runtime_DefineClass) { | 
| -  HandleScope scope(isolate); | 
| -  DCHECK(args.length() == 6); | 
| -  CONVERT_ARG_HANDLE_CHECKED(Object, name, 0); | 
| -  CONVERT_ARG_HANDLE_CHECKED(Object, super_class, 1); | 
| -  CONVERT_ARG_HANDLE_CHECKED(JSFunction, constructor, 2); | 
| -  CONVERT_ARG_HANDLE_CHECKED(Script, script, 3); | 
| -  CONVERT_SMI_ARG_CHECKED(start_position, 4); | 
| -  CONVERT_SMI_ARG_CHECKED(end_position, 5); | 
| - | 
| +static MaybeHandle<Object> DefineClass(Isolate* isolate, Handle<Object> name, | 
| +                                       Handle<Object> super_class, | 
| +                                       Handle<JSFunction> constructor, | 
| +                                       Handle<Script> script, | 
| +                                       int start_position, int end_position) { | 
| Handle<Object> prototype_parent; | 
| Handle<Object> constructor_parent; | 
|  | 
| @@ -113,26 +108,30 @@ RUNTIME_FUNCTION(Runtime_DefineClass) { | 
| prototype_parent = isolate->factory()->null_value(); | 
| } else if (super_class->IsSpecFunction()) { | 
| if (Handle<JSFunction>::cast(super_class)->shared()->is_generator()) { | 
| -        THROW_NEW_ERROR_RETURN_FAILURE( | 
| +        THROW_NEW_ERROR( | 
| isolate, | 
| -            NewTypeError(MessageTemplate::kExtendsValueGenerator, super_class)); | 
| +            NewTypeError(MessageTemplate::kExtendsValueGenerator, super_class), | 
| +            Object); | 
| } | 
| -      ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 
| +      ASSIGN_RETURN_ON_EXCEPTION( | 
| isolate, prototype_parent, | 
| Runtime::GetObjectProperty(isolate, super_class, | 
| isolate->factory()->prototype_string(), | 
| -                                     SLOPPY)); | 
| +                                     SLOPPY), | 
| +          Object); | 
| if (!prototype_parent->IsNull() && !prototype_parent->IsSpecObject()) { | 
| -        THROW_NEW_ERROR_RETURN_FAILURE( | 
| +        THROW_NEW_ERROR( | 
| isolate, NewTypeError(MessageTemplate::kPrototypeParentNotAnObject, | 
| -                                  prototype_parent)); | 
| +                                  prototype_parent), | 
| +            Object); | 
| } | 
| constructor_parent = super_class; | 
| } else { | 
| // TODO(arv): Should be IsConstructor. | 
| -      THROW_NEW_ERROR_RETURN_FAILURE( | 
| +      THROW_NEW_ERROR( | 
| isolate, | 
| -          NewTypeError(MessageTemplate::kExtendsValueNotFunction, super_class)); | 
| +          NewTypeError(MessageTemplate::kExtendsValueNotFunction, super_class), | 
| +          Object); | 
| } | 
| } | 
|  | 
| @@ -155,42 +154,88 @@ RUNTIME_FUNCTION(Runtime_DefineClass) { | 
| JSFunction::SetPrototype(constructor, prototype); | 
| PropertyAttributes attribs = | 
| static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY); | 
| -  RETURN_FAILURE_ON_EXCEPTION( | 
| -      isolate, JSObject::SetOwnPropertyIgnoreAttributes( | 
| -                   constructor, isolate->factory()->prototype_string(), | 
| -                   prototype, attribs)); | 
| +  RETURN_ON_EXCEPTION(isolate, | 
| +                      JSObject::SetOwnPropertyIgnoreAttributes( | 
| +                          constructor, isolate->factory()->prototype_string(), | 
| +                          prototype, attribs), | 
| +                      Object); | 
|  | 
| // TODO(arv): Only do this conditionally. | 
| Handle<Symbol> home_object_symbol(isolate->heap()->home_object_symbol()); | 
| -  RETURN_FAILURE_ON_EXCEPTION( | 
| +  RETURN_ON_EXCEPTION( | 
| isolate, JSObject::SetOwnPropertyIgnoreAttributes( | 
| -                   constructor, home_object_symbol, prototype, DONT_ENUM)); | 
| +                   constructor, home_object_symbol, prototype, DONT_ENUM), | 
| +      Object); | 
|  | 
| if (!constructor_parent.is_null()) { | 
| -    RETURN_FAILURE_ON_EXCEPTION( | 
| -        isolate, | 
| -        JSObject::SetPrototype(constructor, constructor_parent, false)); | 
| +    RETURN_ON_EXCEPTION( | 
| +        isolate, JSObject::SetPrototype(constructor, constructor_parent, false), | 
| +        Object); | 
| } | 
|  | 
| JSObject::AddProperty(prototype, isolate->factory()->constructor_string(), | 
| constructor, DONT_ENUM); | 
|  | 
| // Install private properties that are used to construct the FunctionToString. | 
| -  RETURN_FAILURE_ON_EXCEPTION( | 
| +  RETURN_ON_EXCEPTION( | 
| isolate, Object::SetProperty(constructor, | 
| isolate->factory()->class_script_symbol(), | 
| -                                   script, STRICT)); | 
| -  RETURN_FAILURE_ON_EXCEPTION( | 
| +                                   script, STRICT), | 
| +      Object); | 
| +  RETURN_ON_EXCEPTION( | 
| isolate, | 
| Object::SetProperty( | 
| constructor, isolate->factory()->class_start_position_symbol(), | 
| -          handle(Smi::FromInt(start_position), isolate), STRICT)); | 
| -  RETURN_FAILURE_ON_EXCEPTION( | 
| +          handle(Smi::FromInt(start_position), isolate), STRICT), | 
| +      Object); | 
| +  RETURN_ON_EXCEPTION( | 
| isolate, Object::SetProperty( | 
| constructor, isolate->factory()->class_end_position_symbol(), | 
| -                   handle(Smi::FromInt(end_position), isolate), STRICT)); | 
| +                   handle(Smi::FromInt(end_position), isolate), STRICT), | 
| +      Object); | 
| + | 
| +  return constructor; | 
| +} | 
| + | 
| + | 
| +RUNTIME_FUNCTION(Runtime_DefineClass) { | 
| +  HandleScope scope(isolate); | 
| +  DCHECK(args.length() == 6); | 
| +  CONVERT_ARG_HANDLE_CHECKED(Object, name, 0); | 
| +  CONVERT_ARG_HANDLE_CHECKED(Object, super_class, 1); | 
| +  CONVERT_ARG_HANDLE_CHECKED(JSFunction, constructor, 2); | 
| +  CONVERT_ARG_HANDLE_CHECKED(Script, script, 3); | 
| +  CONVERT_SMI_ARG_CHECKED(start_position, 4); | 
| +  CONVERT_SMI_ARG_CHECKED(end_position, 5); | 
| + | 
| +  Handle<Object> result; | 
| +  ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 
| +      isolate, result, DefineClass(isolate, name, super_class, constructor, | 
| +                                   script, start_position, end_position)); | 
| +  return *result; | 
| +} | 
| + | 
| + | 
| +RUNTIME_FUNCTION(Runtime_DefineClassStrong) { | 
| +  HandleScope scope(isolate); | 
| +  DCHECK(args.length() == 6); | 
| +  CONVERT_ARG_HANDLE_CHECKED(Object, name, 0); | 
| +  CONVERT_ARG_HANDLE_CHECKED(Object, super_class, 1); | 
| +  CONVERT_ARG_HANDLE_CHECKED(JSFunction, constructor, 2); | 
| +  CONVERT_ARG_HANDLE_CHECKED(Script, script, 3); | 
| +  CONVERT_SMI_ARG_CHECKED(start_position, 4); | 
| +  CONVERT_SMI_ARG_CHECKED(end_position, 5); | 
|  | 
| -  return *constructor; | 
| +  if (super_class->IsNull()) { | 
| +    THROW_NEW_ERROR_RETURN_FAILURE( | 
| +        isolate, NewTypeError(MessageTemplate::kStrongExtendNull)); | 
| +  } | 
| + | 
| +  Handle<Object> result; | 
| +  ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 
| +      isolate, result, DefineClass(isolate, name, super_class, constructor, | 
| +                                   script, start_position, end_position)); | 
| +  return *result; | 
| } | 
|  | 
|  | 
|  |