therubyracer-freebsd 0.10.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (90) hide show
  1. data/.gitignore +13 -0
  2. data/.rspec +1 -0
  3. data/.travis.yml +8 -0
  4. data/.yardopts +1 -0
  5. data/Changelog.md +231 -0
  6. data/Gemfile +3 -0
  7. data/README.md +167 -0
  8. data/Rakefile +26 -0
  9. data/bin/therubyracer +11 -0
  10. data/ext/v8/extconf.rb +26 -0
  11. data/ext/v8/rr.cpp +189 -0
  12. data/ext/v8/rr.h +41 -0
  13. data/ext/v8/v8.cpp +48 -0
  14. data/ext/v8/v8_array.cpp +48 -0
  15. data/ext/v8/v8_array.h +8 -0
  16. data/ext/v8/v8_callbacks.cpp +81 -0
  17. data/ext/v8/v8_callbacks.h +8 -0
  18. data/ext/v8/v8_context.cpp +92 -0
  19. data/ext/v8/v8_context.h +6 -0
  20. data/ext/v8/v8_date.cpp +40 -0
  21. data/ext/v8/v8_date.h +6 -0
  22. data/ext/v8/v8_debug.cpp +17 -0
  23. data/ext/v8/v8_debug.h +6 -0
  24. data/ext/v8/v8_exception.cpp +133 -0
  25. data/ext/v8/v8_exception.h +11 -0
  26. data/ext/v8/v8_external.cpp +70 -0
  27. data/ext/v8/v8_external.h +8 -0
  28. data/ext/v8/v8_function.cpp +69 -0
  29. data/ext/v8/v8_function.h +11 -0
  30. data/ext/v8/v8_handle.cpp +186 -0
  31. data/ext/v8/v8_handle.h +48 -0
  32. data/ext/v8/v8_locker.cpp +139 -0
  33. data/ext/v8/v8_locker.h +6 -0
  34. data/ext/v8/v8_message.cpp +67 -0
  35. data/ext/v8/v8_message.h +10 -0
  36. data/ext/v8/v8_object.cpp +122 -0
  37. data/ext/v8/v8_object.h +10 -0
  38. data/ext/v8/v8_script.cpp +36 -0
  39. data/ext/v8/v8_script.h +8 -0
  40. data/ext/v8/v8_string.cpp +52 -0
  41. data/ext/v8/v8_string.h +9 -0
  42. data/ext/v8/v8_template.cpp +344 -0
  43. data/ext/v8/v8_template.h +8 -0
  44. data/ext/v8/v8_try_catch.cpp +70 -0
  45. data/ext/v8/v8_try_catch.h +5 -0
  46. data/ext/v8/v8_v8.cpp +34 -0
  47. data/ext/v8/v8_v8.h +6 -0
  48. data/ext/v8/v8_value.cpp +175 -0
  49. data/ext/v8/v8_value.h +10 -0
  50. data/ext/v8/v8_weakref.cpp +61 -0
  51. data/ext/v8/v8_weakref.h +29 -0
  52. data/lib/v8.rb +23 -0
  53. data/lib/v8/access.rb +92 -0
  54. data/lib/v8/array.rb +17 -0
  55. data/lib/v8/c/locker.rb +18 -0
  56. data/lib/v8/cli.rb +133 -0
  57. data/lib/v8/context.rb +111 -0
  58. data/lib/v8/error.rb +130 -0
  59. data/lib/v8/function.rb +44 -0
  60. data/lib/v8/object.rb +69 -0
  61. data/lib/v8/portal.rb +86 -0
  62. data/lib/v8/portal/caller.rb +37 -0
  63. data/lib/v8/portal/constructor.rb +98 -0
  64. data/lib/v8/portal/function.rb +63 -0
  65. data/lib/v8/portal/interceptors.rb +152 -0
  66. data/lib/v8/portal/proxies.rb +151 -0
  67. data/lib/v8/portal/templates.rb +73 -0
  68. data/lib/v8/stack.rb +66 -0
  69. data/lib/v8/tap.rb +9 -0
  70. data/lib/v8/version.rb +3 -0
  71. data/spec/ext/array_spec.rb +15 -0
  72. data/spec/ext/cxt_spec.rb +57 -0
  73. data/spec/ext/ext_spec_helper.rb +27 -0
  74. data/spec/ext/func_spec.rb +64 -0
  75. data/spec/ext/object_spec.rb +10 -0
  76. data/spec/ext/string_spec.rb +11 -0
  77. data/spec/ext/try_catch_spec.rb +60 -0
  78. data/spec/redjs_spec.rb +9 -0
  79. data/spec/spec_helper.rb +9 -0
  80. data/spec/v8/error_spec.rb +131 -0
  81. data/spec/v8/portal/proxies_spec.rb +106 -0
  82. data/specmem/handle_memspec.rb +41 -0
  83. data/specmem/object_memspec.rb +14 -0
  84. data/specmem/proxies_memspec.rb +49 -0
  85. data/specmem/spec_helper.rb +24 -0
  86. data/specthread/spec_helper.rb +2 -0
  87. data/specthread/threading_spec.rb +13 -0
  88. data/thefrontside.png +0 -0
  89. data/therubyracer.gemspec +27 -0
  90. metadata +183 -0
