Chromium Code Reviews

Unified Diff: src/compiler/ast-graph-builder.cc

Issue 2423053002: Install the 'name' property in classes at runtime (Closed)
Patch Set: Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View side-by-side diff with in-line comments
Index: src/compiler/ast-graph-builder.cc
diff --git a/src/compiler/ast-graph-builder.cc b/src/compiler/ast-graph-builder.cc
index 68cf58905f87e1f62e0d2186409657ba29861d39..f213de56cdc23a942271b0bd33a18684cb6f4177 100644
--- a/src/compiler/ast-graph-builder.cc
+++ b/src/compiler/ast-graph-builder.cc
@@ -1659,6 +1659,39 @@ void AstGraphBuilder::VisitClassLiteral(ClassLiteral* expr) {
}
}
+ // ES6 section 14.5.16 class expression evaluation, step 5
+ DCHECK(!expr->constructor()->name().is_null());
+ // abort if 'name' is undefined
+ if (expr->constructor()->name()->length() != 0) {
+ // if "name" is already defined, exit
+ environment()->Push(environment()->Peek(1)); // literal
+ Node* receiver = environment()->Pop();
+ Node* key = jsgraph()->Constant(isolate()->factory()->name_string());
+ IfBuilder has_name(this);
+ const Operator* has_name_op =
+ javascript()->CallRuntime(Runtime::kObjectHasOwnProperty);
+ Node* has_name_call = NewNode(has_name_op, receiver, key);
+ PrepareFrameState(has_name_call, BailoutId::None());
+ has_name.If(has_name_call, BranchHint::kFalse);
+ has_name.Then();
+ has_name.Else();
+ {
+ // define "name" property
+ environment()->Push(environment()->Peek(1)); // literal
+ Node* receiver = environment()->Pop();
+ Node* key = jsgraph()->Constant(isolate()->factory()->name_string());
+ Node* value = jsgraph()->Constant(expr->constructor()->name());
+ Node* attr = jsgraph()->Constant(DONT_ENUM | READ_ONLY);
+ Node* set_function_name = jsgraph()->Constant(0);
+ const Operator* define_name_op =
+ javascript()->CallRuntime(Runtime::kDefineDataPropertyInLiteral);
+ Node* define_name_call = NewNode(define_name_op, receiver, key, value,
+ attr, set_function_name);
+ PrepareFrameState(define_name_call, BailoutId::None());
+ }
+ has_name.End();
+ }
+
// Set the constructor to have fast properties.
prototype = environment()->Pop();
literal = environment()->Pop();
« no previous file with comments | « src/code-stubs.cc ('k') | src/contexts.h » ('j') | src/interpreter/bytecode-generator.cc » ('J')

Powered by Google App Engine