mirror of
https://github.com/ZDoom/raze-gles.git
synced 2024-12-24 10:40:46 +00:00
Lunatic: prefer to use ctype objects instead of C type strings.
Pass types via ffi.typeof() instead of declaring them in the global namespace when possible. git-svn-id: https://svn.eduke32.com/eduke32@3437 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
parent
9d7d58d678
commit
385095be76
6 changed files with 24 additions and 31 deletions
|
@ -1,4 +1,4 @@
|
|||
-- Implementation of a bound-checked array type factory for LuaJIT.
|
||||
-- Implementation of a bound-checked array type factory for LuaJIT 2.0 or later.
|
||||
--
|
||||
-- Usage example:
|
||||
--
|
||||
|
@ -36,7 +36,7 @@ function flatten_array(nelts, rng)
|
|||
return table.concat(strtab)
|
||||
end
|
||||
|
||||
-- ct = bcarray.new(basetype, numelts, showname [, typename] [, rng] [, mtadd])
|
||||
-- ctype = bcarray.new(basetype, numelts, showname [, typename] [, rng] [, mtadd])
|
||||
-- (optional fields may be nil)
|
||||
--
|
||||
-- <numelts>: Number of elements in array (small number)
|
||||
|
@ -44,7 +44,7 @@ end
|
|||
-- <typename>: If non-nil, the name under which the derived type is typedef'd
|
||||
-- <rng>: Random generator state + method :getu32(). If nil, then members are
|
||||
-- named _a1, _a2, ...
|
||||
-- <mtadd>: A table containing functions __index and/or __index. They are
|
||||
-- <mtadd>: A table containing functions __index and/or __newindex. They are
|
||||
-- called first and the bound-checking ones are tail-called then.
|
||||
function new(basetype, numelts, showname, typename, rng, mtadd)
|
||||
local eltptr_t = ffi.typeof("$ *", ffi.typeof(basetype))
|
||||
|
|
|
@ -16,11 +16,7 @@ local tostring = tostring
|
|||
module(...)
|
||||
|
||||
|
||||
ffi.cdef[[
|
||||
struct bitar { const double maxbidx, maxidx; const intptr_t arptr; }
|
||||
]]
|
||||
|
||||
local bitar_ct = ffi.typeof("struct bitar")
|
||||
local bitar_ct = ffi.typeof("struct { const double maxbidx, maxidx; const intptr_t arptr; }")
|
||||
local ptr_to_int = ffi.typeof("int32_t *")
|
||||
|
||||
local anchor = {}
|
||||
|
@ -216,7 +212,7 @@ local mt = {
|
|||
end,
|
||||
}
|
||||
|
||||
local bitar = ffi.metatype("struct bitar", mt)
|
||||
local bitar = ffi.metatype(bitar_ct, mt)
|
||||
|
||||
-- Create new bit array.
|
||||
function new(maxbidx, initval)
|
||||
|
|
|
@ -140,5 +140,8 @@ if (string.dump) then
|
|||
print(p-p) -- test set difference
|
||||
print(-p)
|
||||
--]]
|
||||
|
||||
-- Set difference of self with self is the same as set intersection of self
|
||||
-- with complement of self:
|
||||
assert(p-p == p*(-p))
|
||||
end
|
||||
|
|
|
@ -290,20 +290,12 @@ typedef struct
|
|||
]].. mangle_arrays(ACTOR_STRUCT) ..[[
|
||||
actor_t;
|
||||
|
||||
typedef struct
|
||||
]].. strip_const(ACTOR_STRUCT).. [[
|
||||
actor_u_t; // The _u_t versions are unrestricted variants for internal use.
|
||||
|
||||
typedef struct { int32_t _p; } weaponaccess_t;
|
||||
|
||||
typedef struct
|
||||
]].. mangle_arrays(DUKEPLAYER_STRUCT) ..[[
|
||||
DukePlayer_t;
|
||||
|
||||
typedef struct
|
||||
]].. strip_const(DUKEPLAYER_STRUCT) ..[[
|
||||
DukePlayer_u_t;
|
||||
|
||||
typedef struct {
|
||||
uint32_t bits; // 4b
|
||||
int16_t fvel, svel; // 4b
|
||||
|
@ -619,8 +611,9 @@ local function check_literal_am(am, typename)
|
|||
end
|
||||
end
|
||||
|
||||
local actor_ptr_ct = ffi.typeof("actor_u_t *") -- an unrestricted actor_t pointer
|
||||
local player_ptr_ct = ffi.typeof("DukePlayer_u_t *")
|
||||
-- An unrestricted actor_t pointer, for internal use:
|
||||
local actor_ptr_ct = ffi.typeof("$ *", ffi.typeof("struct"..strip_const(ACTOR_STRUCT)))
|
||||
local player_ptr_ct = ffi.typeof("$ *", ffi.typeof("struct"..strip_const(DUKEPLAYER_STRUCT)))
|
||||
local con_action_ct = ffi.typeof("con_action_t")
|
||||
local con_move_ct = ffi.typeof("con_move_t")
|
||||
local con_ai_ct = ffi.typeof("con_ai_t")
|
||||
|
|
|
@ -257,7 +257,7 @@ local ivec3_mt = {
|
|||
return ivec3_(v.x, v.y, v.z-zofs)
|
||||
end,
|
||||
}
|
||||
ivec3_ = ffi.metatype("vec3_t", ivec3_mt)
|
||||
ivec3_ = ffi.metatype(vec3_ct, ivec3_mt)
|
||||
|
||||
local xor = bit.bxor
|
||||
local wallsofsec -- fwd-decl
|
||||
|
|
|
@ -10,10 +10,9 @@ local error = error
|
|||
module(...)
|
||||
|
||||
|
||||
ffi.cdef[[
|
||||
typedef struct { double x, y; } dvec2_t;
|
||||
typedef struct { double x, y, z; } dvec3_t;
|
||||
]]
|
||||
local dvec2_t = ffi.typeof("struct { double x, y; }")
|
||||
local dvec3_t = ffi.typeof("struct { double x, y, z; }")
|
||||
|
||||
|
||||
local vec2_
|
||||
local vec2_mt = {
|
||||
|
@ -40,6 +39,8 @@ local vec2_mt = {
|
|||
end,
|
||||
|
||||
__eq = function(a,b)
|
||||
-- XXX: will error if <a> is not a ctype (can only happen if __eq was
|
||||
-- called by <b>)
|
||||
return (ffi.istype(a,b) and a.x==b.x and a.y==b.y)
|
||||
end,
|
||||
|
||||
|
@ -77,6 +78,7 @@ local vec3_mt = {
|
|||
end,
|
||||
|
||||
__eq = function(a,b)
|
||||
-- XXX: see vec2
|
||||
return (ffi.istype(a,b) and a.x==b.x and a.y==b.y and a.z==b.z)
|
||||
end,
|
||||
|
||||
|
@ -92,7 +94,7 @@ local vec3_mt = {
|
|||
-- VEC2 user data constructor.
|
||||
-- * vec2(<table>), <table> should be indexable with "x" and "y"
|
||||
-- * vec2(x, y), assuming that x and y are numbers
|
||||
vec2_ = ffi.metatype("dvec2_t", vec2_mt)
|
||||
vec2_ = ffi.metatype(dvec2_t, vec2_mt)
|
||||
vec2 = vec2_
|
||||
|
||||
-- Returns a vec2 from anything indexable with "x" and "y"
|
||||
|
@ -100,7 +102,7 @@ vec2 = vec2_
|
|||
function tovec2(t) return vec2(t.x, t.y) end
|
||||
|
||||
-- Same for vec3
|
||||
vec3_ = ffi.metatype("dvec3_t", vec3_mt)
|
||||
vec3_ = ffi.metatype(dvec3_t, vec3_mt)
|
||||
vec3 = vec3_
|
||||
function tovec3(t) return vec3(t.x, t.y, t.z) end
|
||||
|
||||
|
@ -108,11 +110,10 @@ function tovec3(t) return vec3(t.x, t.y, t.z) end
|
|||
-- integer values, e.g. geom.ivec3(x, y, z) is a reasonable way to round
|
||||
-- a vec3. It can be also used as the RHS to the vec2/vec3 arithmetic
|
||||
-- methods.
|
||||
ffi.cdef[[
|
||||
#pragma pack(push,1)
|
||||
typedef struct { int32_t x, y, z; } vec3_t;
|
||||
#pragma pack(pop)
|
||||
]]
|
||||
-- NOTE: We must have a typedef with that exact name, because for
|
||||
-- Lunatic (i.e. not stand-alone), it is a duplicate (and ignored)
|
||||
-- declaration for an already metatype'd type.
|
||||
ffi.cdef "typedef struct { int32_t x, y, z; } vec3_t;"
|
||||
ivec3 = ffi.typeof("vec3_t")
|
||||
|
||||
|
||||
|
|
Loading…
Reference in a new issue