Index: runtime/vm/parser.cc |
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc |
index f96c1a3ec17e9fb14636824aff397baba1ee81ab..c3f39cc83debf3d225c75efb18ff2879ace8263d 100644 |
--- a/runtime/vm/parser.cc |
+++ b/runtime/vm/parser.cc |
@@ -16,12 +16,12 @@ |
#include "vm/compiler_stats.h" |
#include "vm/dart_api_impl.h" |
#include "vm/dart_entry.h" |
-#include "vm/kernel_to_il.h" |
#include "vm/growable_array.h" |
#include "vm/handles.h" |
#include "vm/hash_table.h" |
#include "vm/heap.h" |
#include "vm/isolate.h" |
+#include "vm/kernel_binary_flowgraph.h" |
#include "vm/longjump.h" |
#include "vm/native_arguments.h" |
#include "vm/native_entry.h" |
@@ -239,8 +239,43 @@ kernel::ScopeBuildingResult* ParsedFunction::EnsureKernelScopes() { |
if (function().kernel_function() != NULL) { |
node = static_cast<kernel::TreeNode*>(function().kernel_function()); |
} |
- kernel::ScopeBuilder builder(this, node); |
- kernel_scopes_ = builder.BuildScopes(); |
+ |
+ intptr_t kernel_offset = -1; |
+ const uint8_t* kernel_data = NULL; |
+ intptr_t kernel_data_size = 0; |
+ if (node != NULL) { |
+ kernel::TreeNode* library_node = node; |
+ if (node != NULL) { |
+ const 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 = kernel::Member::Cast(library_node)->parent(); |
+ } else if (library_node->IsClass()) { |
+ library_node = kernel::Class::Cast(library_node)->parent(); |
+ break; |
+ } else { |
+ library_node = NULL; |
+ break; |
+ } |
+ } |
+ if (library_node != NULL) break; |
+ parent = &Function::Handle(parent->parent_function()); |
+ } |
+ } |
+ if (library_node != NULL && library_node->IsLibrary()) { |
+ kernel::Library* library = kernel::Library::Cast(library_node); |
+ kernel_offset = node->kernel_offset(); |
+ kernel_data = library->kernel_data(); |
+ kernel_data_size = library->kernel_data_size(); |
+ } |
+ } |
+ |
+ kernel::StreamingScopeBuilder builder2(this, kernel_offset, kernel_data, |
+ kernel_data_size); |
+ kernel_scopes_ = builder2.BuildScopes(); |
} |
return kernel_scopes_; |
} |