Last active
August 29, 2015 14:08
-
-
Save umegaya/ee19066830be14ab269a to your computer and use it in GitHub Desktop.
ffi reflect examples
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
> 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