| 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 intptr_t library) { | 98 NameIndex library) { |
| 99 return reader_->LookupLibrary(library).raw(); | 99 return reader_->LookupLibrary(library).raw(); |
| 100 } | 100 } |
| 101 | 101 |
| 102 | 102 |
| 103 RawClass* BuildingTranslationHelper::LookupClassByKernelClass(intptr_t klass) { | 103 RawClass* BuildingTranslationHelper::LookupClassByKernelClass(NameIndex klass) { |
| 104 return reader_->LookupClass(klass).raw(); | 104 return reader_->LookupClass(klass).raw(); |
| 105 } | 105 } |
| 106 | 106 |
| 107 | 107 |
| 108 KernelReader::KernelReader(Program* program) | 108 KernelReader::KernelReader(Program* program) |
| 109 : program_(program), | 109 : program_(program), |
| 110 thread_(dart::Thread::Current()), | 110 thread_(dart::Thread::Current()), |
| 111 zone_(thread_->zone()), | 111 zone_(thread_->zone()), |
| 112 isolate_(thread_->isolate()), | 112 isolate_(thread_->isolate()), |
| 113 scripts_(Array::ZoneHandle(zone_)), | 113 scripts_(Array::ZoneHandle(zone_)), |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 175 if (!library.Loaded()) library.SetLoaded(); | 175 if (!library.Loaded()) library.SetLoaded(); |
| 176 } | 176 } |
| 177 | 177 |
| 178 if (ClassFinalizer::ProcessPendingClasses(/*from_kernel=*/true)) { | 178 if (ClassFinalizer::ProcessPendingClasses(/*from_kernel=*/true)) { |
| 179 // There is a function _getMainClosure in dart:_builtin that returns the | 179 // There is a function _getMainClosure in dart:_builtin that returns the |
| 180 // main procedure. Since the platform libraries are compiled before the | 180 // main procedure. Since the platform libraries are compiled before the |
| 181 // program script, this function might need to be patched here. | 181 // program script, this function might need to be patched here. |
| 182 | 182 |
| 183 // 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 |
| 184 // and do not need to patch here. | 184 // and do not need to patch here. |
| 185 intptr_t main = program_->main_method(); | 185 NameIndex main = program_->main_method(); |
| 186 if (main == -1) { | 186 if (main == -1) { |
| 187 return dart::Library::Handle(Z); | 187 return dart::Library::Handle(Z); |
| 188 } | 188 } |
| 189 | 189 |
| 190 // 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 |
| 191 // bootstrapping and do not need to patch here. | 191 // bootstrapping and do not need to patch here. |
| 192 dart::Library& builtin_library = | 192 dart::Library& builtin_library = |
| 193 dart::Library::Handle(Z, I->object_store()->builtin_library()); | 193 dart::Library::Handle(Z, I->object_store()->builtin_library()); |
| 194 if (builtin_library.IsNull()) { | 194 if (builtin_library.IsNull()) { |
| 195 return dart::Library::Handle(Z); | 195 return dart::Library::Handle(Z); |
| 196 } | 196 } |
| 197 | 197 |
| 198 intptr_t main_library = H.EnclosingName(main); | 198 NameIndex main_library = H.EnclosingName(main); |
| 199 dart::Library& library = LookupLibrary(main_library); | 199 dart::Library& library = LookupLibrary(main_library); |
| 200 // Sanity check that we can find the main entrypoint. | 200 // Sanity check that we can find the main entrypoint. |
| 201 Object& main_obj = Object::Handle( | 201 Object& main_obj = Object::Handle( |
| 202 Z, library.LookupObjectAllowPrivate(H.DartSymbol("main"))); | 202 Z, library.LookupObjectAllowPrivate(H.DartSymbol("main"))); |
| 203 ASSERT(!main_obj.IsNull()); | 203 ASSERT(!main_obj.IsNull()); |
| 204 | 204 |
| 205 Function& to_patch = Function::Handle( | 205 Function& to_patch = Function::Handle( |
| 206 Z, builtin_library.LookupFunctionAllowPrivate( | 206 Z, builtin_library.LookupFunctionAllowPrivate( |
| 207 dart::String::Handle(dart::String::New("_getMainClosure")))); | 207 dart::String::Handle(dart::String::New("_getMainClosure")))); |
| 208 | 208 |
| 209 Procedure* procedure = | 209 Procedure* procedure = |
| 210 reinterpret_cast<Procedure*>(to_patch.kernel_function()); | 210 reinterpret_cast<Procedure*>(to_patch.kernel_function()); |
| 211 // If dart:_builtin was not compiled from Kernel at all or if it was | 211 // If dart:_builtin was not compiled from Kernel at all or if it was |
| 212 // linked with a script, it does not need to be patched. | 212 // linked with a script, it does not need to be patched. |
| 213 if ((procedure != NULL) && (procedure->function()->body() == NULL)) { | 213 if ((procedure != NULL) && (procedure->function()->body() == NULL)) { |
| 214 // We will handle the StaticGet specially and will not use the name. | 214 // We will handle the StaticGet specially and will not use the name. |
| 215 // | 215 // |
| 216 // TODO(kmillikin): we are leaking the function body. Find a way to | 216 // TODO(kmillikin): we are leaking the function body. Find a way to |
| 217 // deallocate it. | 217 // deallocate it. |
| 218 procedure->function()->set_body( | 218 procedure->function()->set_body( |
| 219 new ReturnStatement(new StaticGet(NULL))); | 219 new ReturnStatement(new StaticGet(NameIndex()))); |
| 220 } | 220 } |
| 221 return library; | 221 return library; |
| 222 } | 222 } |
| 223 } | 223 } |
| 224 | 224 |
| 225 // Either class finalization failed or we caught a compile error. | 225 // Either class finalization failed or we caught a compile error. |
| 226 // In both cases sticky error would be set. | 226 // In both cases sticky error would be set. |
| 227 Error& error = Error::Handle(Z); | 227 Error& error = Error::Handle(Z); |
| 228 error = thread_->sticky_error(); | 228 error = thread_->sticky_error(); |
| 229 thread_->clear_sticky_error(); | 229 thread_->clear_sticky_error(); |
| (...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 498 dart::String* native_name = NULL; | 498 dart::String* native_name = NULL; |
| 499 if (is_external) { | 499 if (is_external) { |
| 500 // 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 |
| 501 // 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 |
| 502 // an ExternalName annotation and extract the string from it. | 502 // an ExternalName annotation and extract the string from it. |
| 503 for (int i = 0; i < kernel_procedure->annotations().length(); ++i) { | 503 for (int i = 0; i < kernel_procedure->annotations().length(); ++i) { |
| 504 Expression* annotation = kernel_procedure->annotations()[i]; | 504 Expression* annotation = kernel_procedure->annotations()[i]; |
| 505 if (!annotation->IsConstructorInvocation()) continue; | 505 if (!annotation->IsConstructorInvocation()) continue; |
| 506 ConstructorInvocation* invocation = | 506 ConstructorInvocation* invocation = |
| 507 ConstructorInvocation::Cast(annotation); | 507 ConstructorInvocation::Cast(annotation); |
| 508 intptr_t annotation_class = H.EnclosingName(invocation->target()); | 508 NameIndex annotation_class = H.EnclosingName(invocation->target()); |
| 509 ASSERT(H.IsClass(annotation_class)); | 509 ASSERT(H.IsClass(annotation_class)); |
| 510 intptr_t class_name_index = H.CanonicalNameString(annotation_class); | 510 StringIndex class_name_index = H.CanonicalNameString(annotation_class); |
| 511 // Just compare by name, do not generate the annotation class. | 511 // Just compare by name, do not generate the annotation class. |
| 512 if (!H.StringEquals(class_name_index, "ExternalName")) continue; | 512 if (!H.StringEquals(class_name_index, "ExternalName")) continue; |
| 513 ASSERT(H.IsLibrary(H.CanonicalNameParent(annotation_class))); | 513 ASSERT(H.IsLibrary(H.CanonicalNameParent(annotation_class))); |
| 514 intptr_t library_name_index = | 514 StringIndex library_name_index = |
| 515 H.CanonicalNameString(H.CanonicalNameParent(annotation_class)); | 515 H.CanonicalNameString(H.CanonicalNameParent(annotation_class)); |
| 516 if (!H.StringEquals(library_name_index, "dart:_internal")) continue; | 516 if (!H.StringEquals(library_name_index, "dart:_internal")) continue; |
| 517 | 517 |
| 518 is_external = false; | 518 is_external = false; |
| 519 ASSERT(invocation->arguments()->positional().length() == 1 && | 519 ASSERT(invocation->arguments()->positional().length() == 1 && |
| 520 invocation->arguments()->named().length() == 0); | 520 invocation->arguments()->named().length() == 0); |
| 521 StringLiteral* literal = | 521 StringLiteral* literal = |
| 522 StringLiteral::Cast(invocation->arguments()->positional()[0]); | 522 StringLiteral::Cast(invocation->arguments()->positional()[0]); |
| 523 native_name = &H.DartSymbol(literal->value()); | 523 native_name = &H.DartSymbol(literal->value()); |
| 524 break; | 524 break; |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 621 for (intptr_t i = 0; i <= last; ++i) { | 621 for (intptr_t i = 0; i <= last; ++i) { |
| 622 smi_value = Smi::New(source->At(i)); | 622 smi_value = Smi::New(source->At(i)); |
| 623 array_object.SetAt(i, smi_value); | 623 array_object.SetAt(i, smi_value); |
| 624 } | 624 } |
| 625 return array_object.raw(); | 625 return array_object.raw(); |
| 626 } else { | 626 } else { |
| 627 return Array::New(0); | 627 return Array::New(0); |
| 628 } | 628 } |
| 629 } | 629 } |
| 630 | 630 |
| 631 Script& KernelReader::ScriptAt(intptr_t index, intptr_t import_uri) { | 631 Script& KernelReader::ScriptAt(intptr_t index, StringIndex import_uri) { |
| 632 Script& script = Script::ZoneHandle(Z); | 632 Script& script = Script::ZoneHandle(Z); |
| 633 script ^= scripts_.At(index); | 633 script ^= scripts_.At(index); |
| 634 if (script.IsNull()) { | 634 if (script.IsNull()) { |
| 635 // Create script with correct uri(s). | 635 // Create script with correct uri(s). |
| 636 uint8_t* uri_buffer = program_->source_table().UriFor(index); | 636 uint8_t* uri_buffer = program_->source_table().UriFor(index); |
| 637 intptr_t uri_size = program_->source_table().UriSizeFor(index); | 637 intptr_t uri_size = program_->source_table().UriSizeFor(index); |
| 638 dart::String& uri_string = H.DartString(uri_buffer, uri_size, Heap::kOld); | 638 dart::String& uri_string = H.DartString(uri_buffer, uri_size, Heap::kOld); |
| 639 dart::String& import_uri_string = | 639 dart::String& import_uri_string = |
| 640 import_uri == -1 ? uri_string : H.DartString(import_uri, Heap::kOld); | 640 import_uri == -1 ? uri_string : H.DartString(import_uri, Heap::kOld); |
| 641 uint8_t* source_buffer = program_->source_table().SourceCodeFor(index); | 641 uint8_t* source_buffer = program_->source_table().SourceCodeFor(index); |
| (...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 853 pos++; | 853 pos++; |
| 854 } | 854 } |
| 855 if (is_setter) { | 855 if (is_setter) { |
| 856 function.SetParameterTypeAt(pos, AbstractType::dynamic_type()); | 856 function.SetParameterTypeAt(pos, AbstractType::dynamic_type()); |
| 857 function.SetParameterNameAt(pos, Symbols::Value()); | 857 function.SetParameterNameAt(pos, Symbols::Value()); |
| 858 pos++; | 858 pos++; |
| 859 } | 859 } |
| 860 } | 860 } |
| 861 | 861 |
| 862 | 862 |
| 863 dart::Library& KernelReader::LookupLibrary(intptr_t library) { | 863 dart::Library& KernelReader::LookupLibrary(NameIndex library) { |
| 864 dart::Library* handle = NULL; | 864 dart::Library* handle = NULL; |
| 865 if (!libraries_.Lookup(library, &handle)) { | 865 if (!libraries_.Lookup(library, &handle)) { |
| 866 const dart::String& url = H.DartSymbol(H.CanonicalNameString(library)); | 866 const dart::String& url = H.DartSymbol(H.CanonicalNameString(library)); |
| 867 handle = | 867 handle = |
| 868 &dart::Library::Handle(Z, dart::Library::LookupLibrary(thread_, url)); | 868 &dart::Library::Handle(Z, dart::Library::LookupLibrary(thread_, url)); |
| 869 if (handle->IsNull()) { | 869 if (handle->IsNull()) { |
| 870 *handle = dart::Library::New(url); | 870 *handle = dart::Library::New(url); |
| 871 handle->Register(thread_); | 871 handle->Register(thread_); |
| 872 } | 872 } |
| 873 ASSERT(!handle->IsNull()); | 873 ASSERT(!handle->IsNull()); |
| 874 libraries_.Insert(library, handle); | 874 libraries_.Insert(library, handle); |
| 875 } | 875 } |
| 876 return *handle; | 876 return *handle; |
| 877 } | 877 } |
| 878 | 878 |
| 879 | 879 |
| 880 dart::Class& KernelReader::LookupClass(intptr_t klass) { | 880 dart::Class& KernelReader::LookupClass(NameIndex klass) { |
| 881 dart::Class* handle = NULL; | 881 dart::Class* handle = NULL; |
| 882 if (!classes_.Lookup(klass, &handle)) { | 882 if (!classes_.Lookup(klass, &handle)) { |
| 883 dart::Library& library = LookupLibrary(H.CanonicalNameParent(klass)); | 883 dart::Library& library = LookupLibrary(H.CanonicalNameParent(klass)); |
| 884 const dart::String& name = H.DartClassName(klass); | 884 const dart::String& name = H.DartClassName(klass); |
| 885 handle = &dart::Class::Handle(Z, library.LookupClass(name)); | 885 handle = &dart::Class::Handle(Z, library.LookupClass(name)); |
| 886 if (handle->IsNull()) { | 886 if (handle->IsNull()) { |
| 887 *handle = dart::Class::New(library, name, Script::Handle(Z), | 887 *handle = dart::Class::New(library, name, Script::Handle(Z), |
| 888 TokenPosition::kNoSource); | 888 TokenPosition::kNoSource); |
| 889 library.AddClass(*handle); | 889 library.AddClass(*handle); |
| 890 } | 890 } |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 940 initializer_fun.set_is_debuggable(false); | 940 initializer_fun.set_is_debuggable(false); |
| 941 initializer_fun.set_is_reflectable(false); | 941 initializer_fun.set_is_reflectable(false); |
| 942 initializer_fun.set_is_inlinable(false); | 942 initializer_fun.set_is_inlinable(false); |
| 943 return new (zone) ParsedFunction(thread, initializer_fun); | 943 return new (zone) ParsedFunction(thread, initializer_fun); |
| 944 } | 944 } |
| 945 | 945 |
| 946 | 946 |
| 947 } // namespace kernel | 947 } // namespace kernel |
| 948 } // namespace dart | 948 } // namespace dart |
| 949 #endif // !defined(DART_PRECOMPILED_RUNTIME) | 949 #endif // !defined(DART_PRECOMPILED_RUNTIME) |
| OLD | NEW |