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

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

Issue 2854393002: [kernel] [partial] Streaming of kernel binary without AST nodes (Closed)
Patch Set: Address comments; small fixes; rebased. Created 3 years, 7 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.h ('k') | runtime/vm/kernel_binary_flowgraph.h » ('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 #if !defined(DART_PRECOMPILED_RUNTIME) 4 #if !defined(DART_PRECOMPILED_RUNTIME)
5 5
6 #include "vm/kernel_binary.h" 6 #include "vm/kernel_binary.h"
7 #include "platform/globals.h" 7 #include "platform/globals.h"
8 #include "vm/flags.h" 8 #include "vm/flags.h"
9 #include "vm/growable_array.h" 9 #include "vm/growable_array.h"
10 #include "vm/kernel.h" 10 #include "vm/kernel.h"
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after
194 classes().EnsureInitialized(num_classes); 194 classes().EnsureInitialized(num_classes);
195 for (intptr_t i = 0; i < num_classes; i++) { 195 for (intptr_t i = 0; i < num_classes; i++) {
196 Tag tag = reader->ReadTag(); 196 Tag tag = reader->ReadTag();
197 ASSERT(tag == kClass); 197 ASSERT(tag == kClass);
198 NormalClass* klass = classes().GetOrCreate<NormalClass>(i, this); 198 NormalClass* klass = classes().GetOrCreate<NormalClass>(i, this);
199 klass->ReadFrom(reader); 199 klass->ReadFrom(reader);
200 } 200 }
201 201
202 fields().ReadFrom<Field>(reader, this); 202 fields().ReadFrom<Field>(reader, this);
203 procedures().ReadFrom<Procedure>(reader, this); 203 procedures().ReadFrom<Procedure>(reader, this);
204
205 can_stream_ =
206 classes().CanStream() && fields().CanStream() && procedures().CanStream();
207
204 return this; 208 return this;
205 } 209 }
206 210
207 211
208 Typedef* Typedef::ReadFrom(Reader* reader) { 212 Typedef* Typedef::ReadFrom(Reader* reader) {
209 TRACE_READ_OFFSET(); 213 TRACE_READ_OFFSET();
210 214
211 canonical_name_ = reader->ReadCanonicalNameReference(); 215 canonical_name_ = reader->ReadCanonicalNameReference();
212 position_ = reader->ReadPosition(false); 216 position_ = reader->ReadPosition(false);
213 name_index_ = StringIndex(reader->ReadUInt()); 217 name_index_ = StringIndex(reader->ReadUInt());
(...skipping 10 matching lines...) Expand all
224 228
225 canonical_name_ = reader->ReadCanonicalNameReference(); 229 canonical_name_ = reader->ReadCanonicalNameReference();
226 position_ = reader->ReadPosition(false); 230 position_ = reader->ReadPosition(false);
227 is_abstract_ = reader->ReadBool(); 231 is_abstract_ = reader->ReadBool();
228 name_index_ = StringIndex(reader->ReadUInt()); 232 name_index_ = StringIndex(reader->ReadUInt());
229 source_uri_index_ = reader->ReadUInt(); 233 source_uri_index_ = reader->ReadUInt();
230 reader->set_current_script_id(source_uri_index_); 234 reader->set_current_script_id(source_uri_index_);
231 reader->record_token_position(position_); 235 reader->record_token_position(position_);
232 annotations_.ReadFromStatic<Expression>(reader); 236 annotations_.ReadFromStatic<Expression>(reader);
233 237
238 can_stream_ = annotations_.CanStream();
239
234 return this; 240 return this;
235 } 241 }
236 242
237 243
238 NormalClass* NormalClass::ReadFrom(Reader* reader) { 244 NormalClass* NormalClass::ReadFrom(Reader* reader) {
239 TRACE_READ_OFFSET(); 245 TRACE_READ_OFFSET();
240 Class::ReadFrom(reader); 246 Class::ReadFrom(reader);
241 TypeParameterScope<ReaderHelper> scope(reader->helper()); 247 TypeParameterScope<ReaderHelper> scope(reader->helper());
242 248
243 type_parameters_.ReadFrom(reader); 249 type_parameters_.ReadFrom(reader);
244 DartType* type = reader->ReadOptional<DartType>(); 250 DartType* type = reader->ReadOptional<DartType>();
245 251
246 super_class_ = InterfaceType::Cast(type); 252 super_class_ = InterfaceType::Cast(type);
247 reader->ReadOptional<DartType>(); // Mixed-in type is unused. 253 reader->ReadOptional<DartType>(); // Mixed-in type is unused.
248 implemented_classes_.ReadFromStatic<DowncastReader<DartType, InterfaceType> >( 254 implemented_classes_.ReadFromStatic<DowncastReader<DartType, InterfaceType> >(
249 reader); 255 reader);
250 fields_.ReadFrom<Field>(reader, this); 256 fields_.ReadFrom<Field>(reader, this);
251 constructors_.ReadFrom<Constructor>(reader, this); 257 constructors_.ReadFrom<Constructor>(reader, this);
252 procedures_.ReadFrom<Procedure>(reader, this); 258 procedures_.ReadFrom<Procedure>(reader, this);
253 259
260 can_stream_ = can_stream_ && fields_.CanStream() &&
261 constructors_.CanStream() && procedures_.CanStream();
262
254 return this; 263 return this;
255 } 264 }
256 265
257 266
258 MixinClass* MixinClass::ReadFrom(Reader* reader) { 267 MixinClass* MixinClass::ReadFrom(Reader* reader) {
259 TRACE_READ_OFFSET(); 268 TRACE_READ_OFFSET();
260 TypeParameterScope<ReaderHelper> scope(reader->helper()); 269 TypeParameterScope<ReaderHelper> scope(reader->helper());
261 270
262 Class::ReadFrom(reader); 271 Class::ReadFrom(reader);
263 type_parameters_.ReadFrom(reader); 272 type_parameters_.ReadFrom(reader);
264 first_ = InterfaceType::Cast(DartType::ReadFrom(reader)); 273 first_ = InterfaceType::Cast(DartType::ReadFrom(reader));
265 second_ = InterfaceType::Cast(DartType::ReadFrom(reader)); 274 second_ = InterfaceType::Cast(DartType::ReadFrom(reader));
266 implemented_classes_.ReadFromStatic<DowncastReader<DartType, InterfaceType> >( 275 implemented_classes_.ReadFromStatic<DowncastReader<DartType, InterfaceType> >(
267 reader); 276 reader);
268 constructors_.ReadFrom<Constructor>(reader, this); 277 constructors_.ReadFrom<Constructor>(reader, this);
278
279 can_stream_ = constructors_.CanStream();
280
269 return this; 281 return this;
270 } 282 }
271 283
272 284
273 NameIndex Reference::ReadMemberFrom(Reader* reader, bool allow_null) { 285 NameIndex Reference::ReadMemberFrom(Reader* reader, bool allow_null) {
274 TRACE_READ_OFFSET(); 286 TRACE_READ_OFFSET();
275 NameIndex canonical_name = reader->ReadCanonicalNameReference(); 287 NameIndex canonical_name = reader->ReadCanonicalNameReference();
276 if ((canonical_name == -1) && !allow_null) { 288 if ((canonical_name == -1) && !allow_null) {
277 FATAL("Expected a valid member reference, but got `null`"); 289 FATAL("Expected a valid member reference, but got `null`");
278 } 290 }
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
311 end_position_ = reader->ReadPosition(false); 323 end_position_ = reader->ReadPosition(false);
312 flags_ = reader->ReadFlags(); 324 flags_ = reader->ReadFlags();
313 name_ = Name::ReadFrom(reader); 325 name_ = Name::ReadFrom(reader);
314 source_uri_index_ = reader->ReadUInt(); 326 source_uri_index_ = reader->ReadUInt();
315 reader->set_current_script_id(source_uri_index_); 327 reader->set_current_script_id(source_uri_index_);
316 reader->record_token_position(position_); 328 reader->record_token_position(position_);
317 reader->record_token_position(end_position_); 329 reader->record_token_position(end_position_);
318 annotations_.ReadFromStatic<Expression>(reader); 330 annotations_.ReadFromStatic<Expression>(reader);
319 type_ = DartType::ReadFrom(reader); 331 type_ = DartType::ReadFrom(reader);
320 initializer_ = reader->ReadOptional<Expression>(); 332 initializer_ = reader->ReadOptional<Expression>();
333
334 can_stream_ = (initializer_ == NULL || initializer_->can_stream()) &&
335 annotations_.CanStream();
336
321 return this; 337 return this;
322 } 338 }
323 339
324 340
325 Constructor* Constructor::ReadFrom(Reader* reader) { 341 Constructor* Constructor::ReadFrom(Reader* reader) {
326 TRACE_READ_OFFSET(); 342 TRACE_READ_OFFSET();
327 Tag tag = reader->ReadTag(); 343 Tag tag = reader->ReadTag();
328 ASSERT(tag == kConstructor); 344 ASSERT(tag == kConstructor);
329 345
330 canonical_name_ = reader->ReadCanonicalNameReference(); 346 canonical_name_ = reader->ReadCanonicalNameReference();
331 VariableScope<ReaderHelper> parameters(reader->helper()); 347 VariableScope<ReaderHelper> parameters(reader->helper());
332 position_ = reader->ReadPosition(); 348 position_ = reader->ReadPosition();
333 end_position_ = reader->ReadPosition(); 349 end_position_ = reader->ReadPosition();
334 flags_ = reader->ReadFlags(); 350 flags_ = reader->ReadFlags();
335 name_ = Name::ReadFrom(reader); 351 name_ = Name::ReadFrom(reader);
336 annotations_.ReadFromStatic<Expression>(reader); 352 annotations_.ReadFromStatic<Expression>(reader);
337 function_ = FunctionNode::ReadFrom(reader); 353 function_ = FunctionNode::ReadFrom(reader);
338 initializers_.ReadFromStatic<Initializer>(reader); 354 initializers_.ReadFromStatic<Initializer>(reader);
355
356 can_stream_ = annotations_.CanStream() && function_->can_stream() &&
357 initializers_.CanStream();
358
339 return this; 359 return this;
340 } 360 }
341 361
342 362
343 Procedure* Procedure::ReadFrom(Reader* reader) { 363 Procedure* Procedure::ReadFrom(Reader* reader) {
344 TRACE_READ_OFFSET(); 364 TRACE_READ_OFFSET();
345 Tag tag = reader->ReadTag(); 365 Tag tag = reader->ReadTag();
346 ASSERT(tag == kProcedure); 366 ASSERT(tag == kProcedure);
347 367
348 canonical_name_ = reader->ReadCanonicalNameReference(); 368 canonical_name_ = reader->ReadCanonicalNameReference();
349 VariableScope<ReaderHelper> parameters(reader->helper()); 369 VariableScope<ReaderHelper> parameters(reader->helper());
350 position_ = reader->ReadPosition(false); 370 position_ = reader->ReadPosition(false);
351 end_position_ = reader->ReadPosition(false); 371 end_position_ = reader->ReadPosition(false);
352 kind_ = static_cast<ProcedureKind>(reader->ReadByte()); 372 kind_ = static_cast<ProcedureKind>(reader->ReadByte());
353 flags_ = reader->ReadFlags(); 373 flags_ = reader->ReadFlags();
354 name_ = Name::ReadFrom(reader); 374 name_ = Name::ReadFrom(reader);
355 source_uri_index_ = reader->ReadUInt(); 375 source_uri_index_ = reader->ReadUInt();
356 reader->set_current_script_id(source_uri_index_); 376 reader->set_current_script_id(source_uri_index_);
357 reader->record_token_position(position_); 377 reader->record_token_position(position_);
358 reader->record_token_position(end_position_); 378 reader->record_token_position(end_position_);
359 annotations_.ReadFromStatic<Expression>(reader); 379 annotations_.ReadFromStatic<Expression>(reader);
360 function_ = reader->ReadOptional<FunctionNode>(); 380 function_ = reader->ReadOptional<FunctionNode>();
381
382 can_stream_ = annotations_.CanStream() &&
383 (function_ == NULL || function_->can_stream());
384
361 return this; 385 return this;
362 } 386 }
363 387
364 388
365 Initializer* Initializer::ReadFrom(Reader* reader) { 389 Initializer* Initializer::ReadFrom(Reader* reader) {
366 TRACE_READ_OFFSET(); 390 TRACE_READ_OFFSET();
367 Tag tag = reader->ReadTag(); 391 Tag tag = reader->ReadTag();
368 switch (tag) { 392 switch (tag) {
369 case kInvalidInitializer: 393 case kInvalidInitializer:
370 return InvalidInitializer::ReadFromImpl(reader); 394 return InvalidInitializer::ReadFromImpl(reader);
(...skipping 16 matching lines...) Expand all
387 TRACE_READ_OFFSET(); 411 TRACE_READ_OFFSET();
388 return new InvalidInitializer(); 412 return new InvalidInitializer();
389 } 413 }
390 414
391 415
392 FieldInitializer* FieldInitializer::ReadFromImpl(Reader* reader) { 416 FieldInitializer* FieldInitializer::ReadFromImpl(Reader* reader) {
393 TRACE_READ_OFFSET(); 417 TRACE_READ_OFFSET();
394 FieldInitializer* initializer = new FieldInitializer(); 418 FieldInitializer* initializer = new FieldInitializer();
395 initializer->field_reference_ = Reference::ReadMemberFrom(reader); 419 initializer->field_reference_ = Reference::ReadMemberFrom(reader);
396 initializer->value_ = Expression::ReadFrom(reader); 420 initializer->value_ = Expression::ReadFrom(reader);
421
422 initializer->can_stream_ = initializer->value_->can_stream();
423
397 return initializer; 424 return initializer;
398 } 425 }
399 426
400 427
401 SuperInitializer* SuperInitializer::ReadFromImpl(Reader* reader) { 428 SuperInitializer* SuperInitializer::ReadFromImpl(Reader* reader) {
402 TRACE_READ_OFFSET(); 429 TRACE_READ_OFFSET();
403 SuperInitializer* init = new SuperInitializer(); 430 SuperInitializer* init = new SuperInitializer();
404 init->target_reference_ = Reference::ReadMemberFrom(reader); 431 init->target_reference_ = Reference::ReadMemberFrom(reader);
405 init->arguments_ = Arguments::ReadFrom(reader); 432 init->arguments_ = Arguments::ReadFrom(reader);
433
434 init->can_stream_ = init->arguments_->can_stream();
435
406 return init; 436 return init;
407 } 437 }
408 438
409 439
410 RedirectingInitializer* RedirectingInitializer::ReadFromImpl(Reader* reader) { 440 RedirectingInitializer* RedirectingInitializer::ReadFromImpl(Reader* reader) {
411 TRACE_READ_OFFSET(); 441 TRACE_READ_OFFSET();
412 RedirectingInitializer* init = new RedirectingInitializer(); 442 RedirectingInitializer* init = new RedirectingInitializer();
413 init->target_reference_ = Reference::ReadMemberFrom(reader); 443 init->target_reference_ = Reference::ReadMemberFrom(reader);
414 init->arguments_ = Arguments::ReadFrom(reader); 444 init->arguments_ = Arguments::ReadFrom(reader);
445
446 init->can_stream_ = init->arguments_->can_stream();
447
415 return init; 448 return init;
416 } 449 }
417 450
418 451
419 LocalInitializer* LocalInitializer::ReadFromImpl(Reader* reader) { 452 LocalInitializer* LocalInitializer::ReadFromImpl(Reader* reader) {
420 TRACE_READ_OFFSET(); 453 TRACE_READ_OFFSET();
421 LocalInitializer* init = new LocalInitializer(); 454 LocalInitializer* init = new LocalInitializer();
422 init->variable_ = VariableDeclaration::ReadFromImpl(reader, false); 455 init->variable_ = VariableDeclaration::ReadFromImpl(reader, false);
456
457 init->can_stream_ = init->variable_->can_stream();
458
423 return init; 459 return init;
424 } 460 }
425 461
426 462
427 Expression* Expression::ReadFrom(Reader* reader) { 463 Expression* Expression::ReadFrom(Reader* reader) {
428 TRACE_READ_OFFSET(); 464 TRACE_READ_OFFSET();
429 uint8_t payload = 0; 465 uint8_t payload = 0;
430 Tag tag = reader->ReadTag(&payload); 466 Tag tag = reader->ReadTag(&payload);
431 switch (tag) { 467 switch (tag) {
432 case kInvalidExpression: 468 case kInvalidExpression:
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
541 reader->offset() - 1; // -1 to include tag byte. 577 reader->offset() - 1; // -1 to include tag byte.
542 return invalid_expression; 578 return invalid_expression;
543 } 579 }
544 580
545 581
546 VariableGet* VariableGet::ReadFrom(Reader* reader) { 582 VariableGet* VariableGet::ReadFrom(Reader* reader) {
547 TRACE_READ_OFFSET(); 583 TRACE_READ_OFFSET();
548 VariableGet* get = new VariableGet(); 584 VariableGet* get = new VariableGet();
549 get->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. 585 get->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte.
550 get->position_ = reader->ReadPosition(); 586 get->position_ = reader->ReadPosition();
587 get->variable_kernel_offset_ = reader->ReadUInt();
551 get->variable_ = reader->helper()->variables().Lookup(reader->ReadUInt()); 588 get->variable_ = reader->helper()->variables().Lookup(reader->ReadUInt());
589 ASSERT(get->variable_->kernel_offset() == get->variable_kernel_offset_);
552 reader->ReadOptional<DartType>(); // Unused promoted type. 590 reader->ReadOptional<DartType>(); // Unused promoted type.
553 return get; 591 return get;
554 } 592 }
555 593
556 594
557 VariableGet* VariableGet::ReadFrom(Reader* reader, uint8_t payload) { 595 VariableGet* VariableGet::ReadFrom(Reader* reader, uint8_t payload) {
558 TRACE_READ_OFFSET(); 596 TRACE_READ_OFFSET();
559 VariableGet* get = new VariableGet(); 597 VariableGet* get = new VariableGet();
560 get->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. 598 get->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte.
561 get->position_ = reader->ReadPosition(); 599 get->position_ = reader->ReadPosition();
600 get->variable_kernel_offset_ = reader->ReadUInt();
562 get->variable_ = reader->helper()->variables().Lookup(payload); 601 get->variable_ = reader->helper()->variables().Lookup(payload);
602 ASSERT(get->variable_->kernel_offset() == get->variable_kernel_offset_);
563 return get; 603 return get;
564 } 604 }
565 605
566 606
567 VariableSet* VariableSet::ReadFrom(Reader* reader) { 607 VariableSet* VariableSet::ReadFrom(Reader* reader) {
568 TRACE_READ_OFFSET(); 608 TRACE_READ_OFFSET();
569 VariableSet* set = new VariableSet(); 609 VariableSet* set = new VariableSet();
570 set->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. 610 set->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte.
571 set->position_ = reader->ReadPosition(); 611 set->position_ = reader->ReadPosition();
612 set->variable_kernel_offset_ = reader->ReadUInt();
572 set->variable_ = reader->helper()->variables().Lookup(reader->ReadUInt()); 613 set->variable_ = reader->helper()->variables().Lookup(reader->ReadUInt());
614 ASSERT(set->variable_->kernel_offset() == set->variable_kernel_offset_);
573 set->expression_ = Expression::ReadFrom(reader); 615 set->expression_ = Expression::ReadFrom(reader);
616
617 set->can_stream_ = set->expression_->can_stream();
618
574 return set; 619 return set;
575 } 620 }
576 621
577 622
578 VariableSet* VariableSet::ReadFrom(Reader* reader, uint8_t payload) { 623 VariableSet* VariableSet::ReadFrom(Reader* reader, uint8_t payload) {
579 TRACE_READ_OFFSET(); 624 TRACE_READ_OFFSET();
580 VariableSet* set = new VariableSet(); 625 VariableSet* set = new VariableSet();
581 set->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. 626 set->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte.
582 set->variable_ = reader->helper()->variables().Lookup(payload); 627 set->variable_ = reader->helper()->variables().Lookup(payload);
583 set->position_ = reader->ReadPosition(); 628 set->position_ = reader->ReadPosition();
629 set->variable_kernel_offset_ = reader->ReadUInt();
630 ASSERT(set->variable_->kernel_offset() == set->variable_kernel_offset_);
584 set->expression_ = Expression::ReadFrom(reader); 631 set->expression_ = Expression::ReadFrom(reader);
632
633 set->can_stream_ = set->expression_->can_stream();
634
585 return set; 635 return set;
586 } 636 }
587 637
588 638
589 PropertyGet* PropertyGet::ReadFrom(Reader* reader) { 639 PropertyGet* PropertyGet::ReadFrom(Reader* reader) {
590 TRACE_READ_OFFSET(); 640 TRACE_READ_OFFSET();
591 PropertyGet* get = new PropertyGet(); 641 PropertyGet* get = new PropertyGet();
592 get->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. 642 get->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte.
593 get->position_ = reader->ReadPosition(); 643 get->position_ = reader->ReadPosition();
594 get->receiver_ = Expression::ReadFrom(reader); 644 get->receiver_ = Expression::ReadFrom(reader);
595 get->name_ = Name::ReadFrom(reader); 645 get->name_ = Name::ReadFrom(reader);
596 get->interface_target_reference_ = Reference::ReadMemberFrom(reader, true); 646 get->interface_target_reference_ = Reference::ReadMemberFrom(reader, true);
647
648 get->can_stream_ = get->receiver_->can_stream();
649
597 return get; 650 return get;
598 } 651 }
599 652
600 653
601 PropertySet* PropertySet::ReadFrom(Reader* reader) { 654 PropertySet* PropertySet::ReadFrom(Reader* reader) {
602 TRACE_READ_OFFSET(); 655 TRACE_READ_OFFSET();
603 PropertySet* set = new PropertySet(); 656 PropertySet* set = new PropertySet();
604 set->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. 657 set->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte.
605 set->position_ = reader->ReadPosition(); 658 set->position_ = reader->ReadPosition();
606 set->receiver_ = Expression::ReadFrom(reader); 659 set->receiver_ = Expression::ReadFrom(reader);
607 set->name_ = Name::ReadFrom(reader); 660 set->name_ = Name::ReadFrom(reader);
608 set->value_ = Expression::ReadFrom(reader); 661 set->value_ = Expression::ReadFrom(reader);
609 set->interface_target_reference_ = Reference::ReadMemberFrom(reader, true); 662 set->interface_target_reference_ = Reference::ReadMemberFrom(reader, true);
663
664 set->can_stream_ = set->receiver_->can_stream() && set->value_->can_stream();
665
610 return set; 666 return set;
611 } 667 }
612 668
613 669
614 DirectPropertyGet* DirectPropertyGet::ReadFrom(Reader* reader) { 670 DirectPropertyGet* DirectPropertyGet::ReadFrom(Reader* reader) {
615 TRACE_READ_OFFSET(); 671 TRACE_READ_OFFSET();
616 DirectPropertyGet* get = new DirectPropertyGet(); 672 DirectPropertyGet* get = new DirectPropertyGet();
617 get->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. 673 get->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte.
618 get->position_ = reader->ReadPosition(); 674 get->position_ = reader->ReadPosition();
619 get->receiver_ = Expression::ReadFrom(reader); 675 get->receiver_ = Expression::ReadFrom(reader);
620 get->target_reference_ = Reference::ReadMemberFrom(reader); 676 get->target_reference_ = Reference::ReadMemberFrom(reader);
677
678 get->can_stream_ = get->receiver_->can_stream();
679
621 return get; 680 return get;
622 } 681 }
623 682
624 683
625 DirectPropertySet* DirectPropertySet::ReadFrom(Reader* reader) { 684 DirectPropertySet* DirectPropertySet::ReadFrom(Reader* reader) {
626 TRACE_READ_OFFSET(); 685 TRACE_READ_OFFSET();
627 DirectPropertySet* set = new DirectPropertySet(); 686 DirectPropertySet* set = new DirectPropertySet();
628 set->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. 687 set->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte.
629 set->position_ = reader->ReadPosition(); 688 set->position_ = reader->ReadPosition();
630 set->receiver_ = Expression::ReadFrom(reader); 689 set->receiver_ = Expression::ReadFrom(reader);
631 set->target_reference_ = Reference::ReadMemberFrom(reader); 690 set->target_reference_ = Reference::ReadMemberFrom(reader);
632 set->value_ = Expression::ReadFrom(reader); 691 set->value_ = Expression::ReadFrom(reader);
692
693 set->can_stream_ = set->receiver_->can_stream() && set->value_->can_stream();
694
633 return set; 695 return set;
634 } 696 }
635 697
636 698
637 StaticGet* StaticGet::ReadFrom(Reader* reader) { 699 StaticGet* StaticGet::ReadFrom(Reader* reader) {
638 TRACE_READ_OFFSET(); 700 TRACE_READ_OFFSET();
639 StaticGet* get = new StaticGet(); 701 StaticGet* get = new StaticGet();
640 get->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. 702 get->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte.
641 get->position_ = reader->ReadPosition(); 703 get->position_ = reader->ReadPosition();
642 get->target_reference_ = Reference::ReadMemberFrom(reader); 704 get->target_reference_ = Reference::ReadMemberFrom(reader);
643 return get; 705 return get;
644 } 706 }
645 707
646 708
647 StaticSet* StaticSet::ReadFrom(Reader* reader) { 709 StaticSet* StaticSet::ReadFrom(Reader* reader) {
648 TRACE_READ_OFFSET(); 710 TRACE_READ_OFFSET();
649 StaticSet* set = new StaticSet(); 711 StaticSet* set = new StaticSet();
650 set->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. 712 set->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte.
651 set->position_ = reader->ReadPosition(); 713 set->position_ = reader->ReadPosition();
652 set->target_reference_ = Reference::ReadMemberFrom(reader); 714 set->target_reference_ = Reference::ReadMemberFrom(reader);
653 set->expression_ = Expression::ReadFrom(reader); 715 set->expression_ = Expression::ReadFrom(reader);
716
717 set->can_stream_ = set->expression_->can_stream();
718
654 return set; 719 return set;
655 } 720 }
656 721
657 722
658 Arguments* Arguments::ReadFrom(Reader* reader) { 723 Arguments* Arguments::ReadFrom(Reader* reader) {
659 TRACE_READ_OFFSET(); 724 TRACE_READ_OFFSET();
660 Arguments* arguments = new Arguments(); 725 Arguments* arguments = new Arguments();
726 intptr_t num_arguments = reader->ReadUInt();
661 arguments->types().ReadFromStatic<DartType>(reader); 727 arguments->types().ReadFromStatic<DartType>(reader);
662 arguments->positional().ReadFromStatic<Expression>(reader); 728 arguments->positional().ReadFromStatic<Expression>(reader);
663 arguments->named().ReadFromStatic<NamedExpression>(reader); 729 arguments->named().ReadFromStatic<NamedExpression>(reader);
730 ASSERT(arguments->count() == num_arguments);
731
732 arguments->can_stream_ =
733 arguments->positional().CanStream() && arguments->named().CanStream();
734
664 return arguments; 735 return arguments;
665 } 736 }
666 737
667 738
668 NamedExpression* NamedExpression::ReadFrom(Reader* reader) { 739 NamedExpression* NamedExpression::ReadFrom(Reader* reader) {
669 TRACE_READ_OFFSET(); 740 TRACE_READ_OFFSET();
670 StringIndex name_index(reader->ReadUInt()); 741 StringIndex name_index(reader->ReadUInt());
671 Expression* expression = Expression::ReadFrom(reader); 742 Expression* expression = Expression::ReadFrom(reader);
672 return new NamedExpression(name_index, expression); 743 NamedExpression* named = new NamedExpression(name_index, expression);
744
745 named->can_stream_ = expression->can_stream();
746
747 return named;
673 } 748 }
674 749
675 750
676 MethodInvocation* MethodInvocation::ReadFrom(Reader* reader) { 751 MethodInvocation* MethodInvocation::ReadFrom(Reader* reader) {
677 TRACE_READ_OFFSET(); 752 TRACE_READ_OFFSET();
678 MethodInvocation* invocation = new MethodInvocation(); 753 MethodInvocation* invocation = new MethodInvocation();
679 invocation->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. 754 invocation->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte.
680 invocation->position_ = reader->ReadPosition(); 755 invocation->position_ = reader->ReadPosition();
681 invocation->receiver_ = Expression::ReadFrom(reader); 756 invocation->receiver_ = Expression::ReadFrom(reader);
682 invocation->name_ = Name::ReadFrom(reader); 757 invocation->name_ = Name::ReadFrom(reader);
683 invocation->arguments_ = Arguments::ReadFrom(reader); 758 invocation->arguments_ = Arguments::ReadFrom(reader);
684 invocation->interface_target_reference_ = 759 invocation->interface_target_reference_ =
685 Reference::ReadMemberFrom(reader, true); 760 Reference::ReadMemberFrom(reader, true);
761
762 invocation->can_stream_ = invocation->receiver_->can_stream() &&
763 invocation->arguments_->can_stream();
764
686 return invocation; 765 return invocation;
687 } 766 }
688 767
689 768
690 DirectMethodInvocation* DirectMethodInvocation::ReadFrom(Reader* reader) { 769 DirectMethodInvocation* DirectMethodInvocation::ReadFrom(Reader* reader) {
691 TRACE_READ_OFFSET(); 770 TRACE_READ_OFFSET();
692 DirectMethodInvocation* invocation = new DirectMethodInvocation(); 771 DirectMethodInvocation* invocation = new DirectMethodInvocation();
693 invocation->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. 772 invocation->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte.
694 invocation->receiver_ = Expression::ReadFrom(reader); 773 invocation->receiver_ = Expression::ReadFrom(reader);
695 invocation->target_reference_ = Reference::ReadMemberFrom(reader); 774 invocation->target_reference_ = Reference::ReadMemberFrom(reader);
696 invocation->arguments_ = Arguments::ReadFrom(reader); 775 invocation->arguments_ = Arguments::ReadFrom(reader);
776
777 invocation->can_stream_ = invocation->receiver_->can_stream() &&
778 invocation->arguments_->can_stream();
779
697 return invocation; 780 return invocation;
698 } 781 }
699 782
700 783
701 StaticInvocation* StaticInvocation::ReadFrom(Reader* reader, bool is_const) { 784 StaticInvocation* StaticInvocation::ReadFrom(Reader* reader, bool is_const) {
702 TRACE_READ_OFFSET(); 785 TRACE_READ_OFFSET();
703 StaticInvocation* invocation = new StaticInvocation(); 786 StaticInvocation* invocation = new StaticInvocation();
704 invocation->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. 787 invocation->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte.
705 invocation->is_const_ = is_const; 788 invocation->is_const_ = is_const;
706 invocation->position_ = reader->ReadPosition(); 789 invocation->position_ = reader->ReadPosition();
707 invocation->procedure_reference_ = Reference::ReadMemberFrom(reader); 790 invocation->procedure_reference_ = Reference::ReadMemberFrom(reader);
708 invocation->arguments_ = Arguments::ReadFrom(reader); 791 invocation->arguments_ = Arguments::ReadFrom(reader);
792
793 invocation->can_stream_ = invocation->arguments_->can_stream();
794
709 return invocation; 795 return invocation;
710 } 796 }
711 797
712 798
713 ConstructorInvocation* ConstructorInvocation::ReadFrom(Reader* reader, 799 ConstructorInvocation* ConstructorInvocation::ReadFrom(Reader* reader,
714 bool is_const) { 800 bool is_const) {
715 TRACE_READ_OFFSET(); 801 TRACE_READ_OFFSET();
716 ConstructorInvocation* invocation = new ConstructorInvocation(); 802 ConstructorInvocation* invocation = new ConstructorInvocation();
717 invocation->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. 803 invocation->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte.
718 invocation->is_const_ = is_const; 804 invocation->is_const_ = is_const;
719 invocation->position_ = reader->ReadPosition(); 805 invocation->position_ = reader->ReadPosition();
720 invocation->target_reference_ = Reference::ReadMemberFrom(reader); 806 invocation->target_reference_ = Reference::ReadMemberFrom(reader);
721 invocation->arguments_ = Arguments::ReadFrom(reader); 807 invocation->arguments_ = Arguments::ReadFrom(reader);
808
809 invocation->can_stream_ = invocation->arguments_->can_stream();
810
722 return invocation; 811 return invocation;
723 } 812 }
724 813
725 814
726 Not* Not::ReadFrom(Reader* reader) { 815 Not* Not::ReadFrom(Reader* reader) {
727 TRACE_READ_OFFSET(); 816 TRACE_READ_OFFSET();
728 Not* n = new Not(); 817 Not* n = new Not();
729 n->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. 818 n->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte.
730 n->expression_ = Expression::ReadFrom(reader); 819 n->expression_ = Expression::ReadFrom(reader);
820
821 n->can_stream_ = n->expression_->can_stream();
822
731 return n; 823 return n;
732 } 824 }
733 825
734 826
735 LogicalExpression* LogicalExpression::ReadFrom(Reader* reader) { 827 LogicalExpression* LogicalExpression::ReadFrom(Reader* reader) {
736 TRACE_READ_OFFSET(); 828 TRACE_READ_OFFSET();
737 LogicalExpression* expr = new LogicalExpression(); 829 LogicalExpression* expr = new LogicalExpression();
738 expr->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. 830 expr->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte.
739 expr->left_ = Expression::ReadFrom(reader); 831 expr->left_ = Expression::ReadFrom(reader);
740 expr->operator_ = static_cast<Operator>(reader->ReadByte()); 832 expr->operator_ = static_cast<Operator>(reader->ReadByte());
741 expr->right_ = Expression::ReadFrom(reader); 833 expr->right_ = Expression::ReadFrom(reader);
834
835 expr->can_stream_ = expr->left_->can_stream() && expr->right_->can_stream();
836
742 return expr; 837 return expr;
743 } 838 }
744 839
745 840
746 ConditionalExpression* ConditionalExpression::ReadFrom(Reader* reader) { 841 ConditionalExpression* ConditionalExpression::ReadFrom(Reader* reader) {
747 TRACE_READ_OFFSET(); 842 TRACE_READ_OFFSET();
748 ConditionalExpression* expr = new ConditionalExpression(); 843 ConditionalExpression* expr = new ConditionalExpression();
749 expr->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. 844 expr->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte.
750 expr->condition_ = Expression::ReadFrom(reader); 845 expr->condition_ = Expression::ReadFrom(reader);
751 expr->then_ = Expression::ReadFrom(reader); 846 expr->then_ = Expression::ReadFrom(reader);
752 expr->otherwise_ = Expression::ReadFrom(reader); 847 expr->otherwise_ = Expression::ReadFrom(reader);
753 reader->ReadOptional<DartType>(); // Unused static type. 848 reader->ReadOptional<DartType>(); // Unused static type.
849
850 expr->can_stream_ = expr->condition_->can_stream() &&
851 expr->then_->can_stream() &&
852 expr->otherwise_->can_stream();
853
754 return expr; 854 return expr;
755 } 855 }
756 856
757 857
758 StringConcatenation* StringConcatenation::ReadFrom(Reader* reader) { 858 StringConcatenation* StringConcatenation::ReadFrom(Reader* reader) {
759 TRACE_READ_OFFSET(); 859 TRACE_READ_OFFSET();
760 StringConcatenation* concat = new StringConcatenation(); 860 StringConcatenation* concat = new StringConcatenation();
761 concat->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. 861 concat->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte.
762 concat->position_ = reader->ReadPosition(); 862 concat->position_ = reader->ReadPosition();
763 concat->expressions_.ReadFromStatic<Expression>(reader); 863 concat->expressions_.ReadFromStatic<Expression>(reader);
864
865 concat->can_stream_ = concat->expressions_.CanStream();
866
764 return concat; 867 return concat;
765 } 868 }
766 869
767 870
768 IsExpression* IsExpression::ReadFrom(Reader* reader) { 871 IsExpression* IsExpression::ReadFrom(Reader* reader) {
769 TRACE_READ_OFFSET(); 872 TRACE_READ_OFFSET();
770 IsExpression* expr = new IsExpression(); 873 IsExpression* expr = new IsExpression();
771 expr->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. 874 expr->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte.
772 expr->position_ = reader->ReadPosition(); 875 expr->position_ = reader->ReadPosition();
773 expr->operand_ = Expression::ReadFrom(reader); 876 expr->operand_ = Expression::ReadFrom(reader);
774 expr->type_ = DartType::ReadFrom(reader); 877 expr->type_ = DartType::ReadFrom(reader);
878
879 expr->can_stream_ = expr->operand_->can_stream();
880
775 return expr; 881 return expr;
776 } 882 }
777 883
778 884
779 AsExpression* AsExpression::ReadFrom(Reader* reader) { 885 AsExpression* AsExpression::ReadFrom(Reader* reader) {
780 TRACE_READ_OFFSET(); 886 TRACE_READ_OFFSET();
781 AsExpression* expr = new AsExpression(); 887 AsExpression* expr = new AsExpression();
782 expr->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. 888 expr->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte.
783 expr->position_ = reader->ReadPosition(); 889 expr->position_ = reader->ReadPosition();
784 expr->operand_ = Expression::ReadFrom(reader); 890 expr->operand_ = Expression::ReadFrom(reader);
785 expr->type_ = DartType::ReadFrom(reader); 891 expr->type_ = DartType::ReadFrom(reader);
892
893 expr->can_stream_ = expr->operand_->can_stream();
894
786 return expr; 895 return expr;
787 } 896 }
788 897
789 898
790 StringLiteral* StringLiteral::ReadFrom(Reader* reader) { 899 StringLiteral* StringLiteral::ReadFrom(Reader* reader) {
791 TRACE_READ_OFFSET(); 900 TRACE_READ_OFFSET();
792 intptr_t offset = reader->offset() - 1; // -1 to include tag byte. 901 intptr_t offset = reader->offset() - 1; // -1 to include tag byte.
793 StringLiteral* lit = new StringLiteral(StringIndex(reader->ReadUInt())); 902 StringLiteral* lit = new StringLiteral(StringIndex(reader->ReadUInt()));
794 lit->kernel_offset_ = offset; 903 lit->kernel_offset_ = offset;
795 return lit; 904 return lit;
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
884 return rethrow; 993 return rethrow;
885 } 994 }
886 995
887 996
888 Throw* Throw::ReadFrom(Reader* reader) { 997 Throw* Throw::ReadFrom(Reader* reader) {
889 TRACE_READ_OFFSET(); 998 TRACE_READ_OFFSET();
890 Throw* t = new Throw(); 999 Throw* t = new Throw();
891 t->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. 1000 t->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte.
892 t->position_ = reader->ReadPosition(); 1001 t->position_ = reader->ReadPosition();
893 t->expression_ = Expression::ReadFrom(reader); 1002 t->expression_ = Expression::ReadFrom(reader);
1003
1004 t->can_stream_ = t->expression_->can_stream();
1005
894 return t; 1006 return t;
895 } 1007 }
896 1008
897 1009
898 ListLiteral* ListLiteral::ReadFrom(Reader* reader, bool is_const) { 1010 ListLiteral* ListLiteral::ReadFrom(Reader* reader, bool is_const) {
899 TRACE_READ_OFFSET(); 1011 TRACE_READ_OFFSET();
900 ListLiteral* literal = new ListLiteral(); 1012 ListLiteral* literal = new ListLiteral();
901 literal->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. 1013 literal->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte.
902 literal->is_const_ = is_const; 1014 literal->is_const_ = is_const;
903 literal->position_ = reader->ReadPosition(); 1015 literal->position_ = reader->ReadPosition();
904 literal->type_ = DartType::ReadFrom(reader); 1016 literal->type_ = DartType::ReadFrom(reader);
905 literal->expressions_.ReadFromStatic<Expression>(reader); 1017 literal->expressions_.ReadFromStatic<Expression>(reader);
1018
1019 literal->can_stream_ = literal->expressions_.CanStream();
1020
906 return literal; 1021 return literal;
907 } 1022 }
908 1023
909 1024
910 MapLiteral* MapLiteral::ReadFrom(Reader* reader, bool is_const) { 1025 MapLiteral* MapLiteral::ReadFrom(Reader* reader, bool is_const) {
911 TRACE_READ_OFFSET(); 1026 TRACE_READ_OFFSET();
912 MapLiteral* literal = new MapLiteral(); 1027 MapLiteral* literal = new MapLiteral();
913 literal->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. 1028 literal->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte.
914 literal->is_const_ = is_const; 1029 literal->is_const_ = is_const;
915 literal->position_ = reader->ReadPosition(); 1030 literal->position_ = reader->ReadPosition();
916 literal->key_type_ = DartType::ReadFrom(reader); 1031 literal->key_type_ = DartType::ReadFrom(reader);
917 literal->value_type_ = DartType::ReadFrom(reader); 1032 literal->value_type_ = DartType::ReadFrom(reader);
918 literal->entries_.ReadFromStatic<MapEntry>(reader); 1033 literal->entries_.ReadFromStatic<MapEntry>(reader);
1034
1035 literal->can_stream_ = literal->entries_.CanStream();
1036
919 return literal; 1037 return literal;
920 } 1038 }
921 1039
922 1040
923 MapEntry* MapEntry::ReadFrom(Reader* reader) { 1041 MapEntry* MapEntry::ReadFrom(Reader* reader) {
924 MapEntry* entry = new MapEntry(); 1042 MapEntry* entry = new MapEntry();
925 entry->key_ = Expression::ReadFrom(reader); 1043 entry->key_ = Expression::ReadFrom(reader);
926 entry->value_ = Expression::ReadFrom(reader); 1044 entry->value_ = Expression::ReadFrom(reader);
1045
1046 entry->can_stream_ = entry->key_->can_stream() && entry->value_->can_stream();
1047
927 return entry; 1048 return entry;
928 } 1049 }
929 1050
930 1051
931 AwaitExpression* AwaitExpression::ReadFrom(Reader* reader) { 1052 AwaitExpression* AwaitExpression::ReadFrom(Reader* reader) {
932 TRACE_READ_OFFSET(); 1053 TRACE_READ_OFFSET();
933 AwaitExpression* await = new AwaitExpression(); 1054 AwaitExpression* await = new AwaitExpression();
934 await->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. 1055 await->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte.
935 await->operand_ = Expression::ReadFrom(reader); 1056 await->operand_ = Expression::ReadFrom(reader);
1057
1058 await->can_stream_ = await->operand_->can_stream();
1059
936 return await; 1060 return await;
937 } 1061 }
938 1062
939 1063
940 FunctionExpression* FunctionExpression::ReadFrom(Reader* reader) { 1064 FunctionExpression* FunctionExpression::ReadFrom(Reader* reader) {
941 TRACE_READ_OFFSET(); 1065 TRACE_READ_OFFSET();
942 VariableScope<ReaderHelper> parameters(reader->helper()); 1066 VariableScope<ReaderHelper> parameters(reader->helper());
943 FunctionExpression* expr = new FunctionExpression(); 1067 FunctionExpression* expr = new FunctionExpression();
944 expr->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. 1068 expr->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte.
945 expr->function_ = FunctionNode::ReadFrom(reader); 1069 expr->function_ = FunctionNode::ReadFrom(reader);
1070
1071 expr->can_stream_ = false;
1072
946 return expr; 1073 return expr;
947 } 1074 }
948 1075
949 1076
950 Let* Let::ReadFrom(Reader* reader) { 1077 Let* Let::ReadFrom(Reader* reader) {
951 TRACE_READ_OFFSET(); 1078 TRACE_READ_OFFSET();
952 VariableScope<ReaderHelper> vars(reader->helper()); 1079 VariableScope<ReaderHelper> vars(reader->helper());
953 PositionScope scope(reader); 1080 PositionScope scope(reader);
954 1081
955 Let* let = new Let(); 1082 Let* let = new Let();
956 let->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. 1083 let->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte.
957 let->variable_ = VariableDeclaration::ReadFromImpl(reader, false); 1084 let->variable_ = VariableDeclaration::ReadFromImpl(reader, false);
958 let->body_ = Expression::ReadFrom(reader); 1085 let->body_ = Expression::ReadFrom(reader);
959 let->position_ = reader->min_position(); 1086 let->position_ = reader->min_position();
960 let->end_position_ = reader->max_position(); 1087 let->end_position_ = reader->max_position();
961 1088
1089 let->can_stream_ = let->variable_->can_stream() && let->body_->can_stream();
1090
962 return let; 1091 return let;
963 } 1092 }
964 1093
965 1094
966 VectorCreation* VectorCreation::ReadFrom(Reader* reader) { 1095 VectorCreation* VectorCreation::ReadFrom(Reader* reader) {
967 TRACE_READ_OFFSET(); 1096 TRACE_READ_OFFSET();
968 1097
969 VectorCreation* vector_creation = new VectorCreation(); 1098 VectorCreation* vector_creation = new VectorCreation();
970 vector_creation->kernel_offset_ = 1099 vector_creation->kernel_offset_ =
971 reader->offset() - 1; // -1 to include tag byte. 1100 reader->offset() - 1; // -1 to include tag byte.
972 vector_creation->value_ = reader->ReadUInt(); 1101 vector_creation->value_ = reader->ReadUInt();
973 1102
974 return vector_creation; 1103 return vector_creation;
975 } 1104 }
976 1105
977 1106
978 VectorGet* VectorGet::ReadFrom(Reader* reader) { 1107 VectorGet* VectorGet::ReadFrom(Reader* reader) {
979 TRACE_READ_OFFSET(); 1108 TRACE_READ_OFFSET();
980 1109
981 VectorGet* vector_get = new VectorGet(); 1110 VectorGet* vector_get = new VectorGet();
982 vector_get->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. 1111 vector_get->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte.
983 vector_get->vector_expression_ = Expression::ReadFrom(reader); 1112 vector_get->vector_expression_ = Expression::ReadFrom(reader);
984 vector_get->index_ = reader->ReadUInt(); 1113 vector_get->index_ = reader->ReadUInt();
985 1114
1115 vector_get->can_stream_ = false;
1116
986 return vector_get; 1117 return vector_get;
987 } 1118 }
988 1119
989 1120
990 VectorSet* VectorSet::ReadFrom(Reader* reader) { 1121 VectorSet* VectorSet::ReadFrom(Reader* reader) {
991 TRACE_READ_OFFSET(); 1122 TRACE_READ_OFFSET();
992 1123
993 VectorSet* vector_set = new VectorSet(); 1124 VectorSet* vector_set = new VectorSet();
994 vector_set->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. 1125 vector_set->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte.
995 vector_set->vector_expression_ = Expression::ReadFrom(reader); 1126 vector_set->vector_expression_ = Expression::ReadFrom(reader);
996 vector_set->index_ = reader->ReadUInt(); 1127 vector_set->index_ = reader->ReadUInt();
997 vector_set->value_ = Expression::ReadFrom(reader); 1128 vector_set->value_ = Expression::ReadFrom(reader);
998 1129
1130 vector_set->can_stream_ = false;
1131
999 return vector_set; 1132 return vector_set;
1000 } 1133 }
1001 1134
1002 1135
1003 VectorCopy* VectorCopy::ReadFrom(Reader* reader) { 1136 VectorCopy* VectorCopy::ReadFrom(Reader* reader) {
1004 TRACE_READ_OFFSET(); 1137 TRACE_READ_OFFSET();
1005 1138
1006 VectorCopy* vector_copy = new VectorCopy(); 1139 VectorCopy* vector_copy = new VectorCopy();
1007 vector_copy->kernel_offset_ = 1140 vector_copy->kernel_offset_ =
1008 reader->offset() - 1; // -1 to include tag byte. 1141 reader->offset() - 1; // -1 to include tag byte.
1009 vector_copy->vector_expression_ = Expression::ReadFrom(reader); 1142 vector_copy->vector_expression_ = Expression::ReadFrom(reader);
1010 1143
1144 vector_copy->can_stream_ = false;
1145
1011 return vector_copy; 1146 return vector_copy;
1012 } 1147 }
1013 1148
1014 1149
1015 ClosureCreation* ClosureCreation::ReadFrom(Reader* reader) { 1150 ClosureCreation* ClosureCreation::ReadFrom(Reader* reader) {
1016 TRACE_READ_OFFSET(); 1151 TRACE_READ_OFFSET();
1017 1152
1018 ClosureCreation* closure_creation = new ClosureCreation(); 1153 ClosureCreation* closure_creation = new ClosureCreation();
1019 closure_creation->kernel_offset_ = 1154 closure_creation->kernel_offset_ =
1020 reader->offset() - 1; // to include tag byte. 1155 reader->offset() - 1; // to include tag byte.
1021 closure_creation->top_level_function_reference_ = 1156 closure_creation->top_level_function_reference_ =
1022 Reference::ReadMemberFrom(reader); 1157 Reference::ReadMemberFrom(reader);
1023 closure_creation->context_vector_ = Expression::ReadFrom(reader); 1158 closure_creation->context_vector_ = Expression::ReadFrom(reader);
1024 closure_creation->function_type_ = 1159 closure_creation->function_type_ =
1025 FunctionType::Cast(DartType::ReadFrom(reader)); 1160 FunctionType::Cast(DartType::ReadFrom(reader));
1026 1161
1162 closure_creation->can_stream_ = false;
1163
1027 return closure_creation; 1164 return closure_creation;
1028 } 1165 }
1029 1166
1030 1167
1031 Statement* Statement::ReadFrom(Reader* reader) { 1168 Statement* Statement::ReadFrom(Reader* reader) {
1032 TRACE_READ_OFFSET(); 1169 TRACE_READ_OFFSET();
1033 Tag tag = reader->ReadTag(); 1170 Tag tag = reader->ReadTag();
1034 switch (tag) { 1171 switch (tag) {
1035 case kInvalidStatement: 1172 case kInvalidStatement:
1036 return InvalidStatement::ReadFrom(reader); 1173 return InvalidStatement::ReadFrom(reader);
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
1076 return FunctionDeclaration::ReadFrom(reader); 1213 return FunctionDeclaration::ReadFrom(reader);
1077 default: 1214 default:
1078 UNREACHABLE(); 1215 UNREACHABLE();
1079 } 1216 }
1080 return NULL; 1217 return NULL;
1081 } 1218 }
1082 1219
1083 1220
1084 InvalidStatement* InvalidStatement::ReadFrom(Reader* reader) { 1221 InvalidStatement* InvalidStatement::ReadFrom(Reader* reader) {
1085 TRACE_READ_OFFSET(); 1222 TRACE_READ_OFFSET();
1086 return new InvalidStatement(); 1223 InvalidStatement* stmt = new InvalidStatement();
1224 stmt->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte.
1225 return stmt;
1087 } 1226 }
1088 1227
1089 1228
1090 ExpressionStatement* ExpressionStatement::ReadFrom(Reader* reader) { 1229 ExpressionStatement* ExpressionStatement::ReadFrom(Reader* reader) {
1091 TRACE_READ_OFFSET(); 1230 TRACE_READ_OFFSET();
1092 return new ExpressionStatement(Expression::ReadFrom(reader)); 1231 intptr_t offset = reader->offset() - 1; // -1 to include tag byte.
1232 ExpressionStatement* stmt =
1233 new ExpressionStatement(Expression::ReadFrom(reader));
1234 stmt->kernel_offset_ = offset;
1235
1236 stmt->can_stream_ = stmt->expression_->can_stream();
1237
1238 return stmt;
1093 } 1239 }
1094 1240
1095 1241
1096 Block* Block::ReadFromImpl(Reader* reader) { 1242 Block* Block::ReadFromImpl(Reader* reader) {
1097 TRACE_READ_OFFSET(); 1243 TRACE_READ_OFFSET();
1098 PositionScope scope(reader); 1244 PositionScope scope(reader);
1099 1245
1100 VariableScope<ReaderHelper> vars(reader->helper()); 1246 VariableScope<ReaderHelper> vars(reader->helper());
1101 Block* block = new Block(); 1247 Block* block = new Block();
1102 block->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. 1248 block->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte.
1103 block->statements().ReadFromStatic<Statement>(reader); 1249 block->statements().ReadFromStatic<Statement>(reader);
1104 block->position_ = reader->min_position(); 1250 block->position_ = reader->min_position();
1105 block->end_position_ = reader->max_position(); 1251 block->end_position_ = reader->max_position();
1106 1252
1253 block->can_stream_ = block->statements().CanStream();
1254
1107 return block; 1255 return block;
1108 } 1256 }
1109 1257
1110 1258
1111 EmptyStatement* EmptyStatement::ReadFrom(Reader* reader) { 1259 EmptyStatement* EmptyStatement::ReadFrom(Reader* reader) {
1112 TRACE_READ_OFFSET(); 1260 TRACE_READ_OFFSET();
1113 return new EmptyStatement(); 1261 EmptyStatement* stmt = new EmptyStatement();
1262 stmt->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte.
1263 return stmt;
1114 } 1264 }
1115 1265
1116 1266
1117 AssertStatement* AssertStatement::ReadFrom(Reader* reader) { 1267 AssertStatement* AssertStatement::ReadFrom(Reader* reader) {
1118 TRACE_READ_OFFSET(); 1268 TRACE_READ_OFFSET();
1119 AssertStatement* stmt = new AssertStatement(); 1269 AssertStatement* stmt = new AssertStatement();
1270 stmt->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte.
1120 stmt->condition_ = Expression::ReadFrom(reader); 1271 stmt->condition_ = Expression::ReadFrom(reader);
1121 stmt->message_ = reader->ReadOptional<Expression>(); 1272 stmt->message_ = reader->ReadOptional<Expression>();
1273
1274 stmt->can_stream_ = stmt->condition_->can_stream() &&
1275 (stmt->message_ == NULL || stmt->message_->can_stream());
1276
1122 return stmt; 1277 return stmt;
1123 } 1278 }
1124 1279
1125 1280
1126 LabeledStatement* LabeledStatement::ReadFrom(Reader* reader) { 1281 LabeledStatement* LabeledStatement::ReadFrom(Reader* reader) {
1127 TRACE_READ_OFFSET(); 1282 TRACE_READ_OFFSET();
1128 LabeledStatement* stmt = new LabeledStatement(); 1283 LabeledStatement* stmt = new LabeledStatement();
1284 stmt->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte.
1285
1129 reader->helper()->labels()->Push(stmt); 1286 reader->helper()->labels()->Push(stmt);
1130 stmt->body_ = Statement::ReadFrom(reader); 1287 stmt->body_ = Statement::ReadFrom(reader);
1131 reader->helper()->labels()->Pop(stmt); 1288 reader->helper()->labels()->Pop(stmt);
1289
1290 stmt->can_stream_ = stmt->body_->can_stream();
1291
1132 return stmt; 1292 return stmt;
1133 } 1293 }
1134 1294
1135 1295
1136 BreakStatement* BreakStatement::ReadFrom(Reader* reader) { 1296 BreakStatement* BreakStatement::ReadFrom(Reader* reader) {
1137 TRACE_READ_OFFSET(); 1297 TRACE_READ_OFFSET();
1138 BreakStatement* stmt = new BreakStatement(); 1298 BreakStatement* stmt = new BreakStatement();
1299 stmt->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte.
1139 stmt->position_ = reader->ReadPosition(); 1300 stmt->position_ = reader->ReadPosition();
1140 stmt->target_ = reader->helper()->labels()->Lookup(reader->ReadUInt()); 1301 stmt->target_index_ = reader->ReadUInt();
1141 return stmt; 1302 return stmt;
1142 } 1303 }
1143 1304
1144 1305
1145 WhileStatement* WhileStatement::ReadFrom(Reader* reader) { 1306 WhileStatement* WhileStatement::ReadFrom(Reader* reader) {
1146 TRACE_READ_OFFSET(); 1307 TRACE_READ_OFFSET();
1147 WhileStatement* stmt = new WhileStatement(); 1308 WhileStatement* stmt = new WhileStatement();
1309 stmt->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte.
1148 stmt->condition_ = Expression::ReadFrom(reader); 1310 stmt->condition_ = Expression::ReadFrom(reader);
1149 stmt->body_ = Statement::ReadFrom(reader); 1311 stmt->body_ = Statement::ReadFrom(reader);
1312
1313 stmt->can_stream_ =
1314 stmt->condition_->can_stream() && stmt->body_->can_stream();
1315
1150 return stmt; 1316 return stmt;
1151 } 1317 }
1152 1318
1153 1319
1154 DoStatement* DoStatement::ReadFrom(Reader* reader) { 1320 DoStatement* DoStatement::ReadFrom(Reader* reader) {
1155 TRACE_READ_OFFSET(); 1321 TRACE_READ_OFFSET();
1156 DoStatement* dostmt = new DoStatement(); 1322 DoStatement* dostmt = new DoStatement();
1323 dostmt->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte.
1157 dostmt->body_ = Statement::ReadFrom(reader); 1324 dostmt->body_ = Statement::ReadFrom(reader);
1158 dostmt->condition_ = Expression::ReadFrom(reader); 1325 dostmt->condition_ = Expression::ReadFrom(reader);
1326
1327 dostmt->can_stream_ =
1328 dostmt->body_->can_stream() && dostmt->condition_->can_stream();
1329
1159 return dostmt; 1330 return dostmt;
1160 } 1331 }
1161 1332
1162 1333
1163 ForStatement* ForStatement::ReadFrom(Reader* reader) { 1334 ForStatement* ForStatement::ReadFrom(Reader* reader) {
1164 TRACE_READ_OFFSET(); 1335 TRACE_READ_OFFSET();
1165 VariableScope<ReaderHelper> vars(reader->helper()); 1336 VariableScope<ReaderHelper> vars(reader->helper());
1166 PositionScope scope(reader); 1337 PositionScope scope(reader);
1167 1338
1168 ForStatement* forstmt = new ForStatement(); 1339 ForStatement* forstmt = new ForStatement();
1169 forstmt->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. 1340 forstmt->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte.
1170 forstmt->variables_.ReadFromStatic<VariableDeclarationImpl>(reader); 1341 forstmt->variables_.ReadFromStatic<VariableDeclarationImpl>(reader);
1171 forstmt->condition_ = reader->ReadOptional<Expression>(); 1342 forstmt->condition_ = reader->ReadOptional<Expression>();
1172 forstmt->updates_.ReadFromStatic<Expression>(reader); 1343 forstmt->updates_.ReadFromStatic<Expression>(reader);
1173 forstmt->body_ = Statement::ReadFrom(reader); 1344 forstmt->body_ = Statement::ReadFrom(reader);
1174 forstmt->end_position_ = reader->max_position(); 1345 forstmt->end_position_ = reader->max_position();
1175 forstmt->position_ = reader->min_position(); 1346 forstmt->position_ = reader->min_position();
1176 1347
1348 forstmt->can_stream_ =
1349 forstmt->body_->can_stream() &&
1350 (forstmt->condition_ == NULL || forstmt->condition_->can_stream()) &&
1351 forstmt->variables_.CanStream() && forstmt->updates_.CanStream();
1352
1177 return forstmt; 1353 return forstmt;
1178 } 1354 }
1179 1355
1180 1356
1181 ForInStatement* ForInStatement::ReadFrom(Reader* reader, bool is_async) { 1357 ForInStatement* ForInStatement::ReadFrom(Reader* reader, bool is_async) {
1182 TRACE_READ_OFFSET(); 1358 TRACE_READ_OFFSET();
1183 VariableScope<ReaderHelper> vars(reader->helper()); 1359 VariableScope<ReaderHelper> vars(reader->helper());
1184 PositionScope scope(reader); 1360 PositionScope scope(reader);
1185 1361
1186 ForInStatement* forinstmt = new ForInStatement(); 1362 ForInStatement* forinstmt = new ForInStatement();
1187 forinstmt->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. 1363 forinstmt->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte.
1188 forinstmt->is_async_ = is_async; 1364 forinstmt->is_async_ = is_async;
1189 forinstmt->position_ = reader->ReadPosition(); 1365 forinstmt->position_ = reader->ReadPosition();
1190 forinstmt->variable_ = VariableDeclaration::ReadFromImpl(reader, false); 1366 forinstmt->variable_ = VariableDeclaration::ReadFromImpl(reader, false);
1191 forinstmt->iterable_ = Expression::ReadFrom(reader); 1367 forinstmt->iterable_ = Expression::ReadFrom(reader);
1192 forinstmt->body_ = Statement::ReadFrom(reader); 1368 forinstmt->body_ = Statement::ReadFrom(reader);
1193 forinstmt->end_position_ = reader->max_position(); 1369 forinstmt->end_position_ = reader->max_position();
1194 if (!forinstmt->position_.IsReal()) { 1370 if (!forinstmt->position_.IsReal()) {
1195 forinstmt->position_ = reader->min_position(); 1371 forinstmt->position_ = reader->min_position();
1196 } 1372 }
1197 forinstmt->variable_->set_end_position(forinstmt->position_); 1373 forinstmt->variable_->set_end_position(forinstmt->position_);
1198 1374
1375 forinstmt->can_stream_ = forinstmt->variable_->can_stream() &&
1376 forinstmt->iterable_->can_stream() &&
1377 forinstmt->body_->can_stream();
1378
1199 return forinstmt; 1379 return forinstmt;
1200 } 1380 }
1201 1381
1202 1382
1203 SwitchStatement* SwitchStatement::ReadFrom(Reader* reader) { 1383 SwitchStatement* SwitchStatement::ReadFrom(Reader* reader) {
1204 TRACE_READ_OFFSET(); 1384 TRACE_READ_OFFSET();
1205 SwitchCaseScope<ReaderHelper> scope(reader->helper());
1206 SwitchStatement* stmt = new SwitchStatement(); 1385 SwitchStatement* stmt = new SwitchStatement();
1386 stmt->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte.
1207 stmt->condition_ = Expression::ReadFrom(reader); 1387 stmt->condition_ = Expression::ReadFrom(reader);
1208 // We need to explicitly create empty [SwitchCase]s first in order to add them
1209 // to the [SwitchCaseScope]. This is necessary since a [Statement] in a switch
1210 // case can refer to one defined later on.
1211 int count = reader->ReadUInt(); 1388 int count = reader->ReadUInt();
1389 stmt->cases_.EnsureInitialized(count);
1212 for (intptr_t i = 0; i < count; i++) { 1390 for (intptr_t i = 0; i < count; i++) {
1213 SwitchCase* sc = stmt->cases_.GetOrCreate<SwitchCase>(i); 1391 SwitchCase* sc = stmt->cases_.GetOrCreate<SwitchCase>(i);
1214 reader->helper()->switch_cases().Push(sc);
1215 }
1216 for (intptr_t i = 0; i < count; i++) {
1217 SwitchCase* sc = stmt->cases_[i];
1218 sc->ReadFrom(reader); 1392 sc->ReadFrom(reader);
1219 } 1393 }
1394
1395 stmt->can_stream_ =
1396 stmt->condition_->can_stream() && stmt->cases_.CanStream();
1397
1220 return stmt; 1398 return stmt;
1221 } 1399 }
1222 1400
1223 1401
1224 SwitchCase* SwitchCase::ReadFrom(Reader* reader) { 1402 SwitchCase* SwitchCase::ReadFrom(Reader* reader) {
1225 TRACE_READ_OFFSET(); 1403 TRACE_READ_OFFSET();
1226 expressions_.ReadFromStatic<Expression>(reader); 1404 int length = reader->ReadListLength();
1227 for (intptr_t i = 0; i < expressions_.length(); ++i) { 1405 expressions_.EnsureInitialized(length);
1228 expressions_[i]->set_position(reader->ReadPosition()); 1406
1407 for (intptr_t i = 0; i < length; i++) {
1408 ASSERT(expressions_[i] == NULL);
1409 TokenPosition position = reader->ReadPosition();
1410 expressions_[i] = Expression::ReadFrom(reader);
1411 expressions_[i]->set_position(position);
1229 } 1412 }
1230 is_default_ = reader->ReadBool(); 1413 is_default_ = reader->ReadBool();
1231 body_ = Statement::ReadFrom(reader); 1414 body_ = Statement::ReadFrom(reader);
1415
1416 can_stream_ = expressions_.CanStream() && body_->can_stream();
1417
1232 return this; 1418 return this;
1233 } 1419 }
1234 1420
1235 1421
1236 ContinueSwitchStatement* ContinueSwitchStatement::ReadFrom(Reader* reader) { 1422 ContinueSwitchStatement* ContinueSwitchStatement::ReadFrom(Reader* reader) {
1237 TRACE_READ_OFFSET(); 1423 TRACE_READ_OFFSET();
1238 ContinueSwitchStatement* stmt = new ContinueSwitchStatement(); 1424 ContinueSwitchStatement* stmt = new ContinueSwitchStatement();
1239 stmt->target_ = reader->helper()->switch_cases().Lookup(reader->ReadUInt()); 1425 stmt->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte.
1426 stmt->target_index_ = reader->ReadUInt();
1427
1240 return stmt; 1428 return stmt;
1241 } 1429 }
1242 1430
1243 1431
1244 IfStatement* IfStatement::ReadFrom(Reader* reader) { 1432 IfStatement* IfStatement::ReadFrom(Reader* reader) {
1245 TRACE_READ_OFFSET(); 1433 TRACE_READ_OFFSET();
1246 IfStatement* ifstmt = new IfStatement(); 1434 IfStatement* ifstmt = new IfStatement();
1435 ifstmt->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte.
1247 ifstmt->condition_ = Expression::ReadFrom(reader); 1436 ifstmt->condition_ = Expression::ReadFrom(reader);
1248 ifstmt->then_ = Statement::ReadFrom(reader); 1437 ifstmt->then_ = Statement::ReadFrom(reader);
1249 ifstmt->otherwise_ = Statement::ReadFrom(reader); 1438 ifstmt->otherwise_ = Statement::ReadFrom(reader);
1439
1440 ifstmt->can_stream_ = ifstmt->condition_->can_stream() &&
1441 ifstmt->then_->can_stream() &&
1442 ifstmt->otherwise_->can_stream();
1443
1250 return ifstmt; 1444 return ifstmt;
1251 } 1445 }
1252 1446
1253 1447
1254 ReturnStatement* ReturnStatement::ReadFrom(Reader* reader) { 1448 ReturnStatement* ReturnStatement::ReadFrom(Reader* reader) {
1255 TRACE_READ_OFFSET(); 1449 TRACE_READ_OFFSET();
1256 ReturnStatement* ret = new ReturnStatement(); 1450 ReturnStatement* ret = new ReturnStatement();
1451 ret->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte.
1257 ret->position_ = reader->ReadPosition(); 1452 ret->position_ = reader->ReadPosition();
1258 ret->expression_ = reader->ReadOptional<Expression>(); 1453 ret->expression_ = reader->ReadOptional<Expression>();
1454
1455 ret->can_stream_ =
1456 (ret->expression_ == NULL || ret->expression_->can_stream());
1457
1259 return ret; 1458 return ret;
1260 } 1459 }
1261 1460
1262 1461
1263 TryCatch* TryCatch::ReadFrom(Reader* reader) { 1462 TryCatch* TryCatch::ReadFrom(Reader* reader) {
1264 TRACE_READ_OFFSET(); 1463 TRACE_READ_OFFSET();
1265 PositionScope scope(reader); 1464 PositionScope scope(reader);
1266 1465
1267 TryCatch* tc = new TryCatch(); 1466 TryCatch* tc = new TryCatch();
1467 tc->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte.
1268 tc->body_ = Statement::ReadFrom(reader); 1468 tc->body_ = Statement::ReadFrom(reader);
1469 reader->ReadBool(); // whether any catch needs a stacktrace.
1269 tc->catches_.ReadFromStatic<Catch>(reader); 1470 tc->catches_.ReadFromStatic<Catch>(reader);
1270 tc->position_ = reader->min_position(); 1471 tc->position_ = reader->min_position();
1271 1472
1473 tc->can_stream_ = tc->body_->can_stream() && tc->catches_.CanStream();
1474
1272 return tc; 1475 return tc;
1273 } 1476 }
1274 1477
1275 1478
1276 Catch* Catch::ReadFrom(Reader* reader) { 1479 Catch* Catch::ReadFrom(Reader* reader) {
1277 TRACE_READ_OFFSET(); 1480 TRACE_READ_OFFSET();
1278 VariableScope<ReaderHelper> vars(reader->helper()); 1481 VariableScope<ReaderHelper> vars(reader->helper());
1279 PositionScope scope(reader); 1482 PositionScope scope(reader);
1280 1483
1281 Catch* c = new Catch(); 1484 Catch* c = new Catch();
1282 c->kernel_offset_ = reader->offset(); // Catch has no tag. 1485 c->kernel_offset_ = reader->offset(); // Catch has no tag.
1283 c->guard_ = DartType::ReadFrom(reader); 1486 c->guard_ = DartType::ReadFrom(reader);
1284 c->exception_ = 1487 c->exception_ =
1285 reader->ReadOptional<VariableDeclaration, VariableDeclarationImpl>(); 1488 reader->ReadOptional<VariableDeclaration, VariableDeclarationImpl>();
1286 c->stack_trace_ = 1489 c->stack_trace_ =
1287 reader->ReadOptional<VariableDeclaration, VariableDeclarationImpl>(); 1490 reader->ReadOptional<VariableDeclaration, VariableDeclarationImpl>();
1288 c->body_ = Statement::ReadFrom(reader); 1491 c->body_ = Statement::ReadFrom(reader);
1289 c->end_position_ = reader->max_position(); 1492 c->end_position_ = reader->max_position();
1290 c->position_ = reader->min_position(); 1493 c->position_ = reader->min_position();
1291 1494
1495 c->can_stream_ = c->body_->can_stream();
1496
1292 return c; 1497 return c;
1293 } 1498 }
1294 1499
1295 1500
1296 TryFinally* TryFinally::ReadFrom(Reader* reader) { 1501 TryFinally* TryFinally::ReadFrom(Reader* reader) {
1297 TRACE_READ_OFFSET(); 1502 TRACE_READ_OFFSET();
1298 TryFinally* tf = new TryFinally(); 1503 TryFinally* tf = new TryFinally();
1504 tf->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte.
1299 tf->body_ = Statement::ReadFrom(reader); 1505 tf->body_ = Statement::ReadFrom(reader);
1300 tf->finalizer_ = Statement::ReadFrom(reader); 1506 tf->finalizer_ = Statement::ReadFrom(reader);
1507
1508 tf->can_stream_ = tf->body_->can_stream() && tf->finalizer_->can_stream();
1509
1301 return tf; 1510 return tf;
1302 } 1511 }
1303 1512
1304 1513
1305 YieldStatement* YieldStatement::ReadFrom(Reader* reader) { 1514 YieldStatement* YieldStatement::ReadFrom(Reader* reader) {
1306 TRACE_READ_OFFSET(); 1515 TRACE_READ_OFFSET();
1307 YieldStatement* stmt = new YieldStatement(); 1516 YieldStatement* stmt = new YieldStatement();
1517 stmt->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte.
1308 stmt->position_ = reader->ReadPosition(); 1518 stmt->position_ = reader->ReadPosition();
1309 reader->record_yield_token_position(stmt->position_); 1519 reader->record_yield_token_position(stmt->position_);
1310 stmt->flags_ = reader->ReadByte(); 1520 stmt->flags_ = reader->ReadByte();
1311 stmt->expression_ = Expression::ReadFrom(reader); 1521 stmt->expression_ = Expression::ReadFrom(reader);
1522
1523 stmt->can_stream_ = stmt->expression_->can_stream();
1524
1312 return stmt; 1525 return stmt;
1313 } 1526 }
1314 1527
1315 1528
1316 VariableDeclaration* VariableDeclaration::ReadFrom(Reader* reader) { 1529 VariableDeclaration* VariableDeclaration::ReadFrom(Reader* reader) {
1317 TRACE_READ_OFFSET(); 1530 TRACE_READ_OFFSET();
1318 Tag tag = reader->ReadTag(); 1531 Tag tag = reader->ReadTag();
1319 ASSERT(tag == kVariableDeclaration); 1532 ASSERT(tag == kVariableDeclaration);
1320 return VariableDeclaration::ReadFromImpl(reader, true); 1533 return VariableDeclaration::ReadFromImpl(reader, true);
1321 } 1534 }
(...skipping 14 matching lines...) Expand all
1336 decl->type_ = DartType::ReadFrom(reader); 1549 decl->type_ = DartType::ReadFrom(reader);
1337 decl->initializer_ = reader->ReadOptional<Expression>(); 1550 decl->initializer_ = reader->ReadOptional<Expression>();
1338 1551
1339 // Go to next token position so it ends *after* the last potentially 1552 // Go to next token position so it ends *after* the last potentially
1340 // debuggable position in the initializer. 1553 // debuggable position in the initializer.
1341 TokenPosition position = reader->max_position(); 1554 TokenPosition position = reader->max_position();
1342 if (position.IsReal()) position.Next(); 1555 if (position.IsReal()) position.Next();
1343 decl->end_position_ = position; 1556 decl->end_position_ = position;
1344 reader->helper()->variables().Push(decl); 1557 reader->helper()->variables().Push(decl);
1345 1558
1559 decl->can_stream_ =
1560 (decl->initializer_ == NULL || decl->initializer_->can_stream());
1561
1346 return decl; 1562 return decl;
1347 } 1563 }
1348 1564
1349 1565
1350 FunctionDeclaration* FunctionDeclaration::ReadFrom(Reader* reader) { 1566 FunctionDeclaration* FunctionDeclaration::ReadFrom(Reader* reader) {
1351 TRACE_READ_OFFSET(); 1567 TRACE_READ_OFFSET();
1352 FunctionDeclaration* decl = new FunctionDeclaration(); 1568 FunctionDeclaration* decl = new FunctionDeclaration();
1353 decl->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. 1569 decl->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte.
1354 decl->position_ = reader->ReadPosition(); 1570 decl->position_ = reader->ReadPosition();
1355 decl->variable_ = VariableDeclaration::ReadFromImpl(reader, false); 1571 decl->variable_ = VariableDeclaration::ReadFromImpl(reader, false);
1356 VariableScope<ReaderHelper> parameters(reader->helper()); 1572 VariableScope<ReaderHelper> parameters(reader->helper());
1357 decl->function_ = FunctionNode::ReadFrom(reader); 1573 decl->function_ = FunctionNode::ReadFrom(reader);
1574
1575 decl->can_stream_ = false;
1576
1358 return decl; 1577 return decl;
1359 } 1578 }
1360 1579
1361 1580
1362 Name* Name::ReadFrom(Reader* reader) { 1581 Name* Name::ReadFrom(Reader* reader) {
1363 StringIndex name_index(reader->ReadUInt()); 1582 StringIndex name_index(reader->ReadUInt());
1364 if ((reader->StringLength(name_index) >= 1) && 1583 if ((reader->StringLength(name_index) >= 1) &&
1365 (reader->CharacterAt(name_index, 0) == '_')) { 1584 (reader->CharacterAt(name_index, 0) == '_')) {
1366 intptr_t library_reference = reader->ReadCanonicalNameReference(); 1585 intptr_t library_reference = reader->ReadCanonicalNameReference();
1367 return new Name(name_index, library_reference); 1586 return new Name(name_index, library_reference);
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
1456 return type; 1675 return type;
1457 } 1676 }
1458 1677
1459 1678
1460 FunctionType* FunctionType::ReadFrom(Reader* reader) { 1679 FunctionType* FunctionType::ReadFrom(Reader* reader) {
1461 TRACE_READ_OFFSET(); 1680 TRACE_READ_OFFSET();
1462 FunctionType* type = new FunctionType(); 1681 FunctionType* type = new FunctionType();
1463 TypeParameterScope<ReaderHelper> scope(reader->helper()); 1682 TypeParameterScope<ReaderHelper> scope(reader->helper());
1464 type->type_parameters().ReadFrom(reader); 1683 type->type_parameters().ReadFrom(reader);
1465 type->required_parameter_count_ = reader->ReadUInt(); 1684 type->required_parameter_count_ = reader->ReadUInt();
1685 intptr_t total_parameter_count = reader->ReadUInt();
1466 type->positional_parameters().ReadFromStatic<DartType>(reader); 1686 type->positional_parameters().ReadFromStatic<DartType>(reader);
1467 type->named_parameters().ReadFromStatic<NamedParameter>(reader); 1687 type->named_parameters().ReadFromStatic<NamedParameter>(reader);
1688 ASSERT(type->positional_parameters().length() +
1689 type->named_parameters().length() ==
1690 total_parameter_count);
1468 type->return_type_ = DartType::ReadFrom(reader); 1691 type->return_type_ = DartType::ReadFrom(reader);
1469 return type; 1692 return type;
1470 } 1693 }
1471 1694
1472 1695
1473 FunctionType* FunctionType::ReadFrom(Reader* reader, bool _is_simple_) { 1696 FunctionType* FunctionType::ReadFrom(Reader* reader, bool _is_simple_) {
1474 TRACE_READ_OFFSET(); 1697 TRACE_READ_OFFSET();
1475 FunctionType* type = new FunctionType(); 1698 FunctionType* type = new FunctionType();
1476 ASSERT(_is_simple_); 1699 ASSERT(_is_simple_);
1477 type->positional_parameters().ReadFromStatic<DartType>(reader); 1700 type->positional_parameters().ReadFromStatic<DartType>(reader);
1478 type->required_parameter_count_ = type->positional_parameters().length(); 1701 type->required_parameter_count_ = type->positional_parameters().length();
1479 type->return_type_ = DartType::ReadFrom(reader); 1702 type->return_type_ = DartType::ReadFrom(reader);
1480 return type; 1703 return type;
1481 } 1704 }
1482 1705
1483 1706
1484 TypeParameterType* TypeParameterType::ReadFrom(Reader* reader) { 1707 TypeParameterType* TypeParameterType::ReadFrom(Reader* reader) {
1485 TRACE_READ_OFFSET(); 1708 TRACE_READ_OFFSET();
1486 TypeParameterType* type = new TypeParameterType(); 1709 TypeParameterType* type = new TypeParameterType();
1487 type->parameter_ = 1710 type->parameter_ =
1488 reader->helper()->type_parameters().Lookup(reader->ReadUInt()); 1711 reader->helper()->type_parameters().Lookup(reader->ReadUInt());
1712 reader->ReadUInt(); // binary offset of parameter
1489 // There is an optional promoted bound, currently ignored. 1713 // There is an optional promoted bound, currently ignored.
1490 delete reader->ReadOptional<DartType>(); 1714 delete reader->ReadOptional<DartType>();
1491 return type; 1715 return type;
1492 } 1716 }
1493 1717
1494 1718
1495 VectorType* VectorType::ReadFrom(Reader* reader) { 1719 VectorType* VectorType::ReadFrom(Reader* reader) {
1496 TRACE_READ_OFFSET(); 1720 TRACE_READ_OFFSET();
1497 VectorType* type = new VectorType(); 1721 VectorType* type = new VectorType();
1498 return type; 1722 return type;
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
1539 1763
1540 int libraries = reader->ReadUInt(); 1764 int libraries = reader->ReadUInt();
1541 program->libraries().EnsureInitialized(libraries); 1765 program->libraries().EnsureInitialized(libraries);
1542 for (intptr_t i = 0; i < libraries; i++) { 1766 for (intptr_t i = 0; i < libraries; i++) {
1543 program->libraries().GetOrCreate<Library>(i)->ReadFrom(reader); 1767 program->libraries().GetOrCreate<Library>(i)->ReadFrom(reader);
1544 } 1768 }
1545 1769
1546 program->main_method_reference_ = 1770 program->main_method_reference_ =
1547 Reference::ReadMemberFrom(reader, /*allow_null=*/true); 1771 Reference::ReadMemberFrom(reader, /*allow_null=*/true);
1548 1772
1773 program->can_stream_ = false;
1774
1549 return program; 1775 return program;
1550 } 1776 }
1551 1777
1552 1778
1553 FunctionNode* FunctionNode::ReadFrom(Reader* reader) { 1779 FunctionNode* FunctionNode::ReadFrom(Reader* reader) {
1554 TRACE_READ_OFFSET(); 1780 TRACE_READ_OFFSET();
1555 TypeParameterScope<ReaderHelper> scope(reader->helper()); 1781 TypeParameterScope<ReaderHelper> scope(reader->helper());
1556 1782
1557 FunctionNode* function = new FunctionNode(); 1783 FunctionNode* function = new FunctionNode();
1558 function->kernel_offset_ = reader->offset(); // FunctionNode has no tag. 1784 function->kernel_offset_ = reader->offset(); // FunctionNode has no tag.
1559 function->position_ = reader->ReadPosition(); 1785 function->position_ = reader->ReadPosition();
1560 function->end_position_ = reader->ReadPosition(); 1786 function->end_position_ = reader->ReadPosition();
1561 function->async_marker_ = 1787 function->async_marker_ =
1562 static_cast<FunctionNode::AsyncMarker>(reader->ReadByte()); 1788 static_cast<FunctionNode::AsyncMarker>(reader->ReadByte());
1563 function->dart_async_marker_ = 1789 function->dart_async_marker_ =
1564 static_cast<FunctionNode::AsyncMarker>(reader->ReadByte()); 1790 static_cast<FunctionNode::AsyncMarker>(reader->ReadByte());
1565 function->type_parameters().ReadFrom(reader); 1791 function->type_parameters().ReadFrom(reader);
1566 function->required_parameter_count_ = reader->ReadUInt(); 1792 function->required_parameter_count_ = reader->ReadUInt();
1567 function->positional_parameters().ReadFromStatic<VariableDeclarationImpl>( 1793 function->positional_parameters().ReadFromStatic<VariableDeclarationImpl>(
1568 reader); 1794 reader);
1569 function->named_parameters().ReadFromStatic<VariableDeclarationImpl>(reader); 1795 function->named_parameters().ReadFromStatic<VariableDeclarationImpl>(reader);
1570 function->return_type_ = DartType::ReadFrom(reader); 1796 function->return_type_ = DartType::ReadFrom(reader);
1571 1797
1572 LabelScope<ReaderHelper, BlockStack<LabeledStatement> > labels( 1798 LabelScope<ReaderHelper, BlockStack<LabeledStatement> > labels(
1573 reader->helper()); 1799 reader->helper());
1574 VariableScope<ReaderHelper> vars(reader->helper()); 1800 VariableScope<ReaderHelper> vars(reader->helper());
1575 function->body_ = reader->ReadOptional<Statement>(); 1801 function->body_ = reader->ReadOptional<Statement>();
1802
1803 function->can_stream_ =
1804 function->positional_parameters_.CanStream() &&
1805 function->named_parameters_.CanStream() &&
1806 (function->body_ == NULL || function->body_->can_stream());
1807
1576 return function; 1808 return function;
1577 } 1809 }
1578 1810
1579 1811
1580 TypeParameter* TypeParameter::ReadFrom(Reader* reader) { 1812 TypeParameter* TypeParameter::ReadFrom(Reader* reader) {
1581 TRACE_READ_OFFSET(); 1813 TRACE_READ_OFFSET();
1814 kernel_offset_ = reader->offset();
1582 name_index_ = StringIndex(reader->ReadUInt()); 1815 name_index_ = StringIndex(reader->ReadUInt());
1583 bound_ = DartType::ReadFrom(reader); 1816 bound_ = DartType::ReadFrom(reader);
1584 return this; 1817 return this;
1585 } 1818 }
1586 1819
1587 1820
1588 } // namespace kernel 1821 } // namespace kernel
1589 1822
1590 1823
1591 kernel::Program* ReadPrecompiledKernelFromBuffer(const uint8_t* buffer, 1824 kernel::Program* ReadPrecompiledKernelFromBuffer(const uint8_t* buffer,
1592 intptr_t buffer_length) { 1825 intptr_t buffer_length) {
1593 kernel::Reader reader(buffer, buffer_length); 1826 kernel::Reader reader(buffer, buffer_length);
1594 return kernel::Program::ReadFrom(&reader); 1827 return kernel::Program::ReadFrom(&reader);
1595 } 1828 }
1596 1829
1597 1830
1598 } // namespace dart 1831 } // namespace dart
1599 #endif // !defined(DART_PRECOMPILED_RUNTIME) 1832 #endif // !defined(DART_PRECOMPILED_RUNTIME)
OLDNEW
« no previous file with comments | « runtime/vm/kernel_binary.h ('k') | runtime/vm/kernel_binary_flowgraph.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698