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 <stdlib.h> | 5 #include <stdlib.h> |
6 #include <string.h> | 6 #include <string.h> |
7 #include <stdio.h> | 7 #include <stdio.h> |
8 | 8 |
9 #include "include/dart_api.h" | 9 #include "include/dart_api.h" |
10 #include "include/dart_debugger_api.h" | 10 #include "include/dart_debugger_api.h" |
11 | 11 |
12 #include "bin/builtin.h" | 12 #include "bin/builtin.h" |
13 #include "bin/dartutils.h" | 13 #include "bin/dartutils.h" |
14 #include "bin/dbg_connection.h" | 14 #include "bin/dbg_connection.h" |
15 #include "bin/directory.h" | 15 #include "bin/directory.h" |
16 #include "bin/eventhandler.h" | 16 #include "bin/eventhandler.h" |
17 #include "bin/extensions.h" | 17 #include "bin/extensions.h" |
18 #include "bin/file.h" | 18 #include "bin/file.h" |
19 #include "bin/platform.h" | 19 #include "bin/platform.h" |
20 #include "bin/process.h" | 20 #include "bin/process.h" |
21 #include "platform/globals.h" | 21 #include "platform/globals.h" |
22 | 22 |
23 // snapshot_buffer points to a snapshot if we link in a snapshot otherwise | 23 // snapshot_buffer points to a snapshot if we link in a snapshot otherwise |
24 // it is initialized to NULL. | 24 // it is initialized to NULL. |
25 extern const uint8_t* snapshot_buffer; | 25 extern const uint8_t* snapshot_buffer; |
26 | 26 |
27 | 27 |
28 // Global state that stores the original working directory.. | 28 // Global state that stores a pointer to the application script file. |
| 29 static const char* original_script_name = NULL; |
29 static const char* original_working_directory = NULL; | 30 static const char* original_working_directory = NULL; |
| 31 static const char* original_script_url = NULL; |
30 | 32 |
31 | 33 |
32 // Global state that stores the import URL map specified on the | 34 // Global state that stores the import URL map specified on the |
33 // command line. | 35 // command line. |
34 static CommandLineOptions* import_map_options = NULL; | 36 static CommandLineOptions* import_map_options = NULL; |
35 | 37 |
36 | 38 |
37 // Global state that indicates whether pprof symbol information is | 39 // Global state that indicates whether pprof symbol information is |
38 // to be generated or not. | 40 // to be generated or not. |
39 static const char* generate_pprof_symbols_filename = NULL; | 41 static const char* generate_pprof_symbols_filename = NULL; |
(...skipping 18 matching lines...) Expand all Loading... |
58 // (This pointer points into an argv buffer and does not need to be | 60 // (This pointer points into an argv buffer and does not need to be |
59 // free'd.) | 61 // free'd.) |
60 static const char* package_root = NULL; | 62 static const char* package_root = NULL; |
61 | 63 |
62 | 64 |
63 // Global flag that is used to indicate that we want to compile all the | 65 // Global flag that is used to indicate that we want to compile all the |
64 // dart functions and not run anything. | 66 // dart functions and not run anything. |
65 static bool has_compile_all = false; | 67 static bool has_compile_all = false; |
66 | 68 |
67 | 69 |
68 static bool IsWindowsHost() { | |
69 #if defined(TARGET_OS_WINDOWS) | |
70 return true; | |
71 #else // defined(TARGET_OS_WINDOWS) | |
72 return false; | |
73 #endif // defined(TARGET_OS_WINDOWS) | |
74 } | |
75 | |
76 | |
77 static bool IsValidFlag(const char* name, | 70 static bool IsValidFlag(const char* name, |
78 const char* prefix, | 71 const char* prefix, |
79 intptr_t prefix_length) { | 72 intptr_t prefix_length) { |
80 intptr_t name_length = strlen(name); | 73 intptr_t name_length = strlen(name); |
81 return ((name_length > prefix_length) && | 74 return ((name_length > prefix_length) && |
82 (strncmp(name, prefix, prefix_length) == 0)); | 75 (strncmp(name, prefix, prefix_length) == 0)); |
83 } | 76 } |
84 | 77 |
85 | 78 |
86 static void ProcessBreakpointOption(const char* funcname) { | 79 static void ProcessBreakpointOption(const char* funcname) { |
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
297 if (buffer_size > 0) { | 290 if (buffer_size > 0) { |
298 ASSERT(buffer != NULL); | 291 ASSERT(buffer != NULL); |
299 pprof_file->WriteFully(buffer, buffer_size); | 292 pprof_file->WriteFully(buffer, buffer_size); |
300 } | 293 } |
301 delete pprof_file; // Closes the file. | 294 delete pprof_file; // Closes the file. |
302 Dart_ExitScope(); | 295 Dart_ExitScope(); |
303 } | 296 } |
304 } | 297 } |
305 | 298 |
306 | 299 |
307 | |
308 static Dart_Handle ResolveScriptUri(Dart_Handle script_uri, | |
309 Dart_Handle builtin_lib) { | |
310 const int kNumArgs = 3; | |
311 Dart_Handle dart_args[kNumArgs]; | |
312 dart_args[0] = Dart_NewString(original_working_directory); | |
313 dart_args[1] = script_uri; | |
314 dart_args[2] = (IsWindowsHost() ? Dart_True() : Dart_False()); | |
315 return Dart_Invoke( | |
316 builtin_lib, Dart_NewString("_resolveScriptUri"), kNumArgs, dart_args); | |
317 } | |
318 | |
319 | |
320 static Dart_Handle FilePathFromUri(Dart_Handle script_uri, | |
321 Dart_Handle builtin_lib) { | |
322 const int kNumArgs = 2; | |
323 Dart_Handle dart_args[kNumArgs]; | |
324 dart_args[0] = script_uri; | |
325 dart_args[1] = (IsWindowsHost() ? Dart_True() : Dart_False()); | |
326 Dart_Handle script_path = Dart_Invoke( | |
327 builtin_lib, Dart_NewString("_filePathFromUri"), kNumArgs, dart_args); | |
328 return script_path; | |
329 } | |
330 | |
331 | |
332 static Dart_Handle LibraryTagHandler(Dart_LibraryTag tag, | 300 static Dart_Handle LibraryTagHandler(Dart_LibraryTag tag, |
333 Dart_Handle library, | 301 Dart_Handle library, |
334 Dart_Handle url) { | 302 Dart_Handle url, |
| 303 Dart_Handle import_map) { |
335 if (!Dart_IsLibrary(library)) { | 304 if (!Dart_IsLibrary(library)) { |
336 return Dart_Error("not a library"); | 305 return Dart_Error("not a library"); |
337 } | 306 } |
338 if (!Dart_IsString8(url)) { | 307 if (!Dart_IsString8(url)) { |
339 return Dart_Error("url is not a string"); | 308 return Dart_Error("url is not a string"); |
340 } | 309 } |
341 const char* url_string = NULL; | 310 const char* url_string = NULL; |
342 Dart_Handle result = Dart_StringToCString(url, &url_string); | 311 Dart_Handle result = Dart_StringToCString(url, &url_string); |
343 if (Dart_IsError(result)) { | 312 if (Dart_IsError(result)) { |
344 return result; | 313 return result; |
345 } | 314 } |
346 bool is_dart_scheme_url = DartUtils::IsDartSchemeURL(url_string); | 315 bool is_dart_scheme_url = DartUtils::IsDartSchemeURL(url_string); |
347 bool is_dart_extension_url = DartUtils::IsDartExtensionSchemeURL(url_string); | 316 bool is_dart_extension_url = DartUtils::IsDartExtensionSchemeURL(url_string); |
348 if (tag == kCanonicalizeUrl) { | 317 if (tag == kCanonicalizeUrl) { |
349 // If this is a Dart Scheme URL then it is not modified as it will be | 318 // If this is a Dart Scheme URL then it is not modified as it will be |
350 // handled by the VM internally. | 319 // handled by the VM internally. |
351 if (is_dart_scheme_url) { | 320 if (is_dart_scheme_url) { |
352 return url; | 321 return url; |
353 } | 322 } |
354 // Resolve the url within the context of the library's URL. | 323 // Resolve the url within the context of the library's URL. |
355 Dart_Handle builtin_lib = Builtin::LoadLibrary(Builtin::kBuiltinLibrary); | 324 Dart_Handle builtin_lib = Builtin::LoadLibrary(Builtin::kBuiltinLibrary); |
356 Dart_Handle library_url = Dart_LibraryUrl(library); | 325 Dart_Handle library_url = Dart_LibraryUrl(library); |
357 if (Dart_IsError(library_url)) { | 326 if (Dart_IsError(library_url)) { |
358 return library_url; | 327 return library_url; |
359 } | 328 } |
360 const int kNumArgs = 2; | 329 Dart_Handle dart_args[2]; |
361 Dart_Handle dart_args[kNumArgs]; | |
362 dart_args[0] = library_url; | 330 dart_args[0] = library_url; |
363 dart_args[1] = url; | 331 dart_args[1] = url; |
364 return Dart_Invoke( | 332 return Dart_Invoke( |
365 builtin_lib, Dart_NewString("_resolveUri"), kNumArgs, dart_args); | 333 builtin_lib, Dart_NewString("_resolveUri"), 2, dart_args); |
366 } | 334 } |
367 if (is_dart_scheme_url) { | 335 if (is_dart_scheme_url) { |
368 ASSERT(tag == kImportTag); | 336 ASSERT(tag == kImportTag); |
369 // Handle imports of other built-in libraries present in the SDK. | 337 // Handle imports of other built-in libraries present in the SDK. |
370 if (DartUtils::IsDartCryptoLibURL(url_string)) { | 338 if (DartUtils::IsDartCryptoLibURL(url_string)) { |
371 return Builtin::LoadLibrary(Builtin::kCryptoLibrary); | 339 return Builtin::LoadLibrary(Builtin::kCryptoLibrary); |
372 } else if (DartUtils::IsDartIOLibURL(url_string)) { | 340 } else if (DartUtils::IsDartIOLibURL(url_string)) { |
373 return Builtin::LoadLibrary(Builtin::kIOLibrary); | 341 return Builtin::LoadLibrary(Builtin::kIOLibrary); |
374 } else if (DartUtils::IsDartJsonLibURL(url_string)) { | 342 } else if (DartUtils::IsDartJsonLibURL(url_string)) { |
375 return Builtin::LoadLibrary(Builtin::kJsonLibrary); | 343 return Builtin::LoadLibrary(Builtin::kJsonLibrary); |
376 } else if (DartUtils::IsDartUriLibURL(url_string)) { | 344 } else if (DartUtils::IsDartUriLibURL(url_string)) { |
377 return Builtin::LoadLibrary(Builtin::kUriLibrary); | 345 return Builtin::LoadLibrary(Builtin::kUriLibrary); |
378 } else if (DartUtils::IsDartUtfLibURL(url_string)) { | 346 } else if (DartUtils::IsDartUtfLibURL(url_string)) { |
379 return Builtin::LoadLibrary(Builtin::kUtfLibrary); | 347 return Builtin::LoadLibrary(Builtin::kUtfLibrary); |
380 } else { | 348 } else { |
381 return Dart_Error("Do not know how to load '%s'", url_string); | 349 return Dart_Error("Do not know how to load '%s'", url_string); |
382 } | 350 } |
383 } else { | 351 } else { |
384 // Get the file path out of the url. | 352 // Get the file path out of the url. |
385 Dart_Handle builtin_lib = Builtin::LoadLibrary(Builtin::kBuiltinLibrary); | 353 Dart_Handle builtin_lib = Builtin::LoadLibrary(Builtin::kBuiltinLibrary); |
386 Dart_Handle file_path = FilePathFromUri(url, builtin_lib); | 354 Dart_Handle dart_args[1]; |
| 355 dart_args[0] = url; |
| 356 Dart_Handle file_path = Dart_Invoke( |
| 357 builtin_lib, Dart_NewString("_filePathFromUri"), 1, dart_args); |
387 if (Dart_IsError(file_path)) { | 358 if (Dart_IsError(file_path)) { |
388 return file_path; | 359 return file_path; |
389 } | 360 } |
390 Dart_StringToCString(file_path, &url_string); | 361 Dart_StringToCString(file_path, &url_string); |
391 } | 362 } |
392 if (is_dart_extension_url) { | 363 if (is_dart_extension_url) { |
393 if (tag != kImportTag) { | 364 if (tag != kImportTag) { |
394 return Dart_Error("Dart extensions must use import: '%s'", url_string); | 365 return Dart_Error("Dart extensions must use import: '%s'", url_string); |
395 } | 366 } |
396 return Extensions::LoadExtension(url_string, library); | 367 return Extensions::LoadExtension(url_string, library); |
397 } | 368 } |
398 result = DartUtils::LoadSource(NULL, | 369 result = DartUtils::LoadSource(NULL, |
399 library, | 370 library, |
400 url, | 371 url, |
401 tag, | 372 tag, |
402 url_string); | 373 url_string, |
| 374 import_map); |
403 if (!Dart_IsError(result) && (tag == kImportTag)) { | 375 if (!Dart_IsError(result) && (tag == kImportTag)) { |
404 Builtin::ImportLibrary(result, Builtin::kBuiltinLibrary); | 376 Builtin::ImportLibrary(result, Builtin::kBuiltinLibrary); |
405 } | 377 } |
406 return result; | 378 return result; |
407 } | 379 } |
408 | 380 |
409 | 381 |
410 static Dart_Handle ReadSource(Dart_Handle script_uri, | 382 static Dart_Handle LoadScript(Dart_Handle builtin_lib, |
411 Dart_Handle builtin_lib) { | 383 CommandLineOptions* map) { |
412 Dart_Handle script_path = FilePathFromUri(script_uri, builtin_lib); | 384 Dart_Handle dart_args[3]; |
| 385 dart_args[0] = Dart_NewString(original_working_directory); |
| 386 dart_args[1] = Dart_NewString(original_script_name); |
| 387 #if !defined(TARGET_OS_WINDOWS) |
| 388 dart_args[2] = Dart_False(); |
| 389 #else // !defined(TARGET_OS_WINDOWS) |
| 390 dart_args[2] = Dart_True(); |
| 391 #endif // !defined(TARGET_OS_WINDOWS) |
| 392 Dart_Handle script_url = Dart_Invoke( |
| 393 builtin_lib, Dart_NewString("_resolveScriptUri"), 3, dart_args); |
| 394 if (Dart_IsError(script_url)) { |
| 395 fprintf(stderr, "%s", Dart_GetError(script_url)); |
| 396 return script_url; |
| 397 } |
| 398 if (original_script_url == NULL) { |
| 399 const char* script_url_cstr; |
| 400 Dart_StringToCString(script_url, &script_url_cstr); |
| 401 original_script_url = strdup(script_url_cstr); |
| 402 } |
| 403 dart_args[0] = script_url; |
| 404 Dart_Handle script_path = Dart_Invoke( |
| 405 builtin_lib, Dart_NewString("_filePathFromUri"), 1, dart_args); |
413 if (Dart_IsError(script_path)) { | 406 if (Dart_IsError(script_path)) { |
414 return script_path; | 407 return script_path; |
415 } | 408 } |
416 const char* script_path_cstr; | 409 const char* script_path_cstr; |
417 Dart_StringToCString(script_path, &script_path_cstr); | 410 Dart_StringToCString(script_path, &script_path_cstr); |
418 Dart_Handle source = DartUtils::ReadStringFromFile(script_path_cstr); | 411 Dart_Handle source = DartUtils::ReadStringFromFile(script_path_cstr); |
419 return source; | |
420 } | |
421 | |
422 | |
423 static Dart_Handle LoadScript(const char* script_uri, | |
424 bool resolve_script, | |
425 Dart_Handle builtin_lib) { | |
426 Dart_Handle resolved_script_uri; | |
427 if (resolve_script) { | |
428 resolved_script_uri = ResolveScriptUri(Dart_NewString(script_uri), | |
429 builtin_lib); | |
430 if (Dart_IsError(resolved_script_uri)) { | |
431 return resolved_script_uri; | |
432 } | |
433 } else { | |
434 resolved_script_uri = Dart_NewString(script_uri); | |
435 } | |
436 Dart_Handle source = ReadSource(resolved_script_uri, builtin_lib); | |
437 if (Dart_IsError(source)) { | 412 if (Dart_IsError(source)) { |
438 return source; | 413 return source; |
439 } | 414 } |
440 return Dart_LoadScript(resolved_script_uri, source); | |
441 } | |
442 | |
443 | |
444 static Dart_Handle CreateImportMap(CommandLineOptions* map) { | |
445 intptr_t length = (map == NULL) ? 0 : map->count(); | 415 intptr_t length = (map == NULL) ? 0 : map->count(); |
446 Dart_Handle import_map = Dart_NewList(length * 2); | 416 Dart_Handle import_map = Dart_NewList(length * 2); |
447 for (intptr_t i = 0; i < length; i++) { | 417 for (intptr_t i = 0; i < length; i++) { |
448 ASSERT(map->GetArgument(i) != NULL); | 418 ASSERT(map->GetArgument(i) != NULL); |
449 char* name = strdup(map->GetArgument(i)); | 419 char* name = strdup(map->GetArgument(i)); |
450 ASSERT(name != NULL); | 420 ASSERT(name != NULL); |
451 char* map_name = strchr(name, ','); | 421 char* map_name = strchr(name, ','); |
452 intptr_t index = i * 2; | 422 intptr_t index = i * 2; |
453 if (map_name != NULL) { | 423 if (map_name != NULL) { |
454 *map_name = '\0'; | 424 *map_name = '\0'; |
455 map_name += 1; | 425 map_name += 1; |
456 Dart_ListSetAt(import_map, index, Dart_NewString(name)); | 426 Dart_ListSetAt(import_map, index, Dart_NewString(name)); |
457 Dart_ListSetAt(import_map, (index + 1), Dart_NewString(map_name)); | 427 Dart_ListSetAt(import_map, (index + 1), Dart_NewString(map_name)); |
458 } else { | 428 } else { |
459 Dart_ListSetAt(import_map, index, Dart_NewString(name)); | 429 Dart_ListSetAt(import_map, index, Dart_NewString(name)); |
460 Dart_ListSetAt(import_map, (index + 1), Dart_NewString("")); | 430 Dart_ListSetAt(import_map, (index + 1), Dart_NewString("")); |
461 } | 431 } |
462 free(name); | 432 free(name); |
463 } | 433 } |
464 return import_map; | 434 return Dart_LoadScript(script_url, source, import_map); |
465 } | 435 } |
466 | 436 |
467 | 437 |
468 // Returns true on success, false on failure. | 438 // Returns true on success, false on failure. |
469 static bool CreateIsolateAndSetupHelper(const char* script_uri, | 439 static bool CreateIsolateAndSetup(const char* name_prefix, |
470 const char* main, | 440 void* data, char** error) { |
471 bool resolve_script, | |
472 void* data, | |
473 char** error) { | |
474 Dart_Isolate isolate = | 441 Dart_Isolate isolate = |
475 Dart_CreateIsolate(script_uri, main, snapshot_buffer, data, error); | 442 Dart_CreateIsolate(name_prefix, snapshot_buffer, data, error); |
476 if (isolate == NULL) { | 443 if (isolate == NULL) { |
477 return false; | 444 return false; |
478 } | 445 } |
479 | 446 |
480 Dart_EnterScope(); | 447 Dart_EnterScope(); |
481 | 448 |
482 if (snapshot_buffer != NULL) { | 449 if (snapshot_buffer != NULL) { |
483 // Setup the native resolver as the snapshot does not carry it. | 450 // Setup the native resolver as the snapshot does not carry it. |
484 Builtin::SetNativeResolver(Builtin::kBuiltinLibrary); | 451 Builtin::SetNativeResolver(Builtin::kBuiltinLibrary); |
485 Builtin::SetNativeResolver(Builtin::kIOLibrary); | 452 Builtin::SetNativeResolver(Builtin::kIOLibrary); |
486 } | 453 } |
487 | 454 |
488 // Set up the library tag handler for this isolate. | 455 // Set up the library tag handler for this isolate. |
489 Dart_Handle result = Dart_SetLibraryTagHandler(LibraryTagHandler); | 456 Dart_Handle result = Dart_SetLibraryTagHandler(LibraryTagHandler); |
490 if (Dart_IsError(result)) { | 457 if (Dart_IsError(result)) { |
491 *error = strdup(Dart_GetError(result)); | 458 *error = strdup(Dart_GetError(result)); |
492 Dart_ExitScope(); | |
493 Dart_ShutdownIsolate(); | |
494 return false; | |
495 } | |
496 | |
497 // Set up the import map for this isolate. | |
498 result = Dart_SetImportMap(CreateImportMap(import_map_options)); | |
499 if (Dart_IsError(result)) { | |
500 *error = strdup(Dart_GetError(result)); | |
501 Dart_ExitScope(); | |
502 Dart_ShutdownIsolate(); | |
503 return false; | 459 return false; |
504 } | 460 } |
505 | 461 |
506 // Prepare builtin and its dependent libraries for use to resolve URIs. | 462 // Prepare builtin and its dependent libraries for use to resolve URIs. |
507 Dart_Handle uri_lib = Builtin::LoadLibrary(Builtin::kUriLibrary); | 463 Dart_Handle uri_lib = Builtin::LoadLibrary(Builtin::kUriLibrary); |
508 if (Dart_IsError(uri_lib)) { | 464 if (Dart_IsError(uri_lib)) { |
509 *error = strdup(Dart_GetError(uri_lib)); | 465 *error = strdup(Dart_GetError(uri_lib)); |
510 Dart_ExitScope(); | |
511 Dart_ShutdownIsolate(); | |
512 return false; | 466 return false; |
513 } | 467 } |
514 Dart_Handle builtin_lib = Builtin::LoadLibrary(Builtin::kBuiltinLibrary); | 468 Dart_Handle builtin_lib = Builtin::LoadLibrary(Builtin::kBuiltinLibrary); |
515 if (Dart_IsError(builtin_lib)) { | 469 if (Dart_IsError(builtin_lib)) { |
516 *error = strdup(Dart_GetError(builtin_lib)); | 470 *error = strdup(Dart_GetError(builtin_lib)); |
517 Dart_ExitScope(); | |
518 Dart_ShutdownIsolate(); | |
519 return false; | 471 return false; |
520 } | 472 } |
521 | 473 |
522 if (package_root != NULL) { | 474 if (package_root != NULL) { |
523 const int kNumArgs = 1; | 475 Dart_Handle dart_args[1]; |
524 Dart_Handle dart_args[kNumArgs]; | |
525 | 476 |
526 Dart_Handle handle = Dart_NewString(package_root); | 477 Dart_Handle handle = Dart_NewString(package_root); |
527 if (Dart_IsError(handle)) { | 478 if (Dart_IsError(handle)) { |
528 *error = strdup(Dart_GetError(handle)); | 479 *error = strdup(Dart_GetError(handle)); |
529 Dart_ExitScope(); | |
530 Dart_ShutdownIsolate(); | |
531 return false; | 480 return false; |
532 } | 481 } |
533 dart_args[0] = handle; | 482 dart_args[0] = handle; |
534 | 483 |
535 Dart_Handle result = Dart_Invoke(builtin_lib, | 484 Dart_Handle result = Dart_Invoke(builtin_lib, |
536 Dart_NewString("_setPackageRoot"), kNumArgs, dart_args); | 485 Dart_NewString("_setPackageRoot"), 1, dart_args); |
537 if (Dart_IsError(result)) { | 486 if (Dart_IsError(result)) { |
538 *error = strdup(Dart_GetError(result)); | 487 *error = strdup(Dart_GetError(result)); |
539 Dart_ExitScope(); | |
540 Dart_ShutdownIsolate(); | |
541 return false; | 488 return false; |
542 } | 489 } |
543 } | 490 } |
544 | 491 |
545 // Load the specified application script into the newly created isolate. | 492 // Load the specified application script into the newly created isolate. |
546 Dart_Handle library = LoadScript(script_uri, resolve_script, builtin_lib); | 493 Dart_Handle library = LoadScript(builtin_lib, import_map_options); |
547 if (Dart_IsError(library)) { | 494 if (Dart_IsError(library)) { |
548 *error = strdup(Dart_GetError(library)); | 495 *error = strdup(Dart_GetError(library)); |
549 Dart_ExitScope(); | 496 Dart_ExitScope(); |
550 Dart_ShutdownIsolate(); | 497 Dart_ShutdownIsolate(); |
551 return false; | 498 return false; |
552 } | 499 } |
553 if (!Dart_IsLibrary(library)) { | 500 if (!Dart_IsLibrary(library)) { |
554 char errbuf[256]; | 501 char errbuf[256]; |
555 snprintf(errbuf, sizeof(errbuf), | 502 snprintf(errbuf, sizeof(errbuf), |
556 "Expected a library when loading script: %s", | 503 "Expected a library when loading script: %s", |
557 script_uri); | 504 original_script_name); |
558 *error = strdup(errbuf); | 505 *error = strdup(errbuf); |
559 Dart_ExitScope(); | 506 Dart_ExitScope(); |
560 Dart_ShutdownIsolate(); | 507 Dart_ShutdownIsolate(); |
561 return false; | 508 return false; |
562 } | 509 } |
563 // Implicitly import builtin into app. | 510 // Implicitly import builtin into app. |
564 Builtin::ImportLibrary(library, Builtin::kBuiltinLibrary); | 511 Builtin::ImportLibrary(library, Builtin::kBuiltinLibrary); |
565 Dart_ExitScope(); | 512 Dart_ExitScope(); |
566 return true; | 513 return true; |
567 } | 514 } |
568 | 515 |
569 | 516 |
570 static bool CreateIsolateAndSetup(const char* script_uri, | |
571 const char* main, | |
572 void* data, char** error) { | |
573 return CreateIsolateAndSetupHelper(script_uri, | |
574 main, | |
575 false, // script_uri already canonical. | |
576 data, | |
577 error); | |
578 } | |
579 | |
580 | |
581 static void PrintUsage() { | 517 static void PrintUsage() { |
582 fprintf(stderr, | 518 fprintf(stderr, |
583 "dart [<vm-flags>] <dart-script-file> [<dart-options>]\n"); | 519 "dart [<vm-flags>] <dart-script-file> [<dart-options>]\n"); |
584 } | 520 } |
585 | 521 |
586 | 522 |
587 static Dart_Handle SetBreakpoint(const char* breakpoint_at, | 523 static Dart_Handle SetBreakpoint(const char* breakpoint_at, |
588 Dart_Handle library) { | 524 Dart_Handle library) { |
589 Dart_Handle result; | 525 Dart_Handle result; |
590 if (strchr(breakpoint_at, ':')) { | 526 if (strchr(breakpoint_at, ':')) { |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
640 | 576 |
641 | 577 |
642 static int ErrorExit(const char* format, ...) { | 578 static int ErrorExit(const char* format, ...) { |
643 va_list arguments; | 579 va_list arguments; |
644 va_start(arguments, format); | 580 va_start(arguments, format); |
645 vfprintf(stderr, format, arguments); | 581 vfprintf(stderr, format, arguments); |
646 va_end(arguments); | 582 va_end(arguments); |
647 | 583 |
648 Dart_ExitScope(); | 584 Dart_ExitScope(); |
649 Dart_ShutdownIsolate(); | 585 Dart_ShutdownIsolate(); |
| 586 |
| 587 free(const_cast<char*>(original_script_name)); |
650 free(const_cast<char*>(original_working_directory)); | 588 free(const_cast<char*>(original_working_directory)); |
| 589 free(const_cast<char*>(original_script_url)); |
651 | 590 |
652 return kErrorExitCode; | 591 return kErrorExitCode; |
653 } | 592 } |
654 | 593 |
655 | 594 |
656 int main(int argc, char** argv) { | 595 int main(int argc, char** argv) { |
657 char* executable_name; | 596 char* executable_name; |
658 char* script_name; | 597 char* script_name; |
659 CommandLineOptions vm_options(argc); | 598 CommandLineOptions vm_options(argc); |
660 CommandLineOptions dart_options(argc); | 599 CommandLineOptions dart_options(argc); |
(...skipping 14 matching lines...) Expand all Loading... |
675 &dart_options) < 0) { | 614 &dart_options) < 0) { |
676 PrintUsage(); | 615 PrintUsage(); |
677 return kErrorExitCode; | 616 return kErrorExitCode; |
678 } | 617 } |
679 | 618 |
680 Dart_SetVMFlags(vm_options.count(), vm_options.arguments()); | 619 Dart_SetVMFlags(vm_options.count(), vm_options.arguments()); |
681 | 620 |
682 // Initialize the Dart VM. | 621 // Initialize the Dart VM. |
683 Dart_Initialize(CreateIsolateAndSetup, NULL); | 622 Dart_Initialize(CreateIsolateAndSetup, NULL); |
684 | 623 |
| 624 original_script_name = strdup(script_name); |
685 original_working_directory = Directory::Current(); | 625 original_working_directory = Directory::Current(); |
686 | 626 |
687 // Call CreateIsolateAndSetup which creates an isolate and loads up | 627 // Call CreateIsolateAndSetup which creates an isolate and loads up |
688 // the specified application script. | 628 // the specified application script. |
689 char* error = NULL; | 629 char* error = NULL; |
690 char* isolate_name = BuildIsolateName(script_name, "main"); | 630 char* isolate_name = BuildIsolateName(original_script_name, "main"); |
691 if (!CreateIsolateAndSetupHelper(script_name, | 631 if (!CreateIsolateAndSetup(isolate_name, NULL, &error)) { |
692 "main", | |
693 true, // Canonicalize the script name. | |
694 NULL, | |
695 &error)) { | |
696 fprintf(stderr, "%s\n", error); | 632 fprintf(stderr, "%s\n", error); |
| 633 free(const_cast<char*>(original_script_name)); |
697 free(const_cast<char*>(original_working_directory)); | 634 free(const_cast<char*>(original_working_directory)); |
698 free(error); | 635 free(error); |
699 delete [] isolate_name; | 636 delete [] isolate_name; |
700 return 255; // Indicates we encountered an error. | 637 return 255; // Indicates we encountered an error. |
701 } | 638 } |
702 delete [] isolate_name; | 639 delete [] isolate_name; |
703 | 640 |
704 Dart_Isolate isolate = Dart_CurrentIsolate(); | 641 Dart_Isolate isolate = Dart_CurrentIsolate(); |
705 ASSERT(isolate != NULL); | 642 ASSERT(isolate != NULL); |
706 Dart_Handle result; | 643 Dart_Handle result; |
707 | 644 |
708 Dart_EnterScope(); | 645 Dart_EnterScope(); |
709 | 646 |
710 if (has_compile_all) { | 647 if (has_compile_all) { |
711 result = Dart_CompileAll(); | 648 result = Dart_CompileAll(); |
712 if (Dart_IsError(result)) { | 649 if (Dart_IsError(result)) { |
713 return ErrorExit("%s\n", Dart_GetError(result)); | 650 return ErrorExit("%s\n", Dart_GetError(result)); |
714 } | 651 } |
715 } | 652 } |
716 | 653 |
717 // Create a dart options object that can be accessed from dart code. | 654 // Create a dart options object that can be accessed from dart code. |
718 Dart_Handle options_result = | 655 Dart_Handle options_result = |
719 SetupRuntimeOptions(&dart_options, executable_name, script_name); | 656 SetupRuntimeOptions(&dart_options, executable_name, original_script_name); |
720 if (Dart_IsError(options_result)) { | 657 if (Dart_IsError(options_result)) { |
721 return ErrorExit("%s\n", Dart_GetError(options_result)); | 658 return ErrorExit("%s\n", Dart_GetError(options_result)); |
722 } | 659 } |
723 // Lookup the library of the root script. | 660 // Lookup the library of the main script. |
724 Dart_Handle library = Dart_RootLibrary(); | 661 Dart_Handle script_url = Dart_NewString(original_script_url); |
725 if (Dart_IsNull(library)) { | 662 Dart_Handle library = Dart_LookupLibrary(script_url); |
726 return ErrorExit("Unable to find root library for '%s'\n", | 663 if (Dart_IsError(library)) { |
727 script_name); | 664 return ErrorExit("%s\n", Dart_GetError(library)); |
728 } | 665 } |
729 // Set debug breakpoint if specified on the command line. | 666 // Set debug breakpoint if specified on the command line. |
730 if (breakpoint_at != NULL) { | 667 if (breakpoint_at != NULL) { |
731 result = SetBreakpoint(breakpoint_at, library); | 668 result = SetBreakpoint(breakpoint_at, library); |
732 if (Dart_IsError(result)) { | 669 if (Dart_IsError(result)) { |
733 return ErrorExit("Error setting breakpoint at '%s': %s\n", | 670 return ErrorExit("Error setting breakpoint at '%s': %s\n", |
734 breakpoint_at, | 671 breakpoint_at, |
735 Dart_GetError(result)); | 672 Dart_GetError(result)); |
736 } | 673 } |
737 } | 674 } |
(...skipping 16 matching lines...) Expand all Loading... |
754 } | 691 } |
755 | 692 |
756 Dart_ExitScope(); | 693 Dart_ExitScope(); |
757 // Dump symbol information for the profiler. | 694 // Dump symbol information for the profiler. |
758 DumpPprofSymbolInfo(); | 695 DumpPprofSymbolInfo(); |
759 // Shutdown the isolate. | 696 // Shutdown the isolate. |
760 Dart_ShutdownIsolate(); | 697 Dart_ShutdownIsolate(); |
761 // Terminate process exit-code handler. | 698 // Terminate process exit-code handler. |
762 Process::TerminateExitCodeHandler(); | 699 Process::TerminateExitCodeHandler(); |
763 | 700 |
| 701 free(const_cast<char*>(original_script_name)); |
764 free(const_cast<char*>(original_working_directory)); | 702 free(const_cast<char*>(original_working_directory)); |
| 703 free(const_cast<char*>(original_script_url)); |
765 | 704 |
766 return 0; | 705 return 0; |
767 } | 706 } |
OLD | NEW |