lib/v8/to.rb in therubyracer-0.6.3 vs lib/v8/to.rb in therubyracer-0.7.0.pre
- old
+ new
@@ -3,26 +3,78 @@
module To
class << self
def ruby(value)
case value
when V8::C::Function then V8::Function.new(value)
+ when V8::C::Array then V8::Array.new(value)
when V8::C::Object then V8::Object.new(value)
- when V8::C::String then "Wonkers!"
+ when V8::C::String then value.Utf8Value()
+ when V8::C::Date then Time.at(value.NumberValue())
else
value
end
end
-
+
+ alias_method :rb, :ruby
+
def v8(value)
case value
- when String then C::String.new(value)
- when Proc then C::FunctionTemplate.new(&value).GetFunction()
- when Method then C::FunctionTemplate.new(&value.to_proc).GetFunction()
- else
+ when V8::Object
+ value.instance_eval {@native}
+ when String, Symbol
+ C::String::New(value.to_s)
+ when Proc,Method
+ template = C::FunctionTemplate::New() do |arguments|
+ rbargs = []
+ for i in 0..arguments.Length() - 1
+ rbargs << To.ruby(arguments[i])
+ end
+ V8::Function.rubycall(value, *rbargs)
+ end
+ return template.GetFunction()
+ when ::Array
+ C::Array::New(value.length).tap do |a|
+ value.each_with_index do |item, i|
+ a.Set(i, To.v8(item))
+ end
+ end
+ when ::Hash
+ C::Object::New().tap do |o|
+ value.each do |key, value|
+ o.Set(To.v8(key), To.v8(value))
+ end
+ end
+ when ::Time
+ C::Date::New(value)
+ when nil,Numeric,TrueClass,FalseClass
value
+ else
+ rubyobject = C::ObjectTemplate::New()
+ rubyobject.SetNamedPropertyHandler(
+ NamedPropertyGetter,
+ NamedPropertySetter,
+ nil,
+ nil,
+ NamedPropertyEnumerator
+ )
+ obj = nil
+ unless C::Context::InContext()
+ cxt = C::Context::New()
+ cxt.Enter()
+ begin
+ obj = rubyobject.NewInstance()
+ obj.SetHiddenValue(C::String::New("TheRubyRacer::RubyObject"), C::External::Wrap(value))
+ ensure
+ cxt.Exit()
+ end
+ else
+ obj = rubyobject.NewInstance()
+ obj.SetHiddenValue(C::String::New("TheRubyRacer::RubyObject"), C::External::Wrap(value))
+ end
+ return obj
end
end
-
+
def camel_case(str)
str.to_s.gsub(/_(\w)/) {$1.upcase}
end
def perl_case(str)
\ No newline at end of file