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 | 4 |
5 #include "vm/kernel_reader.h" | 5 #include "vm/kernel_reader.h" |
6 | 6 |
7 #include <string.h> | 7 #include <string.h> |
8 | 8 |
9 #include "vm/dart_api_impl.h" | 9 #include "vm/dart_api_impl.h" |
10 #include "vm/kernel_binary.h" | 10 #include "vm/kernel_binary.h" |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
146 TypedData& offsets = TypedData::Handle( | 146 TypedData& offsets = TypedData::Handle( |
147 Z, TypedData::New(kTypedDataUint32ArrayCid, count, Heap::kOld)); | 147 Z, TypedData::New(kTypedDataUint32ArrayCid, count, Heap::kOld)); |
148 offsets.SetUint32(0, 0); | 148 offsets.SetUint32(0, 0); |
149 intptr_t end_offset = 0; | 149 intptr_t end_offset = 0; |
150 for (intptr_t i = 1; i < count; ++i) { | 150 for (intptr_t i = 1; i < count; ++i) { |
151 end_offset = reader.ReadUInt(); | 151 end_offset = reader.ReadUInt(); |
152 offsets.SetUint32(i << 2, end_offset); | 152 offsets.SetUint32(i << 2, end_offset); |
153 } | 153 } |
154 | 154 |
155 // Copy the string data out of the binary and into the VM's heap. | 155 // Copy the string data out of the binary and into the VM's heap. |
156 TypedData& data = TypedData::Handle( | 156 TypedData& data = |
157 Z, TypedData::New(kTypedDataUint8ArrayCid, end_offset, Heap::kOld)); | 157 reader.CopyDataToVMHeap(Z, reader.offset(), reader.offset() + end_offset); |
158 { | |
159 NoSafepointScope no_safepoint; | |
160 memmove(data.DataAddr(0), reader.buffer() + reader.offset(), end_offset); | |
161 } | |
162 | 158 |
163 // Copy the canonical names into the VM's heap. Encode them as unsigned, so | 159 // Copy the canonical names into the VM's heap. Encode them as unsigned, so |
164 // the parent indexes are adjusted when extracted. | 160 // the parent indexes are adjusted when extracted. |
165 reader.set_offset(program->name_table_offset()); | 161 reader.set_offset(program->name_table_offset()); |
166 count = reader.ReadUInt() * 2; | 162 count = reader.ReadUInt() * 2; |
167 TypedData& names = TypedData::Handle( | 163 TypedData& names = TypedData::Handle( |
168 Z, TypedData::New(kTypedDataUint32ArrayCid, count, Heap::kOld)); | 164 Z, TypedData::New(kTypedDataUint32ArrayCid, count, Heap::kOld)); |
169 for (intptr_t i = 0; i < count; ++i) { | 165 for (intptr_t i = 0; i < count; ++i) { |
170 names.SetUint32(i << 2, reader.ReadUInt()); | 166 names.SetUint32(i << 2, reader.ReadUInt()); |
171 } | 167 } |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
273 ClassForScriptAt(toplevel_class, field_helper.source_uri_index_); | 269 ClassForScriptAt(toplevel_class, field_helper.source_uri_index_); |
274 dart::Field& field = dart::Field::Handle( | 270 dart::Field& field = dart::Field::Handle( |
275 Z, dart::Field::NewTopLevel(name, field_helper.IsFinal(), | 271 Z, dart::Field::NewTopLevel(name, field_helper.IsFinal(), |
276 field_helper.IsConst(), script_class, | 272 field_helper.IsConst(), script_class, |
277 field_helper.position_)); | 273 field_helper.position_)); |
278 field.set_kernel_offset(field_offset); | 274 field.set_kernel_offset(field_offset); |
279 const AbstractType& type = T.BuildType(); // read type. | 275 const AbstractType& type = T.BuildType(); // read type. |
280 field.SetFieldType(type); | 276 field.SetFieldType(type); |
281 field_helper.SetJustRead(FieldHelper::kType); | 277 field_helper.SetJustRead(FieldHelper::kType); |
282 field_helper.ReadUntilExcluding(FieldHelper::kInitializer); | 278 field_helper.ReadUntilExcluding(FieldHelper::kInitializer); |
279 intptr_t field_initializer_offset = builder_.ReaderOffset(); | |
283 field.set_has_initializer(builder_.PeekTag() == kSomething); | 280 field.set_has_initializer(builder_.PeekTag() == kSomething); |
284 GenerateFieldAccessors(toplevel_class, field, &field_helper, field_offset); | |
285 field_helper.ReadUntilExcluding(FieldHelper::kEnd); | 281 field_helper.ReadUntilExcluding(FieldHelper::kEnd); |
282 TypedData& body_data = builder_.reader_->CopyDataToVMHeap( | |
283 Z, field_offset, builder_.ReaderOffset()); | |
284 field.set_kernel_body(body_data); | |
285 { | |
286 // GenerateFieldAccessors reads (some of) the initializer. | |
287 AlternativeReadingScope alt(builder_.reader_, field_initializer_offset); | |
288 GenerateFieldAccessors(toplevel_class, field, &field_helper, | |
289 field_offset); | |
290 } | |
286 if (FLAG_enable_mirrors && field_helper.annotation_count_ > 0) { | 291 if (FLAG_enable_mirrors && field_helper.annotation_count_ > 0) { |
287 library.AddFieldMetadata(field, TokenPosition::kNoSource, field_offset); | 292 library.AddFieldMetadata(field, TokenPosition::kNoSource, field_offset, |
293 &body_data); | |
288 } | 294 } |
289 fields_.Add(&field); | 295 fields_.Add(&field); |
290 library.AddObject(field, name); | 296 library.AddObject(field, name); |
291 } | 297 } |
292 toplevel_class.AddFields(fields_); | 298 toplevel_class.AddFields(fields_); |
293 | 299 |
294 // Load toplevel procedures. | 300 // Load toplevel procedures. |
295 intptr_t procedure_count = builder_.ReadListLength(); // read list length. | 301 intptr_t procedure_count = builder_.ReadListLength(); // read list length. |
296 for (intptr_t i = 0; i < procedure_count; ++i) { | 302 for (intptr_t i = 0; i < procedure_count; ++i) { |
297 ReadProcedure(library, toplevel_class, false); | 303 ReadProcedure(library, toplevel_class, false); |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
354 // a script to detect test functions that should not be optimized. | 360 // a script to detect test functions that should not be optimized. |
355 if (klass.script() == Script::null()) { | 361 if (klass.script() == Script::null()) { |
356 class_helper.ReadUntilIncluding(ClassHelper::kSourceUriIndex); | 362 class_helper.ReadUntilIncluding(ClassHelper::kSourceUriIndex); |
357 klass.set_script(ScriptAt(class_helper.source_uri_index_)); | 363 klass.set_script(ScriptAt(class_helper.source_uri_index_)); |
358 } | 364 } |
359 if (klass.token_pos() == TokenPosition::kNoSource) { | 365 if (klass.token_pos() == TokenPosition::kNoSource) { |
360 class_helper.ReadUntilIncluding(ClassHelper::kPosition); | 366 class_helper.ReadUntilIncluding(ClassHelper::kPosition); |
361 klass.set_token_pos(class_helper.position_); | 367 klass.set_token_pos(class_helper.position_); |
362 } | 368 } |
363 | 369 |
370 class_helper.ReadUntilIncluding(ClassHelper::kAnnotations); | |
371 intptr_t class_offset_after_annotations = builder_.ReaderOffset(); | |
364 class_helper.ReadUntilExcluding(ClassHelper::kTypeParameters); | 372 class_helper.ReadUntilExcluding(ClassHelper::kTypeParameters); |
365 intptr_t type_parameter_counts = | 373 intptr_t type_parameter_counts = |
366 builder_.ReadListLength(); // read type_parameters list length. | 374 builder_.ReadListLength(); // read type_parameters list length. |
367 | 375 |
368 ActiveClassScope active_class_scope(&active_class_, &klass); | 376 ActiveClassScope active_class_scope(&active_class_, &klass); |
369 if (!klass.is_cycle_free()) { | 377 if (!klass.is_cycle_free()) { |
370 ReadPreliminaryClass(&klass, &class_helper, type_parameter_counts); | 378 ReadPreliminaryClass(&klass, &class_helper, type_parameter_counts); |
371 } else { | 379 } else { |
372 for (intptr_t i = 0; i < type_parameter_counts; ++i) { | 380 for (intptr_t i = 0; i < type_parameter_counts; ++i) { |
373 builder_.SkipStringReference(); // read ith name index. | 381 builder_.SkipStringReference(); // read ith name index. |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
410 Z, | 418 Z, |
411 dart::Field::New(name, field_helper.IsStatic(), | 419 dart::Field::New(name, field_helper.IsStatic(), |
412 // In the VM all const fields are implicitly final | 420 // In the VM all const fields are implicitly final |
413 // whereas in Kernel they are not final because they | 421 // whereas in Kernel they are not final because they |
414 // are not explicitly declared that way. | 422 // are not explicitly declared that way. |
415 field_helper.IsFinal() || field_helper.IsConst(), | 423 field_helper.IsFinal() || field_helper.IsConst(), |
416 field_helper.IsConst(), is_reflectable, script_class, | 424 field_helper.IsConst(), is_reflectable, script_class, |
417 type, field_helper.position_)); | 425 type, field_helper.position_)); |
418 field.set_kernel_offset(field_offset); | 426 field.set_kernel_offset(field_offset); |
419 field_helper.ReadUntilExcluding(FieldHelper::kInitializer); | 427 field_helper.ReadUntilExcluding(FieldHelper::kInitializer); |
428 intptr_t field_initializer_offset = builder_.ReaderOffset(); | |
420 field.set_has_initializer(builder_.PeekTag() == kSomething); | 429 field.set_has_initializer(builder_.PeekTag() == kSomething); |
421 GenerateFieldAccessors(klass, field, &field_helper, field_offset); | |
422 field_helper.ReadUntilExcluding(FieldHelper::kEnd); | 430 field_helper.ReadUntilExcluding(FieldHelper::kEnd); |
431 TypedData& body_data = builder_.reader_->CopyDataToVMHeap( | |
432 Z, field_offset, builder_.ReaderOffset()); | |
433 field.set_kernel_body(body_data); | |
Kevin Millikin (Google)
2017/08/09 12:08:52
kernel_body (and body_data) are not the correct na
jensj
2017/08/10 07:37:34
Done.
| |
434 { | |
435 // GenerateFieldAccessors reads (some of) the initializer. | |
436 AlternativeReadingScope alt(builder_.reader_, field_initializer_offset); | |
437 GenerateFieldAccessors(klass, field, &field_helper, field_offset); | |
438 } | |
423 if (FLAG_enable_mirrors && field_helper.annotation_count_ > 0) { | 439 if (FLAG_enable_mirrors && field_helper.annotation_count_ > 0) { |
424 library.AddFieldMetadata(field, TokenPosition::kNoSource, field_offset); | 440 library.AddFieldMetadata(field, TokenPosition::kNoSource, field_offset, |
441 &body_data); | |
425 } | 442 } |
426 fields_.Add(&field); | 443 fields_.Add(&field); |
427 } | 444 } |
428 klass.AddFields(fields_); | 445 klass.AddFields(fields_); |
429 class_helper.SetJustRead(ClassHelper::kFields); | 446 class_helper.SetJustRead(ClassHelper::kFields); |
430 } | 447 } |
431 | 448 |
432 class_helper.ReadUntilExcluding(ClassHelper::kConstructors); | 449 class_helper.ReadUntilExcluding(ClassHelper::kConstructors); |
433 int constructor_count = builder_.ReadListLength(); // read list length. | 450 int constructor_count = builder_.ReadListLength(); // read list length. |
434 for (intptr_t i = 0; i < constructor_count; ++i) { | 451 for (intptr_t i = 0; i < constructor_count; ++i) { |
(...skipping 20 matching lines...) Expand all Loading... | |
455 FunctionNodeHelper function_node_helper(&builder_); | 472 FunctionNodeHelper function_node_helper(&builder_); |
456 function_node_helper.ReadUntilExcluding( | 473 function_node_helper.ReadUntilExcluding( |
457 FunctionNodeHelper::kRequiredParameterCount); | 474 FunctionNodeHelper::kRequiredParameterCount); |
458 builder_.SetupFunctionParameters(klass, function, | 475 builder_.SetupFunctionParameters(klass, function, |
459 true, // is_method | 476 true, // is_method |
460 false, // is_closure | 477 false, // is_closure |
461 &function_node_helper); | 478 &function_node_helper); |
462 function_node_helper.ReadUntilExcluding(FunctionNodeHelper::kEnd); | 479 function_node_helper.ReadUntilExcluding(FunctionNodeHelper::kEnd); |
463 constructor_helper.SetJustRead(ConstructorHelper::kFunction); | 480 constructor_helper.SetJustRead(ConstructorHelper::kFunction); |
464 constructor_helper.ReadUntilExcluding(ConstructorHelper::kEnd); | 481 constructor_helper.ReadUntilExcluding(ConstructorHelper::kEnd); |
482 TypedData& body_data = builder_.reader_->CopyDataToVMHeap( | |
483 Z, constructor_offset, builder_.ReaderOffset()); | |
484 function.set_kernel_body(body_data); | |
Kevin Millikin (Google)
2017/08/09 12:08:52
kernel_body (and body_data) are misleading names.
jensj
2017/08/10 07:37:34
Done.
| |
465 | 485 |
466 if (FLAG_enable_mirrors && constructor_helper.annotation_count_ > 0) { | 486 if (FLAG_enable_mirrors && constructor_helper.annotation_count_ > 0) { |
467 library.AddFunctionMetadata(function, TokenPosition::kNoSource, | 487 library.AddFunctionMetadata(function, TokenPosition::kNoSource, |
468 constructor_offset); | 488 constructor_offset, &body_data); |
469 } | 489 } |
470 } | 490 } |
471 class_helper.SetJustRead(ClassHelper::kConstructors); | 491 class_helper.SetJustRead(ClassHelper::kConstructors); |
472 | 492 |
473 class_helper.ReadUntilExcluding(ClassHelper::kProcedures); | 493 class_helper.ReadUntilExcluding(ClassHelper::kProcedures); |
474 int procedure_count = builder_.ReadListLength(); // read list length. | 494 int procedure_count = builder_.ReadListLength(); // read list length. |
475 for (intptr_t i = 0; i < procedure_count; ++i) { | 495 for (intptr_t i = 0; i < procedure_count; ++i) { |
476 ReadProcedure(library, klass, true); | 496 ReadProcedure(library, klass, true); |
477 } | 497 } |
478 class_helper.SetJustRead(ClassHelper::kProcedures); | 498 class_helper.SetJustRead(ClassHelper::kProcedures); |
479 | 499 |
480 klass.SetFunctions(Array::Handle(MakeFunctionsArray())); | 500 klass.SetFunctions(Array::Handle(MakeFunctionsArray())); |
481 | 501 |
482 if (!klass.is_marked_for_parsing()) { | 502 if (!klass.is_marked_for_parsing()) { |
483 klass.set_is_marked_for_parsing(); | 503 klass.set_is_marked_for_parsing(); |
484 } | 504 } |
485 | 505 |
486 if (FLAG_enable_mirrors && class_helper.annotation_count_ > 0) { | 506 if (FLAG_enable_mirrors && class_helper.annotation_count_ > 0) { |
507 TypedData& header_data = builder_.reader_->CopyDataToVMHeap( | |
508 Z, class_offset, class_offset_after_annotations); | |
487 library.AddClassMetadata(klass, toplevel_class, TokenPosition::kNoSource, | 509 library.AddClassMetadata(klass, toplevel_class, TokenPosition::kNoSource, |
488 class_offset); | 510 class_offset, &header_data); |
489 } | 511 } |
490 | 512 |
491 class_helper.ReadUntilExcluding(ClassHelper::kEnd); | 513 class_helper.ReadUntilExcluding(ClassHelper::kEnd); |
492 | 514 |
493 return klass; | 515 return klass; |
494 } | 516 } |
495 | 517 |
496 void KernelReader::ReadProcedure(const dart::Library& library, | 518 void KernelReader::ReadProcedure(const dart::Library& library, |
497 const dart::Class& owner, | 519 const dart::Class& owner, |
498 bool in_class) { | 520 bool in_class) { |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
627 function_node_helper.ReadUntilExcluding(FunctionNodeHelper::kEnd); | 649 function_node_helper.ReadUntilExcluding(FunctionNodeHelper::kEnd); |
628 procedure_helper.SetJustRead(ProcedureHelper::kFunction); | 650 procedure_helper.SetJustRead(ProcedureHelper::kFunction); |
629 | 651 |
630 if (!in_class) { | 652 if (!in_class) { |
631 library.AddObject(function, name); | 653 library.AddObject(function, name); |
632 ASSERT(!Object::Handle( | 654 ASSERT(!Object::Handle( |
633 Z, library.LookupObjectAllowPrivate( | 655 Z, library.LookupObjectAllowPrivate( |
634 H.DartProcedureName(procedure_helper.canonical_name_))) | 656 H.DartProcedureName(procedure_helper.canonical_name_))) |
635 .IsNull()); | 657 .IsNull()); |
636 } | 658 } |
659 | |
660 procedure_helper.ReadUntilExcluding(ProcedureHelper::kEnd); | |
661 TypedData& body_data = builder_.reader_->CopyDataToVMHeap( | |
662 Z, procedure_offset, builder_.ReaderOffset()); | |
663 function.set_kernel_body(body_data); | |
664 | |
637 if (FLAG_enable_mirrors && annotation_count > 0) { | 665 if (FLAG_enable_mirrors && annotation_count > 0) { |
638 library.AddFunctionMetadata(function, TokenPosition::kNoSource, | 666 library.AddFunctionMetadata(function, TokenPosition::kNoSource, |
639 procedure_offset); | 667 procedure_offset, &body_data); |
640 } | 668 } |
641 | |
642 procedure_helper.ReadUntilExcluding(ProcedureHelper::kEnd); | |
643 } | 669 } |
644 | 670 |
645 template <typename U> | 671 template <typename U> |
646 void KernelReader::ReadAndSetupTypeParameters( | 672 void KernelReader::ReadAndSetupTypeParameters( |
647 U* set_on, | 673 U* set_on, |
648 intptr_t type_parameter_count, | 674 intptr_t type_parameter_count, |
649 const Class& parameterized_class, | 675 const Class& parameterized_class, |
650 const Function& parameterized_function) { | 676 const Function& parameterized_function) { |
651 if (type_parameter_count > 0) { | 677 if (type_parameter_count > 0) { |
652 // First setup the type parameters, so if any of the following code uses it | 678 // First setup the type parameters, so if any of the following code uses it |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
708 | 734 |
709 Script& KernelReader::ScriptAt(intptr_t index, StringIndex import_uri) { | 735 Script& KernelReader::ScriptAt(intptr_t index, StringIndex import_uri) { |
710 Script& script = Script::ZoneHandle(Z); | 736 Script& script = Script::ZoneHandle(Z); |
711 script ^= scripts_.At(index); | 737 script ^= scripts_.At(index); |
712 if (script.IsNull()) { | 738 if (script.IsNull()) { |
713 // Create script with correct uri(s). | 739 // Create script with correct uri(s). |
714 dart::String& uri_string = builder_.SourceTableUriFor(index); | 740 dart::String& uri_string = builder_.SourceTableUriFor(index); |
715 dart::String& import_uri_string = | 741 dart::String& import_uri_string = |
716 import_uri == -1 ? uri_string : H.DartString(import_uri, Heap::kOld); | 742 import_uri == -1 ? uri_string : H.DartString(import_uri, Heap::kOld); |
717 script = Script::New(import_uri_string, uri_string, | 743 script = Script::New(import_uri_string, uri_string, |
718 String::Handle(String::null()), RawScript::kKernelTag); | 744 builder_.GetSourceFor(index), RawScript::kKernelTag); |
719 script.set_kernel_data(program_->kernel_data()); | |
720 script.set_kernel_data_size(program_->kernel_data_size()); | |
721 script.set_kernel_script_index(index); | 745 script.set_kernel_script_index(index); |
722 script.set_kernel_string_offsets(H.string_offsets()); | 746 script.set_kernel_string_offsets(H.string_offsets()); |
723 script.set_kernel_string_data(H.string_data()); | 747 script.set_kernel_string_data(H.string_data()); |
724 script.set_kernel_canonical_names(H.canonical_names()); | 748 script.set_kernel_canonical_names(H.canonical_names()); |
725 scripts_.SetAt(index, script); | 749 scripts_.SetAt(index, script); |
726 | 750 |
727 script.set_line_starts(Array::Handle(Array::null())); | 751 script.set_line_starts(builder_.GetLineStartsFor(index)); |
728 script.set_debug_positions(Array::Handle(Array::null())); | 752 script.set_debug_positions(Array::Handle(Array::null())); |
729 script.set_yield_positions(Array::Handle(Array::null())); | 753 script.set_yield_positions(Array::Handle(Array::null())); |
730 } | 754 } |
731 return script; | 755 return script; |
732 } | 756 } |
733 | 757 |
734 void KernelReader::GenerateFieldAccessors(const dart::Class& klass, | 758 void KernelReader::GenerateFieldAccessors(const dart::Class& klass, |
735 const dart::Field& field, | 759 const dart::Field& field, |
736 FieldHelper* field_helper, | 760 FieldHelper* field_helper, |
737 intptr_t field_offset) { | 761 intptr_t field_offset) { |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
783 // that are const (not just final) and they have is_const for | 807 // that are const (not just final) and they have is_const for |
784 // non-static | 808 // non-static |
785 // fields that are final. | 809 // fields that are final. |
786 field_helper->IsStatic() ? field_helper->IsConst() | 810 field_helper->IsStatic() ? field_helper->IsConst() |
787 : field_helper->IsFinal(), | 811 : field_helper->IsFinal(), |
788 false, // is_abstract | 812 false, // is_abstract |
789 false, // is_external | 813 false, // is_external |
790 false, // is_native | 814 false, // is_native |
791 script_class, field_helper->position_)); | 815 script_class, field_helper->position_)); |
792 functions_.Add(&getter); | 816 functions_.Add(&getter); |
817 getter.set_kernel_body(TypedData::Handle(Z, field.kernel_body())); | |
793 getter.set_end_token_pos(field_helper->end_position_); | 818 getter.set_end_token_pos(field_helper->end_position_); |
794 getter.set_kernel_offset(field_offset); | 819 getter.set_kernel_offset(field_offset); |
795 getter.set_result_type(AbstractType::Handle(Z, field.type())); | 820 getter.set_result_type(AbstractType::Handle(Z, field.type())); |
796 getter.set_is_debuggable(false); | 821 getter.set_is_debuggable(false); |
797 SetupFieldAccessorFunction(klass, getter); | 822 SetupFieldAccessorFunction(klass, getter); |
798 | 823 |
799 if (!field_helper->IsStatic() && !field_helper->IsFinal()) { | 824 if (!field_helper->IsStatic() && !field_helper->IsFinal()) { |
800 // Only static fields can be const. | 825 // Only static fields can be const. |
801 ASSERT(!field_helper->IsConst()); | 826 ASSERT(!field_helper->IsConst()); |
802 const dart::String& setter_name = | 827 const dart::String& setter_name = |
803 H.DartSetterName(field_helper->canonical_name_); | 828 H.DartSetterName(field_helper->canonical_name_); |
804 Function& setter = Function::ZoneHandle( | 829 Function& setter = Function::ZoneHandle( |
805 Z, Function::New(setter_name, RawFunction::kImplicitSetter, | 830 Z, Function::New(setter_name, RawFunction::kImplicitSetter, |
806 false, // is_static | 831 false, // is_static |
807 false, // is_const | 832 false, // is_const |
808 false, // is_abstract | 833 false, // is_abstract |
809 false, // is_external | 834 false, // is_external |
810 false, // is_native | 835 false, // is_native |
811 script_class, field_helper->position_)); | 836 script_class, field_helper->position_)); |
812 functions_.Add(&setter); | 837 functions_.Add(&setter); |
838 setter.set_kernel_body(TypedData::Handle(Z, field.kernel_body())); | |
813 setter.set_end_token_pos(field_helper->end_position_); | 839 setter.set_end_token_pos(field_helper->end_position_); |
814 setter.set_kernel_offset(field_offset); | 840 setter.set_kernel_offset(field_offset); |
815 setter.set_result_type(Object::void_type()); | 841 setter.set_result_type(Object::void_type()); |
816 setter.set_is_debuggable(false); | 842 setter.set_is_debuggable(false); |
817 SetupFieldAccessorFunction(klass, setter); | 843 SetupFieldAccessorFunction(klass, setter); |
818 } | 844 } |
819 } | 845 } |
820 | 846 |
821 void KernelReader::SetupFieldAccessorFunction(const dart::Class& klass, | 847 void KernelReader::SetupFieldAccessorFunction(const dart::Class& klass, |
822 const dart::Function& function) { | 848 const dart::Function& function) { |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
900 bool KernelReader::FieldHasFunctionLiteralInitializer(const dart::Field& field, | 926 bool KernelReader::FieldHasFunctionLiteralInitializer(const dart::Field& field, |
901 TokenPosition* start, | 927 TokenPosition* start, |
902 TokenPosition* end) { | 928 TokenPosition* end) { |
903 dart::Zone* zone = Thread::Current()->zone(); | 929 dart::Zone* zone = Thread::Current()->zone(); |
904 const Script& script = Script::Handle(zone, field.Script()); | 930 const Script& script = Script::Handle(zone, field.Script()); |
905 | 931 |
906 TranslationHelper translation_helper( | 932 TranslationHelper translation_helper( |
907 Thread::Current(), script.kernel_string_offsets(), | 933 Thread::Current(), script.kernel_string_offsets(), |
908 script.kernel_string_data(), script.kernel_canonical_names()); | 934 script.kernel_string_data(), script.kernel_canonical_names()); |
909 | 935 |
910 kernel::StreamingFlowGraphBuilder* builder = | 936 StreamingFlowGraphBuilder builder( |
911 new kernel::StreamingFlowGraphBuilder(&translation_helper, zone, | 937 &translation_helper, zone, field.kernel_offset(), |
912 script.kernel_data(), | 938 TypedData::Handle(zone, field.kernel_body())); |
913 script.kernel_data_size()); | 939 kernel::FieldHelper field_helper(&builder); |
914 | |
915 kernel::FieldHelper field_helper(builder, field.kernel_offset()); | |
916 field_helper.ReadUntilExcluding(kernel::FieldHelper::kEnd, true); | 940 field_helper.ReadUntilExcluding(kernel::FieldHelper::kEnd, true); |
917 bool result = field_helper.FieldHasFunctionLiteralInitializer(start, end); | 941 return field_helper.FieldHasFunctionLiteralInitializer(start, end); |
918 | |
919 delete builder; | |
920 return result; | |
921 } | 942 } |
922 | 943 |
923 ParsedFunction* ParseStaticFieldInitializer(Zone* zone, | 944 ParsedFunction* ParseStaticFieldInitializer(Zone* zone, |
924 const dart::Field& field) { | 945 const dart::Field& field) { |
925 Thread* thread = Thread::Current(); | 946 Thread* thread = Thread::Current(); |
926 | 947 |
927 dart::String& init_name = dart::String::Handle(zone, field.name()); | 948 dart::String& init_name = dart::String::Handle(zone, field.name()); |
928 init_name = Symbols::FromConcat(thread, Symbols::InitPrefix(), init_name); | 949 init_name = Symbols::FromConcat(thread, Symbols::InitPrefix(), init_name); |
929 | 950 |
930 // Create a static initializer. | 951 // Create a static initializer. |
931 const Object& owner = Object::Handle(field.RawOwner()); | 952 const Object& owner = Object::Handle(field.RawOwner()); |
932 const Function& initializer_fun = Function::ZoneHandle( | 953 const Function& initializer_fun = Function::ZoneHandle( |
933 zone, | 954 zone, |
934 dart::Function::New(init_name, RawFunction::kImplicitStaticFinalGetter, | 955 dart::Function::New(init_name, RawFunction::kImplicitStaticFinalGetter, |
935 true, // is_static | 956 true, // is_static |
936 false, // is_const | 957 false, // is_const |
937 false, // is_abstract | 958 false, // is_abstract |
938 false, // is_external | 959 false, // is_external |
939 false, // is_native | 960 false, // is_native |
940 owner, TokenPosition::kNoSource)); | 961 owner, TokenPosition::kNoSource)); |
962 initializer_fun.set_kernel_body(TypedData::Handle(zone, field.kernel_body())); | |
941 initializer_fun.set_kernel_offset(field.kernel_offset()); | 963 initializer_fun.set_kernel_offset(field.kernel_offset()); |
942 initializer_fun.set_result_type(AbstractType::Handle(zone, field.type())); | 964 initializer_fun.set_result_type(AbstractType::Handle(zone, field.type())); |
943 initializer_fun.set_is_debuggable(false); | 965 initializer_fun.set_is_debuggable(false); |
944 initializer_fun.set_is_reflectable(false); | 966 initializer_fun.set_is_reflectable(false); |
945 initializer_fun.set_is_inlinable(false); | 967 initializer_fun.set_is_inlinable(false); |
946 return new (zone) ParsedFunction(thread, initializer_fun); | 968 return new (zone) ParsedFunction(thread, initializer_fun); |
947 } | 969 } |
948 | 970 |
949 } // namespace kernel | 971 } // namespace kernel |
950 } // namespace dart | 972 } // namespace dart |
951 #endif // !defined(DART_PRECOMPILED_RUNTIME) | 973 #endif // !defined(DART_PRECOMPILED_RUNTIME) |
OLD | NEW |