therubyracer-freebsd 0.10.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
}
|