Chromium Code Reviews| Index: runtime/vm/kernel_to_il.cc |
| diff --git a/runtime/vm/kernel_to_il.cc b/runtime/vm/kernel_to_il.cc |
| index 9c799a067a2947b80f5102a5f08c608cfefaf4e1..0ec6963f3b154f49e9f76a14d387da0b4ad13bdb 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; |
| @@ -1941,10 +1914,8 @@ 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_), |
| + library_(NULL) {} |
| FlowGraphBuilder::~FlowGraphBuilder() {} |
| @@ -2996,6 +2967,32 @@ 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 (library_node != NULL && library_node->IsLibrary()) { |
| + library_ = Library::Cast(library_node); |
| + } else { |
| + library_ = NULL; |
| + } |
| + |
| dart::Class& klass = |
| dart::Class::Handle(zone_, parsed_function_->function().Owner()); |
| @@ -5327,17 +5324,9 @@ void FlowGraphBuilder::VisitThrow(Throw* node) { |
| void FlowGraphBuilder::VisitRethrow(Rethrow* node) { |
| - Fragment instructions; |
| - |
| - instructions = DebugStepCheck(node->position()) + instructions; |
|
Kevin Millikin (Google)
2017/03/28 12:50:00
This is pretty weird.
jensj
2017/03/29 09:30:42
Yeah, sorry about that :x
|
| - 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; |
| + KernelFlowgraphBuilder builder(this, library_->kernel_data(), |
| + library_->kernel_data_size()); |
| + fragment_ = builder.BuildAt(node->kernel_offset()); |
| } |