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

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

Issue 2972343002: [kernel] Insert kernel bodies into VM heap (Closed)
Patch Set: Review comments Created 3 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « runtime/vm/kernel_binary_flowgraph.cc ('k') | runtime/vm/kernel_to_il.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 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 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
148 TypedData& offsets = TypedData::Handle( 148 TypedData& offsets = TypedData::Handle(
149 Z, TypedData::New(kTypedDataUint32ArrayCid, count, Heap::kOld)); 149 Z, TypedData::New(kTypedDataUint32ArrayCid, count, Heap::kOld));
150 offsets.SetUint32(0, 0); 150 offsets.SetUint32(0, 0);
151 intptr_t end_offset = 0; 151 intptr_t end_offset = 0;
152 for (intptr_t i = 1; i < count; ++i) { 152 for (intptr_t i = 1; i < count; ++i) {
153 end_offset = reader.ReadUInt(); 153 end_offset = reader.ReadUInt();
154 offsets.SetUint32(i << 2, end_offset); 154 offsets.SetUint32(i << 2, end_offset);
155 } 155 }
156 156
157 // Copy the string data out of the binary and into the VM's heap. 157 // Copy the string data out of the binary and into the VM's heap.
158 TypedData& data = TypedData::Handle( 158 TypedData& data =
159 Z, TypedData::New(kTypedDataUint8ArrayCid, end_offset, Heap::kOld)); 159 reader.CopyDataToVMHeap(Z, reader.offset(), reader.offset() + end_offset);
160 {
161 NoSafepointScope no_safepoint;
162 memmove(data.DataAddr(0), reader.buffer() + reader.offset(), end_offset);
163 }
164 160
165 // Copy the canonical names into the VM's heap. Encode them as unsigned, so 161 // Copy the canonical names into the VM's heap. Encode them as unsigned, so
166 // the parent indexes are adjusted when extracted. 162 // the parent indexes are adjusted when extracted.
167 reader.set_offset(program->name_table_offset()); 163 reader.set_offset(program->name_table_offset());
168 count = reader.ReadUInt() * 2; 164 count = reader.ReadUInt() * 2;
169 TypedData& names = TypedData::Handle( 165 TypedData& names = TypedData::Handle(
170 Z, TypedData::New(kTypedDataUint32ArrayCid, count, Heap::kOld)); 166 Z, TypedData::New(kTypedDataUint32ArrayCid, count, Heap::kOld));
171 for (intptr_t i = 0; i < count; ++i) { 167 for (intptr_t i = 0; i < count; ++i) {
172 names.SetUint32(i << 2, reader.ReadUInt()); 168 names.SetUint32(i << 2, reader.ReadUInt());
173 } 169 }
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
275 ClassForScriptAt(toplevel_class, field_helper.source_uri_index_); 271 ClassForScriptAt(toplevel_class, field_helper.source_uri_index_);
276 dart::Field& field = dart::Field::Handle( 272 dart::Field& field = dart::Field::Handle(
277 Z, dart::Field::NewTopLevel(name, field_helper.IsFinal(), 273 Z, dart::Field::NewTopLevel(name, field_helper.IsFinal(),
278 field_helper.IsConst(), script_class, 274 field_helper.IsConst(), script_class,
279 field_helper.position_)); 275 field_helper.position_));
280 field.set_kernel_offset(field_offset); 276 field.set_kernel_offset(field_offset);
281 const AbstractType& type = T.BuildType(); // read type. 277 const AbstractType& type = T.BuildType(); // read type.
282 field.SetFieldType(type); 278 field.SetFieldType(type);
283 field_helper.SetJustRead(FieldHelper::kType); 279 field_helper.SetJustRead(FieldHelper::kType);
284 field_helper.ReadUntilExcluding(FieldHelper::kInitializer); 280 field_helper.ReadUntilExcluding(FieldHelper::kInitializer);
281 intptr_t field_initializer_offset = builder_.ReaderOffset();
285 field.set_has_initializer(builder_.PeekTag() == kSomething); 282 field.set_has_initializer(builder_.PeekTag() == kSomething);
286 GenerateFieldAccessors(toplevel_class, field, &field_helper, field_offset);
287 field_helper.ReadUntilExcluding(FieldHelper::kEnd); 283 field_helper.ReadUntilExcluding(FieldHelper::kEnd);
284 TypedData& kernel_data = builder_.reader_->CopyDataToVMHeap(
285 Z, field_offset, builder_.ReaderOffset());
286 field.set_kernel_data(kernel_data);
287 {
288 // GenerateFieldAccessors reads (some of) the initializer.
289 AlternativeReadingScope alt(builder_.reader_, field_initializer_offset);
290 GenerateFieldAccessors(toplevel_class, field, &field_helper,
291 field_offset);
292 }
288 if (FLAG_enable_mirrors && field_helper.annotation_count_ > 0) { 293 if (FLAG_enable_mirrors && field_helper.annotation_count_ > 0) {
289 library.AddFieldMetadata(field, TokenPosition::kNoSource, field_offset); 294 library.AddFieldMetadata(field, TokenPosition::kNoSource, field_offset,
295 &kernel_data);
290 } 296 }
291 fields_.Add(&field); 297 fields_.Add(&field);
292 library.AddObject(field, name); 298 library.AddObject(field, name);
293 } 299 }
294 toplevel_class.AddFields(fields_); 300 toplevel_class.AddFields(fields_);
295 301
296 // Load toplevel procedures. 302 // Load toplevel procedures.
297 intptr_t procedure_count = builder_.ReadListLength(); // read list length. 303 intptr_t procedure_count = builder_.ReadListLength(); // read list length.
298 for (intptr_t i = 0; i < procedure_count; ++i) { 304 for (intptr_t i = 0; i < procedure_count; ++i) {
299 ReadProcedure(library, toplevel_class, false); 305 ReadProcedure(library, toplevel_class, false);
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
356 // a script to detect test functions that should not be optimized. 362 // a script to detect test functions that should not be optimized.
357 if (klass.script() == Script::null()) { 363 if (klass.script() == Script::null()) {
358 class_helper.ReadUntilIncluding(ClassHelper::kSourceUriIndex); 364 class_helper.ReadUntilIncluding(ClassHelper::kSourceUriIndex);
359 klass.set_script(ScriptAt(class_helper.source_uri_index_)); 365 klass.set_script(ScriptAt(class_helper.source_uri_index_));
360 } 366 }
361 if (klass.token_pos() == TokenPosition::kNoSource) { 367 if (klass.token_pos() == TokenPosition::kNoSource) {
362 class_helper.ReadUntilIncluding(ClassHelper::kPosition); 368 class_helper.ReadUntilIncluding(ClassHelper::kPosition);
363 klass.set_token_pos(class_helper.position_); 369 klass.set_token_pos(class_helper.position_);
364 } 370 }
365 371
372 class_helper.ReadUntilIncluding(ClassHelper::kAnnotations);
373 intptr_t class_offset_after_annotations = builder_.ReaderOffset();
366 class_helper.ReadUntilExcluding(ClassHelper::kTypeParameters); 374 class_helper.ReadUntilExcluding(ClassHelper::kTypeParameters);
367 intptr_t type_parameter_counts = 375 intptr_t type_parameter_counts =
368 builder_.ReadListLength(); // read type_parameters list length. 376 builder_.ReadListLength(); // read type_parameters list length.
369 377
370 ActiveClassScope active_class_scope(&active_class_, &klass); 378 ActiveClassScope active_class_scope(&active_class_, &klass);
371 if (!klass.is_cycle_free()) { 379 if (!klass.is_cycle_free()) {
372 ReadPreliminaryClass(&klass, &class_helper, type_parameter_counts); 380 ReadPreliminaryClass(&klass, &class_helper, type_parameter_counts);
373 } else { 381 } else {
374 for (intptr_t i = 0; i < type_parameter_counts; ++i) { 382 for (intptr_t i = 0; i < type_parameter_counts; ++i) {
375 builder_.SkipStringReference(); // read ith name index. 383 builder_.SkipStringReference(); // read ith name index.
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
412 Z, 420 Z,
413 dart::Field::New(name, field_helper.IsStatic(), 421 dart::Field::New(name, field_helper.IsStatic(),
414 // In the VM all const fields are implicitly final 422 // In the VM all const fields are implicitly final
415 // whereas in Kernel they are not final because they 423 // whereas in Kernel they are not final because they
416 // are not explicitly declared that way. 424 // are not explicitly declared that way.
417 field_helper.IsFinal() || field_helper.IsConst(), 425 field_helper.IsFinal() || field_helper.IsConst(),
418 field_helper.IsConst(), is_reflectable, script_class, 426 field_helper.IsConst(), is_reflectable, script_class,
419 type, field_helper.position_)); 427 type, field_helper.position_));
420 field.set_kernel_offset(field_offset); 428 field.set_kernel_offset(field_offset);
421 field_helper.ReadUntilExcluding(FieldHelper::kInitializer); 429 field_helper.ReadUntilExcluding(FieldHelper::kInitializer);
430 intptr_t field_initializer_offset = builder_.ReaderOffset();
422 field.set_has_initializer(builder_.PeekTag() == kSomething); 431 field.set_has_initializer(builder_.PeekTag() == kSomething);
423 GenerateFieldAccessors(klass, field, &field_helper, field_offset);
424 field_helper.ReadUntilExcluding(FieldHelper::kEnd); 432 field_helper.ReadUntilExcluding(FieldHelper::kEnd);
433 TypedData& kernel_data = builder_.reader_->CopyDataToVMHeap(
434 Z, field_offset, builder_.ReaderOffset());
435 field.set_kernel_data(kernel_data);
436 {
437 // GenerateFieldAccessors reads (some of) the initializer.
438 AlternativeReadingScope alt(builder_.reader_, field_initializer_offset);
439 GenerateFieldAccessors(klass, field, &field_helper, field_offset);
440 }
425 if (FLAG_enable_mirrors && field_helper.annotation_count_ > 0) { 441 if (FLAG_enable_mirrors && field_helper.annotation_count_ > 0) {
426 library.AddFieldMetadata(field, TokenPosition::kNoSource, field_offset); 442 library.AddFieldMetadata(field, TokenPosition::kNoSource, field_offset,
443 &kernel_data);
427 } 444 }
428 fields_.Add(&field); 445 fields_.Add(&field);
429 } 446 }
430 klass.AddFields(fields_); 447 klass.AddFields(fields_);
431 class_helper.SetJustRead(ClassHelper::kFields); 448 class_helper.SetJustRead(ClassHelper::kFields);
432 } 449 }
433 450
434 class_helper.ReadUntilExcluding(ClassHelper::kConstructors); 451 class_helper.ReadUntilExcluding(ClassHelper::kConstructors);
435 int constructor_count = builder_.ReadListLength(); // read list length. 452 int constructor_count = builder_.ReadListLength(); // read list length.
436 for (intptr_t i = 0; i < constructor_count; ++i) { 453 for (intptr_t i = 0; i < constructor_count; ++i) {
(...skipping 20 matching lines...) Expand all
457 FunctionNodeHelper function_node_helper(&builder_); 474 FunctionNodeHelper function_node_helper(&builder_);
458 function_node_helper.ReadUntilExcluding( 475 function_node_helper.ReadUntilExcluding(
459 FunctionNodeHelper::kRequiredParameterCount); 476 FunctionNodeHelper::kRequiredParameterCount);
460 builder_.SetupFunctionParameters(klass, function, 477 builder_.SetupFunctionParameters(klass, function,
461 true, // is_method 478 true, // is_method
462 false, // is_closure 479 false, // is_closure
463 &function_node_helper); 480 &function_node_helper);
464 function_node_helper.ReadUntilExcluding(FunctionNodeHelper::kEnd); 481 function_node_helper.ReadUntilExcluding(FunctionNodeHelper::kEnd);
465 constructor_helper.SetJustRead(ConstructorHelper::kFunction); 482 constructor_helper.SetJustRead(ConstructorHelper::kFunction);
466 constructor_helper.ReadUntilExcluding(ConstructorHelper::kEnd); 483 constructor_helper.ReadUntilExcluding(ConstructorHelper::kEnd);
484 TypedData& kernel_data = builder_.reader_->CopyDataToVMHeap(
485 Z, constructor_offset, builder_.ReaderOffset());
486 function.set_kernel_data(kernel_data);
467 487
468 if (FLAG_enable_mirrors && constructor_helper.annotation_count_ > 0) { 488 if (FLAG_enable_mirrors && constructor_helper.annotation_count_ > 0) {
469 library.AddFunctionMetadata(function, TokenPosition::kNoSource, 489 library.AddFunctionMetadata(function, TokenPosition::kNoSource,
470 constructor_offset); 490 constructor_offset, &kernel_data);
471 } 491 }
472 } 492 }
473 class_helper.SetJustRead(ClassHelper::kConstructors); 493 class_helper.SetJustRead(ClassHelper::kConstructors);
474 494
475 class_helper.ReadUntilExcluding(ClassHelper::kProcedures); 495 class_helper.ReadUntilExcluding(ClassHelper::kProcedures);
476 int procedure_count = builder_.ReadListLength(); // read list length. 496 int procedure_count = builder_.ReadListLength(); // read list length.
477 for (intptr_t i = 0; i < procedure_count; ++i) { 497 for (intptr_t i = 0; i < procedure_count; ++i) {
478 ReadProcedure(library, klass, true); 498 ReadProcedure(library, klass, true);
479 } 499 }
480 class_helper.SetJustRead(ClassHelper::kProcedures); 500 class_helper.SetJustRead(ClassHelper::kProcedures);
481 501
482 klass.SetFunctions(Array::Handle(MakeFunctionsArray())); 502 klass.SetFunctions(Array::Handle(MakeFunctionsArray()));
483 503
484 if (!klass.is_marked_for_parsing()) { 504 if (!klass.is_marked_for_parsing()) {
485 klass.set_is_marked_for_parsing(); 505 klass.set_is_marked_for_parsing();
486 } 506 }
487 507
488 if (FLAG_enable_mirrors && class_helper.annotation_count_ > 0) { 508 if (FLAG_enable_mirrors && class_helper.annotation_count_ > 0) {
509 TypedData& header_data = builder_.reader_->CopyDataToVMHeap(
510 Z, class_offset, class_offset_after_annotations);
489 library.AddClassMetadata(klass, toplevel_class, TokenPosition::kNoSource, 511 library.AddClassMetadata(klass, toplevel_class, TokenPosition::kNoSource,
490 class_offset); 512 class_offset, &header_data);
491 } 513 }
492 514
493 class_helper.ReadUntilExcluding(ClassHelper::kEnd); 515 class_helper.ReadUntilExcluding(ClassHelper::kEnd);
494 516
495 return klass; 517 return klass;
496 } 518 }
497 519
498 void KernelReader::ReadProcedure(const dart::Library& library, 520 void KernelReader::ReadProcedure(const dart::Library& library,
499 const dart::Class& owner, 521 const dart::Class& owner,
500 bool in_class) { 522 bool in_class) {
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
629 function_node_helper.ReadUntilExcluding(FunctionNodeHelper::kEnd); 651 function_node_helper.ReadUntilExcluding(FunctionNodeHelper::kEnd);
630 procedure_helper.SetJustRead(ProcedureHelper::kFunction); 652 procedure_helper.SetJustRead(ProcedureHelper::kFunction);
631 653
632 if (!in_class) { 654 if (!in_class) {
633 library.AddObject(function, name); 655 library.AddObject(function, name);
634 ASSERT(!Object::Handle( 656 ASSERT(!Object::Handle(
635 Z, library.LookupObjectAllowPrivate( 657 Z, library.LookupObjectAllowPrivate(
636 H.DartProcedureName(procedure_helper.canonical_name_))) 658 H.DartProcedureName(procedure_helper.canonical_name_)))
637 .IsNull()); 659 .IsNull());
638 } 660 }
661
662 procedure_helper.ReadUntilExcluding(ProcedureHelper::kEnd);
663 TypedData& kernel_data = builder_.reader_->CopyDataToVMHeap(
664 Z, procedure_offset, builder_.ReaderOffset());
665 function.set_kernel_data(kernel_data);
666
639 if (FLAG_enable_mirrors && annotation_count > 0) { 667 if (FLAG_enable_mirrors && annotation_count > 0) {
640 library.AddFunctionMetadata(function, TokenPosition::kNoSource, 668 library.AddFunctionMetadata(function, TokenPosition::kNoSource,
641 procedure_offset); 669 procedure_offset, &kernel_data);
642 } 670 }
643
644 procedure_helper.ReadUntilExcluding(ProcedureHelper::kEnd);
645 } 671 }
646 672
647 void KernelReader::ReadAndSetupTypeParameters( 673 void KernelReader::ReadAndSetupTypeParameters(
648 const Object& set_on, 674 const Object& set_on,
649 intptr_t type_parameter_count, 675 intptr_t type_parameter_count,
650 const Class& parameterized_class, 676 const Class& parameterized_class,
651 const Function& parameterized_function) { 677 const Function& parameterized_function) {
652 ASSERT(type_parameter_count >= 0); 678 ASSERT(type_parameter_count >= 0);
653 if (type_parameter_count == 0) { 679 if (type_parameter_count == 0) {
654 return; 680 return;
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
721 747
722 Script& KernelReader::ScriptAt(intptr_t index, StringIndex import_uri) { 748 Script& KernelReader::ScriptAt(intptr_t index, StringIndex import_uri) {
723 Script& script = Script::ZoneHandle(Z); 749 Script& script = Script::ZoneHandle(Z);
724 script ^= scripts_.At(index); 750 script ^= scripts_.At(index);
725 if (script.IsNull()) { 751 if (script.IsNull()) {
726 // Create script with correct uri(s). 752 // Create script with correct uri(s).
727 dart::String& uri_string = builder_.SourceTableUriFor(index); 753 dart::String& uri_string = builder_.SourceTableUriFor(index);
728 dart::String& import_uri_string = 754 dart::String& import_uri_string =
729 import_uri == -1 ? uri_string : H.DartString(import_uri, Heap::kOld); 755 import_uri == -1 ? uri_string : H.DartString(import_uri, Heap::kOld);
730 script = Script::New(import_uri_string, uri_string, 756 script = Script::New(import_uri_string, uri_string,
731 String::Handle(String::null()), RawScript::kKernelTag); 757 builder_.GetSourceFor(index), RawScript::kKernelTag);
732 script.set_kernel_data(program_->kernel_data());
733 script.set_kernel_data_size(program_->kernel_data_size());
734 script.set_kernel_script_index(index); 758 script.set_kernel_script_index(index);
735 script.set_kernel_string_offsets(H.string_offsets()); 759 script.set_kernel_string_offsets(H.string_offsets());
736 script.set_kernel_string_data(H.string_data()); 760 script.set_kernel_string_data(H.string_data());
737 script.set_kernel_canonical_names(H.canonical_names()); 761 script.set_kernel_canonical_names(H.canonical_names());
738 scripts_.SetAt(index, script); 762 scripts_.SetAt(index, script);
739 763
740 script.set_line_starts(Array::Handle(Array::null())); 764 script.set_line_starts(builder_.GetLineStartsFor(index));
741 script.set_debug_positions(Array::Handle(Array::null())); 765 script.set_debug_positions(Array::Handle(Array::null()));
742 script.set_yield_positions(Array::Handle(Array::null())); 766 script.set_yield_positions(Array::Handle(Array::null()));
743 } 767 }
744 return script; 768 return script;
745 } 769 }
746 770
747 void KernelReader::GenerateFieldAccessors(const dart::Class& klass, 771 void KernelReader::GenerateFieldAccessors(const dart::Class& klass,
748 const dart::Field& field, 772 const dart::Field& field,
749 FieldHelper* field_helper, 773 FieldHelper* field_helper,
750 intptr_t field_offset) { 774 intptr_t field_offset) {
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
796 // that are const (not just final) and they have is_const for 820 // that are const (not just final) and they have is_const for
797 // non-static 821 // non-static
798 // fields that are final. 822 // fields that are final.
799 field_helper->IsStatic() ? field_helper->IsConst() 823 field_helper->IsStatic() ? field_helper->IsConst()
800 : field_helper->IsFinal(), 824 : field_helper->IsFinal(),
801 false, // is_abstract 825 false, // is_abstract
802 false, // is_external 826 false, // is_external
803 false, // is_native 827 false, // is_native
804 script_class, field_helper->position_)); 828 script_class, field_helper->position_));
805 functions_.Add(&getter); 829 functions_.Add(&getter);
830 getter.set_kernel_data(TypedData::Handle(Z, field.kernel_data()));
806 getter.set_end_token_pos(field_helper->end_position_); 831 getter.set_end_token_pos(field_helper->end_position_);
807 getter.set_kernel_offset(field_offset); 832 getter.set_kernel_offset(field_offset);
808 getter.set_result_type(AbstractType::Handle(Z, field.type())); 833 getter.set_result_type(AbstractType::Handle(Z, field.type()));
809 getter.set_is_debuggable(false); 834 getter.set_is_debuggable(false);
810 SetupFieldAccessorFunction(klass, getter); 835 SetupFieldAccessorFunction(klass, getter);
811 836
812 if (!field_helper->IsStatic() && !field_helper->IsFinal()) { 837 if (!field_helper->IsStatic() && !field_helper->IsFinal()) {
813 // Only static fields can be const. 838 // Only static fields can be const.
814 ASSERT(!field_helper->IsConst()); 839 ASSERT(!field_helper->IsConst());
815 const dart::String& setter_name = 840 const dart::String& setter_name =
816 H.DartSetterName(field_helper->canonical_name_); 841 H.DartSetterName(field_helper->canonical_name_);
817 Function& setter = Function::ZoneHandle( 842 Function& setter = Function::ZoneHandle(
818 Z, Function::New(setter_name, RawFunction::kImplicitSetter, 843 Z, Function::New(setter_name, RawFunction::kImplicitSetter,
819 false, // is_static 844 false, // is_static
820 false, // is_const 845 false, // is_const
821 false, // is_abstract 846 false, // is_abstract
822 false, // is_external 847 false, // is_external
823 false, // is_native 848 false, // is_native
824 script_class, field_helper->position_)); 849 script_class, field_helper->position_));
825 functions_.Add(&setter); 850 functions_.Add(&setter);
851 setter.set_kernel_data(TypedData::Handle(Z, field.kernel_data()));
826 setter.set_end_token_pos(field_helper->end_position_); 852 setter.set_end_token_pos(field_helper->end_position_);
827 setter.set_kernel_offset(field_offset); 853 setter.set_kernel_offset(field_offset);
828 setter.set_result_type(Object::void_type()); 854 setter.set_result_type(Object::void_type());
829 setter.set_is_debuggable(false); 855 setter.set_is_debuggable(false);
830 SetupFieldAccessorFunction(klass, setter); 856 SetupFieldAccessorFunction(klass, setter);
831 } 857 }
832 } 858 }
833 859
834 void KernelReader::SetupFieldAccessorFunction(const dart::Class& klass, 860 void KernelReader::SetupFieldAccessorFunction(const dart::Class& klass,
835 const dart::Function& function) { 861 const dart::Function& function) {
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
913 bool KernelReader::FieldHasFunctionLiteralInitializer(const dart::Field& field, 939 bool KernelReader::FieldHasFunctionLiteralInitializer(const dart::Field& field,
914 TokenPosition* start, 940 TokenPosition* start,
915 TokenPosition* end) { 941 TokenPosition* end) {
916 dart::Zone* zone = Thread::Current()->zone(); 942 dart::Zone* zone = Thread::Current()->zone();
917 const Script& script = Script::Handle(zone, field.Script()); 943 const Script& script = Script::Handle(zone, field.Script());
918 944
919 TranslationHelper translation_helper( 945 TranslationHelper translation_helper(
920 Thread::Current(), script.kernel_string_offsets(), 946 Thread::Current(), script.kernel_string_offsets(),
921 script.kernel_string_data(), script.kernel_canonical_names()); 947 script.kernel_string_data(), script.kernel_canonical_names());
922 948
923 kernel::StreamingFlowGraphBuilder* builder = 949 StreamingFlowGraphBuilder builder(
924 new kernel::StreamingFlowGraphBuilder(&translation_helper, zone, 950 &translation_helper, zone, field.kernel_offset(),
925 script.kernel_data(), 951 TypedData::Handle(zone, field.kernel_data()));
926 script.kernel_data_size()); 952 kernel::FieldHelper field_helper(&builder);
927
928 kernel::FieldHelper field_helper(builder, field.kernel_offset());
929 field_helper.ReadUntilExcluding(kernel::FieldHelper::kEnd, true); 953 field_helper.ReadUntilExcluding(kernel::FieldHelper::kEnd, true);
930 bool result = field_helper.FieldHasFunctionLiteralInitializer(start, end); 954 return field_helper.FieldHasFunctionLiteralInitializer(start, end);
931
932 delete builder;
933 return result;
934 } 955 }
935 956
936 ParsedFunction* ParseStaticFieldInitializer(Zone* zone, 957 ParsedFunction* ParseStaticFieldInitializer(Zone* zone,
937 const dart::Field& field) { 958 const dart::Field& field) {
938 Thread* thread = Thread::Current(); 959 Thread* thread = Thread::Current();
939 960
940 dart::String& init_name = dart::String::Handle(zone, field.name()); 961 dart::String& init_name = dart::String::Handle(zone, field.name());
941 init_name = Symbols::FromConcat(thread, Symbols::InitPrefix(), init_name); 962 init_name = Symbols::FromConcat(thread, Symbols::InitPrefix(), init_name);
942 963
943 // Create a static initializer. 964 // Create a static initializer.
944 const Object& owner = Object::Handle(field.RawOwner()); 965 const Object& owner = Object::Handle(field.RawOwner());
945 const Function& initializer_fun = Function::ZoneHandle( 966 const Function& initializer_fun = Function::ZoneHandle(
946 zone, 967 zone,
947 dart::Function::New(init_name, RawFunction::kImplicitStaticFinalGetter, 968 dart::Function::New(init_name, RawFunction::kImplicitStaticFinalGetter,
948 true, // is_static 969 true, // is_static
949 false, // is_const 970 false, // is_const
950 false, // is_abstract 971 false, // is_abstract
951 false, // is_external 972 false, // is_external
952 false, // is_native 973 false, // is_native
953 owner, TokenPosition::kNoSource)); 974 owner, TokenPosition::kNoSource));
975 initializer_fun.set_kernel_data(TypedData::Handle(zone, field.kernel_data()));
954 initializer_fun.set_kernel_offset(field.kernel_offset()); 976 initializer_fun.set_kernel_offset(field.kernel_offset());
955 initializer_fun.set_result_type(AbstractType::Handle(zone, field.type())); 977 initializer_fun.set_result_type(AbstractType::Handle(zone, field.type()));
956 initializer_fun.set_is_debuggable(false); 978 initializer_fun.set_is_debuggable(false);
957 initializer_fun.set_is_reflectable(false); 979 initializer_fun.set_is_reflectable(false);
958 initializer_fun.set_is_inlinable(false); 980 initializer_fun.set_is_inlinable(false);
959 return new (zone) ParsedFunction(thread, initializer_fun); 981 return new (zone) ParsedFunction(thread, initializer_fun);
960 } 982 }
961 983
962 } // namespace kernel 984 } // namespace kernel
963 } // namespace dart 985 } // namespace dart
964 #endif // !defined(DART_PRECOMPILED_RUNTIME) 986 #endif // !defined(DART_PRECOMPILED_RUNTIME)
OLDNEW
« no previous file with comments | « runtime/vm/kernel_binary_flowgraph.cc ('k') | runtime/vm/kernel_to_il.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698