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) {
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());
......
......@@ -1293,13 +1293,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;
......
......@@ -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) \
......
......@@ -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;
......@@ -181,11 +180,6 @@ static MaybeHandle<Object> DefineClass(Isolate* isolate, Handle<Object> name,
constructor, DONT_ENUM);
// 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(
......@@ -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());
......
......@@ -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) \
......
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