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