OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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/bootstrap.h" | 5 #include "vm/bootstrap.h" |
6 | 6 |
7 #include "include/dart_api.h" | 7 #include "include/dart_api.h" |
8 | 8 |
9 #if !defined(DART_PRECOMPILED_RUNTIME) | 9 #if !defined(DART_PRECOMPILED_RUNTIME) |
10 #include "vm/class_finalizer.h" | 10 #include "vm/class_finalizer.h" |
11 #include "vm/compiler.h" | 11 #include "vm/compiler.h" |
12 #include "vm/kernel_reader.h" | 12 #include "vm/kernel_reader.h" |
13 #endif | 13 #endif |
14 #include "vm/object.h" | 14 #include "vm/object.h" |
15 #if !defined(DART_PRECOMPILED_RUNTIME) | 15 #if !defined(DART_PRECOMPILED_RUNTIME) |
16 #include "vm/object_store.h" | 16 #include "vm/object_store.h" |
17 #endif | 17 #endif |
18 | 18 |
19 namespace dart { | 19 namespace dart { |
20 | 20 |
21 #if !defined(DART_PRECOMPILED_RUNTIME) | 21 #if !defined(DART_PRECOMPILED_RUNTIME) |
22 #define MAKE_PROPERTIES(CamelName, name) \ | 22 #define MAKE_PROPERTIES(CamelName, name) \ |
23 {ObjectStore::k##CamelName, "dart:" #name}, | 23 {ObjectStore::k##CamelName, "dart:" #name}, |
24 | 24 |
25 | |
26 struct BootstrapLibProps { | 25 struct BootstrapLibProps { |
27 ObjectStore::BootstrapLibraryId index; | 26 ObjectStore::BootstrapLibraryId index; |
28 const char* uri; | 27 const char* uri; |
29 }; | 28 }; |
30 | 29 |
31 | |
32 static BootstrapLibProps bootstrap_libraries[] = { | 30 static BootstrapLibProps bootstrap_libraries[] = { |
33 FOR_EACH_BOOTSTRAP_LIBRARY(MAKE_PROPERTIES)}; | 31 FOR_EACH_BOOTSTRAP_LIBRARY(MAKE_PROPERTIES)}; |
34 | 32 |
35 | |
36 #undef MAKE_PROPERTIES | 33 #undef MAKE_PROPERTIES |
37 | 34 |
38 | |
39 static const intptr_t bootstrap_library_count = ARRAY_SIZE(bootstrap_libraries); | 35 static const intptr_t bootstrap_library_count = ARRAY_SIZE(bootstrap_libraries); |
40 | 36 |
41 | |
42 void Finish(Thread* thread, bool from_kernel) { | 37 void Finish(Thread* thread, bool from_kernel) { |
43 Bootstrap::SetupNativeResolver(); | 38 Bootstrap::SetupNativeResolver(); |
44 ClassFinalizer::ProcessPendingClasses(from_kernel); | 39 ClassFinalizer::ProcessPendingClasses(from_kernel); |
45 | 40 |
46 // Eagerly compile the _Closure class as it is the class of all closure | 41 // Eagerly compile the _Closure class as it is the class of all closure |
47 // instances. This allows us to just finalize function types without going | 42 // instances. This allows us to just finalize function types without going |
48 // through the hoops of trying to compile their scope class. | 43 // through the hoops of trying to compile their scope class. |
49 ObjectStore* object_store = thread->isolate()->object_store(); | 44 ObjectStore* object_store = thread->isolate()->object_store(); |
50 Zone* zone = thread->zone(); | 45 Zone* zone = thread->zone(); |
51 Class& cls = Class::Handle(zone, object_store->closure_class()); | 46 Class& cls = Class::Handle(zone, object_store->closure_class()); |
(...skipping 12 matching lines...) Expand all Loading... |
64 ASSERT(field.Offset() == Closure::function_offset()); | 59 ASSERT(field.Offset() == Closure::function_offset()); |
65 field ^= fields.At(3); | 60 field ^= fields.At(3); |
66 ASSERT(field.Offset() == Closure::context_offset()); | 61 ASSERT(field.Offset() == Closure::context_offset()); |
67 #endif // defined(DEBUG) | 62 #endif // defined(DEBUG) |
68 | 63 |
69 // Eagerly compile Bool class, bool constants are used from within compiler. | 64 // Eagerly compile Bool class, bool constants are used from within compiler. |
70 cls = object_store->bool_class(); | 65 cls = object_store->bool_class(); |
71 Compiler::CompileClass(cls); | 66 Compiler::CompileClass(cls); |
72 } | 67 } |
73 | 68 |
74 | |
75 RawError* BootstrapFromKernel(Thread* thread, kernel::Program* program) { | 69 RawError* BootstrapFromKernel(Thread* thread, kernel::Program* program) { |
76 Zone* zone = thread->zone(); | 70 Zone* zone = thread->zone(); |
77 kernel::KernelReader reader(program); | 71 kernel::KernelReader reader(program); |
78 Isolate* isolate = thread->isolate(); | 72 Isolate* isolate = thread->isolate(); |
79 // Mark the already-pending classes. This mark bit will be used to avoid | 73 // Mark the already-pending classes. This mark bit will be used to avoid |
80 // adding classes to the list more than once. | 74 // adding classes to the list more than once. |
81 GrowableObjectArray& pending_classes = GrowableObjectArray::Handle( | 75 GrowableObjectArray& pending_classes = GrowableObjectArray::Handle( |
82 zone, isolate->object_store()->pending_classes()); | 76 zone, isolate->object_store()->pending_classes()); |
83 dart::Class& pending = dart::Class::Handle(zone); | 77 dart::Class& pending = dart::Class::Handle(zone); |
84 for (intptr_t i = 0; i < pending_classes.Length(); ++i) { | 78 for (intptr_t i = 0; i < pending_classes.Length(); ++i) { |
(...skipping 26 matching lines...) Expand all Loading... |
111 reader.ReadProgram(); | 105 reader.ReadProgram(); |
112 | 106 |
113 // The builtin library should be registered with the VM. | 107 // The builtin library should be registered with the VM. |
114 dart_name = String::New("dart:_builtin"); | 108 dart_name = String::New("dart:_builtin"); |
115 library = Library::LookupLibrary(thread, dart_name); | 109 library = Library::LookupLibrary(thread, dart_name); |
116 isolate->object_store()->set_builtin_library(library); | 110 isolate->object_store()->set_builtin_library(library); |
117 | 111 |
118 return Error::null(); | 112 return Error::null(); |
119 } | 113 } |
120 | 114 |
121 | |
122 RawError* Bootstrap::DoBootstrapping(kernel::Program* program) { | 115 RawError* Bootstrap::DoBootstrapping(kernel::Program* program) { |
123 Thread* thread = Thread::Current(); | 116 Thread* thread = Thread::Current(); |
124 Isolate* isolate = thread->isolate(); | 117 Isolate* isolate = thread->isolate(); |
125 Zone* zone = thread->zone(); | 118 Zone* zone = thread->zone(); |
126 String& uri = String::Handle(zone); | 119 String& uri = String::Handle(zone); |
127 Library& lib = Library::Handle(zone); | 120 Library& lib = Library::Handle(zone); |
128 | 121 |
129 HANDLESCOPE(thread); | 122 HANDLESCOPE(thread); |
130 | 123 |
131 // Ensure there are library objects for all the bootstrap libraries. | 124 // Ensure there are library objects for all the bootstrap libraries. |
(...skipping 13 matching lines...) Expand all Loading... |
145 return BootstrapFromKernel(thread, program); | 138 return BootstrapFromKernel(thread, program); |
146 } | 139 } |
147 #else | 140 #else |
148 RawError* Bootstrap::DoBootstrapping(kernel::Program* program) { | 141 RawError* Bootstrap::DoBootstrapping(kernel::Program* program) { |
149 UNREACHABLE(); | 142 UNREACHABLE(); |
150 return Error::null(); | 143 return Error::null(); |
151 } | 144 } |
152 #endif // !defined(DART_PRECOMPILED_RUNTIME) | 145 #endif // !defined(DART_PRECOMPILED_RUNTIME) |
153 | 146 |
154 } // namespace dart | 147 } // namespace dart |
OLD | NEW |