From 72e7924bf1ab61d930fd711ab85ff8fa0d6478b6 Mon Sep 17 00:00:00 2001 From: Charles Lowell Date: Mon, 2 May 2011 21:54:03 -0500 Subject: [PATCH] make v8_handle explicitly track weak reference callback. --- ext/v8/v8_handle.cpp | 38 +++++++++++++------------------------- ext/v8/v8_handle.h | 9 ++------- 2 files changed, 15 insertions(+), 32 deletions(-) diff --git a/ext/v8/v8_handle.cpp b/ext/v8/v8_handle.cpp index e2c9483..e8aa9ef 100644 --- a/ext/v8/v8_handle.cpp +++ b/ext/v8/v8_handle.cpp @@ -5,7 +5,8 @@ using namespace v8; v8_handle::v8_handle(Handle handle) : handle(Persistent::New(handle)) { - this->references = rb_hash_new(); + this->weakref_callback = Qnil; + this->weakref_callback_parameters = Qnil; this->dead = false; } @@ -15,20 +16,13 @@ v8_handle::~v8_handle() { dead = true; } -void v8_handle::set_internal(const char* name, VALUE value) { - rb_hash_aset(this->references, rb_str_new2(name), value); -} - -VALUE v8_handle::get_internal(const char* name) { - return rb_funcall(this->references, rb_intern("[]"), 1, rb_str_new2(name)); -} - namespace { - void gc_mark(v8_handle* handle) { - rb_gc_mark(handle->references); + void v8_handle_mark(v8_handle* handle) { + rb_gc_mark(handle->weakref_callback); + rb_gc_mark(handle->weakref_callback_parameters); } - void gc_free(v8_handle* handle) { + void v8_handle_free(v8_handle* handle) { delete handle; } @@ -58,8 +52,8 @@ namespace { void RubyWeakReferenceCallback(Persistent value, void* parameter) { VALUE self = (VALUE)parameter; v8_handle* handle = rr_v8_handle_raw(self); - VALUE callback = rr_v8_handle_get_internal(self, "weakref_callback"); - VALUE parameters = rr_v8_handle_get_internal(self, "weakref_callback_parameters"); + VALUE callback = handle->weakref_callback; + VALUE parameters = handle->weakref_callback_parameters; if (RTEST(callback)) { rb_funcall(callback, rb_intern("call"), 2, self, parameters); } @@ -71,8 +65,9 @@ namespace { } VALUE MakeWeak(VALUE self, VALUE parameters, VALUE callback) { - rr_v8_handle_set_internal(self,"weakref_callback", callback); - rr_v8_handle_set_internal(self, "weakref_callback_parameters", parameters); + v8_handle* handle = rr_v8_handle_raw(self); + handle->weakref_callback = callback; + handle->weakref_callback_parameters = parameters; rr_v8_handle(self).MakeWeak((void*)self, RubyWeakReferenceCallback); return Qnil; } @@ -109,21 +104,14 @@ void rr_init_handle() { } VALUE rr_v8_handle_new(VALUE klass, v8::Handle handle) { - return Data_Wrap_Struct(klass, gc_mark, gc_free, new v8_handle(handle)); + v8_handle* new_handle = new v8_handle(handle); + return Data_Wrap_Struct(klass, v8_handle_mark, v8_handle_free, new_handle); } VALUE rr_v8_handle_class() { return rr_define_class("Handle"); } -void rr_v8_handle_set_internal(VALUE handle, const char* name, VALUE value) { - rr_v8_handle_raw(handle)->set_internal(name, value); -} - -VALUE rr_v8_handle_get_internal(VALUE handle, const char* name) { - return rr_v8_handle_raw(handle)->get_internal(name); -} - v8_handle* rr_v8_handle_raw(VALUE value) { v8_handle* handle = 0; Data_Get_Struct(value, struct v8_handle, handle); diff --git a/ext/v8/v8_handle.h b/ext/v8/v8_handle.h index 1dc86ae..e7f552d 100644 --- a/ext/v8/v8_handle.h +++ b/ext/v8/v8_handle.h @@ -7,12 +7,11 @@ struct v8_handle { v8_handle(v8::Handle object); virtual ~v8_handle(); - VALUE get_internal(const char* name); - void set_internal(const char* name, VALUE value); v8::Persistent handle; bool dead; - VALUE references; + VALUE weakref_callback; + VALUE weakref_callback_parameters; }; void rr_init_handle(); @@ -25,8 +24,4 @@ template v8::Persistent& rr_v8_handle(VALUE value) { VALUE rr_v8_handle_new(VALUE rbclass, v8::Handle handle); VALUE rr_v8_handle_class(); -void rr_v8_handle_set_internal(VALUE handle, const char* name, VALUE value); -VALUE rr_v8_handle_get_internal(VALUE handle, const char* name); - - #endif