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

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

Issue 1234023003: [turbofan] Build graphs for super constructor calls. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Fix compilation in release mode. 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/compiler/ast-graph-builder.h ('k') | src/compiler/js-generic-lowering.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/compiler/ast-graph-builder.cc
diff --git a/src/compiler/ast-graph-builder.cc b/src/compiler/ast-graph-builder.cc
index fd1b6960d094b5b7ec47a20f1996d828737bf949..2d3d8279b12aabe9a67967a6e8d95714e8ddd207 100644
--- a/src/compiler/ast-graph-builder.cc
+++ b/src/compiler/ast-graph-builder.cc
@@ -2415,11 +2415,7 @@ void AstGraphBuilder::VisitCall(Call* expr) {
break;
}
case Call::SUPER_CALL:
- // TODO(dslomov): Implement super calls.
- callee_value = jsgraph()->UndefinedConstant();
- receiver_value = jsgraph()->UndefinedConstant();
- SetStackOverflow();
- break;
+ return VisitCallSuper(expr);
case Call::POSSIBLY_EVAL_CALL:
possibly_eval = true;
if (callee->AsVariableProxy()->var()->IsLookupSlot()) {
@@ -2486,6 +2482,45 @@ void AstGraphBuilder::VisitCall(Call* expr) {
}
+void AstGraphBuilder::VisitCallSuper(Call* expr) {
+ SuperCallReference* super = expr->expression()->AsSuperCallReference();
+ DCHECK_NOT_NULL(super);
+
+ // Prepare the callee to the super call. The super constructor is stored as
+ // the prototype of the constructor we are currently executing.
+ VisitForValue(super->this_function_var());
+ Node* this_function = environment()->Pop();
+ const Operator* op = javascript()->CallRuntime(Runtime::kGetPrototype, 1);
+ Node* super_function = NewNode(op, this_function);
+ // TODO(mstarzinger): This probably needs a proper bailout id.
+ PrepareFrameState(super_function, BailoutId::None());
+ environment()->Push(super_function);
+
+ // Evaluate all arguments to the super call.
+ ZoneList<Expression*>* args = expr->arguments();
+ VisitForValues(args);
+
+ // Original receiver is loaded from the {new.target} variable.
+ VisitForValue(super->new_target_var());
+
+ // Create node to perform the super call.
+ const Operator* call = javascript()->CallConstruct(args->length() + 2);
+ Node* value = ProcessArguments(call, args->length() + 2);
+ PrepareFrameState(value, expr->id(), ast_context()->GetStateCombine());
+
+ // TODO(mstarzinger): It sure would be nice if this were desugared. Also we
+ // are still missing the hole-check in the assignment below, fix that.
+ FrameStateBeforeAndAfter states(this, BailoutId::None());
+ BuildVariableAssignment(super->this_var()->var(), value, Token::INIT_CONST,
+ VectorSlotPair(), BailoutId::None(), states);
+
+ // TODO(mstarzinger): Remove bailout once lowering is correct.
+ SetStackOverflow();
+
+ ast_context()->ProduceValue(value);
+}
+
+
void AstGraphBuilder::VisitCallNew(CallNew* expr) {
VisitForValue(expr->expression());
@@ -2493,9 +2528,12 @@ void AstGraphBuilder::VisitCallNew(CallNew* expr) {
ZoneList<Expression*>* args = expr->arguments();
VisitForValues(args);
+ // Original receiver is the same as the callee.
+ environment()->Push(environment()->Peek(args->length()));
+
// Create node to perform the construct call.
- const Operator* call = javascript()->CallConstruct(args->length() + 1);
- Node* value = ProcessArguments(call, args->length() + 1);
+ const Operator* call = javascript()->CallConstruct(args->length() + 2);
+ Node* value = ProcessArguments(call, args->length() + 2);
PrepareFrameState(value, expr->id(), ast_context()->GetStateCombine());
ast_context()->ProduceValue(value);
}
« no previous file with comments | « src/compiler/ast-graph-builder.h ('k') | src/compiler/js-generic-lowering.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698