therubyracer/ext/v8/template.cc

175 lines
6.4 KiB
C++

#include "rr.h"
namespace rr {
void Template::Init() {
ClassBuilder("Template").
defineMethod("Set", &Set);
ObjectTemplate::Init();
FunctionTemplate::Init();
}
VALUE Template::Set(int argc, VALUE argv[], VALUE self) {
VALUE name; VALUE value; VALUE attributes;
rb_scan_args(argc, argv, "21", &name, &value, &attributes);
Void(Template(self)->Set(*String(name), *Value(value), PropertyAttribute(attributes)));
}
void ObjectTemplate::Init() {
ClassBuilder("ObjectTemplate", "Template").
defineSingletonMethod("New", &New).
defineMethod("NewInstance", &NewInstance).
defineMethod("SetAccessor", &SetAccessor).
defineMethod("SetNamedPropertyHandler", &SetNamedPropertyHandler).
defineMethod("SetIndexedPropertyHandler", &SetIndexedPropertyHandler).
defineMethod("SetCallAsFunctionHandler", &SetCallAsFunctionHandler).
defineMethod("MarkAsUndetectable", &MarkAsUndetectable).
defineMethod("SetAccessCheckCallbacks", &SetAccessCheckCallbacks).
defineMethod("InternalFieldCount", &InternalFieldCount).
defineMethod("SetInternalFieldCount", &SetInternalFieldCount).
store(&Class);
}
VALUE ObjectTemplate::New(VALUE self) {
return ObjectTemplate(v8::ObjectTemplate::New());
}
VALUE ObjectTemplate::NewInstance(VALUE self) {
return Object(ObjectTemplate(self)->NewInstance());
}
VALUE ObjectTemplate::SetAccessor(int argc, VALUE argv[], VALUE self) {
VALUE name; VALUE get; VALUE set; VALUE data; VALUE settings; VALUE attribs;
rb_scan_args(argc, argv, "24", &name, &get, &set, &data, &settings, &attribs);
Accessor accessor(get, set, data);
ObjectTemplate(self)->SetAccessor(
String(name),
accessor.accessorGetter(),
accessor.accessorSetter(),
accessor,
AccessControl(settings),
PropertyAttribute(attribs)
);
Void();
}
VALUE ObjectTemplate::SetNamedPropertyHandler(int argc, VALUE argv[], VALUE self) {
VALUE get; VALUE set; VALUE query; VALUE deleter; VALUE enumerator; VALUE data;
rb_scan_args(argc, argv, "15", &get, &set, &query, &deleter, &enumerator, &data);
Accessor accessor(get,set,query,deleter,enumerator,data);
ObjectTemplate(self)->SetNamedPropertyHandler(
accessor.namedPropertyGetter(),
accessor.namedPropertySetter(),
accessor.namedPropertyQuery(),
accessor.namedPropertyDeleter(),
accessor.namedPropertyEnumerator(),
accessor
);
Void();
}
VALUE ObjectTemplate::SetIndexedPropertyHandler(int argc, VALUE argv[], VALUE self) {
VALUE get; VALUE set; VALUE query; VALUE deleter; VALUE enumerator; VALUE data;
rb_scan_args(argc, argv, "15", &get, &set, &query, &deleter, &enumerator, &data);
Accessor accessor(get,set,query,deleter,enumerator,data);
ObjectTemplate(self)->SetIndexedPropertyHandler(
accessor.indexedPropertyGetter(),
accessor.indexedPropertySetter(),
accessor.indexedPropertyQuery(),
accessor.indexedPropertyDeleter(),
accessor.indexedPropertyEnumerator(),
accessor
);
Void();
}
VALUE ObjectTemplate::SetCallAsFunctionHandler(int argc, VALUE argv[], VALUE self) {
VALUE callback; VALUE data;
rb_scan_args(argc, argv, "11", &callback, &data);
Invocation invocation(callback, data);
Void(ObjectTemplate(self)->SetCallAsFunctionHandler(invocation, invocation));
}
VALUE ObjectTemplate::MarkAsUndetectable(VALUE self) {
Void(ObjectTemplate(self)->MarkAsUndetectable());
}
VALUE ObjectTemplate::SetAccessCheckCallbacks(int argc, VALUE argv[], VALUE self) {
VALUE named_handler; VALUE indexed_handler; VALUE data; VALUE turned_on_by_default;
rb_scan_args(argc, argv, "22", &named_handler, &indexed_handler, &data, &turned_on_by_default);
return not_implemented("ObjectTemplate::SetAccessCheckCallbacks");
}
VALUE ObjectTemplate::InternalFieldCount(VALUE self) {
return INT2FIX(ObjectTemplate(self)->InternalFieldCount());
}
VALUE ObjectTemplate::SetInternalFieldCount(VALUE self, VALUE count) {
Void(ObjectTemplate(self)->SetInternalFieldCount(NUM2INT(count)));
}
void FunctionTemplate::Init() {
ClassBuilder("FunctionTemplate", "Template").
defineSingletonMethod("New", &New).
defineMethod("GetFunction", &GetFunction).
defineMethod("SetCallHandler", &SetCallHandler).
defineMethod("InstanceTemplate", &InstanceTemplate).
defineMethod("Inherit", &Inherit).
defineMethod("PrototypeTemplate", &PrototypeTemplate).
defineMethod("SetClassName", &SetClassName).
defineMethod("SetHiddenPrototype", &SetHiddenPrototype).
defineMethod("ReadOnlyPrototype", &ReadOnlyPrototype).
defineMethod("HasInstance", &HasInstance).
store(&Class);
}
VALUE FunctionTemplate::New(int argc, VALUE argv[], VALUE self) {
VALUE code; VALUE data; VALUE signature;
rb_scan_args(argc, argv, "03", &code, &data, &signature);
if (RTEST(code)) {
Invocation invocation(code, data);
return FunctionTemplate(v8::FunctionTemplate::New(invocation, invocation, Signature(signature)));
} else {
return FunctionTemplate(v8::FunctionTemplate::New());
}
}
VALUE FunctionTemplate::GetFunction(VALUE self) {
return Function(FunctionTemplate(self)->GetFunction());
}
VALUE FunctionTemplate::SetCallHandler(int argc, VALUE argv[], VALUE self) {
VALUE code; VALUE data;
rb_scan_args(argc, argv, "11", &code, &data);
Invocation invocation(code, data);
Void(FunctionTemplate(self)->SetCallHandler(invocation, invocation));
}
VALUE FunctionTemplate::InstanceTemplate(VALUE self) {
return ObjectTemplate(FunctionTemplate(self)->InstanceTemplate());
}
VALUE FunctionTemplate::Inherit(VALUE self, VALUE parent) {
Void(FunctionTemplate(self)->Inherit(FunctionTemplate(parent)));
}
VALUE FunctionTemplate::PrototypeTemplate(VALUE self) {
return ObjectTemplate(FunctionTemplate(self)->PrototypeTemplate());
}
VALUE FunctionTemplate::SetClassName(VALUE self, VALUE name) {
Void(FunctionTemplate(self)->SetClassName(String(name)));
}
VALUE FunctionTemplate::SetHiddenPrototype(VALUE self, VALUE value) {
Void(FunctionTemplate(self)->SetHiddenPrototype(Bool(value)));
}
VALUE FunctionTemplate::ReadOnlyPrototype(VALUE self) {
Void(FunctionTemplate(self)->ReadOnlyPrototype());
}
VALUE FunctionTemplate::HasInstance(VALUE self, VALUE object) {
return Bool(FunctionTemplate(self)->HasInstance(Value(object)));
}
}