Reviewers: Benedikt Meurer, rossberg,

Description:
Do not save script object on the class constructor.

We don't need it, as we can grab it from the shared function info.
Having it triggers an assertion if we define classes in native JS.

[email protected], [email protected]

Please review this at https://codereview.chromium.org/1290703002/

Base URL: https://chromium.googlesource.com/v8/v8.git@master

Affected files (+21, -44 lines):
  M src/compiler/ast-graph-builder.cc
  M src/full-codegen/full-codegen.cc
  M src/heap/heap.h
  M src/runtime/runtime.h
  M src/runtime/runtime-classes.cc


Index: src/compiler/ast-graph-builder.cc
diff --git a/src/compiler/ast-graph-builder.cc b/src/compiler/ast-graph-builder.cc index a9825cf40022b59790224aa19775d5b595b772ec..2b792be89472ed2c5b8715ec286fd4ecf2101d30 100644
--- a/src/compiler/ast-graph-builder.cc
+++ b/src/compiler/ast-graph-builder.cc
@@ -1562,14 +1562,13 @@ void AstGraphBuilder::VisitClassLiteralContents(ClassLiteral* expr) {
   Node* constructor = environment()->Pop();
   Node* extends = environment()->Pop();
   Node* name = environment()->Pop();
-  Node* script = jsgraph()->Constant(info()->script());
   Node* start = jsgraph()->Constant(expr->start_position());
   Node* end = jsgraph()->Constant(expr->end_position());
   const Operator* opc = javascript()->CallRuntime(
       is_strong(language_mode()) ? Runtime::kDefineClassStrong
                                  : Runtime::kDefineClass,
-      6);
- Node* literal = NewNode(opc, name, extends, constructor, script, start, end);
+      5);
+  Node* literal = NewNode(opc, name, extends, constructor, start, end);
   PrepareFrameState(literal, expr->CreateLiteralId(),
                     OutputFrameStateCombine::Push());

Index: src/full-codegen/full-codegen.cc
diff --git a/src/full-codegen/full-codegen.cc b/src/full-codegen/full-codegen.cc index 4c7df3fe4890e669ab478a8bd95eadb7346dbbb2..ee93ec882103b24204031588209d117468838531 100644
--- a/src/full-codegen/full-codegen.cc
+++ b/src/full-codegen/full-codegen.cc
@@ -1295,13 +1295,12 @@ void FullCodeGenerator::VisitClassLiteral(ClassLiteral* lit) {

     VisitForStackValue(lit->constructor());

-    __ Push(script());
     __ Push(Smi::FromInt(lit->start_position()));
     __ Push(Smi::FromInt(lit->end_position()));

     __ CallRuntime(is_strong(language_mode()) ? Runtime::kDefineClassStrong
                                               : Runtime::kDefineClass,
-                   6);
+                   5);
     PrepareForBailoutForId(lit->CreateLiteralId(), TOS_REG);

     int store_slot_index = 0;
