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

allow v8 refs to hold on to more than one ruby object.

This commit is contained in:
Charles Lowell 2010-05-20 11:24:27 +03:00
parent c0497bebea
commit 9a44d204c8
2 changed files with 22 additions and 13 deletions

View file

@ -2,25 +2,38 @@
#include "stdio.h"
using namespace v8;
v8_ref::v8_ref(Handle<void> object, VALUE ref) : handle(Persistent<void>::New(object)) {
references = rb_hash_new();
this->add(ref);
}
v8_ref::v8_ref(Handle<void> object, VALUE ref) : handle(Persistent<void>::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<void> 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));
}

View file

@ -4,21 +4,17 @@
#include <v8.h>
#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<void> object, VALUE ref = 0);
virtual ~v8_ref();
void add(VALUE ref);
v8::Persistent<void> 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<void> handle, VALUE ref = 0);