From 6dcb5ff4a8e08f4ec79df00c14cbac52b96879b7 Mon Sep 17 00:00:00 2001 From: Niels Martin Hansen Date: Tue, 6 Feb 2007 12:30:17 +0000 Subject: [PATCH] Runtime errors in auto3 scripts no longer kill the program but are reported properly instead. Apparently Lua 5.1 has changed the semantics of table.insert so it's incompatible with the way used in all Auto3 demo scripts etc. Now it's overridden in utils.auto3 and all instances of it in sample scripts etc. replaced with code having the expected behaviour. Originally committed to SVN as r926. --- aegisub/auto4_auto3.cpp | 9 ++++++++- automation/demos/auto3/10-furigana.lua | 3 ++- automation/demos/auto3/4-text_extents.lua | 6 ++++-- automation/demos/auto3/6-simple-effect.lua | 6 ++++-- automation/demos/auto3/7-advanced-effect.lua | 19 ++++++++++++------- automation/include/karaskel-adv.auto3 | 10 +++++++--- automation/include/karaskel-base.auto3 | 7 ++++--- automation/include/utils.auto3 | 9 +++++++++ 8 files changed, 50 insertions(+), 19 deletions(-) diff --git a/aegisub/auto4_auto3.cpp b/aegisub/auto4_auto3.cpp index e0a4f738c..935567de0 100644 --- a/aegisub/auto4_auto3.cpp +++ b/aegisub/auto4_auto3.cpp @@ -962,7 +962,14 @@ continue_invalid_option: sink->SetTask(_T("Running script for processing")); sink->SetProgress(100.0f/3); - lua_call(L, 4, 1); + int ret = lua_pcall(L, 4, 1, 0); + if (ret) { + wxString emsg(lua_tostring(L, -1), wxConvUTF8); + emsg.Prepend(_T("The Automation 3 script produced an error:\n")); + emsg.Append(_T("\nThe subtitles have not been altered.")); + lua_pushstring(L, emsg.mb_str(wxConvUTF8)); + throw ret; + } sink->SetProgress(200.0f/3); sink->SetTask(_T("Reading back data from script")); diff --git a/automation/demos/auto3/10-furigana.lua b/automation/demos/auto3/10-furigana.lua index ab9562343..2de53e186 100644 --- a/automation/demos/auto3/10-furigana.lua +++ b/automation/demos/auto3/10-furigana.lua @@ -22,7 +22,8 @@ function do_syllable(meta, styles, config, line, syl) -- The result from this function can just be modified, and the line in the result table changes along (since it's just a reference) function result.add() local l = copy_line(line) - table.insert(result, l) + result.n = result.n + 1 + result[result.n] = l return l end -- Place the main text diff --git a/automation/demos/auto3/4-text_extents.lua b/automation/demos/auto3/4-text_extents.lua index 19de2d3bb..f751dd80b 100644 --- a/automation/demos/auto3/4-text_extents.lua +++ b/automation/demos/auto3/4-text_extents.lua @@ -16,7 +16,8 @@ function process_lines(meta, styles, lines, config) aegisub.report_progress(i/lines.n*100) -- Only process dialogue lines if lines[i].kind ~= "dialogue" then - table.insert(output, lines[i]) + output.n = output.n + 1 + output[output.n] = lines[i] else -- This is just for making the code a bit easier to read local line = lines[i] @@ -40,7 +41,8 @@ function process_lines(meta, styles, lines, config) -- Replace the text of the copy of the line with this syllable, moving around syllin.text = string.format("{\\an4\\move(%d,%d,%d,%d,%d,%d)\\kf%d\\kf%d}%s", curx, cury, curx, cury-exty, tstart, tend, tstart/10, syl.duration, syl.text) -- Add the line to the output - table.insert(output, syllin) + output.n = output.n + 1 + output[output.n] = syllin -- And prepare for next iteration curx = curx + extx tstart = tend diff --git a/automation/demos/auto3/6-simple-effect.lua b/automation/demos/auto3/6-simple-effect.lua index 422e2eba5..85ea87810 100644 --- a/automation/demos/auto3/6-simple-effect.lua +++ b/automation/demos/auto3/6-simple-effect.lua @@ -24,7 +24,8 @@ function process_lines(meta, styles, lines, config) aegisub.report_progress(i/lines.n*100) -- First check if the line is even a dialogue line. If it's not, no need to process it. if lines[i].kind ~= "dialogue" then - table.insert(output, lines[i]) + output.n = output.n + 1 + output[output.n] = lines[i] else -- This is a dialogue line, so process is -- Make a nicer name for the line we're processing @@ -55,7 +56,8 @@ function process_lines(meta, styles, lines, config) -- The entire line has been calculated -- Add it to the output - table.insert(output, newline) + output.n = output.n + 1 + output[output.n] = newline end end diff --git a/automation/demos/auto3/7-advanced-effect.lua b/automation/demos/auto3/7-advanced-effect.lua index ff9fad765..daf6364f2 100644 --- a/automation/demos/auto3/7-advanced-effect.lua +++ b/automation/demos/auto3/7-advanced-effect.lua @@ -33,7 +33,8 @@ function process_lines(meta, styles, lines, config) dokanji(lin, output, styles["op kanji"]) else -- Unknown lines are copied verbatim - table.insert(output, lin) + output.n = output.n + 1 + output[output.n] = lin end end return output @@ -110,7 +111,8 @@ function doromaji(lin, output, sty, linetop) enterlin.start_time = lin.start_time - 40 enterlin.end_time = lin.start_time enterlin.text = string.format("{\\move(%d,%d,%d,%d)\\fr%d\\t(\\fr0)\\an7}%s", startx, starty, shakex, shakey, -math.deg(enterangle), syl.text) - table.insert(output, enterlin) + output.n = output.n + 1 + output[output.n] = enterlin -- main highlight effect local newlin = copy_line(lin) local hilistart, hilimid, hiliend = syl.start_time*10, (syl.start_time+syl.duration/2)*10, (syl.start_time+syl.duration)*10 @@ -127,8 +129,9 @@ function doromaji(lin, output, sty, linetop) bord.layer = 0 bord.text = "{" .. bord.text newlin.text = "{\\bord0" .. newlin.text - table.insert(output, bord) - table.insert(output, newlin) + output.n = output.n + 2 + output[output.n-1] = bord + output[output.n] = newlin -- leave effect -- cut the line over in two, lower half "drops down", upper just fades away local tophalf = copy_line(lin) @@ -138,8 +141,9 @@ function doromaji(lin, output, sty, linetop) local bottomhalf = copy_line(tophalf) tophalf.text = string.format("{\\t(0,200,\\1c&H000080&)\\clip(0,0,640,%d)%s", linetop+syl.height/2, tophalf.text) bottomhalf.text = string.format("{\\org(%d,%d)\\clip(0,%d,640,480)\\t(0,200,\\1c&H000080&)\\t(200,1000,1.2,\\frx90\\clip(0,%d,640,480)%s", 320, linetop+syl.height, linetop+syl.height/2, linetop+syl.height, bottomhalf.text) - table.insert(output, tophalf) - table.insert(output, bottomhalf) + output.n = output.n + 2 + output[output.n-1] = tophalf + output[output.n] = bottomhalf end end end @@ -190,7 +194,8 @@ function dokanji(lin, output, sty) end newlin.text = string.format("{\\fn%s\\an7\\fr-90\\move(%d,%d,%d,%d)\\1a&H%2x&\\3a&H%2x&\\t(\\1a&H%2x&\\3a&H%2x&)}%s", fontname, 620, top, 620, top-syl.height, startalpha, startalpha, targetalpha, targetalpha, syls[i+j].text) top = top + syls[i+j].height - table.insert(output, newlin) + output.n = output.n + 1 + output[output.n] = newlin end end end diff --git a/automation/include/karaskel-adv.auto3 b/automation/include/karaskel-adv.auto3 index b26cf2fa5..fd40ed3a1 100644 --- a/automation/include/karaskel-adv.auto3 +++ b/automation/include/karaskel-adv.auto3 @@ -44,7 +44,7 @@ karaskel.engage_positioning = true -- The arguments here mean the same as in karaskel.lua, and all tables have the same members -- The return value is different now, though. -- It is required to be in the same format as the do_line function: --- A table with an "n" key, and keys 0..n-1 with line structures. +-- A table with an "n" key, and keys 1..n with line structures. function karaskel.do_syllable(meta, styles, config, line, syl) karaskel.trace("default_do_syllable") return {n=0} @@ -60,11 +60,15 @@ function karaskel.do_line(meta, styles, config, line) for i = 0, line.karaoke.n-1 do karaskel.trace("adv_do_line:2:"..i) local out = do_syllable(meta, styles, config, line, line.karaoke[i]) + karaskel.trace("adv_do_line:produced " .. out.n) for j = 1, out.n do - table.insert(result, out[j]) + karaskel.trace("adv_do_line:produced:" .. out[j].kind) + result.n = result.n + 1 + result[result.n] = out[j] end + karaskel.trace("adv_do_line:3:"..result.n) end - karaskel.trace("adv_do_line:3") + karaskel.trace("adv_do_line:4") return result end do_line = karaskel.do_line diff --git a/automation/include/karaskel-base.auto3 b/automation/include/karaskel-base.auto3 index 03a76e758..711f2996d 100644 --- a/automation/include/karaskel-base.auto3 +++ b/automation/include/karaskel-base.auto3 @@ -51,7 +51,7 @@ karaskel = { -- Set this to the name of the style used for out-of-line effect specifications, if any (read manual on this!) ool_fx_style = false, -- Show tracing messages? - engage_trace = false + engage_trace = true } function karaskel.warning(s) @@ -300,10 +300,11 @@ function karaskel.process_lines(meta, styles, lines, config) -- Get replacement lines lines[i].ool_fx = ool_fx repl = do_line(meta, styles, config, lines[i]) - karaskel.trace("skel_process_lines:4:"..i) + karaskel.trace("skel_process_lines:4:"..i..":"..repl.n) -- Append to result table for j = 1, repl.n do - table.insert(result, repl[j]) + result.n = result.n + 1 + result[result.n] = repl[j] end end end diff --git a/automation/include/utils.auto3 b/automation/include/utils.auto3 index ec4732ac9..25a8457ba 100644 --- a/automation/include/utils.auto3 +++ b/automation/include/utils.auto3 @@ -177,3 +177,12 @@ function xor(a, b) return false end end + + +-- Lua 5.1 breaks the table.insert function, here's a "fix" +table.org_insert = table.insert +function table.insert(tab, val) + aegisub.output_debug("Warning: this script uses the table.insert function which has changed behaviour in Lua 5.1. This might cause problems. Please update the script so it does not use this function, and instead replace it with code equivalent to the intended behaviour.") + tab.n = tab.n + 1 + tab[tab.n] = val +end