@@ -0,0 +1,8 @@
1
+ #ifndef _RR_V8_CALLBACKS_
2
+ #define _RR_V8_CALLBACKS_
3
+ #include "rr.h"
4
+ void rr_init_v8_callbacks();
5
+ VALUE rr_v82rb(const v8::AccessorInfo& info);
6
+ VALUE rr_v82rb(const v8::Arguments& arguments);
7
+
8
+ #endif
@@ -0,0 +1,92 @@
1
+ #include "rr.h"
2
+ #include "v8_handle.h"
3
+ #include "v8_context.h"
4
+ #include "v8_message.h"
5
+ #include "v8_template.h"
6
+ #include "v8_external.h"
7
+
8
+ using namespace v8;
9
+
10
+ namespace {
11
+
12
+ VALUE ContextClass;
13
+
14
+ Persistent<Context>& unwrap(VALUE value) {
15
+ return rr_v8_handle<Context>(value);
16
+ }
17
+
18
+ VALUE New(int argc, VALUE *argv, VALUE self) {
19
+ HandleScope handles;
20
+ VALUE global_template; VALUE global_object;
21
+ rb_scan_args(argc,argv, "02", &global_template, &global_object);
22
+ Handle<ObjectTemplate> v8_global_template(NIL_P(global_template) ? Handle<ObjectTemplate>() : rr_v8_handle<ObjectTemplate>(global_template));
23
+ Handle<Value> v8_global_object(NIL_P(global_object) ? Handle<Value>() : rr_v8_handle<Value>(global_object));
24
+ Persistent<Context> cxt(Context::New(0, v8_global_template, v8_global_object));
25
+ VALUE ref = rr_v8_handle_new(self, cxt);
26
+ cxt.Dispose();
27
+ return ref;
28
+ }
29
+
30
+ VALUE InContext(VALUE self) {
31
+ return Context::InContext() ? Qtrue : Qfalse;
32
+ }
33
+
34
+ VALUE GetEntered(VALUE self) {
35
+ HandleScope handles;
36
+ if (Context::InContext()) {
37
+ Local<Context> current = Context::GetEntered();
38
+ return rr_v8_handle_new(self, current);
39
+ } else {
40
+ return Qnil;
41
+ }
42
+ }
43
+
44
+ VALUE Global(VALUE self) {
45
+ HandleScope handles;
46
+ return rr_v82rb(unwrap(self)->Global());
47
+ }
48
+
49
+ VALUE Enter(VALUE self) {
50
+ HandleScope handles;
51
+ unwrap(self)->Enter();
52
+ return self;
53
+ }
54
+
55
+ VALUE Exit(VALUE self) {
56
+ HandleScope handles;
57
+ unwrap(self)->Exit();
58
+ return self;
59
+ }
60
+
61
+ VALUE IsEntered(VALUE self) {
62
+ HandleScope handles;
63
+ if (Context::InContext()) {
64
+ return rr_v82rb(unwrap(self) == Context::GetEntered());
65
+ } else {
66
+ return Qfalse;
67
+ }
68
+ }
69
+ VALUE GetData(VALUE self) {
70
+ HandleScope scope;
71
+ return rr_v82rb(unwrap(self)->GetData());
72
+ }
73
+ VALUE SetData(VALUE self, VALUE data) {
74
+ HandleScope scope;
75
+ unwrap(self)->SetData(rr_rb2v8(data)->ToString());
76
+ return Qnil;
77
+ }
78
+ }
79
+
80
+ void rr_init_context() {
81
+ ContextClass = rr_define_class("Context", rr_v8_handle_class());
82
+ rr_define_singleton_method(ContextClass, "New", New, -1);
83
+ rr_define_singleton_method(ContextClass, "InContext", InContext, 0);
84
+ rr_define_singleton_method(ContextClass, "GetEntered", GetEntered, 0);
85
+ rr_define_method(ContextClass, "Global", Global, 0);
86
+ rr_define_method(ContextClass, "Enter", Enter, 0);
87
+ rr_define_method(ContextClass, "Exit", Exit, 0);
88
+ rr_define_method(ContextClass, "IsEntered", IsEntered, 0);
89
+ rr_define_method(ContextClass, "GetData", GetData, 0);
90
+ rr_define_method(ContextClass, "SetData", SetData, 1);
91
+ }
92
+
@@ -0,0 +1,6 @@
1
+ #ifndef _RUBY_V8_CXT_
2
+ #define _RUBY_V8_CXT_
3
+
4
+ void rr_init_context();
5
+
6
+ #endif
@@ -0,0 +1,40 @@
1
+ #include "rr.h"
2
+ #include "v8_date.h"
3
+ #include "v8_value.h"
4
+ #include "v8_handle.h"
5
+ #include "v8_object.h"
6
+
7
+ using namespace v8;
8
+
9
+ namespace {
10
+
11
+ VALUE DateClass;
12
+
13
+ VALUE New(VALUE self, VALUE time) {
14
+ HandleScope scope;
15
+ return rr_v8_handle_new(self, Date::New(NUM2DBL(time)));
16
+ }
17
+
18
+ // Override Value::NumberValue in order to ensure that we call the more specific and optimized
19
+ // Number Value in v8::Date
20
+ VALUE NumberValue(VALUE self) {
21
+ Persistent<Date> date = rr_v8_handle<Date>(self);
22
+ return rr_v82rb(date->NumberValue());
23
+ }
24
+
25
+ VALUE DateTimeConfigurationChangeNotification(VALUE self) {
26
+ Date::DateTimeConfigurationChangeNotification();
27
+ return Qnil;
28
+ }
29
+ }
30
+
31
+ void rr_init_v8_date() {
32
+ DateClass = rr_define_class("Date", rr_v8_value_class());
33
+ rr_define_singleton_method(DateClass, "New", New, 1);
34
+ rr_define_singleton_method(DateClass, "DateTimeConfigurationChangeNotification", DateTimeConfigurationChangeNotification, 0);
35
+ rr_define_method(DateClass, "NumberValue", NumberValue, 0);
36
+ }
37
+
38
+ VALUE rr_reflect_v8_date(Handle<Value> value) {
39
+ return rr_reflect_v8_object_as(Handle<Object>::Cast(value), DateClass);
40
+ }
@@ -0,0 +1,6 @@
1
+ #ifndef _RR_V8_DATE_
2
+ #define _RR_V8_DATE_
3
+
4
+ void rr_init_v8_date();
5
+ VALUE rr_reflect_v8_date(v8::Handle<v8::Value> value);
6
+ #endif
@@ -0,0 +1,17 @@
1
+ #include "rr.h"
2
+ #include "v8_debug.h"
3
+ #include "v8-debug.h"
4
+
5
+ using namespace v8;
6
+
7
+ namespace {
8
+
9
+ VALUE EnableAgent(VALUE self, VALUE application_name, VALUE port) {
10
+ return rr_v82rb(v8::Debug::EnableAgent(RSTRING_PTR(application_name), NUM2INT(port), false));
11
+ }
12
+ }
13
+
14
+ void rr_init_v8_debug() {
15
+ VALUE DebugModule = rr_define_module("Debug");
16
+ rr_define_singleton_method(DebugModule, "EnableAgent", EnableAgent, 2);
17
+ }
@@ -0,0 +1,6 @@
1
+ #ifndef _RR_V8_DEBUG_
2
+ #define _RR_V8_DEBUG_
3
+
4
+ void rr_init_v8_debug();
5
+
6
+ #endif
@@ -0,0 +1,133 @@
1
+ #include "v8_exception.h"
2
+ #include "rr.h"
3
+ #include "v8_handle.h"
4
+ // #include "execinfo.h"
5
+ // #include "signal.h"
6
+
7
+ using namespace v8;
8
+ namespace {
9
+
10
+ static void* stack[20];
11
+
12
+ void fatal(const char* location, const char* message) {
13
+ rb_raise(rb_eFatal, "%s: %s", location, message);
14
+ }
15
+ // void segfault(int sig) {
16
+ // fprintf(stderr, "segfault: game over.\n");
17
+ // int size = backtrace(stack, 20);
18
+ // backtrace_symbols_fd(stack, size, 2);
19
+ // exit(1);
20
+ // }
21
+ VALUE _ThrowException(VALUE rbmod, VALUE value) {
22
+ HandleScope scope;
23
+ Handle<Value> err = rr_rb2v8(value);
24
+ return rr_v82rb(ThrowException(err));
25
+ }
26
+ VALUE RangeError(VALUE rbclass, VALUE value) {
27
+ HandleScope scope;
28
+ return rr_v82rb(Exception::RangeError(rr_rb2v8(value)->ToString()));
29
+ }
30
+ VALUE ReferenceError(VALUE rbclass, VALUE value) {
31
+ HandleScope scope;
32
+ return rr_v82rb(Exception::ReferenceError(rr_rb2v8(value)->ToString()));
33
+ }
34
+ VALUE SyntaxError(VALUE rbclass, VALUE value) {
35
+ HandleScope scope;
36
+ return rr_v82rb(Exception::SyntaxError(rr_rb2v8(value)->ToString()));
37
+ }
38
+ VALUE Error(VALUE rbclass, VALUE value) {
39
+ HandleScope scope;
40
+ return rr_v82rb(Exception::Error(rr_rb2v8(value)->ToString()));
41
+ }
42
+
43
+ VALUE StackTraceClass;
44
+ VALUE StackFrameClass;
45
+ namespace Trace {
46
+
47
+ Persistent<StackTrace>& trace(VALUE value) {
48
+ return rr_v8_handle<StackTrace>(value);
49
+ }
50
+ VALUE GetFrame(VALUE self, VALUE index) {
51
+ HandleScope scope;
52
+ return rr_v82rb(trace(self)->GetFrame(NUM2UINT(index)));
53
+ }
54
+ VALUE GetFrameCount(VALUE self) {
55
+ HandleScope scope;
56
+ return rr_v82rb(trace(self)->GetFrameCount());
57
+ }
58
+ VALUE AsArray(VALUE self) {
59
+ return rr_v82rb(trace(self)->AsArray());
60
+ }
61
+ VALUE CurrentStackTrace(VALUE self, VALUE frame_limit) {
62
+ return rr_v82rb(StackTrace::CurrentStackTrace(NUM2INT(frame_limit)));
63
+ }
64
+ }
65
+
66
+ namespace Frame {
67
+ Persistent<StackFrame>& frame(VALUE value) {
68
+ return rr_v8_handle<StackFrame>(value);
69
+ }
70
+ VALUE GetLineNumber(VALUE self) {
71
+ HandleScope scope;
72
+ return rr_v82rb(frame(self)->GetLineNumber());
73
+ }
74
+ VALUE GetColumn(VALUE self) {
75
+ HandleScope scope;
76
+ return rr_v82rb(frame(self)->GetColumn());
77
+ }
78
+ VALUE GetScriptName(VALUE self) {
79
+ HandleScope scope;
80
+ return rr_v82rb(frame(self)->GetScriptName());
81
+ }
82
+ VALUE GetFunctionName(VALUE self) {
83
+ HandleScope scope;
84
+ return rr_v82rb(frame(self)->GetFunctionName());
85
+ }
86
+ VALUE IsEval(VALUE self) {
87
+ HandleScope scope;
88
+ return rr_v82rb(frame(self)->IsEval());
89
+ }
90
+ VALUE IsConstructor(VALUE self) {
91
+ HandleScope scope;
92
+ return rr_v82rb(frame(self)->IsConstructor());
93
+ }
94
+ }
95
+
96
+ }
97
+
98
+ void rr_init_v8_exception() {
99
+ VALUE V8 = rb_define_module("V8");
100
+ VALUE V8_C = rb_define_module_under(V8, "C");
101
+ rr_define_singleton_method(V8_C, "ThrowException", _ThrowException, 1);
102
+
103
+ VALUE ExceptionClass = rr_define_class("Exception");
104
+ rr_define_singleton_method(ExceptionClass, "RangeError", RangeError, 1);
105
+ rr_define_singleton_method(ExceptionClass, "ReferenceError", ReferenceError, 1);
106
+ rr_define_singleton_method(ExceptionClass, "SyntaxError", SyntaxError, 1);
107
+ rr_define_singleton_method(ExceptionClass, "Error", Error, 1);
108
+
109
+ StackTraceClass = rr_define_class("StackTrace", rr_v8_handle_class());
110
+ rr_define_singleton_method(StackTraceClass, "CurrentStackTrace", Trace::CurrentStackTrace, 1);
111
+ rr_define_method(StackTraceClass, "GetFrame", Trace::GetFrame, 1);
112
+ rr_define_method(StackTraceClass, "GetFrameCount", Trace::GetFrameCount, 0);
113
+ rr_define_method(StackTraceClass, "AsArray", Trace::AsArray, 0);
114
+
115
+ StackFrameClass = rr_define_class("StackFrame", rr_v8_handle_class());
116
+ rr_define_method(StackFrameClass, "GetLineNumber", Frame::GetLineNumber, 0);
117
+ rr_define_method(StackFrameClass, "GetColumn", Frame::GetColumn, 0);
118
+ rr_define_method(StackFrameClass, "GetScriptName", Frame::GetScriptName, 0);
119
+ rr_define_method(StackFrameClass, "GetFunctionName", Frame::GetFunctionName, 0);
120
+ rr_define_method(StackFrameClass, "IsEval", Frame::IsEval, 0);
121
+ rr_define_method(StackFrameClass, "IsConstructor", Frame::IsConstructor, 0);
122
+
123
+ v8::V8::SetFatalErrorHandler(fatal);
124
+ //comment this in for debugging.
125
+ // signal(SIGSEGV, segfault);
126
+ }
127
+
128
+ VALUE rr_reflect_v8_stacktrace(Handle<StackTrace> value) {
129
+ return rr_v8_handle_new(StackTraceClass, value);
130
+ }
131
+ VALUE rr_reflect_v8_stackframe(Handle<StackFrame> value) {
132
+ return rr_v8_handle_new(StackFrameClass, value);
133
+ }
@@ -0,0 +1,11 @@
1
+ #ifndef _RR_V8_EXCEPTION_
2
+ #define _RR_V8_EXCEPTION_
3
+
4
+ #include "v8.h"
5
+ #include "ruby.h"
6
+
7
+ void rr_init_v8_exception();
8
+ VALUE rr_reflect_v8_stacktrace(v8::Handle<v8::StackTrace> value);
9
+ VALUE rr_reflect_v8_stackframe(v8::Handle<v8::StackFrame> value);
10
+
11
+ #endif
@@ -0,0 +1,70 @@
1
+ #include "rr.h"
2
+ #include "v8_external.h"
3
+
4
+ #include "v8_handle.h"
5
+ #include "v8_value.h"
6
+ using namespace v8;
7
+
8
+ namespace {
9
+ VALUE ExternalClass;
10
+ VALUE references;
11
+
12
+ struct Weaklink {
13
+ bool finalized_from_rb;
14
+ bool finalized_from_v8;
15
+ VALUE target;
16
+ };
17
+
18
+ VALUE Weaklink_finalized_from_ruby(VALUE object_id, VALUE data) {
19
+ Weaklink* link = 0;
20
+ Data_Get_Struct(data, struct Weaklink, link);
21
+ link->finalized_from_rb = true;
22
+ if (link->finalized_from_v8) {
23
+ delete link;
24
+ }
25
+ return Qnil;
26
+ }
27
+ void Weaklink_finalized_from_v8(Persistent<Value> value, void* data) {
28
+ Weaklink* link = (Weaklink*)data;
29
+ link->finalized_from_v8 = true;
30
+ if (link->finalized_from_rb) {
31
+ delete link;
32
+ }
33
+ value.Dispose();
34
+ }
35
+
36
+ VALUE New(VALUE self, VALUE value) {
37
+ HandleScope scope;
38
+ Weaklink* link = new Weaklink();
39
+ link->finalized_from_v8 = false;
40
+ link->finalized_from_rb = false;
41
+ link->target = value;
42
+ Persistent<External> external = Persistent<External>::New(External::New((void*)link));
43
+ external.MakeWeak(link,Weaklink_finalized_from_v8);
44
+ VALUE finalizer_data = Data_Wrap_Struct(rb_cObject, 0, 0, link);
45
+ rr_define_finalizer(value, (void*)Weaklink_finalized_from_ruby, finalizer_data);
46
+ return rr_v8_handle_new(self, external);
47
+ }
48
+
49
+ VALUE _Value(VALUE self) {
50
+ HandleScope scope;
51
+ Weaklink* link = (Weaklink*)rr_v8_handle<External>(self)->Value();
52
+ if (link->finalized_from_rb) {
53
+ rb_warn("an active v8::External wraps a VALUE that has already been finalized! This is not good.\n");
54
+ return Qnil;
55
+ } else {
56
+ return link->target;
57
+ }
58
+ return (VALUE)rr_v8_handle<External>(self)->Value();
59
+ }
60
+ }
61
+
62
+ void rr_init_v8_external() {
63
+ ExternalClass = rr_define_class("External", rr_v8_value_class());
64
+ rr_define_singleton_method(ExternalClass, "New", New, 1);
65
+ rr_define_method(ExternalClass, "Value", _Value, 0);
66
+ }
67
+
68
+ VALUE rr_reflect_v8_external(Handle<Value> external) {
69
+ return rr_v8_handle_new(ExternalClass, external);
70
+ }
@@ -0,0 +1,8 @@
1
+ #ifndef _RR_V8_EXTERNAL_
2
+ #define _RR_V8_EXTERNAL_
3
+
4
+ #include "rr.h"
5
+
6
+ void rr_init_v8_external();
7
+ VALUE rr_reflect_v8_external(v8::Handle<v8::Value> value);
8
+ #endif
@@ -0,0 +1,69 @@
1
+
2
+ #include <vector>
3
+ #include "v8_function.h"
4
+ #include "v8_object.h"
5
+ #include "v8_handle.h"
6
+
7
+ using namespace v8;
8
+
9
+ namespace {
10
+ VALUE FunctionClass;
11
+
12
+ Persistent<Function>& unwrap(VALUE value) {
13
+ return rr_v8_handle<Function>(value);
14
+ }
15
+ VALUE Call(VALUE self, VALUE recv, VALUE arguments) {
16
+ HandleScope handles;
17
+ if (!Context::InContext()) {
18
+ rb_raise(rb_eScriptError, "no open V8 Context in V8::C::Function::Call()");
19
+ return Qnil;
20
+ }
21
+ Handle<Function> function = unwrap(self);
22
+ Local<Object> thisObj = rr_rb2v8(recv)->ToObject();
23
+ Handle<Array> args = rr_v8_handle<Array>(arguments);
24
+ int argc = args->Length();
25
+ std::vector< Handle<Value> > argv (argc);
26
+ for (int i = 0; i < argc; i++) {
27
+ argv[i] = args->Get(i);
28
+ }
29
+ return rr_v82rb(function->Call(thisObj, argc, &argv[0]));
30
+ }
31
+
32
+ VALUE NewInstance(VALUE self, VALUE arguments) {
33
+ HandleScope scope;
34
+ Handle<Function> function = unwrap(self);
35
+ Handle<Array> args = rr_v8_handle<Array>(arguments);
36
+ int argc = args->Length();
37
+ std::vector< Handle<Value> > argv (argc);
38
+ for (int i = 0; i < argc; i++) {
39
+ argv[i] = args->Get(i);
40
+ }
41
+ return rr_v82rb(function->NewInstance(argc, &argv[0]));
42
+ }
43
+ VALUE GetName(VALUE self) {
44
+ HandleScope scope;
45
+ return rr_v82rb(unwrap(self)->GetName());
46
+ }
47
+ VALUE SetName(VALUE self, VALUE name) {
48
+ HandleScope scope;
49
+ Handle<String> str = rr_v8_handle<String>(name);
50
+ unwrap(self)->SetName(str);
51
+ return Qnil;
52
+ }
53
+ // VALUE GetScriptOrigin(VALUE self) {
54
+ // return rr_v82rb(unwrap(self)->GetScriptOrigin());
55
+ // }
56
+ }
57
+
58
+ void rr_init_function() {
59
+ FunctionClass = rr_define_class("Function", rr_v8_object_class());
60
+ rr_define_method(FunctionClass, "Call", Call, 2);
61
+ rr_define_method(FunctionClass, "NewInstance", NewInstance, 1);
62
+ rr_define_method(FunctionClass, "GetName", GetName, 0);
63
+ rr_define_method(FunctionClass, "SetName", SetName, 1);
64
+ // rr_define_method(FunctionClass, "GetScriptOrigin", GetScriptOrigin, 0);
65
+ }
66
+
67
+ VALUE rr_reflect_v8_function(Handle<Value> value) {
68
+ return rr_reflect_v8_object_as(value, FunctionClass);
69
+ }