Subject:
[ruby-ffi] Re: cannot define function pointers that take function pointer arguments in jruby struct layout
From:
Wayne Meissner
Date:
9/17/09 10:13 PM
To:
ruby-ffi@googlegroups.com


2009/9/14 Aman Gupta <themastermind1@gmail.com>:
>
> I'm using ffi-swig-generator on:
>
> typedef void (*MyCallback) (void *data);
> typedef struct {
>  void (*member) (MyCallback cb);
> } MyStruct;
>
> which generates:
>
>  callback(:MyCallback, [ :pointer ], :void)
>  class MyStruct < FFI::Struct
>    layout(
>      :member, callback([ :MyCallback ], :void)
>    )
>  end

The root problem here is the resolution of :MyCallback - it will fail
on both JRuby and 1.9 (or at least it does for me).

The best way to ensure this works is to define a constant in enclosing
module, and use that on the layout line.

e.g.
module Foo
  extend FFI::Library
  MyCallback = callback(:MyCallback, [ :pointer ], :void
  class MyStruct < FFI::Struct
    layout(:member, callback(MyCallback, :void))
  end
end

Alternatively you can look it up using Foo.find_type(:MyCallback)

module Foo
  extend FFI::Library
  callback(:MyCallback, [ :pointer ], :void
  class MyStruct < FFI::Struct
    layout(:member, callback(Foo.find_type(:MyCallback), :void))
  end
end

ffi-swig-generator should be altered to do one of the above.

Struct#find_type tries to emulate this behaviour, and fails - ruby
does not appear to have anyway of getting the lexical enclosing module
of a subclass, when accessed from a method of the superclass.  If
anyone knows a way, I'd be interested.