mirror of
https://github.com/centau/vide.git
synced 2026-08-20 14:41:37 +00:00
Try improve error reporting
This commit is contained in:
parent
3b22f6ccf9
commit
58a31a1b32
16 changed files with 164 additions and 55 deletions
|
|
@ -1,4 +1,3 @@
|
|||
local throw = require "./throw"
|
||||
local flags = require "./flags"
|
||||
|
||||
export type SourceNode<T> = {
|
||||
|
|
@ -22,9 +21,23 @@ export type Node<T> = {
|
|||
|
||||
local scopes = { n = 0 } :: { [number]: Node<any>, n: number } -- scopes stack
|
||||
|
||||
local function efn(err: string)
|
||||
local trace = debug.traceback(err, 2)
|
||||
|
||||
if string.find(err, "^effect error stacktrace") then -- if effect error is nested
|
||||
trace = string.gsub(" " .. trace, "\n", function() -- indent entire error
|
||||
return "\n "
|
||||
end)
|
||||
end
|
||||
|
||||
trace ..= "\nsource update stacktrace:"
|
||||
return trace
|
||||
end
|
||||
|
||||
local function ycall<T, U>(fn: (T) -> U, arg: T): (boolean, string|U)
|
||||
|
||||
local thread = coroutine.create(xpcall)
|
||||
local function efn(err: string) return debug.traceback(err, 3) end
|
||||
--local function efn(err: string) return debug.traceback(err, 3) end
|
||||
local resume_ok, run_ok, result = coroutine.resume(thread, fn, efn, arg)
|
||||
|
||||
assert(resume_ok)
|
||||
|
|
@ -45,9 +58,9 @@ local function assert_stable_scope(): Node<unknown>
|
|||
|
||||
if not scope then
|
||||
local caller_name = debug.info(2, "n")
|
||||
return throw(`cannot use {caller_name}() outside a stable or reactive scope`)
|
||||
return error(`cannot use {caller_name}() outside a stable or reactive scope`, 0)
|
||||
elseif scope.effect then
|
||||
throw("cannot create a new reactive scope inside another reactive scope")
|
||||
error("cannot create a new reactive scope inside another reactive scope", 0)
|
||||
end
|
||||
|
||||
return scope
|
||||
|
|
@ -81,8 +94,8 @@ end
|
|||
local function flush_cleanups<T>(node: Node<T>)
|
||||
if node.cleanups then
|
||||
for _, fn in next, node.cleanups do
|
||||
local ok, err: string? = pcall(fn)
|
||||
if not ok then throw(`cleanup error: {err}`) end
|
||||
local ok, err: string? = xpcall(fn, debug.traceback)
|
||||
if not ok then error(`cleanup error: {err}`, 0) end
|
||||
end
|
||||
|
||||
table.clear(node.cleanups)
|
||||
|
|
@ -107,7 +120,7 @@ end
|
|||
|
||||
local function destroy<T>(node: Node<T>)
|
||||
if flags.strict and table.find(scopes, node) then
|
||||
throw("attempt to destroy an active scope")
|
||||
error("attempt to destroy an active scope", 0)
|
||||
end
|
||||
|
||||
flush_cleanups(node)
|
||||
|
|
@ -150,7 +163,7 @@ local function evaluate_node<T>(node: Node<T>)
|
|||
if not ok then
|
||||
table.clear(update_queue)
|
||||
update_queue.n = 0
|
||||
throw(`effect stacktrace:\n{new_value :: string}`)
|
||||
error(`effect error stacktrace\n{new_value :: string}`, 0)
|
||||
end
|
||||
|
||||
node.cache = new_value :: T
|
||||
|
|
@ -170,7 +183,7 @@ local function evaluate_node<T>(node: Node<T>)
|
|||
if not ok then
|
||||
table.clear(update_queue)
|
||||
update_queue.n = 0
|
||||
throw(`effect stacktrace:\n{new_value}\n`)
|
||||
error(`effect error:\n{new_value}\n`, 0)
|
||||
end
|
||||
|
||||
node.cache = new_value
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue