1
0
Fork 0
mirror of https://github.com/rubyjs/therubyrhino synced 2023-03-27 23:21:34 -04:00

add support for embedding ruby instances

This commit is contained in:
Charles Lowell 2009-11-09 10:45:23 -05:00
parent cb516973af
commit 138d41dc98
7 changed files with 73 additions and 11 deletions

View file

@ -3,6 +3,7 @@
* easily manipulate javascript objects from ruby (NativeObject)
* make NativeObject Enumerable
* to_h and to_json for NativeObject
* embed ruby instances and call methods from javascript
=== 1.72.0 2009-09-24

View file

@ -3,9 +3,10 @@ $:.unshift(File.dirname(__FILE__)) unless
module Rhino
VERSION = '1.72.0'
VERSION = '1.72.1'
require 'rhino/java'
require 'rhino/context'
require 'rhino/wormhole'
require 'rhino/native_object'
require 'rhino/ruby_object'
end

View file

@ -52,12 +52,17 @@ module Rhino
end
class Function < J::BaseFunction
def initialize(&block)
@block = block
def initialize(callable = nil, &block)
super()
@block = callable || block
end
def call(cxt, scope, this, args)
@block.call(*args)
@block.call(*(args.map {|a| To.ruby(a)}))
end
def to_json(*args)
'"[Native Function]"'
end
end
@ -68,7 +73,7 @@ module Rhino
end
def message
@native.message
@native.cause.details
end
def javascript_backtrace

View file

@ -13,7 +13,7 @@ module Rhino
end
def []=(k,v)
@j.put(k.to_s,@j,v)
@j.put(k.to_s,@j,To.javascript(v))
end
def each

35
lib/rhino/ruby_object.rb Normal file
View file

@ -0,0 +1,35 @@
module Rhino
class RubyObject < J::ScriptableObject
include J::Wrapper
def initialize(object)
super()
@ruby = object
end
def unwrap
@ruby
end
def getClassName()
@ruby.class.name
end
def getPrototype()
@prototype ||= J::NativeObject.new.tap do |p|
p.put("toString", p, Function.new {to_s})
for name in @ruby.public_methods(false).reject {|m| m == 'initialize'}
method = @ruby.method(name)
p.put(name.gsub(/_(\w)/) {$1.upcase}, p, Function.new(method) {})
end
end
end
def to_s
"[Native #{@ruby.class.name}]"
end
alias_method :prototype, :getPrototype
end
end

View file

@ -5,9 +5,10 @@ module Rhino
def ruby(object)
case object
when *JS_UNDEF then nil
when J::Wrapper then object.unwrap
when J::Scriptable then NativeObject.new(object)
when *JS_UNDEF then nil
when Rhino::RubyObject then object
when J::Wrapper then object.unwrap
when J::Scriptable then NativeObject.new(object)
else object
end
end
@ -16,6 +17,7 @@ module Rhino
case object
when NativeObject then object.j
when J::Scriptable then object
else RubyObject.new(object)
end
end

View file

@ -52,5 +52,23 @@ describe Rhino::To do
end
end
it "creates a prototype for the object based on its class" do
Class.new.tap do |c|
c.class_eval do
def foo(one, two)
"1: #{one}, 2: #{two}"
end
end
To.javascript(c.new).tap do |o|
o.should be_kind_of(RubyObject)
o.prototype.tap do |p|
p.should_not be_nil
p.get("foo", p).should_not be_nil
p.get("toString", p).should_not be_nil
end
end
end
end
end
end