Mercurial > pub > dyncall > bindings
view lua/luadyncall/src/dynstruct.lua @ 46:c21d1c2c84e1
- removed pydc.py wrapper overhead (which only called pydcext.so functions, directly, anyways)
* implies renaming pydcext.* to pydc.*
* while at it, iterate directly over args that are passed in (before we did extract fptr, sig and a tuple for the args and iterated over latter afterwards); we might have a tiny perf improvement now
- added type stub as package_data
author | Tassilo Philipp |
---|---|
date | Fri, 13 Nov 2020 14:10:31 +0100 |
parents | 0cfcc391201f |
children |
line wrap: on
line source
require "ldynstruct" require "dyntype" dynstruct_metatable = { __index = function(s, f) local typeinfo = rawget(s, "typeinfo") local fieldinfo = typeinfo.fields[f] if not fieldinfo then error("unknown field "..f.." for type "..typeinfo.name) end return ldynstruct.dynpeek( rawget(s, "pointer"), fieldinfo.offset, fieldinfo.typeinfo.signature ) end, __newindex = function(s, f, v) local typeinfo = rawget(s, "typeinfo") local fieldinfo = typeinfo.fields[f] if not fieldinfo then error("unknown field "..f.." for type "..typeinfo.name) end ldynstruct.dynpoke( rawget(s, "pointer"), fieldinfo.offset, fieldinfo.typeinfo.signature, v ) end } function newdynstruct(typename) local typeinfo = gettypeinfo(typename) local object = { pointer = ldynstruct.newstruct( typeinfo.size ), typeinfo = typeinfo } setmetatable(object, dynstruct_metatable) return object end function dyncast(object, typeinfo) local pointer if type(object) == "userdata" then pointer = object elseif type(object) == "table" then pointer = rawgeti(object, "pointer") end local object = { pointer = pointer, typeinfo = gettypeinfo(typeinfo) } setmetatable(object, dynstruct_metatable) return object end