| OLD | NEW |
| 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 "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" |
| 11 #include "vm/longjump.h" | |
| 12 #include "vm/object_store.h" | 11 #include "vm/object_store.h" |
| 13 | 12 |
| 14 namespace dart { | 13 namespace dart { |
| 15 | 14 |
| 16 #define UNWRAP_AND_CHECK_PARAM(type, var, param) \ | 15 #define UNWRAP_AND_CHECK_PARAM(type, var, param) \ |
| 17 do { \ | 16 do { \ |
| 18 const Object& tmp = Object::Handle(Api::UnwrapHandle(param)); \ | 17 const Object& tmp = Object::Handle(Api::UnwrapHandle(param)); \ |
| 19 if (tmp.IsNull()) { \ | 18 if (tmp.IsNull()) { \ |
| 20 return Api::NewError("%s expects argument '%s' to be non-null.", \ | 19 return Api::NewError("%s expects argument '%s' to be non-null.", \ |
| 21 CURRENT_FUNC, #param); \ | 20 CURRENT_FUNC, #param); \ |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 134 if (!line_number.IsSmi()) { | 133 if (!line_number.IsSmi()) { |
| 135 return Api::NewError("%s: line number out of range", CURRENT_FUNC); | 134 return Api::NewError("%s: line number out of range", CURRENT_FUNC); |
| 136 } | 135 } |
| 137 intptr_t line = line_number.AsInt64Value(); | 136 intptr_t line = line_number.AsInt64Value(); |
| 138 | 137 |
| 139 const char* msg = CheckIsolateState(isolate); | 138 const char* msg = CheckIsolateState(isolate); |
| 140 if (msg != NULL) { | 139 if (msg != NULL) { |
| 141 return Api::NewError(msg); | 140 return Api::NewError(msg); |
| 142 } | 141 } |
| 143 | 142 |
| 144 LongJump* base = isolate->long_jump_base(); | |
| 145 LongJump jump; | |
| 146 isolate->set_long_jump_base(&jump); | |
| 147 Dart_Handle result = Api::True(); | 143 Dart_Handle result = Api::True(); |
| 148 *breakpoint = NULL; | 144 *breakpoint = NULL; |
| 149 Debugger* debugger = isolate->debugger(); | 145 Debugger* debugger = isolate->debugger(); |
| 150 ASSERT(debugger != NULL); | 146 ASSERT(debugger != NULL); |
| 151 if (setjmp(*jump.Set()) == 0) { | 147 Error& error = Error::Handle(); |
| 152 Breakpoint* bpt = debugger->SetBreakpointAtLine(script_url, line); | 148 Breakpoint* bpt = debugger->SetBreakpointAtLine(script_url, line, &error); |
| 153 if (bpt == NULL) { | 149 if (bpt == NULL) { |
| 150 if (!error.IsNull()) { |
| 151 // If SetBreakpointAtLine provided an error message, use it. |
| 152 result = Api::NewLocalHandle(error); |
| 153 } else { |
| 154 result = Api::NewError("%s: could not set breakpoint at line %d of '%s'", | 154 result = Api::NewError("%s: could not set breakpoint at line %d of '%s'", |
| 155 CURRENT_FUNC, line, script_url.ToCString()); | 155 CURRENT_FUNC, line, script_url.ToCString()); |
| 156 } else { | |
| 157 *breakpoint = reinterpret_cast<Dart_Breakpoint>(bpt); | |
| 158 } | 156 } |
| 159 } else { | 157 } else { |
| 160 SetupErrorResult(&result); | 158 *breakpoint = reinterpret_cast<Dart_Breakpoint>(bpt); |
| 161 } | 159 } |
| 162 isolate->set_long_jump_base(base); | |
| 163 return result; | 160 return result; |
| 164 } | 161 } |
| 165 | 162 |
| 166 | 163 |
| 167 DART_EXPORT Dart_Handle Dart_SetBreakpointAtEntry( | 164 DART_EXPORT Dart_Handle Dart_SetBreakpointAtEntry( |
| 168 Dart_Handle library_in, | 165 Dart_Handle library_in, |
| 169 Dart_Handle class_name_in, | 166 Dart_Handle class_name_in, |
| 170 Dart_Handle function_name_in, | 167 Dart_Handle function_name_in, |
| 171 Dart_Breakpoint* breakpoint) { | 168 Dart_Breakpoint* breakpoint) { |
| 172 Isolate* isolate = Isolate::Current(); | 169 Isolate* isolate = Isolate::Current(); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 191 debugger->ResolveFunction(library, class_name, function_name)); | 188 debugger->ResolveFunction(library, class_name, function_name)); |
| 192 if (bp_target.IsNull()) { | 189 if (bp_target.IsNull()) { |
| 193 const bool toplevel = class_name.Length() == 0; | 190 const bool toplevel = class_name.Length() == 0; |
| 194 return Api::NewError("%s: could not find function '%s%s%s'", | 191 return Api::NewError("%s: could not find function '%s%s%s'", |
| 195 CURRENT_FUNC, | 192 CURRENT_FUNC, |
| 196 toplevel ? "" : class_name.ToCString(), | 193 toplevel ? "" : class_name.ToCString(), |
| 197 toplevel ? "" : ".", | 194 toplevel ? "" : ".", |
| 198 function_name.ToCString()); | 195 function_name.ToCString()); |
| 199 } | 196 } |
| 200 | 197 |
| 201 LongJump* base = isolate->long_jump_base(); | |
| 202 LongJump jump; | |
| 203 isolate->set_long_jump_base(&jump); | |
| 204 Dart_Handle result = Api::True(); | 198 Dart_Handle result = Api::True(); |
| 205 *breakpoint = NULL; | 199 *breakpoint = NULL; |
| 206 if (setjmp(*jump.Set()) == 0) { | 200 |
| 207 Breakpoint* bpt = debugger->SetBreakpointAtEntry(bp_target); | 201 Error& error = Error::Handle(); |
| 208 if (bpt == NULL) { | 202 Breakpoint* bpt = debugger->SetBreakpointAtEntry(bp_target, &error); |
| 209 const char* target_name = Debugger::QualifiedFunctionName(bp_target); | 203 if (!error.IsNull()) { |
| 210 result = Api::NewError("%s: no breakpoint location found in '%s'", | 204 return Api::NewLocalHandle(error); |
| 205 } |
| 206 if (bpt == NULL) { |
| 207 const char* target_name = Debugger::QualifiedFunctionName(bp_target); |
| 208 result = Api::NewError("%s: no breakpoint location found in '%s'", |
| 211 CURRENT_FUNC, target_name); | 209 CURRENT_FUNC, target_name); |
| 212 } else { | |
| 213 *breakpoint = reinterpret_cast<Dart_Breakpoint>(bpt); | |
| 214 } | |
| 215 } else { | 210 } else { |
| 216 SetupErrorResult(&result); | 211 *breakpoint = reinterpret_cast<Dart_Breakpoint>(bpt); |
| 217 } | 212 } |
| 218 isolate->set_long_jump_base(base); | |
| 219 return result; | 213 return result; |
| 220 } | 214 } |
| 221 | 215 |
| 222 | 216 |
| 223 DART_EXPORT Dart_Handle Dart_DeleteBreakpoint( | 217 DART_EXPORT Dart_Handle Dart_DeleteBreakpoint( |
| 224 Dart_Breakpoint breakpoint_in) { | 218 Dart_Breakpoint breakpoint_in) { |
| 225 Isolate* isolate = Isolate::Current(); | 219 Isolate* isolate = Isolate::Current(); |
| 226 DARTSCOPE(isolate); | 220 DARTSCOPE(isolate); |
| 227 | 221 |
| 228 CHECK_AND_CAST(Breakpoint, breakpoint, breakpoint_in); | 222 CHECK_AND_CAST(Breakpoint, breakpoint, breakpoint_in); |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 348 for (int i = 0; i < num_libs; i++) { | 342 for (int i = 0; i < num_libs; i++) { |
| 349 ASSERT(!lib.IsNull()); | 343 ASSERT(!lib.IsNull()); |
| 350 lib_url = lib.url(); | 344 lib_url = lib.url(); |
| 351 library_list.SetAt(i, lib_url); | 345 library_list.SetAt(i, lib_url); |
| 352 lib = lib.next_registered(); | 346 lib = lib.next_registered(); |
| 353 } | 347 } |
| 354 return Api::NewLocalHandle(library_list); | 348 return Api::NewLocalHandle(library_list); |
| 355 } | 349 } |
| 356 | 350 |
| 357 } // namespace dart | 351 } // namespace dart |
| OLD | NEW |