mirror of
https://github.com/rubyjs/therubyracer
synced 2023-03-27 23:21:42 -04:00
rework callbacks
This commit is contained in:
parent
343ece83cf
commit
83abd10113
1 changed files with 88 additions and 0 deletions
88
lib/v8/callbacks.rb
Normal file
88
lib/v8/callbacks.rb
Normal file
|
@ -0,0 +1,88 @@
|
|||
|
||||
module V8
|
||||
module C
|
||||
class MethodInfo
|
||||
|
||||
attr_reader :perl_methods, :camel_methods
|
||||
|
||||
def initialize(object)
|
||||
@object = object
|
||||
@methods = Set.new
|
||||
for name in object.public_methods(false) do
|
||||
@methods << name.to_s
|
||||
end
|
||||
end
|
||||
|
||||
def find(name)
|
||||
for format in [name, To.perl_case(name), To.camel_case(name)]
|
||||
return @object.method(format) if @methods.include?(format)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
class NamedPropertyGetter
|
||||
def self.call(property, info)
|
||||
methods = MethodInfo(To.rb(info.This()))
|
||||
|
||||
if method = methods.find(To.rb(property))
|
||||
if method.arity == 0
|
||||
To.v8(method.call)
|
||||
else
|
||||
To.v8(method)
|
||||
end
|
||||
else
|
||||
C::Empty
|
||||
end
|
||||
|
||||
# method_name = if methods.include?(name)
|
||||
# name
|
||||
# elsif methods.include?(perl_name)
|
||||
# perl_name
|
||||
# end
|
||||
# if method_name
|
||||
# method = obj.method(method_name)
|
||||
# if method.arity == 0
|
||||
# To.v8(method.call())
|
||||
# else
|
||||
# To.v8(method)
|
||||
# end
|
||||
# else
|
||||
# C::Empty
|
||||
# end
|
||||
# end
|
||||
end
|
||||
|
||||
class NamedPropertySetter
|
||||
def self.call(property, value, info)
|
||||
obj = To.rb(info.This())
|
||||
setter = To.rb(property) + "="
|
||||
camel_name = To.camel_case(setter)
|
||||
perl_name = To.perl_case(setter)
|
||||
methods = obj.public_methods(false).map(&:to_s)
|
||||
if methods.include?(perl_name)
|
||||
obj.send(perl_name, To.rb(value))
|
||||
elsif methods.include?(camel_name)
|
||||
obj.send(camel_name, To.rb(value))
|
||||
else
|
||||
C::Empty
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
class NamedPropertyEnumerator
|
||||
def self.call(info)
|
||||
obj = To.rb(info.This())
|
||||
camel_methods = obj.public_methods(false).inject(Set.new) do |set, name|
|
||||
set.tap do
|
||||
set << To.camel_case(name)
|
||||
end
|
||||
end
|
||||
names = V8::C::Array::New(camel_methods.length)
|
||||
camel_methods.each_with_index do |name, i|
|
||||
names.Set(i, C::String::New(name))
|
||||
end
|
||||
return names
|
||||
end
|
||||
end
|
||||
end
|
Loading…
Add table
Reference in a new issue