Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(176)

Side by Side Diff: runtime/vm/kernel_binary_flowgraph.cc

Issue 2972343002: [kernel] Insert kernel bodies into VM heap (Closed)
Patch Set: Review comments Created 3 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « runtime/vm/kernel_binary_flowgraph.h ('k') | runtime/vm/kernel_reader.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "vm/kernel_binary_flowgraph.h" 5 #include "vm/kernel_binary_flowgraph.h"
6 6
7 #include "vm/compiler.h" 7 #include "vm/compiler.h"
8 #include "vm/longjump.h" 8 #include "vm/longjump.h"
9 #include "vm/object_store.h" 9 #include "vm/object_store.h"
10 10
11 #if !defined(DART_PRECOMPILED_RUNTIME) 11 #if !defined(DART_PRECOMPILED_RUNTIME)
12 12
13 namespace dart { 13 namespace dart {
14 namespace kernel { 14 namespace kernel {
15 15
16 #define Z (zone_) 16 #define Z (zone_)
17 #define H (translation_helper_) 17 #define H (translation_helper_)
18 #define T (type_translator_) 18 #define T (type_translator_)
19 #define I Isolate::Current() 19 #define I Isolate::Current()
20 20
21 static bool IsStaticInitializer(const Function& function, Zone* zone) { 21 static bool IsStaticInitializer(const Function& function, Zone* zone) {
22 return (function.kind() == RawFunction::kImplicitStaticFinalGetter) && 22 return (function.kind() == RawFunction::kImplicitStaticFinalGetter) &&
23 dart::String::Handle(zone, function.name()) 23 dart::String::Handle(zone, function.name())
24 .StartsWith(Symbols::InitPrefix()); 24 .StartsWith(Symbols::InitPrefix());
25 } 25 }
26 26
27 StreamingScopeBuilder::StreamingScopeBuilder(ParsedFunction* parsed_function, 27 StreamingScopeBuilder::StreamingScopeBuilder(ParsedFunction* parsed_function,
28 intptr_t kernel_offset, 28 intptr_t relative_kernel_offset,
29 const uint8_t* buffer, 29 const TypedData& data)
30 intptr_t buffer_length)
31 : result_(NULL), 30 : result_(NULL),
32 parsed_function_(parsed_function), 31 parsed_function_(parsed_function),
33 kernel_offset_(kernel_offset), 32 relative_kernel_offset_(relative_kernel_offset),
34 translation_helper_(Thread::Current()), 33 translation_helper_(Thread::Current()),
35 zone_(translation_helper_.zone()), 34 zone_(translation_helper_.zone()),
36 current_function_scope_(NULL), 35 current_function_scope_(NULL),
37 scope_(NULL), 36 scope_(NULL),
38 depth_(0), 37 depth_(0),
39 name_index_(0), 38 name_index_(0),
40 needs_expr_temp_(false), 39 needs_expr_temp_(false),
41 builder_(new StreamingFlowGraphBuilder(&translation_helper_, 40 builder_(new StreamingFlowGraphBuilder(&translation_helper_,
42 zone_, 41 zone_,
43 buffer, 42 relative_kernel_offset,
44 buffer_length)), 43 data)),
45 type_translator_(builder_, /*finalize=*/true) { 44 type_translator_(builder_, /*finalize=*/true) {
46 Script& script = Script::Handle(Z, parsed_function->function().script()); 45 Script& script = Script::Handle(Z, parsed_function->function().script());
47 H.SetStringOffsets(TypedData::Handle(Z, script.kernel_string_offsets())); 46 H.SetStringOffsets(TypedData::Handle(Z, script.kernel_string_offsets()));
48 H.SetStringData(TypedData::Handle(Z, script.kernel_string_data())); 47 H.SetStringData(TypedData::Handle(Z, script.kernel_string_data()));
49 H.SetCanonicalNames(TypedData::Handle(Z, script.kernel_canonical_names())); 48 H.SetCanonicalNames(TypedData::Handle(Z, script.kernel_canonical_names()));
50 type_translator_.active_class_ = &active_class_; 49 type_translator_.active_class_ = &active_class_;
51 } 50 }
52 51
53 StreamingScopeBuilder::~StreamingScopeBuilder() { 52 StreamingScopeBuilder::~StreamingScopeBuilder() {
54 delete builder_; 53 delete builder_;
55 } 54 }
56 55
57 ScopeBuildingResult* StreamingScopeBuilder::BuildScopes() { 56 ScopeBuildingResult* StreamingScopeBuilder::BuildScopes() {
58 if (result_ != NULL) return result_; 57 if (result_ != NULL) return result_;
59 58
60 ASSERT(scope_ == NULL && depth_.loop_ == 0 && depth_.function_ == 0); 59 ASSERT(scope_ == NULL && depth_.loop_ == 0 && depth_.function_ == 0);
61 result_ = new (Z) ScopeBuildingResult(); 60 result_ = new (Z) ScopeBuildingResult();
62 61
63 ParsedFunction* parsed_function = parsed_function_; 62 const Function& function = parsed_function_->function();
64 const Function& function = parsed_function->function();
65 63
66 // Setup a [ActiveClassScope] and a [ActiveMemberScope] which will be used 64 // Setup a [ActiveClassScope] and a [ActiveMemberScope] which will be used
67 // e.g. for type translation. 65 // e.g. for type translation.
68 const dart::Class& klass = 66 const dart::Class& klass =
69 dart::Class::Handle(zone_, parsed_function_->function().Owner()); 67 dart::Class::Handle(zone_, parsed_function_->function().Owner());
70 68
71 Function& outermost_function = Function::Handle(Z); 69 Function& outermost_function = Function::Handle(Z);
72 builder_->DiscoverEnclosingElements(Z, function, &outermost_function); 70 builder_->DiscoverEnclosingElements(Z, function, &outermost_function);
73 71
74 ActiveClassScope active_class_scope(&active_class_, &klass); 72 ActiveClassScope active_class_scope(&active_class_, &klass);
(...skipping 10 matching lines...) Expand all
85 83
86 // Add function type arguments variable before current context variable. 84 // Add function type arguments variable before current context variable.
87 if (FLAG_reify_generic_functions && function.IsGeneric()) { 85 if (FLAG_reify_generic_functions && function.IsGeneric()) {
88 LocalVariable* type_args_var = MakeVariable( 86 LocalVariable* type_args_var = MakeVariable(
89 TokenPosition::kNoSource, TokenPosition::kNoSource, 87 TokenPosition::kNoSource, TokenPosition::kNoSource,
90 Symbols::FunctionTypeArgumentsVar(), AbstractType::dynamic_type()); 88 Symbols::FunctionTypeArgumentsVar(), AbstractType::dynamic_type());
91 scope_->AddVariable(type_args_var); 89 scope_->AddVariable(type_args_var);
92 parsed_function_->set_function_type_arguments(type_args_var); 90 parsed_function_->set_function_type_arguments(type_args_var);
93 } 91 }
94 92
95 LocalVariable* context_var = parsed_function->current_context_var(); 93 LocalVariable* context_var = parsed_function_->current_context_var();
96 context_var->set_is_forced_stack(); 94 context_var->set_is_forced_stack();
97 scope_->AddVariable(context_var); 95 scope_->AddVariable(context_var);
98 96
99 parsed_function->SetNodeSequence( 97 parsed_function_->SetNodeSequence(
100 new SequenceNode(TokenPosition::kNoSource, scope_)); 98 new SequenceNode(TokenPosition::kNoSource, scope_));
101 99
102 builder_->SetOffset(kernel_offset_); 100 builder_->SetOffset(0);
103 101
104 FunctionNodeHelper function_node_helper(builder_); 102 FunctionNodeHelper function_node_helper(builder_);
105 103
106 switch (function.kind()) { 104 switch (function.kind()) {
107 case RawFunction::kClosureFunction: 105 case RawFunction::kClosureFunction:
108 case RawFunction::kImplicitClosureFunction: 106 case RawFunction::kImplicitClosureFunction:
109 case RawFunction::kConvertedClosureFunction: 107 case RawFunction::kConvertedClosureFunction:
110 case RawFunction::kRegularFunction: 108 case RawFunction::kRegularFunction:
111 case RawFunction::kGetterFunction: 109 case RawFunction::kGetterFunction:
112 case RawFunction::kSetterFunction: 110 case RawFunction::kSetterFunction:
113 case RawFunction::kConstructor: { 111 case RawFunction::kConstructor: {
114 const Tag tag = builder_->PeekTag(); 112 const Tag tag = builder_->PeekTag();
115 intptr_t parent_offset = builder_->ReadUntilFunctionNode(); 113 builder_->ReadUntilFunctionNode();
116 function_node_helper.ReadUntilExcluding( 114 function_node_helper.ReadUntilExcluding(
117 FunctionNodeHelper::kPositionalParameters); 115 FunctionNodeHelper::kPositionalParameters);
118 current_function_async_marker_ = function_node_helper.async_marker_; 116 current_function_async_marker_ = function_node_helper.async_marker_;
119 // NOTE: FunctionNode is read further below the if. 117 // NOTE: FunctionNode is read further below the if.
120 118
121 intptr_t pos = 0; 119 intptr_t pos = 0;
122 if (function.IsClosureFunction()) { 120 if (function.IsClosureFunction()) {
123 LocalVariable* variable = MakeVariable( 121 LocalVariable* variable = MakeVariable(
124 TokenPosition::kNoSource, TokenPosition::kNoSource, 122 TokenPosition::kNoSource, TokenPosition::kNoSource,
125 Symbols::ClosureParameter(), AbstractType::dynamic_type()); 123 Symbols::ClosureParameter(), AbstractType::dynamic_type());
126 variable->set_is_forced_stack(); 124 variable->set_is_forced_stack();
127 scope_->InsertParameterAt(pos++, variable); 125 scope_->InsertParameterAt(pos++, variable);
128 } else if (!function.is_static()) { 126 } else if (!function.is_static()) {
129 // We use [is_static] instead of [IsStaticFunction] because the latter 127 // We use [is_static] instead of [IsStaticFunction] because the latter
130 // returns `false` for constructors. 128 // returns `false` for constructors.
131 dart::Class& klass = dart::Class::Handle(Z, function.Owner()); 129 dart::Class& klass = dart::Class::Handle(Z, function.Owner());
132 Type& klass_type = H.GetCanonicalType(klass); 130 Type& klass_type = H.GetCanonicalType(klass);
133 LocalVariable* variable = 131 LocalVariable* variable =
134 MakeVariable(TokenPosition::kNoSource, TokenPosition::kNoSource, 132 MakeVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
135 Symbols::This(), klass_type); 133 Symbols::This(), klass_type);
136 scope_->InsertParameterAt(pos++, variable); 134 scope_->InsertParameterAt(pos++, variable);
137 result_->this_variable = variable; 135 result_->this_variable = variable;
138 136
139 // We visit instance field initializers because they might contain 137 // We visit instance field initializers because they might contain
140 // [Let] expressions and we need to have a mapping. 138 // [Let] expressions and we need to have a mapping.
141 if (tag == kConstructor) { 139 if (tag == kConstructor) {
142 ASSERT(parent_offset >= 0); 140 Class& parent_class = Class::Handle(Z, function.Owner());
143 AlternativeReadingScope alt(builder_->reader_, parent_offset); 141 Array& class_fields = Array::Handle(Z, parent_class.fields());
144 ClassHelper class_helper(builder_); 142 dart::Field& class_field = dart::Field::Handle(Z);
145 class_helper.ReadUntilExcluding(ClassHelper::kFields); 143 for (intptr_t i = 0; i < class_fields.Length(); ++i) {
146 intptr_t list_length = 144 class_field ^= class_fields.At(i);
147 builder_->ReadListLength(); // read fields list length. 145 if (!class_field.is_static()) {
148 for (intptr_t i = 0; i < list_length; i++) { 146 TypedData& kernel_data =
149 intptr_t field_offset = builder_->ReaderOffset(); 147 TypedData::Handle(Z, class_field.kernel_data());
150 FieldHelper field_helper(builder_); 148 ASSERT(!kernel_data.IsNull());
151 field_helper.ReadUntilExcluding(FieldHelper::kInitializer); 149 AlternativeReadingScope alt(builder_->reader_, &kernel_data, 0);
152 Tag initializer_tag = 150 intptr_t saved_relative_kernel_offset_ = relative_kernel_offset_;
153 builder_->ReadTag(); // read first part of initializer. 151 relative_kernel_offset_ = class_field.kernel_offset();
154 if (!field_helper.IsStatic() && initializer_tag == kSomething) { 152 FieldHelper field_helper(builder_);
155 EnterScope(field_offset); 153 field_helper.ReadUntilExcluding(FieldHelper::kInitializer);
156 VisitExpression(); // read initializer. 154 Tag initializer_tag =
157 ExitScope(field_helper.position_, field_helper.end_position_); 155 builder_->ReadTag(); // read first part of initializer.
158 } else if (initializer_tag == kSomething) { 156 if (initializer_tag == kSomething) {
159 builder_->SkipExpression(); // read initializer. 157 EnterScope(class_field.kernel_offset());
158 VisitExpression(); // read initializer.
159 ExitScope(field_helper.position_, field_helper.end_position_);
160 }
161 relative_kernel_offset_ = saved_relative_kernel_offset_;
160 } 162 }
161 } 163 }
162 } 164 }
163 } else if (function.IsFactory()) { 165 } else if (function.IsFactory()) {
164 LocalVariable* variable = MakeVariable( 166 LocalVariable* variable = MakeVariable(
165 TokenPosition::kNoSource, TokenPosition::kNoSource, 167 TokenPosition::kNoSource, TokenPosition::kNoSource,
166 Symbols::TypeArgumentsParameter(), AbstractType::dynamic_type()); 168 Symbols::TypeArgumentsParameter(), AbstractType::dynamic_type());
167 scope_->InsertParameterAt(pos++, variable); 169 scope_->InsertParameterAt(pos++, variable);
168 result_->type_arguments_variable = variable; 170 result_->type_arguments_variable = variable;
169 } 171 }
170 172
171 // Continue reading FunctionNode: 173 // Continue reading FunctionNode:
172 // read positional_parameters and named_parameters. 174 // read positional_parameters and named_parameters.
173 AddPositionalAndNamedParameters(pos); 175 AddPositionalAndNamedParameters(pos);
174 176
175 // We generate a syntethic body for implicit closure functions - which 177 // We generate a synthetic body for implicit closure functions - which
176 // will forward the call to the real function. 178 // will forward the call to the real function.
177 // -> see BuildGraphOfImplicitClosureFunction 179 // -> see BuildGraphOfImplicitClosureFunction
178 if (!function.IsImplicitClosureFunction()) { 180 if (!function.IsImplicitClosureFunction()) {
179 builder_->SetOffset(kernel_offset_); 181 builder_->SetOffset(0);
180 first_body_token_position_ = TokenPosition::kNoSource; 182 first_body_token_position_ = TokenPosition::kNoSource;
181 VisitNode(); 183 VisitNode();
182 184
183 // TODO(jensj): HACK: Push the begin token to after any parameters to 185 // TODO(jensj): HACK: Push the begin token to after any parameters to
184 // avoid crash when breaking on definition line of async method in 186 // avoid crash when breaking on definition line of async method in
185 // debugger. It seems that another scope needs to be added 187 // debugger. It seems that another scope needs to be added
186 // in which captures are made, but I can't make that work. 188 // in which captures are made, but I can't make that work.
187 // This 'solution' doesn't crash, but I cannot see the parameters at 189 // This 'solution' doesn't crash, but I cannot see the parameters at
188 // that particular breakpoint either. 190 // that particular breakpoint either.
189 // Also push the end token to after the "}" to avoid crashing on 191 // Also push the end token to after the "}" to avoid crashing on
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
249 scope_->InsertParameterAt(i, variable); 251 scope_->InsertParameterAt(i, variable);
250 } 252 }
251 break; 253 break;
252 case RawFunction::kSignatureFunction: 254 case RawFunction::kSignatureFunction:
253 case RawFunction::kIrregexpFunction: 255 case RawFunction::kIrregexpFunction:
254 UNREACHABLE(); 256 UNREACHABLE();
255 } 257 }
256 if (needs_expr_temp_) { 258 if (needs_expr_temp_) {
257 scope_->AddVariable(parsed_function_->EnsureExpressionTemp()); 259 scope_->AddVariable(parsed_function_->EnsureExpressionTemp());
258 } 260 }
259 parsed_function->AllocateVariables(); 261 parsed_function_->AllocateVariables();
260 262
261 return result_; 263 return result_;
262 } 264 }
263 265
264 void StreamingScopeBuilder::VisitNode() { 266 void StreamingScopeBuilder::VisitNode() {
265 Tag tag = builder_->PeekTag(); 267 Tag tag = builder_->PeekTag();
266 switch (tag) { 268 switch (tag) {
267 case kConstructor: 269 case kConstructor:
268 VisitConstructor(); 270 VisitConstructor();
269 return; 271 return;
(...skipping 13 matching lines...) Expand all
283 } 285 }
284 286
285 void StreamingScopeBuilder::VisitConstructor() { 287 void StreamingScopeBuilder::VisitConstructor() {
286 // Field initializers that come from non-static field declarations are 288 // Field initializers that come from non-static field declarations are
287 // compiled as if they appear in the constructor initializer list. This is 289 // compiled as if they appear in the constructor initializer list. This is
288 // important for closure-valued field initializers because the VM expects the 290 // important for closure-valued field initializers because the VM expects the
289 // corresponding closure functions to appear as if they were nested inside the 291 // corresponding closure functions to appear as if they were nested inside the
290 // constructor. 292 // constructor.
291 ConstructorHelper constructor_helper(builder_); 293 ConstructorHelper constructor_helper(builder_);
292 constructor_helper.ReadUntilExcluding(ConstructorHelper::kFunction); 294 constructor_helper.ReadUntilExcluding(ConstructorHelper::kFunction);
293 intptr_t parent_offset = constructor_helper.parent_class_binary_offset_;
294 ASSERT(parent_offset >= 0);
295 { 295 {
296 AlternativeReadingScope alt(builder_->reader_, parent_offset); 296 const Function& function = parsed_function_->function();
297 ClassHelper class_helper(builder_); 297 Class& parent_class = Class::Handle(Z, function.Owner());
298 class_helper.ReadUntilExcluding(ClassHelper::kFields); 298 Array& class_fields = Array::Handle(Z, parent_class.fields());
299 299 dart::Field& class_field = dart::Field::Handle(Z);
300 intptr_t list_length = 300 for (intptr_t i = 0; i < class_fields.Length(); ++i) {
301 builder_->ReadListLength(); // read fields list length. 301 class_field ^= class_fields.At(i);
302 for (intptr_t i = 0; i < list_length; i++) { 302 if (!class_field.is_static()) {
303 FieldHelper field_helper(builder_); 303 TypedData& kernel_data =
304 field_helper.ReadUntilExcluding(FieldHelper::kInitializer); 304 TypedData::Handle(Z, class_field.kernel_data());
305 Tag initializer_tag = builder_->ReadTag(); 305 ASSERT(!kernel_data.IsNull());
306 if (!field_helper.IsStatic() && initializer_tag == kSomething) { 306 AlternativeReadingScope alt(builder_->reader_, &kernel_data, 0);
307 VisitExpression(); // read initializer. 307 intptr_t saved_relative_kernel_offset_ = relative_kernel_offset_;
308 } else if (initializer_tag == kSomething) { 308 relative_kernel_offset_ = class_field.kernel_offset();
309 builder_->SkipExpression(); // read initializer. 309 FieldHelper field_helper(builder_);
310 field_helper.ReadUntilExcluding(FieldHelper::kInitializer);
311 Tag initializer_tag = builder_->ReadTag();
312 if (initializer_tag == kSomething) {
313 VisitExpression(); // read initializer.
314 }
315 relative_kernel_offset_ = saved_relative_kernel_offset_;
310 } 316 }
311 } 317 }
312 } 318 }
313 319
314 // Visit children (note that there's no reason to visit the name). 320 // Visit children (note that there's no reason to visit the name).
315 VisitFunctionNode(); 321 VisitFunctionNode();
316 intptr_t list_length = 322 intptr_t list_length =
317 builder_->ReadListLength(); // read initializers list length. 323 builder_->ReadListLength(); // read initializers list length.
318 for (intptr_t i = 0; i < list_length; i++) { 324 for (intptr_t i = 0; i < list_length; i++) {
319 VisitInitializer(); 325 VisitInitializer();
(...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after
613 intptr_t offset = 619 intptr_t offset =
614 builder_->ReaderOffset() - 1; // -1 to include tag byte. 620 builder_->ReaderOffset() - 1; // -1 to include tag byte.
615 HandleLocalFunction(offset); // read function node. 621 HandleLocalFunction(offset); // read function node.
616 return; 622 return;
617 } 623 }
618 case kLet: { 624 case kLet: {
619 PositionScope scope(builder_->reader_); 625 PositionScope scope(builder_->reader_);
620 intptr_t offset = 626 intptr_t offset =
621 builder_->ReaderOffset() - 1; // -1 to include tag byte. 627 builder_->ReaderOffset() - 1; // -1 to include tag byte.
622 628
623 EnterScope(offset); 629 EnterScope(relative_kernel_offset_ + offset);
624 630
625 VisitVariableDeclaration(); // read variable declaration. 631 VisitVariableDeclaration(); // read variable declaration.
626 VisitExpression(); // read expression. 632 VisitExpression(); // read expression.
627 633
628 ExitScope(builder_->reader_->min_position(), 634 ExitScope(builder_->reader_->min_position(),
629 builder_->reader_->max_position()); 635 builder_->reader_->max_position());
630 return; 636 return;
631 } 637 }
632 case kBigIntLiteral: 638 case kBigIntLiteral:
633 builder_->SkipStringReference(); // read string reference. 639 builder_->SkipStringReference(); // read string reference.
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
684 case kInvalidStatement: 690 case kInvalidStatement:
685 return; 691 return;
686 case kExpressionStatement: 692 case kExpressionStatement:
687 VisitExpression(); // read expression. 693 VisitExpression(); // read expression.
688 return; 694 return;
689 case kBlock: { 695 case kBlock: {
690 PositionScope scope(builder_->reader_); 696 PositionScope scope(builder_->reader_);
691 intptr_t offset = 697 intptr_t offset =
692 builder_->ReaderOffset() - 1; // -1 to include tag byte. 698 builder_->ReaderOffset() - 1; // -1 to include tag byte.
693 699
694 EnterScope(offset); 700 EnterScope(relative_kernel_offset_ + offset);
695 701
696 intptr_t list_length = 702 intptr_t list_length =
697 builder_->ReadListLength(); // read number of statements. 703 builder_->ReadListLength(); // read number of statements.
698 for (intptr_t i = 0; i < list_length; ++i) { 704 for (intptr_t i = 0; i < list_length; ++i) {
699 VisitStatement(); // read ith statement. 705 VisitStatement(); // read ith statement.
700 } 706 }
701 707
702 ExitScope(builder_->reader_->min_position(), 708 ExitScope(builder_->reader_->min_position(),
703 builder_->reader_->max_position()); 709 builder_->reader_->max_position());
704 return; 710 return;
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
745 VisitStatement(); // read body. 751 VisitStatement(); // read body.
746 VisitExpression(); // read condition. 752 VisitExpression(); // read condition.
747 --depth_.loop_; 753 --depth_.loop_;
748 return; 754 return;
749 case kForStatement: { 755 case kForStatement: {
750 PositionScope scope(builder_->reader_); 756 PositionScope scope(builder_->reader_);
751 757
752 intptr_t offset = 758 intptr_t offset =
753 builder_->ReaderOffset() - 1; // -1 to include tag byte. 759 builder_->ReaderOffset() - 1; // -1 to include tag byte.
754 760
755 EnterScope(offset); 761 EnterScope(relative_kernel_offset_ + offset);
756 762
757 TokenPosition position = builder_->ReadPosition(); // read position. 763 TokenPosition position = builder_->ReadPosition(); // read position.
758 intptr_t list_length = 764 intptr_t list_length =
759 builder_->ReadListLength(); // read number of variables. 765 builder_->ReadListLength(); // read number of variables.
760 for (intptr_t i = 0; i < list_length; ++i) { 766 for (intptr_t i = 0; i < list_length; ++i) {
761 VisitVariableDeclaration(); // read ith variable. 767 VisitVariableDeclaration(); // read ith variable.
762 } 768 }
763 769
764 ++depth_.loop_; 770 ++depth_.loop_;
765 771
(...skipping 25 matching lines...) Expand all
791 797
792 // Notice the ordering: We skip the variable, read the iterable, go back, 798 // Notice the ordering: We skip the variable, read the iterable, go back,
793 // re-read the variable, go forward to after having read the iterable. 799 // re-read the variable, go forward to after having read the iterable.
794 intptr_t offset = builder_->ReaderOffset(); 800 intptr_t offset = builder_->ReaderOffset();
795 builder_->SkipVariableDeclaration(); // read variable. 801 builder_->SkipVariableDeclaration(); // read variable.
796 VisitExpression(); // read iterable. 802 VisitExpression(); // read iterable.
797 803
798 ++depth_.for_in_; 804 ++depth_.for_in_;
799 AddIteratorVariable(); 805 AddIteratorVariable();
800 ++depth_.loop_; 806 ++depth_.loop_;
801 EnterScope(start_offset); 807 EnterScope(relative_kernel_offset_ + start_offset);
802 808
803 { 809 {
804 AlternativeReadingScope alt(builder_->reader_, offset); 810 AlternativeReadingScope alt(builder_->reader_, offset);
805 VisitVariableDeclaration(); // read variable. 811 VisitVariableDeclaration(); // read variable.
806 } 812 }
807 VisitStatement(); // read body. 813 VisitStatement(); // read body.
808 814
809 if (!body_position.IsReal()) { 815 if (!body_position.IsReal()) {
810 body_position = builder_->reader_->min_position(); 816 body_position = builder_->reader_->min_position();
811 } 817 }
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
867 ++depth_.catch_; 873 ++depth_.catch_;
868 AddCatchVariables(); 874 AddCatchVariables();
869 875
870 builder_->ReadBool(); // read any_catch_needs_stack_trace. 876 builder_->ReadBool(); // read any_catch_needs_stack_trace.
871 intptr_t catch_count = 877 intptr_t catch_count =
872 builder_->ReadListLength(); // read number of catches. 878 builder_->ReadListLength(); // read number of catches.
873 for (intptr_t i = 0; i < catch_count; ++i) { 879 for (intptr_t i = 0; i < catch_count; ++i) {
874 PositionScope scope(builder_->reader_); 880 PositionScope scope(builder_->reader_);
875 intptr_t offset = builder_->ReaderOffset(); // Catch has no tag. 881 intptr_t offset = builder_->ReaderOffset(); // Catch has no tag.
876 882
877 EnterScope(offset); 883 EnterScope(relative_kernel_offset_ + offset);
878 884
879 VisitDartType(); // Read the guard. 885 VisitDartType(); // Read the guard.
880 tag = builder_->ReadTag(); // read first part of exception. 886 tag = builder_->ReadTag(); // read first part of exception.
881 if (tag == kSomething) { 887 if (tag == kSomething) {
882 VisitVariableDeclaration(); // read exception. 888 VisitVariableDeclaration(); // read exception.
883 } 889 }
884 tag = builder_->ReadTag(); // read first part of stack trace. 890 tag = builder_->ReadTag(); // read first part of stack trace.
885 if (tag == kSomething) { 891 if (tag == kSomething) {
886 VisitVariableDeclaration(); // read stack trace. 892 VisitVariableDeclaration(); // read stack trace.
887 } 893 }
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
996 TokenPosition end_position = builder_->reader_->max_position(); 1002 TokenPosition end_position = builder_->reader_->max_position();
997 if (end_position.IsReal()) { 1003 if (end_position.IsReal()) {
998 end_position.Next(); 1004 end_position.Next();
999 } 1005 }
1000 LocalVariable* variable = 1006 LocalVariable* variable =
1001 MakeVariable(helper.position_, end_position, name, type); 1007 MakeVariable(helper.position_, end_position, name, type);
1002 if (helper.IsFinal()) { 1008 if (helper.IsFinal()) {
1003 variable->set_is_final(); 1009 variable->set_is_final();
1004 } 1010 }
1005 scope_->AddVariable(variable); 1011 scope_->AddVariable(variable);
1006 result_->locals.Insert(kernel_offset_no_tag, variable); 1012 result_->locals.Insert(relative_kernel_offset_ + kernel_offset_no_tag,
1013 variable);
1007 } 1014 }
1008 1015
1009 void StreamingScopeBuilder::VisitDartType() { 1016 void StreamingScopeBuilder::VisitDartType() {
1010 Tag tag = builder_->ReadTag(); 1017 Tag tag = builder_->ReadTag();
1011 switch (tag) { 1018 switch (tag) {
1012 case kInvalidType: 1019 case kInvalidType:
1013 case kDynamicType: 1020 case kDynamicType:
1014 case kVoidType: 1021 case kVoidType:
1015 case kBottomType: 1022 case kBottomType:
1016 case kVectorType: 1023 case kVectorType:
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
1110 1117
1111 FunctionNodeHelper function_node_helper(builder_); 1118 FunctionNodeHelper function_node_helper(builder_);
1112 function_node_helper.ReadUntilExcluding( 1119 function_node_helper.ReadUntilExcluding(
1113 FunctionNodeHelper::kPositionalParameters); 1120 FunctionNodeHelper::kPositionalParameters);
1114 1121
1115 LocalScope* saved_function_scope = current_function_scope_; 1122 LocalScope* saved_function_scope = current_function_scope_;
1116 FunctionNode::AsyncMarker saved_function_async_marker = 1123 FunctionNode::AsyncMarker saved_function_async_marker =
1117 current_function_async_marker_; 1124 current_function_async_marker_;
1118 StreamingScopeBuilder::DepthState saved_depth_state = depth_; 1125 StreamingScopeBuilder::DepthState saved_depth_state = depth_;
1119 depth_ = DepthState(depth_.function_ + 1); 1126 depth_ = DepthState(depth_.function_ + 1);
1120 EnterScope(parent_kernel_offset); 1127 EnterScope(relative_kernel_offset_ + parent_kernel_offset);
1121 current_function_scope_ = scope_; 1128 current_function_scope_ = scope_;
1122 current_function_async_marker_ = function_node_helper.async_marker_; 1129 current_function_async_marker_ = function_node_helper.async_marker_;
1123 if (depth_.function_ == 1) { 1130 if (depth_.function_ == 1) {
1124 FunctionScope function_scope = {offset, scope_}; 1131 FunctionScope function_scope = {relative_kernel_offset_ + offset, scope_};
1125 result_->function_scopes.Add(function_scope); 1132 result_->function_scopes.Add(function_scope);
1126 } 1133 }
1127 1134
1128 // read positional_parameters and named_parameters. 1135 // read positional_parameters and named_parameters.
1129 AddPositionalAndNamedParameters(); 1136 AddPositionalAndNamedParameters();
1130 1137
1131 // "Peek" is now done. 1138 // "Peek" is now done.
1132 builder_->SetOffset(offset); 1139 builder_->SetOffset(offset);
1133 1140
1134 VisitFunctionNode(); // read function node. 1141 VisitFunctionNode(); // read function node.
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
1177 1184
1178 LocalVariable* variable = 1185 LocalVariable* variable =
1179 MakeVariable(helper.position_, helper.position_, name, type); 1186 MakeVariable(helper.position_, helper.position_, name, type);
1180 if (helper.IsFinal()) { 1187 if (helper.IsFinal()) {
1181 variable->set_is_final(); 1188 variable->set_is_final();
1182 } 1189 }
1183 if (variable->name().raw() == Symbols::IteratorParameter().raw()) { 1190 if (variable->name().raw() == Symbols::IteratorParameter().raw()) {
1184 variable->set_is_forced_stack(); 1191 variable->set_is_forced_stack();
1185 } 1192 }
1186 scope_->InsertParameterAt(pos, variable); 1193 scope_->InsertParameterAt(pos, variable);
1187 result_->locals.Insert(kernel_offset, variable); 1194 result_->locals.Insert(relative_kernel_offset_ + kernel_offset, variable);
1188 1195
1189 // The default value may contain 'let' bindings for which the constant 1196 // The default value may contain 'let' bindings for which the constant
1190 // evaluator needs scope bindings. 1197 // evaluator needs scope bindings.
1191 Tag tag = builder_->ReadTag(); 1198 Tag tag = builder_->ReadTag();
1192 if (tag == kSomething) { 1199 if (tag == kSomething) {
1193 VisitExpression(); // read initializer. 1200 VisitExpression(); // read initializer.
1194 } 1201 }
1195 } 1202 }
1196 1203
1197 LocalVariable* StreamingScopeBuilder::MakeVariable( 1204 LocalVariable* StreamingScopeBuilder::MakeVariable(
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
1275 if ((depth_.function_ == 0) && (result_->switch_variable == NULL)) { 1282 if ((depth_.function_ == 0) && (result_->switch_variable == NULL)) {
1276 LocalVariable* variable = 1283 LocalVariable* variable =
1277 MakeVariable(TokenPosition::kNoSource, TokenPosition::kNoSource, 1284 MakeVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
1278 Symbols::SwitchExpr(), AbstractType::dynamic_type()); 1285 Symbols::SwitchExpr(), AbstractType::dynamic_type());
1279 variable->set_is_forced_stack(); 1286 variable->set_is_forced_stack();
1280 current_function_scope_->AddVariable(variable); 1287 current_function_scope_->AddVariable(variable);
1281 result_->switch_variable = variable; 1288 result_->switch_variable = variable;
1282 } 1289 }
1283 } 1290 }
1284 1291
1285 void StreamingScopeBuilder::LookupVariable(intptr_t declaration_binary_offest) { 1292 void StreamingScopeBuilder::LookupVariable(intptr_t declaration_binary_offset) {
1286 LocalVariable* variable = result_->locals.Lookup(declaration_binary_offest); 1293 LocalVariable* variable = result_->locals.Lookup(declaration_binary_offset);
1287 if (variable == NULL) { 1294 if (variable == NULL) {
1288 // We have not seen a declaration of the variable, so it must be the 1295 // We have not seen a declaration of the variable, so it must be the
1289 // case that we are compiling a nested function and the variable is 1296 // case that we are compiling a nested function and the variable is
1290 // declared in an outer scope. In that case, look it up in the scope by 1297 // declared in an outer scope. In that case, look it up in the scope by
1291 // name and add it to the variable map to simplify later lookup. 1298 // name and add it to the variable map to simplify later lookup.
1292 ASSERT(current_function_scope_->parent() != NULL); 1299 ASSERT(current_function_scope_->parent() != NULL);
1293 1300 StringIndex var_name = builder_->GetNameFromVariableDeclaration(
1294 StringIndex var_name = 1301 declaration_binary_offset, parsed_function_->function());
1295 builder_->GetNameFromVariableDeclaration(declaration_binary_offest);
1296 1302
1297 const dart::String& name = H.DartSymbol(var_name); 1303 const dart::String& name = H.DartSymbol(var_name);
1298 variable = current_function_scope_->parent()->LookupVariable(name, true); 1304 variable = current_function_scope_->parent()->LookupVariable(name, true);
1299 ASSERT(variable != NULL); 1305 ASSERT(variable != NULL);
1300 result_->locals.Insert(declaration_binary_offest, variable); 1306 result_->locals.Insert(declaration_binary_offset, variable);
1301 } 1307 }
1302 1308
1303 if (variable->owner()->function_level() < scope_->function_level()) { 1309 if (variable->owner()->function_level() < scope_->function_level()) {
1304 // We call `LocalScope->CaptureVariable(variable)` in two scenarios for two 1310 // We call `LocalScope->CaptureVariable(variable)` in two scenarios for two
1305 // different reasons: 1311 // different reasons:
1306 // Scenario 1: 1312 // Scenario 1:
1307 // We need to know which variables defined in this function 1313 // We need to know which variables defined in this function
1308 // are closed over by nested closures in order to ensure we will 1314 // are closed over by nested closures in order to ensure we will
1309 // create a [Context] object of appropriate size and store captured 1315 // create a [Context] object of appropriate size and store captured
1310 // variables there instead of the stack. 1316 // variables there instead of the stack.
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after
1466 dart::Object::Handle(Z, H.LookupClassByKernelClass(klass_name)); 1472 dart::Object::Handle(Z, H.LookupClassByKernelClass(klass_name));
1467 result_ = Type::New(klass, type_arguments, TokenPosition::kNoSource); 1473 result_ = Type::New(klass, type_arguments, TokenPosition::kNoSource);
1468 if (finalize_) { 1474 if (finalize_) {
1469 ASSERT(active_class_->klass != NULL); 1475 ASSERT(active_class_->klass != NULL);
1470 result_ = ClassFinalizer::FinalizeType(*active_class_->klass, result_); 1476 result_ = ClassFinalizer::FinalizeType(*active_class_->klass, result_);
1471 } 1477 }
1472 } 1478 }
1473 1479
1474 void StreamingDartTypeTranslator::BuildFunctionType(bool simple) { 1480 void StreamingDartTypeTranslator::BuildFunctionType(bool simple) {
1475 intptr_t list_length = 0; 1481 intptr_t list_length = 0;
1476 intptr_t first_item_offest = -1;
1477 if (!simple) { 1482 if (!simple) {
1478 list_length = 1483 list_length =
1479 builder_->ReadListLength(); // read type_parameters list length 1484 builder_->ReadListLength(); // read type_parameters list length
1480 first_item_offest = builder_->ReaderOffset();
1481 for (int i = 0; i < list_length; ++i) { 1485 for (int i = 0; i < list_length; ++i) {
1482 builder_->SkipStringReference(); // read string index (name). 1486 builder_->SkipStringReference(); // read string index (name).
1483 builder_->SkipDartType(); // read dart type. 1487 builder_->SkipDartType(); // read dart type.
1484 } 1488 }
1485 } 1489 }
1486 1490
1487 // The spec describes in section "19.1 Static Types": 1491 // The spec describes in section "19.1 Static Types":
1488 // 1492 //
1489 // Any use of a malformed type gives rise to a static warning. A 1493 // Any use of a malformed type gives rise to a static warning. A
1490 // malformed type is then interpreted as dynamic by the static type 1494 // malformed type is then interpreted as dynamic by the static type
1491 // checker and the runtime unless explicitly specified otherwise. 1495 // checker and the runtime unless explicitly specified otherwise.
1492 // 1496 //
1493 // So we convert malformed return/parameter types to `dynamic`. 1497 // So we convert malformed return/parameter types to `dynamic`.
1494 TypeParameterScope scope(this, first_item_offest, list_length); 1498 TypeParameterScope scope(this, list_length);
1495 1499
1496 Function& signature_function = Function::ZoneHandle( 1500 Function& signature_function = Function::ZoneHandle(
1497 Z, 1501 Z,
1498 Function::NewSignatureFunction(*active_class_->klass, Function::Handle(Z), 1502 Function::NewSignatureFunction(*active_class_->klass, Function::Handle(Z),
1499 TokenPosition::kNoSource)); 1503 TokenPosition::kNoSource));
1500 1504
1501 intptr_t required_count; 1505 intptr_t required_count;
1502 intptr_t all_count; 1506 intptr_t all_count;
1503 intptr_t positional_count; 1507 intptr_t positional_count;
1504 if (!simple) { 1508 if (!simple) {
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
1634 // (FlowGraphBuilder::LoadFunctionTypeArguments()). 1638 // (FlowGraphBuilder::LoadFunctionTypeArguments()).
1635 result_ ^= dart::Type::DynamicType(); 1639 result_ ^= dart::Type::DynamicType();
1636 return; 1640 return;
1637 } 1641 }
1638 parameter_index -= procedure_type_parameter_count; 1642 parameter_index -= procedure_type_parameter_count;
1639 } 1643 }
1640 } 1644 }
1641 1645
1642 if (type_parameter_scope_ != NULL && parameter_index >= 0 && 1646 if (type_parameter_scope_ != NULL && parameter_index >= 0 &&
1643 parameter_index < type_parameter_scope_->outer_parameter_count() + 1647 parameter_index < type_parameter_scope_->outer_parameter_count() +
1644 type_parameter_scope_->parameters_count()) { 1648 type_parameter_scope_->parameter_count()) {
1645 result_ ^= dart::Type::DynamicType(); 1649 result_ ^= dart::Type::DynamicType();
1646 return; 1650 return;
1647 } 1651 }
1648 1652
1649 H.ReportError("Unexpected input. Please report this at dartbug.com."); 1653 H.ReportError("Unexpected input. Please report this at dartbug.com.");
1650 } 1654 }
1651 1655
1652 const TypeArguments& StreamingDartTypeTranslator::BuildTypeArguments( 1656 const TypeArguments& StreamingDartTypeTranslator::BuildTypeArguments(
1653 intptr_t length) { 1657 intptr_t length) {
1654 bool only_dynamic = true; 1658 bool only_dynamic = true;
(...skipping 580 matching lines...) Expand 10 before | Expand all | Expand 10 after
2235 2239
2236 // NOTE: This needs to be kept in sync with `runtime/lib/immutable_map.dart`! 2240 // NOTE: This needs to be kept in sync with `runtime/lib/immutable_map.dart`!
2237 result_ = Instance::New(map_class, Heap::kOld); 2241 result_ = Instance::New(map_class, Heap::kOld);
2238 ASSERT(!result_.IsNull()); 2242 ASSERT(!result_.IsNull());
2239 result_.SetTypeArguments(type_arguments); 2243 result_.SetTypeArguments(type_arguments);
2240 result_.SetField(field, const_kv_array); 2244 result_.SetField(field, const_kv_array);
2241 result_ = H.Canonicalize(result_); 2245 result_ = H.Canonicalize(result_);
2242 } 2246 }
2243 2247
2244 void StreamingConstantEvaluator::EvaluateLet() { 2248 void StreamingConstantEvaluator::EvaluateLet() {
2245 intptr_t kernel_position = builder_->ReaderOffset(); 2249 intptr_t kernel_position =
2250 builder_->ReaderOffset() + builder_->relative_kernel_offset_;
2246 LocalVariable* local = builder_->LookupVariable(kernel_position); 2251 LocalVariable* local = builder_->LookupVariable(kernel_position);
2247 2252
2248 // read variable declaration. 2253 // read variable declaration.
2249 VariableDeclarationHelper helper(builder_); 2254 VariableDeclarationHelper helper(builder_);
2250 helper.ReadUntilExcluding(VariableDeclarationHelper::kInitializer); 2255 helper.ReadUntilExcluding(VariableDeclarationHelper::kInitializer);
2251 Tag tag = builder_->ReadTag(); // read (first part of) initializer. 2256 Tag tag = builder_->ReadTag(); // read (first part of) initializer.
2252 if (tag == kNothing) { 2257 if (tag == kNothing) {
2253 local->SetConstValue(Instance::ZoneHandle(Z, dart::Instance::null())); 2258 local->SetConstValue(Instance::ZoneHandle(Z, dart::Instance::null()));
2254 } else { 2259 } else {
2255 local->SetConstValue(EvaluateExpression( 2260 local->SetConstValue(EvaluateExpression(
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
2399 if (constructor.IsFactory()) { 2404 if (constructor.IsFactory()) {
2400 // The factory method returns the allocated object. 2405 // The factory method returns the allocated object.
2401 instance ^= result.raw(); 2406 instance ^= result.raw();
2402 } 2407 }
2403 return H.Canonicalize(instance); 2408 return H.Canonicalize(instance);
2404 } 2409 }
2405 2410
2406 const TypeArguments* StreamingConstantEvaluator::TranslateTypeArguments( 2411 const TypeArguments* StreamingConstantEvaluator::TranslateTypeArguments(
2407 const Function& target, 2412 const Function& target,
2408 dart::Class* target_klass) { 2413 dart::Class* target_klass) {
2409 intptr_t types_count = builder_->ReadListLength(); // read types count. 2414 intptr_t type_count = builder_->ReadListLength(); // read type count.
2410 2415
2411 const TypeArguments* type_arguments = NULL; 2416 const TypeArguments* type_arguments = NULL;
2412 if (types_count > 0) { 2417 if (type_count > 0) {
2413 type_arguments = &T.BuildInstantiatedTypeArguments( 2418 type_arguments = &T.BuildInstantiatedTypeArguments(
2414 *target_klass, types_count); // read types. 2419 *target_klass, type_count); // read types.
2415 2420
2416 if (!(type_arguments->IsNull() || type_arguments->IsInstantiated())) { 2421 if (!(type_arguments->IsNull() || type_arguments->IsInstantiated())) {
2417 H.ReportError("Type must be constant in const constructor."); 2422 H.ReportError("Type must be constant in const constructor.");
2418 } 2423 }
2419 } else if (target.IsFactory() && type_arguments == NULL) { 2424 } else if (target.IsFactory() && type_arguments == NULL) {
2420 // All factories take a type arguments vector as first argument (independent 2425 // All factories take a type arguments vector as first argument (independent
2421 // of whether the class is generic or not). 2426 // of whether the class is generic or not).
2422 type_arguments = &TypeArguments::ZoneHandle(Z, TypeArguments::null()); 2427 type_arguments = &TypeArguments::ZoneHandle(Z, TypeArguments::null());
2423 } 2428 }
2424 return type_arguments; 2429 return type_arguments;
(...skipping 15 matching lines...) Expand all
2440 // evaluated only once. 2445 // evaluated only once.
2441 return false; 2446 return false;
2442 } 2447 }
2443 2448
2444 bool is_present = false; 2449 bool is_present = false;
2445 ASSERT(!script_.InVMHeap()); 2450 ASSERT(!script_.InVMHeap());
2446 if (script_.compile_time_constants() == Array::null()) { 2451 if (script_.compile_time_constants() == Array::null()) {
2447 return false; 2452 return false;
2448 } 2453 }
2449 KernelConstantsMap constants(script_.compile_time_constants()); 2454 KernelConstantsMap constants(script_.compile_time_constants());
2450 *value ^= constants.GetOrNull(kernel_offset, &is_present); 2455 *value ^= constants.GetOrNull(
2456 kernel_offset + builder_->relative_kernel_offset_, &is_present);
2451 // Mutator compiler thread may add constants while background compiler 2457 // Mutator compiler thread may add constants while background compiler
2452 // is running, and thus change the value of 'compile_time_constants'; 2458 // is running, and thus change the value of 'compile_time_constants';
2453 // do not assert that 'compile_time_constants' has not changed. 2459 // do not assert that 'compile_time_constants' has not changed.
2454 constants.Release(); 2460 constants.Release();
2455 if (FLAG_compiler_stats && is_present) { 2461 if (FLAG_compiler_stats && is_present) {
2456 ++H.thread()->compiler_stats()->num_const_cache_hits; 2462 ++H.thread()->compiler_stats()->num_const_cache_hits;
2457 } 2463 }
2458 return is_present; 2464 return is_present;
2459 } 2465 }
2460 2466
(...skipping 10 matching lines...) Expand all
2471 return; 2477 return;
2472 } 2478 }
2473 const intptr_t kInitialConstMapSize = 16; 2479 const intptr_t kInitialConstMapSize = 16;
2474 ASSERT(!script_.InVMHeap()); 2480 ASSERT(!script_.InVMHeap());
2475 if (script_.compile_time_constants() == Array::null()) { 2481 if (script_.compile_time_constants() == Array::null()) {
2476 const Array& array = Array::Handle( 2482 const Array& array = Array::Handle(
2477 HashTables::New<KernelConstantsMap>(kInitialConstMapSize, Heap::kNew)); 2483 HashTables::New<KernelConstantsMap>(kInitialConstMapSize, Heap::kNew));
2478 script_.set_compile_time_constants(array); 2484 script_.set_compile_time_constants(array);
2479 } 2485 }
2480 KernelConstantsMap constants(script_.compile_time_constants()); 2486 KernelConstantsMap constants(script_.compile_time_constants());
2481 constants.InsertNewOrGetValue(kernel_offset, value); 2487 constants.InsertNewOrGetValue(
2488 kernel_offset + builder_->relative_kernel_offset_, value);
2482 script_.set_compile_time_constants(constants.Release()); 2489 script_.set_compile_time_constants(constants.Release());
2483 } 2490 }
2484 2491
2485 void StreamingFlowGraphBuilder::DiscoverEnclosingElements( 2492 void StreamingFlowGraphBuilder::DiscoverEnclosingElements(
2486 Zone* zone, 2493 Zone* zone,
2487 const Function& function, 2494 const Function& function,
2488 Function* outermost_function) { 2495 Function* outermost_function) {
2489 // Find out if there is an enclosing kernel class (which will be used to 2496 // Find out if there is an enclosing kernel class (which will be used to
2490 // resolve type parameters). 2497 // resolve type parameters).
2491 *outermost_function = function.raw(); 2498 *outermost_function = function.raw();
2492 while (outermost_function->parent_function() != Object::null()) { 2499 while (outermost_function->parent_function() != Object::null()) {
2493 *outermost_function = outermost_function->parent_function(); 2500 *outermost_function = outermost_function->parent_function();
2494 } 2501 }
2495 } 2502 }
2496 2503
2497 intptr_t StreamingFlowGraphBuilder::ReadUntilFunctionNode() { 2504 void StreamingFlowGraphBuilder::ReadUntilFunctionNode() {
2498 const Tag tag = PeekTag(); 2505 const Tag tag = PeekTag();
2499 if (tag == kProcedure) { 2506 if (tag == kProcedure) {
2500 ProcedureHelper procedure_helper(this); 2507 ProcedureHelper procedure_helper(this);
2501 procedure_helper.ReadUntilExcluding(ProcedureHelper::kFunction); 2508 procedure_helper.ReadUntilExcluding(ProcedureHelper::kFunction);
2502 if (ReadTag() == kNothing) { // read function node tag. 2509 if (ReadTag() == kNothing) { // read function node tag.
2503 // Running a procedure without a function node doesn't make sense. 2510 // Running a procedure without a function node doesn't make sense.
2504 UNREACHABLE(); 2511 UNREACHABLE();
2505 } 2512 }
2506 return -1; 2513 return;
2507 // Now at start of FunctionNode. 2514 // Now at start of FunctionNode.
2508 } else if (tag == kConstructor) { 2515 } else if (tag == kConstructor) {
2509 ConstructorHelper constructor_helper(this); 2516 ConstructorHelper constructor_helper(this);
2510 constructor_helper.ReadUntilExcluding(ConstructorHelper::kFunction); 2517 constructor_helper.ReadUntilExcluding(ConstructorHelper::kFunction);
2511 return constructor_helper.parent_class_binary_offset_; 2518 return;
2512 // Now at start of FunctionNode. 2519 // Now at start of FunctionNode.
2513 // Notice that we also have a list of initializers after that! 2520 // Notice that we also have a list of initializers after that!
2514 } else if (tag == kFunctionNode) { 2521 } else if (tag == kFunctionNode) {
2515 // Already at start of FunctionNode. 2522 // Already at start of FunctionNode.
2516 } else { 2523 } else {
2517 UNREACHABLE(); 2524 UNREACHABLE();
2518 } 2525 }
2519 return -1; 2526 return;
2520 } 2527 }
2521 2528
2522 StringIndex StreamingFlowGraphBuilder::GetNameFromVariableDeclaration( 2529 StringIndex StreamingFlowGraphBuilder::GetNameFromVariableDeclaration(
2523 intptr_t kernel_offset) { 2530 intptr_t kernel_offset,
2531 const Function& function) {
2532 Function& function_or_parent = Function::Handle(Z, function.raw());
2533 intptr_t function_start_relative =
2534 function_or_parent.kernel_offset() - kernel_offset;
2535 while (function_start_relative > 0) {
2536 function_or_parent = function_or_parent.parent_function();
2537 function_start_relative =
2538 function_or_parent.kernel_offset() - kernel_offset;
2539 }
2540 TypedData& kernel_data =
2541 TypedData::Handle(Z, function_or_parent.kernel_data());
2542 ASSERT(!kernel_data.IsNull());
2543
2524 // Temporarily go to the variable declaration, read the name. 2544 // Temporarily go to the variable declaration, read the name.
2525 AlternativeReadingScope alt(reader_, kernel_offset); 2545 AlternativeReadingScope alt(
2546 reader_, &kernel_data,
2547 kernel_offset - function_or_parent.kernel_offset());
2526 VariableDeclarationHelper helper(this); 2548 VariableDeclarationHelper helper(this);
2527 helper.ReadUntilIncluding(VariableDeclarationHelper::kNameIndex); 2549 helper.ReadUntilIncluding(VariableDeclarationHelper::kNameIndex);
2528 return helper.name_index_; 2550 return helper.name_index_;
2529 } 2551 }
2530 2552
2531 FlowGraph* StreamingFlowGraphBuilder::BuildGraphOfStaticFieldInitializer() { 2553 FlowGraph* StreamingFlowGraphBuilder::BuildGraphOfStaticFieldInitializer() {
2532 FieldHelper field_helper(this); 2554 FieldHelper field_helper(this);
2533 field_helper.ReadUntilExcluding(FieldHelper::kInitializer); 2555 field_helper.ReadUntilExcluding(FieldHelper::kInitializer);
2534 ASSERT(field_helper.IsStatic()); 2556 ASSERT(field_helper.IsStatic());
2535 2557
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after
2705 } 2727 }
2706 2728
2707 Fragment instructions; 2729 Fragment instructions;
2708 instructions += LoadLocal(scopes()->this_variable); 2730 instructions += LoadLocal(scopes()->this_variable);
2709 instructions += BuildExpression(); 2731 instructions += BuildExpression();
2710 instructions += flow_graph_builder_->StoreInstanceFieldGuarded(field, true); 2732 instructions += flow_graph_builder_->StoreInstanceFieldGuarded(field, true);
2711 return instructions; 2733 return instructions;
2712 } 2734 }
2713 2735
2714 Fragment StreamingFlowGraphBuilder::BuildInitializers( 2736 Fragment StreamingFlowGraphBuilder::BuildInitializers(
2715 intptr_t constructor_class_parent_offset) { 2737 const Class& parent_class) {
2716 Fragment instructions; 2738 Fragment instructions;
2717 2739
2718 // Start by getting the position of the constructors initializer. 2740 // Start by getting the position of the constructors initializer.
2719 intptr_t initializers_offset = -1; 2741 intptr_t initializers_offset = -1;
2720 { 2742 {
2721 AlternativeReadingScope alt(reader_); 2743 AlternativeReadingScope alt(reader_);
2722 SkipFunctionNode(); // read constructors function node. 2744 SkipFunctionNode(); // read constructors function node.
2723 initializers_offset = ReaderOffset(); 2745 initializers_offset = ReaderOffset();
2724 } 2746 }
2725 2747
2726 // These come from: 2748 // These come from:
2727 // class A { 2749 // class A {
2728 // var x = (expr); 2750 // var x = (expr);
2729 // } 2751 // }
2730 // We don't want to do that when this is a Redirecting Constructors though 2752 // We don't want to do that when this is a Redirecting Constructors though
2731 // (i.e. has a single initializer being of type kRedirectingInitializer). 2753 // (i.e. has a single initializer being of type kRedirectingInitializer).
2732 bool is_redirecting_constructor = false; 2754 bool is_redirecting_constructor = false;
2733 { 2755 {
2734 AlternativeReadingScope alt(reader_, initializers_offset); 2756 AlternativeReadingScope alt(reader_, initializers_offset);
2735 intptr_t list_length = ReadListLength(); // read initializers list length. 2757 intptr_t list_length = ReadListLength(); // read initializers list length.
2736 if (list_length == 1) { 2758 if (list_length == 1) {
2737 Tag tag = ReadTag(); 2759 Tag tag = ReadTag();
2738 if (tag == kRedirectingInitializer) is_redirecting_constructor = true; 2760 if (tag == kRedirectingInitializer) is_redirecting_constructor = true;
2739 } 2761 }
2740 } 2762 }
2741 2763
2742 if (!is_redirecting_constructor) { 2764 if (!is_redirecting_constructor) {
2743 AlternativeReadingScope alt(reader_, constructor_class_parent_offset); 2765 Array& class_fields = Array::Handle(Z, parent_class.fields());
2744 ClassHelper class_helper(this); 2766 dart::Field& class_field = dart::Field::Handle(Z);
2745 class_helper.ReadUntilExcluding(ClassHelper::kFields); 2767 for (intptr_t i = 0; i < class_fields.Length(); ++i) {
2746 intptr_t list_length = ReadListLength(); // read fields list length. 2768 class_field ^= class_fields.At(i);
2747 2769 if (!class_field.is_static()) {
2748 for (intptr_t i = 0; i < list_length; ++i) { 2770 TypedData& kernel_data =
2749 intptr_t field_offset = ReaderOffset(); 2771 TypedData::Handle(Z, class_field.kernel_data());
2750 FieldHelper field_helper(this); 2772 ASSERT(!kernel_data.IsNull());
2751 field_helper.ReadUntilExcluding(FieldHelper::kInitializer); 2773 AlternativeReadingScope alt(reader_, &kernel_data, 0);
2752 Tag initializer_tag = ReadTag(); // read first part of initializer. 2774 intptr_t saved_relative_kernel_offset_ = relative_kernel_offset_;
2753 if (!field_helper.IsStatic() && initializer_tag == kSomething) { 2775 relative_kernel_offset_ = class_field.kernel_offset();
2754 EnterScope(field_offset); 2776 FieldHelper field_helper(this);
2755 instructions += BuildFieldInitializer( 2777 field_helper.ReadUntilExcluding(FieldHelper::kInitializer);
2756 field_helper.canonical_name_); // read initializer. 2778 Tag initializer_tag = ReadTag(); // read first part of initializer.
2757 ExitScope(field_offset); 2779 if (initializer_tag == kSomething) {
2758 } else if (initializer_tag == kSomething) { 2780 EnterScope(class_field.kernel_offset());
2759 SkipExpression(); // read initializer. 2781 instructions += BuildFieldInitializer(
2782 field_helper.canonical_name_); // read initializer.
2783 ExitScope(class_field.kernel_offset());
2784 }
2785 relative_kernel_offset_ = saved_relative_kernel_offset_;
2760 } 2786 }
2761 } 2787 }
2762 } 2788 }
2763 2789
2764 // These to come from: 2790 // These to come from:
2765 // class A { 2791 // class A {
2766 // var x; 2792 // var x;
2767 // var y; 2793 // var y;
2768 // A(this.x) : super(expr), y = (expr); 2794 // A(this.x) : super(expr), y = (expr);
2769 // } 2795 // }
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
2841 // 2867 //
2842 // to 2868 // to
2843 // 2869 //
2844 // class A { 2870 // class A {
2845 // var x; 2871 // var x;
2846 // A(a, b) : tmp = a + b, x = 2*b, super(tmp) {} 2872 // A(a, b) : tmp = a + b, x = 2*b, super(tmp) {}
2847 // } 2873 // }
2848 // 2874 //
2849 // (This is strictly speaking not what one should do in terms of the 2875 // (This is strictly speaking not what one should do in terms of the
2850 // specification but that is how it is currently implemented.) 2876 // specification but that is how it is currently implemented.)
2851 LocalVariable* variable = LookupVariable(ReaderOffset()); 2877 LocalVariable* variable =
2878 LookupVariable(ReaderOffset() + relative_kernel_offset_);
2852 2879
2853 // Variable declaration 2880 // Variable declaration
2854 VariableDeclarationHelper helper(this); 2881 VariableDeclarationHelper helper(this);
2855 helper.ReadUntilExcluding(VariableDeclarationHelper::kInitializer); 2882 helper.ReadUntilExcluding(VariableDeclarationHelper::kInitializer);
2856 ASSERT(!helper.IsConst()); 2883 ASSERT(!helper.IsConst());
2857 Tag tag = ReadTag(); // read (first part of) initializer. 2884 Tag tag = ReadTag(); // read (first part of) initializer.
2858 if (tag != kSomething) { 2885 if (tag != kSomething) {
2859 UNREACHABLE(); 2886 UNREACHABLE();
2860 } 2887 }
2861 2888
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
2893 body += PushArgument(); 2920 body += PushArgument();
2894 } 2921 }
2895 2922
2896 FunctionNodeHelper function_node_helper(this); 2923 FunctionNodeHelper function_node_helper(this);
2897 function_node_helper.ReadUntilExcluding( 2924 function_node_helper.ReadUntilExcluding(
2898 FunctionNodeHelper::kPositionalParameters); 2925 FunctionNodeHelper::kPositionalParameters);
2899 2926
2900 // Positional. 2927 // Positional.
2901 intptr_t positional_argument_count = ReadListLength(); 2928 intptr_t positional_argument_count = ReadListLength();
2902 for (intptr_t i = 0; i < positional_argument_count; ++i) { 2929 for (intptr_t i = 0; i < positional_argument_count; ++i) {
2903 body += LoadLocal(LookupVariable(ReaderOffset())); // ith variable offset. 2930 body += LoadLocal(LookupVariable(
2931 ReaderOffset() + relative_kernel_offset_)); // ith variable offset.
2904 body += PushArgument(); 2932 body += PushArgument();
2905 SkipVariableDeclaration(); // read ith variable. 2933 SkipVariableDeclaration(); // read ith variable.
2906 } 2934 }
2907 2935
2908 // Named. 2936 // Named.
2909 intptr_t named_argument_count = ReadListLength(); 2937 intptr_t named_argument_count = ReadListLength();
2910 Array& argument_names = Array::ZoneHandle(Z); 2938 Array& argument_names = Array::ZoneHandle(Z);
2911 if (named_argument_count > 0) { 2939 if (named_argument_count > 0) {
2912 argument_names = Array::New(named_argument_count); 2940 argument_names = Array::New(named_argument_count);
2913 for (intptr_t i = 0; i < named_argument_count; ++i) { 2941 for (intptr_t i = 0; i < named_argument_count; ++i) {
2914 // ith variable offset. 2942 // ith variable offset.
2915 body += LoadLocal(LookupVariable(ReaderOffset())); 2943 body +=
2944 LoadLocal(LookupVariable(ReaderOffset() + relative_kernel_offset_));
2916 body += PushArgument(); 2945 body += PushArgument();
2917 StringIndex name = GetNameFromVariableDeclaration(ReaderOffset()); 2946
2918 argument_names.SetAt(i, H.DartSymbol(name)); 2947 // read ith variable.
2919 SkipVariableDeclaration(); // read ith variable. 2948 VariableDeclarationHelper helper(this);
2949 helper.ReadUntilExcluding(VariableDeclarationHelper::kEnd);
2950
2951 argument_names.SetAt(i, H.DartSymbol(helper.name_index_));
2920 } 2952 }
2921 } 2953 }
2922 2954
2923 // Forward them to the target. 2955 // Forward them to the target.
2924 intptr_t argument_count = positional_argument_count + named_argument_count; 2956 intptr_t argument_count = positional_argument_count + named_argument_count;
2925 if (!target.is_static()) ++argument_count; 2957 if (!target.is_static()) ++argument_count;
2926 body += StaticCall(TokenPosition::kNoSource, target, argument_count, 2958 body += StaticCall(TokenPosition::kNoSource, target, argument_count,
2927 argument_names); 2959 argument_names);
2928 2960
2929 // Return the result. 2961 // Return the result.
(...skipping 27 matching lines...) Expand all
2957 function_node_helper.ReadUntilExcluding( 2989 function_node_helper.ReadUntilExcluding(
2958 FunctionNodeHelper::kPositionalParameters); 2990 FunctionNodeHelper::kPositionalParameters);
2959 2991
2960 // Positional. 2992 // Positional.
2961 const intptr_t positional_argument_count = ReadListLength(); 2993 const intptr_t positional_argument_count = ReadListLength();
2962 2994
2963 // The first argument is the instance of the closure class. For converted 2995 // The first argument is the instance of the closure class. For converted
2964 // closures its context field contains the context vector that is used by the 2996 // closures its context field contains the context vector that is used by the
2965 // converted top-level function (target) explicitly and that should be passed 2997 // converted top-level function (target) explicitly and that should be passed
2966 // to that function as the first parameter. 2998 // to that function as the first parameter.
2967 body += LoadLocal(LookupVariable(ReaderOffset())); // 0th variable offset. 2999 body += LoadLocal(LookupVariable(
3000 ReaderOffset() + relative_kernel_offset_)); // 0th variable offset.
2968 body += flow_graph_builder_->LoadField(Closure::context_offset()); 3001 body += flow_graph_builder_->LoadField(Closure::context_offset());
2969 body += PushArgument(); 3002 body += PushArgument();
2970 SkipVariableDeclaration(); // read 0th variable. 3003 SkipVariableDeclaration(); // read 0th variable.
2971 3004
2972 // The rest of the parameters are the same for the method of the Closure class 3005 // The rest of the parameters are the same for the method of the Closure class
2973 // being invoked and the top-level function (target). 3006 // being invoked and the top-level function (target).
2974 for (intptr_t i = 1; i < positional_argument_count; i++) { 3007 for (intptr_t i = 1; i < positional_argument_count; i++) {
2975 body += LoadLocal(LookupVariable(ReaderOffset())); // ith variable offset. 3008 body += LoadLocal(LookupVariable(
3009 ReaderOffset() + relative_kernel_offset_)); // ith variable offset.
2976 body += PushArgument(); 3010 body += PushArgument();
2977 SkipVariableDeclaration(); // read ith variable. 3011 SkipVariableDeclaration(); // read ith variable.
2978 } 3012 }
2979 3013
2980 // Named. 3014 // Named.
2981 const intptr_t named_argument_count = ReadListLength(); 3015 const intptr_t named_argument_count = ReadListLength();
2982 Array& argument_names = Array::ZoneHandle(Z); 3016 Array& argument_names = Array::ZoneHandle(Z);
2983 if (named_argument_count > 0) { 3017 if (named_argument_count > 0) {
2984 argument_names = Array::New(named_argument_count); 3018 argument_names = Array::New(named_argument_count);
2985 for (intptr_t i = 0; i < named_argument_count; i++) { 3019 for (intptr_t i = 0; i < named_argument_count; i++) {
3020 // ith variable offset.
2986 body += 3021 body +=
2987 LoadLocal(LookupVariable(ReaderOffset())); // ith variable offset. 3022 LoadLocal(LookupVariable(ReaderOffset() + relative_kernel_offset_));
2988 body += PushArgument(); 3023 body += PushArgument();
2989 argument_names.SetAt( 3024
2990 i, H.DartSymbol(GetNameFromVariableDeclaration(ReaderOffset()))); 3025 // read ith variable.
2991 SkipVariableDeclaration(); // read ith variable. 3026 VariableDeclarationHelper helper(this);
3027 helper.ReadUntilExcluding(VariableDeclarationHelper::kEnd);
3028
3029 argument_names.SetAt(i, H.DartSymbol(helper.name_index_));
2992 } 3030 }
2993 } 3031 }
2994 3032
2995 // Forward them to the target. 3033 // Forward them to the target.
2996 const intptr_t argument_count = 3034 const intptr_t argument_count =
2997 positional_argument_count + named_argument_count; 3035 positional_argument_count + named_argument_count;
2998 body += StaticCall(TokenPosition::kNoSource, target, argument_count, 3036 body += StaticCall(TokenPosition::kNoSource, target, argument_count,
2999 argument_names); 3037 argument_names);
3000 3038
3001 // Return the result. 3039 // Return the result.
3002 body += Return(function_node_helper.end_position_); 3040 body += Return(function_node_helper.end_position_);
3003 3041
3004 return new (Z) 3042 return new (Z)
3005 FlowGraph(*parsed_function(), flow_graph_builder_->graph_entry_, 3043 FlowGraph(*parsed_function(), flow_graph_builder_->graph_entry_,
3006 flow_graph_builder_->next_block_id_ - 1); 3044 flow_graph_builder_->next_block_id_ - 1);
3007 } 3045 }
3008 3046
3009 FlowGraph* StreamingFlowGraphBuilder::BuildGraphOfFunction( 3047 FlowGraph* StreamingFlowGraphBuilder::BuildGraphOfFunction(bool constructor) {
3010 intptr_t constructor_class_parent_offset) {
3011 const Function& dart_function = parsed_function()->function(); 3048 const Function& dart_function = parsed_function()->function();
3012 TargetEntryInstr* normal_entry = flow_graph_builder_->BuildTargetEntry(); 3049 TargetEntryInstr* normal_entry = flow_graph_builder_->BuildTargetEntry();
3013 flow_graph_builder_->graph_entry_ = new (Z) GraphEntryInstr( 3050 flow_graph_builder_->graph_entry_ = new (Z) GraphEntryInstr(
3014 *parsed_function(), normal_entry, flow_graph_builder_->osr_id_); 3051 *parsed_function(), normal_entry, flow_graph_builder_->osr_id_);
3015 3052
3016 SetupDefaultParameterValues(); 3053 SetupDefaultParameterValues();
3017 3054
3018 Fragment body; 3055 Fragment body;
3019 if (!dart_function.is_native()) 3056 if (!dart_function.is_native())
3020 body += flow_graph_builder_->CheckStackOverflowInPrologue(); 3057 body += flow_graph_builder_->CheckStackOverflowInPrologue();
(...skipping 28 matching lines...) Expand all
3049 body += flow_graph_builder_->StoreInstanceField( 3086 body += flow_graph_builder_->StoreInstanceField(
3050 TokenPosition::kNoSource, 3087 TokenPosition::kNoSource,
3051 Context::variable_offset(variable->index())); 3088 Context::variable_offset(variable->index()));
3052 body += NullConstant(); 3089 body += NullConstant();
3053 body += StoreLocal(TokenPosition::kNoSource, parameter); 3090 body += StoreLocal(TokenPosition::kNoSource, parameter);
3054 body += Drop(); 3091 body += Drop();
3055 } 3092 }
3056 } 3093 }
3057 body += Drop(); // The context. 3094 body += Drop(); // The context.
3058 } 3095 }
3059 if (constructor_class_parent_offset > 0) { 3096 if (constructor) {
3060 // TODO(27590): Currently the [VariableDeclaration]s from the 3097 // TODO(27590): Currently the [VariableDeclaration]s from the
3061 // initializers will be visible inside the entire body of the constructor. 3098 // initializers will be visible inside the entire body of the constructor.
3062 // We should make a separate scope for them. 3099 // We should make a separate scope for them.
3063 body += BuildInitializers(constructor_class_parent_offset); 3100 body += BuildInitializers(Class::Handle(Z, dart_function.Owner()));
3064 } 3101 }
3065 3102
3066 FunctionNodeHelper function_node_helper(this); 3103 FunctionNodeHelper function_node_helper(this);
3067 function_node_helper.ReadUntilExcluding( 3104 function_node_helper.ReadUntilExcluding(
3068 FunctionNodeHelper::kPositionalParameters); 3105 FunctionNodeHelper::kPositionalParameters);
3069 intptr_t first_parameter_offset = -1; 3106 intptr_t first_parameter_offset = -1;
3070 { 3107 {
3071 AlternativeReadingScope alt(reader_); 3108 AlternativeReadingScope alt(reader_);
3072 intptr_t list_length = ReadListLength(); // read number of positionals. 3109 intptr_t list_length = ReadListLength(); // read number of positionals.
3073 if (list_length > 0) { 3110 if (list_length > 0) {
3074 first_parameter_offset = ReaderOffset(); 3111 first_parameter_offset = ReaderOffset() + relative_kernel_offset_;
3075 } 3112 }
3076 } 3113 }
3077 // Current position: About to read list of positionals. 3114 // Current position: About to read list of positionals.
3078 3115
3079 // The specification defines the result of `a == b` to be: 3116 // The specification defines the result of `a == b` to be:
3080 // 3117 //
3081 // a) if either side is `null` then the result is `identical(a, b)`. 3118 // a) if either side is `null` then the result is `identical(a, b)`.
3082 // b) else the result is `a.operator==(b)` 3119 // b) else the result is `a.operator==(b)`
3083 // 3120 //
3084 // For user-defined implementations of `operator==` we need therefore 3121 // For user-defined implementations of `operator==` we need therefore
(...skipping 23 matching lines...) Expand all
3108 body = Fragment(body.entry, non_null_entry); 3145 body = Fragment(body.entry, non_null_entry);
3109 } 3146 }
3110 3147
3111 // If we run in checked mode, we have to check the type of the passed 3148 // If we run in checked mode, we have to check the type of the passed
3112 // arguments. 3149 // arguments.
3113 if (I->type_checks()) { 3150 if (I->type_checks()) {
3114 // Positional. 3151 // Positional.
3115 intptr_t list_length = ReadListLength(); 3152 intptr_t list_length = ReadListLength();
3116 for (intptr_t i = 0; i < list_length; ++i) { 3153 for (intptr_t i = 0; i < list_length; ++i) {
3117 // ith variable offset. 3154 // ith variable offset.
3118 body += LoadLocal(LookupVariable(ReaderOffset())); 3155 body +=
3119 body += CheckVariableTypeInCheckedMode(ReaderOffset()); 3156 LoadLocal(LookupVariable(ReaderOffset() + relative_kernel_offset_));
3157 body += CheckVariableTypeInCheckedMode(ReaderOffset() +
3158 relative_kernel_offset_);
3120 body += Drop(); 3159 body += Drop();
3121 SkipVariableDeclaration(); // read ith variable. 3160 SkipVariableDeclaration(); // read ith variable.
3122 } 3161 }
3123 3162
3124 // Named. 3163 // Named.
3125 list_length = ReadListLength(); 3164 list_length = ReadListLength();
3126 for (intptr_t i = 0; i < list_length; ++i) { 3165 for (intptr_t i = 0; i < list_length; ++i) {
3127 // ith variable offset. 3166 // ith variable offset.
3128 body += LoadLocal(LookupVariable(ReaderOffset())); 3167 body +=
3129 body += CheckVariableTypeInCheckedMode(ReaderOffset()); 3168 LoadLocal(LookupVariable(ReaderOffset() + relative_kernel_offset_));
3169 body += CheckVariableTypeInCheckedMode(ReaderOffset() +
3170 relative_kernel_offset_);
3130 body += Drop(); 3171 body += Drop();
3131 SkipVariableDeclaration(); // read ith variable. 3172 SkipVariableDeclaration(); // read ith variable.
3132 } 3173 }
3133 3174
3134 function_node_helper.SetJustRead(FunctionNodeHelper::kNamedParameters); 3175 function_node_helper.SetJustRead(FunctionNodeHelper::kNamedParameters);
3135 } 3176 }
3136 3177
3137 function_node_helper.ReadUntilExcluding(FunctionNodeHelper::kBody); 3178 function_node_helper.ReadUntilExcluding(FunctionNodeHelper::kBody);
3138 3179
3139 bool has_body = ReadTag() == kSomething; // read first part of body. 3180 bool has_body = ReadTag() == kSomething; // read first part of body.
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
3291 // become unreachable after OSR. 3332 // become unreachable after OSR.
3292 if (flow_graph_builder_->osr_id_ != Compiler::kNoOSRDeoptId) { 3333 if (flow_graph_builder_->osr_id_ != Compiler::kNoOSRDeoptId) {
3293 graph_entry->RelinkToOsrEntry(Z, flow_graph_builder_->next_block_id_); 3334 graph_entry->RelinkToOsrEntry(Z, flow_graph_builder_->next_block_id_);
3294 } 3335 }
3295 return new (Z) FlowGraph(*parsed_function(), graph_entry, 3336 return new (Z) FlowGraph(*parsed_function(), graph_entry,
3296 flow_graph_builder_->next_block_id_ - 1); 3337 flow_graph_builder_->next_block_id_ - 1);
3297 } 3338 }
3298 3339
3299 FlowGraph* StreamingFlowGraphBuilder::BuildGraph(intptr_t kernel_offset) { 3340 FlowGraph* StreamingFlowGraphBuilder::BuildGraph(intptr_t kernel_offset) {
3300 const Function& function = parsed_function()->function(); 3341 const Function& function = parsed_function()->function();
3342 TypedData& kernel_data = TypedData::Handle(Z, function.kernel_data());
3343 if (kernel_data.IsNull() && kernel_offset > 0) {
3344 UNREACHABLE();
3345 }
3301 3346
3302 // Setup a [ActiveClassScope] and a [ActiveMemberScope] which will be used 3347 // Setup a [ActiveClassScope] and a [ActiveMemberScope] which will be used
3303 // e.g. for type translation. 3348 // e.g. for type translation.
3304 const dart::Class& klass = 3349 const dart::Class& klass =
3305 dart::Class::Handle(zone_, parsed_function()->function().Owner()); 3350 dart::Class::Handle(zone_, parsed_function()->function().Owner());
3306 3351
3307 Function& outermost_function = Function::Handle(Z); 3352 Function& outermost_function = Function::Handle(Z);
3308 DiscoverEnclosingElements(Z, function, &outermost_function); 3353 DiscoverEnclosingElements(Z, function, &outermost_function);
3309 3354
3310 ActiveClassScope active_class_scope(active_class(), &klass); 3355 ActiveClassScope active_class_scope(active_class(), &klass);
(...skipping 14 matching lines...) Expand all
3325 case RawFunction::kConvertedClosureFunction: 3370 case RawFunction::kConvertedClosureFunction:
3326 case RawFunction::kRegularFunction: 3371 case RawFunction::kRegularFunction:
3327 case RawFunction::kGetterFunction: 3372 case RawFunction::kGetterFunction:
3328 case RawFunction::kSetterFunction: { 3373 case RawFunction::kSetterFunction: {
3329 ReadUntilFunctionNode(); // read until function node. 3374 ReadUntilFunctionNode(); // read until function node.
3330 if (function.IsImplicitClosureFunction()) { 3375 if (function.IsImplicitClosureFunction()) {
3331 return BuildGraphOfImplicitClosureFunction(function); 3376 return BuildGraphOfImplicitClosureFunction(function);
3332 } else if (function.IsConvertedClosureFunction()) { 3377 } else if (function.IsConvertedClosureFunction()) {
3333 return BuildGraphOfConvertedClosureFunction(function); 3378 return BuildGraphOfConvertedClosureFunction(function);
3334 } 3379 }
3335 return BuildGraphOfFunction(); 3380 return BuildGraphOfFunction(false);
3336 } 3381 }
3337 case RawFunction::kConstructor: { 3382 case RawFunction::kConstructor: {
3338 bool is_factory = function.IsFactory(); 3383 ReadUntilFunctionNode(); // read until function node.
3339 if (is_factory) { 3384 return BuildGraphOfFunction(!function.IsFactory());
3340 ReadUntilFunctionNode(); // read until function node.
3341 return BuildGraphOfFunction();
3342 } else {
3343 // Constructor: Pass offset to parent class.
3344 return BuildGraphOfFunction(
3345 ReadUntilFunctionNode()); // read until function node.
3346 }
3347 } 3385 }
3348 case RawFunction::kImplicitGetter: 3386 case RawFunction::kImplicitGetter:
3349 case RawFunction::kImplicitStaticFinalGetter: 3387 case RawFunction::kImplicitStaticFinalGetter:
3350 case RawFunction::kImplicitSetter: { 3388 case RawFunction::kImplicitSetter: {
3351 return IsStaticInitializer(function, Z) 3389 return IsStaticInitializer(function, Z)
3352 ? BuildGraphOfStaticFieldInitializer() 3390 ? BuildGraphOfStaticFieldInitializer()
3353 : BuildGraphOfFieldAccessor(scopes()->setter_value); 3391 : BuildGraphOfFieldAccessor(scopes()->setter_value);
3354 } 3392 }
3355 case RawFunction::kMethodExtractor: 3393 case RawFunction::kMethodExtractor:
3356 return flow_graph_builder_->BuildGraphOfMethodExtractor(function); 3394 return flow_graph_builder_->BuildGraphOfMethodExtractor(function);
(...skipping 1279 matching lines...) Expand 10 before | Expand all | Expand 10 after
4636 if (*negate) { 4674 if (*negate) {
4637 SkipBytes(1); // Skip Not tag, thus go directly to the inner expression. 4675 SkipBytes(1); // Skip Not tag, thus go directly to the inner expression.
4638 } 4676 }
4639 Fragment instructions = BuildExpression(); // read expression. 4677 Fragment instructions = BuildExpression(); // read expression.
4640 instructions += CheckBooleanInCheckedMode(); 4678 instructions += CheckBooleanInCheckedMode();
4641 return instructions; 4679 return instructions;
4642 } 4680 }
4643 4681
4644 const TypeArguments& StreamingFlowGraphBuilder::BuildTypeArguments() { 4682 const TypeArguments& StreamingFlowGraphBuilder::BuildTypeArguments() {
4645 ReadUInt(); // read arguments count. 4683 ReadUInt(); // read arguments count.
4646 intptr_t types_count = ReadListLength(); // read type count. 4684 intptr_t type_count = ReadListLength(); // read type count.
4647 return T.BuildTypeArguments(types_count); // read types. 4685 return T.BuildTypeArguments(type_count); // read types.
4648 } 4686 }
4649 4687
4650 Fragment StreamingFlowGraphBuilder::BuildArguments(Array* argument_names, 4688 Fragment StreamingFlowGraphBuilder::BuildArguments(Array* argument_names,
4651 intptr_t* argument_count, 4689 intptr_t* argument_count,
4652 bool skip_push_arguments, 4690 bool skip_push_arguments,
4653 bool do_drop) { 4691 bool do_drop) {
4654 intptr_t dummy; 4692 intptr_t dummy;
4655 if (argument_count == NULL) argument_count = &dummy; 4693 if (argument_count == NULL) argument_count = &dummy;
4656 *argument_count = ReadUInt(); // read arguments count. 4694 *argument_count = ReadUInt(); // read arguments count.
4657 4695
(...skipping 1008 matching lines...) Expand 10 before | Expand all | Expand 10 after
5666 const dart::Class& map_class = 5704 const dart::Class& map_class =
5667 dart::Class::Handle(Z, dart::Library::LookupCoreClass(Symbols::Map())); 5705 dart::Class::Handle(Z, dart::Library::LookupCoreClass(Symbols::Map()));
5668 const Function& factory_method = Function::ZoneHandle( 5706 const Function& factory_method = Function::ZoneHandle(
5669 Z, map_class.LookupFactory( 5707 Z, map_class.LookupFactory(
5670 dart::Library::PrivateCoreLibName(Symbols::MapLiteralFactory()))); 5708 dart::Library::PrivateCoreLibName(Symbols::MapLiteralFactory())));
5671 5709
5672 return instructions + StaticCall(position, factory_method, 2); 5710 return instructions + StaticCall(position, factory_method, 2);
5673 } 5711 }
5674 5712
5675 Fragment StreamingFlowGraphBuilder::BuildFunctionExpression() { 5713 Fragment StreamingFlowGraphBuilder::BuildFunctionExpression() {
5676 intptr_t offset = ReaderOffset() - 1; // -1 to include tag byte. 5714 return BuildFunctionNode(TokenPosition::kNoSource, StringIndex());
5677 return BuildFunctionNode(offset, TokenPosition::kNoSource, false, -1);
5678 } 5715 }
5679 5716
5680 Fragment StreamingFlowGraphBuilder::BuildLet(TokenPosition* position) { 5717 Fragment StreamingFlowGraphBuilder::BuildLet(TokenPosition* position) {
5681 if (position != NULL) *position = TokenPosition::kNoSource; 5718 if (position != NULL) *position = TokenPosition::kNoSource;
5682 5719
5683 Fragment instructions = BuildVariableDeclaration(); // read variable. 5720 Fragment instructions = BuildVariableDeclaration(); // read variable.
5684 instructions += BuildExpression(); // read body. 5721 instructions += BuildExpression(); // read body.
5685 return instructions; 5722 return instructions;
5686 } 5723 }
5687 5724
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
5841 Fragment instructions = BuildExpression(); // read expression. 5878 Fragment instructions = BuildExpression(); // read expression.
5842 instructions += Drop(); 5879 instructions += Drop();
5843 return instructions; 5880 return instructions;
5844 } 5881 }
5845 5882
5846 Fragment StreamingFlowGraphBuilder::BuildBlock() { 5883 Fragment StreamingFlowGraphBuilder::BuildBlock() {
5847 intptr_t offset = ReaderOffset() - 1; // Include the tag. 5884 intptr_t offset = ReaderOffset() - 1; // Include the tag.
5848 5885
5849 Fragment instructions; 5886 Fragment instructions;
5850 5887
5851 instructions += EnterScope(offset); 5888 instructions += EnterScope(offset + relative_kernel_offset_);
5852 intptr_t list_length = ReadListLength(); // read number of statements. 5889 intptr_t list_length = ReadListLength(); // read number of statements.
5853 for (intptr_t i = 0; i < list_length; ++i) { 5890 for (intptr_t i = 0; i < list_length; ++i) {
5854 if (instructions.is_open()) { 5891 if (instructions.is_open()) {
5855 instructions += BuildStatement(); // read ith statement. 5892 instructions += BuildStatement(); // read ith statement.
5856 } else { 5893 } else {
5857 SkipStatement(); // read ith statement. 5894 SkipStatement(); // read ith statement.
5858 } 5895 }
5859 } 5896 }
5860 instructions += ExitScope(offset); 5897 instructions += ExitScope(offset + relative_kernel_offset_);
5861 5898
5862 return instructions; 5899 return instructions;
5863 } 5900 }
5864 5901
5865 Fragment StreamingFlowGraphBuilder::BuildEmptyStatement() { 5902 Fragment StreamingFlowGraphBuilder::BuildEmptyStatement() {
5866 return Fragment(); 5903 return Fragment();
5867 } 5904 }
5868 5905
5869 Fragment StreamingFlowGraphBuilder::BuildAssertStatement() { 5906 Fragment StreamingFlowGraphBuilder::BuildAssertStatement() {
5870 if (!I->asserts()) { 5907 if (!I->asserts()) {
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after
6028 } 6065 }
6029 6066
6030 Fragment StreamingFlowGraphBuilder::BuildForStatement() { 6067 Fragment StreamingFlowGraphBuilder::BuildForStatement() {
6031 intptr_t offset = ReaderOffset() - 1; // Include the tag. 6068 intptr_t offset = ReaderOffset() - 1; // Include the tag.
6032 6069
6033 ReadPosition(); // read position. 6070 ReadPosition(); // read position.
6034 6071
6035 Fragment declarations; 6072 Fragment declarations;
6036 6073
6037 bool new_context = false; 6074 bool new_context = false;
6038 declarations += EnterScope(offset, &new_context); 6075 declarations += EnterScope(offset + relative_kernel_offset_, &new_context);
6039 6076
6040 intptr_t list_length = ReadListLength(); // read number of variables. 6077 intptr_t list_length = ReadListLength(); // read number of variables.
6041 for (intptr_t i = 0; i < list_length; ++i) { 6078 for (intptr_t i = 0; i < list_length; ++i) {
6042 declarations += BuildVariableDeclaration(); // read ith variable. 6079 declarations += BuildVariableDeclaration(); // read ith variable.
6043 } 6080 }
6044 6081
6045 loop_depth_inc(); 6082 loop_depth_inc();
6046 bool negate = false; 6083 bool negate = false;
6047 Tag tag = ReadTag(); // Read first part of condition. 6084 Tag tag = ReadTag(); // Read first part of condition.
6048 Fragment condition = 6085 Fragment condition =
(...skipping 29 matching lines...) Expand all
6078 Fragment loop(join); 6115 Fragment loop(join);
6079 loop += CheckStackOverflow(); 6116 loop += CheckStackOverflow();
6080 loop += condition; 6117 loop += condition;
6081 } else { 6118 } else {
6082 declarations += condition; 6119 declarations += condition;
6083 } 6120 }
6084 6121
6085 Fragment loop(declarations.entry, loop_exit); 6122 Fragment loop(declarations.entry, loop_exit);
6086 loop_depth_dec(); 6123 loop_depth_dec();
6087 6124
6088 loop += ExitScope(offset); 6125 loop += ExitScope(offset + relative_kernel_offset_);
6089 6126
6090 return loop; 6127 return loop;
6091 } 6128 }
6092 6129
6093 Fragment StreamingFlowGraphBuilder::BuildForInStatement(bool async) { 6130 Fragment StreamingFlowGraphBuilder::BuildForInStatement(bool async) {
6094 intptr_t offset = ReaderOffset() - 1; // Include the tag. 6131 intptr_t offset = ReaderOffset() - 1; // Include the tag.
6095 6132
6096 ReadPosition(); // read position. 6133 ReadPosition(); // read position.
6097 TokenPosition body_position = ReadPosition(); // read body position. 6134 TokenPosition body_position = ReadPosition(); // read body position.
6098 intptr_t variable_kernel_position = ReaderOffset(); 6135 intptr_t variable_kernel_position = ReaderOffset() + relative_kernel_offset_;
6099 SkipVariableDeclaration(); // read variable. 6136 SkipVariableDeclaration(); // read variable.
6100 6137
6101 TokenPosition iterable_position = TokenPosition::kNoSource; 6138 TokenPosition iterable_position = TokenPosition::kNoSource;
6102 Fragment instructions = 6139 Fragment instructions =
6103 BuildExpression(&iterable_position); // read iterable. 6140 BuildExpression(&iterable_position); // read iterable.
6104 instructions += PushArgument(); 6141 instructions += PushArgument();
6105 6142
6106 const dart::String& iterator_getter = dart::String::ZoneHandle( 6143 const dart::String& iterator_getter = dart::String::ZoneHandle(
6107 Z, dart::Field::GetterSymbol(Symbols::Iterator())); 6144 Z, dart::Field::GetterSymbol(Symbols::Iterator()));
6108 instructions += 6145 instructions +=
6109 InstanceCall(iterable_position, iterator_getter, Token::kGET, 1); 6146 InstanceCall(iterable_position, iterator_getter, Token::kGET, 1);
6110 LocalVariable* iterator = scopes()->iterator_variables[for_in_depth()]; 6147 LocalVariable* iterator = scopes()->iterator_variables[for_in_depth()];
6111 instructions += StoreLocal(TokenPosition::kNoSource, iterator); 6148 instructions += StoreLocal(TokenPosition::kNoSource, iterator);
6112 instructions += Drop(); 6149 instructions += Drop();
6113 6150
6114 for_in_depth_inc(); 6151 for_in_depth_inc();
6115 loop_depth_inc(); 6152 loop_depth_inc();
6116 Fragment condition = LoadLocal(iterator); 6153 Fragment condition = LoadLocal(iterator);
6117 condition += PushArgument(); 6154 condition += PushArgument();
6118 condition += 6155 condition +=
6119 InstanceCall(iterable_position, Symbols::MoveNext(), Token::kILLEGAL, 1); 6156 InstanceCall(iterable_position, Symbols::MoveNext(), Token::kILLEGAL, 1);
6120 TargetEntryInstr* body_entry; 6157 TargetEntryInstr* body_entry;
6121 TargetEntryInstr* loop_exit; 6158 TargetEntryInstr* loop_exit;
6122 condition += BranchIfTrue(&body_entry, &loop_exit, false); 6159 condition += BranchIfTrue(&body_entry, &loop_exit, false);
6123 6160
6124 Fragment body(body_entry); 6161 Fragment body(body_entry);
6125 body += EnterScope(offset); 6162 body += EnterScope(offset + relative_kernel_offset_);
6126 body += LoadLocal(iterator); 6163 body += LoadLocal(iterator);
6127 body += PushArgument(); 6164 body += PushArgument();
6128 const dart::String& current_getter = dart::String::ZoneHandle( 6165 const dart::String& current_getter = dart::String::ZoneHandle(
6129 Z, dart::Field::GetterSymbol(Symbols::Current())); 6166 Z, dart::Field::GetterSymbol(Symbols::Current()));
6130 body += InstanceCall(body_position, current_getter, Token::kGET, 1); 6167 body += InstanceCall(body_position, current_getter, Token::kGET, 1);
6131 body += StoreLocal(TokenPosition::kNoSource, 6168 body += StoreLocal(TokenPosition::kNoSource,
6132 LookupVariable(variable_kernel_position)); 6169 LookupVariable(variable_kernel_position));
6133 body += Drop(); 6170 body += Drop();
6134 body += BuildStatement(); // read body. 6171 body += BuildStatement(); // read body.
6135 body += ExitScope(offset); 6172 body += ExitScope(offset + relative_kernel_offset_);
6136 6173
6137 if (body.is_open()) { 6174 if (body.is_open()) {
6138 JoinEntryInstr* join = BuildJoinEntry(); 6175 JoinEntryInstr* join = BuildJoinEntry();
6139 instructions += Goto(join); 6176 instructions += Goto(join);
6140 body += Goto(join); 6177 body += Goto(join);
6141 6178
6142 Fragment loop(join); 6179 Fragment loop(join);
6143 loop += CheckStackOverflow(); 6180 loop += CheckStackOverflow();
6144 loop += condition; 6181 loop += condition;
6145 } else { 6182 } else {
(...skipping 320 matching lines...) Expand 10 before | Expand all | Expand 10 after
6466 Tag tag = PeekTag(); // peek guard type. 6503 Tag tag = PeekTag(); // peek guard type.
6467 AbstractType* type_guard = NULL; 6504 AbstractType* type_guard = NULL;
6468 if (tag != kDynamicType) { 6505 if (tag != kDynamicType) {
6469 type_guard = &T.BuildType(); // read guard. 6506 type_guard = &T.BuildType(); // read guard.
6470 handler_types.SetAt(i, *type_guard); 6507 handler_types.SetAt(i, *type_guard);
6471 } else { 6508 } else {
6472 SkipDartType(); // read guard. 6509 SkipDartType(); // read guard.
6473 handler_types.SetAt(i, Object::dynamic_type()); 6510 handler_types.SetAt(i, Object::dynamic_type());
6474 } 6511 }
6475 6512
6476 Fragment catch_handler_body = EnterScope(catch_offset); 6513 Fragment catch_handler_body =
6514 EnterScope(catch_offset + relative_kernel_offset_);
6477 6515
6478 tag = ReadTag(); // read first part of exception. 6516 tag = ReadTag(); // read first part of exception.
6479 if (tag == kSomething) { 6517 if (tag == kSomething) {
6480 catch_handler_body += LoadLocal(CurrentException()); 6518 catch_handler_body += LoadLocal(CurrentException());
6481 catch_handler_body += 6519 catch_handler_body +=
6482 StoreLocal(TokenPosition::kNoSource, LookupVariable(ReaderOffset())); 6520 StoreLocal(TokenPosition::kNoSource,
6521 LookupVariable(ReaderOffset() + relative_kernel_offset_));
6483 catch_handler_body += Drop(); 6522 catch_handler_body += Drop();
6484 SkipVariableDeclaration(); // read exception. 6523 SkipVariableDeclaration(); // read exception.
6485 } 6524 }
6486 6525
6487 tag = ReadTag(); // read first part of stack trace. 6526 tag = ReadTag(); // read first part of stack trace.
6488 if (tag == kSomething) { 6527 if (tag == kSomething) {
6489 catch_handler_body += LoadLocal(CurrentStackTrace()); 6528 catch_handler_body += LoadLocal(CurrentStackTrace());
6490 catch_handler_body += 6529 catch_handler_body +=
6491 StoreLocal(TokenPosition::kNoSource, LookupVariable(ReaderOffset())); 6530 StoreLocal(TokenPosition::kNoSource,
6531 LookupVariable(ReaderOffset() + relative_kernel_offset_));
6492 catch_handler_body += Drop(); 6532 catch_handler_body += Drop();
6493 SkipVariableDeclaration(); // read stack trace. 6533 SkipVariableDeclaration(); // read stack trace.
6494 } 6534 }
6495 6535
6496 { 6536 {
6497 CatchBlock block(flow_graph_builder_, CurrentException(), 6537 CatchBlock block(flow_graph_builder_, CurrentException(),
6498 CurrentStackTrace(), try_handler_index); 6538 CurrentStackTrace(), try_handler_index);
6499 6539
6500 catch_handler_body += BuildStatement(); // read body. 6540 catch_handler_body += BuildStatement(); // read body.
6501 6541
6502 // Note: ExitScope adjusts context_depth_ so even if catch_handler_body 6542 // Note: ExitScope adjusts context_depth_ so even if catch_handler_body
6503 // is closed we still need to execute ExitScope for its side effect. 6543 // is closed we still need to execute ExitScope for its side effect.
6504 catch_handler_body += ExitScope(catch_offset); 6544 catch_handler_body += ExitScope(catch_offset + relative_kernel_offset_);
6505 if (catch_handler_body.is_open()) { 6545 if (catch_handler_body.is_open()) {
6506 catch_handler_body += Goto(after_try); 6546 catch_handler_body += Goto(after_try);
6507 } 6547 }
6508 } 6548 }
6509 6549
6510 if (type_guard != NULL) { 6550 if (type_guard != NULL) {
6511 if (type_guard->IsMalformed()) { 6551 if (type_guard->IsMalformed()) {
6512 catch_body += ThrowTypeError(); 6552 catch_body += ThrowTypeError();
6513 catch_body += Drop(); 6553 catch_body += Drop();
6514 } else { 6554 } else {
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after
6718 rethrow += RethrowException(position, CatchClauseNode::kInvalidTryIndex); 6758 rethrow += RethrowException(position, CatchClauseNode::kInvalidTryIndex);
6719 Drop(); 6759 Drop();
6720 6760
6721 continuation = Fragment(continuation.entry, no_error); 6761 continuation = Fragment(continuation.entry, no_error);
6722 } 6762 }
6723 6763
6724 return continuation; 6764 return continuation;
6725 } 6765 }
6726 6766
6727 Fragment StreamingFlowGraphBuilder::BuildVariableDeclaration() { 6767 Fragment StreamingFlowGraphBuilder::BuildVariableDeclaration() {
6728 intptr_t kernel_position_no_tag = ReaderOffset(); 6768 intptr_t kernel_position_no_tag = ReaderOffset() + relative_kernel_offset_;
6729 LocalVariable* variable = LookupVariable(kernel_position_no_tag); 6769 LocalVariable* variable = LookupVariable(kernel_position_no_tag);
6730 6770
6731 VariableDeclarationHelper helper(this); 6771 VariableDeclarationHelper helper(this);
6732 helper.ReadUntilExcluding(VariableDeclarationHelper::kType); 6772 helper.ReadUntilExcluding(VariableDeclarationHelper::kType);
6733 dart::String& name = H.DartSymbol(helper.name_index_); 6773 dart::String& name = H.DartSymbol(helper.name_index_);
6734 AbstractType& type = T.BuildType(); // read type. 6774 AbstractType& type = T.BuildType(); // read type.
6735 Tag tag = ReadTag(); // read (first part of) initializer. 6775 Tag tag = ReadTag(); // read (first part of) initializer.
6736 6776
6737 Fragment instructions; 6777 Fragment instructions;
6738 if (tag == kNothing) { 6778 if (tag == kNothing) {
(...skipping 18 matching lines...) Expand all
6757 Utils::Maximum(helper.position_, helper.equals_position_); 6797 Utils::Maximum(helper.position_, helper.equals_position_);
6758 if (NeedsDebugStepCheck(stack(), debug_position)) { 6798 if (NeedsDebugStepCheck(stack(), debug_position)) {
6759 instructions = DebugStepCheck(debug_position) + instructions; 6799 instructions = DebugStepCheck(debug_position) + instructions;
6760 } 6800 }
6761 instructions += StoreLocal(helper.position_, variable); 6801 instructions += StoreLocal(helper.position_, variable);
6762 instructions += Drop(); 6802 instructions += Drop();
6763 return instructions; 6803 return instructions;
6764 } 6804 }
6765 6805
6766 Fragment StreamingFlowGraphBuilder::BuildFunctionDeclaration() { 6806 Fragment StreamingFlowGraphBuilder::BuildFunctionDeclaration() {
6767 intptr_t offset = ReaderOffset() - 1; // -1 to include tag byte.
6768 TokenPosition position = ReadPosition(); // read position. 6807 TokenPosition position = ReadPosition(); // read position.
6769 intptr_t variable_offeset = ReaderOffset(); 6808 intptr_t variable_offset = ReaderOffset() + relative_kernel_offset_;
6770 SkipVariableDeclaration(); // read variable declaration. 6809
6810 // read variable declaration.
6811 VariableDeclarationHelper helper(this);
6812 helper.ReadUntilExcluding(VariableDeclarationHelper::kEnd);
6771 6813
6772 Fragment instructions = DebugStepCheck(position); 6814 Fragment instructions = DebugStepCheck(position);
6773 instructions += BuildFunctionNode(offset, position, true, variable_offeset); 6815 instructions += BuildFunctionNode(position, helper.name_index_);
6774 instructions += StoreLocal(position, LookupVariable(variable_offeset)); 6816 instructions += StoreLocal(position, LookupVariable(variable_offset));
6775 instructions += Drop(); 6817 instructions += Drop();
6776 return instructions; 6818 return instructions;
6777 } 6819 }
6778 6820
6779 Fragment StreamingFlowGraphBuilder::BuildFunctionNode( 6821 Fragment StreamingFlowGraphBuilder::BuildFunctionNode(
6780 intptr_t parent_kernel_offset,
6781 TokenPosition parent_position, 6822 TokenPosition parent_position,
6782 bool declaration, 6823 StringIndex name_index) {
6783 intptr_t variable_offeset) { 6824 intptr_t offset = ReaderOffset() + relative_kernel_offset_;
6784 intptr_t offset = ReaderOffset();
6785 6825
6786 FunctionNodeHelper function_node_helper(this); 6826 FunctionNodeHelper function_node_helper(this);
6787 function_node_helper.ReadUntilExcluding( 6827 function_node_helper.ReadUntilExcluding(
6788 FunctionNodeHelper::kTotalParameterCount); 6828 FunctionNodeHelper::kTotalParameterCount);
6789 TokenPosition position = function_node_helper.position_; 6829 TokenPosition position = function_node_helper.position_;
6790 6830
6831 bool declaration = name_index >= 0;
6832
6791 if (declaration) { 6833 if (declaration) {
6792 position = parent_position; 6834 position = parent_position;
6793 } 6835 }
6794 if (!position.IsReal()) { 6836 if (!position.IsReal()) {
6795 // Positions has to be unique in regards to the parent. 6837 // Positions has to be unique in regards to the parent.
6796 // A non-real at this point is probably -1, we cannot blindly use that 6838 // A non-real at this point is probably -1, we cannot blindly use that
6797 // as others might use it too. Create a new dummy non-real TokenPosition. 6839 // as others might use it too. Create a new dummy non-real TokenPosition.
6798 position = TokenPosition(offset).ToSynthetic(); 6840 position = TokenPosition(offset).ToSynthetic();
6799 } 6841 }
6800 6842
6801 // The VM has a per-isolate table of functions indexed by the enclosing 6843 // The VM has a per-isolate table of functions indexed by the enclosing
6802 // function and token position. 6844 // function and token position.
6803 Function& function = Function::ZoneHandle(Z); 6845 Function& function = Function::ZoneHandle(Z);
6804 6846
6805 // NOTE: This is not TokenPosition in the general sense! 6847 // NOTE: This is not TokenPosition in the general sense!
6806 function = I->LookupClosureFunction(parsed_function()->function(), position); 6848 function = I->LookupClosureFunction(parsed_function()->function(), position);
6807 if (function.IsNull()) { 6849 if (function.IsNull()) {
6808 for (intptr_t i = 0; i < scopes()->function_scopes.length(); ++i) { 6850 for (intptr_t i = 0; i < scopes()->function_scopes.length(); ++i) {
6809 if (scopes()->function_scopes[i].kernel_offset != offset) { 6851 if (scopes()->function_scopes[i].kernel_offset != offset) {
6810 continue; 6852 continue;
6811 } 6853 }
6812 6854
6813 const dart::String* name; 6855 const dart::String* name;
6814 if (!declaration) { 6856 if (declaration) {
6857 name = &H.DartSymbol(name_index);
6858 } else {
6815 name = &Symbols::AnonymousClosure(); 6859 name = &Symbols::AnonymousClosure();
6816 } else {
6817 name = &H.DartSymbol(GetNameFromVariableDeclaration(variable_offeset));
6818 } 6860 }
6819 // NOTE: This is not TokenPosition in the general sense! 6861 // NOTE: This is not TokenPosition in the general sense!
6820 function = Function::NewClosureFunction( 6862 function = Function::NewClosureFunction(
6821 *name, parsed_function()->function(), position); 6863 *name, parsed_function()->function(), position);
6822 6864
6823 function.set_is_debuggable(function_node_helper.dart_async_marker_ == 6865 function.set_is_debuggable(function_node_helper.dart_async_marker_ ==
6824 FunctionNode::kSync); 6866 FunctionNode::kSync);
6825 switch (function_node_helper.dart_async_marker_) { 6867 switch (function_node_helper.dart_async_marker_) {
6826 case FunctionNode::kSyncStar: 6868 case FunctionNode::kSyncStar:
6827 function.set_modifier(RawFunction::kSyncGen); 6869 function.set_modifier(RawFunction::kSyncGen);
(...skipping 19 matching lines...) Expand all
6847 function.set_end_token_pos(function_node_helper.end_position_); 6889 function.set_end_token_pos(function_node_helper.end_position_);
6848 LocalScope* scope = scopes()->function_scopes[i].scope; 6890 LocalScope* scope = scopes()->function_scopes[i].scope;
6849 const ContextScope& context_scope = ContextScope::Handle( 6891 const ContextScope& context_scope = ContextScope::Handle(
6850 Z, scope->PreserveOuterScope(flow_graph_builder_->context_depth_)); 6892 Z, scope->PreserveOuterScope(flow_graph_builder_->context_depth_));
6851 function.set_context_scope(context_scope); 6893 function.set_context_scope(context_scope);
6852 function.set_kernel_offset(offset); 6894 function.set_kernel_offset(offset);
6853 SetupFunctionParameters(dart::Class::Handle(Z), function, 6895 SetupFunctionParameters(dart::Class::Handle(Z), function,
6854 false, // is_method 6896 false, // is_method
6855 true, // is_closure 6897 true, // is_closure
6856 &function_node_helper); 6898 &function_node_helper);
6899 function_node_helper.ReadUntilExcluding(FunctionNodeHelper::kEnd);
6900 TypedData& kernel_data = reader_->CopyDataToVMHeap(
6901 Z, offset - relative_kernel_offset_, ReaderOffset());
6902 function.set_kernel_data(kernel_data);
6857 6903
6858 // Finalize function type. 6904 // Finalize function type.
6859 Type& signature_type = Type::Handle(Z, function.SignatureType()); 6905 Type& signature_type = Type::Handle(Z, function.SignatureType());
6860 signature_type ^= 6906 signature_type ^=
6861 ClassFinalizer::FinalizeType(*active_class()->klass, signature_type); 6907 ClassFinalizer::FinalizeType(*active_class()->klass, signature_type);
6862 function.SetSignatureType(signature_type); 6908 function.SetSignatureType(signature_type);
6863 6909
6864 I->AddClosureFunction(function); 6910 I->AddClosureFunction(function);
6865 break; 6911 break;
6866 } 6912 }
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
6911 bool is_factory = function.IsFactory(); 6957 bool is_factory = function.IsFactory();
6912 intptr_t extra_parameters = (is_method || is_closure || is_factory) ? 1 : 0; 6958 intptr_t extra_parameters = (is_method || is_closure || is_factory) ? 1 : 0;
6913 6959
6914 function_node_helper->ReadUntilExcluding( 6960 function_node_helper->ReadUntilExcluding(
6915 FunctionNodeHelper::kPositionalParameters); 6961 FunctionNodeHelper::kPositionalParameters);
6916 6962
6917 intptr_t required_parameter_count = 6963 intptr_t required_parameter_count =
6918 function_node_helper->required_parameter_count_; 6964 function_node_helper->required_parameter_count_;
6919 intptr_t total_parameter_count = function_node_helper->total_parameter_count_; 6965 intptr_t total_parameter_count = function_node_helper->total_parameter_count_;
6920 6966
6921 intptr_t positional_parameters_count = ReadListLength(); // read list length. 6967 intptr_t positional_parameter_count = ReadListLength(); // read list length.
6922 6968
6923 intptr_t named_parameters_count = 6969 intptr_t named_parameter_count =
6924 total_parameter_count - positional_parameters_count; 6970 total_parameter_count - positional_parameter_count;
6925 6971
6926 function.set_num_fixed_parameters(extra_parameters + 6972 function.set_num_fixed_parameters(extra_parameters +
6927 required_parameter_count); 6973 required_parameter_count);
6928 if (named_parameters_count > 0) { 6974 if (named_parameter_count > 0) {
6929 function.SetNumOptionalParameters(named_parameters_count, false); 6975 function.SetNumOptionalParameters(named_parameter_count, false);
6930 } else { 6976 } else {
6931 function.SetNumOptionalParameters( 6977 function.SetNumOptionalParameters(
6932 positional_parameters_count - required_parameter_count, true); 6978 positional_parameter_count - required_parameter_count, true);
6933 } 6979 }
6934 intptr_t parameter_count = extra_parameters + total_parameter_count; 6980 intptr_t parameter_count = extra_parameters + total_parameter_count;
6935 function.set_parameter_types( 6981 function.set_parameter_types(
6936 Array::Handle(Z, Array::New(parameter_count, Heap::kOld))); 6982 Array::Handle(Z, Array::New(parameter_count, Heap::kOld)));
6937 function.set_parameter_names( 6983 function.set_parameter_names(
6938 Array::Handle(Z, Array::New(parameter_count, Heap::kOld))); 6984 Array::Handle(Z, Array::New(parameter_count, Heap::kOld)));
6939 intptr_t pos = 0; 6985 intptr_t pos = 0;
6940 if (is_method) { 6986 if (is_method) {
6941 ASSERT(!klass.IsNull()); 6987 ASSERT(!klass.IsNull());
6942 function.SetParameterTypeAt(pos, H.GetCanonicalType(klass)); 6988 function.SetParameterTypeAt(pos, H.GetCanonicalType(klass));
6943 function.SetParameterNameAt(pos, Symbols::This()); 6989 function.SetParameterNameAt(pos, Symbols::This());
6944 pos++; 6990 pos++;
6945 } else if (is_closure) { 6991 } else if (is_closure) {
6946 function.SetParameterTypeAt(pos, AbstractType::dynamic_type()); 6992 function.SetParameterTypeAt(pos, AbstractType::dynamic_type());
6947 function.SetParameterNameAt(pos, Symbols::ClosureParameter()); 6993 function.SetParameterNameAt(pos, Symbols::ClosureParameter());
6948 pos++; 6994 pos++;
6949 } else if (is_factory) { 6995 } else if (is_factory) {
6950 function.SetParameterTypeAt(pos, AbstractType::dynamic_type()); 6996 function.SetParameterTypeAt(pos, AbstractType::dynamic_type());
6951 function.SetParameterNameAt(pos, Symbols::TypeArgumentsParameter()); 6997 function.SetParameterNameAt(pos, Symbols::TypeArgumentsParameter());
6952 pos++; 6998 pos++;
6953 } 6999 }
6954 7000
6955 for (intptr_t i = 0; i < positional_parameters_count; ++i, ++pos) { 7001 for (intptr_t i = 0; i < positional_parameter_count; ++i, ++pos) {
6956 // Read ith variable declaration. 7002 // Read ith variable declaration.
6957 VariableDeclarationHelper helper(this); 7003 VariableDeclarationHelper helper(this);
6958 helper.ReadUntilExcluding(VariableDeclarationHelper::kType); 7004 helper.ReadUntilExcluding(VariableDeclarationHelper::kType);
6959 const AbstractType& type = T.BuildTypeWithoutFinalization(); // read type. 7005 const AbstractType& type = T.BuildTypeWithoutFinalization(); // read type.
6960 Tag tag = ReadTag(); // read (first part of) initializer. 7006 Tag tag = ReadTag(); // read (first part of) initializer.
6961 if (tag == kSomething) { 7007 if (tag == kSomething) {
6962 SkipExpression(); // read (actual) initializer. 7008 SkipExpression(); // read (actual) initializer.
6963 } 7009 }
6964 7010
6965 function.SetParameterTypeAt( 7011 function.SetParameterTypeAt(
6966 pos, type.IsMalformed() ? Type::dynamic_type() : type); 7012 pos, type.IsMalformed() ? Type::dynamic_type() : type);
6967 function.SetParameterNameAt(pos, H.DartSymbol(helper.name_index_)); 7013 function.SetParameterNameAt(pos, H.DartSymbol(helper.name_index_));
6968 } 7014 }
6969 7015
6970 intptr_t named_parameters_count_check = 7016 intptr_t named_parameter_count_check = ReadListLength(); // read list length.
6971 ReadListLength(); // read list length. 7017 ASSERT(named_parameter_count_check == named_parameter_count);
6972 ASSERT(named_parameters_count_check == named_parameters_count); 7018 for (intptr_t i = 0; i < named_parameter_count; ++i, ++pos) {
6973 for (intptr_t i = 0; i < named_parameters_count; ++i, ++pos) {
6974 // Read ith variable declaration. 7019 // Read ith variable declaration.
6975 VariableDeclarationHelper helper(this); 7020 VariableDeclarationHelper helper(this);
6976 helper.ReadUntilExcluding(VariableDeclarationHelper::kType); 7021 helper.ReadUntilExcluding(VariableDeclarationHelper::kType);
6977 const AbstractType& type = T.BuildTypeWithoutFinalization(); // read type. 7022 const AbstractType& type = T.BuildTypeWithoutFinalization(); // read type.
6978 Tag tag = ReadTag(); // read (first part of) initializer. 7023 Tag tag = ReadTag(); // read (first part of) initializer.
6979 if (tag == kSomething) { 7024 if (tag == kSomething) {
6980 SkipExpression(); // read (actual) initializer. 7025 SkipExpression(); // read (actual) initializer.
6981 } 7026 }
6982 7027
6983 function.SetParameterTypeAt( 7028 function.SetParameterTypeAt(
(...skipping 15 matching lines...) Expand all
6999 7044
7000 RawObject* StreamingFlowGraphBuilder::BuildParameterDescriptor( 7045 RawObject* StreamingFlowGraphBuilder::BuildParameterDescriptor(
7001 intptr_t kernel_offset) { 7046 intptr_t kernel_offset) {
7002 SetOffset(kernel_offset); 7047 SetOffset(kernel_offset);
7003 ReadUntilFunctionNode(); // read until function node. 7048 ReadUntilFunctionNode(); // read until function node.
7004 FunctionNodeHelper function_node_helper(this); 7049 FunctionNodeHelper function_node_helper(this);
7005 function_node_helper.ReadUntilExcluding( 7050 function_node_helper.ReadUntilExcluding(
7006 FunctionNodeHelper::kPositionalParameters); 7051 FunctionNodeHelper::kPositionalParameters);
7007 intptr_t param_count = function_node_helper.total_parameter_count_; 7052 intptr_t param_count = function_node_helper.total_parameter_count_;
7008 intptr_t positional_count = ReadListLength(); // read list length. 7053 intptr_t positional_count = ReadListLength(); // read list length.
7009 intptr_t named_parameters_count = param_count - positional_count; 7054 intptr_t named_parameter_count = param_count - positional_count;
7010 7055
7011 const Array& param_descriptor = Array::Handle( 7056 const Array& param_descriptor = Array::Handle(
7012 Array::New(param_count * Parser::kParameterEntrySize, Heap::kOld)); 7057 Array::New(param_count * Parser::kParameterEntrySize, Heap::kOld));
7013 for (intptr_t i = 0; i < param_count; ++i) { 7058 for (intptr_t i = 0; i < param_count; ++i) {
7014 const intptr_t entry_start = i * Parser::kParameterEntrySize; 7059 const intptr_t entry_start = i * Parser::kParameterEntrySize;
7015 7060
7016 if (i == positional_count) { 7061 if (i == positional_count) {
7017 intptr_t named_parameters_count_check = 7062 intptr_t named_parameter_count_check =
7018 ReadListLength(); // read list length. 7063 ReadListLength(); // read list length.
7019 ASSERT(named_parameters_count_check == named_parameters_count); 7064 ASSERT(named_parameter_count_check == named_parameter_count);
7020 } 7065 }
7021 7066
7022 // Read ith variable declaration. 7067 // Read ith variable declaration.
7023 VariableDeclarationHelper helper(this); 7068 VariableDeclarationHelper helper(this);
7024 helper.ReadUntilExcluding(VariableDeclarationHelper::kInitializer); 7069 helper.ReadUntilExcluding(VariableDeclarationHelper::kInitializer);
7025 param_descriptor.SetAt(entry_start + Parser::kParameterIsFinalOffset, 7070 param_descriptor.SetAt(entry_start + Parser::kParameterIsFinalOffset,
7026 helper.IsFinal() ? Bool::True() : Bool::False()); 7071 helper.IsFinal() ? Bool::True() : Bool::False());
7027 7072
7028 Tag tag = ReadTag(); // read (first part of) initializer. 7073 Tag tag = ReadTag(); // read (first part of) initializer.
7029 if (tag == kSomething) { 7074 if (tag == kSomething) {
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
7072 Instance& value = constant_evaluator_.EvaluateExpression(ReaderOffset()); 7117 Instance& value = constant_evaluator_.EvaluateExpression(ReaderOffset());
7073 SkipExpression(); // read (actual) initializer. 7118 SkipExpression(); // read (actual) initializer.
7074 metadata_values.SetAt(i, value); 7119 metadata_values.SetAt(i, value);
7075 } 7120 }
7076 7121
7077 return metadata_values.raw(); 7122 return metadata_values.raw();
7078 } 7123 }
7079 7124
7080 void StreamingFlowGraphBuilder::CollectTokenPositionsFor( 7125 void StreamingFlowGraphBuilder::CollectTokenPositionsFor(
7081 intptr_t script_index, 7126 intptr_t script_index,
7127 intptr_t initial_script_index,
7082 GrowableArray<intptr_t>* record_token_positions_in, 7128 GrowableArray<intptr_t>* record_token_positions_in,
7083 GrowableArray<intptr_t>* record_yield_positions_in) { 7129 GrowableArray<intptr_t>* record_yield_positions_in) {
7084 record_token_positions_into_ = record_token_positions_in; 7130 record_token_positions_into_ = record_token_positions_in;
7085 record_yield_positions_into_ = record_yield_positions_in; 7131 record_yield_positions_into_ = record_yield_positions_in;
7086 record_for_script_id_ = script_index; 7132 record_for_script_id_ = script_index;
7133 current_script_id_ = initial_script_index;
7087 7134
7088 // Get offset for 1st library. 7135 const Tag tag = PeekTag();
7089 SetOffset(reader_->size() - 4); 7136 if (tag == kProcedure) {
7090 intptr_t library_count = reader_->ReadUInt32(); 7137 ProcedureHelper procedure_helper(this);
7091 7138 procedure_helper.ReadUntilExcluding(ProcedureHelper::kEnd);
7092 SetOffset(reader_->size() - 4 - 4 * library_count); 7139 } else if (tag == kConstructor) {
7093 intptr_t offset = reader_->ReadUInt32(); 7140 ConstructorHelper constructor_helper(this);
7094 7141 constructor_helper.ReadUntilExcluding(ConstructorHelper::kEnd);
7095 SetOffset(offset); 7142 } else if (tag == kFunctionNode) {
7096 for (intptr_t i = 0; i < library_count; ++i) { 7143 FunctionNodeHelper function_node_helper(this);
7097 LibraryHelper library_helper(this); 7144 function_node_helper.ReadUntilExcluding(FunctionNodeHelper::kEnd);
7098 library_helper.ReadUntilExcluding(LibraryHelper::kEnd); 7145 } else if (tag == kField) {
7146 FieldHelper field_helper(this);
7147 field_helper.ReadUntilExcluding(FieldHelper::kEnd);
7148 } else {
7149 UNREACHABLE();
7099 } 7150 }
7100 7151
7101 record_token_positions_into_ = NULL; 7152 record_token_positions_into_ = NULL;
7102 record_yield_positions_into_ = NULL; 7153 record_yield_positions_into_ = NULL;
7103 record_for_script_id_ = -1; 7154 record_for_script_id_ = -1;
7104 } 7155 }
7105 7156
7106 intptr_t StreamingFlowGraphBuilder::SourceTableSize() { 7157 intptr_t StreamingFlowGraphBuilder::SourceTableSize() {
7107 AlternativeReadingScope alt(reader_); 7158 AlternativeReadingScope alt(reader_);
7108 SetOffset(reader_->size() - 4); 7159 SetOffset(reader_->size() - 4);
(...skipping 14 matching lines...) Expand all
7123 intptr_t end = -1; 7174 intptr_t end = -1;
7124 for (intptr_t i = 0; i < size; ++i) { 7175 for (intptr_t i = 0; i < size; ++i) {
7125 intptr_t offset = ReadUInt(); 7176 intptr_t offset = ReadUInt();
7126 if (i == index - 1) { 7177 if (i == index - 1) {
7127 start = offset; 7178 start = offset;
7128 } else if (i == index) { 7179 } else if (i == index) {
7129 end = offset; 7180 end = offset;
7130 } 7181 }
7131 } 7182 }
7132 intptr_t end_offset = ReaderOffset(); 7183 intptr_t end_offset = ReaderOffset();
7133 return H.DartString(reader_->buffer() + end_offset + start, end - start, 7184 return H.DartString(
7134 Heap::kOld); 7185 reader_->CopyDataIntoZone(Z, end_offset + start, end - start),
7186 end - start, Heap::kOld);
7135 } 7187 }
7136 7188
7137 String& StreamingFlowGraphBuilder::GetSourceFor(intptr_t index) { 7189 String& StreamingFlowGraphBuilder::GetSourceFor(intptr_t index) {
7138 AlternativeReadingScope alt(reader_); 7190 AlternativeReadingScope alt(reader_);
7139 SetOffset(reader_->size() - 4); 7191 SetOffset(reader_->size() - 4);
7140 intptr_t library_count = reader_->ReadUInt32(); 7192 intptr_t library_count = reader_->ReadUInt32();
7141 SetOffset(reader_->size() - 4 - 4 * library_count - 3 * 4); 7193 SetOffset(reader_->size() - 4 - 4 * library_count - 3 * 4);
7142 SetOffset(reader_->ReadUInt32()); // read source table offset. 7194 SetOffset(reader_->ReadUInt32()); // read source table offset.
7143 intptr_t size = ReadUInt(); // read source table size. 7195 intptr_t size = ReadUInt(); // read source table size.
7144 intptr_t uris_size = 0; 7196 intptr_t uris_size = 0;
7145 for (intptr_t i = 0; i < size; ++i) { 7197 for (intptr_t i = 0; i < size; ++i) {
7146 uris_size = ReadUInt(); 7198 uris_size = ReadUInt();
7147 } 7199 }
7148 SkipBytes(uris_size); 7200 SkipBytes(uris_size);
7149 7201
7150 // Read the source code strings and line starts. 7202 // Read the source code strings and line starts.
7151 for (intptr_t i = 0; i < size; ++i) { 7203 for (intptr_t i = 0; i < size; ++i) {
7152 intptr_t length = ReadUInt(); 7204 intptr_t length = ReadUInt();
7153 if (index == i) { 7205 if (index == i) {
7154 return H.DartString(reader_->buffer() + ReaderOffset(), length, 7206 return H.DartString(reader_->CopyDataIntoZone(Z, ReaderOffset(), length),
7155 Heap::kOld); 7207 length, Heap::kOld);
7156 } 7208 }
7157 SkipBytes(length); 7209 SkipBytes(length);
7158 intptr_t line_count = ReadUInt(); 7210 intptr_t line_count = ReadUInt();
7159 for (intptr_t j = 0; j < line_count; ++j) { 7211 for (intptr_t j = 0; j < line_count; ++j) {
7160 ReadUInt(); 7212 ReadUInt();
7161 } 7213 }
7162 } 7214 }
7163 7215
7164 return String::Handle(String::null()); 7216 return String::Handle(String::null());
7165 } 7217 }
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
7201 } 7253 }
7202 } 7254 }
7203 7255
7204 return Array::Handle(Array::null()); 7256 return Array::Handle(Array::null());
7205 } 7257 }
7206 7258
7207 } // namespace kernel 7259 } // namespace kernel
7208 } // namespace dart 7260 } // namespace dart
7209 7261
7210 #endif // !defined(DART_PRECOMPILED_RUNTIME) 7262 #endif // !defined(DART_PRECOMPILED_RUNTIME)
OLDNEW
« no previous file with comments | « runtime/vm/kernel_binary_flowgraph.h ('k') | runtime/vm/kernel_reader.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698