From ef63fac0c208ea4ce0acc96479417e6522e102e1 Mon Sep 17 00:00:00 2001
From: Charlie Savage
/usr/local/lib/ruby/site_ruby/1.6 /usr/
the zoo object, look up their Ruby object equivalent, and then call rb_gc_mark().
One possible implementation is:
%module example
%{
#include "example.h"
%}
/* 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 "Zoo_Mark";
%include "example.h"
%header %{
static void Zoo_Mark(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);
}
}
}
%}
+%module example
%{
#include "example.h"
%}
/* 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);
}
}
}
%}