1
0
Fork 0
mirror of https://github.com/rubyjs/therubyracer synced 2023-03-27 23:21:42 -04:00

add rr_define_finalizer() utility for adding object finalizers from C.

This commit is contained in:
Charles Lowell 2011-05-24 17:25:21 -05:00
parent b0084c4c0c
commit a671d6feda
4 changed files with 14 additions and 3 deletions

View file

@ -40,6 +40,13 @@ VALUE rr_const_get(const char *name) {
return rb_const_get(V8_C, rb_intern(name));
}
VALUE rr_define_finalizer(VALUE object, void* finalizer, VALUE data) {
VALUE finalizer_proc = rb_proc_new((VALUE (*)(...))finalizer, data);
rb_iv_set(finalizer_proc, "data", data);
VALUE ospace = rb_const_get(rb_cObject, rb_intern("ObjectSpace"));
rb_funcall(ospace, rb_intern("define_finalizer"), 2, object, finalizer_proc);
}
VALUE rr_v82rb(Handle<Value> value) {
if (value.IsEmpty()) {
return rr_v8_value_empty();

View file

@ -11,6 +11,10 @@ VALUE rr_define_class(const char *name, VALUE superclass = rb_cObject);
VALUE rr_define_module(const char *name);
VALUE rr_define_const(const char *name, VALUE value);
VALUE rr_const_get(const char *name);
VALUE rr_define_finalizer(VALUE object, void* finalizer, VALUE data);
extern "C" VALUE rb_proc_new(VALUE (*)(ANYARGS/* VALUE yieldarg[, VALUE procarg] */), VALUE);
VALUE rr_v82rb(v8::Handle<v8::Value> value);
VALUE rr_v82rb(v8::Handle<v8::Boolean> value);

View file

@ -12,8 +12,7 @@ v8_weakref::v8_weakref(VALUE object) {
void v8_weakref::set(VALUE value) {
this->object_id = rb_obj_id(value);
VALUE data = Data_Wrap_Struct(rb_cObject, 0, 0, this);
VALUE finalizer = rb_proc_new((VALUE (*)(...))v8_weakref_finalize, data);
rb_funcall(v8_weakref_objectspace(), rb_intern("define_finalizer"), 2, value, finalizer);
rr_define_finalizer(value,(void*)v8_weakref_finalize, data);
}
VALUE v8_weakref::get() {

View file

@ -3,6 +3,7 @@
#include <v8.h>
#include "ruby.h"
#include "rr.h"
struct v8_weakref {
v8_weakref(VALUE object);
@ -21,6 +22,6 @@ VALUE v8_weakref_objectspace();
VALUE v8_weakref_nil(VALUE nil, VALUE exception);
VALUE v8_weakref_id2ref(VALUE id);
extern "C" VALUE rb_proc_new(VALUE (*)(ANYARGS/* VALUE yieldarg[, VALUE procarg] */), VALUE);
// extern "C" VALUE rb_proc_new(VALUE (*)(ANYARGS/* VALUE yieldarg[, VALUE procarg] */), VALUE);
#endif