| %module example |
| |
| %{ |
| #include "example.h" |
| %} |
| |
| /* Tell SWIG that create_animal creates a new object */ |
| %newobject Zoo::create_animal; |
| |
| /* Keep track of mappings between C/C++ structs/classes |
| and Ruby objects so we can implement a mark function. */ |
| %trackobjects; |
| |
| |
| /* Specify the mark function */ |
| %markfunc Zoo "mark_Zoo"; |
| |
| %include "example.h" |
| |
| %header %{ |
| static void mark_Zoo(void* ptr) { |
| Zoo* zoo = (Zoo*) ptr; |
| |
| /* Loop over each object and tell the garbage collector |
| that we are holding a reference to them. */ |
| int count = zoo->get_num_animals(); |
| |
| for(int i = 0; i < count; ++i) { |
| Animal* animal = zoo->get_animal(i); |
| VALUE object = SWIG_RubyInstanceFor(animal); |
| |
| if (object != Qnil) { |
| rb_gc_mark(object); |
| } |
| } |
| } |
| %} |