Index: runtime/vm/flow_graph_builder.cc |
diff --git a/runtime/vm/flow_graph_builder.cc b/runtime/vm/flow_graph_builder.cc |
index ee6294913f30da1b96e19984df8e10a2b8510b1b..861721af4a519d836c6f73c7fae214a8350c1ab6 100644 |
--- a/runtime/vm/flow_graph_builder.cc |
+++ b/runtime/vm/flow_graph_builder.cc |
@@ -49,7 +49,7 @@ DECLARE_FLAG(bool, use_field_guards); |
#define Z (zone()) |
// Quick synthetic token position. |
-#define ST(token_pos) Token::ToSynthetic(token_pos) |
+#define ST(token_pos) ((token_pos).ToSynthetic()) |
// TODO(srdjan): Allow compiler to add constants as they are encountered in |
// the compilation. |
@@ -560,7 +560,7 @@ void InlineExitCollector::ReplaceCall(TargetEntryInstr* callee_entry) { |
ConstantInstr* true_const = caller_graph_->GetConstant(Bool::True()); |
BranchInstr* branch = |
new(Z) BranchInstr( |
- new(Z) StrictCompareInstr(call_block->start_pos(), |
+ new(Z) StrictCompareInstr(TokenPosition::kNoSource, |
Token::kEQ_STRICT, |
new(Z) Value(true_const), |
new(Z) Value(true_const), |
@@ -707,7 +707,8 @@ void EffectGraphVisitor::AddInstruction(Instruction* instruction) { |
} |
-void EffectGraphVisitor::AddReturnExit(intptr_t token_pos, Value* value) { |
+void EffectGraphVisitor::AddReturnExit(TokenPosition token_pos, |
+ Value* value) { |
ASSERT(is_open()); |
ReturnInstr* return_instr = new(Z) ReturnInstr(token_pos, value); |
AddInstruction(return_instr); |
@@ -781,7 +782,7 @@ void EffectGraphVisitor::Join(const TestGraphVisitor& test_fragment, |
void EffectGraphVisitor::TieLoop( |
- intptr_t token_pos, |
+ TokenPosition token_pos, |
const TestGraphVisitor& test_fragment, |
const EffectGraphVisitor& body_fragment, |
const EffectGraphVisitor& test_preamble_fragment) { |
@@ -833,23 +834,23 @@ PushArgumentInstr* EffectGraphVisitor::PushArgument(Value* value) { |
Definition* EffectGraphVisitor::BuildStoreTemp(const LocalVariable& local, |
Value* value, |
- intptr_t token_pos) { |
+ TokenPosition token_pos) { |
ASSERT(!local.is_captured()); |
- ASSERT(!Token::IsClassifying(token_pos)); |
+ ASSERT(!token_pos.IsClassifying()); |
return new(Z) StoreLocalInstr(local, value, ST(token_pos)); |
} |
Definition* EffectGraphVisitor::BuildStoreExprTemp(Value* value, |
- intptr_t token_pos) { |
+ TokenPosition token_pos) { |
return BuildStoreTemp(*owner()->parsed_function().expression_temp_var(), |
value, |
token_pos); |
} |
-Definition* EffectGraphVisitor::BuildLoadExprTemp(intptr_t token_pos) { |
- ASSERT(!Token::IsClassifying(token_pos)); |
+Definition* EffectGraphVisitor::BuildLoadExprTemp(TokenPosition token_pos) { |
+ ASSERT(!token_pos.IsClassifying()); |
return BuildLoadLocal(*owner()->parsed_function().expression_temp_var(), |
token_pos); |
} |
@@ -857,7 +858,7 @@ Definition* EffectGraphVisitor::BuildLoadExprTemp(intptr_t token_pos) { |
Definition* EffectGraphVisitor::BuildStoreLocal(const LocalVariable& local, |
Value* value, |
- intptr_t token_pos) { |
+ TokenPosition token_pos) { |
if (local.is_captured()) { |
LocalVariable* tmp_var = EnterTempLocalScope(value, token_pos); |
intptr_t delta = |
@@ -885,7 +886,7 @@ Definition* EffectGraphVisitor::BuildStoreLocal(const LocalVariable& local, |
Definition* EffectGraphVisitor::BuildLoadLocal(const LocalVariable& local, |
- intptr_t token_pos) { |
+ TokenPosition token_pos) { |
if (local.IsConst()) { |
return new(Z) ConstantInstr(*local.ConstValue(), token_pos); |
} else if (local.is_captured()) { |
@@ -911,8 +912,8 @@ Definition* EffectGraphVisitor::BuildLoadLocal(const LocalVariable& local, |
// Stores current context into the 'variable' |
void EffectGraphVisitor::BuildSaveContext( |
const LocalVariable& variable, |
- intptr_t token_pos) { |
- ASSERT(Token::IsSynthetic(token_pos) || Token::IsNoSource(token_pos)); |
+ TokenPosition token_pos) { |
+ ASSERT(token_pos.IsSynthetic() || token_pos.IsNoSource()); |
Value* context = Bind(BuildCurrentContext(token_pos)); |
Do(BuildStoreLocal(variable, context, token_pos)); |
} |
@@ -921,20 +922,20 @@ void EffectGraphVisitor::BuildSaveContext( |
// Loads context saved in 'context_variable' into the current context. |
void EffectGraphVisitor::BuildRestoreContext( |
const LocalVariable& variable, |
- intptr_t token_pos) { |
+ TokenPosition token_pos) { |
Value* load_saved_context = Bind(BuildLoadLocal(variable, token_pos)); |
Do(BuildStoreContext(load_saved_context, token_pos)); |
} |
Definition* EffectGraphVisitor::BuildStoreContext( |
- Value* value, intptr_t token_pos) { |
+ Value* value, TokenPosition token_pos) { |
return new(Z) StoreLocalInstr( |
*owner()->parsed_function().current_context_var(), value, token_pos); |
} |
-Definition* EffectGraphVisitor::BuildCurrentContext(intptr_t token_pos) { |
+Definition* EffectGraphVisitor::BuildCurrentContext(TokenPosition token_pos) { |
return new(Z) LoadLocalInstr( |
*owner()->parsed_function().current_context_var(), |
token_pos); |
@@ -1132,7 +1133,8 @@ void EffectGraphVisitor::VisitReturnNode(ReturnNode* node) { |
// statements for which there is no associated source position. |
const Function& function = owner()->function(); |
if (FLAG_support_debugger && |
- Token::IsDebugPause(node->token_pos()) && !function.is_native()) { |
+ node->token_pos().IsDebugPause() && |
+ !function.is_native()) { |
AddInstruction(new(Z) DebugStepCheckInstr(node->token_pos(), |
RawPcDescriptors::kRuntimeCall)); |
} |
@@ -1266,7 +1268,7 @@ void ValueGraphVisitor::VisitTypeNode(TypeNode* node) { |
// Returns true if the type check can be skipped, for example, if the |
// destination type is dynamic or if the compile type of the value is a subtype |
// of the destination type. |
-bool EffectGraphVisitor::CanSkipTypeCheck(intptr_t token_pos, |
+bool EffectGraphVisitor::CanSkipTypeCheck(TokenPosition token_pos, |
Value* value, |
const AbstractType& dst_type, |
const String& dst_name) { |
@@ -1507,7 +1509,7 @@ void EffectGraphVisitor::VisitBinaryOpWithMask32Node( |
void EffectGraphVisitor::BuildTypecheckPushArguments( |
- intptr_t token_pos, |
+ TokenPosition token_pos, |
PushArgumentInstr** push_instantiator_type_arguments_result) { |
const Class& instantiator_class = Class::Handle( |
Z, owner()->function().Owner()); |
@@ -1530,7 +1532,7 @@ void EffectGraphVisitor::BuildTypecheckPushArguments( |
void EffectGraphVisitor::BuildTypecheckArguments( |
- intptr_t token_pos, |
+ TokenPosition token_pos, |
Value** instantiator_type_arguments_result) { |
Value* instantiator = NULL; |
Value* instantiator_type_arguments = NULL; |
@@ -1551,7 +1553,7 @@ void EffectGraphVisitor::BuildTypecheckArguments( |
} |
-Value* EffectGraphVisitor::BuildNullValue(intptr_t token_pos) { |
+Value* EffectGraphVisitor::BuildNullValue(TokenPosition token_pos) { |
return Bind(new(Z) ConstantInstr(Object::ZoneHandle(Z, Object::null()), |
token_pos)); |
} |
@@ -1559,7 +1561,7 @@ Value* EffectGraphVisitor::BuildNullValue(intptr_t token_pos) { |
// Used for testing incoming arguments. |
AssertAssignableInstr* EffectGraphVisitor::BuildAssertAssignable( |
- intptr_t token_pos, |
+ TokenPosition token_pos, |
Value* value, |
const AbstractType& dst_type, |
const String& dst_name) { |
@@ -1582,7 +1584,7 @@ AssertAssignableInstr* EffectGraphVisitor::BuildAssertAssignable( |
// Used for type casts and to test assignments. |
-Value* EffectGraphVisitor::BuildAssignableValue(intptr_t token_pos, |
+Value* EffectGraphVisitor::BuildAssignableValue(TokenPosition token_pos, |
Value* value, |
const AbstractType& dst_type, |
const String& dst_name) { |
@@ -1752,10 +1754,11 @@ void EffectGraphVisitor::BuildTypeCast(ComparisonNode* node) { |
} |
-StrictCompareInstr* EffectGraphVisitor::BuildStrictCompare(AstNode* left, |
- AstNode* right, |
- Token::Kind kind, |
- intptr_t token_pos) { |
+StrictCompareInstr* EffectGraphVisitor::BuildStrictCompare( |
+ AstNode* left, |
+ AstNode* right, |
+ Token::Kind kind, |
+ TokenPosition token_pos) { |
ValueGraphVisitor for_left_value(owner()); |
left->Visit(&for_left_value); |
Append(for_left_value); |
@@ -2286,8 +2289,7 @@ 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->token_pos().IsSynthetic() || node->token_pos().IsNoSource()); |
ASSERT(node->async_scope() != NULL); |
ASSERT(node->await_scope() != NULL); |
LocalVariable* jump_var = node->async_scope()->LookupVariable( |
@@ -2320,7 +2322,7 @@ intptr_t EffectGraphVisitor::GetCurrentTempLocalIndex() const { |
LocalVariable* EffectGraphVisitor::EnterTempLocalScope( |
- Value* value, intptr_t token_pos) { |
+ Value* value, TokenPosition token_pos) { |
Do(new(Z) PushTempInstr(value)); |
owner()->AllocateTemp(); |
@@ -2329,7 +2331,7 @@ LocalVariable* EffectGraphVisitor::EnterTempLocalScope( |
char name[64]; |
OS::SNPrint(name, 64, ":tmp_local%" Pd, index); |
LocalVariable* var = |
- new(Z) LocalVariable(Token::kNoSourcePos, |
+ new(Z) LocalVariable(TokenPosition::kNoSource, |
String::ZoneHandle(Z, Symbols::New(name)), |
*value->Type()->ToAbstractType()); |
var->set_index(index); |
@@ -2338,7 +2340,7 @@ LocalVariable* EffectGraphVisitor::EnterTempLocalScope( |
Definition* EffectGraphVisitor::ExitTempLocalScope( |
- LocalVariable* var, intptr_t token_pos) { |
+ LocalVariable* var, TokenPosition token_pos) { |
Value* tmp = Bind(new(Z) LoadLocalInstr(*var, token_pos)); |
owner()->DeallocateTemps(1); |
ASSERT(GetCurrentTempLocalIndex() == var->index()); |
@@ -2626,7 +2628,7 @@ void EffectGraphVisitor::BuildPushArguments( |
void EffectGraphVisitor::BuildInstanceCallConditional(InstanceCallNode* node) { |
- const intptr_t token_pos = node->token_pos(); |
+ const TokenPosition token_pos = node->token_pos(); |
LocalVariable* temp_var = owner()->parsed_function().expression_temp_var(); |
LoadLocalNode* load_temp = new(Z) LoadLocalNode(token_pos, temp_var); |
@@ -2918,7 +2920,7 @@ void EffectGraphVisitor::VisitConstructorCallNode(ConstructorCallNode* node) { |
} |
-Value* EffectGraphVisitor::BuildInstantiator(intptr_t token_pos) { |
+Value* EffectGraphVisitor::BuildInstantiator(TokenPosition token_pos) { |
Function& outer_function = Function::Handle(Z, owner()->function().raw()); |
while (outer_function.IsLocalFunction()) { |
outer_function = outer_function.parent_function(); |
@@ -2937,7 +2939,7 @@ Value* EffectGraphVisitor::BuildInstantiator(intptr_t token_pos) { |
// 'expression_temp_var' may not be used inside this method if 'instantiator' |
// is not NULL. |
Value* EffectGraphVisitor::BuildInstantiatorTypeArguments( |
- intptr_t token_pos, |
+ TokenPosition token_pos, |
const Class& instantiator_class, |
Value* instantiator) { |
if (!instantiator_class.IsGeneric()) { |
@@ -2987,7 +2989,7 @@ Value* EffectGraphVisitor::BuildInstantiatorTypeArguments( |
Value* EffectGraphVisitor::BuildInstantiatedTypeArguments( |
- intptr_t token_pos, |
+ TokenPosition token_pos, |
const TypeArguments& type_arguments) { |
if (type_arguments.IsNull() || type_arguments.IsInstantiated()) { |
return Bind(new(Z) ConstantInstr(type_arguments)); |
@@ -3039,7 +3041,7 @@ void ValueGraphVisitor::VisitConstructorCallNode(ConstructorCallNode* node) { |
void EffectGraphVisitor::BuildInstanceGetterConditional( |
InstanceGetterNode* node) { |
- const intptr_t token_pos = node->token_pos(); |
+ const TokenPosition token_pos = node->token_pos(); |
LocalVariable* temp_var = owner()->parsed_function().expression_temp_var(); |
LoadLocalNode* load_temp = new(Z) LoadLocalNode(token_pos, temp_var); |
@@ -3135,7 +3137,7 @@ void EffectGraphVisitor::BuildInstanceSetterArguments( |
void EffectGraphVisitor::VisitInstanceSetterNode(InstanceSetterNode* node) { |
- const intptr_t token_pos = node->token_pos(); |
+ const TokenPosition token_pos = node->token_pos(); |
if (node->is_conditional()) { |
ValueGraphVisitor for_receiver(owner()); |
node->receiver()->Visit(&for_receiver); |
@@ -3185,7 +3187,7 @@ void EffectGraphVisitor::VisitInstanceSetterNode(InstanceSetterNode* node) { |
void ValueGraphVisitor::VisitInstanceSetterNode(InstanceSetterNode* node) { |
- const intptr_t token_pos = node->token_pos(); |
+ const TokenPosition token_pos = node->token_pos(); |
if (node->is_conditional()) { |
ValueGraphVisitor for_receiver(owner()); |
node->receiver()->Visit(&for_receiver); |
@@ -3317,7 +3319,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(); |
+ const TokenPosition 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. |
@@ -3417,7 +3419,7 @@ static intptr_t OffsetForLengthGetter(MethodRecognizer::Kind kind) { |
LoadLocalInstr* EffectGraphVisitor::BuildLoadThisVar( |
- LocalScope* scope, intptr_t token_pos) { |
+ LocalScope* scope, TokenPosition token_pos) { |
LocalVariable* receiver_var = scope->LookupVariable(Symbols::This(), |
true); // Test only. |
return new(Z) LoadLocalInstr(*receiver_var, token_pos); |
@@ -3462,7 +3464,7 @@ ConstantInstr* EffectGraphVisitor::DoNativeSetterStoreValue( |
void EffectGraphVisitor::VisitNativeBodyNode(NativeBodyNode* node) { |
const Function& function = owner()->function(); |
- const intptr_t token_pos = node->token_pos(); |
+ const TokenPosition token_pos = node->token_pos(); |
if (!function.IsClosureFunction()) { |
MethodRecognizer::Kind kind = MethodRecognizer::RecognizeKind(function); |
switch (kind) { |
@@ -3665,7 +3667,7 @@ void EffectGraphVisitor::VisitStoreLocalNode(StoreLocalNode* node) { |
!node->value()->AsLoadLocalNode()->local().IsInternal()) || |
node->value()->IsClosureNode()) && |
!node->local().IsInternal() && |
- Token::IsDebugPause(node->token_pos())) { |
+ node->token_pos().IsDebugPause()) { |
AddInstruction(new(Z) DebugStepCheckInstr( |
node->token_pos(), RawPcDescriptors::kRuntimeCall)); |
} |
@@ -3711,7 +3713,7 @@ void EffectGraphVisitor::VisitLoadInstanceFieldNode( |
void EffectGraphVisitor::VisitStoreInstanceFieldNode( |
StoreInstanceFieldNode* node) { |
- const intptr_t token_pos = node->token_pos(); |
+ const TokenPosition token_pos = node->token_pos(); |
ValueGraphVisitor for_instance(owner()); |
node->instance()->Visit(&for_instance); |
Append(for_instance); |
@@ -3757,7 +3759,7 @@ void EffectGraphVisitor::VisitStoreInstanceFieldNode( |
void EffectGraphVisitor::VisitLoadStaticFieldNode(LoadStaticFieldNode* node) { |
- const intptr_t token_pos = node->token_pos(); |
+ const TokenPosition token_pos = node->token_pos(); |
if (node->field().is_const()) { |
ASSERT(node->field().StaticValue() != Object::sentinel().raw()); |
ASSERT(node->field().StaticValue() != |
@@ -3776,7 +3778,7 @@ void EffectGraphVisitor::VisitLoadStaticFieldNode(LoadStaticFieldNode* node) { |
Definition* EffectGraphVisitor::BuildStoreStaticField( |
StoreStaticFieldNode* node, |
bool result_is_needed, |
- intptr_t token_pos) { |
+ TokenPosition token_pos) { |
ValueGraphVisitor for_value(owner()); |
node->value()->Visit(&for_value); |
Append(for_value); |
@@ -3874,7 +3876,7 @@ Definition* EffectGraphVisitor::BuildStoreIndexedValues( |
StoreIndexedNode* node, |
bool result_is_needed) { |
Function* super_function = NULL; |
- const intptr_t token_pos = node->token_pos(); |
+ const TokenPosition token_pos = node->token_pos(); |
if (node->IsSuperStore()) { |
// Resolve the store indexed operator in the super class. |
super_function = &Function::ZoneHandle( |
@@ -3984,7 +3986,7 @@ bool EffectGraphVisitor::HasContextScope() const { |
void EffectGraphVisitor::UnchainContexts(intptr_t n) { |
// TODO(johnmccutchan): Pass this in. |
- const intptr_t token_pos = ClassifyingTokenPositions::kContext; |
+ const TokenPosition token_pos = TokenPosition::kContext; |
if (n > 0) { |
Value* context = Bind(BuildCurrentContext(token_pos)); |
while (n-- > 0) { |
@@ -4082,7 +4084,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( |
- Token::kNoSourcePos, // Token index. |
+ TokenPosition::kNoSource, // Token index. |
temp_name, |
Object::dynamic_type()); // Type. |
temp_local->set_index(param_frame_index); |
@@ -4117,15 +4119,16 @@ 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 = Token::kNoSourcePos; |
+ TokenPosition check_pos = TokenPosition::kNoSource; |
if (num_params > 0) { |
const LocalVariable& parameter = *scope->VariableAt(num_params - 1); |
check_pos = parameter.token_pos(); |
} |
- if (!Token::IsDebugPause(check_pos)) { |
+ |
+ if (!check_pos.IsDebugPause()) { |
// No parameters or synthetic parameters. |
check_pos = node->token_pos(); |
- ASSERT(Token::IsDebugPause(check_pos)); |
+ ASSERT(check_pos.IsDebugPause()); |
} |
AddInstruction(new(Z) DebugStepCheckInstr(check_pos, |
RawPcDescriptors::kRuntimeCall)); |
@@ -4429,7 +4432,7 @@ StaticCallInstr* EffectGraphVisitor::BuildStaticNoSuchMethodCall( |
ArgumentListNode* method_arguments, |
bool save_last_arg, |
bool is_super_invocation) { |
- intptr_t args_pos = method_arguments->token_pos(); |
+ TokenPosition args_pos = method_arguments->token_pos(); |
LocalVariable* temp = NULL; |
if (save_last_arg) { |
temp = owner()->parsed_function().expression_temp_var(); |
@@ -4456,7 +4459,7 @@ StaticCallInstr* EffectGraphVisitor::BuildStaticNoSuchMethodCall( |
StaticCallInstr* EffectGraphVisitor::BuildThrowNoSuchMethodError( |
- intptr_t token_pos, |
+ TokenPosition token_pos, |
const Class& function_class, |
const String& function_name, |
ArgumentListNode* function_arguments, |