mirror of
https://github.com/rubyjs/therubyrhino
synced 2023-03-27 23:21:34 -04:00
introduce an access module for routing (ruby) Scriptable calls
This commit is contained in:
parent
cb2016334e
commit
f4b462216e
4 changed files with 82 additions and 45 deletions
|
@ -25,4 +25,5 @@ require 'rhino/context'
|
||||||
require 'rhino/error'
|
require 'rhino/error'
|
||||||
require 'rhino/rhino_ext'
|
require 'rhino/rhino_ext'
|
||||||
require 'rhino/ruby'
|
require 'rhino/ruby'
|
||||||
|
require 'rhino/ruby/access'
|
||||||
require 'rhino/deprecations'
|
require 'rhino/deprecations'
|
||||||
|
|
|
@ -8,61 +8,19 @@ module Rhino
|
||||||
# override Object Scriptable#get(String name, Scriptable start);
|
# override Object Scriptable#get(String name, Scriptable start);
|
||||||
# override Object Scriptable#get(int index, Scriptable start);
|
# override Object Scriptable#get(int index, Scriptable start);
|
||||||
def get(name, start)
|
def get(name, start)
|
||||||
if name.is_a?(String)
|
access.get(unwrap, name) { super }
|
||||||
if unwrap.respond_to?(name)
|
|
||||||
method = unwrap.method(name)
|
|
||||||
if method.arity == 0 && # check if it is an attr_reader
|
|
||||||
( unwrap.respond_to?("#{name}=") || unwrap.instance_variables.include?("@#{name}") )
|
|
||||||
begin
|
|
||||||
return Rhino.to_javascript(method.call, self)
|
|
||||||
rescue => e
|
|
||||||
raise Function.wrap_error(e)
|
|
||||||
end
|
|
||||||
else
|
|
||||||
return Function.wrap(unwrap.method(name))
|
|
||||||
end
|
|
||||||
elsif unwrap.respond_to?("#{name}=")
|
|
||||||
return nil # it does have the property but is non readable
|
|
||||||
end
|
|
||||||
end
|
|
||||||
# try [](name) method :
|
|
||||||
if unwrap.respond_to?(:'[]') && unwrap.method(:'[]').arity == 1
|
|
||||||
if value = unwrap[name]
|
|
||||||
return Rhino.to_javascript(value, self)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
super
|
|
||||||
end
|
end
|
||||||
|
|
||||||
# override boolean Scriptable#has(String name, Scriptable start);
|
# override boolean Scriptable#has(String name, Scriptable start);
|
||||||
# override boolean Scriptable#has(int index, Scriptable start);
|
# override boolean Scriptable#has(int index, Scriptable start);
|
||||||
def has(name, start)
|
def has(name, start)
|
||||||
if name.is_a?(String)
|
access.has(unwrap, name) { super }
|
||||||
if unwrap.respond_to?(name) ||
|
|
||||||
unwrap.respond_to?("#{name}=") # might have a writer but no reader
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
# try [](name) method :
|
|
||||||
if unwrap.respond_to?(:'[]') && unwrap.method(:'[]').arity == 1
|
|
||||||
return true if unwrap[name]
|
|
||||||
end
|
|
||||||
super
|
|
||||||
end
|
end
|
||||||
|
|
||||||
# override void Scriptable#put(String name, Scriptable start, Object value);
|
# override void Scriptable#put(String name, Scriptable start, Object value);
|
||||||
# override void Scriptable#put(int index, Scriptable start, Object value);
|
# override void Scriptable#put(int index, Scriptable start, Object value);
|
||||||
def put(name, start, value)
|
def put(name, start, value)
|
||||||
if name.is_a?(String)
|
access.put(unwrap, name, value) { super }
|
||||||
if unwrap.respond_to?(set_name = "#{name}=")
|
|
||||||
return unwrap.send(set_name, Rhino.to_ruby(value))
|
|
||||||
end
|
|
||||||
end
|
|
||||||
# try []=(name, value) method :
|
|
||||||
if unwrap.respond_to?(:'[]=') && unwrap.method(:'[]=').arity == 2
|
|
||||||
return unwrap[name] = Rhino.to_ruby(value)
|
|
||||||
end
|
|
||||||
super
|
|
||||||
end
|
end
|
||||||
|
|
||||||
# override Object[] Scriptable#getIds();
|
# override Object[] Scriptable#getIds();
|
||||||
|
@ -77,6 +35,22 @@ module Rhino
|
||||||
ids.to_java
|
ids.to_java
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@@access = nil
|
||||||
|
|
||||||
|
def self.access=(access)
|
||||||
|
@@access = access
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.access
|
||||||
|
@@access ||= Rhino::Ruby::DefaultAccess
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def access
|
||||||
|
Scriptable.access
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
class Object < JS::ScriptableObject
|
class Object < JS::ScriptableObject
|
||||||
|
|
7
lib/rhino/ruby/access.rb
Normal file
7
lib/rhino/ruby/access.rb
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
module Rhino
|
||||||
|
module Ruby
|
||||||
|
|
||||||
|
autoload :DefaultAccess, "rhino/ruby/default_access"
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
55
lib/rhino/ruby/default_access.rb
Normal file
55
lib/rhino/ruby/default_access.rb
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
module Rhino
|
||||||
|
module Ruby
|
||||||
|
module DefaultAccess
|
||||||
|
|
||||||
|
def self.has(object, name)
|
||||||
|
if object.respond_to?(name.to_s) ||
|
||||||
|
object.respond_to?("#{name}=") # might have a writer but no reader
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
# try [](name) method :
|
||||||
|
if object.respond_to?(:'[]') && object.method(:'[]').arity == 1
|
||||||
|
return true if object[name]
|
||||||
|
end
|
||||||
|
yield
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.get(object, name)
|
||||||
|
if object.respond_to?(name_s = name.to_s)
|
||||||
|
method = object.method(name_s)
|
||||||
|
if method.arity == 0 && # check if it is an attr_reader
|
||||||
|
( object.respond_to?("#{name}=") || object.instance_variables.include?("@#{name}") )
|
||||||
|
begin
|
||||||
|
return Rhino.to_javascript(method.call, self)
|
||||||
|
rescue => e
|
||||||
|
raise Function.wrap_error(e)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
return Function.wrap(method)
|
||||||
|
end
|
||||||
|
elsif object.respond_to?("#{name}=")
|
||||||
|
return nil # it does have the property but is non readable
|
||||||
|
end
|
||||||
|
# try [](name) method :
|
||||||
|
if object.respond_to?(:'[]') && object.method(:'[]').arity == 1
|
||||||
|
if value = object[name]
|
||||||
|
return Rhino.to_javascript(value, self)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
yield
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.put(object, name, value)
|
||||||
|
if object.respond_to?(set_name = "#{name}=")
|
||||||
|
return object.send(set_name, Rhino.to_ruby(value))
|
||||||
|
end
|
||||||
|
# try []=(name, value) method :
|
||||||
|
if object.respond_to?(:'[]=') && object.method(:'[]=').arity == 2
|
||||||
|
return object[name] = Rhino.to_ruby(value)
|
||||||
|
end
|
||||||
|
yield
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in a new issue