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 "include/dart_debugger_api.h" | 5 #include "include/dart_debugger_api.h" |
6 | 6 |
7 #include "vm/dart_api_impl.h" | 7 #include "vm/dart_api_impl.h" |
8 #include "vm/dart_api_state.h" | 8 #include "vm/dart_api_state.h" |
9 #include "vm/debugger.h" | 9 #include "vm/debugger.h" |
10 #include "vm/isolate.h" | 10 #include "vm/isolate.h" |
(...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
266 SourceBreakpoint* bpt = | 266 SourceBreakpoint* bpt = |
267 debugger->SetBreakpointAtLine(script_url, line_number); | 267 debugger->SetBreakpointAtLine(script_url, line_number); |
268 if (bpt == NULL) { | 268 if (bpt == NULL) { |
269 return Api::NewError("%s: could not set breakpoint at line %"Pd" in '%s'", | 269 return Api::NewError("%s: could not set breakpoint at line %"Pd" in '%s'", |
270 CURRENT_FUNC, line_number, script_url.ToCString()); | 270 CURRENT_FUNC, line_number, script_url.ToCString()); |
271 } | 271 } |
272 return Dart_NewInteger(bpt->id()); | 272 return Dart_NewInteger(bpt->id()); |
273 } | 273 } |
274 | 274 |
275 | 275 |
276 // TODO(hausner): remove this function. | |
277 DART_EXPORT Dart_Handle Dart_SetBreakpointAtLine( | |
278 Dart_Handle script_url_in, | |
279 Dart_Handle line_number_in, | |
280 Dart_Breakpoint* breakpoint) { | |
281 Isolate* isolate = Isolate::Current(); | |
282 DARTSCOPE(isolate); | |
283 UNWRAP_AND_CHECK_PARAM(String, script_url, script_url_in); | |
284 UNWRAP_AND_CHECK_PARAM(Integer, line_number, line_number_in); | |
285 CHECK_NOT_NULL(breakpoint); | |
286 | |
287 if (!line_number.IsSmi()) { | |
288 return Api::NewError("%s: line number out of range", CURRENT_FUNC); | |
289 } | |
290 intptr_t line = line_number.AsInt64Value(); | |
291 | |
292 Dart_Handle state = Api::CheckIsolateState(isolate); | |
293 if (::Dart_IsError(state)) { | |
294 return state; | |
295 } | |
296 | |
297 Dart_Handle result = Api::True(isolate); | |
298 *breakpoint = NULL; | |
299 Debugger* debugger = isolate->debugger(); | |
300 ASSERT(debugger != NULL); | |
301 SourceBreakpoint* bpt = | |
302 debugger->SetBreakpointAtLine(script_url, line); | |
303 if (bpt == NULL) { | |
304 result = Api::NewError("%s: could not set breakpoint at line %"Pd" of '%s'", | |
305 CURRENT_FUNC, line, script_url.ToCString()); | |
306 } else { | |
307 *breakpoint = reinterpret_cast<Dart_Breakpoint>(bpt); | |
308 } | |
309 return result; | |
310 } | |
311 | |
312 | |
313 DART_EXPORT Dart_Handle Dart_GetBreakpointURL(intptr_t bp_id) { | 276 DART_EXPORT Dart_Handle Dart_GetBreakpointURL(intptr_t bp_id) { |
314 Isolate* isolate = Isolate::Current(); | 277 Isolate* isolate = Isolate::Current(); |
315 DARTSCOPE(isolate); | 278 DARTSCOPE(isolate); |
316 Debugger* debugger = isolate->debugger(); | 279 Debugger* debugger = isolate->debugger(); |
317 ASSERT(debugger != NULL); | 280 ASSERT(debugger != NULL); |
318 | 281 |
319 SourceBreakpoint* bpt = debugger->GetBreakpointById(bp_id); | 282 SourceBreakpoint* bpt = debugger->GetBreakpointById(bp_id); |
320 if (bpt == NULL) { | 283 if (bpt == NULL) { |
321 return Api::NewError("%s: breakpoint with id %"Pd" does not exist", | 284 return Api::NewError("%s: breakpoint with id %"Pd" does not exist", |
322 CURRENT_FUNC, bp_id); | 285 CURRENT_FUNC, bp_id); |
(...skipping 13 matching lines...) Expand all Loading... |
336 return Api::NewError("%s: breakpoint with id %"Pd" does not exist", | 299 return Api::NewError("%s: breakpoint with id %"Pd" does not exist", |
337 CURRENT_FUNC, bp_id); | 300 CURRENT_FUNC, bp_id); |
338 } | 301 } |
339 return Dart_NewInteger(bpt->LineNumber()); | 302 return Dart_NewInteger(bpt->LineNumber()); |
340 } | 303 } |
341 | 304 |
342 | 305 |
343 DART_EXPORT Dart_Handle Dart_SetBreakpointAtEntry( | 306 DART_EXPORT Dart_Handle Dart_SetBreakpointAtEntry( |
344 Dart_Handle library_in, | 307 Dart_Handle library_in, |
345 Dart_Handle class_name_in, | 308 Dart_Handle class_name_in, |
346 Dart_Handle function_name_in, | 309 Dart_Handle function_name_in) { |
347 Dart_Breakpoint* breakpoint) { | |
348 Isolate* isolate = Isolate::Current(); | 310 Isolate* isolate = Isolate::Current(); |
349 DARTSCOPE(isolate); | 311 DARTSCOPE(isolate); |
350 UNWRAP_AND_CHECK_PARAM(Library, library, library_in); | 312 UNWRAP_AND_CHECK_PARAM(Library, library, library_in); |
351 UNWRAP_AND_CHECK_PARAM(String, class_name, class_name_in); | 313 UNWRAP_AND_CHECK_PARAM(String, class_name, class_name_in); |
352 UNWRAP_AND_CHECK_PARAM(String, function_name, function_name_in); | 314 UNWRAP_AND_CHECK_PARAM(String, function_name, function_name_in); |
353 CHECK_NOT_NULL(breakpoint); | |
354 | 315 |
355 Dart_Handle state = Api::CheckIsolateState(isolate); | 316 Dart_Handle state = Api::CheckIsolateState(isolate); |
356 if (::Dart_IsError(state)) { | 317 if (::Dart_IsError(state)) { |
357 return state; | 318 return state; |
358 } | 319 } |
359 | 320 |
360 // Resolve the breakpoint target function. | 321 // Resolve the breakpoint target function. |
361 Debugger* debugger = isolate->debugger(); | 322 Debugger* debugger = isolate->debugger(); |
362 const Function& bp_target = Function::Handle( | 323 const Function& bp_target = Function::Handle( |
363 debugger->ResolveFunction(library, class_name, function_name)); | 324 debugger->ResolveFunction(library, class_name, function_name)); |
364 if (bp_target.IsNull()) { | 325 if (bp_target.IsNull()) { |
365 const bool toplevel = class_name.Length() == 0; | 326 const bool toplevel = class_name.Length() == 0; |
366 return Api::NewError("%s: could not find function '%s%s%s'", | 327 return Api::NewError("%s: could not find function '%s%s%s'", |
367 CURRENT_FUNC, | 328 CURRENT_FUNC, |
368 toplevel ? "" : class_name.ToCString(), | 329 toplevel ? "" : class_name.ToCString(), |
369 toplevel ? "" : ".", | 330 toplevel ? "" : ".", |
370 function_name.ToCString()); | 331 function_name.ToCString()); |
371 } | 332 } |
372 | 333 |
373 Dart_Handle result = Api::True(isolate); | |
374 *breakpoint = NULL; | |
375 | |
376 SourceBreakpoint* bpt = debugger->SetBreakpointAtEntry(bp_target); | 334 SourceBreakpoint* bpt = debugger->SetBreakpointAtEntry(bp_target); |
377 if (bpt == NULL) { | 335 if (bpt == NULL) { |
378 const char* target_name = Debugger::QualifiedFunctionName(bp_target); | 336 const char* target_name = Debugger::QualifiedFunctionName(bp_target); |
379 result = Api::NewError("%s: no breakpoint location found in '%s'", | 337 return Api::NewError("%s: no breakpoint location found in '%s'", |
380 CURRENT_FUNC, target_name); | 338 CURRENT_FUNC, target_name); |
381 } else { | |
382 *breakpoint = reinterpret_cast<Dart_Breakpoint>(bpt); | |
383 } | 339 } |
384 return result; | 340 return Dart_NewInteger(bpt->id()); |
385 } | 341 } |
386 | 342 |
387 | 343 |
388 DART_EXPORT Dart_Handle Dart_OneTimeBreakAtEntry( | 344 DART_EXPORT Dart_Handle Dart_OneTimeBreakAtEntry( |
389 Dart_Handle library_in, | 345 Dart_Handle library_in, |
390 Dart_Handle class_name_in, | 346 Dart_Handle class_name_in, |
391 Dart_Handle function_name_in) { | 347 Dart_Handle function_name_in) { |
392 Isolate* isolate = Isolate::Current(); | 348 Isolate* isolate = Isolate::Current(); |
393 DARTSCOPE(isolate); | 349 DARTSCOPE(isolate); |
394 UNWRAP_AND_CHECK_PARAM(Library, library, library_in); | 350 UNWRAP_AND_CHECK_PARAM(Library, library, library_in); |
(...skipping 16 matching lines...) Expand all Loading... |
411 toplevel ? "" : class_name.ToCString(), | 367 toplevel ? "" : class_name.ToCString(), |
412 toplevel ? "" : ".", | 368 toplevel ? "" : ".", |
413 function_name.ToCString()); | 369 function_name.ToCString()); |
414 } | 370 } |
415 | 371 |
416 debugger->OneTimeBreakAtEntry(bp_target); | 372 debugger->OneTimeBreakAtEntry(bp_target); |
417 return Api::True(isolate); | 373 return Api::True(isolate); |
418 } | 374 } |
419 | 375 |
420 | 376 |
421 | |
422 | |
423 | |
424 DART_EXPORT Dart_Handle Dart_RemoveBreakpoint(intptr_t bp_id) { | 377 DART_EXPORT Dart_Handle Dart_RemoveBreakpoint(intptr_t bp_id) { |
425 Isolate* isolate = Isolate::Current(); | 378 Isolate* isolate = Isolate::Current(); |
426 DARTSCOPE(isolate); | 379 DARTSCOPE(isolate); |
427 Debugger* debugger = isolate->debugger(); | 380 Debugger* debugger = isolate->debugger(); |
428 ASSERT(debugger != NULL); | 381 ASSERT(debugger != NULL); |
429 | 382 |
430 isolate->debugger()->RemoveBreakpoint(bp_id); | 383 isolate->debugger()->RemoveBreakpoint(bp_id); |
431 return Api::True(isolate); | 384 return Api::True(isolate); |
432 } | 385 } |
433 | 386 |
434 | 387 |
435 DART_EXPORT Dart_Handle Dart_DeleteBreakpoint( | |
436 Dart_Breakpoint breakpoint_in) { | |
437 Isolate* isolate = Isolate::Current(); | |
438 DARTSCOPE(isolate); | |
439 | |
440 CHECK_AND_CAST(SourceBreakpoint, breakpoint, breakpoint_in); | |
441 isolate->debugger()->RemoveBreakpoint(breakpoint->id()); | |
442 return Api::True(isolate); | |
443 } | |
444 | |
445 | |
446 DART_EXPORT Dart_Handle Dart_SetStepOver() { | 388 DART_EXPORT Dart_Handle Dart_SetStepOver() { |
447 Isolate* isolate = Isolate::Current(); | 389 Isolate* isolate = Isolate::Current(); |
448 DARTSCOPE(isolate); | 390 DARTSCOPE(isolate); |
449 isolate->debugger()->SetStepOver(); | 391 isolate->debugger()->SetStepOver(); |
450 return Api::True(isolate); | 392 return Api::True(isolate); |
451 } | 393 } |
452 | 394 |
453 | 395 |
454 DART_EXPORT Dart_Handle Dart_SetStepInto() { | 396 DART_EXPORT Dart_Handle Dart_SetStepInto() { |
455 Isolate* isolate = Isolate::Current(); | 397 Isolate* isolate = Isolate::Current(); |
(...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
759 DARTSCOPE(isolate); | 701 DARTSCOPE(isolate); |
760 const Library& lib = Library::Handle(Library::GetLibrary(library_id)); | 702 const Library& lib = Library::Handle(Library::GetLibrary(library_id)); |
761 if (lib.IsNull()) { | 703 if (lib.IsNull()) { |
762 return Api::NewError("%s: %"Pd" is not a valid library id", | 704 return Api::NewError("%s: %"Pd" is not a valid library id", |
763 CURRENT_FUNC, library_id); | 705 CURRENT_FUNC, library_id); |
764 } | 706 } |
765 return Api::NewHandle(isolate, lib.url()); | 707 return Api::NewHandle(isolate, lib.url()); |
766 } | 708 } |
767 | 709 |
768 | 710 |
769 DART_EXPORT Dart_Handle Dart_GetLibraryURLs() { | |
770 Isolate* isolate = Isolate::Current(); | |
771 ASSERT(isolate != NULL); | |
772 DARTSCOPE(isolate); | |
773 | |
774 const GrowableObjectArray& libs = | |
775 GrowableObjectArray::Handle(isolate->object_store()->libraries()); | |
776 int num_libs = libs.Length(); | |
777 | |
778 // Create new list and populate with the url of loaded libraries. | |
779 Library &lib = Library::Handle(); | |
780 String& lib_url = String::Handle(); | |
781 const Array& library_url_list = Array::Handle(Array::New(num_libs)); | |
782 for (int i = 0; i < num_libs; i++) { | |
783 lib ^= libs.At(i); | |
784 ASSERT(!lib.IsNull()); | |
785 lib_url = lib.url(); | |
786 library_url_list.SetAt(i, lib_url); | |
787 } | |
788 return Api::NewHandle(isolate, library_url_list.raw()); | |
789 } | |
790 | |
791 | |
792 DART_EXPORT Dart_Handle Dart_GetLibraryDebuggable(intptr_t library_id, | 711 DART_EXPORT Dart_Handle Dart_GetLibraryDebuggable(intptr_t library_id, |
793 bool* is_debuggable) { | 712 bool* is_debuggable) { |
794 Isolate* isolate = Isolate::Current(); | 713 Isolate* isolate = Isolate::Current(); |
795 ASSERT(isolate != NULL); | 714 ASSERT(isolate != NULL); |
796 DARTSCOPE(isolate); | 715 DARTSCOPE(isolate); |
797 CHECK_NOT_NULL(is_debuggable); | 716 CHECK_NOT_NULL(is_debuggable); |
798 const Library& lib = Library::Handle(Library::GetLibrary(library_id)); | 717 const Library& lib = Library::Handle(Library::GetLibrary(library_id)); |
799 if (lib.IsNull()) { | 718 if (lib.IsNull()) { |
800 return Api::NewError("%s: %"Pd" is not a valid library id", | 719 return Api::NewError("%s: %"Pd" is not a valid library id", |
801 CURRENT_FUNC, library_id); | 720 CURRENT_FUNC, library_id); |
(...skipping 25 matching lines...) Expand all Loading... |
827 | 746 |
828 | 747 |
829 DART_EXPORT char* Dart_GetVmStatus(const char* request) { | 748 DART_EXPORT char* Dart_GetVmStatus(const char* request) { |
830 if (strncmp(request, "/isolate/", 9) == 0) { | 749 if (strncmp(request, "/isolate/", 9) == 0) { |
831 return Isolate::GetStatus(request); | 750 return Isolate::GetStatus(request); |
832 } | 751 } |
833 return NULL; | 752 return NULL; |
834 } | 753 } |
835 | 754 |
836 } // namespace dart | 755 } // namespace dart |
OLD | NEW |