Index: src/heap/heap.h
diff --git a/src/heap/heap.h b/src/heap/heap.h
index 982eddbfb4fcab637cac31b6a82a1609dd172b44..162849414bb449d08f63ea44f3f1fb2f3ec94604 100644
--- a/src/heap/heap.h
+++ b/src/heap/heap.h
@@ -317,7 +317,6 @@ namespace internal {
   V(intl_impl_object_symbol)        \
   V(promise_debug_marker_symbol)    \
   V(promise_has_handler_symbol)     \
-  V(class_script_symbol)            \
   V(class_start_position_symbol)    \
   V(class_end_position_symbol)      \
   V(error_start_pos_symbol)         \
Index: src/runtime/runtime-classes.cc
diff --git a/src/runtime/runtime-classes.cc b/src/runtime/runtime-classes.cc
index 1b70f05a60d57d0dac197b3d2a4447a413dc7dc5..3db4330cec7d0f2a2e1f857b872d39f9164f805f 100644
--- a/src/runtime/runtime-classes.cc
+++ b/src/runtime/runtime-classes.cc
@@ -97,7 +97,6 @@ RUNTIME_FUNCTION(Runtime_HomeObjectSymbol) {
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;
@@ -182,11 +181,6 @@ static MaybeHandle<Object> DefineClass(Isolate* isolate, Handle<Object> name,

// Install private properties that are used to construct the FunctionToString.
   RETURN_ON_EXCEPTION(
-      isolate, Object::SetProperty(constructor,
- isolate->factory()->class_script_symbol(),
-                                   script, STRICT),
-      Object);
-  RETURN_ON_EXCEPTION(
       isolate,
       Object::SetProperty(
           constructor, isolate->factory()->class_start_position_symbol(),
@@ -204,31 +198,29 @@ static MaybeHandle<Object> DefineClass(Isolate* isolate, Handle<Object> name,

 RUNTIME_FUNCTION(Runtime_DefineClass) {
   HandleScope scope(isolate);
-  DCHECK(args.length() == 6);
+  DCHECK(args.length() == 5);
   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);
+  CONVERT_SMI_ARG_CHECKED(start_position, 3);
+  CONVERT_SMI_ARG_CHECKED(end_position, 4);

   Handle<Object> result;
   ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
       isolate, result, DefineClass(isolate, name, super_class, constructor,
-                                   script, start_position, end_position));
+                                   start_position, end_position));
   return *result;
 }


 RUNTIME_FUNCTION(Runtime_DefineClassStrong) {
   HandleScope scope(isolate);
-  DCHECK(args.length() == 6);
+  DCHECK(args.length() == 5);
   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);
+  CONVERT_SMI_ARG_CHECKED(start_position, 3);
+  CONVERT_SMI_ARG_CHECKED(end_position, 4);

   if (super_class->IsNull()) {
     THROW_NEW_ERROR_RETURN_FAILURE(
@@ -238,7 +230,7 @@ RUNTIME_FUNCTION(Runtime_DefineClassStrong) {
   Handle<Object> result;
   ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
       isolate, result, DefineClass(isolate, name, super_class, constructor,
-                                   script, start_position, end_position));
+                                   start_position, end_position));
   return *result;
 }

@@ -283,32 +275,20 @@ RUNTIME_FUNCTION(Runtime_ClassGetSourceCode) {
   DCHECK(args.length() == 1);
   CONVERT_ARG_HANDLE_CHECKED(JSFunction, fun, 0);

-  Handle<Object> script;
-  ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
-      isolate, script,
-      Object::GetProperty(fun, isolate->factory()->class_script_symbol()));
-  if (!script->IsScript()) {
-    return isolate->heap()->undefined_value();
-  }
-
   Handle<Symbol> start_position_symbol(
       isolate->heap()->class_start_position_symbol());
-  Handle<Object> start_position;
-  ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
- isolate, start_position, Object::GetProperty(fun, start_position_symbol));
+  Handle<Object> start_position =
+      JSReceiver::GetDataProperty(fun, start_position_symbol);
+  if (!start_position->IsSmi()) return isolate->heap()->undefined_value();

   Handle<Symbol> end_position_symbol(
       isolate->heap()->class_end_position_symbol());
-  Handle<Object> end_position;
-  ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
- isolate, end_position, Object::GetProperty(fun, end_position_symbol));
-
-  if (!start_position->IsSmi() || !end_position->IsSmi() ||
-      !Handle<Script>::cast(script)->HasValidSource()) {
-    return isolate->ThrowIllegalOperation();
-  }
+  Handle<Object> end_position =
+      JSReceiver::GetDataProperty(fun, end_position_symbol);
+  CHECK(end_position->IsSmi());

- Handle<String> source(String::cast(Handle<Script>::cast(script)->source()));
+  Handle<String> source(
+      String::cast(Script::cast(fun->shared()->script())->source()));
   return *isolate->factory()->NewSubString(
       source, Handle<Smi>::cast(start_position)->value(),
       Handle<Smi>::cast(end_position)->value());
Index: src/runtime/runtime.h
diff --git a/src/runtime/runtime.h b/src/runtime/runtime.h
index fb6398845eb91743dfdea2495e530772ac1276be..1bc247ceeda4dd2ff757ef2d102374cea29701cb 100644
--- a/src/runtime/runtime.h
+++ b/src/runtime/runtime.h
@@ -82,8 +82,8 @@ namespace internal {
   F(ThrowIfStaticPrototype, 1, 1)             \
   F(ToMethod, 2, 1)                           \
   F(HomeObjectSymbol, 0, 1)                   \
-  F(DefineClass, 6, 1)                        \
-  F(DefineClassStrong, 6, 1)                  \
+  F(DefineClass, 5, 1)                        \
+  F(DefineClassStrong, 5, 1)                  \
   F(FinalizeClassDefinition, 2, 1)            \
   F(DefineClassMethod, 3, 1)                  \
   F(ClassGetSourceCode, 1, 1)                 \


--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
--- You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to