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

Side by Side Diff: runtime/bin/main.cc

Issue 8826007: First bits of external debugger API (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: '' Created 9 years 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 | Annotate | Revision Log
« no previous file with comments | « runtime/bin/bin.gypi ('k') | runtime/dart-runtime.gyp » ('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) 2011, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2011, 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 11
11 #include "bin/builtin.h" 12 #include "bin/builtin.h"
12 #include "bin/dartutils.h" 13 #include "bin/dartutils.h"
13 #include "bin/file.h" 14 #include "bin/file.h"
14 #include "bin/globals.h" 15 #include "bin/globals.h"
15 #include "bin/platform.h" 16 #include "bin/platform.h"
16 17
17 // snapshot_buffer points to a snapshot if we link in a snapshot otherwise 18 // snapshot_buffer points to a snapshot if we link in a snapshot otherwise
18 // it is initialized to NULL. 19 // it is initialized to NULL.
19 extern const uint8_t* snapshot_buffer; 20 extern const uint8_t* snapshot_buffer;
20 21
21 22
22 // Global state that stores a pointer to the application script file. 23 // Global state that stores a pointer to the application script file.
23 static char* canonical_script_name = NULL; 24 static char* canonical_script_name = NULL;
24 25
25 26
26 // Global state that indicates whether pprof symbol information is 27 // Global state that indicates whether pprof symbol information is
27 // to be generated or not. 28 // to be generated or not.
28 static const char* generate_pprof_symbols_filename = NULL; 29 static const char* generate_pprof_symbols_filename = NULL;
29 30
30 31
32 // Global state that indicates whether there is a debug breakpoint.
33 // This pointer points into an argv buffer and does not need to be
34 // free'd.
35 static const char* breakpoint_at = NULL;
36
37
31 static bool IsValidFlag(const char* name, 38 static bool IsValidFlag(const char* name,
32 const char* prefix, 39 const char* prefix,
33 intptr_t prefix_length) { 40 intptr_t prefix_length) {
34 intptr_t name_length = strlen(name); 41 intptr_t name_length = strlen(name);
35 return ((name_length > prefix_length) && 42 return ((name_length > prefix_length) &&
36 (strncmp(name, prefix, prefix_length) == 0)); 43 (strncmp(name, prefix, prefix_length) == 0));
37 } 44 }
38 45
39 46
40 static const char* ProcessOption(const char* option, const char* name) { 47 static const char* ProcessOption(const char* option, const char* name) {
41 const intptr_t length = strlen(name); 48 const intptr_t length = strlen(name);
42 if (strncmp(option, name, length) == 0) { 49 if (strncmp(option, name, length) == 0) {
43 return (option + length); 50 return (option + length);
44 } 51 }
45 return NULL; 52 return NULL;
46 } 53 }
47 54
48 55
49 static bool ProcessPprofOption(const char* option) { 56 static bool ProcessPprofOption(const char* option) {
50 const char* kProfOption = "--generate_pprof_symbols="; 57 const char* kProfOption = "--generate_pprof_symbols=";
51 const char* filename = ProcessOption(option, kProfOption); 58 const char* filename = ProcessOption(option, kProfOption);
52 if (filename != NULL) { 59 if (filename != NULL) {
53 generate_pprof_symbols_filename = filename; 60 generate_pprof_symbols_filename = filename;
54 } 61 }
55 return filename != NULL; 62 return filename != NULL;
56 } 63 }
57 64
58 65
66 static bool ProcessDebugOption(const char* option) {
67 const char* kDebugOption = "--break_at=";
68 const char* func_name = ProcessOption(option, kDebugOption);
69 if (func_name != NULL) {
70 breakpoint_at = func_name;
71 }
72 return func_name != NULL;
73 }
74
75
59 // Parse out the command line arguments. Returns -1 if the arguments 76 // Parse out the command line arguments. Returns -1 if the arguments
60 // are incorrect, 0 otherwise. 77 // are incorrect, 0 otherwise.
61 static int ParseArguments(int argc, 78 static int ParseArguments(int argc,
62 char** argv, 79 char** argv,
63 CommandLineOptions* vm_options, 80 CommandLineOptions* vm_options,
64 char** script_name, 81 char** script_name,
65 CommandLineOptions* dart_options) { 82 CommandLineOptions* dart_options) {
66 const char* kPrefix = "--"; 83 const char* kPrefix = "--";
67 const intptr_t kPrefixLen = strlen(kPrefix); 84 const intptr_t kPrefixLen = strlen(kPrefix);
68 85
69 // Skip the binary name. 86 // Skip the binary name.
70 int i = 1; 87 int i = 1;
71 88
72 // Parse out the vm options. 89 // Parse out the vm options.
73 while ((i < argc) && IsValidFlag(argv[i], kPrefix, kPrefixLen)) { 90 while ((i < argc) && IsValidFlag(argv[i], kPrefix, kPrefixLen)) {
74 if (ProcessPprofOption(argv[i])) { 91 if (ProcessPprofOption(argv[i])) {
75 i += 1; 92 i += 1;
76 continue; 93 } else if (ProcessDebugOption(argv[i])) {
94 i += 1;
95 } else {
96 vm_options->AddArgument(argv[i]);
97 i += 1;
77 } 98 }
78 vm_options->AddArgument(argv[i]);
79 i += 1;
80 } 99 }
81 if (generate_pprof_symbols_filename != NULL) { 100 if (generate_pprof_symbols_filename != NULL) {
82 Dart_InitPprofSupport(); 101 Dart_InitPprofSupport();
83 } 102 }
84 103
85 // Get the script name. 104 // Get the script name.
86 if (i < argc) { 105 if (i < argc) {
87 *script_name = argv[i]; 106 *script_name = argv[i];
88 i += 1; 107 i += 1;
89 } else { 108 } else {
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after
322 // Create a dart options object that can be accessed from dart code. 341 // Create a dart options object that can be accessed from dart code.
323 Dart_Handle options_result = SetupRuntimeOptions(&dart_options); 342 Dart_Handle options_result = SetupRuntimeOptions(&dart_options);
324 if (Dart_IsError(options_result)) { 343 if (Dart_IsError(options_result)) {
325 fprintf(stderr, "%s\n", Dart_GetError(options_result)); 344 fprintf(stderr, "%s\n", Dart_GetError(options_result));
326 Dart_ExitScope(); 345 Dart_ExitScope();
327 Dart_ShutdownIsolate(); 346 Dart_ShutdownIsolate();
328 free(canonical_script_name); 347 free(canonical_script_name);
329 return 255; // Indicates we encountered an error. 348 return 255; // Indicates we encountered an error.
330 } 349 }
331 350
332 // Lookup and invoke the top level main function. 351 // Lookup the library of the main script.
333 Dart_Handle script_url = Dart_NewString(canonical_script_name); 352 Dart_Handle script_url = Dart_NewString(canonical_script_name);
334 Dart_Handle library = Dart_LookupLibrary(script_url); 353 Dart_Handle library = Dart_LookupLibrary(script_url);
335 if (Dart_IsError(library)) { 354 if (Dart_IsError(library)) {
336 fprintf(stderr, "%s\n", Dart_GetError(library)); 355 fprintf(stderr, "%s\n", Dart_GetError(library));
337 Dart_ExitScope(); 356 Dart_ExitScope();
338 Dart_ShutdownIsolate(); 357 Dart_ShutdownIsolate();
339 free(canonical_script_name); 358 free(canonical_script_name);
340 return 255; // Indicates we encountered an error. 359 return 255; // Indicates we encountered an error.
341 } 360 }
361 // Set debug breakpoint if specified on the command line.
362 if (breakpoint_at != NULL) {
363 char* bpt_function = strdup(breakpoint_at);
364 Dart_Handle class_name;
365 Dart_Handle function_name;
366 char* dot = strchr(bpt_function, '.');
367 if (dot == NULL) {
368 class_name = Dart_NewString("");
369 function_name = Dart_NewString(breakpoint_at);
370 } else {
371 *dot = '\0';
372 class_name = Dart_NewString(bpt_function);
373 function_name = Dart_NewString(dot + 1);
374 }
375 free(bpt_function);
376 Dart_Breakpoint bpt;
377 result = Dart_SetBreakpointAtEntry(
378 library, class_name, function_name, &bpt);
379 if (Dart_IsError(result)) {
380 fprintf(stderr, "Error setting breakpoint at '%s': %s\n",
381 breakpoint_at,
382 Dart_GetError(result));
383 Dart_ExitScope();
384 Dart_ShutdownIsolate();
385 free(canonical_script_name);
386 return 255; // Indicates we encountered an error.
387 }
388 }
389 // Lookup and invoke the top level main function.
342 result = Dart_InvokeStatic(library, 390 result = Dart_InvokeStatic(library,
343 Dart_NewString(""), 391 Dart_NewString(""),
344 Dart_NewString("main"), 392 Dart_NewString("main"),
345 0, 393 0,
346 NULL); 394 NULL);
347 if (Dart_IsError(result)) { 395 if (Dart_IsError(result)) {
348 fprintf(stderr, "%s\n", Dart_GetError(result)); 396 fprintf(stderr, "%s\n", Dart_GetError(result));
349 Dart_ExitScope(); 397 Dart_ExitScope();
350 Dart_ShutdownIsolate(); 398 Dart_ShutdownIsolate();
351 free(canonical_script_name); 399 free(canonical_script_name);
352 return 255; // Indicates we encountered an error. 400 return 255; // Indicates we encountered an error.
353 } 401 }
354 // Keep handling messages until the last active receive port is closed. 402 // Keep handling messages until the last active receive port is closed.
355 result = Dart_RunLoop(); 403 result = Dart_RunLoop();
356 if (Dart_IsError(result)) { 404 if (Dart_IsError(result)) {
357 fprintf(stderr, "%s\n", Dart_GetError(result)); 405 fprintf(stderr, "%s\n", Dart_GetError(result));
358 Dart_ExitScope(); 406 Dart_ExitScope();
359 Dart_ShutdownIsolate(); 407 Dart_ShutdownIsolate();
360 free(canonical_script_name); 408 free(canonical_script_name);
361 return 255; // Indicates we encountered an error. 409 return 255; // Indicates we encountered an error.
362 } 410 }
363 free(canonical_script_name); 411 free(canonical_script_name);
364 Dart_ExitScope(); 412 Dart_ExitScope();
365 // Dump symbol information for the profiler. 413 // Dump symbol information for the profiler.
366 DumpPprofSymbolInfo(); 414 DumpPprofSymbolInfo();
367 // Shutdown the isolate. 415 // Shutdown the isolate.
368 Dart_ShutdownIsolate(); 416 Dart_ShutdownIsolate();
369 return 0; 417 return 0;
370 } 418 }
OLDNEW
« no previous file with comments | « runtime/bin/bin.gypi ('k') | runtime/dart-runtime.gyp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698