| Index: runtime/vm/flow_graph_builder.cc
|
| diff --git a/runtime/vm/flow_graph_builder.cc b/runtime/vm/flow_graph_builder.cc
|
| index a5e893434f1a8346586fc86c926ebd3734aba76f..4ed2701b4eb5f2da1d303fae496b8822f69f869f 100644
|
| --- a/runtime/vm/flow_graph_builder.cc
|
| +++ b/runtime/vm/flow_graph_builder.cc
|
| @@ -7,8 +7,8 @@
|
| #include "lib/invocation_mirror.h"
|
| #include "vm/ast_printer.h"
|
| #include "vm/bit_vector.h"
|
| -#include "vm/compiler.h"
|
| #include "vm/class_finalizer.h"
|
| +#include "vm/compiler.h"
|
| #include "vm/exceptions.h"
|
| #include "vm/flags.h"
|
| #include "vm/flow_graph.h"
|
| @@ -75,7 +75,6 @@ uword FlowGraphBuilder::FindDoubleConstant(double value) {
|
| return 0;
|
| }
|
|
|
| -
|
| #define RECOGNIZE_FACTORY(symbol, class_name, constructor_name, cid, fp) \
|
| {Symbols::k##symbol##Id, cid, fp, #symbol ", " #cid}, // NOLINT
|
|
|
| @@ -107,7 +106,6 @@ intptr_t FactoryRecognizer::ResultCid(const Function& factory) {
|
| return kDynamicCid;
|
| }
|
|
|
| -
|
| // Base class for a stack of enclosing statements of interest (e.g.,
|
| // blocks (breakable) and loops (continuable)).
|
| class NestedStatement : public ValueObject {
|
| @@ -151,20 +149,17 @@ class NestedStatement : public ValueObject {
|
| const intptr_t try_index_;
|
| };
|
|
|
| -
|
| intptr_t NestedStatement::ContextLevel() const {
|
| // Context level is determined by the innermost nested statement having one.
|
| return (outer() == NULL) ? 0 : outer()->ContextLevel();
|
| }
|
|
|
| -
|
| void NestedStatement::AdjustContextLevel(intptr_t context_level) {
|
| // There must be a NestedContextAdjustment on the nesting stack.
|
| ASSERT(outer() != NULL);
|
| outer()->AdjustContextLevel(context_level);
|
| }
|
|
|
| -
|
| intptr_t FlowGraphBuilder::GetNextDeoptId() const {
|
| intptr_t deopt_id = thread()->GetNextDeoptId();
|
| if (context_level_array_ != NULL) {
|
| @@ -175,12 +170,10 @@ intptr_t FlowGraphBuilder::GetNextDeoptId() const {
|
| return deopt_id;
|
| }
|
|
|
| -
|
| intptr_t FlowGraphBuilder::context_level() const {
|
| return (nesting_stack() == NULL) ? 0 : nesting_stack()->ContextLevel();
|
| }
|
|
|
| -
|
| JoinEntryInstr* NestedStatement::BreakTargetFor(SourceLabel* label) {
|
| if (label != label_) return NULL;
|
| if (break_target_ == NULL) {
|
| @@ -190,12 +183,10 @@ JoinEntryInstr* NestedStatement::BreakTargetFor(SourceLabel* label) {
|
| return break_target_;
|
| }
|
|
|
| -
|
| JoinEntryInstr* NestedStatement::ContinueTargetFor(SourceLabel* label) {
|
| return NULL;
|
| }
|
|
|
| -
|
| // A nested statement that has its own context level.
|
| class NestedBlock : public NestedStatement {
|
| public:
|
| @@ -208,14 +199,12 @@ class NestedBlock : public NestedStatement {
|
| LocalScope* scope_;
|
| };
|
|
|
| -
|
| intptr_t NestedBlock::ContextLevel() const {
|
| return ((scope_ == NULL) || (scope_->num_context_variables() == 0))
|
| ? NestedStatement::ContextLevel()
|
| : scope_->context_level();
|
| }
|
|
|
| -
|
| // A nested statement reflecting a context level adjustment.
|
| class NestedContextAdjustment : public NestedStatement {
|
| public:
|
| @@ -233,7 +222,6 @@ class NestedContextAdjustment : public NestedStatement {
|
| intptr_t context_level_;
|
| };
|
|
|
| -
|
| // A nested statement that can be the target of a continue as well as a
|
| // break.
|
| class NestedLoop : public NestedStatement {
|
| @@ -253,7 +241,6 @@ class NestedLoop : public NestedStatement {
|
| JoinEntryInstr* continue_target_;
|
| };
|
|
|
| -
|
| JoinEntryInstr* NestedLoop::ContinueTargetFor(SourceLabel* label) {
|
| if (label != this->label()) return NULL;
|
| if (continue_target_ == NULL) {
|
| @@ -263,7 +250,6 @@ JoinEntryInstr* NestedLoop::ContinueTargetFor(SourceLabel* label) {
|
| return continue_target_;
|
| }
|
|
|
| -
|
| // A nested switch which can be the target of a break if labeled, and whose
|
| // cases can be the targets of continues.
|
| class NestedSwitch : public NestedStatement {
|
| @@ -277,7 +263,6 @@ class NestedSwitch : public NestedStatement {
|
| GrowableArray<JoinEntryInstr*> case_targets_;
|
| };
|
|
|
| -
|
| NestedSwitch::NestedSwitch(FlowGraphBuilder* owner, SwitchNode* node)
|
| : NestedStatement(owner, node->label()),
|
| case_labels_(node->body()->length()),
|
| @@ -292,7 +277,6 @@ NestedSwitch::NestedSwitch(FlowGraphBuilder* owner, SwitchNode* node)
|
| }
|
| }
|
|
|
| -
|
| JoinEntryInstr* NestedSwitch::ContinueTargetFor(SourceLabel* label) {
|
| // Allocate a join for a case clause that matches the label. This block
|
| // is not necessarily targeted by a continue, but we always use a join in
|
| @@ -308,7 +292,6 @@ JoinEntryInstr* NestedSwitch::ContinueTargetFor(SourceLabel* label) {
|
| return NULL;
|
| }
|
|
|
| -
|
| FlowGraphBuilder::FlowGraphBuilder(
|
| const ParsedFunction& parsed_function,
|
| const ZoneGrowableArray<const ICData*>& ic_data_array,
|
| @@ -339,12 +322,10 @@ FlowGraphBuilder::FlowGraphBuilder(
|
| await_joins_(new (Z) ZoneGrowableArray<JoinEntryInstr*>()),
|
| await_token_positions_(new (Z) ZoneGrowableArray<TokenPosition>()) {}
|
|
|
| -
|
| void FlowGraphBuilder::AddCatchEntry(CatchBlockEntryInstr* entry) {
|
| graph_entry_->AddCatchEntry(entry);
|
| }
|
|
|
| -
|
| void InlineExitCollector::PrepareGraphs(FlowGraph* callee_graph) {
|
| ASSERT(callee_graph->graph_entry()->SuccessorCount() == 1);
|
| ASSERT(callee_graph->max_block_id() > caller_graph_->max_block_id());
|
| @@ -389,13 +370,11 @@ void InlineExitCollector::PrepareGraphs(FlowGraph* callee_graph) {
|
| RemoveUnreachableExits(callee_graph);
|
| }
|
|
|
| -
|
| void InlineExitCollector::AddExit(ReturnInstr* exit) {
|
| Data data = {NULL, exit};
|
| exits_.Add(data);
|
| }
|
|
|
| -
|
| void InlineExitCollector::Union(const InlineExitCollector* other) {
|
| // It doesn't make sense to combine different calls or calls from
|
| // different graphs.
|
| @@ -404,12 +383,10 @@ void InlineExitCollector::Union(const InlineExitCollector* other) {
|
| exits_.AddArray(other->exits_);
|
| }
|
|
|
| -
|
| int InlineExitCollector::LowestBlockIdFirst(const Data* a, const Data* b) {
|
| return (a->exit_block->block_id() - b->exit_block->block_id());
|
| }
|
|
|
| -
|
| void InlineExitCollector::RemoveUnreachableExits(FlowGraph* callee_graph) {
|
| const GrowableArray<BlockEntryInstr*>& postorder = callee_graph->postorder();
|
| int j = 0;
|
| @@ -427,7 +404,6 @@ void InlineExitCollector::RemoveUnreachableExits(FlowGraph* callee_graph) {
|
| exits_.TruncateTo(j);
|
| }
|
|
|
| -
|
| void InlineExitCollector::SortExits() {
|
| // Assign block entries here because we did not necessarily know them when
|
| // the return exit was added to the array.
|
| @@ -437,7 +413,6 @@ void InlineExitCollector::SortExits() {
|
| exits_.Sort(LowestBlockIdFirst);
|
| }
|
|
|
| -
|
| Definition* InlineExitCollector::JoinReturns(BlockEntryInstr** exit_block,
|
| Instruction** last_instruction,
|
| intptr_t try_index) {
|
| @@ -543,7 +518,6 @@ Definition* InlineExitCollector::JoinReturns(BlockEntryInstr** exit_block,
|
| }
|
| }
|
|
|
| -
|
| void InlineExitCollector::ReplaceCall(TargetEntryInstr* callee_entry) {
|
| ASSERT(call_->previous() != NULL);
|
| ASSERT(call_->next() != NULL);
|
| @@ -659,7 +633,6 @@ void InlineExitCollector::ReplaceCall(TargetEntryInstr* callee_entry) {
|
| call_->UnuseAllInputs();
|
| }
|
|
|
| -
|
| void EffectGraphVisitor::Append(const EffectGraphVisitor& other_fragment) {
|
| ASSERT(is_open());
|
| if (other_fragment.is_empty()) return;
|
| @@ -671,7 +644,6 @@ void EffectGraphVisitor::Append(const EffectGraphVisitor& other_fragment) {
|
| exit_ = other_fragment.exit();
|
| }
|
|
|
| -
|
| Value* EffectGraphVisitor::Bind(Definition* definition) {
|
| ASSERT(is_open());
|
| owner()->DeallocateTemps(definition->InputCount());
|
| @@ -686,7 +658,6 @@ Value* EffectGraphVisitor::Bind(Definition* definition) {
|
| return new (Z) Value(definition);
|
| }
|
|
|
| -
|
| void EffectGraphVisitor::Do(Definition* definition) {
|
| ASSERT(is_open());
|
| owner()->DeallocateTemps(definition->InputCount());
|
| @@ -699,7 +670,6 @@ void EffectGraphVisitor::Do(Definition* definition) {
|
| exit_ = definition;
|
| }
|
|
|
| -
|
| void EffectGraphVisitor::AddInstruction(Instruction* instruction) {
|
| ASSERT(is_open());
|
| ASSERT(instruction->IsPushArgument() || !instruction->IsDefinition());
|
| @@ -714,7 +684,6 @@ void EffectGraphVisitor::AddInstruction(Instruction* instruction) {
|
| }
|
| }
|
|
|
| -
|
| void EffectGraphVisitor::AddReturnExit(TokenPosition token_pos, Value* value) {
|
| ASSERT(is_open());
|
| ReturnInstr* return_instr =
|
| @@ -727,7 +696,6 @@ void EffectGraphVisitor::AddReturnExit(TokenPosition token_pos, Value* value) {
|
| CloseFragment();
|
| }
|
|
|
| -
|
| void EffectGraphVisitor::Goto(JoinEntryInstr* join) {
|
| ASSERT(is_open());
|
| if (is_empty()) {
|
| @@ -738,7 +706,6 @@ void EffectGraphVisitor::Goto(JoinEntryInstr* join) {
|
| CloseFragment();
|
| }
|
|
|
| -
|
| // Appends a graph fragment to a block entry instruction. Returns the entry
|
| // instruction if the fragment was empty or else the exit of the fragment if
|
| // it was non-empty (so NULL if the fragment is closed).
|
| @@ -753,7 +720,6 @@ static Instruction* AppendFragment(BlockEntryInstr* entry,
|
| return fragment.exit();
|
| }
|
|
|
| -
|
| void EffectGraphVisitor::Join(const TestGraphVisitor& test_fragment,
|
| const EffectGraphVisitor& true_fragment,
|
| const EffectGraphVisitor& false_fragment) {
|
| @@ -789,7 +755,6 @@ void EffectGraphVisitor::Join(const TestGraphVisitor& test_fragment,
|
| }
|
| }
|
|
|
| -
|
| void EffectGraphVisitor::TieLoop(
|
| TokenPosition token_pos,
|
| const TestGraphVisitor& test_fragment,
|
| @@ -833,7 +798,6 @@ void EffectGraphVisitor::TieLoop(
|
| exit_ = test_fragment.CreateFalseSuccessor();
|
| }
|
|
|
| -
|
| PushArgumentInstr* EffectGraphVisitor::PushArgument(Value* value) {
|
| owner_->add_args_pushed(1);
|
| PushArgumentInstr* result = new (Z) PushArgumentInstr(value);
|
| @@ -841,7 +805,6 @@ PushArgumentInstr* EffectGraphVisitor::PushArgument(Value* value) {
|
| return result;
|
| }
|
|
|
| -
|
| Definition* EffectGraphVisitor::BuildStoreTemp(const LocalVariable& local,
|
| Value* value,
|
| TokenPosition token_pos) {
|
| @@ -850,21 +813,18 @@ Definition* EffectGraphVisitor::BuildStoreTemp(const LocalVariable& local,
|
| return new (Z) StoreLocalInstr(local, value, ST(token_pos));
|
| }
|
|
|
| -
|
| Definition* EffectGraphVisitor::BuildStoreExprTemp(Value* value,
|
| TokenPosition token_pos) {
|
| return BuildStoreTemp(*owner()->parsed_function().expression_temp_var(),
|
| value, token_pos);
|
| }
|
|
|
| -
|
| Definition* EffectGraphVisitor::BuildLoadExprTemp(TokenPosition token_pos) {
|
| ASSERT(!token_pos.IsClassifying());
|
| return BuildLoadLocal(*owner()->parsed_function().expression_temp_var(),
|
| token_pos);
|
| }
|
|
|
| -
|
| Definition* EffectGraphVisitor::BuildStoreLocal(const LocalVariable& local,
|
| Value* value,
|
| TokenPosition token_pos) {
|
| @@ -889,7 +849,6 @@ Definition* EffectGraphVisitor::BuildStoreLocal(const LocalVariable& local,
|
| }
|
| }
|
|
|
| -
|
| Definition* EffectGraphVisitor::BuildLoadLocal(const LocalVariable& local,
|
| TokenPosition token_pos) {
|
| if (local.IsConst()) {
|
| @@ -913,7 +872,6 @@ Definition* EffectGraphVisitor::BuildLoadLocal(const LocalVariable& local,
|
| }
|
| }
|
|
|
| -
|
| // Stores current context into the 'variable'
|
| void EffectGraphVisitor::BuildSaveContext(const LocalVariable& variable,
|
| TokenPosition token_pos) {
|
| @@ -922,7 +880,6 @@ void EffectGraphVisitor::BuildSaveContext(const LocalVariable& variable,
|
| Do(BuildStoreLocal(variable, context, token_pos));
|
| }
|
|
|
| -
|
| // Loads context saved in 'context_variable' into the current context.
|
| void EffectGraphVisitor::BuildRestoreContext(const LocalVariable& variable,
|
| TokenPosition token_pos) {
|
| @@ -930,20 +887,17 @@ void EffectGraphVisitor::BuildRestoreContext(const LocalVariable& variable,
|
| Do(BuildStoreContext(load_saved_context, token_pos));
|
| }
|
|
|
| -
|
| Definition* EffectGraphVisitor::BuildStoreContext(Value* value,
|
| TokenPosition token_pos) {
|
| return new (Z) StoreLocalInstr(
|
| *owner()->parsed_function().current_context_var(), value, token_pos);
|
| }
|
|
|
| -
|
| Definition* EffectGraphVisitor::BuildCurrentContext(TokenPosition token_pos) {
|
| return new (Z) LoadLocalInstr(
|
| *owner()->parsed_function().current_context_var(), token_pos);
|
| }
|
|
|
| -
|
| void TestGraphVisitor::ConnectBranchesTo(
|
| const GrowableArray<TargetEntryInstr**>& branches,
|
| JoinEntryInstr* join) const {
|
| @@ -957,17 +911,14 @@ void TestGraphVisitor::ConnectBranchesTo(
|
| }
|
| }
|
|
|
| -
|
| void TestGraphVisitor::IfTrueGoto(JoinEntryInstr* join) const {
|
| ConnectBranchesTo(true_successor_addresses_, join);
|
| }
|
|
|
| -
|
| void TestGraphVisitor::IfFalseGoto(JoinEntryInstr* join) const {
|
| ConnectBranchesTo(false_successor_addresses_, join);
|
| }
|
|
|
| -
|
| BlockEntryInstr* TestGraphVisitor::CreateSuccessorFor(
|
| const GrowableArray<TargetEntryInstr**>& branches) const {
|
| ASSERT(!branches.is_empty());
|
| @@ -987,17 +938,14 @@ BlockEntryInstr* TestGraphVisitor::CreateSuccessorFor(
|
| return join;
|
| }
|
|
|
| -
|
| BlockEntryInstr* TestGraphVisitor::CreateTrueSuccessor() const {
|
| return CreateSuccessorFor(true_successor_addresses_);
|
| }
|
|
|
| -
|
| BlockEntryInstr* TestGraphVisitor::CreateFalseSuccessor() const {
|
| return CreateSuccessorFor(false_successor_addresses_);
|
| }
|
|
|
| -
|
| void TestGraphVisitor::ReturnValue(Value* value) {
|
| Isolate* isolate = Isolate::Current();
|
| if (isolate->type_checks() || isolate->asserts()) {
|
| @@ -1016,7 +964,6 @@ void TestGraphVisitor::ReturnValue(Value* value) {
|
| false_successor_addresses_.Add(branch->false_successor_address());
|
| }
|
|
|
| -
|
| void TestGraphVisitor::MergeBranchWithStrictCompare(StrictCompareInstr* comp) {
|
| BranchInstr* branch = new (Z) BranchInstr(comp, owner()->GetNextDeoptId());
|
| AddInstruction(branch);
|
| @@ -1025,7 +972,6 @@ void TestGraphVisitor::MergeBranchWithStrictCompare(StrictCompareInstr* comp) {
|
| false_successor_addresses_.Add(branch->false_successor_address());
|
| }
|
|
|
| -
|
| void TestGraphVisitor::MergeBranchWithNegate(BooleanNegateInstr* neg) {
|
| ASSERT(!Isolate::Current()->type_checks());
|
| Value* constant_true = Bind(new (Z) ConstantInstr(Bool::True()));
|
| @@ -1039,7 +985,6 @@ void TestGraphVisitor::MergeBranchWithNegate(BooleanNegateInstr* neg) {
|
| false_successor_addresses_.Add(branch->false_successor_address());
|
| }
|
|
|
| -
|
| void TestGraphVisitor::ReturnDefinition(Definition* definition) {
|
| StrictCompareInstr* comp = definition->AsStrictCompare();
|
| if (comp != NULL) {
|
| @@ -1056,7 +1001,6 @@ void TestGraphVisitor::ReturnDefinition(Definition* definition) {
|
| ReturnValue(Bind(definition));
|
| }
|
|
|
| -
|
| // Special handling for AND/OR.
|
| void TestGraphVisitor::VisitBinaryOpNode(BinaryOpNode* node) {
|
| // Operators "&&" and "||" cannot be overloaded therefore do not call
|
| @@ -1088,18 +1032,15 @@ void TestGraphVisitor::VisitBinaryOpNode(BinaryOpNode* node) {
|
| ValueGraphVisitor::VisitBinaryOpNode(node);
|
| }
|
|
|
| -
|
| void EffectGraphVisitor::Bailout(const char* reason) const {
|
| owner()->Bailout(reason);
|
| }
|
|
|
| -
|
| void EffectGraphVisitor::InlineBailout(const char* reason) const {
|
| owner()->function().set_is_inlinable(false);
|
| if (owner()->IsInlining()) owner()->Bailout(reason);
|
| }
|
|
|
| -
|
| // <Statement> ::= Return { value: <Expression>
|
| // inlined_finally_list: <InlinedFinally>* }
|
| void EffectGraphVisitor::VisitReturnNode(ReturnNode* node) {
|
| @@ -1233,13 +1174,11 @@ void EffectGraphVisitor::VisitReturnNode(ReturnNode* node) {
|
| }
|
| }
|
|
|
| -
|
| // <Expression> ::= Literal { literal: Instance }
|
| void EffectGraphVisitor::VisitLiteralNode(LiteralNode* node) {
|
| ReturnDefinition(new (Z) ConstantInstr(node->literal(), node->token_pos()));
|
| }
|
|
|
| -
|
| // Type nodes are used when a type is referenced as a literal. Type nodes
|
| // can also be used for the right-hand side of instanceof comparisons,
|
| // but they are handled specially in that context, not here.
|
| @@ -1247,7 +1186,6 @@ void EffectGraphVisitor::VisitTypeNode(TypeNode* node) {
|
| return;
|
| }
|
|
|
| -
|
| void ValueGraphVisitor::VisitTypeNode(TypeNode* node) {
|
| const AbstractType& type = node->type();
|
| // Type may be malbounded, but not malformed.
|
| @@ -1274,7 +1212,6 @@ void ValueGraphVisitor::VisitTypeNode(TypeNode* node) {
|
| owner()->GetNextDeoptId()));
|
| }
|
|
|
| -
|
| // 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.
|
| @@ -1317,7 +1254,6 @@ bool EffectGraphVisitor::CanSkipTypeCheck(TokenPosition token_pos,
|
| return eliminated;
|
| }
|
|
|
| -
|
| // <Expression> :: Assignable { expr: <Expression>
|
| // type: AbstractType
|
| // dst_name: String }
|
| @@ -1335,7 +1271,6 @@ void EffectGraphVisitor::VisitAssignableNode(AssignableNode* node) {
|
| }
|
| }
|
|
|
| -
|
| void ValueGraphVisitor::VisitAssignableNode(AssignableNode* node) {
|
| ValueGraphVisitor for_value(owner());
|
| node->expr()->Visit(&for_value);
|
| @@ -1344,7 +1279,6 @@ void ValueGraphVisitor::VisitAssignableNode(AssignableNode* node) {
|
| node->type(), node->dst_name()));
|
| }
|
|
|
| -
|
| // <Expression> :: BinaryOp { kind: Token::Kind
|
| // left: <Expression>
|
| // right: <Expression> }
|
| @@ -1404,7 +1338,6 @@ void EffectGraphVisitor::VisitBinaryOpNode(BinaryOpNode* node) {
|
| ReturnDefinition(call);
|
| }
|
|
|
| -
|
| // Special handling for AND/OR.
|
| void ValueGraphVisitor::VisitBinaryOpNode(BinaryOpNode* node) {
|
| // Operators "&&" and "||" cannot be overloaded therefore do not call
|
| @@ -1452,7 +1385,6 @@ void ValueGraphVisitor::VisitBinaryOpNode(BinaryOpNode* node) {
|
| EffectGraphVisitor::VisitBinaryOpNode(node);
|
| }
|
|
|
| -
|
| PushArgumentInstr* EffectGraphVisitor::PushInstantiatorTypeArguments(
|
| const AbstractType& type,
|
| TokenPosition token_pos) {
|
| @@ -1464,7 +1396,6 @@ PushArgumentInstr* EffectGraphVisitor::PushInstantiatorTypeArguments(
|
| }
|
| }
|
|
|
| -
|
| PushArgumentInstr* EffectGraphVisitor::PushFunctionTypeArguments(
|
| const AbstractType& type,
|
| TokenPosition token_pos) {
|
| @@ -1476,20 +1407,17 @@ PushArgumentInstr* EffectGraphVisitor::PushFunctionTypeArguments(
|
| }
|
| }
|
|
|
| -
|
| Value* EffectGraphVisitor::BuildNullValue(TokenPosition token_pos) {
|
| return Bind(
|
| new (Z) ConstantInstr(Object::ZoneHandle(Z, Object::null()), token_pos));
|
| }
|
|
|
| -
|
| Value* EffectGraphVisitor::BuildEmptyTypeArguments(TokenPosition token_pos) {
|
| return Bind(new (Z) ConstantInstr(
|
| TypeArguments::ZoneHandle(Z, Object::empty_type_arguments().raw()),
|
| token_pos));
|
| }
|
|
|
| -
|
| // Used for testing incoming arguments.
|
| AssertAssignableInstr* EffectGraphVisitor::BuildAssertAssignable(
|
| TokenPosition token_pos,
|
| @@ -1516,7 +1444,6 @@ AssertAssignableInstr* EffectGraphVisitor::BuildAssertAssignable(
|
| dst_type, dst_name, deopt_id);
|
| }
|
|
|
| -
|
| // Used for type casts and to test assignments.
|
| Value* EffectGraphVisitor::BuildAssignableValue(TokenPosition token_pos,
|
| Value* value,
|
| @@ -1528,7 +1455,6 @@ Value* EffectGraphVisitor::BuildAssignableValue(TokenPosition token_pos,
|
| return Bind(BuildAssertAssignable(token_pos, value, dst_type, dst_name));
|
| }
|
|
|
| -
|
| void EffectGraphVisitor::BuildTypeTest(ComparisonNode* node) {
|
| ASSERT(Token::IsTypeTestOperator(node->kind()));
|
| const AbstractType& type = node->right()->AsTypeNode()->type();
|
| @@ -1597,7 +1523,6 @@ void EffectGraphVisitor::BuildTypeTest(ComparisonNode* node) {
|
| ReturnDefinition(result);
|
| }
|
|
|
| -
|
| void EffectGraphVisitor::BuildTypeCast(ComparisonNode* node) {
|
| ASSERT(Token::IsTypeCastOperator(node->kind()));
|
| ASSERT(!node->right()->AsTypeNode()->type().IsNull());
|
| @@ -1633,7 +1558,6 @@ void EffectGraphVisitor::BuildTypeCast(ComparisonNode* node) {
|
| ReturnDefinition(call);
|
| }
|
|
|
| -
|
| StrictCompareInstr* EffectGraphVisitor::BuildStrictCompare(
|
| AstNode* left,
|
| AstNode* right,
|
| @@ -1651,7 +1575,6 @@ StrictCompareInstr* EffectGraphVisitor::BuildStrictCompare(
|
| return comp;
|
| }
|
|
|
| -
|
| // <Expression> :: Comparison { kind: Token::Kind
|
| // left: <Expression>
|
| // right: <Expression> }
|
| @@ -1746,7 +1669,6 @@ void EffectGraphVisitor::VisitComparisonNode(ComparisonNode* node) {
|
| ReturnDefinition(comp);
|
| }
|
|
|
| -
|
| void EffectGraphVisitor::VisitUnaryOpNode(UnaryOpNode* node) {
|
| // "!" cannot be overloaded, therefore do not call operator.
|
| if (node->kind() == Token::kNOT) {
|
| @@ -1779,7 +1701,6 @@ void EffectGraphVisitor::VisitUnaryOpNode(UnaryOpNode* node) {
|
| ReturnDefinition(call);
|
| }
|
|
|
| -
|
| void EffectGraphVisitor::VisitConditionalExprNode(ConditionalExprNode* node) {
|
| TestGraphVisitor for_test(owner(), node->condition()->token_pos());
|
| node->condition()->Visit(&for_test);
|
| @@ -1793,7 +1714,6 @@ void EffectGraphVisitor::VisitConditionalExprNode(ConditionalExprNode* node) {
|
| Join(for_test, for_true, for_false);
|
| }
|
|
|
| -
|
| void ValueGraphVisitor::VisitConditionalExprNode(ConditionalExprNode* node) {
|
| TestGraphVisitor for_test(owner(), node->condition()->token_pos());
|
| node->condition()->Visit(&for_test);
|
| @@ -1814,7 +1734,6 @@ void ValueGraphVisitor::VisitConditionalExprNode(ConditionalExprNode* node) {
|
| ReturnDefinition(BuildLoadExprTemp(node->token_pos()));
|
| }
|
|
|
| -
|
| // <Statement> ::= If { condition: <Expression>
|
| // true_branch: <Sequence>
|
| // false_branch: <Sequence> }
|
| @@ -1832,7 +1751,6 @@ void EffectGraphVisitor::VisitIfNode(IfNode* node) {
|
| Join(for_test, for_true, for_false);
|
| }
|
|
|
| -
|
| void EffectGraphVisitor::VisitSwitchNode(SwitchNode* node) {
|
| NestedSwitch nested_switch(owner(), node);
|
| EffectGraphVisitor switch_body(owner());
|
| @@ -1844,7 +1762,6 @@ void EffectGraphVisitor::VisitSwitchNode(SwitchNode* node) {
|
| }
|
| }
|
|
|
| -
|
| // A case node contains zero or more case expressions, can contain default
|
| // and a case statement body.
|
| // Compose fragment as follows:
|
| @@ -1947,7 +1864,6 @@ void EffectGraphVisitor::VisitCaseNode(CaseNode* node) {
|
| exit_ = exit_instruction;
|
| }
|
|
|
| -
|
| // <Statement> ::= While { label: SourceLabel
|
| // condition: <Expression>
|
| // body: <Sequence> }
|
| @@ -1989,7 +1905,6 @@ void EffectGraphVisitor::VisitWhileNode(WhileNode* node) {
|
| }
|
| }
|
|
|
| -
|
| // The fragment is composed as follows:
|
| // a) body-entry-join
|
| // b) [ body ]
|
| @@ -2042,7 +1957,6 @@ void EffectGraphVisitor::VisitDoWhileNode(DoWhileNode* node) {
|
| }
|
| }
|
|
|
| -
|
| // A ForNode can contain break and continue jumps. 'break' joins to
|
| // ForNode exit, 'continue' joins at increment entry. The fragment is composed
|
| // as follows:
|
| @@ -2122,7 +2036,6 @@ void EffectGraphVisitor::VisitForNode(ForNode* node) {
|
| }
|
| }
|
|
|
| -
|
| void EffectGraphVisitor::VisitJumpNode(JumpNode* node) {
|
| if (FLAG_support_debugger && owner()->function().is_debuggable()) {
|
| AddInstruction(new (Z) DebugStepCheckInstr(node->token_pos(),
|
| @@ -2158,18 +2071,15 @@ void EffectGraphVisitor::VisitJumpNode(JumpNode* node) {
|
| Goto(jump_target);
|
| }
|
|
|
| -
|
| void EffectGraphVisitor::VisitArgumentListNode(ArgumentListNode* node) {
|
| UNREACHABLE();
|
| }
|
|
|
| -
|
| void EffectGraphVisitor::VisitAwaitNode(AwaitNode* node) {
|
| // Await nodes are temporary during parsing.
|
| UNREACHABLE();
|
| }
|
|
|
| -
|
| 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.
|
| @@ -2198,14 +2108,12 @@ void EffectGraphVisitor::VisitAwaitMarkerNode(AwaitMarkerNode* node) {
|
| BuildSaveContext(*ctx_var, node->token_pos());
|
| }
|
|
|
| -
|
| intptr_t EffectGraphVisitor::GetCurrentTempLocalIndex() const {
|
| return kFirstLocalSlotFromFp - owner()->num_stack_locals() -
|
| owner()->num_copied_params() - owner()->args_pushed() -
|
| owner()->temp_count() + 1;
|
| }
|
|
|
| -
|
| LocalVariable* EffectGraphVisitor::EnterTempLocalScope(Value* value) {
|
| ASSERT(value->definition()->temp_index() == (owner()->temp_count() - 1));
|
| intptr_t index = GetCurrentTempLocalIndex();
|
| @@ -2219,12 +2127,10 @@ LocalVariable* EffectGraphVisitor::EnterTempLocalScope(Value* value) {
|
| return var;
|
| }
|
|
|
| -
|
| Definition* EffectGraphVisitor::ExitTempLocalScope(Value* value) {
|
| return new (Z) DropTempsInstr(0, value);
|
| }
|
|
|
| -
|
| void EffectGraphVisitor::BuildLetTempExpressions(LetNode* node) {
|
| intptr_t num_temps = node->num_temps();
|
| for (intptr_t i = 0; i < num_temps; ++i) {
|
| @@ -2237,7 +2143,6 @@ void EffectGraphVisitor::BuildLetTempExpressions(LetNode* node) {
|
| }
|
| }
|
|
|
| -
|
| void EffectGraphVisitor::VisitLetNode(LetNode* node) {
|
| BuildLetTempExpressions(node);
|
|
|
| @@ -2255,7 +2160,6 @@ void EffectGraphVisitor::VisitLetNode(LetNode* node) {
|
| }
|
| }
|
|
|
| -
|
| void ValueGraphVisitor::VisitLetNode(LetNode* node) {
|
| BuildLetTempExpressions(node);
|
|
|
| @@ -2280,7 +2184,6 @@ void ValueGraphVisitor::VisitLetNode(LetNode* node) {
|
| }
|
| }
|
|
|
| -
|
| void EffectGraphVisitor::VisitArrayNode(ArrayNode* node) {
|
| const TypeArguments& type_args =
|
| TypeArguments::ZoneHandle(Z, node->type().arguments());
|
| @@ -2317,7 +2220,6 @@ void EffectGraphVisitor::VisitArrayNode(ArrayNode* node) {
|
| }
|
| }
|
|
|
| -
|
| void EffectGraphVisitor::VisitStringInterpolateNode(
|
| StringInterpolateNode* node) {
|
| ValueGraphVisitor for_argument(owner());
|
| @@ -2352,7 +2254,6 @@ void EffectGraphVisitor::VisitStringInterpolateNode(
|
| ReturnDefinition(instr);
|
| }
|
|
|
| -
|
| void EffectGraphVisitor::VisitClosureNode(ClosureNode* node) {
|
| const Function& function = node->function();
|
| if (function.IsImplicitStaticClosureFunction()) {
|
| @@ -2471,7 +2372,6 @@ void EffectGraphVisitor::VisitClosureNode(ClosureNode* node) {
|
| }
|
| }
|
|
|
| -
|
| void EffectGraphVisitor::BuildPushTypeArguments(
|
| const ArgumentListNode& node,
|
| ZoneGrowableArray<PushArgumentInstr*>* values) {
|
| @@ -2492,7 +2392,6 @@ void EffectGraphVisitor::BuildPushTypeArguments(
|
| }
|
| }
|
|
|
| -
|
| void EffectGraphVisitor::BuildPushArguments(
|
| const ArgumentListNode& node,
|
| ZoneGrowableArray<PushArgumentInstr*>* values) {
|
| @@ -2505,7 +2404,6 @@ void EffectGraphVisitor::BuildPushArguments(
|
| }
|
| }
|
|
|
| -
|
| void EffectGraphVisitor::BuildInstanceCallConditional(InstanceCallNode* node) {
|
| const TokenPosition token_pos = node->token_pos();
|
| LocalVariable* temp_var = owner()->parsed_function().expression_temp_var();
|
| @@ -2534,7 +2432,6 @@ void EffectGraphVisitor::BuildInstanceCallConditional(InstanceCallNode* node) {
|
| Join(for_test, for_true, for_false);
|
| }
|
|
|
| -
|
| void ValueGraphVisitor::VisitInstanceCallNode(InstanceCallNode* node) {
|
| if (node->is_conditional()) {
|
| ValueGraphVisitor for_receiver(owner());
|
| @@ -2548,7 +2445,6 @@ void ValueGraphVisitor::VisitInstanceCallNode(InstanceCallNode* node) {
|
| }
|
| }
|
|
|
| -
|
| void EffectGraphVisitor::VisitInstanceCallNode(InstanceCallNode* node) {
|
| if (node->is_conditional()) {
|
| ASSERT(node->arguments()->type_args_len() == 0);
|
| @@ -2576,7 +2472,6 @@ void EffectGraphVisitor::VisitInstanceCallNode(InstanceCallNode* node) {
|
| }
|
| }
|
|
|
| -
|
| // <Expression> ::= StaticCall { function: Function
|
| // arguments: <ArgumentList> }
|
| void EffectGraphVisitor::VisitStaticCallNode(StaticCallNode* node) {
|
| @@ -2595,7 +2490,6 @@ void EffectGraphVisitor::VisitStaticCallNode(StaticCallNode* node) {
|
| ReturnDefinition(call);
|
| }
|
|
|
| -
|
| void EffectGraphVisitor::BuildClosureCall(ClosureCallNode* node,
|
| bool result_needed) {
|
| ZoneGrowableArray<PushArgumentInstr*>* arguments =
|
| @@ -2633,17 +2527,14 @@ void EffectGraphVisitor::BuildClosureCall(ClosureCallNode* node,
|
| ReturnDefinition(ExitTempLocalScope(closure_value));
|
| }
|
|
|
| -
|
| void EffectGraphVisitor::VisitClosureCallNode(ClosureCallNode* node) {
|
| BuildClosureCall(node, false);
|
| }
|
|
|
| -
|
| void ValueGraphVisitor::VisitClosureCallNode(ClosureCallNode* node) {
|
| BuildClosureCall(node, true);
|
| }
|
|
|
| -
|
| void EffectGraphVisitor::VisitInitStaticFieldNode(InitStaticFieldNode* node) {
|
| Value* field = Bind(
|
| new (Z) ConstantInstr(Field::ZoneHandle(Z, node->field().Original())));
|
| @@ -2651,7 +2542,6 @@ void EffectGraphVisitor::VisitInitStaticFieldNode(InitStaticFieldNode* node) {
|
| owner()->GetNextDeoptId()));
|
| }
|
|
|
| -
|
| void EffectGraphVisitor::VisitCloneContextNode(CloneContextNode* node) {
|
| Value* context = Bind(BuildCurrentContext(node->token_pos()));
|
| Value* clone = Bind(new (Z) CloneContextInstr(node->token_pos(), context,
|
| @@ -2659,7 +2549,6 @@ void EffectGraphVisitor::VisitCloneContextNode(CloneContextNode* node) {
|
| Do(BuildStoreContext(clone, node->token_pos()));
|
| }
|
|
|
| -
|
| Value* EffectGraphVisitor::BuildObjectAllocation(ConstructorCallNode* node) {
|
| const Class& cls = Class::ZoneHandle(Z, node->constructor().Owner());
|
| const bool cls_is_parameterized = cls.NumTypeArguments() > 0;
|
| @@ -2679,7 +2568,6 @@ Value* EffectGraphVisitor::BuildObjectAllocation(ConstructorCallNode* node) {
|
| return Bind(allocation);
|
| }
|
|
|
| -
|
| void EffectGraphVisitor::BuildConstructorCall(
|
| ConstructorCallNode* node,
|
| PushArgumentInstr* push_alloc_value) {
|
| @@ -2695,7 +2583,6 @@ void EffectGraphVisitor::BuildConstructorCall(
|
| owner()->ic_data_array(), owner()->GetNextDeoptId()));
|
| }
|
|
|
| -
|
| static intptr_t GetResultCidOfListFactory(ConstructorCallNode* node) {
|
| const Function& function = node->constructor();
|
| const Class& function_class = Class::Handle(function.Owner());
|
| @@ -2719,7 +2606,6 @@ static intptr_t GetResultCidOfListFactory(ConstructorCallNode* node) {
|
| return kDynamicCid; // Not a known list constructor.
|
| }
|
|
|
| -
|
| void EffectGraphVisitor::VisitConstructorCallNode(ConstructorCallNode* node) {
|
| if (node->constructor().IsFactory()) {
|
| ZoneGrowableArray<PushArgumentInstr*>* arguments =
|
| @@ -2761,7 +2647,6 @@ void EffectGraphVisitor::VisitConstructorCallNode(ConstructorCallNode* node) {
|
| BuildConstructorCall(node, push_allocated_value);
|
| }
|
|
|
| -
|
| Value* EffectGraphVisitor::BuildInstantiator(TokenPosition token_pos) {
|
| Function& outer_function = Function::Handle(Z, owner()->function().raw());
|
| while (outer_function.IsLocalFunction()) {
|
| @@ -2777,7 +2662,6 @@ Value* EffectGraphVisitor::BuildInstantiator(TokenPosition token_pos) {
|
| return result;
|
| }
|
|
|
| -
|
| Value* EffectGraphVisitor::BuildInstantiatorTypeArguments(
|
| TokenPosition token_pos) {
|
| const Class& instantiator_class =
|
| @@ -2820,7 +2704,6 @@ Value* EffectGraphVisitor::BuildInstantiatorTypeArguments(
|
| token_pos));
|
| }
|
|
|
| -
|
| Value* EffectGraphVisitor::BuildFunctionTypeArguments(TokenPosition token_pos) {
|
| LocalVariable* function_type_arguments_var =
|
| owner()->parsed_function().function_type_arguments();
|
| @@ -2846,7 +2729,6 @@ Value* EffectGraphVisitor::BuildFunctionTypeArguments(TokenPosition token_pos) {
|
| return Bind(BuildLoadLocal(*function_type_arguments_var, token_pos));
|
| }
|
|
|
| -
|
| Value* EffectGraphVisitor::BuildInstantiatedTypeArguments(
|
| TokenPosition token_pos,
|
| const TypeArguments& type_arguments) {
|
| @@ -2879,7 +2761,6 @@ Value* EffectGraphVisitor::BuildInstantiatedTypeArguments(
|
| function_type_args, owner()->GetNextDeoptId()));
|
| }
|
|
|
| -
|
| void ValueGraphVisitor::VisitConstructorCallNode(ConstructorCallNode* node) {
|
| if (node->constructor().IsFactory()) {
|
| EffectGraphVisitor::VisitConstructorCallNode(node);
|
| @@ -2905,7 +2786,6 @@ void ValueGraphVisitor::VisitConstructorCallNode(ConstructorCallNode* node) {
|
| }
|
| }
|
|
|
| -
|
| void EffectGraphVisitor::BuildInstanceGetterConditional(
|
| InstanceGetterNode* node) {
|
| const TokenPosition token_pos = node->token_pos();
|
| @@ -2935,7 +2815,6 @@ void EffectGraphVisitor::BuildInstanceGetterConditional(
|
| Join(for_test, for_true, for_false);
|
| }
|
|
|
| -
|
| void ValueGraphVisitor::VisitInstanceGetterNode(InstanceGetterNode* node) {
|
| if (node->is_conditional()) {
|
| ValueGraphVisitor for_receiver(owner());
|
| @@ -2949,7 +2828,6 @@ void ValueGraphVisitor::VisitInstanceGetterNode(InstanceGetterNode* node) {
|
| }
|
| }
|
|
|
| -
|
| void EffectGraphVisitor::VisitInstanceGetterNode(InstanceGetterNode* node) {
|
| ValueGraphVisitor for_receiver(owner());
|
| node->receiver()->Visit(&for_receiver);
|
| @@ -2973,7 +2851,6 @@ void EffectGraphVisitor::VisitInstanceGetterNode(InstanceGetterNode* node) {
|
| }
|
| }
|
|
|
| -
|
| void EffectGraphVisitor::BuildInstanceSetterArguments(
|
| InstanceSetterNode* node,
|
| ZoneGrowableArray<PushArgumentInstr*>* arguments,
|
| @@ -2996,7 +2873,6 @@ void EffectGraphVisitor::BuildInstanceSetterArguments(
|
| arguments->Add(PushArgument(value));
|
| }
|
|
|
| -
|
| void EffectGraphVisitor::VisitInstanceSetterNode(InstanceSetterNode* node) {
|
| const TokenPosition token_pos = node->token_pos();
|
| if (node->is_conditional()) {
|
| @@ -3037,7 +2913,6 @@ void EffectGraphVisitor::VisitInstanceSetterNode(InstanceSetterNode* node) {
|
| ReturnDefinition(call);
|
| }
|
|
|
| -
|
| void ValueGraphVisitor::VisitInstanceSetterNode(InstanceSetterNode* node) {
|
| const TokenPosition token_pos = node->token_pos();
|
| if (node->is_conditional()) {
|
| @@ -3083,7 +2958,6 @@ void ValueGraphVisitor::VisitInstanceSetterNode(InstanceSetterNode* node) {
|
| ReturnDefinition(BuildLoadExprTemp(token_pos));
|
| }
|
|
|
| -
|
| void EffectGraphVisitor::VisitStaticGetterNode(StaticGetterNode* node) {
|
| const String& getter_name =
|
| String::ZoneHandle(Z, Field::GetterSymbol(node->field_name()));
|
| @@ -3149,7 +3023,6 @@ void EffectGraphVisitor::VisitStaticGetterNode(StaticGetterNode* node) {
|
| ReturnDefinition(call);
|
| }
|
|
|
| -
|
| void EffectGraphVisitor::BuildStaticSetter(StaticSetterNode* node,
|
| bool result_is_needed) {
|
| const String& setter_name =
|
| @@ -3218,17 +3091,14 @@ void EffectGraphVisitor::BuildStaticSetter(StaticSetterNode* node,
|
| }
|
| }
|
|
|
| -
|
| void EffectGraphVisitor::VisitStaticSetterNode(StaticSetterNode* node) {
|
| BuildStaticSetter(node, false); // Result not needed.
|
| }
|
|
|
| -
|
| void ValueGraphVisitor::VisitStaticSetterNode(StaticSetterNode* node) {
|
| BuildStaticSetter(node, true); // Result needed.
|
| }
|
|
|
| -
|
| static intptr_t OffsetForLengthGetter(MethodRecognizer::Kind kind) {
|
| switch (kind) {
|
| case MethodRecognizer::kObjectArrayLength:
|
| @@ -3247,7 +3117,6 @@ static intptr_t OffsetForLengthGetter(MethodRecognizer::Kind kind) {
|
| }
|
| }
|
|
|
| -
|
| LoadLocalInstr* EffectGraphVisitor::BuildLoadThisVar(LocalScope* scope,
|
| TokenPosition token_pos) {
|
| LocalVariable* receiver_var = scope->LookupVariable(Symbols::This(),
|
| @@ -3255,7 +3124,6 @@ LoadLocalInstr* EffectGraphVisitor::BuildLoadThisVar(LocalScope* scope,
|
| return new (Z) LoadLocalInstr(*receiver_var, token_pos);
|
| }
|
|
|
| -
|
| LoadFieldInstr* EffectGraphVisitor::BuildNativeGetter(
|
| NativeBodyNode* node,
|
| MethodRecognizer::Kind kind,
|
| @@ -3270,7 +3138,6 @@ LoadFieldInstr* EffectGraphVisitor::BuildNativeGetter(
|
| return load;
|
| }
|
|
|
| -
|
| ConstantInstr* EffectGraphVisitor::DoNativeSetterStoreValue(
|
| NativeBodyNode* node,
|
| intptr_t offset,
|
| @@ -3285,7 +3152,6 @@ ConstantInstr* EffectGraphVisitor::DoNativeSetterStoreValue(
|
| return new (Z) ConstantInstr(Object::ZoneHandle(Z, Object::null()));
|
| }
|
|
|
| -
|
| void EffectGraphVisitor::VisitNativeBodyNode(NativeBodyNode* node) {
|
| const Function& function = owner()->function();
|
| const TokenPosition token_pos = node->token_pos();
|
| @@ -3443,25 +3309,21 @@ void EffectGraphVisitor::VisitNativeBodyNode(NativeBodyNode* node) {
|
| ReturnDefinition(native_call);
|
| }
|
|
|
| -
|
| void EffectGraphVisitor::VisitPrimaryNode(PrimaryNode* node) {
|
| // PrimaryNodes are temporary during parsing.
|
| UNREACHABLE();
|
| }
|
|
|
| -
|
| // <Expression> ::= LoadLocal { local: LocalVariable }
|
| void EffectGraphVisitor::VisitLoadLocalNode(LoadLocalNode* node) {
|
| // Nothing to do.
|
| }
|
|
|
| -
|
| void ValueGraphVisitor::VisitLoadLocalNode(LoadLocalNode* node) {
|
| Definition* load = BuildLoadLocal(node->local(), node->token_pos());
|
| ReturnDefinition(load);
|
| }
|
|
|
| -
|
| // <Expression> ::= StoreLocal { local: LocalVariable
|
| // value: <Expression> }
|
| void EffectGraphVisitor::VisitStoreLocalNode(StoreLocalNode* node) {
|
| @@ -3499,7 +3361,6 @@ void EffectGraphVisitor::VisitStoreLocalNode(StoreLocalNode* node) {
|
| ReturnDefinition(store);
|
| }
|
|
|
| -
|
| void EffectGraphVisitor::VisitLoadInstanceFieldNode(
|
| LoadInstanceFieldNode* node) {
|
| ValueGraphVisitor for_instance(owner());
|
| @@ -3512,7 +3373,6 @@ void EffectGraphVisitor::VisitLoadInstanceFieldNode(
|
| ReturnDefinition(load);
|
| }
|
|
|
| -
|
| void EffectGraphVisitor::VisitStoreInstanceFieldNode(
|
| StoreInstanceFieldNode* node) {
|
| const TokenPosition token_pos = node->token_pos();
|
| @@ -3550,7 +3410,6 @@ void EffectGraphVisitor::VisitStoreInstanceFieldNode(
|
| ReturnDefinition(store);
|
| }
|
|
|
| -
|
| void EffectGraphVisitor::VisitLoadStaticFieldNode(LoadStaticFieldNode* node) {
|
| const TokenPosition token_pos = node->token_pos();
|
| if (node->field().is_const()) {
|
| @@ -3567,7 +3426,6 @@ void EffectGraphVisitor::VisitLoadStaticFieldNode(LoadStaticFieldNode* node) {
|
| ReturnDefinition(load);
|
| }
|
|
|
| -
|
| Definition* EffectGraphVisitor::BuildStoreStaticField(
|
| StoreStaticFieldNode* node,
|
| bool result_is_needed,
|
| @@ -3609,19 +3467,16 @@ Definition* EffectGraphVisitor::BuildStoreStaticField(
|
| }
|
| }
|
|
|
| -
|
| void EffectGraphVisitor::VisitStoreStaticFieldNode(StoreStaticFieldNode* node) {
|
| ReturnDefinition(
|
| BuildStoreStaticField(node, kResultNotNeeded, node->token_pos()));
|
| }
|
|
|
| -
|
| void ValueGraphVisitor::VisitStoreStaticFieldNode(StoreStaticFieldNode* node) {
|
| ReturnDefinition(
|
| BuildStoreStaticField(node, kResultNeeded, node->token_pos()));
|
| }
|
|
|
| -
|
| void EffectGraphVisitor::VisitLoadIndexedNode(LoadIndexedNode* node) {
|
| Function* super_function = NULL;
|
| if (node->IsSuperLoad()) {
|
| @@ -3673,7 +3528,6 @@ void EffectGraphVisitor::VisitLoadIndexedNode(LoadIndexedNode* node) {
|
| }
|
| }
|
|
|
| -
|
| Definition* EffectGraphVisitor::BuildStoreIndexedValues(StoreIndexedNode* node,
|
| bool result_is_needed) {
|
| Function* super_function = NULL;
|
| @@ -3757,24 +3611,20 @@ Definition* EffectGraphVisitor::BuildStoreIndexedValues(StoreIndexedNode* node,
|
| }
|
| }
|
|
|
| -
|
| void EffectGraphVisitor::VisitStoreIndexedNode(StoreIndexedNode* node) {
|
| ReturnDefinition(BuildStoreIndexedValues(node, kResultNotNeeded));
|
| }
|
|
|
| -
|
| void ValueGraphVisitor::VisitStoreIndexedNode(StoreIndexedNode* node) {
|
| ReturnDefinition(BuildStoreIndexedValues(node, kResultNeeded));
|
| }
|
|
|
| -
|
| bool EffectGraphVisitor::HasContextScope() const {
|
| const ContextScope& context_scope =
|
| ContextScope::Handle(owner()->function().context_scope());
|
| return !context_scope.IsNull() && (context_scope.num_variables() > 0);
|
| }
|
|
|
| -
|
| void EffectGraphVisitor::UnchainContexts(intptr_t n) {
|
| // TODO(johnmccutchan): Pass this in.
|
| const TokenPosition token_pos = TokenPosition::kContext;
|
| @@ -3790,7 +3640,6 @@ void EffectGraphVisitor::UnchainContexts(intptr_t n) {
|
| }
|
| }
|
|
|
| -
|
| void EffectGraphVisitor::AdjustContextLevel(LocalScope* target_scope) {
|
| ASSERT(target_scope != NULL);
|
| intptr_t target_context_level = 0;
|
| @@ -3817,7 +3666,6 @@ void EffectGraphVisitor::AdjustContextLevel(LocalScope* target_scope) {
|
| owner()->nesting_stack()->AdjustContextLevel(target_context_level);
|
| }
|
|
|
| -
|
| // <Statement> ::= Sequence { scope: LocalScope
|
| // nodes: <Statement>*
|
| // label: SourceLabel }
|
| @@ -3998,7 +3846,6 @@ void EffectGraphVisitor::VisitSequenceNode(SequenceNode* node) {
|
| Do(call_async_set_thread_stack_trace);
|
| }
|
|
|
| -
|
| if (FLAG_support_debugger && is_top_level_sequence &&
|
| function.is_debuggable()) {
|
| // Place a debug check at method entry to ensure breaking on a method always
|
| @@ -4168,7 +4015,6 @@ void EffectGraphVisitor::VisitSequenceNode(SequenceNode* node) {
|
| }
|
| }
|
|
|
| -
|
| void EffectGraphVisitor::VisitCatchClauseNode(CatchClauseNode* node) {
|
| InlineBailout("EffectGraphVisitor::VisitCatchClauseNode (exception)");
|
| // Restores current context from local variable ':saved_try_context_var'.
|
| @@ -4179,7 +4025,6 @@ void EffectGraphVisitor::VisitCatchClauseNode(CatchClauseNode* node) {
|
| Append(for_catch);
|
| }
|
|
|
| -
|
| void EffectGraphVisitor::VisitTryCatchNode(TryCatchNode* node) {
|
| InlineBailout("EffectGraphVisitor::VisitTryCatchNode (exception)");
|
| CatchClauseNode* catch_block = node->catch_block();
|
| @@ -4313,7 +4158,6 @@ void EffectGraphVisitor::VisitTryCatchNode(TryCatchNode* node) {
|
| }
|
| }
|
|
|
| -
|
| // Looks up dynamic method noSuchMethod in target_class
|
| // (including its super class chain) and builds a static call to it.
|
| StaticCallInstr* EffectGraphVisitor::BuildStaticNoSuchMethodCall(
|
| @@ -4355,7 +4199,6 @@ StaticCallInstr* EffectGraphVisitor::BuildStaticNoSuchMethodCall(
|
| push_arguments, owner()->ic_data_array(), owner()->GetNextDeoptId());
|
| }
|
|
|
| -
|
| StaticCallInstr* EffectGraphVisitor::BuildThrowNoSuchMethodError(
|
| TokenPosition token_pos,
|
| const Class& function_class,
|
| @@ -4422,7 +4265,6 @@ StaticCallInstr* EffectGraphVisitor::BuildThrowNoSuchMethodError(
|
| owner()->GetNextDeoptId());
|
| }
|
|
|
| -
|
| void EffectGraphVisitor::BuildThrowNode(ThrowNode* node) {
|
| if (FLAG_support_debugger) {
|
| if (node->exception()->IsLiteralNode() ||
|
| @@ -4452,13 +4294,11 @@ void EffectGraphVisitor::BuildThrowNode(ThrowNode* node) {
|
| AddInstruction(instr);
|
| }
|
|
|
| -
|
| void EffectGraphVisitor::VisitThrowNode(ThrowNode* node) {
|
| BuildThrowNode(node);
|
| CloseFragment();
|
| }
|
|
|
| -
|
| // A throw cannot be part of an expression, however, the parser may replace
|
| // certain expression nodes with a throw. In that case generate a literal null
|
| // so that the fragment is not closed in the middle of an expression.
|
| @@ -4468,7 +4308,6 @@ void ValueGraphVisitor::VisitThrowNode(ThrowNode* node) {
|
| new (Z) ConstantInstr(Instance::ZoneHandle(Z, Instance::null())));
|
| }
|
|
|
| -
|
| void EffectGraphVisitor::VisitInlinedFinallyNode(InlinedFinallyNode* node) {
|
| InlineBailout("EffectGraphVisitor::VisitInlinedFinallyNode (exception)");
|
| const intptr_t try_index = owner()->try_index();
|
| @@ -4510,12 +4349,10 @@ void EffectGraphVisitor::VisitInlinedFinallyNode(InlinedFinallyNode* node) {
|
| exit_ = for_finally_block.exit_;
|
| }
|
|
|
| -
|
| void EffectGraphVisitor::VisitStopNode(StopNode* node) {
|
| AddInstruction(new (Z) StopInstr(node->message()));
|
| }
|
|
|
| -
|
| FlowGraph* FlowGraphBuilder::BuildGraph() {
|
| VMTagScope tagScope(thread(), VMTag::kCompileFlowGraphBuilderTagId,
|
| FLAG_profile_vm);
|
| @@ -4554,17 +4391,14 @@ FlowGraph* FlowGraphBuilder::BuildGraph() {
|
| return graph;
|
| }
|
|
|
| -
|
| void FlowGraphBuilder::AppendAwaitTokenPosition(TokenPosition token_pos) {
|
| await_token_positions_->Add(token_pos);
|
| }
|
|
|
| -
|
| void FlowGraphBuilder::Bailout(const char* reason) const {
|
| parsed_function_.Bailout("FlowGraphBuilder", reason);
|
| }
|
|
|
| -
|
| bool FlowGraphBuilder::SimpleInstanceOfType(const AbstractType& type) {
|
| // Bail if the type is still uninstantiated at compile time.
|
| if (!type.IsInstantiated()) return false;
|
|
|