| %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); | |
| } | |
| } | |
| } | |
| %} |