doFile("gtk.io") doFile("messageview.io") Runner := Object clone do( run := method(msg, self turnOnMessageDebugging Lobby doString(msg) ) ) Debugger do( breakpoints := List clone continueToBreakpoint := Nil vmWillSendMessage = method(actor, msg, target, context, self actor := actor self msg := msg self target := target self context := context writeln(msg asString) if (continueToBreakpoint, if (breakpoints contains(msg), continueToBreakpoint = Nil breakpoints remove(msg) , actor ?resume return ) ) if (context and context hasSlot("thisBlock"), blkmsg := context getSlot("thisBlock") message if (blkmsg == Runner getSlot("run") message, actor ?resume return ) if (blkmsg, view msg setMessage(blkmsg) if (msg ?ghoster, view msg setCursor(msg) if (msg nextMessage, self nextLine := msg nextMessage) , actor ?resume ) , actor ?resume ) , actor ?resume ) ) resume := method( writeln("Debugger resume!") actor ?resume ) next := method( writeln("Debugger next!") follow := msg attachedMessage if (follow == Nil, follow = msg nextMessage ) if (follow, breakpoints append(follow) , if (?nextLine, breakpoints append(nextLine)) ) view msg setCursor(Nil) continueToBreakpoint = 1 actor ?resume ) returnToCaller := method( writeln("Debugger returnToCaller!") if (context and context hasSlot("thisMessage"), follow := context thisMessage attachedMessage if (follow == Nil, follow = context thisMessage nextMessage ) if (follow, breakpoints append(follow) ) view msg setCursor(Nil) continueToBreakpoint = 1 actor ?resume ) ) view := MainWindow clone do( step := Button clone setLabel("Step") show next := Button clone setLabel("Next") show returner := Button clone setLabel("Return") show msg := MessageView clone setMessage("1 + 2" asMessage) show result := TextView clone setEditable(Nil) show cmdline := TextView clone show evaluate := Button clone setLabel("Evaluate") show step clicked := method(Debugger resume) next clicked := method(Debugger next) returner clicked := method(Debugger returnToCaller) evaluate clicked := block( writeln("cmd: ", cmdline getText) o := Nil try( o = Debugger context doString(cmdline getText) ) result setText(o ?asString) cmdline setText("") ) vbox := VBox clone show hbox := HBox clone show hbox add(step) add(next) add(returner) vbox add(hbox) add(msg) add(result) add(HBox clone add(cmdline) packEnd(evaluate, Nil, Nil, 0) show) add(vbox) setTitle("Debug") show ) debug := method(msg, Runner @@run(msg) ) ) doFile("browserview.io") Debugger debug("bar")