Index: runtime/vm/parser.cc |
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc |
index 6f639387c126ac232945dfea4ccc80cac1915855..c3f39cc83debf3d225c75efb18ff2879ace8263d 100644 |
--- a/runtime/vm/parser.cc |
+++ b/runtime/vm/parser.cc |
@@ -235,11 +235,47 @@ void ParsedFunction::Bailout(const char* origin, const char* reason) const { |
kernel::ScopeBuildingResult* ParsedFunction::EnsureKernelScopes() { |
if (kernel_scopes_ == NULL) { |
- intptr_t kernel_offset = function().kernel_offset(); |
- Script& script = Script::Handle(Z, function().script()); |
- kernel::StreamingScopeBuilder builder( |
- this, kernel_offset, script.kernel_data(), script.kernel_data_size()); |
- kernel_scopes_ = builder.BuildScopes(); |
+ kernel::TreeNode* node = NULL; |
+ if (function().kernel_function() != NULL) { |
+ node = static_cast<kernel::TreeNode*>(function().kernel_function()); |
+ } |
+ |
+ 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_; |
} |
@@ -1628,7 +1664,7 @@ SequenceNode* Parser::ParseImplicitClosure(const Function& func) { |
ASSERT(func.num_fixed_parameters() == 2); // closure, value. |
} else if (!parent.IsGetterFunction() && !parent.IsImplicitGetterFunction()) { |
// NOTE: For the `kernel -> flowgraph` we don't use the parser. |
- if (parent.kernel_offset() <= 0) { |
+ if (parent.kernel_function() == NULL) { |
SkipFunctionPreamble(); |
const bool use_function_type_syntax = false; |
const bool allow_explicit_default_values = true; |