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

Unified Diff: runtime/vm/flow_graph_builder.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/flow_graph_builder.cc
diff --git a/runtime/vm/flow_graph_builder.cc b/runtime/vm/flow_graph_builder.cc
index fed89bb839218c291a3920f01c5a5f423a0a8c91..bc7d4e117de109f713a0948f8a7c3fe7fec6ad7a 100644
--- a/runtime/vm/flow_graph_builder.cc
+++ b/runtime/vm/flow_graph_builder.cc
@@ -829,20 +829,24 @@ PushArgumentInstr* EffectGraphVisitor::PushArgument(Value* value) {
Definition* EffectGraphVisitor::BuildStoreTemp(const LocalVariable& local,
- Value* value) {
+ Value* value,
+ intptr_t token_pos) {
ASSERT(!local.is_captured());
- return new(Z) StoreLocalInstr(local, value);
+ return new(Z) StoreLocalInstr(local, value, token_pos);
}
-Definition* EffectGraphVisitor::BuildStoreExprTemp(Value* value) {
+Definition* EffectGraphVisitor::BuildStoreExprTemp(Value* value,
+ intptr_t token_pos) {
return BuildStoreTemp(*owner()->parsed_function().expression_temp_var(),
- value);
+ value,
+ token_pos);
}
-Definition* EffectGraphVisitor::BuildLoadExprTemp() {
- return BuildLoadLocal(*owner()->parsed_function().expression_temp_var());
+Definition* EffectGraphVisitor::BuildLoadExprTemp(intptr_t token_pos) {
+ return BuildLoadLocal(*owner()->parsed_function().expression_temp_var(),
+ token_pos);
}
@@ -850,7 +854,7 @@ Definition* EffectGraphVisitor::BuildStoreLocal(const LocalVariable& local,
Value* value,
intptr_t token_pos) {
if (local.is_captured()) {
- LocalVariable* tmp_var = EnterTempLocalScope(value);
+ LocalVariable* tmp_var = EnterTempLocalScope(value, token_pos);
intptr_t delta =
owner()->context_level() - local.owner()->context_level();
ASSERT(delta >= 0);
@@ -860,7 +864,7 @@ Definition* EffectGraphVisitor::BuildStoreLocal(const LocalVariable& local,
context, Context::parent_offset(), Type::ZoneHandle(Z, Type::null()),
token_pos));
}
- Value* tmp_val = Bind(new(Z) LoadLocalInstr(*tmp_var));
+ Value* tmp_val = Bind(new(Z) LoadLocalInstr(*tmp_var, token_pos));
StoreInstanceFieldInstr* store =
new(Z) StoreInstanceFieldInstr(Context::variable_offset(local.index()),
context,
@@ -868,7 +872,7 @@ Definition* EffectGraphVisitor::BuildStoreLocal(const LocalVariable& local,
kEmitStoreBarrier,
token_pos);
Do(store);
- return ExitTempLocalScope(tmp_var);
+ return ExitTempLocalScope(tmp_var, token_pos);
} else {
return new(Z) StoreLocalInstr(local, value, token_pos);
}
@@ -1177,7 +1181,7 @@ void EffectGraphVisitor::VisitReturnNode(ReturnNode* node) {
if (function.IsAsyncClosure() &&
(node->return_type() == ReturnNode::kRegular)) {
// Temporary store the computed return value.
- Do(BuildStoreExprTemp(return_value));
+ Do(BuildStoreExprTemp(return_value, node->token_pos()));
LocalVariable* rcv_var =
node->scope()->LookupVariable(Symbols::AsyncCompleter(), false);
@@ -1186,7 +1190,7 @@ void EffectGraphVisitor::VisitReturnNode(ReturnNode* node) {
new(Z) ZoneGrowableArray<PushArgumentInstr*>(2);
Value* rcv_value = Bind(BuildLoadLocal(*rcv_var, node->token_pos()));
arguments->Add(PushArgument(rcv_value));
- Value* returned_value = Bind(BuildLoadExprTemp());
+ Value* returned_value = Bind(BuildLoadExprTemp(node->token_pos()));
arguments->Add(PushArgument(returned_value));
InstanceCallInstr* call = new(Z) InstanceCallInstr(
node->token_pos(),
@@ -1199,7 +1203,7 @@ void EffectGraphVisitor::VisitReturnNode(ReturnNode* node) {
Do(call);
// Rebind the return value for the actual return call to be null.
- return_value = BuildNullValue();
+ return_value = BuildNullValue(node->token_pos());
}
intptr_t current_context_level = owner()->context_level();
@@ -1425,22 +1429,22 @@ void ValueGraphVisitor::VisitBinaryOpNode(BinaryOpNode* node) {
right_value,
constant_true,
false)); // No number check.
- for_right.Do(BuildStoreExprTemp(compare));
+ for_right.Do(BuildStoreExprTemp(compare, node->token_pos()));
if (node->kind() == Token::kAND) {
ValueGraphVisitor for_false(owner());
Value* constant_false =
for_false.Bind(new(Z) ConstantInstr(Bool::False()));
- for_false.Do(BuildStoreExprTemp(constant_false));
+ for_false.Do(BuildStoreExprTemp(constant_false, node->token_pos()));
Join(for_test, for_right, for_false);
} else {
ASSERT(node->kind() == Token::kOR);
ValueGraphVisitor for_true(owner());
Value* constant_true = for_true.Bind(new(Z) ConstantInstr(Bool::True()));
- for_true.Do(BuildStoreExprTemp(constant_true));
+ for_true.Do(BuildStoreExprTemp(constant_true, node->token_pos()));
Join(for_test, for_true, for_right);
}
- ReturnDefinition(BuildLoadExprTemp());
+ ReturnDefinition(BuildLoadExprTemp(node->token_pos()));
return;
}
@@ -1504,7 +1508,7 @@ void EffectGraphVisitor::BuildTypecheckPushArguments(
// Since called only when type tested against is not instantiated.
ASSERT(instantiator_class.NumTypeParameters() > 0);
Value* instantiator_type_arguments = NULL;
- Value* instantiator = BuildInstantiator(instantiator_class);
+ Value* instantiator = BuildInstantiator(token_pos, instantiator_class);
if (instantiator == NULL) {
// No instantiator when inside factory.
instantiator_type_arguments =
@@ -1528,7 +1532,7 @@ void EffectGraphVisitor::BuildTypecheckArguments(
Z, owner()->function().Owner());
// Since called only when type tested against is not instantiated.
ASSERT(instantiator_class.NumTypeParameters() > 0);
- instantiator = BuildInstantiator(instantiator_class);
+ instantiator = BuildInstantiator(token_pos, instantiator_class);
if (instantiator == NULL) {
// No instantiator when inside factory.
instantiator_type_arguments =
@@ -1541,8 +1545,9 @@ void EffectGraphVisitor::BuildTypecheckArguments(
}
-Value* EffectGraphVisitor::BuildNullValue() {
- return Bind(new(Z) ConstantInstr(Object::ZoneHandle(Z, Object::null())));
+Value* EffectGraphVisitor::BuildNullValue(intptr_t token_pos) {
+ return Bind(new(Z) ConstantInstr(Object::ZoneHandle(Z, Object::null()),
+ token_pos));
}
@@ -1555,7 +1560,7 @@ AssertAssignableInstr* EffectGraphVisitor::BuildAssertAssignable(
// Build the type check computation.
Value* instantiator_type_arguments = NULL;
if (dst_type.IsInstantiated()) {
- instantiator_type_arguments = BuildNullValue();
+ instantiator_type_arguments = BuildNullValue(token_pos);
} else {
BuildTypecheckArguments(token_pos, &instantiator_type_arguments);
}
@@ -1666,7 +1671,7 @@ void EffectGraphVisitor::BuildTypeTest(ComparisonNode* node) {
PushArgumentInstr* push_left = PushArgument(for_left_value.value());
PushArgumentInstr* push_type_args = NULL;
if (type.IsInstantiated()) {
- push_type_args = PushArgument(BuildNullValue());
+ push_type_args = PushArgument(BuildNullValue(node->token_pos()));
} else {
BuildTypecheckPushArguments(node->token_pos(), &push_type_args);
}
@@ -1718,7 +1723,7 @@ void EffectGraphVisitor::BuildTypeCast(ComparisonNode* node) {
PushArgumentInstr* push_left = PushArgument(for_value.value());
PushArgumentInstr* push_type_args = NULL;
if (type.IsInstantiated()) {
- push_type_args = PushArgument(BuildNullValue());
+ push_type_args = PushArgument(BuildNullValue(node->token_pos()));
} else {
BuildTypecheckPushArguments(node->token_pos(), &push_type_args);
}
@@ -1917,15 +1922,17 @@ void ValueGraphVisitor::VisitConditionalExprNode(ConditionalExprNode* node) {
ValueGraphVisitor for_true(owner());
node->true_expr()->Visit(&for_true);
ASSERT(for_true.is_open());
- for_true.Do(BuildStoreExprTemp(for_true.value()));
+ for_true.Do(BuildStoreExprTemp(for_true.value(),
+ node->true_expr()->token_pos()));
ValueGraphVisitor for_false(owner());
node->false_expr()->Visit(&for_false);
ASSERT(for_false.is_open());
- for_false.Do(BuildStoreExprTemp(for_false.value()));
+ for_false.Do(BuildStoreExprTemp(for_false.value(),
+ node->false_expr()->token_pos()));
Join(for_test, for_true, for_false);
- ReturnDefinition(BuildLoadExprTemp());
+ ReturnDefinition(BuildLoadExprTemp(node->token_pos()));
}
@@ -2288,8 +2295,8 @@ void EffectGraphVisitor::VisitAwaitMarkerNode(AwaitMarkerNode* node) {
ASSERT(jump_count == owner()->await_joins()->length());
// Store the counter in :await_jump_var.
Value* jump_val = Bind(new(Z) ConstantInstr(
- Smi::ZoneHandle(Z, Smi::New(jump_count))));
- Do(BuildStoreLocal(*jump_var, jump_val));
+ Smi::ZoneHandle(Z, Smi::New(jump_count)), node->token_pos()));
+ Do(BuildStoreLocal(*jump_var, jump_val, node->token_pos()));
// Save the current context for resuming.
BuildSaveContext(*ctx_var, node->token_pos());
}
@@ -2304,7 +2311,8 @@ intptr_t EffectGraphVisitor::GetCurrentTempLocalIndex() const {
}
-LocalVariable* EffectGraphVisitor::EnterTempLocalScope(Value* value) {
+LocalVariable* EffectGraphVisitor::EnterTempLocalScope(
+ Value* value, intptr_t token_pos) {
Do(new(Z) PushTempInstr(value));
owner()->AllocateTemp();
@@ -2321,8 +2329,9 @@ LocalVariable* EffectGraphVisitor::EnterTempLocalScope(Value* value) {
}
-Definition* EffectGraphVisitor::ExitTempLocalScope(LocalVariable* var) {
- Value* tmp = Bind(new(Z) LoadLocalInstr(*var));
+Definition* EffectGraphVisitor::ExitTempLocalScope(
+ LocalVariable* var, intptr_t token_pos) {
+ Value* tmp = Bind(new(Z) LoadLocalInstr(*var, token_pos));
owner()->DeallocateTemps(1);
ASSERT(GetCurrentTempLocalIndex() == var->index());
return new(Z) DropTempsInstr(1, tmp);
@@ -2400,13 +2409,14 @@ void EffectGraphVisitor::VisitArrayNode(ArrayNode* node) {
num_elements);
Value* array_val = Bind(create);
- { LocalVariable* tmp_var = EnterTempLocalScope(array_val);
+ { LocalVariable* tmp_var = EnterTempLocalScope(array_val, node->token_pos());
const intptr_t class_id = kArrayCid;
const intptr_t deopt_id = Thread::kNoDeoptId;
for (int i = 0; i < node->length(); ++i) {
- Value* array = Bind(new(Z) LoadLocalInstr(*tmp_var));
+ Value* array = Bind(new(Z) LoadLocalInstr(*tmp_var, node->token_pos()));
Value* index =
- Bind(new(Z) ConstantInstr(Smi::ZoneHandle(Z, Smi::New(i))));
+ Bind(new(Z) ConstantInstr(Smi::ZoneHandle(Z, Smi::New(i)),
+ node->token_pos()));
ValueGraphVisitor for_value(owner());
node->ElementAt(i)->Visit(&for_value);
Append(for_value);
@@ -2421,7 +2431,7 @@ void EffectGraphVisitor::VisitArrayNode(ArrayNode* node) {
index_scale, class_id, deopt_id, node->token_pos());
Do(store);
}
- ReturnDefinition(ExitTempLocalScope(tmp_var));
+ ReturnDefinition(ExitTempLocalScope(tmp_var, node->token_pos()));
}
}
@@ -2527,9 +2537,11 @@ void EffectGraphVisitor::VisitClosureNode(ClosureNode* node) {
alloc->set_closure_function(function);
Value* closure_val = Bind(alloc);
- { LocalVariable* closure_tmp_var = EnterTempLocalScope(closure_val);
+ { LocalVariable* closure_tmp_var =
+ EnterTempLocalScope(closure_val, node->token_pos());
// Store function.
- Value* closure_tmp_val = Bind(new(Z) LoadLocalInstr(*closure_tmp_var));
+ Value* closure_tmp_val =
+ Bind(new(Z) LoadLocalInstr(*closure_tmp_var, node->token_pos()));
Value* func_val =
Bind(new(Z) ConstantInstr(Function::ZoneHandle(Z, function.raw())));
Do(new(Z) StoreInstanceFieldInstr(Closure::function_offset(),
@@ -2543,9 +2555,11 @@ void EffectGraphVisitor::VisitClosureNode(ClosureNode* node) {
Value* allocated_context =
Bind(new(Z) AllocateContextInstr(node->token_pos(),
kNumContextVariables));
- { LocalVariable* context_tmp_var = EnterTempLocalScope(allocated_context);
+ { LocalVariable* context_tmp_var =
+ EnterTempLocalScope(allocated_context, node->token_pos());
// Store receiver in context.
- Value* context_tmp_val = Bind(new(Z) LoadLocalInstr(*context_tmp_var));
+ Value* context_tmp_val =
+ Bind(new(Z) LoadLocalInstr(*context_tmp_var, node->token_pos()));
ValueGraphVisitor for_receiver(owner());
node->receiver()->Visit(&for_receiver);
Append(for_receiver);
@@ -2556,14 +2570,16 @@ void EffectGraphVisitor::VisitClosureNode(ClosureNode* node) {
kEmitStoreBarrier,
node->token_pos()));
// Store new context in closure.
- closure_tmp_val = Bind(new(Z) LoadLocalInstr(*closure_tmp_var));
- context_tmp_val = Bind(new(Z) LoadLocalInstr(*context_tmp_var));
+ closure_tmp_val =
+ Bind(new(Z) LoadLocalInstr(*closure_tmp_var, node->token_pos()));
+ context_tmp_val =
+ Bind(new(Z) LoadLocalInstr(*context_tmp_var, node->token_pos()));
Do(new(Z) StoreInstanceFieldInstr(Closure::context_offset(),
closure_tmp_val,
context_tmp_val,
kEmitStoreBarrier,
node->token_pos()));
- Do(ExitTempLocalScope(context_tmp_var));
+ Do(ExitTempLocalScope(context_tmp_var, node->token_pos()));
}
} else {
// Store current context in closure.
@@ -2576,7 +2592,7 @@ void EffectGraphVisitor::VisitClosureNode(ClosureNode* node) {
kEmitStoreBarrier,
node->token_pos()));
}
- ReturnDefinition(ExitTempLocalScope(closure_tmp_var));
+ ReturnDefinition(ExitTempLocalScope(closure_tmp_var, node->token_pos()));
}
}
@@ -2595,34 +2611,34 @@ void EffectGraphVisitor::BuildPushArguments(
void EffectGraphVisitor::BuildInstanceCallConditional(InstanceCallNode* node) {
+ const intptr_t token_pos = node->token_pos();
LocalVariable* temp_var = owner()->parsed_function().expression_temp_var();
- LoadLocalNode* load_temp =
- new(Z) LoadLocalNode(Scanner::kNoSourcePos, temp_var);
+ LoadLocalNode* load_temp = new(Z) LoadLocalNode(token_pos, temp_var);
LiteralNode* null_constant =
- new(Z) LiteralNode(Scanner::kNoSourcePos, Object::null_instance());
+ new(Z) LiteralNode(token_pos, Object::null_instance());
ComparisonNode* check_is_null =
- new(Z) ComparisonNode(Scanner::kNoSourcePos,
+ new(Z) ComparisonNode(token_pos,
Token::kEQ,
load_temp,
null_constant);
- TestGraphVisitor for_test(owner(), Scanner::kNoSourcePos);
+ TestGraphVisitor for_test(owner(), token_pos);
check_is_null->Visit(&for_test);
EffectGraphVisitor for_true(owner());
EffectGraphVisitor for_false(owner());
StoreLocalNode* store_null =
- new(Z) StoreLocalNode(Scanner::kNoSourcePos, temp_var, null_constant);
+ new(Z) StoreLocalNode(token_pos, temp_var, null_constant);
store_null->Visit(&for_true);
InstanceCallNode* call =
- new(Z) InstanceCallNode(node->token_pos(),
+ new(Z) InstanceCallNode(token_pos,
load_temp,
node->function_name(),
node->arguments());
StoreLocalNode* store_result =
- new(Z) StoreLocalNode(Scanner::kNoSourcePos, temp_var, call);
+ new(Z) StoreLocalNode(token_pos, temp_var, call);
store_result->Visit(&for_false);
Join(for_test, for_true, for_false);
@@ -2634,9 +2650,9 @@ void ValueGraphVisitor::VisitInstanceCallNode(InstanceCallNode* node) {
ValueGraphVisitor for_receiver(owner());
node->receiver()->Visit(&for_receiver);
Append(for_receiver);
- Do(BuildStoreExprTemp(for_receiver.value()));
+ Do(BuildStoreExprTemp(for_receiver.value(), node->token_pos()));
BuildInstanceCallConditional(node);
- ReturnDefinition(BuildLoadExprTemp());
+ ReturnDefinition(BuildLoadExprTemp(node->token_pos()));
} else {
EffectGraphVisitor::VisitInstanceCallNode(node);
}
@@ -2648,7 +2664,7 @@ void EffectGraphVisitor::VisitInstanceCallNode(InstanceCallNode* node) {
node->receiver()->Visit(&for_receiver);
Append(for_receiver);
if (node->is_conditional()) {
- Do(BuildStoreExprTemp(for_receiver.value()));
+ Do(BuildStoreExprTemp(for_receiver.value(), node->token_pos()));
BuildInstanceCallConditional(node);
} else {
PushArgumentInstr* push_receiver = PushArgument(for_receiver.value());
@@ -2730,16 +2746,17 @@ void EffectGraphVisitor::BuildClosureCall(
node->closure()->Visit(&for_closure);
Append(for_closure);
- LocalVariable* tmp_var = EnterTempLocalScope(for_closure.value());
+ LocalVariable* tmp_var =
+ EnterTempLocalScope(for_closure.value(), node->token_pos());
ZoneGrowableArray<PushArgumentInstr*>* arguments =
new(Z) ZoneGrowableArray<PushArgumentInstr*>(node->arguments()->length());
- Value* closure_val = Bind(new(Z) LoadLocalInstr(*tmp_var));
+ Value* closure_val = Bind(new(Z) LoadLocalInstr(*tmp_var, node->token_pos()));
PushArgumentInstr* push_closure = PushArgument(closure_val);
arguments->Add(push_closure);
BuildPushArguments(*node->arguments(), arguments);
- closure_val = Bind(new(Z) LoadLocalInstr(*tmp_var));
+ closure_val = Bind(new(Z) LoadLocalInstr(*tmp_var, node->token_pos()));
LoadFieldInstr* function_load = new(Z) LoadFieldInstr(
closure_val,
Closure::function_offset(),
@@ -2752,11 +2769,11 @@ void EffectGraphVisitor::BuildClosureCall(
new(Z) ClosureCallInstr(function_val, node, arguments);
if (result_needed) {
Value* result = Bind(closure_call);
- Do(new(Z) StoreLocalInstr(*tmp_var, result));
+ Do(new(Z) StoreLocalInstr(*tmp_var, result, node->token_pos()));
} else {
Do(closure_call);
}
- ReturnDefinition(ExitTempLocalScope(tmp_var));
+ ReturnDefinition(ExitTempLocalScope(tmp_var, node->token_pos()));
}
@@ -2886,7 +2903,8 @@ void EffectGraphVisitor::VisitConstructorCallNode(ConstructorCallNode* node) {
}
-Value* EffectGraphVisitor::BuildInstantiator(const Class& instantiator_class) {
+Value* EffectGraphVisitor::BuildInstantiator(intptr_t token_pos,
+ const Class& instantiator_class) {
ASSERT(instantiator_class.NumTypeParameters() > 0);
Function& outer_function = Function::Handle(Z, owner()->function().raw());
while (outer_function.IsLocalFunction()) {
@@ -2898,7 +2916,7 @@ Value* EffectGraphVisitor::BuildInstantiator(const Class& instantiator_class) {
LocalVariable* instantiator = owner()->parsed_function().instantiator();
ASSERT(instantiator != NULL);
- Value* result = Bind(BuildLoadLocal(*instantiator));
+ Value* result = Bind(BuildLoadLocal(*instantiator, token_pos));
return result;
}
@@ -2934,10 +2952,10 @@ Value* EffectGraphVisitor::BuildInstantiatorTypeArguments(
LocalVariable* instantiator_var =
owner()->parsed_function().instantiator();
ASSERT(instantiator_var != NULL);
- return Bind(BuildLoadLocal(*instantiator_var));
+ return Bind(BuildLoadLocal(*instantiator_var, token_pos));
}
if (instantiator == NULL) {
- instantiator = BuildInstantiator(instantiator_class);
+ instantiator = BuildInstantiator(token_pos, instantiator_class);
}
// The instantiator is the receiver of the caller, which is not a factory.
// The receiver cannot be null; extract its TypeArguments object.
@@ -2951,7 +2969,7 @@ Value* EffectGraphVisitor::BuildInstantiatorTypeArguments(
instantiator,
type_arguments_field_offset,
Type::ZoneHandle(Z, Type::null()), // Not an instance, no type.
- Scanner::kNoSourcePos));
+ token_pos));
}
@@ -2995,11 +3013,12 @@ void ValueGraphVisitor::VisitConstructorCallNode(ConstructorCallNode* node) {
// tn <- LoadLocal(temp)
Value* allocate = BuildObjectAllocation(node);
- { LocalVariable* tmp_var = EnterTempLocalScope(allocate);
- Value* allocated_tmp = Bind(new(Z) LoadLocalInstr(*tmp_var));
+ { LocalVariable* tmp_var = EnterTempLocalScope(allocate, node->token_pos());
+ Value* allocated_tmp =
+ Bind(new(Z) LoadLocalInstr(*tmp_var, node->token_pos()));
PushArgumentInstr* push_allocated_value = PushArgument(allocated_tmp);
BuildConstructorCall(node, push_allocated_value);
- ReturnDefinition(ExitTempLocalScope(tmp_var));
+ ReturnDefinition(ExitTempLocalScope(tmp_var, node->token_pos()));
}
}
@@ -3007,33 +3026,32 @@ void ValueGraphVisitor::VisitConstructorCallNode(ConstructorCallNode* node) {
void EffectGraphVisitor::BuildInstanceGetterConditional(
InstanceGetterNode* node) {
+ const intptr_t token_pos = node->token_pos();
LocalVariable* temp_var = owner()->parsed_function().expression_temp_var();
- LoadLocalNode* load_temp =
- new(Z) LoadLocalNode(Scanner::kNoSourcePos, temp_var);
+ LoadLocalNode* load_temp = new(Z) LoadLocalNode(token_pos, temp_var);
LiteralNode* null_constant =
- new(Z) LiteralNode(Scanner::kNoSourcePos, Object::null_instance());
+ new(Z) LiteralNode(token_pos, Object::null_instance());
ComparisonNode* check_is_null =
- new(Z) ComparisonNode(Scanner::kNoSourcePos,
+ new(Z) ComparisonNode(token_pos,
Token::kEQ,
load_temp,
null_constant);
- TestGraphVisitor for_test(owner(), Scanner::kNoSourcePos);
+ TestGraphVisitor for_test(owner(), token_pos);
check_is_null->Visit(&for_test);
EffectGraphVisitor for_true(owner());
EffectGraphVisitor for_false(owner());
StoreLocalNode* store_null =
- new(Z) StoreLocalNode(Scanner::kNoSourcePos, temp_var, null_constant);
+ new(Z) StoreLocalNode(token_pos, temp_var, null_constant);
store_null->Visit(&for_true);
- InstanceGetterNode* getter =
- new(Z) InstanceGetterNode(node->token_pos(),
- load_temp,
- node->field_name());
+ InstanceGetterNode* getter = new(Z) InstanceGetterNode(node->token_pos(),
+ load_temp,
+ node->field_name());
StoreLocalNode* store_getter =
- new(Z) StoreLocalNode(Scanner::kNoSourcePos, temp_var, getter);
+ new(Z) StoreLocalNode(token_pos, temp_var, getter);
store_getter->Visit(&for_false);
Join(for_test, for_true, for_false);
@@ -3045,9 +3063,9 @@ void ValueGraphVisitor::VisitInstanceGetterNode(InstanceGetterNode* node) {
ValueGraphVisitor for_receiver(owner());
node->receiver()->Visit(&for_receiver);
Append(for_receiver);
- Do(BuildStoreExprTemp(for_receiver.value()));
+ Do(BuildStoreExprTemp(for_receiver.value(), node->token_pos()));
BuildInstanceGetterConditional(node);
- ReturnDefinition(BuildLoadExprTemp());
+ ReturnDefinition(BuildLoadExprTemp(node->token_pos()));
} else {
EffectGraphVisitor::VisitInstanceGetterNode(node);
}
@@ -3059,7 +3077,7 @@ void EffectGraphVisitor::VisitInstanceGetterNode(InstanceGetterNode* node) {
node->receiver()->Visit(&for_receiver);
Append(for_receiver);
if (node->is_conditional()) {
- Do(BuildStoreExprTemp(for_receiver.value()));
+ Do(BuildStoreExprTemp(for_receiver.value(), node->token_pos()));
BuildInstanceGetterConditional(node);
} else {
PushArgumentInstr* push_receiver = PushArgument(for_receiver.value());
@@ -3095,7 +3113,7 @@ void EffectGraphVisitor::BuildInstanceSetterArguments(
Value* value = NULL;
if (result_is_needed) {
- value = Bind(BuildStoreExprTemp(for_value.value()));
+ value = Bind(BuildStoreExprTemp(for_value.value(), node->token_pos()));
} else {
value = for_value.value();
}
@@ -3104,30 +3122,31 @@ void EffectGraphVisitor::BuildInstanceSetterArguments(
void EffectGraphVisitor::VisitInstanceSetterNode(InstanceSetterNode* node) {
+ const intptr_t token_pos = node->token_pos();
if (node->is_conditional()) {
ValueGraphVisitor for_receiver(owner());
node->receiver()->Visit(&for_receiver);
Append(for_receiver);
- Do(BuildStoreExprTemp(for_receiver.value()));
+ Do(BuildStoreExprTemp(for_receiver.value(), token_pos));
LocalVariable* temp_var = owner()->parsed_function().expression_temp_var();
LoadLocalNode* load_temp =
- new(Z) LoadLocalNode(Scanner::kNoSourcePos, temp_var);
+ new(Z) LoadLocalNode(token_pos, temp_var);
LiteralNode* null_constant =
- new(Z) LiteralNode(Scanner::kNoSourcePos, Object::null_instance());
+ new(Z) LiteralNode(token_pos, Object::null_instance());
ComparisonNode* check_is_null =
- new(Z) ComparisonNode(Scanner::kNoSourcePos,
+ new(Z) ComparisonNode(token_pos,
Token::kEQ,
load_temp,
null_constant);
- TestGraphVisitor for_test(owner(), Scanner::kNoSourcePos);
+ TestGraphVisitor for_test(owner(), token_pos);
check_is_null->Visit(&for_test);
EffectGraphVisitor for_true(owner());
EffectGraphVisitor for_false(owner());
InstanceSetterNode* setter =
- new(Z) InstanceSetterNode(node->token_pos(),
+ new(Z) InstanceSetterNode(token_pos,
load_temp,
node->field_name(),
node->value());
@@ -3141,7 +3160,7 @@ void EffectGraphVisitor::VisitInstanceSetterNode(InstanceSetterNode* node) {
const String& name =
String::ZoneHandle(Z, Field::SetterSymbol(node->field_name()));
const intptr_t kNumArgsChecked = 1; // Do not check value type.
- InstanceCallInstr* call = new(Z) InstanceCallInstr(node->token_pos(),
+ InstanceCallInstr* call = new(Z) InstanceCallInstr(token_pos,
name,
Token::kSET,
arguments,
@@ -3153,40 +3172,41 @@ void EffectGraphVisitor::VisitInstanceSetterNode(InstanceSetterNode* node) {
void ValueGraphVisitor::VisitInstanceSetterNode(InstanceSetterNode* node) {
+ const intptr_t token_pos = node->token_pos();
if (node->is_conditional()) {
ValueGraphVisitor for_receiver(owner());
node->receiver()->Visit(&for_receiver);
Append(for_receiver);
- Do(BuildStoreExprTemp(for_receiver.value()));
+ Do(BuildStoreExprTemp(for_receiver.value(), token_pos));
LocalVariable* temp_var = owner()->parsed_function().expression_temp_var();
LoadLocalNode* load_temp =
- new(Z) LoadLocalNode(Scanner::kNoSourcePos, temp_var);
+ new(Z) LoadLocalNode(token_pos, temp_var);
LiteralNode* null_constant =
- new(Z) LiteralNode(Scanner::kNoSourcePos, Object::null_instance());
+ new(Z) LiteralNode(token_pos, Object::null_instance());
ComparisonNode* check_is_null =
- new(Z) ComparisonNode(Scanner::kNoSourcePos,
+ new(Z) ComparisonNode(token_pos,
Token::kEQ,
load_temp,
null_constant);
- TestGraphVisitor for_test(owner(), Scanner::kNoSourcePos);
+ TestGraphVisitor for_test(owner(), token_pos);
check_is_null->Visit(&for_test);
ValueGraphVisitor for_true(owner());
null_constant->Visit(&for_true);
- for_true.Do(BuildStoreExprTemp(for_true.value()));
+ for_true.Do(BuildStoreExprTemp(for_true.value(), token_pos));
ValueGraphVisitor for_false(owner());
InstanceSetterNode* setter =
- new(Z) InstanceSetterNode(node->token_pos(),
+ new(Z) InstanceSetterNode(token_pos,
load_temp,
node->field_name(),
node->value());
setter->Visit(&for_false);
- for_false.Do(BuildStoreExprTemp(for_false.value()));
+ for_false.Do(BuildStoreExprTemp(for_false.value(), token_pos));
Join(for_test, for_true, for_false);
- ReturnDefinition(BuildLoadExprTemp());
+ ReturnDefinition(BuildLoadExprTemp(token_pos));
return;
}
ZoneGrowableArray<PushArgumentInstr*>* arguments =
@@ -3195,14 +3215,14 @@ void ValueGraphVisitor::VisitInstanceSetterNode(InstanceSetterNode* node) {
const String& name =
String::ZoneHandle(Z, Field::SetterSymbol(node->field_name()));
const intptr_t kNumArgsChecked = 1; // Do not check value type.
- Do(new(Z) InstanceCallInstr(node->token_pos(),
+ Do(new(Z) InstanceCallInstr(token_pos,
name,
Token::kSET,
arguments,
Object::null_array(),
kNumArgsChecked,
owner()->ic_data_array()));
- ReturnDefinition(BuildLoadExprTemp());
+ ReturnDefinition(BuildLoadExprTemp(token_pos));
}
@@ -3284,6 +3304,7 @@ void EffectGraphVisitor::BuildStaticSetter(StaticSetterNode* node,
String::ZoneHandle(Z, Field::SetterSymbol(node->field_name()));
ZoneGrowableArray<PushArgumentInstr*>* arguments =
new(Z) ZoneGrowableArray<PushArgumentInstr*>(1);
+ const intptr_t token_pos = node->token_pos();
// A super setter is an instance setter whose setter function is
// resolved at compile time (in the caller instance getter's super class).
// Unlike a static getter, a super getter has a receiver parameter.
@@ -3294,7 +3315,7 @@ void EffectGraphVisitor::BuildStaticSetter(StaticSetterNode* node,
if (is_super_setter) {
ASSERT(node->receiver() != NULL);
// Resolve and call noSuchMethod.
- ArgumentListNode* arguments = new(Z) ArgumentListNode(node->token_pos());
+ ArgumentListNode* arguments = new(Z) ArgumentListNode(token_pos);
arguments->Add(node->receiver());
arguments->Add(node->value());
call = BuildStaticNoSuchMethodCall(
@@ -3306,10 +3327,10 @@ void EffectGraphVisitor::BuildStaticSetter(StaticSetterNode* node,
true); // Super invocation.
} else {
// Throw a NoSuchMethodError.
- ArgumentListNode* arguments = new(Z) ArgumentListNode(node->token_pos());
+ ArgumentListNode* arguments = new(Z) ArgumentListNode(token_pos);
arguments->Add(node->value());
call = BuildThrowNoSuchMethodError(
- node->token_pos(),
+ token_pos,
node->cls(),
setter_name,
arguments, // Argument is the value passed to the setter.
@@ -3332,13 +3353,13 @@ void EffectGraphVisitor::BuildStaticSetter(StaticSetterNode* node,
Append(for_value);
Value* value = NULL;
if (result_is_needed) {
- value = Bind(BuildStoreExprTemp(for_value.value()));
+ value = Bind(BuildStoreExprTemp(for_value.value(), token_pos));
} else {
value = for_value.value();
}
arguments->Add(PushArgument(value));
- call = new(Z) StaticCallInstr(node->token_pos(),
+ call = new(Z) StaticCallInstr(token_pos,
setter_function,
Object::null_array(), // No names.
arguments,
@@ -3346,7 +3367,7 @@ void EffectGraphVisitor::BuildStaticSetter(StaticSetterNode* node,
}
if (result_is_needed) {
Do(call);
- ReturnDefinition(BuildLoadExprTemp());
+ ReturnDefinition(BuildLoadExprTemp(token_pos));
} else {
ReturnDefinition(call);
}
@@ -3382,10 +3403,11 @@ static intptr_t OffsetForLengthGetter(MethodRecognizer::Kind kind) {
}
-LoadLocalInstr* EffectGraphVisitor::BuildLoadThisVar(LocalScope* scope) {
+LoadLocalInstr* EffectGraphVisitor::BuildLoadThisVar(
+ LocalScope* scope, intptr_t token_pos) {
LocalVariable* receiver_var = scope->LookupVariable(Symbols::This(),
true); // Test only.
- return new(Z) LoadLocalInstr(*receiver_var);
+ return new(Z) LoadLocalInstr(*receiver_var, token_pos);
}
@@ -3395,7 +3417,7 @@ LoadFieldInstr* EffectGraphVisitor::BuildNativeGetter(
intptr_t offset,
const Type& type,
intptr_t class_id) {
- Value* receiver = Bind(BuildLoadThisVar(node->scope()));
+ Value* receiver = Bind(BuildLoadThisVar(node->scope(), node->token_pos()));
LoadFieldInstr* load = new(Z) LoadFieldInstr(receiver,
offset,
type,
@@ -3410,10 +3432,10 @@ ConstantInstr* EffectGraphVisitor::DoNativeSetterStoreValue(
NativeBodyNode* node,
intptr_t offset,
StoreBarrierType emit_store_barrier) {
- Value* receiver = Bind(BuildLoadThisVar(node->scope()));
+ Value* receiver = Bind(BuildLoadThisVar(node->scope(), node->token_pos()));
LocalVariable* value_var =
node->scope()->LookupVariable(Symbols::Value(), true);
- Value* value = Bind(new(Z) LoadLocalInstr(*value_var));
+ Value* value = Bind(new(Z) LoadLocalInstr(*value_var, node->token_pos()));
StoreInstanceFieldInstr* store = new(Z) StoreInstanceFieldInstr(
offset,
receiver,
@@ -3427,19 +3449,20 @@ ConstantInstr* EffectGraphVisitor::DoNativeSetterStoreValue(
void EffectGraphVisitor::VisitNativeBodyNode(NativeBodyNode* node) {
const Function& function = owner()->function();
+ const intptr_t token_pos = node->token_pos();
if (!function.IsClosureFunction()) {
MethodRecognizer::Kind kind = MethodRecognizer::RecognizeKind(function);
switch (kind) {
case MethodRecognizer::kObjectEquals: {
- Value* receiver = Bind(BuildLoadThisVar(node->scope()));
+ Value* receiver = Bind(BuildLoadThisVar(node->scope(), token_pos));
LocalVariable* other_var =
node->scope()->LookupVariable(Symbols::Other(),
true); // Test only.
- Value* other = Bind(new(Z) LoadLocalInstr(*other_var));
+ Value* other = Bind(new(Z) LoadLocalInstr(*other_var, token_pos));
// Receiver is not a number because numbers override equality.
const bool kNoNumberCheck = false;
StrictCompareInstr* compare =
- new(Z) StrictCompareInstr(node->token_pos(),
+ new(Z) StrictCompareInstr(token_pos,
Token::kEQ_STRICT,
receiver,
other,
@@ -3463,11 +3486,11 @@ void EffectGraphVisitor::VisitNativeBodyNode(NativeBodyNode* node) {
Smi::ZoneHandle(Z, Smi::New(0))));
Value* load_val = Bind(load);
StrictCompareInstr* compare =
- new(Z) StrictCompareInstr(node->token_pos(),
- Token::kEQ_STRICT,
- load_val,
- zero_val,
- false); // No number check.
+ new(Z) StrictCompareInstr(token_pos,
+ Token::kEQ_STRICT,
+ load_val,
+ zero_val,
+ false); // No number check.
return ReturnDefinition(compare);
}
case MethodRecognizer::kGrowableArrayLength:
@@ -3483,12 +3506,12 @@ void EffectGraphVisitor::VisitNativeBodyNode(NativeBodyNode* node) {
case MethodRecognizer::kClassIDgetID: {
LocalVariable* value_var =
node->scope()->LookupVariable(Symbols::Value(), true);
- Value* value = Bind(new(Z) LoadLocalInstr(*value_var));
+ Value* value = Bind(new(Z) LoadLocalInstr(*value_var, token_pos));
LoadClassIdInstr* load = new(Z) LoadClassIdInstr(value);
return ReturnDefinition(load);
}
case MethodRecognizer::kGrowableArrayCapacity: {
- Value* receiver = Bind(BuildLoadThisVar(node->scope()));
+ Value* receiver = Bind(BuildLoadThisVar(node->scope(), token_pos));
LoadFieldInstr* data_load = new(Z) LoadFieldInstr(
receiver,
Array::data_offset(),
@@ -3509,12 +3532,14 @@ void EffectGraphVisitor::VisitNativeBodyNode(NativeBodyNode* node) {
LocalVariable* type_args_parameter =
node->scope()->LookupVariable(Symbols::TypeArgumentsParameter(),
true);
- Value* element_type = Bind(new(Z) LoadLocalInstr(*type_args_parameter));
+ Value* element_type =
+ Bind(new(Z) LoadLocalInstr(*type_args_parameter, token_pos));
LocalVariable* length_parameter =
node->scope()->LookupVariable(Symbols::Length(), true);
- Value* length = Bind(new(Z) LoadLocalInstr(*length_parameter));
+ Value* length =
+ Bind(new(Z) LoadLocalInstr(*length_parameter, token_pos));
CreateArrayInstr* create_array =
- new CreateArrayInstr(node->token_pos(), element_type, length);
+ new CreateArrayInstr(token_pos, element_type, length);
return ReturnDefinition(create_array);
}
case MethodRecognizer::kBigint_getDigits: {
@@ -3673,6 +3698,7 @@ void EffectGraphVisitor::VisitLoadInstanceFieldNode(
void EffectGraphVisitor::VisitStoreInstanceFieldNode(
StoreInstanceFieldNode* node) {
+ const intptr_t token_pos = node->token_pos();
ValueGraphVisitor for_instance(owner());
node->instance()->Visit(&for_instance);
Append(for_instance);
@@ -3691,26 +3717,26 @@ void EffectGraphVisitor::VisitStoreInstanceFieldNode(
}
if (FLAG_use_field_guards) {
- store_value = Bind(BuildStoreExprTemp(store_value));
+ store_value = Bind(BuildStoreExprTemp(store_value, token_pos));
GuardFieldClassInstr* guard_field_class =
new(Z) GuardFieldClassInstr(store_value,
- node->field(),
- thread()->GetNextDeoptId());
+ node->field(),
+ thread()->GetNextDeoptId());
AddInstruction(guard_field_class);
- store_value = Bind(BuildLoadExprTemp());
+ store_value = Bind(BuildLoadExprTemp(token_pos));
GuardFieldLengthInstr* guard_field_length =
new(Z) GuardFieldLengthInstr(store_value,
node->field(),
thread()->GetNextDeoptId());
AddInstruction(guard_field_length);
- store_value = Bind(BuildLoadExprTemp());
+ store_value = Bind(BuildLoadExprTemp(token_pos));
}
StoreInstanceFieldInstr* store =
new(Z) StoreInstanceFieldInstr(node->field(),
for_instance.value(),
store_value,
kEmitStoreBarrier,
- node->token_pos());
+ token_pos);
// Maybe initializing unboxed store.
store->set_is_potential_unboxed_initialization(true);
ReturnDefinition(store);
@@ -3743,7 +3769,7 @@ Definition* EffectGraphVisitor::BuildStoreStaticField(
Append(for_value);
Value* store_value = NULL;
if (result_is_needed) {
- store_value = Bind(BuildStoreExprTemp(for_value.value()));
+ store_value = Bind(BuildStoreExprTemp(for_value.value(), token_pos));
} else {
store_value = for_value.value();
}
@@ -3752,7 +3778,7 @@ Definition* EffectGraphVisitor::BuildStoreStaticField(
if (result_is_needed) {
Do(store);
- return BuildLoadExprTemp();
+ return BuildLoadExprTemp(token_pos);
} else {
return store;
}
@@ -3835,6 +3861,7 @@ Definition* EffectGraphVisitor::BuildStoreIndexedValues(
StoreIndexedNode* node,
bool result_is_needed) {
Function* super_function = NULL;
+ const intptr_t token_pos = node->token_pos();
if (node->IsSuperStore()) {
// Resolve the store indexed operator in the super class.
super_function = &Function::ZoneHandle(
@@ -3843,7 +3870,7 @@ Definition* EffectGraphVisitor::BuildStoreIndexedValues(
if (super_function->IsNull()) {
// Could not resolve super operator. Generate call noSuchMethod() of the
// super class instead.
- ArgumentListNode* arguments = new(Z) ArgumentListNode(node->token_pos());
+ ArgumentListNode* arguments = new(Z) ArgumentListNode(token_pos);
arguments->Add(node->array());
arguments->Add(node->index_expr());
arguments->Add(node->value());
@@ -3857,7 +3884,7 @@ Definition* EffectGraphVisitor::BuildStoreIndexedValues(
if (result_is_needed) {
Do(call);
// BuildStaticNoSuchMethodCall stores the value in expression_temp.
- return BuildLoadExprTemp();
+ return BuildLoadExprTemp(token_pos);
} else {
return call;
}
@@ -3881,7 +3908,7 @@ Definition* EffectGraphVisitor::BuildStoreIndexedValues(
Append(for_value);
Value* value = NULL;
if (result_is_needed) {
- value = Bind(BuildStoreExprTemp(for_value.value()));
+ value = Bind(BuildStoreExprTemp(for_value.value(), token_pos));
} else {
value = for_value.value();
}
@@ -3891,14 +3918,14 @@ Definition* EffectGraphVisitor::BuildStoreIndexedValues(
// Generate static call to super operator []=.
StaticCallInstr* store =
- new(Z) StaticCallInstr(node->token_pos(),
+ new(Z) StaticCallInstr(token_pos,
*super_function,
Object::null_array(),
arguments,
owner()->ic_data_array());
if (result_is_needed) {
Do(store);
- return BuildLoadExprTemp();
+ return BuildLoadExprTemp(token_pos);
} else {
return store;
}
@@ -3908,7 +3935,7 @@ Definition* EffectGraphVisitor::BuildStoreIndexedValues(
const String& name =
String::ZoneHandle(Z, Symbols::New(Token::Str(Token::kASSIGN_INDEX)));
InstanceCallInstr* store =
- new(Z) InstanceCallInstr(node->token_pos(),
+ new(Z) InstanceCallInstr(token_pos,
name,
Token::kASSIGN_INDEX,
arguments,
@@ -3917,7 +3944,7 @@ Definition* EffectGraphVisitor::BuildStoreIndexedValues(
owner()->ic_data_array());
if (result_is_needed) {
Do(store);
- return BuildLoadExprTemp();
+ return BuildLoadExprTemp(token_pos);
} else {
return store;
}
@@ -4008,7 +4035,8 @@ void EffectGraphVisitor::VisitSequenceNode(SequenceNode* node) {
Value* allocated_context =
Bind(new(Z) AllocateContextInstr(node->token_pos(),
num_context_variables));
- { LocalVariable* tmp_var = EnterTempLocalScope(allocated_context);
+ { LocalVariable* tmp_var =
+ EnterTempLocalScope(allocated_context, node->token_pos());
if (!is_top_level_sequence || HasContextScope()) {
ASSERT(is_top_level_sequence ||
(nested_block.ContextLevel() ==
@@ -4023,7 +4051,7 @@ void EffectGraphVisitor::VisitSequenceNode(SequenceNode* node) {
node->token_pos()));
}
Do(BuildStoreContext(
- Bind(ExitTempLocalScope(tmp_var)),
+ Bind(ExitTempLocalScope(tmp_var, node->token_pos())),
node->token_pos()));
}
@@ -4053,14 +4081,14 @@ void EffectGraphVisitor::VisitSequenceNode(SequenceNode* node) {
temp_local->set_is_captured_parameter(true);
// Copy parameter from local frame to current context.
- Value* load = Bind(BuildLoadLocal(*temp_local));
- Do(BuildStoreLocal(parameter, load));
+ Value* load = Bind(BuildLoadLocal(*temp_local, node->token_pos()));
+ Do(BuildStoreLocal(parameter, load, node->token_pos()));
// Write NULL to the source location to detect buggy accesses and
// allow GC of passed value if it gets overwritten by a new value in
// the function.
Value* null_constant = Bind(new(Z) ConstantInstr(
Object::ZoneHandle(Z, Object::null())));
- Do(BuildStoreLocal(*temp_local, null_constant));
+ Do(BuildStoreLocal(*temp_local, null_constant, node->token_pos()));
}
}
}
@@ -4122,7 +4150,8 @@ void EffectGraphVisitor::VisitSequenceNode(SequenceNode* node) {
NULL,
parameter.type(),
parameter.name())) {
- Value* parameter_value = Bind(BuildLoadLocal(parameter));
+ Value* parameter_value =
+ Bind(BuildLoadLocal(parameter, parameter.token_pos()));
Do(BuildAssertAssignable(parameter.token_pos(),
parameter_value,
parameter.type(),
@@ -4181,7 +4210,7 @@ void EffectGraphVisitor::VisitSequenceNode(SequenceNode* node) {
exit_ = NULL;
LoadLocalNode* load_jump_count =
- new(Z) LoadLocalNode(Scanner::kNoSourcePos, jump_var);
+ new(Z) LoadLocalNode(node->token_pos(), jump_var);
ComparisonNode* check_jump_count;
const intptr_t num_await_states = owner()->await_joins()->length();
@@ -4189,12 +4218,12 @@ void EffectGraphVisitor::VisitSequenceNode(SequenceNode* node) {
Symbols::AwaitContextVar(), false);
for (intptr_t i = 0; i < num_await_states; i++) {
check_jump_count = new(Z) ComparisonNode(
- Scanner::kNoSourcePos,
+ node->token_pos(),
Token::kEQ,
load_jump_count,
new(Z) LiteralNode(
- Scanner::kNoSourcePos, Smi::ZoneHandle(Z, Smi::New(i))));
- TestGraphVisitor for_test(owner(), Scanner::kNoSourcePos);
+ node->token_pos(), Smi::ZoneHandle(Z, Smi::New(i))));
+ TestGraphVisitor for_test(owner(), node->token_pos());
check_jump_count->Visit(&for_test);
EffectGraphVisitor for_true(owner());
EffectGraphVisitor for_false(owner());
@@ -4206,7 +4235,7 @@ void EffectGraphVisitor::VisitSequenceNode(SequenceNode* node) {
// Restore the saved continuation context, i.e. the context that was
// saved into :await_ctx_var before the closure suspended.
- for_true.BuildRestoreContext(*old_context, Scanner::kNoSourcePos);
+ for_true.BuildRestoreContext(*old_context, node->token_pos());
// Goto saved join.
for_true.Goto((*owner()->await_joins())[i]);
@@ -4341,11 +4370,11 @@ void EffectGraphVisitor::VisitTryCatchNode(TryCatchNode* node) {
node->rethrow_clause()->Visit(&for_finally);
if (for_finally.is_open()) {
// Rethrow the exception. Manually build the graph for rethrow.
- Value* exception = for_finally.Bind(
- for_finally.BuildLoadLocal(catch_block->rethrow_exception_var()));
+ Value* exception = for_finally.Bind(for_finally.BuildLoadLocal(
+ catch_block->rethrow_exception_var(), finally_block->token_pos()));
for_finally.PushArgument(exception);
- Value* stacktrace = for_finally.Bind(
- for_finally.BuildLoadLocal(catch_block->rethrow_stacktrace_var()));
+ Value* stacktrace = for_finally.Bind(for_finally.BuildLoadLocal(
+ catch_block->rethrow_stacktrace_var(), finally_block->token_pos()));
for_finally.PushArgument(stacktrace);
for_finally.AddInstruction(
new(Z) ReThrowInstr(catch_block->token_pos(), catch_handler_index));

Powered by Google App Engine
This is Rietveld 408576698