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 |