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

Unified Diff: runtime/vm/ast_transformer.cc

Issue 1589643002: Source positions for constructors and lots of async machinery (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 4 years, 11 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
Index: runtime/vm/ast_transformer.cc
diff --git a/runtime/vm/ast_transformer.cc b/runtime/vm/ast_transformer.cc
index 32ec3f9f1d1bc00525ab8a33eb5991df84d35e85..f0fbe947d97ea6649f9f80d80173e7cde3f7949d 100644
--- a/runtime/vm/ast_transformer.cc
+++ b/runtime/vm/ast_transformer.cc
@@ -89,9 +89,10 @@ LocalVariable* AwaitTransformer::GetVariableInScope(LocalScope* scope,
}
-LocalVariable* AwaitTransformer::AddToPreambleNewTempVar(AstNode* node) {
+LocalVariable* AwaitTransformer::AddToPreambleNewTempVar(AstNode* node,
+ intptr_t token_pos) {
LocalVariable* tmp_var = EnsureCurrentTempVar();
- preamble_->Add(new(Z) StoreLocalNode(Scanner::kNoSourcePos, tmp_var, node));
+ preamble_->Add(new(Z) StoreLocalNode(token_pos, tmp_var, node));
NextTempVar();
return tmp_var;
}
@@ -134,7 +135,8 @@ void AwaitTransformer::VisitAwaitNode(AwaitNode* node) {
preamble_->scope(), Symbols::AsyncOperationStackTraceParam());
AstNode* transformed_expr = Transform(node->expr());
- LocalVariable* await_temp = AddToPreambleNewTempVar(transformed_expr);
+ LocalVariable* await_temp = AddToPreambleNewTempVar(transformed_expr,
+ token_pos);
AwaitMarkerNode* await_marker =
new (Z) AwaitMarkerNode(async_temp_scope_, node->scope(), token_pos);
@@ -146,23 +148,23 @@ void AwaitTransformer::VisitAwaitNode(AwaitNode* node) {
const Function& async_await_helper = Function::ZoneHandle(
Z, async_lib.LookupFunctionAllowPrivate(Symbols::AsyncAwaitHelper()));
ASSERT(!async_await_helper.IsNull());
- ArgumentListNode* async_await_helper_args = new (Z) ArgumentListNode(
- Scanner::kNoSourcePos);
+ ArgumentListNode* async_await_helper_args =
+ new (Z) ArgumentListNode(token_pos);
async_await_helper_args->Add(
- new(Z) LoadLocalNode(Scanner::kNoSourcePos, await_temp));
+ new(Z) LoadLocalNode(token_pos, await_temp));
async_await_helper_args->Add(
- new(Z) LoadLocalNode(Scanner::kNoSourcePos, async_then_callback));
+ new(Z) LoadLocalNode(token_pos, async_then_callback));
async_await_helper_args->Add(
- new(Z) LoadLocalNode(Scanner::kNoSourcePos, async_catch_error_callback));
+ new(Z) LoadLocalNode(token_pos, async_catch_error_callback));
StaticCallNode* await_helper_call = new (Z) StaticCallNode(
- node->token_pos(),
+ token_pos,
async_await_helper,
async_await_helper_args);
preamble_->Add(new(Z) StoreLocalNode(
- Scanner::kNoSourcePos, result_param, await_helper_call));
+ token_pos, result_param, await_helper_call));
- ReturnNode* continuation_return = new(Z) ReturnNode(Scanner::kNoSourcePos);
+ ReturnNode* continuation_return = new(Z) ReturnNode(token_pos);
continuation_return->set_return_type(ReturnNode::kContinuationTarget);
preamble_->Add(continuation_return);
@@ -171,15 +173,15 @@ void AwaitTransformer::VisitAwaitNode(AwaitNode* node) {
// saved try context of the outer try block.
if (node->saved_try_ctx() != NULL) {
preamble_->Add(new (Z) StoreLocalNode(
- Scanner::kNoSourcePos,
+ token_pos,
node->saved_try_ctx(),
- new (Z) LoadLocalNode(Scanner::kNoSourcePos,
+ new (Z) LoadLocalNode(token_pos,
node->async_saved_try_ctx())));
if (node->outer_saved_try_ctx() != NULL) {
preamble_->Add(new (Z) StoreLocalNode(
- Scanner::kNoSourcePos,
+ token_pos,
node->outer_saved_try_ctx(),
- new (Z) LoadLocalNode(Scanner::kNoSourcePos,
+ new (Z) LoadLocalNode(token_pos,
node->outer_async_saved_try_ctx())));
}
} else {
@@ -188,34 +190,33 @@ void AwaitTransformer::VisitAwaitNode(AwaitNode* node) {
// Load the async_op variable. It is unused, but the observatory uses it
// to determine if a breakpoint is inside an asynchronous function.
- LoadLocalNode* load_async_op = new (Z) LoadLocalNode(
- Scanner::kNoSourcePos, async_op);
+ LoadLocalNode* load_async_op = new (Z) LoadLocalNode(token_pos, async_op);
preamble_->Add(load_async_op);
LoadLocalNode* load_error_param = new (Z) LoadLocalNode(
- Scanner::kNoSourcePos, error_param);
+ token_pos, error_param);
LoadLocalNode* load_stack_trace_param = new (Z) LoadLocalNode(
- Scanner::kNoSourcePos, stack_trace_param);
+ token_pos, stack_trace_param);
SequenceNode* error_ne_null_branch = new (Z) SequenceNode(
- Scanner::kNoSourcePos, ChainNewScope(preamble_->scope()));
+ token_pos, ChainNewScope(preamble_->scope()));
error_ne_null_branch->Add(new (Z) ThrowNode(
- Scanner::kNoSourcePos,
+ token_pos,
load_error_param,
load_stack_trace_param));
preamble_->Add(new (Z) IfNode(
- Scanner::kNoSourcePos,
+ token_pos,
new (Z) ComparisonNode(
- Scanner::kNoSourcePos,
+ token_pos,
Token::kNE,
load_error_param,
- new (Z) LiteralNode(Scanner::kNoSourcePos,
+ new (Z) LiteralNode(token_pos,
Object::null_instance())),
error_ne_null_branch,
NULL));
LocalVariable* result = AddToPreambleNewTempVar(new(Z) LoadLocalNode(
- Scanner::kNoSourcePos, result_param));
- result_ = new(Z) LoadLocalNode(Scanner::kNoSourcePos, result);
+ node->token_pos(), result_param), node->token_pos());
+ result_ = new(Z) LoadLocalNode(node->token_pos(), result);
}
@@ -242,18 +243,18 @@ AstNode* AwaitTransformer::LazyTransform(const Token::Kind logical_op,
const Token::Kind compare_logical_op = (logical_op == Token::kAND) ?
Token::kEQ : Token::kNE;
SequenceNode* eval = new (Z) SequenceNode(
- Scanner::kNoSourcePos, ChainNewScope(preamble_->scope()));
+ new_left->token_pos(), ChainNewScope(preamble_->scope()));
SequenceNode* saved_preamble = preamble_;
preamble_ = eval;
result = Transform(right);
preamble_ = saved_preamble;
IfNode* right_body = new(Z) IfNode(
- Scanner::kNoSourcePos,
+ new_left->token_pos(),
new(Z) ComparisonNode(
- Scanner::kNoSourcePos,
+ new_left->token_pos(),
compare_logical_op,
new_left,
- new(Z) LiteralNode(Scanner::kNoSourcePos, Bool::True())),
+ new(Z) LiteralNode(new_left->token_pos(), Bool::True())),
eval,
NULL);
preamble_->Add(right_body);
@@ -280,8 +281,8 @@ void AwaitTransformer::VisitBinaryOpNode(BinaryOpNode* node) {
new(Z) BinaryOpNode(node->token_pos(),
node->kind(),
new_left,
- new_right));
- result_ = new(Z) LoadLocalNode(Scanner::kNoSourcePos, result);
+ new_right), node->token_pos());
+ result_ = new(Z) LoadLocalNode(node->token_pos(), result);
}
@@ -295,8 +296,8 @@ void AwaitTransformer::VisitBinaryOpWithMask32Node(
node->kind(),
new_left,
new_right,
- node->mask32()));
- result_ = new(Z) LoadLocalNode(Scanner::kNoSourcePos, result);
+ node->mask32()), node->token_pos());
+ result_ = new(Z) LoadLocalNode(node->token_pos(), result);
}
@@ -307,16 +308,17 @@ void AwaitTransformer::VisitComparisonNode(ComparisonNode* node) {
new(Z) ComparisonNode(node->token_pos(),
node->kind(),
new_left,
- new_right));
- result_ = new(Z) LoadLocalNode(Scanner::kNoSourcePos, result);
+ new_right), node->token_pos());
+ result_ = new(Z) LoadLocalNode(node->token_pos(), result);
}
void AwaitTransformer::VisitUnaryOpNode(UnaryOpNode* node) {
AstNode* new_operand = Transform(node->operand());
LocalVariable* result = AddToPreambleNewTempVar(
- new(Z) UnaryOpNode(node->token_pos(), node->kind(), new_operand));
- result_ = new(Z) LoadLocalNode(Scanner::kNoSourcePos, result);
+ new(Z) UnaryOpNode(node->token_pos(), node->kind(), new_operand),
+ node->token_pos());
+ result_ = new(Z) LoadLocalNode(node->token_pos(), result);
}
@@ -325,26 +327,26 @@ void AwaitTransformer::VisitUnaryOpNode(UnaryOpNode* node) {
void AwaitTransformer::VisitConditionalExprNode(ConditionalExprNode* node) {
AstNode* new_condition = Transform(node->condition());
SequenceNode* new_true = new (Z) SequenceNode(
- Scanner::kNoSourcePos, ChainNewScope(preamble_->scope()));
+ node->true_expr()->token_pos(), ChainNewScope(preamble_->scope()));
SequenceNode* saved_preamble = preamble_;
preamble_ = new_true;
AstNode* new_true_result = Transform(node->true_expr());
SequenceNode* new_false = new (Z) SequenceNode(
- Scanner::kNoSourcePos, ChainNewScope(preamble_->scope()));
+ node->false_expr()->token_pos(), ChainNewScope(preamble_->scope()));
preamble_ = new_false;
AstNode* new_false_result = Transform(node->false_expr());
preamble_ = saved_preamble;
- IfNode* new_if = new(Z) IfNode(Scanner::kNoSourcePos,
+ IfNode* new_if = new(Z) IfNode(node->token_pos(),
new_condition,
new_true,
new_false);
preamble_->Add(new_if);
LocalVariable* result = AddToPreambleNewTempVar(
- new(Z) ConditionalExprNode(Scanner::kNoSourcePos,
+ new(Z) ConditionalExprNode(node->token_pos(),
new_condition,
new_true_result,
- new_false_result));
- result_ = new(Z) LoadLocalNode(Scanner::kNoSourcePos, result);
+ new_false_result), node->token_pos());
+ result_ = new(Z) LoadLocalNode(node->token_pos(), result);
}
@@ -371,8 +373,8 @@ void AwaitTransformer::VisitStringInterpolateNode(StringInterpolateNode* node) {
ArrayNode* new_value = Transform(node->value())->AsArrayNode();
LocalVariable* result = AddToPreambleNewTempVar(
new(Z) StringInterpolateNode(node->token_pos(),
- new_value));
- result_ = new(Z) LoadLocalNode(Scanner::kNoSourcePos, result);
+ new_value), node->token_pos());
+ result_ = new(Z) LoadLocalNode(node->token_pos(), result);
}
@@ -385,8 +387,8 @@ void AwaitTransformer::VisitClosureNode(ClosureNode* node) {
new(Z) ClosureNode(node->token_pos(),
node->function(),
new_receiver,
- node->scope()));
- result_ = new(Z) LoadLocalNode(Scanner::kNoSourcePos, result);
+ node->scope()), node->token_pos());
+ result_ = new(Z) LoadLocalNode(node->token_pos(), result);
}
@@ -399,8 +401,8 @@ void AwaitTransformer::VisitInstanceCallNode(InstanceCallNode* node) {
new_receiver,
node->function_name(),
new_args,
- node->is_conditional()));
- result_ = new(Z) LoadLocalNode(Scanner::kNoSourcePos, result);
+ node->is_conditional()), node->token_pos());
+ result_ = new(Z) LoadLocalNode(node->token_pos(), result);
}
@@ -410,8 +412,8 @@ void AwaitTransformer::VisitStaticCallNode(StaticCallNode* node) {
LocalVariable* result = AddToPreambleNewTempVar(
new(Z) StaticCallNode(node->token_pos(),
node->function(),
- new_args));
- result_ = new(Z) LoadLocalNode(Scanner::kNoSourcePos, result);
+ new_args), node->token_pos());
+ result_ = new(Z) LoadLocalNode(node->token_pos(), result);
}
@@ -422,8 +424,8 @@ void AwaitTransformer::VisitConstructorCallNode(ConstructorCallNode* node) {
new(Z) ConstructorCallNode(node->token_pos(),
node->type_arguments(),
node->constructor(),
- new_args));
- result_ = new(Z) LoadLocalNode(Scanner::kNoSourcePos, result);
+ new_args), node->token_pos());
+ result_ = new(Z) LoadLocalNode(node->token_pos(), result);
}
@@ -433,8 +435,8 @@ void AwaitTransformer::VisitInstanceGetterNode(InstanceGetterNode* node) {
new(Z) InstanceGetterNode(node->token_pos(),
new_receiver,
node->field_name(),
- node->is_conditional()));
- result_ = new(Z) LoadLocalNode(Scanner::kNoSourcePos, result);
+ node->is_conditional()), node->token_pos());
+ result_ = new(Z) LoadLocalNode(node->token_pos(), result);
}
@@ -449,8 +451,8 @@ void AwaitTransformer::VisitInstanceSetterNode(InstanceSetterNode* node) {
new_receiver,
node->field_name(),
new_value,
- node->is_conditional()));
- result_ = new(Z) LoadLocalNode(Scanner::kNoSourcePos, result);
+ node->is_conditional()), node->token_pos());
+ result_ = new(Z) LoadLocalNode(node->token_pos(), result);
}
@@ -465,8 +467,9 @@ void AwaitTransformer::VisitStaticGetterNode(StaticGetterNode* node) {
node->cls(),
node->field_name());
new_getter->set_owner(node->owner());
- LocalVariable* result = AddToPreambleNewTempVar(new_getter);
- result_ = new(Z) LoadLocalNode(Scanner::kNoSourcePos, result);
+ LocalVariable* result =
+ AddToPreambleNewTempVar(new_getter, node->token_pos());
+ result_ = new(Z) LoadLocalNode(node->token_pos(), result);
}
@@ -489,8 +492,9 @@ void AwaitTransformer::VisitStaticSetterNode(StaticSetterNode* node) {
node->function(),
new_value);
- LocalVariable* result = AddToPreambleNewTempVar(new_setter);
- result_ = new(Z) LoadLocalNode(Scanner::kNoSourcePos, result);
+ LocalVariable* result =
+ AddToPreambleNewTempVar(new_setter, node->token_pos());
+ result_ = new(Z) LoadLocalNode(node->token_pos(), result);
}
@@ -525,8 +529,8 @@ void AwaitTransformer::VisitLoadIndexedNode(LoadIndexedNode* node) {
new(Z) LoadIndexedNode(node->token_pos(),
new_array,
new_index,
- node->super_class()));
- result_ = new(Z) LoadLocalNode(Scanner::kNoSourcePos, result);
+ node->super_class()), node->token_pos());
+ result_ = new(Z) LoadLocalNode(node->token_pos(), result);
}
@@ -539,8 +543,8 @@ void AwaitTransformer::VisitStoreIndexedNode(StoreIndexedNode* node) {
new_array,
new_index,
new_value,
- node->super_class()));
- result_ = new(Z) LoadLocalNode(Scanner::kNoSourcePos, result);
+ node->super_class()), node->token_pos());
+ result_ = new(Z) LoadLocalNode(node->token_pos(), result);
}
@@ -550,8 +554,8 @@ void AwaitTransformer::VisitAssignableNode(AssignableNode* node) {
new(Z) AssignableNode(node->token_pos(),
new_expr,
node->type(),
- node->dst_name()));
- result_ = new(Z) LoadLocalNode(Scanner::kNoSourcePos, result);
+ node->dst_name()), node->token_pos());
+ result_ = new(Z) LoadLocalNode(node->token_pos(), result);
}
@@ -565,8 +569,8 @@ void AwaitTransformer::VisitLetNode(LetNode* node) {
async_temp_scope_->AddVariable(node->TempAt(i));
AstNode* new_init_val = Transform(node->InitializerAt(i));
preamble_->Add(new(Z) StoreLocalNode(node->token_pos(),
- node->TempAt(i),
- new_init_val));
+ node->TempAt(i),
+ new_init_val));
}
// Add all expressions but the last to the preamble. We must do

Powered by Google App Engine
This is Rietveld 408576698