diff --git a/cmpl_evaluate_statement.go b/cmpl_evaluate_statement.go index 7be1584..b9da37c 100644 --- a/cmpl_evaluate_statement.go +++ b/cmpl_evaluate_statement.go @@ -47,6 +47,9 @@ func (self *_runtime) cmpl_evaluate_nodeStatement(node _nodeStatement) Value { } case *_nodeDebuggerStatement: + if self.debugger != nil { + self.debugger() + } return emptyValue // Nothing happens. case *_nodeDoWhileStatement: diff --git a/otto.go b/otto.go index 9de3e08..2549f66 100644 --- a/otto.go +++ b/otto.go @@ -341,6 +341,10 @@ func (self Otto) setValue(name string, value Value) { self.runtime.globalStash.setValue(name, value, false) } +func (self Otto) SetDebuggerHandler(fn func(vm *Otto)) { + self.runtime.debugger = fn +} + // Call the given JavaScript with a given this and arguments. // // If this is nil, then some special handling takes place to determine the proper diff --git a/runtime.go b/runtime.go index 78e3892..51cc041 100644 --- a/runtime.go +++ b/runtime.go @@ -54,6 +54,7 @@ type _runtime struct { scope *_scope otto *Otto eval *_object // The builtin eval, for determine indirect versus direct invocation + debugger func(*Otto) labels []string // FIXME lck sync.Mutex diff --git a/runtime_test.go b/runtime_test.go index 2510a0b..2816578 100644 --- a/runtime_test.go +++ b/runtime_test.go @@ -769,10 +769,16 @@ func TestClone(t *testing.T) { func Test_debugger(t *testing.T) { tt(t, func() { - test, _ := test() + called := false - test(` - debugger; - `, "undefined") + vm := New() + vm.SetDebuggerHandler(func(o *Otto) { + is(o, vm) + called = true + }) + + _, err := vm.Run(`debugger;`) + is(err, nil) + is(called, true) }) }