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