| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 56 | 56 |
| 57 DebugEvent event = event_details.GetEvent(); | 57 DebugEvent event = event_details.GetEvent(); |
| 58 // Check for handled event. | 58 // Check for handled event. |
| 59 if (event != Break && event != Exception && event != AfterCompile) { | 59 if (event != Break && event != Exception && event != AfterCompile) { |
| 60 return; | 60 return; |
| 61 } | 61 } |
| 62 | 62 |
| 63 TryCatch try_catch; | 63 TryCatch try_catch; |
| 64 | 64 |
| 65 // Get the toJSONProtocol function on the event and get the JSON format. | 65 // Get the toJSONProtocol function on the event and get the JSON format. |
| 66 Local<String> to_json_fun_name = String::New("toJSONProtocol"); | 66 Local<String> to_json_fun_name = |
| 67 String::NewFromUtf8(isolate, "toJSONProtocol"); |
| 67 Handle<Object> event_data = event_details.GetEventData(); | 68 Handle<Object> event_data = event_details.GetEventData(); |
| 68 Local<Function> to_json_fun = | 69 Local<Function> to_json_fun = |
| 69 Local<Function>::Cast(event_data->Get(to_json_fun_name)); | 70 Local<Function>::Cast(event_data->Get(to_json_fun_name)); |
| 70 Local<Value> event_json = to_json_fun->Call(event_data, 0, NULL); | 71 Local<Value> event_json = to_json_fun->Call(event_data, 0, NULL); |
| 71 if (try_catch.HasCaught()) { | 72 if (try_catch.HasCaught()) { |
| 72 Shell::ReportException(isolate, &try_catch); | 73 Shell::ReportException(isolate, &try_catch); |
| 73 return; | 74 return; |
| 74 } | 75 } |
| 75 | 76 |
| 76 // Print the event details. | 77 // Print the event details. |
| 77 Handle<Object> details = | 78 Handle<Object> details = |
| 78 Shell::DebugMessageDetails(isolate, Handle<String>::Cast(event_json)); | 79 Shell::DebugMessageDetails(isolate, Handle<String>::Cast(event_json)); |
| 79 if (try_catch.HasCaught()) { | 80 if (try_catch.HasCaught()) { |
| 80 Shell::ReportException(isolate, &try_catch); | 81 Shell::ReportException(isolate, &try_catch); |
| 81 return; | 82 return; |
| 82 } | 83 } |
| 83 String::Utf8Value str(details->Get(String::New("text"))); | 84 String::Utf8Value str(details->Get(String::NewFromUtf8(isolate, "text"))); |
| 84 if (str.length() == 0) { | 85 if (str.length() == 0) { |
| 85 // Empty string is used to signal not to process this event. | 86 // Empty string is used to signal not to process this event. |
| 86 return; | 87 return; |
| 87 } | 88 } |
| 88 printf("%s\n", *str); | 89 printf("%s\n", *str); |
| 89 | 90 |
| 90 // Get the debug command processor. | 91 // Get the debug command processor. |
| 91 Local<String> fun_name = String::New("debugCommandProcessor"); | 92 Local<String> fun_name = |
| 93 String::NewFromUtf8(isolate, "debugCommandProcessor"); |
| 92 Handle<Object> exec_state = event_details.GetExecutionState(); | 94 Handle<Object> exec_state = event_details.GetExecutionState(); |
| 93 Local<Function> fun = Local<Function>::Cast(exec_state->Get(fun_name)); | 95 Local<Function> fun = Local<Function>::Cast(exec_state->Get(fun_name)); |
| 94 Local<Object> cmd_processor = | 96 Local<Object> cmd_processor = |
| 95 Local<Object>::Cast(fun->Call(exec_state, 0, NULL)); | 97 Local<Object>::Cast(fun->Call(exec_state, 0, NULL)); |
| 96 if (try_catch.HasCaught()) { | 98 if (try_catch.HasCaught()) { |
| 97 Shell::ReportException(isolate, &try_catch); | 99 Shell::ReportException(isolate, &try_catch); |
| 98 return; | 100 return; |
| 99 } | 101 } |
| 100 | 102 |
| 101 static const int kBufferSize = 256; | 103 static const int kBufferSize = 256; |
| 102 bool running = false; | 104 bool running = false; |
| 103 while (!running) { | 105 while (!running) { |
| 104 char command[kBufferSize]; | 106 char command[kBufferSize]; |
| 105 PrintPrompt(running); | 107 PrintPrompt(running); |
| 106 char* str = fgets(command, kBufferSize, stdin); | 108 char* str = fgets(command, kBufferSize, stdin); |
| 107 if (str == NULL) break; | 109 if (str == NULL) break; |
| 108 | 110 |
| 109 // Ignore empty commands. | 111 // Ignore empty commands. |
| 110 if (strlen(command) == 0) continue; | 112 if (strlen(command) == 0) continue; |
| 111 | 113 |
| 112 TryCatch try_catch; | 114 TryCatch try_catch; |
| 113 | 115 |
| 114 // Convert the debugger command to a JSON debugger request. | 116 // Convert the debugger command to a JSON debugger request. |
| 115 Handle<Value> request = | 117 Handle<Value> request = Shell::DebugCommandToJSONRequest( |
| 116 Shell::DebugCommandToJSONRequest(isolate, String::New(command)); | 118 isolate, String::NewFromUtf8(isolate, command)); |
| 117 if (try_catch.HasCaught()) { | 119 if (try_catch.HasCaught()) { |
| 118 Shell::ReportException(isolate, &try_catch); | 120 Shell::ReportException(isolate, &try_catch); |
| 119 continue; | 121 continue; |
| 120 } | 122 } |
| 121 | 123 |
| 122 // If undefined is returned the command was handled internally and there is | 124 // If undefined is returned the command was handled internally and there is |
| 123 // no JSON to send. | 125 // no JSON to send. |
| 124 if (request->IsUndefined()) { | 126 if (request->IsUndefined()) { |
| 125 continue; | 127 continue; |
| 126 } | 128 } |
| 127 | 129 |
| 128 Handle<String> fun_name; | 130 Handle<String> fun_name; |
| 129 Handle<Function> fun; | 131 Handle<Function> fun; |
| 130 // All the functions used below take one argument. | 132 // All the functions used below take one argument. |
| 131 static const int kArgc = 1; | 133 static const int kArgc = 1; |
| 132 Handle<Value> args[kArgc]; | 134 Handle<Value> args[kArgc]; |
| 133 | 135 |
| 134 // Invoke the JavaScript to convert the debug command line to a JSON | 136 // Invoke the JavaScript to convert the debug command line to a JSON |
| 135 // request, invoke the JSON request and convert the JSON respose to a text | 137 // request, invoke the JSON request and convert the JSON respose to a text |
| 136 // representation. | 138 // representation. |
| 137 fun_name = String::New("processDebugRequest"); | 139 fun_name = String::NewFromUtf8(isolate, "processDebugRequest"); |
| 138 fun = Handle<Function>::Cast(cmd_processor->Get(fun_name)); | 140 fun = Handle<Function>::Cast(cmd_processor->Get(fun_name)); |
| 139 args[0] = request; | 141 args[0] = request; |
| 140 Handle<Value> response_val = fun->Call(cmd_processor, kArgc, args); | 142 Handle<Value> response_val = fun->Call(cmd_processor, kArgc, args); |
| 141 if (try_catch.HasCaught()) { | 143 if (try_catch.HasCaught()) { |
| 142 Shell::ReportException(isolate, &try_catch); | 144 Shell::ReportException(isolate, &try_catch); |
| 143 continue; | 145 continue; |
| 144 } | 146 } |
| 145 Handle<String> response = Handle<String>::Cast(response_val); | 147 Handle<String> response = Handle<String>::Cast(response_val); |
| 146 | 148 |
| 147 // Convert the debugger response into text details and the running state. | 149 // Convert the debugger response into text details and the running state. |
| 148 Handle<Object> response_details = | 150 Handle<Object> response_details = |
| 149 Shell::DebugMessageDetails(isolate, response); | 151 Shell::DebugMessageDetails(isolate, response); |
| 150 if (try_catch.HasCaught()) { | 152 if (try_catch.HasCaught()) { |
| 151 Shell::ReportException(isolate, &try_catch); | 153 Shell::ReportException(isolate, &try_catch); |
| 152 continue; | 154 continue; |
| 153 } | 155 } |
| 154 String::Utf8Value text_str(response_details->Get(String::New("text"))); | 156 String::Utf8Value text_str( |
| 157 response_details->Get(String::NewFromUtf8(isolate, "text"))); |
| 155 if (text_str.length() > 0) { | 158 if (text_str.length() > 0) { |
| 156 printf("%s\n", *text_str); | 159 printf("%s\n", *text_str); |
| 157 } | 160 } |
| 158 running = | 161 running = response_details->Get(String::NewFromUtf8(isolate, "running")) |
| 159 response_details->Get(String::New("running"))->ToBoolean()->Value(); | 162 ->ToBoolean() |
| 163 ->Value(); |
| 160 } | 164 } |
| 161 } | 165 } |
| 162 | 166 |
| 163 | 167 |
| 164 void RunRemoteDebugger(Isolate* isolate, int port) { | 168 void RunRemoteDebugger(Isolate* isolate, int port) { |
| 165 RemoteDebugger debugger(isolate, port); | 169 RemoteDebugger debugger(isolate, port); |
| 166 debugger.Run(); | 170 debugger.Run(); |
| 167 } | 171 } |
| 168 | 172 |
| 169 | 173 |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 266 return result; | 270 return result; |
| 267 } | 271 } |
| 268 | 272 |
| 269 | 273 |
| 270 void RemoteDebugger::HandleMessageReceived(char* message) { | 274 void RemoteDebugger::HandleMessageReceived(char* message) { |
| 271 Locker lock(isolate_); | 275 Locker lock(isolate_); |
| 272 HandleScope scope(isolate_); | 276 HandleScope scope(isolate_); |
| 273 | 277 |
| 274 // Print the event details. | 278 // Print the event details. |
| 275 TryCatch try_catch; | 279 TryCatch try_catch; |
| 276 Handle<Object> details = | 280 Handle<Object> details = Shell::DebugMessageDetails( |
| 277 Shell::DebugMessageDetails(isolate_, | 281 isolate_, Handle<String>::Cast(String::NewFromUtf8(isolate_, message))); |
| 278 Handle<String>::Cast(String::New(message))); | |
| 279 if (try_catch.HasCaught()) { | 282 if (try_catch.HasCaught()) { |
| 280 Shell::ReportException(isolate_, &try_catch); | 283 Shell::ReportException(isolate_, &try_catch); |
| 281 PrintPrompt(); | 284 PrintPrompt(); |
| 282 return; | 285 return; |
| 283 } | 286 } |
| 284 String::Utf8Value str(details->Get(String::New("text"))); | 287 String::Utf8Value str(details->Get(String::NewFromUtf8(isolate_, "text"))); |
| 285 if (str.length() == 0) { | 288 if (str.length() == 0) { |
| 286 // Empty string is used to signal not to process this event. | 289 // Empty string is used to signal not to process this event. |
| 287 return; | 290 return; |
| 288 } | 291 } |
| 289 if (*str != NULL) { | 292 if (*str != NULL) { |
| 290 printf("%s\n", *str); | 293 printf("%s\n", *str); |
| 291 } else { | 294 } else { |
| 292 printf("???\n"); | 295 printf("???\n"); |
| 293 } | 296 } |
| 294 | 297 |
| 295 bool is_running = details->Get(String::New("running"))->ToBoolean()->Value(); | 298 bool is_running = details->Get(String::NewFromUtf8(isolate_, "running")) |
| 299 ->ToBoolean() |
| 300 ->Value(); |
| 296 PrintPrompt(is_running); | 301 PrintPrompt(is_running); |
| 297 } | 302 } |
| 298 | 303 |
| 299 | 304 |
| 300 void RemoteDebugger::HandleKeyboardCommand(char* command) { | 305 void RemoteDebugger::HandleKeyboardCommand(char* command) { |
| 301 Locker lock(isolate_); | 306 Locker lock(isolate_); |
| 302 HandleScope scope(isolate_); | 307 HandleScope scope(isolate_); |
| 303 | 308 |
| 304 // Convert the debugger command to a JSON debugger request. | 309 // Convert the debugger command to a JSON debugger request. |
| 305 TryCatch try_catch; | 310 TryCatch try_catch; |
| 306 Handle<Value> request = | 311 Handle<Value> request = Shell::DebugCommandToJSONRequest( |
| 307 Shell::DebugCommandToJSONRequest(isolate_, String::New(command)); | 312 isolate_, String::NewFromUtf8(isolate_, command)); |
| 308 if (try_catch.HasCaught()) { | 313 if (try_catch.HasCaught()) { |
| 309 Shell::ReportException(isolate_, &try_catch); | 314 Shell::ReportException(isolate_, &try_catch); |
| 310 PrintPrompt(); | 315 PrintPrompt(); |
| 311 return; | 316 return; |
| 312 } | 317 } |
| 313 | 318 |
| 314 // If undefined is returned the command was handled internally and there is | 319 // If undefined is returned the command was handled internally and there is |
| 315 // no JSON to send. | 320 // no JSON to send. |
| 316 if (request->IsUndefined()) { | 321 if (request->IsUndefined()) { |
| 317 PrintPrompt(); | 322 PrintPrompt(); |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 357 // Pass the keyboard command to the main thread. | 362 // Pass the keyboard command to the main thread. |
| 358 remote_debugger_->KeyboardCommand( | 363 remote_debugger_->KeyboardCommand( |
| 359 i::SmartArrayPointer<char>(i::StrDup(command))); | 364 i::SmartArrayPointer<char>(i::StrDup(command))); |
| 360 } | 365 } |
| 361 } | 366 } |
| 362 | 367 |
| 363 | 368 |
| 364 } // namespace v8 | 369 } // namespace v8 |
| 365 | 370 |
| 366 #endif // ENABLE_DEBUGGER_SUPPORT | 371 #endif // ENABLE_DEBUGGER_SUPPORT |
| OLD | NEW |