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 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
88 const intptr_t len = functions_.length(); | 88 const intptr_t len = functions_.length(); |
89 const Array& res = Array::Handle(zone_, Array::New(len, Heap::kOld)); | 89 const Array& res = Array::Handle(zone_, Array::New(len, Heap::kOld)); |
90 for (intptr_t i = 0; i < len; i++) { | 90 for (intptr_t i = 0; i < len; i++) { |
91 res.SetAt(i, *functions_[i]); | 91 res.SetAt(i, *functions_[i]); |
92 } | 92 } |
93 return res.raw(); | 93 return res.raw(); |
94 } | 94 } |
95 | 95 |
96 | 96 |
97 RawLibrary* BuildingTranslationHelper::LookupLibraryByKernelLibrary( | 97 RawLibrary* BuildingTranslationHelper::LookupLibraryByKernelLibrary( |
98 CanonicalName* library) { | 98 intptr_t library) { |
99 return reader_->LookupLibrary(library).raw(); | 99 return reader_->LookupLibrary(library).raw(); |
100 } | 100 } |
101 | 101 |
102 | 102 |
103 RawClass* BuildingTranslationHelper::LookupClassByKernelClass( | 103 RawClass* BuildingTranslationHelper::LookupClassByKernelClass(intptr_t klass) { |
Vyacheslav Egorov (Google)
2017/05/03 06:28:48
I think we *do* need need named type for these ind
| |
104 CanonicalName* klass) { | |
105 return reader_->LookupClass(klass).raw(); | 104 return reader_->LookupClass(klass).raw(); |
106 } | 105 } |
107 | 106 |
108 | 107 |
109 KernelReader::KernelReader(Program* program) | 108 KernelReader::KernelReader(Program* program) |
110 : program_(program), | 109 : program_(program), |
111 thread_(dart::Thread::Current()), | 110 thread_(dart::Thread::Current()), |
112 zone_(thread_->zone()), | 111 zone_(thread_->zone()), |
113 isolate_(thread_->isolate()), | 112 isolate_(thread_->isolate()), |
114 scripts_(Array::ZoneHandle(zone_)), | 113 scripts_(Array::ZoneHandle(zone_)), |
(...skipping 22 matching lines...) Expand all Loading... | |
137 offsets.SetUint32(i << 2, end_offset); | 136 offsets.SetUint32(i << 2, end_offset); |
138 } | 137 } |
139 | 138 |
140 // Copy the string data out of the binary and into the VM's heap. | 139 // Copy the string data out of the binary and into the VM's heap. |
141 TypedData& data = TypedData::Handle( | 140 TypedData& data = TypedData::Handle( |
142 Z, TypedData::New(kTypedDataUint8ArrayCid, end_offset, Heap::kOld)); | 141 Z, TypedData::New(kTypedDataUint8ArrayCid, end_offset, Heap::kOld)); |
143 { | 142 { |
144 NoSafepointScope no_safepoint; | 143 NoSafepointScope no_safepoint; |
145 memmove(data.DataAddr(0), reader.buffer() + reader.offset(), end_offset); | 144 memmove(data.DataAddr(0), reader.buffer() + reader.offset(), end_offset); |
146 } | 145 } |
146 | |
147 // Copy the canonical names into the VM's heap. Encode them as unsigned, so | |
148 // the parent indexes are adjusted when extracted. | |
149 reader.set_offset(program->name_table_offset()); | |
150 count = reader.ReadUInt() * 2; | |
151 TypedData& names = TypedData::Handle( | |
152 Z, TypedData::New(kTypedDataUint32ArrayCid, count, Heap::kOld)); | |
153 for (intptr_t i = 0; i < count; ++i) { | |
154 names.SetUint32(i << 2, reader.ReadUInt()); | |
155 } | |
156 | |
147 H.SetStringOffsets(offsets); | 157 H.SetStringOffsets(offsets); |
148 H.SetStringData(data); | 158 H.SetStringData(data); |
159 H.SetCanonicalNames(names); | |
149 } | 160 } |
150 | 161 |
151 | 162 |
152 Object& KernelReader::ReadProgram() { | 163 Object& KernelReader::ReadProgram() { |
153 LongJumpScope jump; | 164 LongJumpScope jump; |
154 if (setjmp(*jump.Set()) == 0) { | 165 if (setjmp(*jump.Set()) == 0) { |
155 intptr_t length = program_->libraries().length(); | 166 intptr_t length = program_->libraries().length(); |
156 for (intptr_t i = 0; i < length; i++) { | 167 for (intptr_t i = 0; i < length; i++) { |
157 Library* kernel_library = program_->libraries()[i]; | 168 Library* kernel_library = program_->libraries()[i]; |
158 ReadLibrary(kernel_library); | 169 ReadLibrary(kernel_library); |
159 } | 170 } |
160 | 171 |
161 for (intptr_t i = 0; i < length; i++) { | 172 for (intptr_t i = 0; i < length; i++) { |
162 dart::Library& library = | 173 dart::Library& library = |
163 LookupLibrary(program_->libraries()[i]->canonical_name()); | 174 LookupLibrary(program_->libraries()[i]->canonical_name()); |
164 if (!library.Loaded()) library.SetLoaded(); | 175 if (!library.Loaded()) library.SetLoaded(); |
165 } | 176 } |
166 | 177 |
167 if (ClassFinalizer::ProcessPendingClasses(/*from_kernel=*/true)) { | 178 if (ClassFinalizer::ProcessPendingClasses(/*from_kernel=*/true)) { |
168 // There is a function _getMainClosure in dart:_builtin that returns the | 179 // There is a function _getMainClosure in dart:_builtin that returns the |
169 // main procedure. Since the platform libraries are compiled before the | 180 // main procedure. Since the platform libraries are compiled before the |
170 // program script, this function might need to be patched here. | 181 // program script, this function might need to be patched here. |
171 | 182 |
172 // If there is no main method then we have compiled a partial Kernel file | 183 // If there is no main method then we have compiled a partial Kernel file |
173 // and do not need to patch here. | 184 // and do not need to patch here. |
174 CanonicalName* main = program_->main_method(); | 185 intptr_t main = program_->main_method(); |
175 if (main == NULL) { | 186 if (main == -1) { |
176 return dart::Library::Handle(Z); | 187 return dart::Library::Handle(Z); |
177 } | 188 } |
178 | 189 |
179 // If the builtin library is not set in the object store, then we are | 190 // If the builtin library is not set in the object store, then we are |
180 // bootstrapping and do not need to patch here. | 191 // bootstrapping and do not need to patch here. |
181 dart::Library& builtin_library = | 192 dart::Library& builtin_library = |
182 dart::Library::Handle(Z, I->object_store()->builtin_library()); | 193 dart::Library::Handle(Z, I->object_store()->builtin_library()); |
183 if (builtin_library.IsNull()) { | 194 if (builtin_library.IsNull()) { |
184 return dart::Library::Handle(Z); | 195 return dart::Library::Handle(Z); |
185 } | 196 } |
186 | 197 |
187 CanonicalName* main_library = H.EnclosingName(main); | 198 intptr_t main_library = H.EnclosingName(main); |
188 dart::Library& library = LookupLibrary(main_library); | 199 dart::Library& library = LookupLibrary(main_library); |
189 // Sanity check that we can find the main entrypoint. | 200 // Sanity check that we can find the main entrypoint. |
190 Object& main_obj = Object::Handle( | 201 Object& main_obj = Object::Handle( |
191 Z, library.LookupObjectAllowPrivate(H.DartSymbol("main"))); | 202 Z, library.LookupObjectAllowPrivate(H.DartSymbol("main"))); |
192 ASSERT(!main_obj.IsNull()); | 203 ASSERT(!main_obj.IsNull()); |
193 | 204 |
194 Function& to_patch = Function::Handle( | 205 Function& to_patch = Function::Handle( |
195 Z, builtin_library.LookupFunctionAllowPrivate( | 206 Z, builtin_library.LookupFunctionAllowPrivate( |
196 dart::String::Handle(dart::String::New("_getMainClosure")))); | 207 dart::String::Handle(dart::String::New("_getMainClosure")))); |
197 | 208 |
(...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
487 dart::String* native_name = NULL; | 498 dart::String* native_name = NULL; |
488 if (is_external) { | 499 if (is_external) { |
489 // Maybe it has a native implementation, which is not external as far as | 500 // Maybe it has a native implementation, which is not external as far as |
490 // the VM is concerned because it does have an implementation. Check for | 501 // the VM is concerned because it does have an implementation. Check for |
491 // an ExternalName annotation and extract the string from it. | 502 // an ExternalName annotation and extract the string from it. |
492 for (int i = 0; i < kernel_procedure->annotations().length(); ++i) { | 503 for (int i = 0; i < kernel_procedure->annotations().length(); ++i) { |
493 Expression* annotation = kernel_procedure->annotations()[i]; | 504 Expression* annotation = kernel_procedure->annotations()[i]; |
494 if (!annotation->IsConstructorInvocation()) continue; | 505 if (!annotation->IsConstructorInvocation()) continue; |
495 ConstructorInvocation* invocation = | 506 ConstructorInvocation* invocation = |
496 ConstructorInvocation::Cast(annotation); | 507 ConstructorInvocation::Cast(annotation); |
497 CanonicalName* annotation_class = H.EnclosingName(invocation->target()); | 508 intptr_t annotation_class = H.EnclosingName(invocation->target()); |
498 ASSERT(H.IsClass(annotation_class)); | 509 ASSERT(H.IsClass(annotation_class)); |
499 intptr_t class_name_index = annotation_class->name(); | 510 intptr_t class_name_index = H.CanonicalNameString(annotation_class); |
500 // Just compare by name, do not generate the annotation class. | 511 // Just compare by name, do not generate the annotation class. |
501 if (!H.StringEquals(class_name_index, "ExternalName")) continue; | 512 if (!H.StringEquals(class_name_index, "ExternalName")) continue; |
502 ASSERT(H.IsLibrary(annotation_class->parent())); | 513 ASSERT(H.IsLibrary(H.CanonicalNameParent(annotation_class))); |
503 intptr_t library_name_index = annotation_class->parent()->name(); | 514 intptr_t library_name_index = |
515 H.CanonicalNameString(H.CanonicalNameParent(annotation_class)); | |
504 if (!H.StringEquals(library_name_index, "dart:_internal")) continue; | 516 if (!H.StringEquals(library_name_index, "dart:_internal")) continue; |
505 | 517 |
506 is_external = false; | 518 is_external = false; |
507 ASSERT(invocation->arguments()->positional().length() == 1 && | 519 ASSERT(invocation->arguments()->positional().length() == 1 && |
508 invocation->arguments()->named().length() == 0); | 520 invocation->arguments()->named().length() == 0); |
509 StringLiteral* literal = | 521 StringLiteral* literal = |
510 StringLiteral::Cast(invocation->arguments()->positional()[0]); | 522 StringLiteral::Cast(invocation->arguments()->positional()[0]); |
511 native_name = &H.DartSymbol(literal->value()); | 523 native_name = &H.DartSymbol(literal->value()); |
512 break; | 524 break; |
513 } | 525 } |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
627 dart::String& import_uri_string = | 639 dart::String& import_uri_string = |
628 import_uri == -1 ? uri_string : H.DartString(import_uri, Heap::kOld); | 640 import_uri == -1 ? uri_string : H.DartString(import_uri, Heap::kOld); |
629 uint8_t* source_buffer = program_->source_table().SourceCodeFor(index); | 641 uint8_t* source_buffer = program_->source_table().SourceCodeFor(index); |
630 intptr_t source_size = program_->source_table().SourceCodeSizeFor(index); | 642 intptr_t source_size = program_->source_table().SourceCodeSizeFor(index); |
631 dart::String& source_code = | 643 dart::String& source_code = |
632 H.DartString(source_buffer, source_size, Heap::kOld); | 644 H.DartString(source_buffer, source_size, Heap::kOld); |
633 script = Script::New(import_uri_string, uri_string, source_code, | 645 script = Script::New(import_uri_string, uri_string, source_code, |
634 RawScript::kKernelTag); | 646 RawScript::kKernelTag); |
635 script.set_kernel_string_offsets(H.string_offsets()); | 647 script.set_kernel_string_offsets(H.string_offsets()); |
636 script.set_kernel_string_data(H.string_data()); | 648 script.set_kernel_string_data(H.string_data()); |
649 script.set_kernel_canonical_names(H.canonical_names()); | |
637 scripts_.SetAt(index, script); | 650 scripts_.SetAt(index, script); |
638 | 651 |
639 // Create line_starts array for the script. | 652 // Create line_starts array for the script. |
640 intptr_t* line_starts = program_->source_table().LineStartsFor(index); | 653 intptr_t* line_starts = program_->source_table().LineStartsFor(index); |
641 intptr_t line_count = program_->source_table().LineCountFor(index); | 654 intptr_t line_count = program_->source_table().LineCountFor(index); |
642 Array& array_object = Array::Handle(Z, Array::New(line_count, Heap::kOld)); | 655 Array& array_object = Array::Handle(Z, Array::New(line_count, Heap::kOld)); |
643 Smi& value = Smi::Handle(Z); | 656 Smi& value = Smi::Handle(Z); |
644 for (intptr_t i = 0; i < line_count; ++i) { | 657 for (intptr_t i = 0; i < line_count; ++i) { |
645 value = Smi::New(line_starts[i]); | 658 value = Smi::New(line_starts[i]); |
646 array_object.SetAt(i, value); | 659 array_object.SetAt(i, value); |
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
840 pos++; | 853 pos++; |
841 } | 854 } |
842 if (is_setter) { | 855 if (is_setter) { |
843 function.SetParameterTypeAt(pos, AbstractType::dynamic_type()); | 856 function.SetParameterTypeAt(pos, AbstractType::dynamic_type()); |
844 function.SetParameterNameAt(pos, Symbols::Value()); | 857 function.SetParameterNameAt(pos, Symbols::Value()); |
845 pos++; | 858 pos++; |
846 } | 859 } |
847 } | 860 } |
848 | 861 |
849 | 862 |
850 dart::Library& KernelReader::LookupLibrary(CanonicalName* library) { | 863 dart::Library& KernelReader::LookupLibrary(intptr_t library) { |
851 dart::Library* handle = NULL; | 864 dart::Library* handle = NULL; |
852 if (!libraries_.Lookup(library, &handle)) { | 865 if (!libraries_.Lookup(library, &handle)) { |
853 const dart::String& url = H.DartSymbol(library->name()); | 866 const dart::String& url = H.DartSymbol(H.CanonicalNameString(library)); |
854 handle = | 867 handle = |
855 &dart::Library::Handle(Z, dart::Library::LookupLibrary(thread_, url)); | 868 &dart::Library::Handle(Z, dart::Library::LookupLibrary(thread_, url)); |
856 if (handle->IsNull()) { | 869 if (handle->IsNull()) { |
857 *handle = dart::Library::New(url); | 870 *handle = dart::Library::New(url); |
858 handle->Register(thread_); | 871 handle->Register(thread_); |
859 } | 872 } |
860 ASSERT(!handle->IsNull()); | 873 ASSERT(!handle->IsNull()); |
861 libraries_.Insert(library, handle); | 874 libraries_.Insert(library, handle); |
862 } | 875 } |
863 return *handle; | 876 return *handle; |
864 } | 877 } |
865 | 878 |
866 | 879 |
867 dart::Class& KernelReader::LookupClass(CanonicalName* klass) { | 880 dart::Class& KernelReader::LookupClass(intptr_t klass) { |
868 dart::Class* handle = NULL; | 881 dart::Class* handle = NULL; |
869 if (!classes_.Lookup(klass, &handle)) { | 882 if (!classes_.Lookup(klass, &handle)) { |
870 dart::Library& library = LookupLibrary(klass->parent()); | 883 dart::Library& library = LookupLibrary(H.CanonicalNameParent(klass)); |
871 const dart::String& name = H.DartClassName(klass); | 884 const dart::String& name = H.DartClassName(klass); |
872 handle = &dart::Class::Handle(Z, library.LookupClass(name)); | 885 handle = &dart::Class::Handle(Z, library.LookupClass(name)); |
873 if (handle->IsNull()) { | 886 if (handle->IsNull()) { |
874 *handle = dart::Class::New(library, name, Script::Handle(Z), | 887 *handle = dart::Class::New(library, name, Script::Handle(Z), |
875 TokenPosition::kNoSource); | 888 TokenPosition::kNoSource); |
876 library.AddClass(*handle); | 889 library.AddClass(*handle); |
877 } | 890 } |
878 // Insert the class in the cache before calling ReadPreliminaryClass so | 891 // Insert the class in the cache before calling ReadPreliminaryClass so |
879 // we do not risk allocating the class again by calling LookupClass | 892 // we do not risk allocating the class again by calling LookupClass |
880 // recursively from ReadPreliminaryClass for the same class. | 893 // recursively from ReadPreliminaryClass for the same class. |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
927 initializer_fun.set_is_debuggable(false); | 940 initializer_fun.set_is_debuggable(false); |
928 initializer_fun.set_is_reflectable(false); | 941 initializer_fun.set_is_reflectable(false); |
929 initializer_fun.set_is_inlinable(false); | 942 initializer_fun.set_is_inlinable(false); |
930 return new (zone) ParsedFunction(thread, initializer_fun); | 943 return new (zone) ParsedFunction(thread, initializer_fun); |
931 } | 944 } |
932 | 945 |
933 | 946 |
934 } // namespace kernel | 947 } // namespace kernel |
935 } // namespace dart | 948 } // namespace dart |
936 #endif // !defined(DART_PRECOMPILED_RUNTIME) | 949 #endif // !defined(DART_PRECOMPILED_RUNTIME) |
OLD | NEW |