Index: runtime/vm/ast_transformer.cc |
diff --git a/runtime/vm/ast_transformer.cc b/runtime/vm/ast_transformer.cc |
index 32ec3f9f1d1bc00525ab8a33eb5991df84d35e85..8954f0a15f3f6caea4772d0f24b99ebeb7dd97ea 100644 |
--- a/runtime/vm/ast_transformer.cc |
+++ b/runtime/vm/ast_transformer.cc |
@@ -13,6 +13,9 @@ namespace dart { |
// Quick access to the current zone. |
#define Z (thread()->zone()) |
+// Quick synthetic token position. |
+#define ST(token_pos) Token::ToSynthetic(token_pos) |
+ |
// Nodes that are unreachable from already parsed expressions. |
#define FOR_EACH_UNREACHABLE_NODE(V) \ |
V(AwaitMarker) \ |
@@ -71,7 +74,7 @@ LocalVariable* AwaitTransformer::EnsureCurrentTempVar() { |
if (await_tmp == NULL) { |
// We need a new temp variable; add it to the function's top scope. |
await_tmp = new (Z) LocalVariable( |
- Scanner::kNoSourcePos, symbol, Object::dynamic_type()); |
+ Token::kNoSourcePos, symbol, Object::dynamic_type()); |
async_temp_scope_->AddVariable(await_tmp); |
// After adding it to the top scope, we can look it up from the preamble. |
// The following call includes an ASSERT check. |
@@ -89,9 +92,11 @@ 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)); |
+ ASSERT(Token::IsSynthetic(token_pos) || Token::IsNoSource(token_pos)); |
+ preamble_->Add(new(Z) StoreLocalNode(token_pos, tmp_var, node)); |
NextTempVar(); |
return tmp_var; |
} |
@@ -119,7 +124,7 @@ void AwaitTransformer::VisitAwaitNode(AwaitNode* node) { |
// :saved_try_ctx_var = :await_saved_try_ctx_var_y; |
// :await_temp_var_(X+1) = :result_param; |
- const intptr_t token_pos = node->token_pos(); |
+ const intptr_t token_pos = ST(node->token_pos()); |
LocalVariable* async_op = GetVariableInScope( |
preamble_->scope(), Symbols::AsyncOperation()); |
LocalVariable* async_then_callback = GetVariableInScope( |
@@ -134,7 +139,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, |
+ ST(node->token_pos())); |
AwaitMarkerNode* await_marker = |
new (Z) AwaitMarkerNode(async_temp_scope_, node->scope(), token_pos); |
@@ -146,23 +152,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(), |
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 +177,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 +194,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); |
+ token_pos, result_param), ST(node->token_pos())); |
+ result_ = new(Z) LoadLocalNode(token_pos, result); |
} |
@@ -242,18 +247,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())); |
+ ST(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, |
+ ST(new_left->token_pos()), |
new(Z) ComparisonNode( |
- Scanner::kNoSourcePos, |
+ ST(new_left->token_pos()), |
compare_logical_op, |
new_left, |
- new(Z) LiteralNode(Scanner::kNoSourcePos, Bool::True())), |
+ new(Z) LiteralNode(ST(new_left->token_pos()), Bool::True())), |
eval, |
NULL); |
preamble_->Add(right_body); |
@@ -280,8 +285,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), ST(node->token_pos())); |
+ result_ = new(Z) LoadLocalNode(ST(node->token_pos()), result); |
} |
@@ -295,8 +300,8 @@ void AwaitTransformer::VisitBinaryOpWithMask32Node( |
node->kind(), |
new_left, |
new_right, |
- node->mask32())); |
- result_ = new(Z) LoadLocalNode(Scanner::kNoSourcePos, result); |
+ node->mask32()), ST(node->token_pos())); |
+ result_ = new(Z) LoadLocalNode(ST(node->token_pos()), result); |
} |
@@ -307,16 +312,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), ST(node->token_pos())); |
+ result_ = new(Z) LoadLocalNode(ST(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), |
+ ST(node->token_pos())); |
+ result_ = new(Z) LoadLocalNode(ST(node->token_pos()), result); |
} |
@@ -325,26 +331,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())); |
+ ST(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())); |
+ ST(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(ST(node->token_pos()), |
new_condition, |
new_true, |
new_false); |
preamble_->Add(new_if); |
LocalVariable* result = AddToPreambleNewTempVar( |
- new(Z) ConditionalExprNode(Scanner::kNoSourcePos, |
+ new(Z) ConditionalExprNode(ST(node->token_pos()), |
new_condition, |
new_true_result, |
- new_false_result)); |
- result_ = new(Z) LoadLocalNode(Scanner::kNoSourcePos, result); |
+ new_false_result), ST(node->token_pos())); |
+ result_ = new(Z) LoadLocalNode(ST(node->token_pos()), result); |
} |
@@ -371,8 +377,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), ST(node->token_pos())); |
+ result_ = new(Z) LoadLocalNode(ST(node->token_pos()), result); |
} |
@@ -385,8 +391,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()), ST(node->token_pos())); |
+ result_ = new(Z) LoadLocalNode(ST(node->token_pos()), result); |
} |
@@ -399,8 +405,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()), ST(node->token_pos())); |
+ result_ = new(Z) LoadLocalNode(ST(node->token_pos()), result); |
} |
@@ -410,8 +416,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), ST(node->token_pos())); |
+ result_ = new(Z) LoadLocalNode(ST(node->token_pos()), result); |
} |
@@ -422,8 +428,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), ST(node->token_pos())); |
+ result_ = new(Z) LoadLocalNode(ST(node->token_pos()), result); |
} |
@@ -433,8 +439,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()), ST(node->token_pos())); |
+ result_ = new(Z) LoadLocalNode(ST(node->token_pos()), result); |
} |
@@ -449,8 +455,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()), ST(node->token_pos())); |
+ result_ = new(Z) LoadLocalNode(ST(node->token_pos()), result); |
} |
@@ -465,8 +471,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, ST(node->token_pos())); |
+ result_ = new(Z) LoadLocalNode(ST(node->token_pos()), result); |
} |
@@ -489,8 +496,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, ST(node->token_pos())); |
+ result_ = new(Z) LoadLocalNode(ST(node->token_pos()), result); |
} |
@@ -525,8 +533,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()), ST(node->token_pos())); |
+ result_ = new(Z) LoadLocalNode(ST(node->token_pos()), result); |
} |
@@ -539,8 +547,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()), ST(node->token_pos())); |
+ result_ = new(Z) LoadLocalNode(ST(node->token_pos()), result); |
} |
@@ -550,8 +558,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()), ST(node->token_pos())); |
+ result_ = new(Z) LoadLocalNode(ST(node->token_pos()), result); |
} |
@@ -565,8 +573,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 |