From d203510527c2136f0ae97047e47fff521ff84b58 Mon Sep 17 00:00:00 2001 From: "kepler155c@gmail.com" Date: Sat, 30 May 2020 20:06:30 -0600 Subject: [PATCH] debugger refactor --- common/edit.lua | 14 ++++++++++---- common/etc/apps.db | 5 +++++ common/etc/fstab | 3 +-- debugger/apis/init.lua | 11 ++--------- debugger/debug.lua | 28 ++++++++++++++++++++++------ debugger/etc/apps.db | 7 +++++++ debugger/example.lua | 12 +++++++++++- 7 files changed, 58 insertions(+), 22 deletions(-) create mode 100644 debugger/etc/apps.db diff --git a/common/edit.lua b/common/edit.lua index 54f5ba6..2dbd1ff 100644 --- a/common/edit.lua +++ b/common/edit.lua @@ -1,6 +1,5 @@ local Array = require('opus.array') local Config = require('opus.config') -local fuzzy = require('opus.fuzzy') local UI = require('opus.ui') local Util = require('opus.util') @@ -492,7 +491,7 @@ local page = UI.Page { UI.Window.resize(self) w, h = self.width, self.height - actions.set_cursor(x, y) + actions.set_cursor() actions.dirty_all() actions.redraw() end, @@ -940,7 +939,7 @@ actions = { local routine = { focused = true, title = fs.getName(fileInfo.path), - chainExit = function(_, result) + onExit = function(_, result) -- display results of process before closing window if result then -- clean exit -- any errors will be picked up by multishells @@ -1467,12 +1466,19 @@ actions = { end, } -local args = { ... } +local args, options = Util.parse( ... ) local filename = args[1] and shell.resolve(args[1]) if not (actions.load(filename) or actions.load(config.filename) or actions.load('untitled.lua')) then error('Error opening file') end +if tonumber(options.line) then + scrollY = math.max(0, tonumber(options.line) - math.floor(h / 2)) + actions.go_to(1, tonumber(options.line)) + actions.set_cursor() + actions.dirty_all() +end + UI:setPage(page) local s, m = pcall(function() UI:start() end) if not s then diff --git a/common/etc/apps.db b/common/etc/apps.db index 7580ce5..2e2a32b 100644 --- a/common/etc/apps.db +++ b/common/etc/apps.db @@ -78,4 +78,9 @@ category = "Apps", run = "write", }, + [ "c543ece81605c7d202121c62080a0db4020fc2c75bfac35d101d7f3e93c93949" ] = { + category = "Apps", + run = "ascii", + title = "Ascii", + }, } diff --git a/common/etc/fstab b/common/etc/fstab index 00b921e..e636640 100644 --- a/common/etc/fstab +++ b/common/etc/fstab @@ -3,5 +3,4 @@ packages/common/hexedit.lua urlfs https://pastebin.com/raw/Ds9ajsp4 packages/common/colors.lua urlfs https://raw.githubusercontent.com/kepler155c/opus-apps/develop-1.8/ignore/colors.lua packages/common/cowsay.lua urlfs https://pastebin.com/raw/n00VQJsw packages/common/calc.lua urlfs https://pastebin.com/raw/nAinUn1h -packages/common/write.lua urlfs https://pastebin.com/raw/RSyhCjqv -packages/common/apis/debugger.lua urlfs https://raw.githubusercontent.com/slembcke/debugger.lua/master/debugger.lua \ No newline at end of file +packages/common/write.lua urlfs https://pastebin.com/raw/RSyhCjqv \ No newline at end of file diff --git a/debugger/apis/init.lua b/debugger/apis/init.lua index 78cfbd6..44e4b16 100644 --- a/debugger/apis/init.lua +++ b/debugger/apis/init.lua @@ -6,10 +6,8 @@ local fs = _G.fs local dbg = { hooks = { }, waits = { }, - debugger = nil, breakpoints = nil, } -_G._dbg = dbg -- for testing purposes local function breakpointHook(info) if dbg.breakpoints then @@ -155,12 +153,7 @@ local function hook() while dbg.waits[1] ~= h do os.sleep(.1) end - os.queueEvent('debuggerX', dbg.debugger.uid, snapshot) - - local e, cmd, param - repeat - e, cmd, param = os.pullEvent('debugger') - until e == 'debugger' + local cmd, param = dbg.read(snapshot) table.remove(dbg.waits, 1) @@ -187,7 +180,7 @@ function dbg.call(fn, ...) local args = { ... } return xpcall( function() - fn(table.unpack(args)) + return fn(table.unpack(args)) end, function(err) dbg.hooks[coroutine.running()].eval = stepHook() diff --git a/debugger/debug.lua b/debugger/debug.lua index 2afa093..b26b675 100644 --- a/debugger/debug.lua +++ b/debugger/debug.lua @@ -46,6 +46,18 @@ local function startClient() error(msg, -1) end + dbg.read = function(snapshot) + os.sleep(0) -- not sure why, but we need a sleep before :resume + -- directly resuming debugger routine to prevent + -- serialization of the snapshot + dbg.debugger:resume('debuggerX', dbg.debugger.uid, snapshot) + local e, cmd, param + repeat + e, cmd, param = os.pullEvent('debugger') + until e == 'debugger' + return cmd, param + end + -- breakpoint table is shared across processes dbg.breakpoints = breakpoints dbg.debugger = debugger @@ -106,8 +118,6 @@ local page = UI.Page { y = 1, ey = '50%', tabs = UI.Tabs { ey = -2, - unselectedBackgroundColor = 'black', - locals = UI.Tab { title = 'Locals', index = 1, @@ -361,11 +371,12 @@ local page = UI.Page { self:draw() end, - editFile = function(_, file) + editFile = function(self, file) if fs.exists(file) then + local line = self.source:getSelected().line multishell.openTab(_ENV, { path = 'sys/apps/shell.lua', - args = { 'edit ' .. file }, + args = { ('edit --line=%d %s'):format(line , file) }, focused = true, }) end @@ -424,8 +435,12 @@ local page = UI.Page { local t = event.selected.raw for k,v in pairs(t) do local depth = event.selected.depth or 0 - table.insert(event.selected.children, - { name = (' '):rep(depth + 2) .. k, value = tostring(v), raw = v, depth = depth + 2 }) + table.insert(event.selected.children, { + name = (' '):rep(depth + 2) .. tostring(k), + value = tostring(v), + raw = v, + depth = depth + 2 + }) end table.sort(event.selected.children, function(a, b) return a.name < b.name end) end @@ -468,6 +483,7 @@ Event.on('debuggerX', function(_, uid, data) for k,v in pairs(getfenv(data.info.func)) do table.insert(t, { name = k, value = tostring(v), raw = v }) end + table.sort(t, function(a, b) return a.name < b.name end) page.container.tabs.env.grid:setValues(t) page.container.tabs.env.grid.orig = Util.shallowCopy(t) diff --git a/debugger/etc/apps.db b/debugger/etc/apps.db new file mode 100644 index 0000000..7f8a171 --- /dev/null +++ b/debugger/etc/apps.db @@ -0,0 +1,7 @@ +{ + [ "1a03bd2fd107c453f3183e30b9716f82200671e8270fbbefbe602f5a48705527" ] = { + run = "fileui --exec=debug.lua --title=debug", + title = "Debug", + category = "Apps", + }, +} diff --git a/debugger/example.lua b/debugger/example.lua index 9c220d1..20ce2f8 100644 --- a/debugger/example.lua +++ b/debugger/example.lua @@ -1,3 +1,14 @@ +--[[ + -- a very simple debugger implementation + local dbg = require('debugger') + dbg.read = function(snapshot) + print(('%s: %d'):format(snapshot.info.source, snapshot.info.currentline)) + write('> ') + return read() + end + dbg.stopIn(debug.getinfo(1).func) +]] + local function m2(a) return a end @@ -43,7 +54,6 @@ local chunk = load([[ local j = chunk() print(j) -require('opus.util').print(coroutine) local co = coroutine.create(function(args) print('in coroutine') return 'hi'