From 97321b713f0f4cdfeb08404a7aa6e55f12186893 Mon Sep 17 00:00:00 2001 From: Charles Lowell Date: Fri, 29 Apr 2011 16:17:15 -0700 Subject: [PATCH] don't manage external references from C++. --- ext/v8/v8_external.cpp | 16 +---- ext/v8/v8_external.h | 1 - ext/v8/v8_template.cpp | 129 ++++++++++++++++------------------ lib/v8/portal/interceptors.rb | 4 +- 4 files changed, 64 insertions(+), 86 deletions(-) diff --git a/ext/v8/v8_external.cpp b/ext/v8/v8_external.cpp index a9f4882..004fc62 100644 --- a/ext/v8/v8_external.cpp +++ b/ext/v8/v8_external.cpp @@ -11,7 +11,7 @@ namespace { VALUE New(VALUE self, VALUE value) { HandleScope scope; - return rr_v8_handle_new(self, rr_v8_external_create(value)); + return rr_v8_handle_new(self, External::New((void*)value)); } VALUE Unwrap(VALUE self, VALUE value) { HandleScope scope; @@ -26,16 +26,10 @@ namespace { HandleScope scope; return (VALUE)rr_v8_handle(self)->Value(); } - void GCWeakReferenceCallback(Persistent object, void* parameter) { - Local external(External::Cast(*object)); - rb_hash_delete(references, rb_obj_id((VALUE)external->Value())); - } } void rr_init_v8_external() { ExternalClass = rr_define_class("External", rr_v8_value_class()); - references = rb_hash_new(); - rb_define_const(ExternalClass, "OBJECTS_REFERENCED_FROM_WITHIN_V8", references); rr_define_singleton_method(ExternalClass, "New", New, 1); rr_define_singleton_method(ExternalClass, "Unwrap", Unwrap, 1); rr_define_method(ExternalClass, "Value", _Value, 0); @@ -44,11 +38,3 @@ void rr_init_v8_external() { VALUE rr_reflect_v8_external(Handle external) { return rr_v8_handle_new(ExternalClass, external); } - -Handle rr_v8_external_create(VALUE value) { - rb_hash_aset(references, rb_obj_id(value), value); - Local external(External::New((void *)value)); - Persistent record = Persistent::New(external); - record.MakeWeak(NULL, GCWeakReferenceCallback); - return external; -} \ No newline at end of file diff --git a/ext/v8/v8_external.h b/ext/v8/v8_external.h index 1af0097..c32c534 100644 --- a/ext/v8/v8_external.h +++ b/ext/v8/v8_external.h @@ -5,5 +5,4 @@ void rr_init_v8_external(); VALUE rr_reflect_v8_external(v8::Handle value); -v8::Handle rr_v8_external_create(VALUE value); #endif diff --git a/ext/v8/v8_template.cpp b/ext/v8/v8_template.cpp index e2e924f..9960ee4 100644 --- a/ext/v8/v8_template.cpp +++ b/ext/v8/v8_template.cpp @@ -12,21 +12,13 @@ namespace { VALUE ObjectTemplateClass; VALUE FunctionTemplateClass; - VALUE rb_hash_lookup(VALUE hash, const char *key) { - return rb_funcall(hash, rb_intern("[]"), 1, rb_str_new2(key)); - } - - VALUE rb_hash_aset(VALUE hash, const char *key, VALUE value) { - return ::rb_hash_aset(hash, rb_str_new2(key), value); - } - Handle make_v8_data(int argc, VALUE *argv, const char* argf) { VALUE handler; VALUE data; rb_scan_args(argc, argv, argf, &handler, &data); - VALUE v8_data = rb_hash_new(); - rb_hash_aset(v8_data, "handler", handler); - rb_hash_aset(v8_data, "data", data); - return rr_v8_external_create(v8_data); + Handle v8_data = Array::New(2); + v8_data->Set(0, External::New((void*)handler)); + v8_data->Set(1, External::New((void*)data)); + return v8_data; } Persistent