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 #include "vm/bootstrap_natives.h" | 9 #include "vm/bootstrap_natives.h" |
10 #include "vm/class_finalizer.h" | 10 #include "vm/class_finalizer.h" |
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
154 } else { | 154 } else { |
155 // Compilation errors are not Dart instances, so just mark the library | 155 // Compilation errors are not Dart instances, so just mark the library |
156 // as having failed to load without providing an error instance. | 156 // as having failed to load without providing an error instance. |
157 library.SetLoadError(Object::null_instance()); | 157 library.SetLoadError(Object::null_instance()); |
158 } | 158 } |
159 } | 159 } |
160 return error.raw(); | 160 return error.raw(); |
161 } | 161 } |
162 | 162 |
163 | 163 |
164 static Dart_Handle LoadPartSource(Isolate* isolate, | 164 static Dart_Handle LoadPartSource(Thread* thread, |
165 const Library& lib, | 165 const Library& lib, |
166 const String& uri) { | 166 const String& uri) { |
| 167 Zone* zone = thread->zone(); |
| 168 Isolate* isolate = thread->isolate(); |
167 const String& part_source = String::Handle( | 169 const String& part_source = String::Handle( |
168 isolate, GetLibrarySource(lib, uri, false)); | 170 zone, GetLibrarySource(lib, uri, false)); |
169 const String& lib_uri = String::Handle(isolate, lib.url()); | 171 const String& lib_uri = String::Handle(zone, lib.url()); |
170 if (part_source.IsNull()) { | 172 if (part_source.IsNull()) { |
171 return Api::NewError("Unable to read part file '%s' of library '%s'", | 173 return Api::NewError("Unable to read part file '%s' of library '%s'", |
172 uri.ToCString(), lib_uri.ToCString()); | 174 uri.ToCString(), lib_uri.ToCString()); |
173 } | 175 } |
174 | 176 |
175 // Prepend the library URI to form a unique script URI for the part. | 177 // Prepend the library URI to form a unique script URI for the part. |
176 const Array& strings = Array::Handle(isolate, Array::New(3)); | 178 const Array& strings = Array::Handle(zone, Array::New(3)); |
177 strings.SetAt(0, lib_uri); | 179 strings.SetAt(0, lib_uri); |
178 strings.SetAt(1, Symbols::Slash()); | 180 strings.SetAt(1, Symbols::Slash()); |
179 strings.SetAt(2, uri); | 181 strings.SetAt(2, uri); |
180 const String& part_uri = String::Handle(isolate, String::ConcatAll(strings)); | 182 const String& part_uri = String::Handle(zone, String::ConcatAll(strings)); |
181 | 183 |
182 // Create a script object and compile the part. | 184 // Create a script object and compile the part. |
183 const Script& part_script = Script::Handle( | 185 const Script& part_script = Script::Handle( |
184 isolate, Script::New(part_uri, part_source, RawScript::kSourceTag)); | 186 zone, Script::New(part_uri, part_source, RawScript::kSourceTag)); |
185 const Error& error = Error::Handle(isolate, Compile(lib, part_script)); | 187 const Error& error = Error::Handle(zone, Compile(lib, part_script)); |
186 return Api::NewHandle(isolate, error.raw()); | 188 return Api::NewHandle(isolate, error.raw()); |
187 } | 189 } |
188 | 190 |
189 | 191 |
190 static Dart_Handle BootstrapLibraryTagHandler(Dart_LibraryTag tag, | 192 static Dart_Handle BootstrapLibraryTagHandler(Dart_LibraryTag tag, |
191 Dart_Handle library, | 193 Dart_Handle library, |
192 Dart_Handle uri) { | 194 Dart_Handle uri) { |
193 Isolate* isolate = Isolate::Current(); | 195 Thread* thread = Thread::Current(); |
| 196 Zone* zone = thread->zone(); |
194 if (!Dart_IsLibrary(library)) { | 197 if (!Dart_IsLibrary(library)) { |
195 return Api::NewError("not a library"); | 198 return Api::NewError("not a library"); |
196 } | 199 } |
197 if (!Dart_IsString(uri)) { | 200 if (!Dart_IsString(uri)) { |
198 return Api::NewError("uri is not a string"); | 201 return Api::NewError("uri is not a string"); |
199 } | 202 } |
200 if (tag == Dart_kCanonicalizeUrl) { | 203 if (tag == Dart_kCanonicalizeUrl) { |
201 // In the bootstrap loader we do not try and do any canonicalization. | 204 // In the bootstrap loader we do not try and do any canonicalization. |
202 return uri; | 205 return uri; |
203 } | 206 } |
204 const String& uri_str = Api::UnwrapStringHandle(isolate, uri); | 207 const String& uri_str = Api::UnwrapStringHandle(zone, uri); |
205 ASSERT(!uri_str.IsNull()); | 208 ASSERT(!uri_str.IsNull()); |
206 if (tag == Dart_kImportTag) { | 209 if (tag == Dart_kImportTag) { |
207 // We expect the core bootstrap libraries to only import other | 210 // We expect the core bootstrap libraries to only import other |
208 // core bootstrap libraries. | 211 // core bootstrap libraries. |
209 // We have precreated all the bootstrap library objects hence | 212 // We have precreated all the bootstrap library objects hence |
210 // we do not expect to be called back with the tag set to kImportTag. | 213 // we do not expect to be called back with the tag set to kImportTag. |
211 // The bootstrap process explicitly loads all the libraries one by one. | 214 // The bootstrap process explicitly loads all the libraries one by one. |
212 return Api::NewError("Invalid import of '%s' in a bootstrap library", | 215 return Api::NewError("Invalid import of '%s' in a bootstrap library", |
213 uri_str.ToCString()); | 216 uri_str.ToCString()); |
214 } | 217 } |
215 ASSERT(tag == Dart_kSourceTag); | 218 ASSERT(tag == Dart_kSourceTag); |
216 const Library& lib = Api::UnwrapLibraryHandle(isolate, library); | 219 const Library& lib = Api::UnwrapLibraryHandle(zone, library); |
217 ASSERT(!lib.IsNull()); | 220 ASSERT(!lib.IsNull()); |
218 return LoadPartSource(isolate, lib, uri_str); | 221 return LoadPartSource(thread, lib, uri_str); |
219 } | 222 } |
220 | 223 |
221 | 224 |
222 static RawError* LoadPatchFiles(Isolate* isolate, | 225 static RawError* LoadPatchFiles(Zone* zone, |
223 const Library& lib, | 226 const Library& lib, |
224 const String& patch_uri, | 227 const String& patch_uri, |
225 const char** patch_files) { | 228 const char** patch_files) { |
226 String& patch_file_uri = String::Handle(isolate); | 229 String& patch_file_uri = String::Handle(zone); |
227 String& source = String::Handle(isolate); | 230 String& source = String::Handle(zone); |
228 Script& script = Script::Handle(isolate); | 231 Script& script = Script::Handle(zone); |
229 Error& error = Error::Handle(isolate); | 232 Error& error = Error::Handle(zone); |
230 const Array& strings = Array::Handle(isolate, Array::New(3)); | 233 const Array& strings = Array::Handle(zone, Array::New(3)); |
231 strings.SetAt(0, patch_uri); | 234 strings.SetAt(0, patch_uri); |
232 strings.SetAt(1, Symbols::Slash()); | 235 strings.SetAt(1, Symbols::Slash()); |
233 for (intptr_t j = 0; patch_files[j] != NULL; j += 2) { | 236 for (intptr_t j = 0; patch_files[j] != NULL; j += 2) { |
234 patch_file_uri = String::New(patch_files[j]); | 237 patch_file_uri = String::New(patch_files[j]); |
235 source = GetLibrarySource(lib, patch_file_uri, true); | 238 source = GetLibrarySource(lib, patch_file_uri, true); |
236 if (source.IsNull()) { | 239 if (source.IsNull()) { |
237 const String& message = String::Handle( | 240 const String& message = String::Handle( |
238 String::NewFormatted("Unable to find dart patch source for %s", | 241 String::NewFormatted("Unable to find dart patch source for %s", |
239 patch_file_uri.ToCString())); | 242 patch_file_uri.ToCString())); |
240 return ApiError::New(message); | 243 return ApiError::New(message); |
241 } | 244 } |
242 // Prepend the patch library URI to form a unique script URI for the patch. | 245 // Prepend the patch library URI to form a unique script URI for the patch. |
243 strings.SetAt(2, patch_file_uri); | 246 strings.SetAt(2, patch_file_uri); |
244 patch_file_uri = String::ConcatAll(strings); | 247 patch_file_uri = String::ConcatAll(strings); |
245 script = Script::New(patch_file_uri, source, RawScript::kPatchTag); | 248 script = Script::New(patch_file_uri, source, RawScript::kPatchTag); |
246 error = lib.Patch(script); | 249 error = lib.Patch(script); |
247 if (!error.IsNull()) { | 250 if (!error.IsNull()) { |
248 return error.raw(); | 251 return error.raw(); |
249 } | 252 } |
250 } | 253 } |
251 return Error::null(); | 254 return Error::null(); |
252 } | 255 } |
253 | 256 |
254 | 257 |
255 RawError* Bootstrap::LoadandCompileScripts() { | 258 RawError* Bootstrap::LoadandCompileScripts() { |
256 Thread* thread = Thread::Current(); | 259 Thread* thread = Thread::Current(); |
257 Isolate* isolate = thread->isolate(); | 260 Isolate* isolate = thread->isolate(); |
258 String& uri = String::Handle(isolate); | 261 Zone* zone = thread->zone(); |
259 String& patch_uri = String::Handle(isolate); | 262 String& uri = String::Handle(zone); |
260 String& source = String::Handle(isolate); | 263 String& patch_uri = String::Handle(zone); |
261 Script& script = Script::Handle(isolate); | 264 String& source = String::Handle(zone); |
262 Library& lib = Library::Handle(isolate); | 265 Script& script = Script::Handle(zone); |
263 Error& error = Error::Handle(isolate); | 266 Library& lib = Library::Handle(zone); |
| 267 Error& error = Error::Handle(zone); |
264 Dart_LibraryTagHandler saved_tag_handler = isolate->library_tag_handler(); | 268 Dart_LibraryTagHandler saved_tag_handler = isolate->library_tag_handler(); |
265 | 269 |
266 // Set the library tag handler for the isolate to the bootstrap | 270 // Set the library tag handler for the isolate to the bootstrap |
267 // library tag handler so that we can load all the bootstrap libraries. | 271 // library tag handler so that we can load all the bootstrap libraries. |
268 isolate->set_library_tag_handler(BootstrapLibraryTagHandler); | 272 isolate->set_library_tag_handler(BootstrapLibraryTagHandler); |
269 | 273 |
270 HANDLESCOPE(thread); | 274 HANDLESCOPE(thread); |
271 | 275 |
272 // Create library objects for all the bootstrap libraries. | 276 // Create library objects for all the bootstrap libraries. |
273 for (intptr_t i = 0; | 277 for (intptr_t i = 0; |
(...skipping 26 matching lines...) Expand all Loading... |
300 break; | 304 break; |
301 } | 305 } |
302 script = Script::New(uri, source, RawScript::kLibraryTag); | 306 script = Script::New(uri, source, RawScript::kLibraryTag); |
303 error = Compile(lib, script); | 307 error = Compile(lib, script); |
304 if (!error.IsNull()) { | 308 if (!error.IsNull()) { |
305 break; | 309 break; |
306 } | 310 } |
307 // If a patch exists, load and patch the script. | 311 // If a patch exists, load and patch the script. |
308 if (bootstrap_libraries[i].patch_paths_ != NULL) { | 312 if (bootstrap_libraries[i].patch_paths_ != NULL) { |
309 patch_uri = Symbols::New(bootstrap_libraries[i].patch_uri_); | 313 patch_uri = Symbols::New(bootstrap_libraries[i].patch_uri_); |
310 error = LoadPatchFiles(isolate, | 314 error = LoadPatchFiles(zone, |
311 lib, | 315 lib, |
312 patch_uri, | 316 patch_uri, |
313 bootstrap_libraries[i].patch_paths_); | 317 bootstrap_libraries[i].patch_paths_); |
314 if (!error.IsNull()) { | 318 if (!error.IsNull()) { |
315 break; | 319 break; |
316 } | 320 } |
317 } | 321 } |
318 } | 322 } |
319 if (error.IsNull()) { | 323 if (error.IsNull()) { |
320 SetupNativeResolver(); | 324 SetupNativeResolver(); |
321 ClassFinalizer::ProcessPendingClasses(); | 325 ClassFinalizer::ProcessPendingClasses(); |
322 | 326 |
323 Class& cls = Class::Handle(isolate); | 327 Class& cls = Class::Handle(zone); |
324 // Eagerly compile the function implementation class as it is the super | 328 // Eagerly compile the function implementation class as it is the super |
325 // class of signature classes. This allows us to just finalize signature | 329 // class of signature classes. This allows us to just finalize signature |
326 // classes without going through the hoops of trying to compile them. | 330 // classes without going through the hoops of trying to compile them. |
327 const Type& type = | 331 const Type& type = |
328 Type::Handle(isolate, isolate->object_store()->function_impl_type()); | 332 Type::Handle(zone, isolate->object_store()->function_impl_type()); |
329 cls = type.type_class(); | 333 cls = type.type_class(); |
330 Compiler::CompileClass(cls); | 334 Compiler::CompileClass(cls); |
331 } | 335 } |
332 | 336 |
333 // Restore the library tag handler for the isolate. | 337 // Restore the library tag handler for the isolate. |
334 isolate->set_library_tag_handler(saved_tag_handler); | 338 isolate->set_library_tag_handler(saved_tag_handler); |
335 | 339 |
336 return error.raw(); | 340 return error.raw(); |
337 } | 341 } |
338 | 342 |
339 } // namespace dart | 343 } // namespace dart |
OLD | NEW |