| 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 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 82 return (strncmp(url_name, kPackageScheme, kPackageSchemeLen) == 0); | 82 return (strncmp(url_name, kPackageScheme, kPackageSchemeLen) == 0); |
| 83 } | 83 } |
| 84 | 84 |
| 85 struct TestLibEntry { | 85 struct TestLibEntry { |
| 86 const char* url; | 86 const char* url; |
| 87 const char* source; | 87 const char* source; |
| 88 }; | 88 }; |
| 89 | 89 |
| 90 static MallocGrowableArray<TestLibEntry>* test_libs_ = NULL; | 90 static MallocGrowableArray<TestLibEntry>* test_libs_ = NULL; |
| 91 | 91 |
| 92 const char* TestCase::url() { |
| 93 return (FLAG_use_dart_frontend) ? RESOLVED_USER_TEST_URI : USER_TEST_URI; |
| 94 } |
| 95 |
| 92 void TestCase::AddTestLib(const char* url, const char* source) { | 96 void TestCase::AddTestLib(const char* url, const char* source) { |
| 93 if (test_libs_ == NULL) { | 97 if (test_libs_ == NULL) { |
| 94 test_libs_ = new MallocGrowableArray<TestLibEntry>(); | 98 test_libs_ = new MallocGrowableArray<TestLibEntry>(); |
| 95 } | 99 } |
| 96 // If the test lib is already added, replace the source. | 100 // If the test lib is already added, replace the source. |
| 97 for (intptr_t i = 0; i < test_libs_->length(); i++) { | 101 for (intptr_t i = 0; i < test_libs_->length(); i++) { |
| 98 if (strcmp(url, (*test_libs_)[i].url) == 0) { | 102 if (strcmp(url, (*test_libs_)[i].url) == 0) { |
| 99 (*test_libs_)[i].source = source; | 103 (*test_libs_)[i].source = source; |
| 100 return; | 104 return; |
| 101 } | 105 } |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 148 const int kNumArgs = 1; | 152 const int kNumArgs = 1; |
| 149 Dart_Handle dart_args[kNumArgs]; | 153 Dart_Handle dart_args[kNumArgs]; |
| 150 dart_args[0] = DartUtils::NewString(uri_chars); | 154 dart_args[0] = DartUtils::NewString(uri_chars); |
| 151 return Dart_Invoke(DartUtils::BuiltinLib(), | 155 return Dart_Invoke(DartUtils::BuiltinLib(), |
| 152 DartUtils::NewString("_filePathFromUri"), kNumArgs, | 156 DartUtils::NewString("_filePathFromUri"), kNumArgs, |
| 153 dart_args); | 157 dart_args); |
| 154 } | 158 } |
| 155 | 159 |
| 156 static ThreadLocalKey script_reload_key = kUnsetThreadLocalKey; | 160 static ThreadLocalKey script_reload_key = kUnsetThreadLocalKey; |
| 157 | 161 |
| 158 static char* CompileTestScriptWithDFE(const char* url, | 162 char* TestCase::CompileTestScriptWithDFE(const char* url, |
| 159 const char* source, | 163 const char* source, |
| 160 void** kernel_pgm) { | 164 void** kernel_pgm) { |
| 161 Zone* zone = Thread::Current()->zone(); | 165 Zone* zone = Thread::Current()->zone(); |
| 162 char* filename = OS::SCreate(zone, "file:///%s", url); | |
| 163 // clang-format off | 166 // clang-format off |
| 164 Dart_SourceFile sourcefiles[] = { | 167 Dart_SourceFile sourcefiles[] = { |
| 165 { | 168 { |
| 166 filename, source, | 169 url, source, |
| 167 }, | 170 }, |
| 168 { | 171 { |
| 169 "file:///.packages", "untitled:/" | 172 "file:///.packages", "untitled:/" |
| 170 }}; | 173 }}; |
| 171 // clang-format on | 174 // clang-format on |
| 172 int sourcefiles_count = sizeof(sourcefiles) / sizeof(Dart_SourceFile); | 175 int sourcefiles_count = sizeof(sourcefiles) / sizeof(Dart_SourceFile); |
| 173 Dart_KernelCompilationResult compilation_result = | 176 Dart_KernelCompilationResult compilation_result = |
| 174 Dart_CompileSourcesToKernel(filename, sourcefiles_count, sourcefiles); | 177 Dart_CompileSourcesToKernel(url, sourcefiles_count, sourcefiles); |
| 175 | 178 |
| 176 if (compilation_result.status != Dart_KernelCompilationStatus_Ok) { | 179 if (compilation_result.status != Dart_KernelCompilationStatus_Ok) { |
| 177 return OS::SCreate(zone, "Compilation failed %s", compilation_result.error); | 180 return OS::SCreate(zone, "Compilation failed %s", compilation_result.error); |
| 178 } | 181 } |
| 179 const uint8_t* kernel_file = compilation_result.kernel; | 182 const uint8_t* kernel_file = compilation_result.kernel; |
| 180 intptr_t kernel_length = compilation_result.kernel_size; | 183 intptr_t kernel_length = compilation_result.kernel_size; |
| 181 if (kernel_file == NULL) { | 184 if (kernel_file == NULL) { |
| 182 return OS::SCreate(zone, "front end generated a NULL kernel file"); | 185 return OS::SCreate(zone, "front end generated a NULL kernel file"); |
| 183 } | 186 } |
| 184 *kernel_pgm = Dart_ReadKernelBinary(kernel_file, kernel_length); | 187 *kernel_pgm = Dart_ReadKernelBinary(kernel_file, kernel_length); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 197 const char* script_source = reinterpret_cast<const char*>( | 200 const char* script_source = reinterpret_cast<const char*>( |
| 198 OSThread::GetThreadLocal(script_reload_key)); | 201 OSThread::GetThreadLocal(script_reload_key)); |
| 199 ASSERT(script_source != NULL); | 202 ASSERT(script_source != NULL); |
| 200 OSThread::SetThreadLocal(script_reload_key, 0); | 203 OSThread::SetThreadLocal(script_reload_key, 0); |
| 201 const char* urlstr = NULL; | 204 const char* urlstr = NULL; |
| 202 Dart_Handle result = Dart_StringToCString(url, &urlstr); | 205 Dart_Handle result = Dart_StringToCString(url, &urlstr); |
| 203 if (Dart_IsError(result)) { | 206 if (Dart_IsError(result)) { |
| 204 return Dart_NewApiError("accessing url characters failed"); | 207 return Dart_NewApiError("accessing url characters failed"); |
| 205 } | 208 } |
| 206 void* kernel_pgm; | 209 void* kernel_pgm; |
| 207 char* error = CompileTestScriptWithDFE(urlstr, script_source, &kernel_pgm); | 210 char* error = |
| 211 TestCase::CompileTestScriptWithDFE(urlstr, script_source, &kernel_pgm); |
| 208 if (error == NULL) { | 212 if (error == NULL) { |
| 209 return Dart_LoadKernel(kernel_pgm); | 213 return Dart_LoadScript(url, Dart_Null(), |
| 214 reinterpret_cast<Dart_Handle>(kernel_pgm), 0, 0); |
| 210 } else { | 215 } else { |
| 211 return Dart_NewApiError(error); | 216 return Dart_NewApiError(error); |
| 212 } | 217 } |
| 213 } | 218 } |
| 214 if (tag == Dart_kCanonicalizeUrl) { | 219 if (tag == Dart_kCanonicalizeUrl) { |
| 215 Dart_Handle library_url = Dart_LibraryUrl(library); | 220 Dart_Handle library_url = Dart_LibraryUrl(library); |
| 216 if (Dart_IsError(library_url)) { | 221 if (Dart_IsError(library_url)) { |
| 217 return library_url; | 222 return library_url; |
| 218 } | 223 } |
| 219 return Dart_DefaultCanonicalizeUrl(library_url, url); | 224 return Dart_DefaultCanonicalizeUrl(library_url, url); |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 314 result = Dart_FinalizeLoading(false); | 319 result = Dart_FinalizeLoading(false); |
| 315 DART_CHECK_VALID(result); | 320 DART_CHECK_VALID(result); |
| 316 } | 321 } |
| 317 return lib; | 322 return lib; |
| 318 } | 323 } |
| 319 | 324 |
| 320 static Dart_Handle LoadTestScriptWithDFE(const char* script, | 325 static Dart_Handle LoadTestScriptWithDFE(const char* script, |
| 321 Dart_NativeEntryResolver resolver, | 326 Dart_NativeEntryResolver resolver, |
| 322 const char* lib_url, | 327 const char* lib_url, |
| 323 bool finalize_classes) { | 328 bool finalize_classes) { |
| 329 Dart_Handle url = NewString(lib_url); |
| 324 Dart_Handle result = Dart_SetLibraryTagHandler(LibraryTagHandler); | 330 Dart_Handle result = Dart_SetLibraryTagHandler(LibraryTagHandler); |
| 325 EXPECT_VALID(result); | 331 EXPECT_VALID(result); |
| 326 void* kernel_pgm = NULL; | 332 void* kernel_pgm = NULL; |
| 327 char* error = CompileTestScriptWithDFE(lib_url, script, &kernel_pgm); | 333 char* error = |
| 334 TestCase::CompileTestScriptWithDFE(lib_url, script, &kernel_pgm); |
| 328 if (error == NULL) { | 335 if (error == NULL) { |
| 329 Dart_Handle lib = Dart_LoadKernel(kernel_pgm); | 336 Dart_Handle lib = Dart_LoadScript( |
| 337 url, Dart_Null(), reinterpret_cast<Dart_Handle>(kernel_pgm), 0, 0); |
| 330 DART_CHECK_VALID(lib); | 338 DART_CHECK_VALID(lib); |
| 331 result = Dart_SetNativeResolver(lib, resolver, NULL); | 339 result = Dart_SetNativeResolver(lib, resolver, NULL); |
| 332 DART_CHECK_VALID(result); | 340 DART_CHECK_VALID(result); |
| 333 if (finalize_classes) { | 341 if (finalize_classes) { |
| 334 result = Dart_FinalizeLoading(false); | 342 result = Dart_FinalizeLoading(false); |
| 335 DART_CHECK_VALID(result); | 343 DART_CHECK_VALID(result); |
| 336 } | 344 } |
| 337 return lib; | 345 return lib; |
| 338 } else { | 346 } else { |
| 339 return Dart_NewApiError(error); | 347 return Dart_NewApiError(error); |
| 340 } | 348 } |
| 341 } | 349 } |
| 342 | 350 |
| 343 Dart_Handle TestCase::LoadTestScript(const char* script, | 351 Dart_Handle TestCase::LoadTestScript(const char* script, |
| 344 Dart_NativeEntryResolver resolver, | 352 Dart_NativeEntryResolver resolver, |
| 345 const char* lib_url, | 353 const char* lib_url, |
| 346 bool finalize_classes) { | 354 bool finalize_classes) { |
| 347 if (!FLAG_use_dart_frontend) { | 355 if (!FLAG_use_dart_frontend) { |
| 348 return LoadTestScriptWithVMParser(script, resolver, lib_url, | 356 return LoadTestScriptWithVMParser(script, resolver, lib_url, |
| 349 finalize_classes); | 357 finalize_classes); |
| 350 } else { | 358 } else { |
| 351 return LoadTestScriptWithDFE(script, resolver, lib_url, finalize_classes); | 359 Zone* zone = Thread::Current()->zone(); |
| 360 char* resolved_lib_url = OS::SCreate(zone, "file:///%s", lib_url); |
| 361 return LoadTestScriptWithDFE(script, resolver, resolved_lib_url, |
| 362 finalize_classes); |
| 352 } | 363 } |
| 353 } | 364 } |
| 354 | 365 |
| 355 #ifndef PRODUCT | 366 #ifndef PRODUCT |
| 356 | 367 |
| 357 void TestCase::SetReloadTestScript(const char* script) { | 368 void TestCase::SetReloadTestScript(const char* script) { |
| 358 if (script_reload_key == kUnsetThreadLocalKey) { | 369 if (script_reload_key == kUnsetThreadLocalKey) { |
| 359 script_reload_key = OSThread::CreateThreadLocal(); | 370 script_reload_key = OSThread::CreateThreadLocal(); |
| 360 } | 371 } |
| 361 ASSERT(script_reload_key != kUnsetThreadLocalKey); | 372 ASSERT(script_reload_key != kUnsetThreadLocalKey); |
| (...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 549 pos = strstr(in, prefix); | 560 pos = strstr(in, prefix); |
| 550 } | 561 } |
| 551 // Copy the remainder of in to out. | 562 // Copy the remainder of in to out. |
| 552 while (*in != '\0') { | 563 while (*in != '\0') { |
| 553 *out++ = *in++; | 564 *out++ = *in++; |
| 554 } | 565 } |
| 555 *out = '\0'; | 566 *out = '\0'; |
| 556 } | 567 } |
| 557 | 568 |
| 558 } // namespace dart | 569 } // namespace dart |
| OLD | NEW |