Chromium Code Reviews| Index: runtime/vm/object.cc |
| =================================================================== |
| --- runtime/vm/object.cc (revision 19011) |
| +++ runtime/vm/object.cc (working copy) |
| @@ -631,15 +631,30 @@ |
| lib.AddClass(cls); |
| } |
| -#define INIT_LIBRARY(name, raw_script, raw_lib) \ |
| - script ^= raw_script; \ |
| - Library::Init##name##Library(isolate); \ |
| - lib ^= raw_lib; \ |
| - ASSERT(!lib.IsNull()); \ |
| + |
| +#define LOAD_LIBRARY(name, raw_name) \ |
| + url = Symbols::Dart##name().raw(); \ |
| + lib = Library::LookupLibrary(url); \ |
| + if (lib.IsNull()) { \ |
| + lib = Library::NewLibraryHelper(url, true); \ |
|
siva
2013/02/25 23:12:25
ASSERT(!lib.IsNull());
Ivan Posva
2013/02/25 23:23:59
We do not check for allocation success anywhere el
|
| + lib.Register(); \ |
| + } \ |
| + isolate->object_store()->set_##raw_name##_library(lib); \ |
| + |
| +#define INIT_LIBRARY(name, raw_name, has_patch) \ |
| + LOAD_LIBRARY(name, raw_name) \ |
| + script = Bootstrap::Load##name##Script(false); \ |
| error = Bootstrap::Compile(lib, script); \ |
| if (!error.IsNull()) { \ |
| return error.raw(); \ |
| } \ |
| + if (has_patch) { \ |
| + script = Bootstrap::Load##name##Script(true); \ |
| + error = lib.Patch(script); \ |
| + if (!error.IsNull()) { \ |
| + return error.raw(); \ |
| + } \ |
| + } \ |
| RawError* Object::Init(Isolate* isolate) { |
| @@ -649,6 +664,10 @@ |
| Class& cls = Class::Handle(); |
| Type& type = Type::Handle(); |
| Array& array = Array::Handle(); |
| + String& url = String::Handle(); |
| + Library& lib = Library::Handle(); |
| + Script& script = Script::Handle(); |
| + Error& error = Error::Handle(); |
| // All RawArray fields will be initialized to an empty array, therefore |
| // initialize array class first. |
| @@ -698,8 +717,10 @@ |
| GrowableObjectArray::Handle(GrowableObjectArray::New(Heap::kOld)); |
| object_store->set_libraries(libraries); |
| - // Basic infrastructure has been setup, initialize the class dictionary. |
| + // Pre-register the core library. |
| Library::InitCoreLibrary(isolate); |
| + |
| + // Basic infrastructure has been setup, initialize the class dictionary. |
| Library& core_lib = Library::Handle(Library::CoreLibrary()); |
| ASSERT(!core_lib.IsNull()); |
| @@ -771,7 +792,7 @@ |
| pending_classes.Add(cls, Heap::kOld); |
| // Initialize the base interfaces used by the core VM classes. |
| - Script& script = Script::Handle(Bootstrap::LoadCoreScript(false)); |
| + script = Bootstrap::LoadCoreScript(false); |
| // Allocate and initialize the pre-allocated classes in the core library. |
| cls = Class::New<Instance>(kInstanceCid); |
| @@ -821,8 +842,17 @@ |
| object_store->set_weak_property_class(cls); |
| RegisterPrivateClass(cls, Symbols::_WeakProperty(), core_lib); |
| - Library::InitScalarlistLibrary(isolate); |
| + // Setup some default native field classes which can be extended for |
| + // specifying native fields in dart classes. |
| + Library::InitNativeWrappersLibrary(isolate); |
| + ASSERT(isolate->object_store()->native_wrappers_library() != Library::null()); |
| + |
| + // Pre-register the scalarlist library so the native class implementations |
| + // can be hooked up before compiling it. |
| + LOAD_LIBRARY(Scalarlist, scalarlist); |
| + |
| Library& scalarlist_lib = Library::Handle(Library::ScalarlistLibrary()); |
| + ASSERT(!scalarlist_lib.IsNull()); |
| cls = Class::New<Float32x4>(); |
| object_store->set_float32x4_class(cls); |
| @@ -1010,125 +1040,22 @@ |
| type = Type::NewNonParameterizedType(cls); |
| object_store->set_dynamic_type(type); |
| - // Setup some default native field classes which can be extended for |
| - // specifying native fields in dart classes. |
| - Library::InitNativeWrappersLibrary(isolate); |
| - ASSERT(isolate->object_store()->native_wrappers_library() != Library::null()); |
| - |
| // Finish the initialization by compiling the bootstrap scripts containing the |
| // base interfaces and the implementation of the internal classes. |
| - Error& error = Error::Handle(); |
| - error = Bootstrap::Compile(core_lib, script); |
| - if (!error.IsNull()) { |
| - return error.raw(); |
| - } |
| - Script& patch_script = Script::Handle(Bootstrap::LoadCoreScript(true)); |
| - error = core_lib.Patch(patch_script); |
| - if (!error.IsNull()) { |
| - return error.raw(); |
| - } |
| - Library::InitASyncLibrary(isolate); |
| - const Script& async_script = |
| - Script::Handle(Bootstrap::LoadASyncScript(false)); |
| - const Library& async_lib = Library::Handle(Library::ASyncLibrary()); |
| - ASSERT(!async_lib.IsNull()); |
| - error = Bootstrap::Compile(async_lib, async_script); |
| - if (!error.IsNull()) { |
| - return error.raw(); |
| - } |
| - patch_script = Bootstrap::LoadASyncScript(true); |
| - error = async_lib.Patch(patch_script); |
| - if (!error.IsNull()) { |
| - return error.raw(); |
| - } |
| - const Script& collection_script = |
| - Script::Handle(Bootstrap::LoadCollectionScript(false)); |
| - const Library& collection_lib = |
| - Library::Handle(Library::CollectionLibrary()); |
| - ASSERT(!collection_lib.IsNull()); |
| - error = Bootstrap::Compile(collection_lib, collection_script); |
| - if (!error.IsNull()) { |
| - return error.raw(); |
| - } |
| - const Script& collection_dev_script = |
| - Script::Handle(Bootstrap::LoadCollectionDevScript(false)); |
| - const Library& collection_dev_lib = |
| - Library::Handle(Library::CollectionDevLibrary()); |
| - ASSERT(!collection_dev_lib.IsNull()); |
| - error = Bootstrap::Compile(collection_dev_lib, collection_dev_script); |
| - if (!error.IsNull()) { |
| - return error.raw(); |
| - } |
| - const Script& math_script = Script::Handle(Bootstrap::LoadMathScript(false)); |
| - const Library& math_lib = Library::Handle(Library::MathLibrary()); |
| - ASSERT(!math_lib.IsNull()); |
| - error = Bootstrap::Compile(math_lib, math_script); |
| - if (!error.IsNull()) { |
| - return error.raw(); |
| - } |
| - patch_script = Bootstrap::LoadMathScript(true); |
| - error = math_lib.Patch(patch_script); |
| - if (!error.IsNull()) { |
| - return error.raw(); |
| - } |
| - const Script& isolate_script = Script::Handle( |
| - Bootstrap::LoadIsolateScript(false)); |
| - Library::InitIsolateLibrary(isolate); |
| - const Library& isolate_lib = Library::Handle(Library::IsolateLibrary()); |
| - ASSERT(!isolate_lib.IsNull()); |
| - error = Bootstrap::Compile(isolate_lib, isolate_script); |
| - if (!error.IsNull()) { |
| - return error.raw(); |
| - } |
| - patch_script = Bootstrap::LoadIsolateScript(true); |
| - error = isolate_lib.Patch(patch_script); |
| - if (!error.IsNull()) { |
| - return error.raw(); |
| - } |
| - const Script& mirrors_script = Script::Handle( |
| - Bootstrap::LoadMirrorsScript(false)); |
| - Library::InitMirrorsLibrary(isolate); |
| - const Library& mirrors_lib = Library::Handle(Library::MirrorsLibrary()); |
| - ASSERT(!mirrors_lib.IsNull()); |
| - error = Bootstrap::Compile(mirrors_lib, mirrors_script); |
| - if (!error.IsNull()) { |
| - return error.raw(); |
| - } |
| - patch_script = Bootstrap::LoadMirrorsScript(true); |
| - error = mirrors_lib.Patch(patch_script); |
| - if (!error.IsNull()) { |
| - return error.raw(); |
| - } |
| - const Script& scalarlist_script = Script::Handle( |
| - Bootstrap::LoadScalarlistScript(false)); |
| - ASSERT(!scalarlist_lib.IsNull()); |
| - error = Bootstrap::Compile(scalarlist_lib, scalarlist_script); |
| - if (!error.IsNull()) { |
| - return error.raw(); |
| - } |
| - patch_script = Bootstrap::LoadScalarlistScript(true); |
| - error = scalarlist_lib.Patch(patch_script); |
| - if (!error.IsNull()) { |
| - return error.raw(); |
| - } |
| - Library& lib = Library::Handle(); |
| - INIT_LIBRARY(Crypto, |
| - Bootstrap::LoadCryptoScript(false), |
| - Library::CryptoLibrary()); |
| - INIT_LIBRARY(Json, |
| - Bootstrap::LoadJsonScript(false), |
| - Library::JsonLibrary()); |
| - patch_script = Bootstrap::LoadJsonScript(true); |
| - error = lib.Patch(patch_script); |
| - if (!error.IsNull()) { |
| - return error.raw(); |
| - } |
| - INIT_LIBRARY(Utf, |
| - Bootstrap::LoadUtfScript(false), |
| - Library::UtfLibrary()); |
| - INIT_LIBRARY(Uri, |
| - Bootstrap::LoadUriScript(false), |
| - Library::UriLibrary()); |
| + INIT_LIBRARY(Core, core, true); |
| + |
| + INIT_LIBRARY(Async, async, true); |
| + INIT_LIBRARY(Collection, collection, false); |
| + INIT_LIBRARY(CollectionDev, collection_dev, false); |
| + INIT_LIBRARY(Crypto, crypto, false); |
| + INIT_LIBRARY(Isolate, isolate, true); |
| + INIT_LIBRARY(Json, json, false); |
| + INIT_LIBRARY(Math, math, true); |
| + INIT_LIBRARY(Mirrors, mirrors, true); |
| + INIT_LIBRARY(Scalarlist, scalarlist, true); |
| + INIT_LIBRARY(Utf, utf, false); |
| + INIT_LIBRARY(Uri, uri, false); |
| + |
| Bootstrap::SetupNativeResolver(); |
| // Remove the Object superclass cycle by setting the super type to null (not |
| @@ -6381,37 +6308,12 @@ |
| } |
| -void Library::InitASyncLibrary(Isolate* isolate) { |
| - const String& url = Symbols::DartAsync(); |
| - const Library& lib = Library::Handle(Library::NewLibraryHelper(url, true)); |
| - lib.Register(); |
| - isolate->object_store()->set_async_library(lib); |
| -} |
| - |
| - |
| void Library::InitCoreLibrary(Isolate* isolate) { |
| const String& core_lib_url = Symbols::DartCore(); |
| const Library& core_lib = |
| Library::Handle(Library::NewLibraryHelper(core_lib_url, false)); |
| core_lib.Register(); |
| isolate->object_store()->set_core_library(core_lib); |
| - Library::InitMathLibrary(isolate); |
| - const Library& math_lib = Library::Handle(Library::MathLibrary()); |
| - const Namespace& math_ns = Namespace::Handle( |
| - Namespace::New(math_lib, Array::Handle(), Array::Handle())); |
| - Library::InitCollectionDevLibrary(isolate); |
| - const Library& collection_dev_lib = |
| - Library::Handle(Library::CollectionDevLibrary()); |
| - const Namespace& collection_dev_ns = Namespace::Handle( |
| - Namespace::New(collection_dev_lib, Array::Handle(), Array::Handle())); |
| - Library::InitCollectionLibrary(isolate); |
| - const Library& collection_lib = |
| - Library::Handle(Library::CollectionLibrary()); |
| - const Namespace& collection_ns = Namespace::Handle( |
| - Namespace::New(collection_lib, Array::Handle(), Array::Handle())); |
| - core_lib.AddImport(math_ns); |
| - core_lib.AddImport(collection_ns); |
| - core_lib.AddImport(collection_dev_ns); |
| isolate->object_store()->set_root_library(Library::Handle()); |
| // Hook up predefined classes without setting their library pointers. These |
| @@ -6422,92 +6324,6 @@ |
| } |
| -void Library::InitCollectionLibrary(Isolate* isolate) { |
| - const String& url = Symbols::DartCollection(); |
| - const Library& lib = Library::Handle(Library::NewLibraryHelper(url, true)); |
| - lib.Register(); |
| - const Library& math_lib = Library::Handle(Library::MathLibrary()); |
| - const Namespace& math_ns = Namespace::Handle( |
| - Namespace::New(math_lib, Array::Handle(), Array::Handle())); |
| - const Library& collection_dev_lib = |
| - Library::Handle(Library::CollectionDevLibrary()); |
| - const Namespace& collection_dev_ns = Namespace::Handle( |
| - Namespace::New(collection_dev_lib, Array::Handle(), Array::Handle())); |
| - lib.AddImport(math_ns); |
| - lib.AddImport(collection_dev_ns); |
| - isolate->object_store()->set_collection_library(lib); |
| -} |
| - |
| - |
| -void Library::InitCollectionDevLibrary(Isolate* isolate) { |
| - const String& url = Symbols::DartCollectionDev(); |
| - const Library& lib = Library::Handle(Library::NewLibraryHelper(url, true)); |
| - lib.Register(); |
| - isolate->object_store()->set_collection_dev_library(lib); |
| -} |
| - |
| - |
| -void Library::InitCryptoLibrary(Isolate* isolate) { |
| - const String& url = Symbols::DartCrypto(); |
| - const Library& lib = Library::Handle(Library::NewLibraryHelper(url, true)); |
| - lib.Register(); |
| - const Library& math_lib = Library::Handle(Library::MathLibrary()); |
| - const Namespace& math_ns = Namespace::Handle( |
| - Namespace::New(math_lib, Array::Handle(), Array::Handle())); |
| - lib.AddImport(math_ns); |
| - isolate->object_store()->set_crypto_library(lib); |
| -} |
| - |
| - |
| -void Library::InitIsolateLibrary(Isolate* isolate) { |
| - const String& url = Symbols::DartIsolate(); |
| - const Library& lib = Library::Handle(Library::NewLibraryHelper(url, true)); |
| - lib.Register(); |
| - const Library& async_lib = Library::Handle(Library::ASyncLibrary()); |
| - const Namespace& async_ns = Namespace::Handle( |
| - Namespace::New(async_lib, Array::Handle(), Array::Handle())); |
| - lib.AddImport(async_ns); |
| - isolate->object_store()->set_isolate_library(lib); |
| -} |
| - |
| - |
| -void Library::InitJsonLibrary(Isolate* isolate) { |
| - const String& url = Symbols::DartJson(); |
| - const Library& lib = Library::Handle(Library::NewLibraryHelper(url, true)); |
| - lib.Register(); |
| - isolate->object_store()->set_json_library(lib); |
| -} |
| - |
| - |
| -void Library::InitMathLibrary(Isolate* isolate) { |
| - const String& url = Symbols::DartMath(); |
| - const Library& lib = Library::Handle(Library::NewLibraryHelper(url, true)); |
| - lib.Register(); |
| - isolate->object_store()->set_math_library(lib); |
| -} |
| - |
| - |
| -void Library::InitMirrorsLibrary(Isolate* isolate) { |
| - const String& url = Symbols::DartMirrors(); |
| - const Library& lib = Library::Handle(Library::NewLibraryHelper(url, true)); |
| - lib.Register(); |
| - const Library& isolate_lib = Library::Handle(Library::IsolateLibrary()); |
| - const Namespace& isolate_ns = Namespace::Handle( |
| - Namespace::New(isolate_lib, Array::Handle(), Array::Handle())); |
| - lib.AddImport(isolate_ns); |
| - const Library& async_lib = Library::Handle(Library::ASyncLibrary()); |
| - const Namespace& async_ns = Namespace::Handle( |
| - Namespace::New(async_lib, Array::Handle(), Array::Handle())); |
| - lib.AddImport(async_ns); |
| - const Library& wrappers_lib = |
| - Library::Handle(Library::NativeWrappersLibrary()); |
| - const Namespace& wrappers_ns = Namespace::Handle( |
| - Namespace::New(wrappers_lib, Array::Handle(), Array::Handle())); |
| - lib.AddImport(wrappers_ns); |
| - isolate->object_store()->set_mirrors_library(lib); |
| -} |
| - |
| - |
| void Library::InitNativeWrappersLibrary(Isolate* isolate) { |
| static const int kNumNativeWrappersClasses = 4; |
| ASSERT(kNumNativeWrappersClasses > 0 && kNumNativeWrappersClasses < 10); |
| @@ -6533,47 +6349,6 @@ |
| } |
| -void Library::InitScalarlistLibrary(Isolate* isolate) { |
| - const String& url = Symbols::DartScalarlist(); |
| - const Library& lib = Library::Handle(Library::NewLibraryHelper(url, true)); |
| - lib.Register(); |
| - const Library& collection_lib = |
| - Library::Handle(Library::CollectionLibrary()); |
| - const Namespace& collection_ns = Namespace::Handle( |
| - Namespace::New(collection_lib, Array::Handle(), Array::Handle())); |
| - lib.AddImport(collection_ns); |
| - isolate->object_store()->set_scalarlist_library(lib); |
| -} |
| - |
| - |
| -void Library::InitUriLibrary(Isolate* isolate) { |
| - const String& url = Symbols::DartUri(); |
| - const Library& lib = Library::Handle(Library::NewLibraryHelper(url, true)); |
| - lib.Register(); |
| - const Library& math_lib = Library::Handle(Library::MathLibrary()); |
| - const Namespace& math_ns = Namespace::Handle( |
| - Namespace::New(math_lib, Array::Handle(), Array::Handle())); |
| - const Library& utf_lib = Library::Handle(Library::UtfLibrary()); |
| - const Namespace& utf_ns = Namespace::Handle( |
| - Namespace::New(utf_lib, Array::Handle(), Array::Handle())); |
| - lib.AddImport(math_ns); |
| - lib.AddImport(utf_ns); |
| - isolate->object_store()->set_uri_library(lib); |
| -} |
| - |
| - |
| -void Library::InitUtfLibrary(Isolate* isolate) { |
| - const String& url = Symbols::DartUtf(); |
| - const Library& lib = Library::Handle(Library::NewLibraryHelper(url, true)); |
| - lib.Register(); |
| - const Library& async_lib = Library::Handle(Library::ASyncLibrary()); |
| - const Namespace& async_ns = Namespace::Handle( |
| - Namespace::New(async_lib, Array::Handle(), Array::Handle())); |
| - lib.AddImport(async_ns); |
| - isolate->object_store()->set_utf_library(lib); |
| -} |
| - |
| - |
| RawLibrary* Library::LookupLibrary(const String &url) { |
| Isolate* isolate = Isolate::Current(); |
| Library& lib = Library::Handle(isolate, Library::null()); |
| @@ -6667,7 +6442,7 @@ |
| } |
| -RawLibrary* Library::ASyncLibrary() { |
| +RawLibrary* Library::AsyncLibrary() { |
| return Isolate::Current()->object_store()->async_library(); |
| } |