summaryrefslogtreecommitdiff
path: root/tex/context/base/mkiv/trac-deb.lua
diff options
context:
space:
mode:
Diffstat (limited to 'tex/context/base/mkiv/trac-deb.lua')
-rw-r--r--tex/context/base/mkiv/trac-deb.lua97
1 files changed, 62 insertions, 35 deletions
diff --git a/tex/context/base/mkiv/trac-deb.lua b/tex/context/base/mkiv/trac-deb.lua
index 95f3052fe..9788e72a0 100644
--- a/tex/context/base/mkiv/trac-deb.lua
+++ b/tex/context/base/mkiv/trac-deb.lua
@@ -31,6 +31,7 @@ local strings = tracers.strings
local texgetdimen = tex.getdimen
local texgettoks = tex.gettoks
local texgetcount = tex.getcount
+local texgethelp = tex.gethelptext or function() end
local implement = interfaces.implement
@@ -183,7 +184,7 @@ local function processerror(offset)
local linenumber = tonumber(status.linenumber) or 0
local lastcontext = status.lasterrorcontext
local lasttexerror = status.lasterrorstring or "?"
- local lastluaerror = status.lastluaerrorstring or lasttexerror
+ local lastluaerror = status.lastluaerrorstring or "?" -- lasttexerror
local luaerrorline = match(lastluaerror,[[lua%]?:.-(%d+)]]) or (lastluaerror and find(lastluaerror,"?:0:",1,true) and 0)
local lastmpserror = match(lasttexerror,[[^.-mp%serror:%s*(.*)$]])
resetmessages()
@@ -194,58 +195,83 @@ local function processerror(offset)
offset = tonumber(offset) or 10,
lasttexerror = lasttexerror,
lastmpserror = lastmpserror,
- lastluaerror = lastluaerror,
+ lastluaerror = lastluaerror, -- can be the same as lasttexerror
luaerrorline = luaerrorline,
lastcontext = lastcontext,
+ lasttexhelp = texgethelp(),
}
end
-- so one can overload the printer if (really) needed
+local quitonerror = true
+
+directives.register("system.quitonerror",function(v) quitonerror = toboolean(v) end)
+
+local busy = false
+
function tracers.printerror(specification)
- local filename = specification.filename
- local linenumber = specification.linenumber
- local lasttexerror = specification.lasttexerror
- local lastmpserror = specification.lastmpserror
- local lastluaerror = specification.lastluaerror
- local lastcontext = specification.lasterrorcontext
- local luaerrorline = specification.luaerrorline
- local errortype = specification.errortype
- local offset = specification.offset
- local report = errorreporter(luaerrorline)
- if not filename then
- report("error not related to input file: %s ...",lasttexerror)
- elseif type(filename) == "number" then
- report("error on line %s of filehandle %s: %s ...",linenumber,lasttexerror)
- else
- report_nl()
- if luaerrorline then
- if linenumber == 0 or not filename or filename == "" then
- print("\nfatal lua error:\n\n",lastluaerror,"\n")
- os.exit(1)
- return
+ if not busy then
+ busy = true
+ local filename = specification.filename
+ local linenumber = specification.linenumber
+ local lasttexerror = specification.lasttexerror
+ local lastmpserror = specification.lastmpserror
+ local lastluaerror = specification.lastluaerror
+ local lastcontext = specification.lasterrorcontext
+ local luaerrorline = specification.luaerrorline
+ local errortype = specification.errortype
+ local offset = specification.offset
+ local report = errorreporter(luaerrorline)
+ if not filename then
+ report("error not related to input file: %s ...",lasttexerror)
+ elseif type(filename) == "number" then
+ report("error on line %s of filehandle %s: %s ...",linenumber,lasttexerror)
+ else
+ report_nl()
+ if luaerrorline then
+ if linenumber == 0 or not filename or filename == "" then
+ print("\nfatal lua error:\n\n",lastluaerror,"\n")
+ luatex.abort()
+ return
+ else
+ report("lua error on line %s in file %s:\n\n%s",linenumber,filename,lastluaerror)
+ end
+ elseif lastmpserror then
+ report("mp error on line %s in file %s:\n\n%s",linenumber,filename,lastmpserror)
else
- report("lua error on line %s in file %s:\n\n%s",linenumber,filename,lastluaerror)
+ report("tex error on line %s in file %s: %s",linenumber,filename,lasttexerror)
+ if lastcontext then
+ report_nl()
+ report_str(lastcontext)
+ report_nl()
+ elseif tex.show_context then
+ report_nl()
+ tex.show_context()
+ end
end
- elseif lastmpserror then
- report("mp error on line %s in file %s:\n\n%s",linenumber,filename,lastmpserror)
- else
- report("tex error on line %s in file %s: %s",linenumber,filename,lasttexerror)
- if lastcontext then
+ report_nl()
+ report_str(tracers.showlines(filename,linenumber,offset,tonumber(luaerrorline)))
+ report_nl()
+ end
+ local errname = file.addsuffix(tex.jobname .. "-error","log")
+ if quitonerror then
+ table.save(errname,specification)
+ local help = specification.lasttexhelp
+ if help and #help > 0 then
report_nl()
- report_str(lastcontext)
+ report_str(help)
report_nl()
- elseif tex.show_context then
report_nl()
- tex.show_context()
end
+ luatex.abort()
end
- report_nl()
- report_str(tracers.showlines(filename,linenumber,offset,tonumber(luaerrorline)))
- report_nl()
+ busy = false
end
end
+luatex.wrapup(function() os.remove(file.addsuffix(tex.jobname .. "-error","log")) end)
+
local function processwarning(offset)
-- local inputstack = resolvers.inputstack
-- local filename = inputstack[#inputstack] or status.filename
@@ -324,6 +350,7 @@ function lmx.showerror(lmxname)
else
lmx.show(lmxname or 'context-error.lmx',variables)
end
+ luatex.abort()
end
function lmx.overloaderror()