Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1119)

Unified Diff: src/runtime/runtime-classes.cc

Issue 1235883002: [strong] Strong classes can't extend null (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: cl feedback Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/runtime/runtime.h ('k') | test/mjsunit/strong/class-extend-null.js » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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;
}
« no previous file with comments | « src/runtime/runtime.h ('k') | test/mjsunit/strong/class-extend-null.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698