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/unit_test.h" | 5 #include "vm/unit_test.h" |
6 | 6 |
7 #include <stdio.h> | 7 #include <stdio.h> |
8 | 8 |
9 #include "bin/builtin.h" | 9 #include "bin/builtin.h" |
10 #include "bin/dartutils.h" | 10 #include "bin/dartutils.h" |
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
157 static Dart_Handle ResolvePackageUri(const char* uri_chars) { | 157 static Dart_Handle ResolvePackageUri(const char* uri_chars) { |
158 const int kNumArgs = 1; | 158 const int kNumArgs = 1; |
159 Dart_Handle dart_args[kNumArgs]; | 159 Dart_Handle dart_args[kNumArgs]; |
160 dart_args[0] = DartUtils::NewString(uri_chars); | 160 dart_args[0] = DartUtils::NewString(uri_chars); |
161 return Dart_Invoke(DartUtils::BuiltinLib(), | 161 return Dart_Invoke(DartUtils::BuiltinLib(), |
162 DartUtils::NewString("_filePathFromUri"), kNumArgs, | 162 DartUtils::NewString("_filePathFromUri"), kNumArgs, |
163 dart_args); | 163 dart_args); |
164 } | 164 } |
165 | 165 |
166 static ThreadLocalKey script_reload_key = kUnsetThreadLocalKey; | 166 static ThreadLocalKey script_reload_key = kUnsetThreadLocalKey; |
167 static ThreadLocalKey kernel_reload_key = kUnsetThreadLocalKey; | |
168 | 167 |
169 char* TestCase::CompileTestScriptWithDFE(const char* url, | 168 char* TestCase::CompileTestScriptWithDFE(const char* url, |
170 const char* source, | 169 const char* source, |
171 void** kernel_pgm, | 170 void** kernel_pgm) { |
172 bool incrementally) { | 171 Zone* zone = Thread::Current()->zone(); |
173 // clang-format off | 172 // clang-format off |
174 Dart_SourceFile sourcefiles[] = { | 173 Dart_SourceFile sourcefiles[] = { |
175 { | 174 { |
176 url, source, | 175 url, source, |
177 }, | 176 }, |
178 { | 177 { |
179 "file:///.packages", "untitled:/" | 178 "file:///.packages", "untitled:/" |
180 }}; | 179 }}; |
181 // clang-format on | 180 // clang-format on |
182 return CompileTestScriptWithDFE(url, | 181 int sourcefiles_count = sizeof(sourcefiles) / sizeof(Dart_SourceFile); |
183 sizeof(sourcefiles) / sizeof(Dart_SourceFile), | 182 Dart_KernelCompilationResult compilation_result = |
184 sourcefiles, kernel_pgm, incrementally); | 183 Dart_CompileSourcesToKernel(url, sourcefiles_count, sourcefiles); |
185 } | |
186 | |
187 char* TestCase::CompileTestScriptWithDFE(const char* url, | |
188 int sourcefiles_count, | |
189 Dart_SourceFile sourcefiles[], | |
190 void** kernel_pgm, | |
191 bool incrementally) { | |
192 Zone* zone = Thread::Current()->zone(); | |
193 Dart_KernelCompilationResult compilation_result = Dart_CompileSourcesToKernel( | |
194 url, sourcefiles_count, sourcefiles, incrementally); | |
195 | 184 |
196 if (compilation_result.status != Dart_KernelCompilationStatus_Ok) { | 185 if (compilation_result.status != Dart_KernelCompilationStatus_Ok) { |
197 return OS::SCreate(zone, "Compilation failed %s", compilation_result.error); | 186 return OS::SCreate(zone, "Compilation failed %s", compilation_result.error); |
198 } | 187 } |
199 const uint8_t* kernel_file = compilation_result.kernel; | 188 const uint8_t* kernel_file = compilation_result.kernel; |
200 intptr_t kernel_length = compilation_result.kernel_size; | 189 intptr_t kernel_length = compilation_result.kernel_size; |
201 if (kernel_file == NULL) { | 190 if (kernel_file == NULL) { |
202 return OS::SCreate(zone, "front end generated a NULL kernel file"); | 191 return OS::SCreate(zone, "front end generated a NULL kernel file"); |
203 } | 192 } |
204 *kernel_pgm = Dart_ReadKernelBinary(kernel_file, kernel_length); | 193 *kernel_pgm = Dart_ReadKernelBinary(kernel_file, kernel_length); |
205 if (*kernel_pgm == NULL) { | 194 if (*kernel_pgm == NULL) { |
206 return OS::SCreate(zone, "Failed to read generated kernel binary"); | 195 return OS::SCreate(zone, "Failed to read generated kernel binary"); |
207 } | 196 } |
208 return NULL; | 197 return NULL; |
209 } | 198 } |
210 | 199 |
211 static Dart_Handle LibraryTagHandler(Dart_LibraryTag tag, | 200 static Dart_Handle LibraryTagHandler(Dart_LibraryTag tag, |
212 Dart_Handle library, | 201 Dart_Handle library, |
213 Dart_Handle url) { | 202 Dart_Handle url) { |
214 if (FLAG_use_dart_frontend) { | 203 if (FLAG_use_dart_frontend) { |
215 // Reload request. | 204 // Reload request. |
216 | 205 ASSERT(script_reload_key != kUnsetThreadLocalKey); |
| 206 const char* script_source = reinterpret_cast<const char*>( |
| 207 OSThread::GetThreadLocal(script_reload_key)); |
| 208 ASSERT(script_source != NULL); |
| 209 OSThread::SetThreadLocal(script_reload_key, 0); |
217 const char* urlstr = NULL; | 210 const char* urlstr = NULL; |
218 Dart_Handle result = Dart_StringToCString(url, &urlstr); | 211 Dart_Handle result = Dart_StringToCString(url, &urlstr); |
219 if (Dart_IsError(result)) { | 212 if (Dart_IsError(result)) { |
220 return Dart_NewApiError("accessing url characters failed"); | 213 return Dart_NewApiError("accessing url characters failed"); |
221 } | 214 } |
222 | |
223 // Updated library either arrives as dart source or as | |
224 // a precompiled kernel binary. | |
225 void* kernel_pgm; | 215 void* kernel_pgm; |
226 if (script_reload_key != kUnsetThreadLocalKey) { | 216 char* error = |
227 const char* script_source = reinterpret_cast<const char*>( | 217 TestCase::CompileTestScriptWithDFE(urlstr, script_source, &kernel_pgm); |
228 OSThread::GetThreadLocal(script_reload_key)); | 218 if (error == NULL) { |
229 ASSERT(script_source != NULL); | 219 return Dart_LoadScript(url, Dart_Null(), |
230 OSThread::SetThreadLocal(script_reload_key, 0); | 220 reinterpret_cast<Dart_Handle>(kernel_pgm), 0, 0); |
231 char* error = TestCase::CompileTestScriptWithDFE(urlstr, script_source, | |
232 &kernel_pgm); | |
233 if (error != NULL) { | |
234 return Dart_NewApiError(error); | |
235 } | |
236 } else { | 221 } else { |
237 ASSERT(kernel_reload_key != kUnsetThreadLocalKey); | 222 return Dart_NewApiError(error); |
238 kernel_pgm = | |
239 reinterpret_cast<void*>(OSThread::GetThreadLocal(kernel_reload_key)); | |
240 ASSERT(kernel_pgm != NULL); | |
241 OSThread::SetThreadLocal(kernel_reload_key, 0); | |
242 } | 223 } |
243 return Dart_LoadScript(url, Dart_Null(), | |
244 reinterpret_cast<Dart_Handle>(kernel_pgm), 0, 0); | |
245 } | 224 } |
246 if (tag == Dart_kCanonicalizeUrl) { | 225 if (tag == Dart_kCanonicalizeUrl) { |
247 Dart_Handle library_url = Dart_LibraryUrl(library); | 226 Dart_Handle library_url = Dart_LibraryUrl(library); |
248 if (Dart_IsError(library_url)) { | 227 if (Dart_IsError(library_url)) { |
249 return library_url; | 228 return library_url; |
250 } | 229 } |
251 return Dart_DefaultCanonicalizeUrl(library_url, url); | 230 return Dart_DefaultCanonicalizeUrl(library_url, url); |
252 } | 231 } |
253 if (tag == Dart_kScriptTag) { | 232 if (tag == Dart_kScriptTag) { |
254 // Reload request. | 233 // Reload request. |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
342 DART_CHECK_VALID(lib); | 321 DART_CHECK_VALID(lib); |
343 result = Dart_SetNativeResolver(lib, resolver, NULL); | 322 result = Dart_SetNativeResolver(lib, resolver, NULL); |
344 DART_CHECK_VALID(result); | 323 DART_CHECK_VALID(result); |
345 if (finalize_classes) { | 324 if (finalize_classes) { |
346 result = Dart_FinalizeLoading(false); | 325 result = Dart_FinalizeLoading(false); |
347 DART_CHECK_VALID(result); | 326 DART_CHECK_VALID(result); |
348 } | 327 } |
349 return lib; | 328 return lib; |
350 } | 329 } |
351 | 330 |
| 331 static Dart_Handle LoadTestScriptWithDFE(const char* script, |
| 332 Dart_NativeEntryResolver resolver, |
| 333 const char* lib_url, |
| 334 bool finalize_classes) { |
| 335 Dart_Handle url = NewString(lib_url); |
| 336 Dart_Handle result = Dart_SetLibraryTagHandler(LibraryTagHandler); |
| 337 EXPECT_VALID(result); |
| 338 void* kernel_pgm = NULL; |
| 339 char* error = |
| 340 TestCase::CompileTestScriptWithDFE(lib_url, script, &kernel_pgm); |
| 341 if (error == NULL) { |
| 342 Dart_Handle lib = Dart_LoadScript( |
| 343 url, Dart_Null(), reinterpret_cast<Dart_Handle>(kernel_pgm), 0, 0); |
| 344 DART_CHECK_VALID(lib); |
| 345 result = Dart_SetNativeResolver(lib, resolver, NULL); |
| 346 DART_CHECK_VALID(result); |
| 347 if (finalize_classes) { |
| 348 result = Dart_FinalizeLoading(false); |
| 349 DART_CHECK_VALID(result); |
| 350 } |
| 351 return lib; |
| 352 } else { |
| 353 return Dart_NewApiError(error); |
| 354 } |
| 355 } |
| 356 |
352 Dart_Handle TestCase::LoadTestScript(const char* script, | 357 Dart_Handle TestCase::LoadTestScript(const char* script, |
353 Dart_NativeEntryResolver resolver, | 358 Dart_NativeEntryResolver resolver, |
354 const char* lib_url, | 359 const char* lib_url, |
355 bool finalize_classes) { | 360 bool finalize_classes) { |
356 return FLAG_use_dart_frontend | 361 if (!FLAG_use_dart_frontend) { |
357 ? LoadTestScriptWithDFE( | 362 return LoadTestScriptWithVMParser(script, resolver, lib_url, |
358 1, | 363 finalize_classes); |
359 (Dart_SourceFile[1]){{OS::SCreate(Thread::Current()->zone(), | 364 } else { |
360 "file:///%s", lib_url), | 365 Zone* zone = Thread::Current()->zone(); |
361 script}}, | 366 char* resolved_lib_url = OS::SCreate(zone, "file:///%s", lib_url); |
362 resolver, finalize_classes) | 367 return LoadTestScriptWithDFE(script, resolver, resolved_lib_url, |
363 : LoadTestScriptWithVMParser(script, resolver, lib_url, | 368 finalize_classes); |
364 finalize_classes); | |
365 } | |
366 | |
367 Dart_Handle TestCase::LoadTestScriptWithDFE(int sourcefiles_count, | |
368 Dart_SourceFile sourcefiles[], | |
369 Dart_NativeEntryResolver resolver, | |
370 bool finalize, | |
371 bool incrementally) { | |
372 // First script is the main script. | |
373 Dart_Handle url = NewString(sourcefiles[0].uri); | |
374 Dart_Handle result = Dart_SetLibraryTagHandler(LibraryTagHandler); | |
375 EXPECT_VALID(result); | |
376 void* kernel_pgm = NULL; | |
377 char* error = TestCase::CompileTestScriptWithDFE( | |
378 sourcefiles[0].uri, sourcefiles_count, sourcefiles, &kernel_pgm, | |
379 incrementally); | |
380 if (error != NULL) { | |
381 return Dart_NewApiError(error); | |
382 } | 369 } |
383 Dart_Handle lib = Dart_LoadScript( | |
384 url, Dart_Null(), reinterpret_cast<Dart_Handle>(kernel_pgm), 0, 0); | |
385 DART_CHECK_VALID(lib); | |
386 result = Dart_SetNativeResolver(lib, resolver, NULL); | |
387 DART_CHECK_VALID(result); | |
388 if (finalize) { | |
389 result = Dart_FinalizeLoading(false); | |
390 DART_CHECK_VALID(result); | |
391 } | |
392 return lib; | |
393 } | 370 } |
394 | 371 |
395 #ifndef PRODUCT | 372 #ifndef PRODUCT |
396 | 373 |
397 void TestCase::SetReloadTestScript(const char* script) { | 374 void TestCase::SetReloadTestScript(const char* script) { |
398 if (script_reload_key == kUnsetThreadLocalKey) { | 375 if (script_reload_key == kUnsetThreadLocalKey) { |
399 script_reload_key = OSThread::CreateThreadLocal(); | 376 script_reload_key = OSThread::CreateThreadLocal(); |
400 } | 377 } |
401 ASSERT(script_reload_key != kUnsetThreadLocalKey); | 378 ASSERT(script_reload_key != kUnsetThreadLocalKey); |
402 ASSERT(OSThread::GetThreadLocal(script_reload_key) == 0); | 379 ASSERT(OSThread::GetThreadLocal(script_reload_key) == 0); |
403 // Store the new script in TLS. | 380 // Store the new script in TLS. |
404 OSThread::SetThreadLocal(script_reload_key, reinterpret_cast<uword>(script)); | 381 OSThread::SetThreadLocal(script_reload_key, reinterpret_cast<uword>(script)); |
405 } | 382 } |
406 | 383 |
407 void TestCase::SetReloadTestKernel(const void* kernel) { | |
408 if (kernel_reload_key == kUnsetThreadLocalKey) { | |
409 kernel_reload_key = OSThread::CreateThreadLocal(); | |
410 } | |
411 ASSERT(kernel_reload_key != kUnsetThreadLocalKey); | |
412 ASSERT(OSThread::GetThreadLocal(kernel_reload_key) == 0); | |
413 // Store the new script in TLS. | |
414 OSThread::SetThreadLocal(kernel_reload_key, reinterpret_cast<uword>(kernel)); | |
415 } | |
416 | |
417 Dart_Handle TestCase::TriggerReload() { | 384 Dart_Handle TestCase::TriggerReload() { |
418 Isolate* isolate = Isolate::Current(); | 385 Isolate* isolate = Isolate::Current(); |
419 JSONStream js; | 386 JSONStream js; |
420 bool success = false; | 387 bool success = false; |
421 { | 388 { |
422 TransitionNativeToVM transition(Thread::Current()); | 389 TransitionNativeToVM transition(Thread::Current()); |
423 success = isolate->ReloadSources(&js, | 390 success = isolate->ReloadSources(&js, |
424 false, // force_reload | 391 false, // force_reload |
425 NULL, NULL, | 392 NULL, NULL, |
426 true); // dont_delete_reload_context | 393 true); // dont_delete_reload_context |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
461 TransitionNativeToVM transition(thread); | 428 TransitionNativeToVM transition(thread); |
462 Isolate* isolate = thread->isolate(); | 429 Isolate* isolate = thread->isolate(); |
463 if (isolate->reload_context() != NULL) { | 430 if (isolate->reload_context() != NULL) { |
464 isolate->DeleteReloadContext(); | 431 isolate->DeleteReloadContext(); |
465 } | 432 } |
466 } | 433 } |
467 | 434 |
468 return result; | 435 return result; |
469 } | 436 } |
470 | 437 |
471 Dart_Handle TestCase::ReloadTestKernel(const void* kernel) { | |
472 SetReloadTestKernel(kernel); | |
473 | |
474 Dart_Handle result = TriggerReload(); | |
475 if (Dart_IsError(result)) { | |
476 return result; | |
477 } | |
478 | |
479 result = GetReloadErrorOrRootLibrary(); | |
480 | |
481 { | |
482 Thread* thread = Thread::Current(); | |
483 TransitionNativeToVM transition(thread); | |
484 Isolate* isolate = thread->isolate(); | |
485 if (isolate->reload_context() != NULL) { | |
486 isolate->DeleteReloadContext(); | |
487 } | |
488 } | |
489 | |
490 return result; | |
491 } | |
492 | |
493 #endif // !PRODUCT | 438 #endif // !PRODUCT |
494 | 439 |
495 Dart_Handle TestCase::LoadCoreTestScript(const char* script, | 440 Dart_Handle TestCase::LoadCoreTestScript(const char* script, |
496 Dart_NativeEntryResolver resolver) { | 441 Dart_NativeEntryResolver resolver) { |
497 return LoadTestScript(script, resolver, CORELIB_TEST_URI); | 442 return LoadTestScript(script, resolver, CORELIB_TEST_URI); |
498 } | 443 } |
499 | 444 |
500 Dart_Handle TestCase::lib() { | 445 Dart_Handle TestCase::lib() { |
501 Dart_Handle url = NewString(TestCase::url()); | 446 Dart_Handle url = NewString(TestCase::url()); |
502 Dart_Handle lib = Dart_LookupLibrary(url); | 447 Dart_Handle lib = Dart_LookupLibrary(url); |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
621 pos = strstr(in, prefix); | 566 pos = strstr(in, prefix); |
622 } | 567 } |
623 // Copy the remainder of in to out. | 568 // Copy the remainder of in to out. |
624 while (*in != '\0') { | 569 while (*in != '\0') { |
625 *out++ = *in++; | 570 *out++ = *in++; |
626 } | 571 } |
627 *out = '\0'; | 572 *out = '\0'; |
628 } | 573 } |
629 | 574 |
630 } // namespace dart | 575 } // namespace dart |
OLD | NEW |