| Index: runtime/vm/debugger_api_impl.cc
|
| ===================================================================
|
| --- runtime/vm/debugger_api_impl.cc (revision 0)
|
| +++ runtime/vm/debugger_api_impl.cc (revision 0)
|
| @@ -0,0 +1,80 @@
|
| +// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file
|
| +// for details. All rights reserved. Use of this source code is governed by a
|
| +// BSD-style license that can be found in the LICENSE file.
|
| +
|
| +#include "include/dart_debugger_api.h"
|
| +
|
| +#include "vm/dart_api_impl.h"
|
| +#include "vm/dart_api_state.h"
|
| +#include "vm/debugger.h"
|
| +#include "vm/isolate.h"
|
| +#include "vm/longjump.h"
|
| +
|
| +namespace dart {
|
| +
|
| +#define UNWRAP_AND_CHECK_PARAM(type, var, param) \
|
| + do { \
|
| + const Object& tmp = Object::Handle(Api::UnwrapHandle(param)); \
|
| + if (tmp.IsNull()) { \
|
| + return Api::Error("%s expects argument '%s' to be non-null.", \
|
| + CURRENT_FUNC, #param); \
|
| + } else if (tmp.IsApiError()) { \
|
| + return param; \
|
| + } else if (!tmp.Is##type()) { \
|
| + return Api::Error("%s expects argument '%s' to be of type %s.", \
|
| + CURRENT_FUNC, #param, #type); \
|
| + } \
|
| + var ^= tmp.raw(); \
|
| + } while (0);
|
| +
|
| +
|
| +DART_EXPORT Dart_Handle Dart_SetBreakpointAtEntry(
|
| + Dart_Handle library_in,
|
| + Dart_Handle class_name_in,
|
| + Dart_Handle function_name_in,
|
| + Dart_Breakpoint* breakpoint) {
|
| + Isolate* isolate = Isolate::Current();
|
| + DARTSCOPE(isolate);
|
| +
|
| + Library& library = Library::Handle();
|
| + String& class_name = String::Handle();
|
| + String& function_name = String::Handle();
|
| + UNWRAP_AND_CHECK_PARAM(Library, library, library_in);
|
| + UNWRAP_AND_CHECK_PARAM(String, class_name, class_name_in);
|
| + UNWRAP_AND_CHECK_PARAM(String, function_name, function_name_in);
|
| +
|
| + const char* msg = CheckIsolateState(isolate);
|
| + if (msg != NULL) {
|
| + return Api::Error(msg);
|
| + }
|
| +
|
| + if (breakpoint != NULL) {
|
| + *breakpoint = NULL;
|
| + }
|
| +
|
| + // Resolve the breakpoint target function.
|
| + Debugger* debugger = isolate->debugger();
|
| + const Function& bp_target = Function::Handle(
|
| + debugger->ResolveFunction(library, class_name, function_name));
|
| + if (bp_target.IsNull()) {
|
| + return Api::Error("Breakpoint target function does not exist");
|
| + }
|
| +
|
| + LongJump* base = isolate->long_jump_base();
|
| + LongJump jump;
|
| + isolate->set_long_jump_base(&jump);
|
| + Dart_Handle result = Api::True();
|
| + if (setjmp(*jump.Set()) == 0) {
|
| + Breakpoint* bpt = debugger->SetBreakpointAtEntry(bp_target);
|
| + if (breakpoint != NULL) {
|
| + *breakpoint = reinterpret_cast<Dart_Breakpoint>(bpt);
|
| + }
|
| + } else {
|
| + SetupErrorResult(&result);
|
| + }
|
| + isolate->set_long_jump_base(base);
|
| + return result;
|
| +}
|
| +
|
| +
|
| +} // namespace dart
|
|
|