# HG changeset patch # User sheepluva # Date 1402633591 -7200 # Node ID 201ea4989985b9d9e9ddc6acaf3855761419481a # Parent 1c6639b49afc668618dc1ea0a393866c49c8b75b state file name and line number in lua error messages diff -r 1c6639b49afc -r 201ea4989985 hedgewars/LuaPas.pas --- a/hedgewars/LuaPas.pas Fri Jun 13 02:31:30 2014 +0200 +++ b/hedgewars/LuaPas.pas Fri Jun 13 06:26:31 2014 +0200 @@ -522,17 +522,17 @@ type lua_Debug = packed record - event : LongInt; - name : PChar; (* (n) *) - namewhat : PChar; (* (n) `global', `local', `field', `method' *) - what : PChar; (* (S) `Lua', `C', `main', `tail' *) - source : PChar; (* (S) *) - currentline : LongInt; (* (l) *) - nups : LongInt; (* (u) number of upvalues *) - linedefined : LongInt; (* (S) *) + event : LUA_INTEGER_; + name : PChar; (* (n) *) + namewhat : PChar; (* (n) `global', `local', `field', `method' *) + what : PChar; (* (S) `Lua', `C', `main', `tail' *) + source : PChar; (* (S) *) + currentline : LUA_INTEGER_; (* (l) *) + nups : LUA_INTEGER_; (* (u) number of upvalues *) + linedefined : LUA_INTEGER_; (* (S) *) short_src : array [0..LUA_IDSIZE-1] of Char; (* (S) *) (* private part *) - i_ci : LongInt; (* active function *) + i_ci : LUA_INTEGER_; (* active function *) end; Plua_Debug = ^lua_Debug; diff -r 1c6639b49afc -r 201ea4989985 hedgewars/uScript.pas --- a/hedgewars/uScript.pas Fri Jun 13 02:31:30 2014 +0200 +++ b/hedgewars/uScript.pas Fri Jun 13 06:26:31 2014 +0200 @@ -105,9 +105,34 @@ procedure ScriptSetAmmo(ammo : TAmmoType; count, probability, delay, reinforcement: Byte); forward; procedure ScriptSetAmmoDelay(ammo : TAmmoType; delay: Byte); forward; -procedure LuaError(s: shortstring); +var LuaDebugInfo: lua_Debug; + +function LuaUpdateDebugInfo(): Boolean; begin - s:= 'Lua-script error: ' + s; + FillChar(LuaDebugInfo, sizeof(LuaDebugInfo), 0); + + if lua_getstack(luaState, 1, @LuaDebugInfo) = 0 then + exit(false); // stack not deep enough + + // get source name and line count + lua_getinfo(luaState, 'Sl', @LuaDebugInfo); + exit(true); +end; + +procedure LuaError(s: shortstring); +var src: shortstring; +const + maxsrclen = 20; +begin + if LuaUpdateDebugInfo() then + begin + src:= StrPas(LuaDebugInfo.source); + s:= 'LUA ERROR [ ... ' + + copy(src, Length(src) - maxsrclen, maxsrclen - 3) + ':' + + inttostr(LuaDebugInfo.currentLine) + ']: ' + s; + end + else + s:= 'LUA ERROR: ' + s; WriteLnToConsole(s); AddChatString(#5 + s); if cTestLua then @@ -116,7 +141,8 @@ procedure LuaCallError(error, call, paramsyntax: shortstring); begin - LuaError(call + ': ' + error + ' function syntax: ' + call + ' ( ' + paramsyntax + ' )'); + LuaError(call + ': ' + error); + LuaError('-- SYNTAX: ' + call + ' ( ' + paramsyntax + ' )'); end; procedure LuaParameterCountError(expected, call, paramsyntax: shortstring; wrongcount: LongInt); inline;