Sha256: 4089181744b6a501778e3a9a78e4003379e72ae2966c184ddafd0288c233ebe0

Contents?: true

Size: 1.35 KB

Versions: 5

Compression:

Stored size: 1.35 KB

Contents

#include "v8_ref.h"
#include "v8_cast.h"
#include "v8_external.h"

using namespace v8;

void gc_v8_object_mark(v8_ref *r)
{
  rb_gc_mark(r->origin);
  rb_gc_mark(r->references);
}

void gc_v8_object_free(v8_ref *r)
{
  delete r;
}

/*
 * Creates new reference to V8 object for ruby object.
 *
 *   v8_ref_new(rb_cV8Integer, Integer::New());
 *   v8_ref_new(rb_cV8String, String::Cast(*value));
 *
 */
VALUE v8_ref_new(VALUE klass, Handle<void> handle, VALUE orig/* = Qnil */)
{
  v8_ref *r = new v8_ref(handle, orig);
  return Data_Wrap_Struct(klass, gc_v8_object_mark, gc_v8_object_free, r);
}

/*
 * Appends additional reference to ruby object wrapped with v8_ref.
 *
 */
void v8_ref_set(VALUE obj, const char *name, VALUE ref)
{
  v8_ref *r = 0;
  Data_Get_Struct(obj, struct v8_ref, r);
  r->set(name, ref);
}

/*
 * Returns original object from which v8 reflection has been created.
 *
 */
VALUE v8_ref_orig(VALUE obj)
{
  v8_ref *r = 0;
  Data_Get_Struct(obj, struct v8_ref, r);
  return r->origin;
}

/* The v8_ref struct methods. */

v8_ref::v8_ref(Handle<void> object, VALUE orig/* = Qnil */)
{
  handle = Persistent<void>::New(object);
  references = rb_hash_new();
  origin = orig;
}

v8_ref::~v8_ref()
{
  handle.Dispose();
}

void v8_ref::set(const char *name, VALUE ref)
{
  if (ref != 0 && RTEST(ref)) {
    rb_hash_aset(references, rb_str_new2(name), ref);
  }
}

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
mustang-0.2.2 ext/v8/v8_ref.cpp
mustang-0.2.1 ext/v8/v8_ref.cpp
mustang-0.2.0 ext/v8/v8_ref.cpp
mustang-0.1.1 ext/v8/v8_ref.cpp
mustang-0.1.0 ext/v8/v8_ref.cpp