diff --git a/ext/v8/v8_ref.cpp b/ext/v8/v8_ref.cpp index 47f783c..7880449 100644 --- a/ext/v8/v8_ref.cpp +++ b/ext/v8/v8_ref.cpp @@ -2,25 +2,38 @@ #include "stdio.h" using namespace v8; +v8_ref::v8_ref(Handle object, VALUE ref) : handle(Persistent::New(object)) { + references = rb_hash_new(); + this->add(ref); +} -v8_ref::v8_ref(Handle object, VALUE ref) : handle(Persistent::New(object)), references(ref) { - +void v8_ref::add(VALUE ref) { + if (ref != 0 && RTEST(ref)) { + rb_hash_aset(references, ref, Qtrue); + } } v8_ref::~v8_ref() { handle.Dispose(); } -void v8_ref_mark(v8_ref* ref) { - if (ref->references != 0) { +namespace { + //the v8_ref wraps a v8 handle so that ruby can hold a reference to it. + void gc_mark(v8_ref* ref) { rb_gc_mark(ref->references); } + + void gc_free(v8_ref* ref) { + delete ref; + } } -void v8_ref_free(v8_ref* ref) { - delete ref; +void rr_ref_addref(VALUE data, VALUE newref) { + v8_ref * ref = 0; + Data_Get_Struct(data, struct v8_ref, ref); + ref->add(newref); } VALUE V8_Ref_Create(VALUE ruby_class, v8::Handle handle, VALUE ref) { - return Data_Wrap_Struct(ruby_class, v8_ref_mark, v8_ref_free, new v8_ref(handle, ref)); + return Data_Wrap_Struct(ruby_class, gc_mark, gc_free, new v8_ref(handle, ref)); } diff --git a/ext/v8/v8_ref.h b/ext/v8/v8_ref.h index e4b3ae2..4277dcf 100644 --- a/ext/v8/v8_ref.h +++ b/ext/v8/v8_ref.h @@ -4,21 +4,17 @@ #include #include "ruby.h" -//the v8_ref wraps a v8 handle so that ruby can hold a reference to it. - struct v8_ref { //takes a handle object and adds a new persistent handle for //the referenced object v8_ref(v8::Handle object, VALUE ref = 0); virtual ~v8_ref(); + void add(VALUE ref); v8::Persistent handle; VALUE references; }; - -//memory management -void v8_ref_mark(v8_ref* ref); -void v8_ref_free(v8_ref* ref); +void rr_ref_addref(VALUE handle, VALUE newref); VALUE V8_Ref_Create(VALUE ruby_class, v8::Handle handle, VALUE ref = 0);