Alright, I have a hankering again to port Ruby FFI ;).
One question: should the port be written in pure Ruby, or should this be
a
C# library in the same vein as YAML (IronRuby.Libraries.Yaml)? I was
leaning towards the latter, where I would branch from
IronLanguages/Main,
adding a Libraries.FFI folder beside Libraries.Yaml.
It would be easier to write the core implementation as regular C#
library (i.e. not IronRuby.Libraries.*) and write the public API in Ruby
that would internally call to that library.
The Ruby file could call load_assembly ‘CoreFFI.dll’ and then use the
classes defined there.
This way you don’t even need to include the code to IronRuby main repo,
it could be a separate gem.
Alright, I have a hankering again to port Ruby FFI ;).
One question: should the port be written in pure Ruby, or should this be
a C# library in the same vein as YAML (IronRuby.Libraries.Yaml)? I was
leaning towards the latter, where I would branch from
IronLanguages/Main, adding a Libraries.FFI folder beside Libraries.Yaml.
Another idea… what about starting from ffi · GitHub and
replacing the C extension with C# code?
Not sure if it will work but it’s at least worth looking at. Or perhaps
you can also look at what JRuby is doing.
Alright, I have a hankering again to port Ruby FFI ;).
One question: should the port be written in pure Ruby, or should this be
a C# library in the same vein as YAML (IronRuby.Libraries.Yaml)? I was
leaning towards the latter, where I would branch from
IronLanguages/Main, adding a Libraries.FFI folder beside Libraries.Yaml.
Another idea what about starting from ffi · GitHub and replacing
the C extension with C# code?
That’s a great idea, Tomas. I’ll need some immediate gratification to
keep
me from getting discouraged; porting the C funcs piecemeal sounds like a
good way to get something working. I’ve forked
FFIhttps://github.com/cstrahan/iron-ffi- I’ll try to lay out a
foundation tonight.
Thats just a symbol lookup problem. All the traditional libc symbols
in msvcrt.dll have an underscore prepended, so that test should have a
special case for win32 in it.
My first goal is to fix any failing specs. Any help would be
appreciated.
Another idea what about starting fromhttp://github.com/ffiand replacing
the C extension with C# code?
That’s a great idea, Tomas. I’ll need some immediate gratification to keep
me from getting discouraged; porting the C funcspiecemeal sounds like a
good way to get something working. I’veforked FFI - I’ll try to lay out a
foundation tonight.
If you want some easy wins, The first classes you’ll want to implement
are:
FFI::Type - this is used by much of the rest of the system, e.g.
to identify arguments and struct field types. At a minimum, you need
to implement #size and #alignment, and have FFI::Type instances for 8,
16, 32, 64 bit signed/unsigned integers, float, double and pointer
defined as the constants FFI::Type::UINT8, FFI::Type::INT8, etc.
FFI::Pointer - instances of this are used to represent a native
pointer. To get things up and running, you can stub this out with
just the basic initialize() method. Most of the accessor methods can
be done later.
FFI::DynamicLibrary - kinda useful for loading libraries and
locating symbols within said library.
FFI::Function - the swiss army knife class for calling functions,
and creating C => ruby callbacks. Ignore the callback aspect of this
for now, and just get ruby => C calling working.
That will take you a little while, but you’ll be able to at least get
simple functions like ‘puts’ from libc callable from FFI.
All Ruby classes defined inside of ffi_c will be ported to Ruby,
where
I’ll call into my C# lib where it makes sense.
Because my poor brain can only handle so much context-switching,
I’ll
stub out all of the Ruby classes with methods that will simply raise
“not implemented”.
I’ll follow Wayne’s advice to get some simple clib funcs working.
Port the rest of ffi_c
When all is said and done, it looks like I shouldn’t need to touch a
single
line of FFI’s Ruby code - I should only need to implement classes (or
parts thereof) that are defined in ffi_c.
One thing I will need to figure later is the name of the dll that
contains
dlopen/dlsym/etc for each platform. I’m willing to be that I’ll be able
to
piece that together with decent accuracy by looking at
FFI.map_library_name.
That sounds like a good plan. Much of the CRuby version of FFI used
to be written in ruby, until people had the quaint notion that it
shouldn’t be as slow as it was, and I moved most of the implementation
into C.
dlopen and friends are usually in the libdl library on most unixen. I
can’t remember where the windows equivalents live.
This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.