diff --git a/ext/v8/rr.cpp b/ext/v8/rr.cpp index 2d7f03c..811ad77 100644 --- a/ext/v8/rr.cpp +++ b/ext/v8/rr.cpp @@ -1,7 +1,7 @@ #include "rr.h" -VALUE rr_define_class(const char *name) { +VALUE rr_define_class(const char *name, VALUE superclass) { VALUE V8 = rb_define_module("V8"); VALUE V8_C = rb_define_module_under(V8, "C"); - return rb_define_class_under(V8_C, name, rb_cObject); + return rb_define_class_under(V8_C, name, superclass); } \ No newline at end of file diff --git a/ext/v8/rr.h b/ext/v8/rr.h index 6f15fbd..e49b2d3 100644 --- a/ext/v8/rr.h +++ b/ext/v8/rr.h @@ -6,6 +6,6 @@ #define RR_DEFINE_METHOD(klass, name, impl, argc) rb_define_method(klass, name, (VALUE(*)(...))impl, argc) #define RR_DEFINE_SINGLETON_METHOD(object, name, impl, argc) rb_define_singleton_method(object, name, (VALUE(*)(...))impl, argc) -VALUE rr_define_class(const char *name); +VALUE rr_define_class(const char *name, VALUE superclass = rb_cObject); #endif \ No newline at end of file diff --git a/ext/v8/v8.cpp b/ext/v8/v8.cpp index 78d6bb7..0bf98ae 100644 --- a/ext/v8/v8.cpp +++ b/ext/v8/v8.cpp @@ -32,32 +32,12 @@ extern "C" { VALUE rb_mNative = rb_define_module_under(rb_mModule, "C"); rr_init_cxt(); - //native String - VALUE V8__C__String = rb_define_class_under(rb_mNative, "String", rb_cObject); - rb_define_singleton_method(V8__C__String, "new", (VALUE(*)(...)) v8_str_new, 1); - rb_define_method(V8__C__String, "to_s", (VALUE(*)(...)) v8_str_to_s, 0); + rr_init_str(); + rr_init_script(); + rr_init_template(); + rr_init_obj(); + rr_init_func(); - VALUE V8__C__Script = rb_define_class_under(rb_mNative, "Script", rb_cObject); - rb_define_singleton_method(V8__C__Script, "new", (VALUE(*)(...)) v8_script_new, 1); - rb_define_method(V8__C__Script, "Run", (VALUE(*)(...)) v8_script_Run, 0); - - VALUE V8__C__Template = rb_define_class_under(rb_mNative, "Template", rb_cObject); - rb_define_method(V8__C__Template, "Set", (VALUE(*)(...))v8_Template_Set, 2); - - VALUE V8__C__ObjectTemplate = rb_define_class_under(rb_mNative, "ObjectTemplate", V8__C__Template); - rb_define_singleton_method(V8__C__ObjectTemplate, "new", (VALUE(*)(...))v8_ObjectTemplate_New, 0); - - VALUE V8__C__FunctionTemplate = rb_define_class_under(rb_mNative, "FunctionTemplate", V8__C__Template); - rb_define_singleton_method(V8__C__FunctionTemplate, "new", (VALUE(*)(...))v8_FunctionTemplate_New, -1); - rb_define_method(V8__C__FunctionTemplate, "GetFunction", (VALUE(*)(...))v8_FunctionTemplate_GetFunction, 0); - - V8_C_Object = rb_define_class_under(rb_mNative, "Object", rb_cObject); - rb_define_singleton_method(V8_C_Object, "new", (VALUE(*)(...))v8_Object_New, 0); - rb_define_method(V8_C_Object, "Get", (VALUE(*)(...))v8_Object_Get, 1); - rb_define_method(V8_C_Object, "Set", (VALUE(*)(...))v8_Object_Set, 2); - rb_define_method(V8_C_Object, "GetPropertyNames", (VALUE(*)(...)) v8_Object_GetPropertyNames, 0); - rb_define_method(V8_C_Object, "ToString", (VALUE(*)(...)) v8_Object_ToString, 0); - rb_define_method(V8_C_Object, "context", (VALUE(*)(...)) v8_Object_context, 0); V8_C_Message = rb_define_class_under(rb_mNative, "Message", rb_cObject); rb_define_method(V8_C_Message, "Get", (VALUE(*)(...))v8_Message_Get, 0); @@ -68,9 +48,6 @@ extern "C" { rb_define_method(V8_C_Message, "GetEndPosition", (VALUE(*)(...)) v8_Message_GetEndPosition, 0); rb_define_method(V8_C_Message, "GetStartColumn", (VALUE(*)(...)) v8_Message_GetStartColumn, 0); rb_define_method(V8_C_Message, "GetEndColumn", (VALUE(*)(...)) v8_Message_GetEndColumn, 0); - - - V8_C_Function = rb_define_class_under(rb_mNative, "Function", V8_C_Object); - rb_define_method(V8_C_Function, "Call", (VALUE(*)(...))v8_C_Function_Call, -1); + } } diff --git a/ext/v8/v8_func.cpp b/ext/v8/v8_func.cpp index 8fb685d..69bd82b 100644 --- a/ext/v8/v8_func.cpp +++ b/ext/v8/v8_func.cpp @@ -1,11 +1,17 @@ #include "converters.h" #include "v8_func.h" +#include "v8_obj.h" using namespace v8; VALUE V8_C_Function; +void rr_init_func() { + V8_C_Function = rr_define_class("Function", V8_C_Object); + rb_define_method(V8_C_Function, "Call", (VALUE(*)(...))v8_C_Function_Call, -1); +} + VALUE V8_Wrap_Function(Handle f) { return V8_Ref_Create(V8_C_Function, f); } diff --git a/ext/v8/v8_func.h b/ext/v8/v8_func.h index d7992b6..755327a 100644 --- a/ext/v8/v8_func.h +++ b/ext/v8/v8_func.h @@ -1,12 +1,14 @@ #ifndef _RUBY_V8_FUNCTION_ #define _RUBY_V8_FUNCTION_ +#include "rr.h" #include "v8.h" -#include "ruby.h" #include "v8_ref.h" extern VALUE V8_C_Function; +void rr_init_func(); + VALUE V8_Wrap_Function(v8::Handle f); VALUE v8_C_Function_Call(int argc, VALUE *argv, VALUE self); diff --git a/ext/v8/v8_obj.cpp b/ext/v8/v8_obj.cpp index 0c1c33e..4de69af 100644 --- a/ext/v8/v8_obj.cpp +++ b/ext/v8/v8_obj.cpp @@ -8,6 +8,16 @@ using namespace v8; VALUE V8_C_Object; +void rr_init_obj() { + V8_C_Object = rr_define_class("Object"); + rb_define_singleton_method(V8_C_Object, "new", (VALUE(*)(...))v8_Object_New, 0); + rb_define_method(V8_C_Object, "Get", (VALUE(*)(...))v8_Object_Get, 1); + rb_define_method(V8_C_Object, "Set", (VALUE(*)(...))v8_Object_Set, 2); + rb_define_method(V8_C_Object, "GetPropertyNames", (VALUE(*)(...)) v8_Object_GetPropertyNames, 0); + rb_define_method(V8_C_Object, "ToString", (VALUE(*)(...)) v8_Object_ToString, 0); + rb_define_method(V8_C_Object, "context", (VALUE(*)(...)) v8_Object_context, 0); +} + namespace { Local unwrap(VALUE robj) { return V8_Ref_Get(robj); diff --git a/ext/v8/v8_obj.h b/ext/v8/v8_obj.h index 498db4a..dfe1d94 100644 --- a/ext/v8/v8_obj.h +++ b/ext/v8/v8_obj.h @@ -1,10 +1,12 @@ #ifndef _RUBY_V8_OBJECT_ #define _RUBY_V8_OBJECT_ -#include "ruby.h" +#include "rr.h" extern VALUE V8_C_Object; +void rr_init_obj(); + VALUE v8_Object_New(VALUE clazz); VALUE v8_Object_Get(VALUE self, VALUE key); VALUE v8_Object_Set(VALUE self, VALUE key, VALUE value); diff --git a/ext/v8/v8_script.cpp b/ext/v8/v8_script.cpp index 1a89508..4d8e0a2 100644 --- a/ext/v8/v8_script.cpp +++ b/ext/v8/v8_script.cpp @@ -5,6 +5,11 @@ using namespace v8; +void rr_init_script() { + VALUE Script = rr_define_class("Script"); + RR_DEFINE_SINGLETON_METHOD(Script, "new", v8_script_new, 1); + RR_DEFINE_METHOD(Script, "Run", v8_script_Run, 0); +} VALUE v8_script_new(VALUE self, VALUE source) { HandleScope handles; diff --git a/ext/v8/v8_script.h b/ext/v8/v8_script.h index f2aed4a..b4eb1a3 100644 --- a/ext/v8/v8_script.h +++ b/ext/v8/v8_script.h @@ -1,7 +1,9 @@ #ifndef _RUBY_V8_SCRIPT_ #define _RUBY_V8_SCRIPT_ -#include "ruby.h" +#include "rr.h" + +void rr_init_script(); VALUE v8_script_new(VALUE self, VALUE source); VALUE v8_script_Run(VALUE self); diff --git a/ext/v8/v8_str.cpp b/ext/v8/v8_str.cpp index faf5d14..a08dffc 100644 --- a/ext/v8/v8_str.cpp +++ b/ext/v8/v8_str.cpp @@ -5,6 +5,12 @@ using namespace v8; +void rr_init_str() { + VALUE String = rr_define_class("String"); + RR_DEFINE_SINGLETON_METHOD(String, "new", v8_str_new, 1); + RR_DEFINE_METHOD(String, "to_s", v8_str_to_s, 0); +} + VALUE v8_str_new(VALUE clazz, VALUE str) { HandleScope handles; return V8_Ref_Create(clazz, String::New(RSTRING_PTR(str))); diff --git a/ext/v8/v8_str.h b/ext/v8/v8_str.h index 5738bab..2257b9c 100644 --- a/ext/v8/v8_str.h +++ b/ext/v8/v8_str.h @@ -1,7 +1,9 @@ #ifndef _RUBY_V8_STR_ #define _RUBY_V8_STR_ -#include "ruby.h" +#include "rr.h" + +void rr_init_str(); VALUE v8_str_new(VALUE clazz, VALUE str); VALUE v8_str_to_s(VALUE self); diff --git a/ext/v8/v8_template.cpp b/ext/v8/v8_template.cpp index 96bb04c..12b72ec 100644 --- a/ext/v8/v8_template.cpp +++ b/ext/v8/v8_template.cpp @@ -8,6 +8,20 @@ using namespace v8; + +void rr_init_template() { + VALUE Template = rr_define_class("Template"); + rb_define_method(Template, "Set", (VALUE(*)(...))v8_Template_Set, 2); + + VALUE ObjectTemplate = rr_define_class("ObjectTemplate", Template); + rb_define_singleton_method(ObjectTemplate, "new", (VALUE(*)(...))v8_ObjectTemplate_New, 0); + + VALUE FunctionTemplate = rr_define_class("FunctionTemplate", Template); + rb_define_singleton_method(FunctionTemplate, "new", (VALUE(*)(...))v8_FunctionTemplate_New, -1); + rb_define_method(FunctionTemplate, "GetFunction", (VALUE(*)(...))v8_FunctionTemplate_GetFunction, 0); + +} + Local Racer_Create_V8_ObjectTemplate(VALUE value) { Local tmpl = ObjectTemplate::New(); // tmpl->SetInternalFieldCount(2); diff --git a/ext/v8/v8_template.h b/ext/v8/v8_template.h index 68060b3..dd18d04 100644 --- a/ext/v8/v8_template.h +++ b/ext/v8/v8_template.h @@ -1,6 +1,10 @@ #ifndef _RUBY_V8_TEMPLATE_ #define _RUBY_V8_TEMPLATE_ +#include "rr.h" + +void rr_init_template(); + v8::Local Racer_Create_V8_ObjectTemplate(VALUE object); VALUE v8_Template_Set(VALUE self, VALUE name, VALUE value);