diff --git a/ext/v8/callbacks.cpp b/ext/v8/callbacks.cpp deleted file mode 100644 index eaa099c..0000000 --- a/ext/v8/callbacks.cpp +++ /dev/null @@ -1,185 +0,0 @@ -#include "rr.h" - -#include "callbacks.h" -#include "converters.h" - -using namespace v8; - -namespace { - VALUE unwrap(const AccessorInfo& info) { - return (VALUE)External::Unwrap(info.Data()); - } - - //returns all the ruby methods that can be called from - //this object. - //1.8: public_methods() return strings - //1.9: publi_methods() return symbols - //convert them all into string - - VALUE CALLABLE_METHODS(VALUE object) { - VALUE methods = rb_funcall(object, rb_intern("public_methods"), 1, Qfalse); - int length = RARRAY_LEN(methods); - VALUE str_methods = rb_ary_new2(length); - for (int i = 0; i < length; i++) { - VALUE method = rb_ary_entry(methods, i); - rb_ary_store(str_methods,i, rb_obj_as_string(method)); - } - return str_methods; - } - - Local<Array> TO_ARRAY(Arguments& args) { - Local<Array> array = Array::New(args.Length()); - for (int i = 0; i < args.Length(); i++) { - array->Set(Integer::New(i), args[i]); - } - return array; - } - - Local<Value> Racer_Call_Ruby_Method(VALUE object, VALUE method, Local<Array> args) { - VALUE * arguments = new VALUE[args->Length()]; - for (unsigned int i = 0; i < args->Length(); i++) { - Handle<Value> val = args->Get(Integer::New(i)); - arguments[i] = V82RB(val); - } - VALUE result = rb_funcall2(object, rb_to_id(method), args->Length(), arguments); - Local<Value> converted = RB2V8(result); - return converted; - } - - Local<Value> Racer_Access_Ruby_Property(VALUE object, VALUE name) { - VALUE method = rb_funcall(object, rb_intern("method"), 1, name); - if (FIX2INT(rb_funcall(method, rb_intern("arity"), 0)) == 0) { - return Racer_Call_Ruby_Method(object, name, Array::New(0)); - } else { - //causes out of memory if we use rr_rb2v8 - return RB2V8(method); - } - } -} - -Handle<Value> RacerRubyInvocationCallback(const Arguments& args) { - VALUE code = (VALUE)External::Unwrap(args.Data()); - if (NIL_P(code)) { - return Null(); - } else { - VALUE* arguments = new VALUE[args.Length()]; - for(int c=0;c<args.Length(); ++c) { - Handle<Value> val = args[c]; - // arguments[c] = rr_v82rb(val); // segfaults... why? - arguments[c] = V82RB(val); - } - - VALUE result = rb_funcall2(code, rb_intern("call"), args.Length(), arguments); - delete [] arguments; - - Handle<Value> convertedResult = rr_rb2v8(result); - return convertedResult; - } -} - - - - -/** - * NamedProperty[Getter|Setter] are used as interceptors on object. - * See ObjectTemplate::SetNamedPropertyHandler. - */ - -Handle<Value> RacerRubyNamedPropertyGetter(Local<String> property, const AccessorInfo& info) { - // printf("Getter '%s'<br/>", *String::AsciiValue(property)); - if (property->Length() == 0) { - return Handle<Value>(); - } - VALUE object = unwrap(info); - // VALUE camel_name = rr_v82rb(property); //segfaults. why?? - VALUE camel_name = V82RB((Local<Value>&)property); - VALUE perl_name = rr_str_to_perl_case(camel_name); - // VALUE perl_name = rb_funcall(V8_To, rb_intern("perl_case"), 1, camel_name); - VALUE methods = CALLABLE_METHODS(object); - - if (RTEST(rb_ary_includes(methods, perl_name))) { - return Racer_Access_Ruby_Property(object, perl_name); - } - if (RTEST(rb_ary_includes(methods, camel_name))) { - return Racer_Access_Ruby_Property(object, camel_name); - } - return Handle<Value>(); -} - -/** - * Returns the value if the setter intercepts the request. - * Otherwise, returns an empty handle. - */ -Handle<Value> RacerRubyNamedPropertySetter(Local<String> property, Local<Value> value, const AccessorInfo& info) { - if (property->Length() == 0) { - return Handle<Value>(); - } - // printf("Setter: '%s'<br/>", *String::AsciiValue(property)); - std::string setter = V82String((Handle<Value>&)property); - setter += "="; - Local<String> setter_name = String::New(setter.c_str()); - VALUE object = unwrap(info); - VALUE camel_name = V82RB((Local<Value>&)setter_name); - VALUE perl_name = rr_str_to_perl_case(camel_name); - // VALUE perl_name = rb_funcall(V8_To, rb_intern("perl_case"), 1, camel_name); - VALUE methods = CALLABLE_METHODS(object); - Local<Array> args = Array::New(1); - args->Set(Integer::New(0), value); - if (RTEST(rb_ary_includes(methods, perl_name))) { - Racer_Call_Ruby_Method(object, perl_name, args); - return value; - } - if (RTEST(rb_ary_includes(methods, camel_name))) { - Racer_Call_Ruby_Method(object, camel_name, args); - return value; - } - return Handle<Value>(); -} - -/** - * Returns a non-empty handle if the interceptor intercepts the request. - * The result is true if the property exists and false otherwise. - */ -Handle<Boolean> RacerRubyNamedPropertyQuery(Local<String> property, const AccessorInfo& info) { - // printf("Query: '%s'<br/>", *String::AsciiValue(property)); - if (property->Length() == 0) { - return False(); - } - VALUE object = unwrap(info); - VALUE methods = CALLABLE_METHODS(object); - VALUE attr_name = V82RB((Local<Value>&)property); - // VALUE perl_name = rb_funcall(V8_To, rb_intern("perl_case"), 1, attr_name); - VALUE perl_name = rr_str_to_perl_case(attr_name); - - if (RTEST(rb_ary_includes(methods, attr_name)) || RTEST(rb_ary_includes(methods, perl_name))) { - return True(); - } else { - return Handle<Boolean>(); - } -} - -/** - * Returns a non-empty handle if the deleter intercepts the request. - * The return value is true if the property could be deleted and false - * otherwise. - */ -Handle<Boolean> RacerRubyNamedPropertyDeleter(Local<String> property, const AccessorInfo& info) { - return False(); -} - -/** - * Returns an array containing the names of the properties the named - * property getter intercepts. - */ -Handle<Array> RacerRubyNamedPropertyEnumerator(const AccessorInfo& info) { - VALUE object = unwrap(info); - VALUE methods = CALLABLE_METHODS(object); - int length = RARRAY_LEN(methods); - Local<Array> properties = Array::New(length); - for (int i = 0; i < length; i++) { - // VALUE camel_name = rb_funcall(V8_To, rb_intern("camel_case"), 1, rb_ary_entry(methods, i)); - VALUE camel_name = rr_str_to_camel_case(rb_ary_entry(methods, i)); - properties->Set(Integer::New(i), rr_rb2v8(camel_name)); - } - return properties; -} diff --git a/ext/v8/callbacks.h b/ext/v8/callbacks.h deleted file mode 100644 index ca3b55e..0000000 --- a/ext/v8/callbacks.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef CALLBACKS_H_8VK3LWBG -#define CALLBACKS_H_8VK3LWBG - -#include <v8.h> - -v8::Handle<v8::Value> RacerRubyInvocationCallback(const v8::Arguments& args); - -v8::Handle<v8::Value> RacerRubyNamedPropertyGetter(v8::Local<v8::String> property, const v8::AccessorInfo& info); -v8::Handle<v8::Value> RacerRubyNamedPropertySetter(v8::Local<v8::String> property, v8::Local<v8::Value> value, const v8::AccessorInfo& info); -v8::Handle<v8::Boolean> RacerRubyNamedPropertyQuery(v8::Local<v8::String> property, const v8::AccessorInfo& info); -v8::Handle<v8::Boolean> RacerRubyNamedPropertyDeleter(v8::Local<v8::String> property, const v8::AccessorInfo& info); -v8::Handle<v8::Array> RacerRubyNamedPropertyEnumerator(const v8::AccessorInfo& info); - -#endif /* end of include guard: CALLBACKS_H_8VK3LWBG */ diff --git a/ext/v8/converters.cpp b/ext/v8/converters.cpp index 5e5c458..b4af708 100644 --- a/ext/v8/converters.cpp +++ b/ext/v8/converters.cpp @@ -1,5 +1,4 @@ #include "converters.h" -#include "callbacks.h" #include "v8_ref.h" #include "v8_obj.h" #include "v8_cxt.h" @@ -51,10 +50,10 @@ VALUE V82RB(Handle<Value>& value) { Local<Value> RB2V8(VALUE value) { VALUE valueClass = rb_class_of(value); - if(valueClass == rb_cProc || valueClass == rb_cMethod) { - Local<FunctionTemplate> t = FunctionTemplate::New(RacerRubyInvocationCallback, rr_v8_external_create(value)); - return t->GetFunction(); - } + // if(valueClass == rb_cProc || valueClass == rb_cMethod) { + // Local<FunctionTemplate> t = FunctionTemplate::New(RacerRubyInvocationCallback, rr_v8_external_create(value)); + // return t->GetFunction(); + // } convert_rb_to_v8_t convert; Local<Value> result; if (convert(value, result)) { diff --git a/ext/v8/v8_template.cpp b/ext/v8/v8_template.cpp index c3b5dfc..421374e 100644 --- a/ext/v8/v8_template.cpp +++ b/ext/v8/v8_template.cpp @@ -5,7 +5,6 @@ #include "v8_template.h" #include "v8_external.h" #include "v8_callbacks.h" -#include "callbacks.h" #include "converters.h" using namespace v8; diff --git a/lib/v8/callbacks.rb b/lib/v8/callbacks.rb deleted file mode 100644 index 35b81b9..0000000 --- a/lib/v8/callbacks.rb +++ /dev/null @@ -1,88 +0,0 @@ - -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 \ No newline at end of file