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

expose SetCallAsFunctionHandler() to ObjectTemplate

This commit is contained in:
Charles Lowell 2010-08-17 06:31:18 -05:00
parent a262281ff4
commit adc0597451
2 changed files with 19 additions and 7 deletions

View file

@ -14,12 +14,14 @@ namespace {
}
VALUE Compile(VALUE self, VALUE source, VALUE source_name) {
HandleScope scope;
Local<String> src(rr_rb2v8(source)->ToString());
Local<String> src_name(rr_rb2v8(source_name)->ToString());
return rr_v8_ref_create(self, Script::Compile(src, src_name));
}
VALUE Run(VALUE self) {
HandleScope scope;
Local<Script> script(V8_Ref_Get<Script>(self));
Local<Value> result(script->Run());
return result.IsEmpty() ? Qnil : rr_v82rb(result);

View file

@ -38,6 +38,13 @@ namespace {
return Qnil;
}
Handle<Value> RubyInvocationCallback(const Arguments& args) {
VALUE code = (VALUE)External::Unwrap(args.Data());
VALUE rb_args = rr_v82rb(args);
VALUE result = rb_funcall(code, rb_intern("call"), 1, rb_args);
return rr_rb2v8(result);
}
namespace Obj {
/**
@ -238,17 +245,19 @@ namespace {
);
return Qnil;
}
VALUE SetCallAsFunctionHandler(VALUE self) {
HandleScope scope;
VALUE code = rb_block_proc();
if (NIL_P(code)) {
return Qnil;
}
obj(self)->SetCallAsFunctionHandler(RubyInvocationCallback, rr_v8_external_create(code));
return Qnil;
}
}
namespace Func {
Handle<Value> RubyInvocationCallback(const Arguments& args) {
VALUE code = (VALUE)External::Unwrap(args.Data());
VALUE rb_args = rr_v82rb(args);
VALUE result = rb_funcall(code, rb_intern("call"), 1, rb_args);
return rr_rb2v8(result);
}
VALUE New(VALUE function_template) {
HandleScope handles;
VALUE code = rb_block_proc();
@ -307,6 +316,7 @@ void rr_init_template() {
rr_define_method(ObjectTemplateClass, "NewInstance", Obj::NewInstance, 0);
rr_define_method(ObjectTemplateClass, "SetNamedPropertyHandler", Obj::SetNamedPropertyHandler, 5);
rr_define_method(ObjectTemplateClass, "SetIndexedPropertyHandler", Obj::SetIndexedPropertyHandler, 5);
rr_define_method(ObjectTemplateClass, "SetCallAsFunctionHandler", Obj::SetCallAsFunctionHandler, 0);
FunctionTemplateClass = rr_define_class("FunctionTemplate", Template);
rr_define_singleton_method(FunctionTemplateClass, "New", Func::New, 0);