| Index: runtime/bin/main.cc
|
| ===================================================================
|
| --- runtime/bin/main.cc (revision 2184)
|
| +++ runtime/bin/main.cc (working copy)
|
| @@ -7,6 +7,7 @@
|
| #include <stdio.h>
|
|
|
| #include "include/dart_api.h"
|
| +#include "include/dart_debugger_api.h"
|
|
|
| #include "bin/builtin.h"
|
| #include "bin/dartutils.h"
|
| @@ -28,6 +29,12 @@
|
| static const char* generate_pprof_symbols_filename = NULL;
|
|
|
|
|
| +// Global state that indicates whether there is a debug breakpoint.
|
| +// This pointer points into an argv buffer and does not need to be
|
| +// free'd.
|
| +static const char* breakpoint_at = NULL;
|
| +
|
| +
|
| static bool IsValidFlag(const char* name,
|
| const char* prefix,
|
| intptr_t prefix_length) {
|
| @@ -56,6 +63,16 @@
|
| }
|
|
|
|
|
| +static bool ProcessDebugOption(const char* option) {
|
| + const char* kDebugOption = "--break_at=";
|
| + const char* func_name = ProcessOption(option, kDebugOption);
|
| + if (func_name != NULL) {
|
| + breakpoint_at = func_name;
|
| + }
|
| + return func_name != NULL;
|
| +}
|
| +
|
| +
|
| // Parse out the command line arguments. Returns -1 if the arguments
|
| // are incorrect, 0 otherwise.
|
| static int ParseArguments(int argc,
|
| @@ -73,10 +90,12 @@
|
| while ((i < argc) && IsValidFlag(argv[i], kPrefix, kPrefixLen)) {
|
| if (ProcessPprofOption(argv[i])) {
|
| i += 1;
|
| - continue;
|
| + } else if (ProcessDebugOption(argv[i])) {
|
| + i += 1;
|
| + } else {
|
| + vm_options->AddArgument(argv[i]);
|
| + i += 1;
|
| }
|
| - vm_options->AddArgument(argv[i]);
|
| - i += 1;
|
| }
|
| if (generate_pprof_symbols_filename != NULL) {
|
| Dart_InitPprofSupport();
|
| @@ -329,7 +348,7 @@
|
| return 255; // Indicates we encountered an error.
|
| }
|
|
|
| - // Lookup and invoke the top level main function.
|
| + // Lookup the library of the main script.
|
| Dart_Handle script_url = Dart_NewString(canonical_script_name);
|
| Dart_Handle library = Dart_LookupLibrary(script_url);
|
| if (Dart_IsError(library)) {
|
| @@ -339,6 +358,35 @@
|
| free(canonical_script_name);
|
| return 255; // Indicates we encountered an error.
|
| }
|
| + // Set debug breakpoint if specified on the command line.
|
| + if (breakpoint_at != NULL) {
|
| + char* bpt_function = strdup(breakpoint_at);
|
| + Dart_Handle class_name;
|
| + Dart_Handle function_name;
|
| + char* dot = strchr(bpt_function, '.');
|
| + if (dot == NULL) {
|
| + class_name = Dart_NewString("");
|
| + function_name = Dart_NewString(breakpoint_at);
|
| + } else {
|
| + *dot = '\0';
|
| + class_name = Dart_NewString(bpt_function);
|
| + function_name = Dart_NewString(dot + 1);
|
| + }
|
| + free(bpt_function);
|
| + Dart_Breakpoint bpt;
|
| + result = Dart_SetBreakpointAtEntry(
|
| + library, class_name, function_name, &bpt);
|
| + if (Dart_IsError(result)) {
|
| + fprintf(stderr, "Error setting breakpoint at '%s': %s\n",
|
| + breakpoint_at,
|
| + Dart_GetError(result));
|
| + Dart_ExitScope();
|
| + Dart_ShutdownIsolate();
|
| + free(canonical_script_name);
|
| + return 255; // Indicates we encountered an error.
|
| + }
|
| + }
|
| + // Lookup and invoke the top level main function.
|
| result = Dart_InvokeStatic(library,
|
| Dart_NewString(""),
|
| Dart_NewString("main"),
|
|
|