From 025fedcc2352163ce831b47b55892a7df40216b4 Mon Sep 17 00:00:00 2001 From: Charles Lowell Date: Sat, 22 May 2010 12:12:42 +0300 Subject: [PATCH] move ruby property access to its own module --- lib/v8.rb | 1 + lib/v8/access.rb | 60 ++++++++++++++++++++++++++++++++++++++++++++++++ lib/v8/to.rb | 57 --------------------------------------------- 3 files changed, 61 insertions(+), 57 deletions(-) create mode 100644 lib/v8/access.rb diff --git a/lib/v8.rb b/lib/v8.rb index 5ce3999..38ff6de 100644 --- a/lib/v8.rb +++ b/lib/v8.rb @@ -10,4 +10,5 @@ module V8 require 'v8/array' require 'v8/function' require 'v8/tap' + require 'v8/access' end \ No newline at end of file diff --git a/lib/v8/access.rb b/lib/v8/access.rb new file mode 100644 index 0000000..93d7073 --- /dev/null +++ b/lib/v8/access.rb @@ -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 \ No newline at end of file diff --git a/lib/v8/to.rb b/lib/v8/to.rb index 8dc9deb..df7726e 100644 --- a/lib/v8/to.rb +++ b/lib/v8/to.rb @@ -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