Skip to content

Instantly share code, notes, and snippets.

@umegaya
Last active August 29, 2015 14:08
Show Gist options
  • Save umegaya/ee19066830be14ab269a to your computer and use it in GitHub Desktop.
Save umegaya/ee19066830be14ab269a to your computer and use it in GitHub Desktop.
ffi reflect examples
> ffi = require 'ffi'
> a = ffi.new('uint32_t')
> a
>>
>> print(a)
stdin:3: '=' expected near 'print'
> print(a)
cdata<unsigned int>: 0x0004c850
> refl = require 'reflect'
> t = refl.typeof(a)
> print(t)
table: 0x00055810
> for k,v in pairs(t) do print(k,v) end
size 4
what int
unsigned true
typeid 10
alignment 4
> b = ffi.new('uint64_t')
> t2 = refl.typeof(b)
> for k,v in pairs(t2) do print(k,v) end
size 8
alignment 8
what int
unsigned true
typeid 12
long true
> ffi.cdef("enum hoge { foo, bar };")
> c = ffi.new('enum hoge', 1)
> t3 = refl.typeof(c)
> for k,v in pairs(t3) do print(k, v) end
size 4
type table: 0x000575d0
what enum
name hoge
typeid 115
alignment 4
> print(c)
cdata<enum hoge>: 1
> d = ffi.new('int[256]')
> t4 = refl.typeof(d)
> for k,v in pairs(t4) do print(k,v) end
size 1024
element_type table: 0x000586f0
what array
typeid 118
alignment 4
> print(ffi.sizeof(d))
1024
> for k,v in pairs(t4.element_type) do print(k,v) end
what int
size 4
typeid 9
alignment 4
> ffi.cdef("struct hoge { int a, b; };")
> e = ffi.new('struct hoge')
> t5 = refl.typeof(a)
> for k,v in pairs(t5) do print(k,v) end
size 8
what struct
name hoge
typeid 95
alignment 4
> ffi.cdef [[ typedef struct hoge { int fuga[3]; } hoge_t; ]]
stdin:1: attempt to redefine 'hoge'
stack traceback:
[C]: in function 'cdef'
stdin:1: in main chunk
[C]: at 0x0100000c10
> ffi.cdef [[ typedef struct foo { int bar[3]; } foo_t; ]]
> f = ffi.new('foo_t')
> t = refl.typeof(f)
> for k,v in pairs(t) do print(k,v) end
size 12
what struct
name foo
typeid 99
alignment 4
> ffi.cdef [[ void *malloc(size_t); ]]
> p = ffi.C.malloc(4)
> print(p)
cdata<void *>: 0x00400190
> t = refl.typeof(p)
> for k,v in pairs(t) do print(k,v) end
size 8
element_type table: 0x000a9258
what ptr
typeid 17
alignment 8
> for k,v in pairs(t.element_type) do print(k,v) end
what void
size none
typeid 1
alignment 1
> q = ffi.new('char[?]', 13)
> t2 = refl.typeof(q)
> for k,v in pairs(t2) do print(k,v) end
size none
element_type table: 0x000a47f8
what array
alignment 1
typeid 117
vla true
> for k,v in pairs(t2.element_type) do print(k,v) end
what int
size 1
typeid 5
alignment 1
> print(ffi.sizeof(q))
13
> print(ffi.sizeof(p))
8
> r = ffi.new('long[?]', 12)
> print(ffi.sizeof(r))
96
> p = ffi.cast('char*', p)
> t = refl.typeof(p)
> for k,v in pairs(t) do print(k,v) end
size 8
element_type table: 0x0008f0f8
what ptr
typeid 119
alignment 8
> for k,v in pairs(t.element_type) do print(k,v) end
what int
size 1
typeid 5
alignment 1
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment