Commit abc12df3 authored by yangguo's avatar yangguo Committed by Commit bot

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.

R=bmeurer@chromium.org, rossberg@chromium.org

Review URL: https://codereview.chromium.org/1290703002

Cr-Commit-Position: refs/heads/master@{#30134}
parent d81001cd
...@@ -1562,14 +1562,13 @@ void AstGraphBuilder::VisitClassLiteralContents(ClassLiteral* expr) { ...@@ -1562,14 +1562,13 @@ void AstGraphBuilder::VisitClassLiteralContents(ClassLiteral* expr) {
Node* constructor = environment()->Pop(); Node* constructor = environment()->Pop();
Node* extends = environment()->Pop(); Node* extends = environment()->Pop();
Node* name = environment()->Pop(); Node* name = environment()->Pop();
Node* script = jsgraph()->Constant(info()->script());
Node* start = jsgraph()->Constant(expr->start_position()); Node* start = jsgraph()->Constant(expr->start_position());
Node* end = jsgraph()->Constant(expr->end_position()); Node* end = jsgraph()->Constant(expr->end_position());
const Operator* opc = javascript()->CallRuntime( const Operator* opc = javascript()->CallRuntime(
is_strong(language_mode()) ? Runtime::kDefineClassStrong is_strong(language_mode()) ? Runtime::kDefineClassStrong
: Runtime::kDefineClass, : Runtime::kDefineClass,
6); 5);
Node* literal = NewNode(opc, name, extends, constructor, script, start, end); Node* literal = NewNode(opc, name, extends, constructor, start, end);
PrepareFrameState(literal, expr->CreateLiteralId(), PrepareFrameState(literal, expr->CreateLiteralId(),
OutputFrameStateCombine::Push()); OutputFrameStateCombine::Push());
......
...@@ -1293,13 +1293,12 @@ void FullCodeGenerator::VisitClassLiteral(ClassLiteral* lit) { ...@@ -1293,13 +1293,12 @@ void FullCodeGenerator::VisitClassLiteral(ClassLiteral* lit) {
VisitForStackValue(lit->constructor()); VisitForStackValue(lit->constructor());
__ Push(script());
__ Push(Smi::FromInt(lit->start_position())); __ Push(Smi::FromInt(lit->start_position()));
__ Push(Smi::FromInt(lit->end_position())); __ Push(Smi::FromInt(lit->end_position()));
__ CallRuntime(is_strong(language_mode()) ? Runtime::kDefineClassStrong __ CallRuntime(is_strong(language_mode()) ? Runtime::kDefineClassStrong
: Runtime::kDefineClass, : Runtime::kDefineClass,
6); 5);
PrepareForBailoutForId(lit->CreateLiteralId(), TOS_REG); PrepareForBailoutForId(lit->CreateLiteralId(), TOS_REG);
int store_slot_index = 0; int store_slot_index = 0;
......
...@@ -317,7 +317,6 @@ namespace internal { ...@@ -317,7 +317,6 @@ namespace internal {
V(intl_impl_object_symbol) \ V(intl_impl_object_symbol) \
V(promise_debug_marker_symbol) \ V(promise_debug_marker_symbol) \
V(promise_has_handler_symbol) \ V(promise_has_handler_symbol) \
V(class_script_symbol) \
V(class_start_position_symbol) \ V(class_start_position_symbol) \
V(class_end_position_symbol) \ V(class_end_position_symbol) \
V(error_start_pos_symbol) \ V(error_start_pos_symbol) \
......
...@@ -97,7 +97,6 @@ RUNTIME_FUNCTION(Runtime_HomeObjectSymbol) { ...@@ -97,7 +97,6 @@ RUNTIME_FUNCTION(Runtime_HomeObjectSymbol) {
static MaybeHandle<Object> DefineClass(Isolate* isolate, Handle<Object> name, static MaybeHandle<Object> DefineClass(Isolate* isolate, Handle<Object> name,
Handle<Object> super_class, Handle<Object> super_class,
Handle<JSFunction> constructor, Handle<JSFunction> constructor,
Handle<Script> script,
int start_position, int end_position) { int start_position, int end_position) {
Handle<Object> prototype_parent; Handle<Object> prototype_parent;
Handle<Object> constructor_parent; Handle<Object> constructor_parent;
...@@ -181,11 +180,6 @@ static MaybeHandle<Object> DefineClass(Isolate* isolate, Handle<Object> name, ...@@ -181,11 +180,6 @@ static MaybeHandle<Object> DefineClass(Isolate* isolate, Handle<Object> name,
constructor, DONT_ENUM); constructor, DONT_ENUM);
// Install private properties that are used to construct the FunctionToString. // 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( RETURN_ON_EXCEPTION(
isolate, isolate,
Object::SetProperty( Object::SetProperty(
...@@ -204,31 +198,29 @@ static MaybeHandle<Object> DefineClass(Isolate* isolate, Handle<Object> name, ...@@ -204,31 +198,29 @@ static MaybeHandle<Object> DefineClass(Isolate* isolate, Handle<Object> name,
RUNTIME_FUNCTION(Runtime_DefineClass) { RUNTIME_FUNCTION(Runtime_DefineClass) {
HandleScope scope(isolate); HandleScope scope(isolate);
DCHECK(args.length() == 6); DCHECK(args.length() == 5);
CONVERT_ARG_HANDLE_CHECKED(Object, name, 0); CONVERT_ARG_HANDLE_CHECKED(Object, name, 0);
CONVERT_ARG_HANDLE_CHECKED(Object, super_class, 1); CONVERT_ARG_HANDLE_CHECKED(Object, super_class, 1);
CONVERT_ARG_HANDLE_CHECKED(JSFunction, constructor, 2); CONVERT_ARG_HANDLE_CHECKED(JSFunction, constructor, 2);
CONVERT_ARG_HANDLE_CHECKED(Script, script, 3); CONVERT_SMI_ARG_CHECKED(start_position, 3);
CONVERT_SMI_ARG_CHECKED(start_position, 4); CONVERT_SMI_ARG_CHECKED(end_position, 4);
CONVERT_SMI_ARG_CHECKED(end_position, 5);
Handle<Object> result; Handle<Object> result;
ASSIGN_RETURN_FAILURE_ON_EXCEPTION( ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
isolate, result, DefineClass(isolate, name, super_class, constructor, isolate, result, DefineClass(isolate, name, super_class, constructor,
script, start_position, end_position)); start_position, end_position));
return *result; return *result;
} }
RUNTIME_FUNCTION(Runtime_DefineClassStrong) { RUNTIME_FUNCTION(Runtime_DefineClassStrong) {
HandleScope scope(isolate); HandleScope scope(isolate);
DCHECK(args.length() == 6); DCHECK(args.length() == 5);
CONVERT_ARG_HANDLE_CHECKED(Object, name, 0); CONVERT_ARG_HANDLE_CHECKED(Object, name, 0);
CONVERT_ARG_HANDLE_CHECKED(Object, super_class, 1); CONVERT_ARG_HANDLE_CHECKED(Object, super_class, 1);
CONVERT_ARG_HANDLE_CHECKED(JSFunction, constructor, 2); CONVERT_ARG_HANDLE_CHECKED(JSFunction, constructor, 2);
CONVERT_ARG_HANDLE_CHECKED(Script, script, 3); CONVERT_SMI_ARG_CHECKED(start_position, 3);
CONVERT_SMI_ARG_CHECKED(start_position, 4); CONVERT_SMI_ARG_CHECKED(end_position, 4);
CONVERT_SMI_ARG_CHECKED(end_position, 5);
if (super_class->IsNull()) { if (super_class->IsNull()) {
THROW_NEW_ERROR_RETURN_FAILURE( THROW_NEW_ERROR_RETURN_FAILURE(
...@@ -238,7 +230,7 @@ RUNTIME_FUNCTION(Runtime_DefineClassStrong) { ...@@ -238,7 +230,7 @@ RUNTIME_FUNCTION(Runtime_DefineClassStrong) {
Handle<Object> result; Handle<Object> result;
ASSIGN_RETURN_FAILURE_ON_EXCEPTION( ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
isolate, result, DefineClass(isolate, name, super_class, constructor, isolate, result, DefineClass(isolate, name, super_class, constructor,
script, start_position, end_position)); start_position, end_position));
return *result; return *result;
} }
...@@ -283,32 +275,20 @@ RUNTIME_FUNCTION(Runtime_ClassGetSourceCode) { ...@@ -283,32 +275,20 @@ RUNTIME_FUNCTION(Runtime_ClassGetSourceCode) {
DCHECK(args.length() == 1); DCHECK(args.length() == 1);
CONVERT_ARG_HANDLE_CHECKED(JSFunction, fun, 0); 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( Handle<Symbol> start_position_symbol(
isolate->heap()->class_start_position_symbol()); isolate->heap()->class_start_position_symbol());
Handle<Object> start_position; Handle<Object> start_position =
ASSIGN_RETURN_FAILURE_ON_EXCEPTION( JSReceiver::GetDataProperty(fun, start_position_symbol);
isolate, start_position, Object::GetProperty(fun, start_position_symbol)); if (!start_position->IsSmi()) return isolate->heap()->undefined_value();
Handle<Symbol> end_position_symbol( Handle<Symbol> end_position_symbol(
isolate->heap()->class_end_position_symbol()); isolate->heap()->class_end_position_symbol());
Handle<Object> end_position; Handle<Object> end_position =
ASSIGN_RETURN_FAILURE_ON_EXCEPTION( JSReceiver::GetDataProperty(fun, end_position_symbol);
isolate, end_position, Object::GetProperty(fun, end_position_symbol)); CHECK(end_position->IsSmi());
if (!start_position->IsSmi() || !end_position->IsSmi() ||
!Handle<Script>::cast(script)->HasValidSource()) {
return isolate->ThrowIllegalOperation();
}
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( return *isolate->factory()->NewSubString(
source, Handle<Smi>::cast(start_position)->value(), source, Handle<Smi>::cast(start_position)->value(),
Handle<Smi>::cast(end_position)->value()); Handle<Smi>::cast(end_position)->value());
......
...@@ -82,8 +82,8 @@ namespace internal { ...@@ -82,8 +82,8 @@ namespace internal {
F(ThrowIfStaticPrototype, 1, 1) \ F(ThrowIfStaticPrototype, 1, 1) \
F(ToMethod, 2, 1) \ F(ToMethod, 2, 1) \
F(HomeObjectSymbol, 0, 1) \ F(HomeObjectSymbol, 0, 1) \
F(DefineClass, 6, 1) \ F(DefineClass, 5, 1) \
F(DefineClassStrong, 6, 1) \ F(DefineClassStrong, 5, 1) \
F(FinalizeClassDefinition, 2, 1) \ F(FinalizeClassDefinition, 2, 1) \
F(DefineClassMethod, 3, 1) \ F(DefineClassMethod, 3, 1) \
F(ClassGetSourceCode, 1, 1) \ F(ClassGetSourceCode, 1, 1) \
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment