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
This commit is contained in:
helixhorned 2012-12-09 13:24:28 +00:00
parent 2212e4e6f8
commit 541fca6dac
4 changed files with 79 additions and 49 deletions

View file

@ -18,6 +18,8 @@ local cansee = defs_c.cansee
local neartag = defs_c.neartag local neartag = defs_c.neartag
local inside = defs_c.inside local inside = defs_c.inside
-- NOTE FOR RELEASE: the usually global stuff like "sprite" etc. ought to be
-- accessed as locals here
module(...) module(...)
@ -148,6 +150,8 @@ end
local function P_AddAmmo(ps, weap, amount) local function P_AddAmmo(ps, weap, amount)
if (not have_ammo_at_max(ps, weap)) then 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 -- NOTE: no clamping towards the bottom
ps:set_ammo_amount(weap, math.min(curamount+amount, maxamount)) ps:set_ammo_amount(weap, math.min(curamount+amount, maxamount))
end end
@ -156,7 +160,7 @@ end
local function P_AddWeaponAmmoCommon(ps, weap, amount) local function P_AddWeaponAmmoCommon(ps, weap, amount)
P_AddAmmo(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); ffiC.P_AddWeaponMaybeSwitch(ps, weap);
end end
end end
@ -281,11 +285,11 @@ end
-- The return value is true iff the ammo was at the weapon's max. -- The return value is true iff the ammo was at the weapon's max.
-- In that case, no action is taken. -- 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) return have_ammo_at_max(ps, weap) or P_AddWeaponAmmoCommon(ps, weap, amount)
end end
function _addweapon(ps, weapon, amount) function _addweapon(ps, weap, amount)
if (weap >= ffiC.MAX_WEAPONS+0ULL) then if (weap >= ffiC.MAX_WEAPONS+0ULL) then
error("Invalid weapon ID "..weap, 2) error("Invalid weapon ID "..weap, 2)
end end

View file

@ -1,8 +1,7 @@
-- INTERNAL -- INTERNAL
-- definitions of BUILD and game types for the Lunatic Interpreter -- definitions of BUILD and game types for the Lunatic Interpreter
_EDUKE32_LUNATIC = true local require = require
local ffi = require("ffi") local ffi = require("ffi")
local ffiC = ffi.C local ffiC = ffi.C
@ -10,7 +9,22 @@ local bit = bit
local string = string local string = string
local table = table local table = table
local math = math 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 print = print
local tostring = tostring
--== First, load the definitions common to the game's and editor's Lua interface. --== First, load the definitions common to the game's and editor's Lua interface.
@ -43,29 +57,13 @@ end
-- load the common definitions! -- load the common definitions!
local defs_c = require("defs_common") local defs_c = require("defs_common")
local cansee = defs_c.cansee
local strip_const = defs_c.strip_const local strip_const = defs_c.strip_const
local setmtonce = defs_c.setmtonce local setmtonce = defs_c.setmtonce
---=== EDuke32 game definitions ===--- ---=== 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 ---- ---- game structs ----
ffi.cdef[[ ffi.cdef[[
enum dukeinv_t { 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" -- http://lua-users.org/wiki/SandBoxes says "potentially unsafe"
-- as it allows to see implementations of functions. -- as it allows to see implementations of functions.
--local string_dump = string.dump --local string_dump = string.dump
@ -614,7 +601,7 @@ local actor_mt = {
local oa = a local oa = a
a = ffi.cast(actor_ptr_ct, a) a = ffi.cast(actor_ptr_ct, a)
if (type(mov)=="string") then if (type(ai)=="string") then
ai = AI[ai]; ai = AI[ai];
end end
-- TODO: literal number AIs? -- TODO: literal number AIs?
@ -634,7 +621,7 @@ local actor_mt = {
has_ai = function(a, ai) has_ai = function(a, ai)
a = ffi.cast(actor_ptr_ct, a) a = ffi.cast(actor_ptr_ct, a)
if (type(mov)=="string") then if (type(ai)=="string") then
ai = AI[ai]; ai = AI[ai];
end end
if (ffi.istype(con_ai_ct, ai)) then if (ffi.istype(con_ai_ct, ai)) then
@ -957,7 +944,6 @@ G_._VERSION = _VERSION
G_._G = G_ G_._G = G_
--- non-default data and functions --- non-default data and functions
G_._EDUKE32_LUNATIC = _EDUKE32_LUNATIC
G_.gameevent = gameevent -- included in lunatic.c G_.gameevent = gameevent -- included in lunatic.c
G_.gameactor = gameactor -- included in lunatic.c G_.gameactor = gameactor -- included in lunatic.c
G_.player = player -- from above G_.player = player -- from above

View file

@ -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 <file.lua> [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 ____________________/"

View file

@ -1,13 +1,31 @@
-- LunaCON CON to Lunatic translator -- LunaCON CON to Lunatic translator
-- requires LPeg, http://www.inf.puc-rio.br/~roberto/lpeg/lpeg.html -- requires LPeg, http://www.inf.puc-rio.br/~roberto/lpeg/lpeg.html
local require = require
local lpeg = require("lpeg") 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") require("strict")
end end
module(...)
-- I think that the "too many pending calls/choices" is unavoidable in general. -- 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 -- 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 -- 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_recurslevel = -1 -- 0: base CON file, >0 included
local g_filename = "???" local g_filename = "???"
local g_directory = "" -- with trailing slash if not empty local g_directory = "" -- with trailing slash if not empty
local g_maxerrors = 20
local g_numerrors = 0 local g_numerrors = 0
-- Warning options. Key names are the same as cmdline options, e.g. -- Warning options. Key names are the same as cmdline options, e.g.
-- -Wno-bad-identifier for disabling the "bad identifier" warning. -- -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, -- How many 'if' statements are following immediately each other,
-- needed to cope with CONs dangling-else resolution -- needed to cope with CONs dangling-else resolution
@ -113,8 +133,17 @@ local function linecolstr(pos)
return format("%d:%d", line, col) return format("%d:%d", line, col)
end 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, ...) local function perrprintf(pos, fmt, ...)
printf("%s %s: error: "..fmt, g_filename, linecolstr(pos), ...) printf("%s %s: error: "..fmt, g_filename, linecolstr(pos), ...)
increment_numerrors()
end end
local function errprintf(fmt, ...) local function errprintf(fmt, ...)
@ -123,7 +152,7 @@ local function errprintf(fmt, ...)
else else
printf("%s ???: error: "..fmt, g_filename, ...) printf("%s ???: error: "..fmt, g_filename, ...)
end end
g_numerrors = g_numerrors+1 increment_numerrors()
end end
local function pwarnprintf(pos, fmt, ...) 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) perrprintf(pos, "number %s out of the range of a 32-bit integer", numstr)
num = NaN num = NaN
elseif (num >= 0x80000000 and numstr:sub(1,2):lower()~="0x") then elseif (num >= 0x80000000 and numstr:sub(1,2):lower()~="0x") then
if (g_warn["number-conversion"]) then
pwarnprintf(pos, "number %s converted to a negative one", numstr) pwarnprintf(pos, "number %s converted to a negative one", numstr)
end
num = num-(0xffffffff+1) num = num-(0xffffffff+1)
end end
@ -306,7 +337,7 @@ local function parse(contents) end -- fwd-decl
local function do_include_file(dirname, filename) end local function do_include_file(dirname, filename) end
local function cmd_include(filename) end local function cmd_include(filename) end
if (_EDUKE32_LUNATIC) then if (not string.dump) then
-- NOT IMPLEMENTED -- NOT IMPLEMENTED
else else
function do_include_file(dirname, filename) function do_include_file(dirname, filename)
@ -1064,13 +1095,13 @@ local Cif = {
ifcount = cmd(D) ifcount = cmd(D)
/ ACS":get_count()==%1", / ACS":get_count()==%1",
ifactor = cmd(D) ifactor = cmd(D)
/ SPS".picnum==%d", / SPS".picnum==%1",
ifstrength = cmd(D) ifstrength = cmd(D)
/ SPS".extra<=%d", / SPS".extra<=%1",
ifspawnedby = cmd(D) ifspawnedby = cmd(D)
/ ACS".picnum==%d", / ACS".picnum==%1",
ifwasweapon = cmd(D) ifwasweapon = cmd(D)
/ ACS".picnum==%d", / ACS".picnum==%1",
ifgapzl = cmd(D) -- factor into a con.* function? ifgapzl = cmd(D) -- factor into a con.* function?
/ format("_bit.arshift(%s-%s,8)<%%1", ACS".floorz", ACS".ceilingz"), / format("_bit.arshift(%s-%s,8)<%%1", ACS".floorz", ACS".ceilingz"),
iffloordistl = cmd(D) iffloordistl = cmd(D)
@ -1158,7 +1189,6 @@ local Cif = {
----==== Tracing and reporting ====---- ----==== Tracing and reporting ====----
local string = require("string")
-- g_newlineidxs will contain the 1-based file offsets to "\n" characters -- g_newlineidxs will contain the 1-based file offsets to "\n" characters
local g_newlineidxs = {} local g_newlineidxs = {}
@ -1492,8 +1522,6 @@ local Grammar = Pat{
} }
local math = require("math")
local function setup_newlineidxs(contents) local function setup_newlineidxs(contents)
local newlineidxs = {} local newlineidxs = {}
for i in string.gmatch(contents, "()\n") do for i in string.gmatch(contents, "()\n") do
@ -1637,7 +1665,7 @@ local function handle_cmdline_arg(str)
end end
end end
if (not _EDUKE32_LUNATIC) then if (string.dump) then
--- stand-alone --- stand-alone
local i = 1 local i = 1