| Index: runtime/vm/flow_graph_builder.cc
|
| diff --git a/runtime/vm/flow_graph_builder.cc b/runtime/vm/flow_graph_builder.cc
|
| index 76c6161a5299b9d6f34868311f2e1b6166a85d36..c3645b11f1c2515b30a2716e55b922fcb082d96d 100644
|
| --- a/runtime/vm/flow_graph_builder.cc
|
| +++ b/runtime/vm/flow_graph_builder.cc
|
| @@ -48,6 +48,9 @@ DECLARE_FLAG(bool, use_field_guards);
|
| // Quick access to the locally defined zone() method.
|
| #define Z (zone())
|
|
|
| +// Quick synthetic token position.
|
| +#define ST(token_pos) Token::ToSynthetic(token_pos)
|
| +
|
| // TODO(srdjan): Allow compiler to add constants as they are encountered in
|
| // the compilation.
|
| const double kCommonDoubleConstants[] =
|
| @@ -829,20 +832,26 @@ 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);
|
| + ASSERT(!Token::IsClassifying(token_pos));
|
| + return new(Z) StoreLocalInstr(local, value, ST(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) {
|
| + ASSERT(!Token::IsClassifying(token_pos));
|
| + return BuildLoadLocal(*owner()->parsed_function().expression_temp_var(),
|
| + token_pos);
|
| }
|
|
|
|
|
| @@ -850,7 +859,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 +869,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 +877,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);
|
| }
|
| @@ -903,6 +912,7 @@ Definition* EffectGraphVisitor::BuildLoadLocal(const LocalVariable& local,
|
| void EffectGraphVisitor::BuildSaveContext(
|
| const LocalVariable& variable,
|
| intptr_t token_pos) {
|
| + ASSERT(Token::IsSynthetic(token_pos) || Token::IsNoSource(token_pos));
|
| Value* context = Bind(BuildCurrentContext(token_pos));
|
| Do(BuildStoreLocal(variable, context, token_pos));
|
| }
|
| @@ -1122,7 +1132,7 @@ void EffectGraphVisitor::VisitReturnNode(ReturnNode* node) {
|
| // statements for which there is no associated source position.
|
| const Function& function = owner()->function();
|
| if (FLAG_support_debugger &&
|
| - (node->token_pos() >= 0) && !function.is_native()) {
|
| + Token::IsDebugPause(node->token_pos()) && !function.is_native()) {
|
| AddInstruction(new(Z) DebugStepCheckInstr(node->token_pos(),
|
| RawPcDescriptors::kRuntimeCall));
|
| }
|
| @@ -1177,7 +1187,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 +1196,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 +1209,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 +1435,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 +1514,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 +1538,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 +1551,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 +1566,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 +1677,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 +1729,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 +1928,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()));
|
| }
|
|
|
|
|
| @@ -2273,6 +2286,8 @@ void EffectGraphVisitor::VisitAwaitMarkerNode(AwaitMarkerNode* node) {
|
| // We need to create a new await state which involves:
|
| // * Increase the jump counter. Sanity check against the list of targets.
|
| // * Save the current context for resuming.
|
| + ASSERT(Token::IsSynthetic(node->token_pos()) ||
|
| + Token::IsNoSource(node->token_pos()));
|
| ASSERT(node->async_scope() != NULL);
|
| ASSERT(node->await_scope() != NULL);
|
| LocalVariable* jump_var = node->async_scope()->LookupVariable(
|
| @@ -2288,8 +2303,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 +2319,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();
|
|
|
| @@ -2313,7 +2329,7 @@ LocalVariable* EffectGraphVisitor::EnterTempLocalScope(Value* value) {
|
| char name[64];
|
| OS::SNPrint(name, 64, ":tmp_local%" Pd, index);
|
| LocalVariable* var =
|
| - new(Z) LocalVariable(Scanner::kNoSourcePos,
|
| + new(Z) LocalVariable(Token::kNoSourcePos,
|
| String::ZoneHandle(Z, Symbols::New(name)),
|
| *value->Type()->ToAbstractType());
|
| var->set_index(index);
|
| @@ -2321,8 +2337,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 +2417,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 +2439,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 +2545,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 +2563,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 +2578,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 +2600,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 +2619,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(ST(token_pos), Object::null_instance());
|
| ComparisonNode* check_is_null =
|
| - new(Z) ComparisonNode(Scanner::kNoSourcePos,
|
| + new(Z) ComparisonNode(ST(token_pos),
|
| Token::kEQ,
|
| load_temp,
|
| null_constant);
|
| - TestGraphVisitor for_test(owner(), Scanner::kNoSourcePos);
|
| + TestGraphVisitor for_test(owner(), ST(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(ST(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(ST(token_pos), temp_var, call);
|
| store_result->Visit(&for_false);
|
|
|
| Join(for_test, for_true, for_false);
|
| @@ -2634,9 +2658,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 +2672,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 +2754,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 +2777,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, ST(node->token_pos())));
|
| } else {
|
| Do(closure_call);
|
| }
|
| - ReturnDefinition(ExitTempLocalScope(tmp_var));
|
| + ReturnDefinition(ExitTempLocalScope(tmp_var, node->token_pos()));
|
| }
|
|
|
|
|
| @@ -2886,7 +2911,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 +2924,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 +2960,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 +2977,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 +3021,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 +3034,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(ST(token_pos), Object::null_instance());
|
| ComparisonNode* check_is_null =
|
| - new(Z) ComparisonNode(Scanner::kNoSourcePos,
|
| + new(Z) ComparisonNode(ST(token_pos),
|
| Token::kEQ,
|
| load_temp,
|
| null_constant);
|
| - TestGraphVisitor for_test(owner(), Scanner::kNoSourcePos);
|
| + TestGraphVisitor for_test(owner(), ST(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(ST(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(token_pos,
|
| + load_temp,
|
| + node->field_name());
|
| StoreLocalNode* store_getter =
|
| - new(Z) StoreLocalNode(Scanner::kNoSourcePos, temp_var, getter);
|
| + new(Z) StoreLocalNode(ST(token_pos), temp_var, getter);
|
| store_getter->Visit(&for_false);
|
|
|
| Join(for_test, for_true, for_false);
|
| @@ -3045,9 +3071,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 +3085,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 +3121,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 +3130,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(ST(token_pos), temp_var);
|
| LiteralNode* null_constant =
|
| - new(Z) LiteralNode(Scanner::kNoSourcePos, Object::null_instance());
|
| + new(Z) LiteralNode(ST(token_pos), Object::null_instance());
|
| ComparisonNode* check_is_null =
|
| - new(Z) ComparisonNode(Scanner::kNoSourcePos,
|
| + new(Z) ComparisonNode(ST(token_pos),
|
| Token::kEQ,
|
| load_temp,
|
| null_constant);
|
| - TestGraphVisitor for_test(owner(), Scanner::kNoSourcePos);
|
| + TestGraphVisitor for_test(owner(), ST(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 +3168,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 +3180,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(ST(token_pos), temp_var);
|
| LiteralNode* null_constant =
|
| - new(Z) LiteralNode(Scanner::kNoSourcePos, Object::null_instance());
|
| + new(Z) LiteralNode(ST(token_pos), Object::null_instance());
|
| ComparisonNode* check_is_null =
|
| - new(Z) ComparisonNode(Scanner::kNoSourcePos,
|
| + new(Z) ComparisonNode(ST(token_pos),
|
| Token::kEQ,
|
| load_temp,
|
| null_constant);
|
| - TestGraphVisitor for_test(owner(), Scanner::kNoSourcePos);
|
| + TestGraphVisitor for_test(owner(), ST(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 +3223,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 +3312,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 +3323,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 +3335,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 +3361,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 +3375,7 @@ void EffectGraphVisitor::BuildStaticSetter(StaticSetterNode* node,
|
| }
|
| if (result_is_needed) {
|
| Do(call);
|
| - ReturnDefinition(BuildLoadExprTemp());
|
| + ReturnDefinition(BuildLoadExprTemp(token_pos));
|
| } else {
|
| ReturnDefinition(call);
|
| }
|
| @@ -3382,10 +3411,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 +3425,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 +3440,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 +3457,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 +3494,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 +3514,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 +3540,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: {
|
| @@ -3627,7 +3660,7 @@ void EffectGraphVisitor::VisitStoreLocalNode(StoreLocalNode* node) {
|
| !node->value()->AsLoadLocalNode()->local().IsInternal()) ||
|
| node->value()->IsClosureNode()) &&
|
| !node->local().IsInternal() &&
|
| - (node->token_pos() >= 0)) {
|
| + Token::IsDebugPause(node->token_pos())) {
|
| AddInstruction(new(Z) DebugStepCheckInstr(
|
| node->token_pos(), RawPcDescriptors::kRuntimeCall));
|
| }
|
| @@ -3673,6 +3706,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 +3725,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 +3777,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 +3786,7 @@ Definition* EffectGraphVisitor::BuildStoreStaticField(
|
|
|
| if (result_is_needed) {
|
| Do(store);
|
| - return BuildLoadExprTemp();
|
| + return BuildLoadExprTemp(token_pos);
|
| } else {
|
| return store;
|
| }
|
| @@ -3835,6 +3869,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 +3878,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 +3892,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 +3916,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 +3926,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 +3943,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 +3952,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 +4043,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 +4059,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()));
|
| }
|
|
|
| @@ -4041,7 +4077,7 @@ void EffectGraphVisitor::VisitSequenceNode(SequenceNode* node) {
|
| // Create a temporary local describing the original position.
|
| const String& temp_name = Symbols::TempParam();
|
| LocalVariable* temp_local = new(Z) LocalVariable(
|
| - Scanner::kNoSourcePos, // Token index.
|
| + Token::kNoSourcePos, // Token index.
|
| temp_name,
|
| Object::dynamic_type()); // Type.
|
| temp_local->set_index(param_frame_index);
|
| @@ -4053,14 +4089,16 @@ 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, ST(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,
|
| + ST(node->token_pos())));
|
| }
|
| }
|
| }
|
| @@ -4074,15 +4112,15 @@ void EffectGraphVisitor::VisitSequenceNode(SequenceNode* node) {
|
| // basic block. Place this check at the last parameter to ensure parameters
|
| // are in scope in the debugger at method entry.
|
| const int num_params = function.NumParameters();
|
| - intptr_t check_pos = Scanner::kNoSourcePos;
|
| + intptr_t check_pos = Token::kNoSourcePos;
|
| if (num_params > 0) {
|
| const LocalVariable& parameter = *scope->VariableAt(num_params - 1);
|
| check_pos = parameter.token_pos();
|
| }
|
| - if (check_pos < 0) {
|
| + if (!Token::IsDebugPause(check_pos)) {
|
| // No parameters or synthetic parameters.
|
| check_pos = node->token_pos();
|
| - ASSERT(check_pos >= 0);
|
| + ASSERT(Token::IsDebugPause(check_pos));
|
| }
|
| AddInstruction(new(Z) DebugStepCheckInstr(check_pos,
|
| RawPcDescriptors::kRuntimeCall));
|
| @@ -4122,7 +4160,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 +4220,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 +4228,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,
|
| + ST(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);
|
| + ST(node->token_pos()), Smi::ZoneHandle(Z, Smi::New(i))));
|
| + TestGraphVisitor for_test(owner(), ST(node->token_pos()));
|
| check_jump_count->Visit(&for_test);
|
| EffectGraphVisitor for_true(owner());
|
| EffectGraphVisitor for_false(owner());
|
| @@ -4206,7 +4245,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, ST(node->token_pos()));
|
|
|
| // Goto saved join.
|
| for_true.Goto((*owner()->await_joins())[i]);
|
| @@ -4264,7 +4303,7 @@ void EffectGraphVisitor::VisitTryCatchNode(TryCatchNode* node) {
|
| owner()->set_try_index(try_handler_index);
|
|
|
| // Preserve current context into local variable ':saved_try_context_var'.
|
| - BuildSaveContext(node->context_var(), node->token_pos());
|
| + BuildSaveContext(node->context_var(), ST(node->token_pos()));
|
|
|
| EffectGraphVisitor for_try(owner());
|
| node->try_block()->Visit(&for_try);
|
| @@ -4341,11 +4380,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));
|
|
|