Re: [MacRuby-devel] How to use custom C struct's?

2009-08-05 Thread Jeremy Voorhis
When MacRuby's FFI support is more mature, declaring an FFI::Struct subclass
like this will be another option.
  class MapPoint  FFI::Struct
layout :row, :int, :col, :Int
  end

You instantiate an FFI::Struct with a pointer. I'm hacking away on a Ruby
interface to a C library, and I'm slinging around pointers, structs and
unions with ease on MRI 1.8.6, 1.9.1 and JRuby.

Best,

Jeremy

On Wed, Aug 5, 2009 at 8:41 AM, Eloy Duran eloy.de.en...@gmail.com wrote:

 Hi,

 On Aug 5, 2009, at 5:31 PM, Clay Bridges wrote:

 The google didn't yield much guidance on this. Before I started a
 deep-dive on the MacRuby source, and/or the standard ruby way to
 handle this sort of thing, I thought I would ask a couple of
 questions:

 1) Any easy advice?


 Yes, use RubyCocoa

  2) Is this different in MacRuby than in ruby proper?


 RubyCocoa at least allows you to use BridgeSupport which would allow you to
 map these. Afaik MacRuby doesn't fully support it yet.

  3) Any pointers into the MacRuby source that might help me?


 BridgeSupport needs to fully implemented.

 Keep in mind, MacRuby is not stable yet.

 HTH,
 Eloy

 ___
 MacRuby-devel mailing list
 MacRuby-devel@lists.macosforge.org
 http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel

___
MacRuby-devel mailing list
MacRuby-devel@lists.macosforge.org
http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel


Re: [MacRuby-devel] How to use custom C struct's?

2009-08-05 Thread Clay Bridges
 Yes, use RubyCocoa

I'm afraid I'm already hooked. ;)

If it comes down to it, I've already put a testing-only category wrapper
around one method, e.g.

#import Cell.h

@interface Cell (TestUtil)

@property (readonly) NSArray* mapPointAsArray;

@end

@implementation Cell (TestUtil)

@dynamic mapPointAsArray;

// this method is simply for ruby-side testing
- (NSArray*) mapPointAsArray {
NSMutableArray* nsma = [[NSMutableArray alloc] initWithCapacity:2];
[nsma addObject:[NSNumber numberWithInt:mapPoint.row]];
[nsma addObject:[NSNumber numberWithInt:mapPoint.col]];
return [nsma autorelease];
}

@end

Not too much work to do it for the others. Of course, one could argue what
I'm really testing here, but the craftsman in me says it's OK.

Clay
___
MacRuby-devel mailing list
MacRuby-devel@lists.macosforge.org
http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel


Re: [MacRuby-devel] How to use custom C struct's?

2009-08-05 Thread Laurent Sansonetti


On Aug 5, 2009, at 8:41 AM, Eloy Duran wrote:


Hi,

On Aug 5, 2009, at 5:31 PM, Clay Bridges wrote:

The google didn't yield much guidance on this. Before I started a
deep-dive on the MacRuby source, and/or the standard ruby way to
handle this sort of thing, I thought I would ask a couple of
questions:

1) Any easy advice?


Yes, use RubyCocoa


2) Is this different in MacRuby than in ruby proper?


RubyCocoa at least allows you to use BridgeSupport which would allow  
you to map these. Afaik MacRuby doesn't fully support it yet.



3) Any pointers into the MacRuby source that might help me?


BridgeSupport needs to fully implemented.


FYI, BridgeSupport is mostly implemented in MacRuby, at least the part  
that deals with C structures. The only part that we didn't implement  
yet is C function pointers, the rest (roughly 90%) is done, and it is  
faster / more stable than the RubyCocoa code (you will have to believe  
me, since I wrote both :-)).


What Clay needs to do is describe his C structures in a .bridgesupport  
file.


You can read the BridgeSupport(5) man-page for more information.  
Unfortunately the gen_bridge_metadata(1) cannot generate C structures  
metadata without a template, and this part is not yet documented. So  
it may be faster to craft the .bridgesupport file by hand. There are  
plenty of .bridgesupport files in /System/Library/Frameworks that can  
be used as an example.


Once the file is created, it can loaded from MacRuby using:

  load_bridge_support_file 'foo.bridgesupport'

Laurent
___
MacRuby-devel mailing list
MacRuby-devel@lists.macosforge.org
http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel


Re: [MacRuby-devel] How to use custom C struct's?

2009-08-05 Thread Jordan K. Hubbard


On Aug 5, 2009, at 1:09 PM, Laurent Sansonetti wrote:


Here is an example on how to do this automatically. [ SNIP ]


Gee, if this were to go up on, say, the wiki for bridgesupport, this  
sort of explicit advice could help future generations too!


Oh what the heck, done.   http://bridgesupport.macosforge.org/trac/wiki/Documentation 
 contains a small tutorial based on your example.  Feel free to edit  
more to taste. :)


- Jordan


___
MacRuby-devel mailing list
MacRuby-devel@lists.macosforge.org
http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel


Re: [MacRuby-devel] How to use custom C struct's?

2009-08-05 Thread Clay Bridges
Thank you, Laurent. That was *incredibly* helpful and kind of you, and
worked perfectly. Being able to add MapPoint#to_a and MapPoint[row,col]
methods was the oh, ruby, you *are* magic moment of it all.

I was going to try to pay it back by putting it up on a wiki, but Jordan
beat me to it. I LOL'd when I saw my lowly MapPoint had made it to the big
time. You go, struct!

Seriously, gang, as a first contact with the MacRuby community, I couldn't
be more impressed.

Thanks,

Clay
___
MacRuby-devel mailing list
MacRuby-devel@lists.macosforge.org
http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel