From 3b2a94d99d79e01aeefc7c42863f0936a0dfe31e Mon Sep 17 00:00:00 2001 From: Charles Lowell Date: Fri, 8 Jun 2012 09:07:49 -0500 Subject: [PATCH] Value() converts primitives as a convenience --- ext/v8/rr.h | 1 + ext/v8/value.cc | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/ext/v8/rr.h b/ext/v8/rr.h index d207769..901e60c 100644 --- a/ext/v8/rr.h +++ b/ext/v8/rr.h @@ -297,6 +297,7 @@ public: inline Value(VALUE value) : Ref(value) {} inline Value(v8::Handle value) : Ref(value) {} virtual operator VALUE(); + virtual operator v8::Handle() const; }; class Primitive: public Ref { diff --git a/ext/v8/value.cc b/ext/v8/value.cc index 6b8f128..73222a0 100644 --- a/ext/v8/value.cc +++ b/ext/v8/value.cc @@ -190,4 +190,42 @@ Value::operator VALUE() { } return Ref::operator VALUE(); } + +Value::operator v8::Handle() const { + switch (TYPE(value)) { + case T_FIXNUM: + return v8::Integer::New(NUM2INT(value)); + case T_FLOAT: + return v8::Number::New(NUM2DBL(value)); + case T_STRING: + return v8::String::New(RSTRING_PTR(value), (int)RSTRING_LEN(value)); + case T_NIL: + return v8::Null(); + case T_TRUE: + return v8::True(); + case T_FALSE: + return v8::False(); + case T_DATA: + return Ref::operator v8::Handle(); + case T_OBJECT: + case T_CLASS: + case T_ICLASS: + case T_MODULE: + case T_REGEXP: + case T_MATCH: + case T_ARRAY: + case T_HASH: + case T_STRUCT: + case T_BIGNUM: + case T_FILE: + case T_SYMBOL: + case T_UNDEF: + case T_NODE: + default: + rb_warn("unknown conversion to V8 for: %s", RSTRING_PTR(rb_inspect(value))); + return v8::String::New("Undefined Conversion"); + } + + return v8::Undefined(); +} } \ No newline at end of file