From 541fca6dacba07e2cc555e177a5683e76cf45b4b Mon Sep 17 00:00:00 2001 From: helixhorned Date: Sun, 9 Dec 2012 13:24:28 +0000 Subject: [PATCH] Lunatic: gasping for some air. That is, fix some oversights introduced in the preceding runs. listglobals.sh is a helper to find global accesses. Translator: add "number-conversion" warning option, max. error limit. git-svn-id: https://svn.eduke32.com/eduke32@3256 1a8010ca-5511-0410-912e-c29ae57300e0 --- polymer/eduke32/source/lunatic/control.lua | 10 ++-- polymer/eduke32/source/lunatic/defs.ilua | 52 +++++++----------- polymer/eduke32/source/lunatic/listglobals.sh | 12 +++++ polymer/eduke32/source/lunatic/lunacon.lua | 54 ++++++++++++++----- 4 files changed, 79 insertions(+), 49 deletions(-) create mode 100755 polymer/eduke32/source/lunatic/listglobals.sh diff --git a/polymer/eduke32/source/lunatic/control.lua b/polymer/eduke32/source/lunatic/control.lua index 875644ad4..c465c7946 100644 --- a/polymer/eduke32/source/lunatic/control.lua +++ b/polymer/eduke32/source/lunatic/control.lua @@ -18,6 +18,8 @@ local cansee = defs_c.cansee local neartag = defs_c.neartag local inside = defs_c.inside +-- NOTE FOR RELEASE: the usually global stuff like "sprite" etc. ought to be +-- accessed as locals here module(...) @@ -148,6 +150,8 @@ end local function P_AddAmmo(ps, weap, amount) if (not have_ammo_at_max(ps, weap)) then + local curamount = ps:get_ammo_amount(weap) + local maxamount = ps:get_max_ammo_amount(weap) -- NOTE: no clamping towards the bottom ps:set_ammo_amount(weap, math.min(curamount+amount, maxamount)) end @@ -156,7 +160,7 @@ end local function P_AddWeaponAmmoCommon(ps, weap, amount) P_AddAmmo(ps, weap, amount) - if (ps.curr_weapon==KNEE_WEAPON and have_weapon(weap)) then + if (ps.curr_weapon==ffiC.KNEE_WEAPON and have_weapon(weap)) then ffiC.P_AddWeaponMaybeSwitch(ps, weap); end end @@ -281,11 +285,11 @@ end -- The return value is true iff the ammo was at the weapon's max. -- In that case, no action is taken. -function _addammo(ps, weapon, amount) +function _addammo(ps, weap, amount) return have_ammo_at_max(ps, weap) or P_AddWeaponAmmoCommon(ps, weap, amount) end -function _addweapon(ps, weapon, amount) +function _addweapon(ps, weap, amount) if (weap >= ffiC.MAX_WEAPONS+0ULL) then error("Invalid weapon ID "..weap, 2) end diff --git a/polymer/eduke32/source/lunatic/defs.ilua b/polymer/eduke32/source/lunatic/defs.ilua index 15f280fb7..efeaebfdb 100644 --- a/polymer/eduke32/source/lunatic/defs.ilua +++ b/polymer/eduke32/source/lunatic/defs.ilua @@ -1,8 +1,7 @@ -- INTERNAL -- definitions of BUILD and game types for the Lunatic Interpreter -_EDUKE32_LUNATIC = true - +local require = require local ffi = require("ffi") local ffiC = ffi.C @@ -10,7 +9,22 @@ local bit = bit local string = string local table = table local math = math + +local assert = assert +local error = error +local ipairs = ipairs +local loadstring = loadstring +local pairs = pairs +local rawget = rawget +local rawset = rawset +local setmetatable = setmetatable +local setfenv = setfenv +local tonumber = tonumber +local type = type + local print = print +local tostring = tostring + --== First, load the definitions common to the game's and editor's Lua interface. @@ -43,29 +57,13 @@ end -- load the common definitions! local defs_c = require("defs_common") +local cansee = defs_c.cansee local strip_const = defs_c.strip_const local setmtonce = defs_c.setmtonce ---=== EDuke32 game definitions ===--- --- array -> element flattening inside structs, --- e.g. int32_t a[4] --> int32_t _a0, _a1, _a2, _a3; -local function repeat_n_elts(type, namebase, num) - local strbuf = { "const "..type.." " } - - for i=1,num do - local str = namebase..tostring(i-1) - if (i < num) then - str = str.."," - end - strbuf[#strbuf+1] = str - end - strbuf[#strbuf+1] = ";" - - return table.concat(strbuf) -end - ---- game structs ---- ffi.cdef[[ enum dukeinv_t { @@ -449,17 +447,6 @@ int32_t kread(int32_t handle, void *buffer, int32_t leng); ]] -local assert = assert -local error = error -local ipairs = ipairs -local loadstring = loadstring -local pairs = pairs -local rawget = rawget -local rawset = rawset -local setmetatable = setmetatable -local setfenv = setfenv -local type = type - -- http://lua-users.org/wiki/SandBoxes says "potentially unsafe" -- as it allows to see implementations of functions. --local string_dump = string.dump @@ -614,7 +601,7 @@ local actor_mt = { local oa = a a = ffi.cast(actor_ptr_ct, a) - if (type(mov)=="string") then + if (type(ai)=="string") then ai = AI[ai]; end -- TODO: literal number AIs? @@ -634,7 +621,7 @@ local actor_mt = { has_ai = function(a, ai) a = ffi.cast(actor_ptr_ct, a) - if (type(mov)=="string") then + if (type(ai)=="string") then ai = AI[ai]; end if (ffi.istype(con_ai_ct, ai)) then @@ -957,7 +944,6 @@ G_._VERSION = _VERSION G_._G = G_ --- non-default data and functions -G_._EDUKE32_LUNATIC = _EDUKE32_LUNATIC G_.gameevent = gameevent -- included in lunatic.c G_.gameactor = gameactor -- included in lunatic.c G_.player = player -- from above diff --git a/polymer/eduke32/source/lunatic/listglobals.sh b/polymer/eduke32/source/lunatic/listglobals.sh new file mode 100755 index 000000000..605455654 --- /dev/null +++ b/polymer/eduke32/source/lunatic/listglobals.sh @@ -0,0 +1,12 @@ +#!/bin/sh + +if [ -z "$1" ]; then + # S or G can be used to display SETGLOBALs or GETGLOBALs, respectively + echo "Usage: $0 [S|G]" + exit 1; +fi + +# Strip LuaJIT specific syntax +sed -r -e "s/[0-9]+U?LL/0/g" "$1" | luac -p -l - | grep "$2ETGLOBAL" | + # mark where the new module environment starts + sed -e "s/; module/; module ____________________/" diff --git a/polymer/eduke32/source/lunatic/lunacon.lua b/polymer/eduke32/source/lunatic/lunacon.lua index 6875a0880..6e19bc142 100644 --- a/polymer/eduke32/source/lunatic/lunacon.lua +++ b/polymer/eduke32/source/lunatic/lunacon.lua @@ -1,13 +1,31 @@ -- LunaCON CON to Lunatic translator -- requires LPeg, http://www.inf.puc-rio.br/~roberto/lpeg/lpeg.html +local require = require local lpeg = require("lpeg") -if (not _EDUKE32_LUNATIC) then +local bit = require("bit") +local math = require("math") +local string = require("string") +local table = require("table") + +local arg = arg + +local assert = assert +local pairs = pairs +local pcall = pcall +local print = print +local tonumber = tonumber +local type = type + +if (string.dump) then require("strict") end +module(...) + + -- I think that the "too many pending calls/choices" is unavoidable in general. -- This limit is of course still arbitrary, but writing long if/else cascades -- in CON isn't pretty either (though sometimes necessary because nested switches @@ -48,11 +66,13 @@ local g_badids = {} -- maps bad id strings to 'true' local g_recurslevel = -1 -- 0: base CON file, >0 included local g_filename = "???" local g_directory = "" -- with trailing slash if not empty +local g_maxerrors = 20 local g_numerrors = 0 -- Warning options. Key names are the same as cmdline options, e.g. -- -Wno-bad-identifier for disabling the "bad identifier" warning. -local g_warn = { ["not-redefined"]=true, ["bad-identifier"]=true, } +local g_warn = { ["not-redefined"]=true, ["bad-identifier"]=true, + ["number-conversion"]=true, } -- How many 'if' statements are following immediately each other, -- needed to cope with CONs dangling-else resolution @@ -113,8 +133,17 @@ local function linecolstr(pos) return format("%d:%d", line, col) end +local function increment_numerrors() + g_numerrors = g_numerrors+1 + if (g_numerrors == g_maxerrors) then + g_numerrors = inf + printf("Too many errors (%d), aborting...", g_maxerrors) + end +end + local function perrprintf(pos, fmt, ...) printf("%s %s: error: "..fmt, g_filename, linecolstr(pos), ...) + increment_numerrors() end local function errprintf(fmt, ...) @@ -123,7 +152,7 @@ local function errprintf(fmt, ...) else printf("%s ???: error: "..fmt, g_filename, ...) end - g_numerrors = g_numerrors+1 + increment_numerrors() end local function pwarnprintf(pos, fmt, ...) @@ -145,7 +174,9 @@ local function parse_number(pos, numstr) perrprintf(pos, "number %s out of the range of a 32-bit integer", numstr) num = NaN elseif (num >= 0x80000000 and numstr:sub(1,2):lower()~="0x") then - pwarnprintf(pos, "number %s converted to a negative one", numstr) + if (g_warn["number-conversion"]) then + pwarnprintf(pos, "number %s converted to a negative one", numstr) + end num = num-(0xffffffff+1) end @@ -306,7 +337,7 @@ local function parse(contents) end -- fwd-decl local function do_include_file(dirname, filename) end local function cmd_include(filename) end -if (_EDUKE32_LUNATIC) then +if (not string.dump) then -- NOT IMPLEMENTED else function do_include_file(dirname, filename) @@ -1064,13 +1095,13 @@ local Cif = { ifcount = cmd(D) / ACS":get_count()==%1", ifactor = cmd(D) - / SPS".picnum==%d", + / SPS".picnum==%1", ifstrength = cmd(D) - / SPS".extra<=%d", + / SPS".extra<=%1", ifspawnedby = cmd(D) - / ACS".picnum==%d", + / ACS".picnum==%1", ifwasweapon = cmd(D) - / ACS".picnum==%d", + / ACS".picnum==%1", ifgapzl = cmd(D) -- factor into a con.* function? / format("_bit.arshift(%s-%s,8)<%%1", ACS".floorz", ACS".ceilingz"), iffloordistl = cmd(D) @@ -1158,7 +1189,6 @@ local Cif = { ----==== Tracing and reporting ====---- -local string = require("string") -- g_newlineidxs will contain the 1-based file offsets to "\n" characters local g_newlineidxs = {} @@ -1492,8 +1522,6 @@ local Grammar = Pat{ } -local math = require("math") - local function setup_newlineidxs(contents) local newlineidxs = {} for i in string.gmatch(contents, "()\n") do @@ -1637,7 +1665,7 @@ local function handle_cmdline_arg(str) end end -if (not _EDUKE32_LUNATIC) then +if (string.dump) then --- stand-alone local i = 1