Sha256: 0ecd6dffaef2168275202cd34f5b3f518ca9d5a5b525b429ec201436d4f12e26

Contents?: true

Size: 1.88 KB

Versions: 17

Compression:

Stored size: 1.88 KB

Contents

#include "rr.h"
#include "v8_external.h"

#include "v8_ref.h"
#include "v8_value.h"
using namespace v8;

namespace {
  VALUE ExternalClass;
  VALUE references;

  VALUE New(VALUE rbclass, VALUE value) {
    HandleScope scope;
    return rr_v8_ref_create(rbclass, rr_v8_external_create(value));
  }
  VALUE Unwrap(VALUE self, VALUE value) {
    HandleScope scope;
    if (rb_obj_is_kind_of(value, self)) {
      return (VALUE)External::Unwrap(V8_Ref_Get<External>(self));
    } else {
      rb_raise(rb_eArgError, "cannot unwrap %s. It is not a kind of %s", RSTRING_PTR(rb_class_name(rb_class_of(value))), RSTRING_PTR(rb_class_name(self)));
      return Qnil;
    }
  }
  VALUE _Value(VALUE self) {
    HandleScope scope;
    return (VALUE)V8_Ref_Get<External>(self)->Value();
  }
  void GCWeakReferenceCallback(Persistent<Value> object, void* parameter) {
    // printf("V8 GC!!!!\n");
    Local<External> external(External::Cast(*object));
    rb_hash_delete(references, rb_obj_id((VALUE)external->Value()));
    // V8::AdjustAmountOfExternalAllocatedMemory(-100000000);
  }
}

void rr_init_v8_external() {
  ExternalClass = rr_define_class("External", rr_cV8_C_Value);
  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);
}

VALUE rr_reflect_v8_external(Handle<Value> external) {
  return rr_v8_ref_create(ExternalClass, external);
}

Handle<Value> rr_v8_external_create(VALUE value) {
  rb_hash_aset(references, rb_obj_id(value), value);
  Local<Value> external(External::New((void *)value));
  Persistent<Value> record = Persistent<Value>::New(external);
  // V8::AdjustAmountOfExternalAllocatedMemory(100000000);
  record.MakeWeak(NULL, GCWeakReferenceCallback);
  return external;
}

Version data entries

17 entries across 17 versions & 2 rubygems

Version Path
therubyracer-0.8.2 ext/v8/v8_external.cpp
therubyracer-0.8.2.pre2 ext/v8/v8_external.cpp
therubyracer-0.8.2.pre ext/v8/v8_external.cpp
therubyracer-0.8.1 ext/v8/v8_external.cpp
therubyracer-0.8.1.pre2 ext/v8/v8_external.cpp
therubyracer-heroku-0.8.1.pre3 ext/v8/v8_external.cpp
therubyracer-heroku-0.8.1.pre2 ext/v8/v8_external.cpp
therubyracer-0.8.1.pre1 ext/v8/v8_external.cpp
therubyracer-0.8.0 ext/v8/v8_external.cpp
therubyracer-0.8.0.pre3 ext/v8/v8_external.cpp
therubyracer-0.8.0.pre2 ext/v8/v8_external.cpp
therubyracer-0.8.0.pre ext/v8/v8_external.cpp
therubyracer-0.7.5 ext/v8/v8_external.cpp
therubyracer-0.7.4 ext/v8/v8_external.cpp
therubyracer-0.7.3 ext/v8/v8_external.cpp
therubyracer-0.7.2 ext/v8/v8_external.cpp
therubyracer-0.7.2.pre ext/v8/v8_external.cpp