| 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));
|
|
|