diff options
Diffstat (limited to 'Examples/ruby/mark_function/example.i')
-rw-r--r-- | Examples/ruby/mark_function/example.i | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/Examples/ruby/mark_function/example.i b/Examples/ruby/mark_function/example.i new file mode 100644 index 0000000..6380fa0 --- /dev/null +++ b/Examples/ruby/mark_function/example.i @@ -0,0 +1,37 @@ +%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); + } + } + } +%} |