Module: Rhino::To

Defined in:
lib/rhino/wormhole.rb

Constant Summary collapse

JS_UNDEF =
[J::Scriptable::NOT_FOUND, J::Undefined]
@@j2r =
{}
@@r2j =
{}

Class Method Summary collapse

Class Method Details

.array(native) ⇒ Object



34
35
36
# File 'lib/rhino/wormhole.rb', line 34

def array(native)
  native.length.times.map {|i| ruby(native.get(i,native))}
end

.j2r(value) ⇒ Object



49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/rhino/wormhole.rb', line 49

def j2r(value)
key = value.object_id
  if ref = @@j2r[key]
    if peer = ref.get()
      return peer
    else
      @@j2r.delete(key)
      return j2r(value) {|o| yield o}
    end
  else
    yield(value).tap do |peer|
      @@j2r[key] = java.lang.ref.WeakReference.new(peer)
    end
  end
end

.javascript(object) ⇒ Object



21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/rhino/wormhole.rb', line 21

def javascript(object)
  case object
  when String,Numeric       then object
  when TrueClass,FalseClass then object
  when Array                then J::NativeArray.new(object.to_java)
  when Hash                 then ruby_hash_to_native(object)
  when Proc,Method          then r2j(object, object.to_s) {|o| RubyFunction.new(o)}
  when NativeObject         then object.j
  when J::Scriptable        then object
  else r2j(object) {|o| RubyObject.new(o)}
  end
end

.r2j(value, key = value.object_id) ⇒ Object



66
67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/rhino/wormhole.rb', line 66

def r2j(value, key = value.object_id)
  if ref = @@r2j[key]
    if peer = ref.get()
      return peer
    else
      @@r2j.delete(key)
      return r2j(value, key) {|o| yield o}
    end
  else
    yield(value).tap do |peer|
      @@r2j[key] = java.lang.ref.WeakReference.new(peer)
    end
  end
end

.ruby(object) ⇒ Object



8
9
10
11
12
13
14
15
16
17
18
19
# File 'lib/rhino/wormhole.rb', line 8

def ruby(object)
  case object
  when *JS_UNDEF                then nil
  when J::Wrapper               then object.unwrap
  when J::NativeArray           then array(object)
  when J::NativeDate            then Time.at(object.getJSTimeValue() / 1000)
  when J::Regexp::NativeRegExp  then object
  when J::Function              then j2r(object) {|o| NativeFunction.new(o)}
  when J::Scriptable            then j2r(object) {|o| NativeObject.new(o)}
  else  object
  end
end

.ruby_hash_to_native(ruby_object) ⇒ Object



38
39
40
41
42
43
44
45
46
# File 'lib/rhino/wormhole.rb', line 38

def ruby_hash_to_native(ruby_object)
    native_object = NativeObject.new

    ruby_object.each_pair do |k, v|
      native_object[k] = v
    end

    native_object.j
end