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

move ruby property access to its own module

This commit is contained in:
Charles Lowell 2010-05-22 12:12:42 +03:00
parent 42eb72bbc0
commit 025fedcc23
3 changed files with 61 additions and 57 deletions

View file

@ -10,4 +10,5 @@ module V8
require 'v8/array'
require 'v8/function'
require 'v8/tap'
require 'v8/access'
end

60
lib/v8/access.rb Normal file
View file

@ -0,0 +1,60 @@
module V8
class NamedPropertyGetter
def self.call(property, info)
name = To.rb(property)
obj = To.rb(info.This())
perl_name = To.perl_case(name)
methods = obj.public_methods(false).map(&:to_s)
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

View file

@ -59,63 +59,6 @@ module V8
end
end
class NamedPropertyGetter
def self.call(property, info)
name = To.rb(property)
obj = To.rb(info.This())
perl_name = To.perl_case(name)
methods = obj.public_methods(false).map(&:to_s)
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
def camel_case(str)
str.to_s.gsub(/_(\w)/) {$1.upcase}
end