[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: FFI metamethods on C struct pointer
- From: Javier Guerra Giraldez <javier@...>
- Date: Sat, 11 Jun 2011 11:04:07 -0500
On Sat, Jun 11, 2011 at 10:49 AM, Javier Guerra Giraldez
<javier@guerrag.com> wrote:
> for example, this works perfectly:
>
>
> local ffi = require "ffi"
>
> ffi.cdef [[
> typedef struct bstr {
> size_t len;
> const char *str;
> } bstr;
> ]]
>
> bstr_t = ffi.typeof ('bstr')
>
> ffi.metatype (bstr_t, {
> __tostring = function (b)
> return ffi.string (b.str, b.len)
> end,
> })
>
> local b = bstr_t(3, 'hi!')
> print (type (b), b)
>
> ===> cdata hi!
ah, but this doesn't:
local ffi = require "ffi"
ffi.cdef [[
struct _IO_FILE;
typedef struct _IO_FILE FILE;
FILE *fopen (__const char *__restrict __filename,
__const char *__restrict __modes);
]]
local file_t = ffi.typeof ('FILE')
ffi.metatype (file_t, {
__tostring = function (f)
return "it's a FILE"
end,
})
local f = ffi.C.fopen ('txt', 'r')
print (type(f), f)
===> cdata cdata<struct _IO_FILE *>: 0x40353b68
it never calls my __tostring() metamethod. it seems that it's because
the cdata contains a FILE*, and not a FILE. but i can't do:
ffi.metatype ('FILE *')
nor:
local file_tp = ffi.typeof ('FILE *')
ffi.metatype (file_tp, {.....})
--
Javier