OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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) |
OLD | NEW |