therubyracer-freebsd 0.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +13 -0
- data/.rspec +1 -0
- data/.travis.yml +8 -0
- data/.yardopts +1 -0
- data/Changelog.md +231 -0
- data/Gemfile +3 -0
- data/README.md +167 -0
- data/Rakefile +26 -0
- data/bin/therubyracer +11 -0
- data/ext/v8/extconf.rb +26 -0
- data/ext/v8/rr.cpp +189 -0
- data/ext/v8/rr.h +41 -0
- data/ext/v8/v8.cpp +48 -0
- data/ext/v8/v8_array.cpp +48 -0
- data/ext/v8/v8_array.h +8 -0
- data/ext/v8/v8_callbacks.cpp +81 -0
- data/ext/v8/v8_callbacks.h +8 -0
- data/ext/v8/v8_context.cpp +92 -0
- data/ext/v8/v8_context.h +6 -0
- data/ext/v8/v8_date.cpp +40 -0
- data/ext/v8/v8_date.h +6 -0
- data/ext/v8/v8_debug.cpp +17 -0
- data/ext/v8/v8_debug.h +6 -0
- data/ext/v8/v8_exception.cpp +133 -0
- data/ext/v8/v8_exception.h +11 -0
- data/ext/v8/v8_external.cpp +70 -0
- data/ext/v8/v8_external.h +8 -0
- data/ext/v8/v8_function.cpp +69 -0
- data/ext/v8/v8_function.h +11 -0
- data/ext/v8/v8_handle.cpp +186 -0
- data/ext/v8/v8_handle.h +48 -0
- data/ext/v8/v8_locker.cpp +139 -0
- data/ext/v8/v8_locker.h +6 -0
- data/ext/v8/v8_message.cpp +67 -0
- data/ext/v8/v8_message.h +10 -0
- data/ext/v8/v8_object.cpp +122 -0
- data/ext/v8/v8_object.h +10 -0
- data/ext/v8/v8_script.cpp +36 -0
- data/ext/v8/v8_script.h +8 -0
- data/ext/v8/v8_string.cpp +52 -0
- data/ext/v8/v8_string.h +9 -0
- data/ext/v8/v8_template.cpp +344 -0
- data/ext/v8/v8_template.h +8 -0
- data/ext/v8/v8_try_catch.cpp +70 -0
- data/ext/v8/v8_try_catch.h +5 -0
- data/ext/v8/v8_v8.cpp +34 -0
- data/ext/v8/v8_v8.h +6 -0
- data/ext/v8/v8_value.cpp +175 -0
- data/ext/v8/v8_value.h +10 -0
- data/ext/v8/v8_weakref.cpp +61 -0
- data/ext/v8/v8_weakref.h +29 -0
- data/lib/v8.rb +23 -0
- data/lib/v8/access.rb +92 -0
- data/lib/v8/array.rb +17 -0
- data/lib/v8/c/locker.rb +18 -0
- data/lib/v8/cli.rb +133 -0
- data/lib/v8/context.rb +111 -0
- data/lib/v8/error.rb +130 -0
- data/lib/v8/function.rb +44 -0
- data/lib/v8/object.rb +69 -0
- data/lib/v8/portal.rb +86 -0
- data/lib/v8/portal/caller.rb +37 -0
- data/lib/v8/portal/constructor.rb +98 -0
- data/lib/v8/portal/function.rb +63 -0
- data/lib/v8/portal/interceptors.rb +152 -0
- data/lib/v8/portal/proxies.rb +151 -0
- data/lib/v8/portal/templates.rb +73 -0
- data/lib/v8/stack.rb +66 -0
- data/lib/v8/tap.rb +9 -0
- data/lib/v8/version.rb +3 -0
- data/spec/ext/array_spec.rb +15 -0
- data/spec/ext/cxt_spec.rb +57 -0
- data/spec/ext/ext_spec_helper.rb +27 -0
- data/spec/ext/func_spec.rb +64 -0
- data/spec/ext/object_spec.rb +10 -0
- data/spec/ext/string_spec.rb +11 -0
- data/spec/ext/try_catch_spec.rb +60 -0
- data/spec/redjs_spec.rb +9 -0
- data/spec/spec_helper.rb +9 -0
- data/spec/v8/error_spec.rb +131 -0
- data/spec/v8/portal/proxies_spec.rb +106 -0
- data/specmem/handle_memspec.rb +41 -0
- data/specmem/object_memspec.rb +14 -0
- data/specmem/proxies_memspec.rb +49 -0
- data/specmem/spec_helper.rb +24 -0
- data/specthread/spec_helper.rb +2 -0
- data/specthread/threading_spec.rb +13 -0
- data/thefrontside.png +0 -0
- data/therubyracer.gemspec +27 -0
- metadata +183 -0
@@ -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
|
+
|
data/ext/v8/v8_context.h
ADDED
data/ext/v8/v8_date.cpp
ADDED
@@ -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
|
+
}
|
data/ext/v8/v8_date.h
ADDED
data/ext/v8/v8_debug.cpp
ADDED
@@ -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
|
+
}
|
data/ext/v8/v8_debug.h
ADDED
@@ -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,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
|
+
}
|