[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: A question about table's length
- From: Mike Pall <mikelu-0912@...>
- Date: Thu, 31 Dec 2009 20:01:09 +0100
Mark Hamburg wrote:
> Side note to Mike Pall on that subject: You mentioned the
> possibility of teaching LuaJIT about a matrix userdata type so
> that it could optimize it. How hard is it to teach LuaJIT about
> specific userdata types?
This is dependent on the last work item on the status page: access
to structured binary data plus the FFI. Once this is in place, it
should be quite easy. You can just cut'n'paste your C struct
definitions and allocate userdata objects holding such a struct
(or a union, an array or a nested mix of them).
I haven't given much thought to the API yet, but it might look
something like this:
ffi.def[[
struct foo {
uint16_t bar, baz;
int i;
double d;
};
struct foo *foo_in(void);
void foo_out(struct foo *);
]]
local lib = ffi.bindlib("myfoolib")
local a = lib.foo_in()
local b = ffi.new("struct foo")
b.i = a.i + 10
b.bar = bit.bxor(a.bar, a.baz)
b.baz = 0x1234
b.d = a.d - 1.5
lib.foo_out(b)
-- Nice side-effect: efficient, mutable buffers for Lua.
local buf = ffi.new("uint8_t[?]", n)
for i=0,n-1 do
buf[i] = i
end
io.write(buf) -- Extended to understand binary data.
As you can see, this allows one to access C structs just like Lua
tables. Obviously these structs can be exchanged with the C side
via the FFI. All operations on these structures can be reduced by
the JIT compiler to essentially the same machine code a C compiler
would produce.
Objects allocated on the Lua side are special userdatas and
garbage collected as usual. Data passed in from the C side gets a
tiny userdata wrapper (which may be optimized away by the JIT
compiler). The userdata wrapper is GCed, but the data itself is
owned by the C side and needs manual lifetime management. You can
associate a __gc metamethod to signal the C side.
These special userdatas have no metatable by default, but redirect
index/newindex to internal accessor functions. You can augment
them with your own index/newindex or other metamethods to get
OO-like behavior.
This is just the basic infrastructure. Automatic C library wrappers
or higher-level bindings can be implemented on top of it in pure
Lua. This could even be extended to create (mostly) automatic and
highly-efficient C++ bindings, but this is notoriously difficult.
At least that's the plan ...
--Mike
- References:
- Re: A question about table's length, Klaus Ripke
- Re: A question about table's length, h visli
- Re: A question about table's length, Klaus Ripke
- Re: A question about table's length, h visli
- Re: A question about table's length, Klaus Ripke
- Re: A question about table's length, Vaughan McAlley
- Re: A question about table's length, David Manura
- Re: A question about table's length, steve donovan
- Re: A question about table's length, Florian Weimer
- Re: A question about table's length, Mark Hamburg