Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(522)

Side by Side Diff: runtime/vm/unit_test.cc

Issue 2993013002: Introduce IKG into kernel-service to support incremental compilation. (Closed)
Patch Set: Add TODO to add assert that isolate exists. Created 3 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « runtime/vm/unit_test.h ('k') | utils/kernel-service/kernel-service.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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;
167 168
168 char* TestCase::CompileTestScriptWithDFE(const char* url, 169 char* TestCase::CompileTestScriptWithDFE(const char* url,
169 const char* source, 170 const char* source,
170 void** kernel_pgm) { 171 void** kernel_pgm,
171 Zone* zone = Thread::Current()->zone(); 172 bool incrementally) {
172 // clang-format off 173 // clang-format off
173 Dart_SourceFile sourcefiles[] = { 174 Dart_SourceFile sourcefiles[] = {
174 { 175 {
175 url, source, 176 url, source,
176 }, 177 },
177 { 178 {
178 "file:///.packages", "untitled:/" 179 "file:///.packages", "untitled:/"
179 }}; 180 }};
180 // clang-format on 181 // clang-format on
181 int sourcefiles_count = sizeof(sourcefiles) / sizeof(Dart_SourceFile); 182 return CompileTestScriptWithDFE(url,
182 Dart_KernelCompilationResult compilation_result = 183 sizeof(sourcefiles) / sizeof(Dart_SourceFile),
183 Dart_CompileSourcesToKernel(url, sourcefiles_count, sourcefiles); 184 sourcefiles, kernel_pgm, incrementally);
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);
184 195
185 if (compilation_result.status != Dart_KernelCompilationStatus_Ok) { 196 if (compilation_result.status != Dart_KernelCompilationStatus_Ok) {
186 return OS::SCreate(zone, "Compilation failed %s", compilation_result.error); 197 return OS::SCreate(zone, "Compilation failed %s", compilation_result.error);
187 } 198 }
188 const uint8_t* kernel_file = compilation_result.kernel; 199 const uint8_t* kernel_file = compilation_result.kernel;
189 intptr_t kernel_length = compilation_result.kernel_size; 200 intptr_t kernel_length = compilation_result.kernel_size;
190 if (kernel_file == NULL) { 201 if (kernel_file == NULL) {
191 return OS::SCreate(zone, "front end generated a NULL kernel file"); 202 return OS::SCreate(zone, "front end generated a NULL kernel file");
192 } 203 }
193 *kernel_pgm = Dart_ReadKernelBinary(kernel_file, kernel_length); 204 *kernel_pgm = Dart_ReadKernelBinary(kernel_file, kernel_length);
194 if (*kernel_pgm == NULL) { 205 if (*kernel_pgm == NULL) {
195 return OS::SCreate(zone, "Failed to read generated kernel binary"); 206 return OS::SCreate(zone, "Failed to read generated kernel binary");
196 } 207 }
197 return NULL; 208 return NULL;
198 } 209 }
199 210
200 static Dart_Handle LibraryTagHandler(Dart_LibraryTag tag, 211 static Dart_Handle LibraryTagHandler(Dart_LibraryTag tag,
201 Dart_Handle library, 212 Dart_Handle library,
202 Dart_Handle url) { 213 Dart_Handle url) {
203 if (FLAG_use_dart_frontend) { 214 if (FLAG_use_dart_frontend) {
204 // Reload request. 215 // Reload request.
205 ASSERT(script_reload_key != kUnsetThreadLocalKey); 216
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);
210 const char* urlstr = NULL; 217 const char* urlstr = NULL;
211 Dart_Handle result = Dart_StringToCString(url, &urlstr); 218 Dart_Handle result = Dart_StringToCString(url, &urlstr);
212 if (Dart_IsError(result)) { 219 if (Dart_IsError(result)) {
213 return Dart_NewApiError("accessing url characters failed"); 220 return Dart_NewApiError("accessing url characters failed");
214 } 221 }
222
223 // Updated library either arrives as dart source or as
224 // a precompiled kernel binary.
215 void* kernel_pgm; 225 void* kernel_pgm;
216 char* error = 226 if (script_reload_key != kUnsetThreadLocalKey) {
217 TestCase::CompileTestScriptWithDFE(urlstr, script_source, &kernel_pgm); 227 const char* script_source = reinterpret_cast<const char*>(
218 if (error == NULL) { 228 OSThread::GetThreadLocal(script_reload_key));
219 return Dart_LoadScript(url, Dart_Null(), 229 ASSERT(script_source != NULL);
220 reinterpret_cast<Dart_Handle>(kernel_pgm), 0, 0); 230 OSThread::SetThreadLocal(script_reload_key, 0);
231 char* error = TestCase::CompileTestScriptWithDFE(urlstr, script_source,
232 &kernel_pgm);
233 if (error != NULL) {
234 return Dart_NewApiError(error);
235 }
221 } else { 236 } else {
222 return Dart_NewApiError(error); 237 ASSERT(kernel_reload_key != kUnsetThreadLocalKey);
238 kernel_pgm =
239 reinterpret_cast<void*>(OSThread::GetThreadLocal(kernel_reload_key));
240 ASSERT(kernel_pgm != NULL);
241 OSThread::SetThreadLocal(kernel_reload_key, 0);
223 } 242 }
243 return Dart_LoadScript(url, Dart_Null(),
244 reinterpret_cast<Dart_Handle>(kernel_pgm), 0, 0);
224 } 245 }
225 if (tag == Dart_kCanonicalizeUrl) { 246 if (tag == Dart_kCanonicalizeUrl) {
226 Dart_Handle library_url = Dart_LibraryUrl(library); 247 Dart_Handle library_url = Dart_LibraryUrl(library);
227 if (Dart_IsError(library_url)) { 248 if (Dart_IsError(library_url)) {
228 return library_url; 249 return library_url;
229 } 250 }
230 return Dart_DefaultCanonicalizeUrl(library_url, url); 251 return Dart_DefaultCanonicalizeUrl(library_url, url);
231 } 252 }
232 if (tag == Dart_kScriptTag) { 253 if (tag == Dart_kScriptTag) {
233 // Reload request. 254 // Reload request.
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
321 DART_CHECK_VALID(lib); 342 DART_CHECK_VALID(lib);
322 result = Dart_SetNativeResolver(lib, resolver, NULL); 343 result = Dart_SetNativeResolver(lib, resolver, NULL);
323 DART_CHECK_VALID(result); 344 DART_CHECK_VALID(result);
324 if (finalize_classes) { 345 if (finalize_classes) {
325 result = Dart_FinalizeLoading(false); 346 result = Dart_FinalizeLoading(false);
326 DART_CHECK_VALID(result); 347 DART_CHECK_VALID(result);
327 } 348 }
328 return lib; 349 return lib;
329 } 350 }
330 351
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
357 Dart_Handle TestCase::LoadTestScript(const char* script, 352 Dart_Handle TestCase::LoadTestScript(const char* script,
358 Dart_NativeEntryResolver resolver, 353 Dart_NativeEntryResolver resolver,
359 const char* lib_url, 354 const char* lib_url,
360 bool finalize_classes) { 355 bool finalize_classes) {
361 if (!FLAG_use_dart_frontend) { 356 return FLAG_use_dart_frontend
362 return LoadTestScriptWithVMParser(script, resolver, lib_url, 357 ? LoadTestScriptWithDFE(
363 finalize_classes); 358 1,
364 } else { 359 (Dart_SourceFile[1]){{OS::SCreate(Thread::Current()->zone(),
365 Zone* zone = Thread::Current()->zone(); 360 "file:///%s", lib_url),
366 char* resolved_lib_url = OS::SCreate(zone, "file:///%s", lib_url); 361 script}},
367 return LoadTestScriptWithDFE(script, resolver, resolved_lib_url, 362 resolver, finalize_classes)
368 finalize_classes); 363 : LoadTestScriptWithVMParser(script, resolver, lib_url,
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);
369 } 382 }
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;
370 } 393 }
371 394
372 #ifndef PRODUCT 395 #ifndef PRODUCT
373 396
374 void TestCase::SetReloadTestScript(const char* script) { 397 void TestCase::SetReloadTestScript(const char* script) {
375 if (script_reload_key == kUnsetThreadLocalKey) { 398 if (script_reload_key == kUnsetThreadLocalKey) {
376 script_reload_key = OSThread::CreateThreadLocal(); 399 script_reload_key = OSThread::CreateThreadLocal();
377 } 400 }
378 ASSERT(script_reload_key != kUnsetThreadLocalKey); 401 ASSERT(script_reload_key != kUnsetThreadLocalKey);
379 ASSERT(OSThread::GetThreadLocal(script_reload_key) == 0); 402 ASSERT(OSThread::GetThreadLocal(script_reload_key) == 0);
380 // Store the new script in TLS. 403 // Store the new script in TLS.
381 OSThread::SetThreadLocal(script_reload_key, reinterpret_cast<uword>(script)); 404 OSThread::SetThreadLocal(script_reload_key, reinterpret_cast<uword>(script));
382 } 405 }
383 406
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
384 Dart_Handle TestCase::TriggerReload() { 417 Dart_Handle TestCase::TriggerReload() {
385 Isolate* isolate = Isolate::Current(); 418 Isolate* isolate = Isolate::Current();
386 JSONStream js; 419 JSONStream js;
387 bool success = false; 420 bool success = false;
388 { 421 {
389 TransitionNativeToVM transition(Thread::Current()); 422 TransitionNativeToVM transition(Thread::Current());
390 success = isolate->ReloadSources(&js, 423 success = isolate->ReloadSources(&js,
391 false, // force_reload 424 false, // force_reload
392 NULL, NULL, 425 NULL, NULL,
393 true); // dont_delete_reload_context 426 true); // dont_delete_reload_context
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
428 TransitionNativeToVM transition(thread); 461 TransitionNativeToVM transition(thread);
429 Isolate* isolate = thread->isolate(); 462 Isolate* isolate = thread->isolate();
430 if (isolate->reload_context() != NULL) { 463 if (isolate->reload_context() != NULL) {
431 isolate->DeleteReloadContext(); 464 isolate->DeleteReloadContext();
432 } 465 }
433 } 466 }
434 467
435 return result; 468 return result;
436 } 469 }
437 470
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
438 #endif // !PRODUCT 493 #endif // !PRODUCT
439 494
440 Dart_Handle TestCase::LoadCoreTestScript(const char* script, 495 Dart_Handle TestCase::LoadCoreTestScript(const char* script,
441 Dart_NativeEntryResolver resolver) { 496 Dart_NativeEntryResolver resolver) {
442 return LoadTestScript(script, resolver, CORELIB_TEST_URI); 497 return LoadTestScript(script, resolver, CORELIB_TEST_URI);
443 } 498 }
444 499
445 Dart_Handle TestCase::lib() { 500 Dart_Handle TestCase::lib() {
446 Dart_Handle url = NewString(TestCase::url()); 501 Dart_Handle url = NewString(TestCase::url());
447 Dart_Handle lib = Dart_LookupLibrary(url); 502 Dart_Handle lib = Dart_LookupLibrary(url);
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
566 pos = strstr(in, prefix); 621 pos = strstr(in, prefix);
567 } 622 }
568 // Copy the remainder of in to out. 623 // Copy the remainder of in to out.
569 while (*in != '\0') { 624 while (*in != '\0') {
570 *out++ = *in++; 625 *out++ = *in++;
571 } 626 }
572 *out = '\0'; 627 *out = '\0';
573 } 628 }
574 629
575 } // namespace dart 630 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/unit_test.h ('k') | utils/kernel-service/kernel-service.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698