1
0
Fork 0
mirror of https://github.com/rubyjs/therubyracer synced 2023-03-27 23:21:42 -04:00
therubyracer/ext/v8/backref.cc
2012-07-08 15:08:37 -05:00

54 lines
No EOL
1.1 KiB
C++

#include "rr.h"
namespace rr {
VALUE Backref::Storage;
ID Backref::_new;
ID Backref::object;
void Backref::Init() {
Storage = rb_eval_string("Ref::WeakReference");
rb_gc_register_address(&Storage);
_new = rb_intern("new");
object = rb_intern("object");
}
Backref::Backref(VALUE initial) {
allocate(initial);
}
Backref::~Backref() {
deallocate();
}
void Backref::allocate(VALUE data) {
this->storage = rb_funcall(Storage, _new, 1, data);
rb_gc_register_address(&storage);
}
void Backref::deallocate() {
rb_gc_unregister_address(&storage);
}
VALUE Backref::get() {
return rb_funcall(storage, object, 0);
}
VALUE Backref::set(VALUE data) {
deallocate();
allocate(data);
return data;
}
v8::Handle<v8::Value> Backref::toExternal() {
v8::Local<v8::Value> wrapper = v8::External::Wrap(this);
v8::Persistent<v8::Value>::New(wrapper).MakeWeak(this, &release);
return wrapper;
}
void Backref::release(v8::Persistent<v8::Value> handle, void* data) {
handle.Dispose();
Backref* backref = (Backref*)data;
delete backref;
}
}