| Index: runtime/vm/kernel_to_il.cc
|
| diff --git a/runtime/vm/kernel_to_il.cc b/runtime/vm/kernel_to_il.cc
|
| index b64ca2809b8411be4f61711f823fbf9364ea8f2b..c9428e606e42da1538ceafcbde45cdc2ce809191 100644
|
| --- a/runtime/vm/kernel_to_il.cc
|
| +++ b/runtime/vm/kernel_to_il.cc
|
| @@ -11,6 +11,7 @@
|
| #include "vm/compiler.h"
|
| #include "vm/intermediate_language.h"
|
| #include "vm/kernel_reader.h"
|
| +#include "vm/kernel_binary_flowgraph.h"
|
| #include "vm/longjump.h"
|
| #include "vm/method_recognizer.h"
|
| #include "vm/object_store.h"
|
| @@ -962,34 +963,6 @@ class TryCatchBlock {
|
| };
|
|
|
|
|
| -class CatchBlock {
|
| - public:
|
| - CatchBlock(FlowGraphBuilder* builder,
|
| - LocalVariable* exception_var,
|
| - LocalVariable* stack_trace_var,
|
| - intptr_t catch_try_index)
|
| - : builder_(builder),
|
| - outer_(builder->catch_block_),
|
| - exception_var_(exception_var),
|
| - stack_trace_var_(stack_trace_var),
|
| - catch_try_index_(catch_try_index) {
|
| - builder_->catch_block_ = this;
|
| - }
|
| - ~CatchBlock() { builder_->catch_block_ = outer_; }
|
| -
|
| - LocalVariable* exception_var() { return exception_var_; }
|
| - LocalVariable* stack_trace_var() { return stack_trace_var_; }
|
| - intptr_t catch_try_index() { return catch_try_index_; }
|
| -
|
| - private:
|
| - FlowGraphBuilder* builder_;
|
| - CatchBlock* outer_;
|
| - LocalVariable* exception_var_;
|
| - LocalVariable* stack_trace_var_;
|
| - intptr_t catch_try_index_;
|
| -};
|
| -
|
| -
|
| Fragment& Fragment::operator+=(const Fragment& other) {
|
| if (entry == NULL) {
|
| entry = other.entry;
|
| @@ -1978,13 +1951,15 @@ FlowGraphBuilder::FlowGraphBuilder(
|
| type_translator_(&translation_helper_,
|
| &active_class_,
|
| /* finalize= */ true),
|
| - constant_evaluator_(this,
|
| - zone_,
|
| - &translation_helper_,
|
| - &type_translator_) {}
|
| + constant_evaluator_(this, zone_, &translation_helper_, &type_translator_),
|
| + streaming_flow_graph_builder_(NULL) {}
|
|
|
|
|
| -FlowGraphBuilder::~FlowGraphBuilder() {}
|
| +FlowGraphBuilder::~FlowGraphBuilder() {
|
| + if (streaming_flow_graph_builder_ != NULL) {
|
| + delete streaming_flow_graph_builder_;
|
| + }
|
| +}
|
|
|
|
|
| Fragment FlowGraphBuilder::TranslateFinallyFinalizers(
|
| @@ -3033,6 +3008,36 @@ FlowGraph* FlowGraphBuilder::BuildGraph() {
|
|
|
| if (function.IsConstructorClosureFunction()) return NULL;
|
|
|
| + TreeNode* library_node = node_;
|
| + if (node_ != NULL) {
|
| + const dart::Function* parent = &function;
|
| + while (true) {
|
| + library_node = static_cast<kernel::TreeNode*>(parent->kernel_function());
|
| + while (library_node != NULL && !library_node->IsLibrary()) {
|
| + if (library_node->IsMember()) {
|
| + library_node = Member::Cast(library_node)->parent();
|
| + } else if (library_node->IsClass()) {
|
| + library_node = Class::Cast(library_node)->parent();
|
| + break;
|
| + } else {
|
| + library_node = NULL;
|
| + break;
|
| + }
|
| + }
|
| + if (library_node != NULL) break;
|
| + parent = &dart::Function::Handle(parent->parent_function());
|
| + }
|
| + }
|
| + if (streaming_flow_graph_builder_ != NULL) {
|
| + delete streaming_flow_graph_builder_;
|
| + streaming_flow_graph_builder_ = NULL;
|
| + }
|
| + if (library_node != NULL && library_node->IsLibrary()) {
|
| + Library* library = Library::Cast(library_node);
|
| + streaming_flow_graph_builder_ = new StreamingFlowGraphBuilder(
|
| + this, library->kernel_data(), library->kernel_data_size());
|
| + }
|
| +
|
| dart::Class& klass =
|
| dart::Class::Handle(zone_, parsed_function_->function().Owner());
|
|
|
| @@ -5354,17 +5359,7 @@ void FlowGraphBuilder::VisitThrow(Throw* node) {
|
|
|
|
|
| void FlowGraphBuilder::VisitRethrow(Rethrow* node) {
|
| - Fragment instructions;
|
| -
|
| - instructions = DebugStepCheck(node->position()) + instructions;
|
| - instructions += LoadLocal(catch_block_->exception_var());
|
| - instructions += PushArgument();
|
| - instructions += LoadLocal(catch_block_->stack_trace_var());
|
| - instructions += PushArgument();
|
| - instructions +=
|
| - RethrowException(node->position(), catch_block_->catch_try_index());
|
| -
|
| - fragment_ = instructions;
|
| + fragment_ = streaming_flow_graph_builder_->BuildAt(node->kernel_offset());
|
| }
|
|
|
|
|
|
|