therubyracer-discourse 0.12.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +23 -0
- data/.travis.yml +11 -0
- data/Changelog.md +247 -0
- data/Gemfile +9 -0
- data/README.md +176 -0
- data/Rakefile +42 -0
- data/benchmarks.rb +218 -0
- data/ext/v8/accessor.cc +181 -0
- data/ext/v8/array.cc +26 -0
- data/ext/v8/backref.cc +45 -0
- data/ext/v8/constants.cc +34 -0
- data/ext/v8/constraints.cc +52 -0
- data/ext/v8/context.cc +130 -0
- data/ext/v8/date.cc +18 -0
- data/ext/v8/exception.cc +38 -0
- data/ext/v8/extconf.rb +34 -0
- data/ext/v8/external.cc +43 -0
- data/ext/v8/function.cc +58 -0
- data/ext/v8/gc.cc +43 -0
- data/ext/v8/handles.cc +34 -0
- data/ext/v8/heap.cc +35 -0
- data/ext/v8/init.cc +39 -0
- data/ext/v8/invocation.cc +86 -0
- data/ext/v8/locker.cc +77 -0
- data/ext/v8/message.cc +51 -0
- data/ext/v8/object.cc +335 -0
- data/ext/v8/primitive.cc +8 -0
- data/ext/v8/rr.cc +83 -0
- data/ext/v8/rr.h +934 -0
- data/ext/v8/script.cc +115 -0
- data/ext/v8/signature.cc +18 -0
- data/ext/v8/stack.cc +76 -0
- data/ext/v8/string.cc +47 -0
- data/ext/v8/template.cc +175 -0
- data/ext/v8/trycatch.cc +87 -0
- data/ext/v8/v8.cc +87 -0
- data/ext/v8/value.cc +239 -0
- data/lib/v8.rb +30 -0
- data/lib/v8/access.rb +5 -0
- data/lib/v8/access/indices.rb +40 -0
- data/lib/v8/access/invocation.rb +47 -0
- data/lib/v8/access/names.rb +65 -0
- data/lib/v8/array.rb +26 -0
- data/lib/v8/context.rb +256 -0
- data/lib/v8/conversion.rb +36 -0
- data/lib/v8/conversion/array.rb +11 -0
- data/lib/v8/conversion/class.rb +119 -0
- data/lib/v8/conversion/code.rb +38 -0
- data/lib/v8/conversion/fixnum.rb +11 -0
- data/lib/v8/conversion/fundamental.rb +11 -0
- data/lib/v8/conversion/hash.rb +11 -0
- data/lib/v8/conversion/indentity.rb +31 -0
- data/lib/v8/conversion/method.rb +26 -0
- data/lib/v8/conversion/object.rb +28 -0
- data/lib/v8/conversion/primitive.rb +7 -0
- data/lib/v8/conversion/proc.rb +5 -0
- data/lib/v8/conversion/reference.rb +16 -0
- data/lib/v8/conversion/string.rb +12 -0
- data/lib/v8/conversion/symbol.rb +7 -0
- data/lib/v8/conversion/time.rb +13 -0
- data/lib/v8/error.rb +169 -0
- data/lib/v8/function.rb +28 -0
- data/lib/v8/object.rb +79 -0
- data/lib/v8/stack.rb +85 -0
- data/lib/v8/version.rb +3 -0
- data/lib/v8/weak.rb +73 -0
- data/spec/c/array_spec.rb +17 -0
- data/spec/c/constants_spec.rb +20 -0
- data/spec/c/exception_spec.rb +26 -0
- data/spec/c/external_spec.rb +9 -0
- data/spec/c/function_spec.rb +46 -0
- data/spec/c/handles_spec.rb +35 -0
- data/spec/c/locker_spec.rb +38 -0
- data/spec/c/object_spec.rb +46 -0
- data/spec/c/script_spec.rb +28 -0
- data/spec/c/string_spec.rb +16 -0
- data/spec/c/template_spec.rb +30 -0
- data/spec/c/trycatch_spec.rb +51 -0
- data/spec/mem/blunt_spec.rb +42 -0
- data/spec/redjs_spec.rb +10 -0
- data/spec/spec_helper.rb +45 -0
- data/spec/threading_spec.rb +64 -0
- data/spec/v8/context_spec.rb +19 -0
- data/spec/v8/conversion_spec.rb +52 -0
- data/spec/v8/error_spec.rb +165 -0
- data/spec/v8/function_spec.rb +9 -0
- data/spec/v8/object_spec.rb +15 -0
- data/thefrontside.png +0 -0
- data/therubyracer.gemspec +21 -0
- metadata +163 -0
data/ext/v8/script.cc
ADDED
@@ -0,0 +1,115 @@
|
|
1
|
+
#include "rr.h"
|
2
|
+
#include "pthread.h"
|
3
|
+
#include "unistd.h"
|
4
|
+
|
5
|
+
namespace rr {
|
6
|
+
|
7
|
+
void Script::Init() {
|
8
|
+
ClassBuilder("Script").
|
9
|
+
defineSingletonMethod("New", &New).
|
10
|
+
defineMethod("Run", &Run).
|
11
|
+
defineMethod("RunWithTimeout", &RunWithTimeout).
|
12
|
+
store(&Class);
|
13
|
+
ClassBuilder("ScriptOrigin").
|
14
|
+
defineSingletonMethod("new", &ScriptOrigin::initialize).
|
15
|
+
store(&ScriptOrigin::Class);
|
16
|
+
ClassBuilder("ScriptData").
|
17
|
+
defineSingletonMethod("PreCompile", &ScriptData::PreCompile).
|
18
|
+
defineSingletonMethod("New", &ScriptData::New).
|
19
|
+
defineMethod("Length", &ScriptData::Length).
|
20
|
+
defineMethod("Data", &ScriptData::Data).
|
21
|
+
defineMethod("HasError", &ScriptData::HasError).
|
22
|
+
store(&ScriptData::Class);
|
23
|
+
}
|
24
|
+
|
25
|
+
VALUE ScriptOrigin::initialize(int argc, VALUE argv[], VALUE self) {
|
26
|
+
VALUE name; VALUE line_offset; VALUE column_offset;
|
27
|
+
rb_scan_args(argc, argv, "12", &name, &line_offset, &column_offset);
|
28
|
+
v8::Handle<v8::Integer> loff = v8::Integer::New(RTEST(line_offset) ? NUM2INT(line_offset) : 0);
|
29
|
+
v8::Handle<v8::Integer> coff = v8::Integer::New(RTEST(column_offset) ? NUM2INT(column_offset) : 0);
|
30
|
+
return ScriptOrigin(new v8::ScriptOrigin(*String(name), loff, coff));
|
31
|
+
}
|
32
|
+
|
33
|
+
VALUE ScriptData::PreCompile(VALUE self, VALUE input, VALUE length) {
|
34
|
+
#ifdef HAVE_RUBY_ENCODING_H
|
35
|
+
if (!rb_equal(rb_enc_from_encoding(rb_utf8_encoding()), rb_obj_encoding(input))) {
|
36
|
+
rb_warn("ScriptData::Precompile only accepts UTF-8 encoded source, not: %s", RSTRING_PTR(rb_inspect(rb_obj_encoding(input))));
|
37
|
+
}
|
38
|
+
#endif
|
39
|
+
return ScriptData(v8::ScriptData::PreCompile(RSTRING_PTR(input), NUM2INT(length)));
|
40
|
+
}
|
41
|
+
VALUE ScriptData::New(VALUE self, VALUE data, VALUE length) {
|
42
|
+
return ScriptData(v8::ScriptData::New(RSTRING_PTR(data), NUM2INT(length)));
|
43
|
+
}
|
44
|
+
VALUE ScriptData::Length(VALUE self) {
|
45
|
+
return ScriptData(self)->Length();
|
46
|
+
}
|
47
|
+
VALUE ScriptData::Data(VALUE self) {
|
48
|
+
ScriptData data(self);
|
49
|
+
#ifdef HAVE_RUBY_ENCODING_H
|
50
|
+
return rb_enc_str_new(data->Data(), data->Length(), rb_enc_find("BINARY"));
|
51
|
+
#else
|
52
|
+
return rb_str_new(data->Data(), data->Length());
|
53
|
+
#endif
|
54
|
+
}
|
55
|
+
|
56
|
+
VALUE ScriptData::HasError(VALUE self) {
|
57
|
+
return ScriptData(self)->HasError();
|
58
|
+
}
|
59
|
+
|
60
|
+
VALUE Script::New(int argc, VALUE argv[], VALUE self) {
|
61
|
+
VALUE source; VALUE origin; VALUE pre_data; VALUE script_data;
|
62
|
+
rb_scan_args(argc, argv, "13", &source, &origin, &pre_data, &script_data);
|
63
|
+
if (argc == 2) {
|
64
|
+
VALUE filename = origin;
|
65
|
+
return Script(v8::Script::New(String(source), Value(filename)));
|
66
|
+
} else {
|
67
|
+
return Script(v8::Script::New(String(source), ScriptOrigin(origin), ScriptData(pre_data), String(script_data)));
|
68
|
+
}
|
69
|
+
}
|
70
|
+
|
71
|
+
VALUE Script::Run(VALUE self) {
|
72
|
+
return Value(Script(self)->Run());
|
73
|
+
}
|
74
|
+
|
75
|
+
typedef struct {
|
76
|
+
v8::Isolate *isolate;
|
77
|
+
long timeout;
|
78
|
+
} timeout_data;
|
79
|
+
|
80
|
+
void* breaker(void *d) {
|
81
|
+
timeout_data* data = (timeout_data*)d;
|
82
|
+
usleep(data->timeout*1000);
|
83
|
+
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL);
|
84
|
+
v8::V8::TerminateExecution(data->isolate);
|
85
|
+
return NULL;
|
86
|
+
}
|
87
|
+
|
88
|
+
VALUE Script::RunWithTimeout(VALUE self, VALUE timeout) {
|
89
|
+
pthread_t breaker_thread;
|
90
|
+
timeout_data data;
|
91
|
+
VALUE rval;
|
92
|
+
void *res;
|
93
|
+
|
94
|
+
data.isolate = v8::Isolate::GetCurrent();
|
95
|
+
data.timeout = NUM2LONG(timeout);
|
96
|
+
|
97
|
+
pthread_create(&breaker_thread, NULL, breaker, &data);
|
98
|
+
|
99
|
+
rval = Value(Script(self)->Run());
|
100
|
+
|
101
|
+
pthread_cancel(breaker_thread);
|
102
|
+
pthread_join(breaker_thread, &res);
|
103
|
+
|
104
|
+
return rval;
|
105
|
+
}
|
106
|
+
|
107
|
+
template <> void Pointer<v8::ScriptData>::unwrap(VALUE value) {
|
108
|
+
Data_Get_Struct(value, class v8::ScriptData, pointer);
|
109
|
+
}
|
110
|
+
|
111
|
+
template <> void Pointer<v8::ScriptOrigin>::unwrap(VALUE value) {
|
112
|
+
Data_Get_Struct(value, class v8::ScriptOrigin, pointer);
|
113
|
+
}
|
114
|
+
|
115
|
+
} //namespace rr
|
data/ext/v8/signature.cc
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
#include "rr.h"
|
2
|
+
|
3
|
+
namespace rr {
|
4
|
+
void Signature::Init() {
|
5
|
+
ClassBuilder("Signature").
|
6
|
+
defineMethod("New", &New).
|
7
|
+
store(&Class);
|
8
|
+
}
|
9
|
+
|
10
|
+
VALUE Signature::New(int argc, VALUE args[], VALUE self) {
|
11
|
+
VALUE receiver; VALUE argv;
|
12
|
+
rb_scan_args(argc, args, "02", &receiver, &argv);
|
13
|
+
FunctionTemplate recv(receiver);
|
14
|
+
int length = RARRAY_LENINT(argv);
|
15
|
+
FunctionTemplate::array<FunctionTemplate> types(argv);
|
16
|
+
return Signature(v8::Signature::New(recv, length, types));
|
17
|
+
}
|
18
|
+
}
|
data/ext/v8/stack.cc
ADDED
@@ -0,0 +1,76 @@
|
|
1
|
+
#include "rr.h"
|
2
|
+
|
3
|
+
namespace rr {
|
4
|
+
void Stack::Init() {
|
5
|
+
ClassBuilder("StackTrace").
|
6
|
+
defineSingletonMethod("kLineNumber", &Trace::kLineNumber).
|
7
|
+
defineSingletonMethod("kColumnOffset", &Trace::kColumnOffset).
|
8
|
+
defineSingletonMethod("kScriptName", &Trace::kScriptName).
|
9
|
+
defineSingletonMethod("kFunctionName", &Trace::kFunctionName).
|
10
|
+
defineSingletonMethod("kIsEval", &Trace::kIsEval).
|
11
|
+
defineSingletonMethod("kIsConstructor", &Trace::kIsConstructor).
|
12
|
+
defineSingletonMethod("kScriptNameOrSourceURL", &Trace::kScriptNameOrSourceURL).
|
13
|
+
defineSingletonMethod("kOverview", &Trace::kOverview).
|
14
|
+
defineSingletonMethod("kDetailed", &Trace::kDetailed).
|
15
|
+
defineSingletonMethod("CurrentStackTrace", &Trace::CurrentStackTrace).
|
16
|
+
defineMethod("GetFrame", &Trace::GetFrame).
|
17
|
+
defineMethod("GetFrameCount", &Trace::GetFrameCount).
|
18
|
+
defineMethod("AsArray", &Trace::AsArray).
|
19
|
+
store(&Trace::Class);
|
20
|
+
ClassBuilder("StackFrame").
|
21
|
+
defineMethod("GetLineNumber", &Frame::GetLineNumber).
|
22
|
+
defineMethod("GetColumn", &Frame::GetColumn).
|
23
|
+
defineMethod("GetScriptName", &Frame::GetScriptName).
|
24
|
+
defineMethod("GetScriptNameOrSourceURL", &Frame::GetScriptNameOrSourceURL).
|
25
|
+
defineMethod("GetFunctionName", &Frame::GetFunctionName).
|
26
|
+
defineMethod("IsEval", &Frame::IsEval).
|
27
|
+
defineMethod("IsConstructor", &Frame::IsConstructor).
|
28
|
+
store(&Frame::Class);
|
29
|
+
}
|
30
|
+
|
31
|
+
VALUE Stack::Trace::GetFrame(VALUE self, VALUE index) {
|
32
|
+
return Frame(Trace(self)->GetFrame(NUM2UINT(index)));
|
33
|
+
}
|
34
|
+
|
35
|
+
VALUE Stack::Trace::GetFrameCount(VALUE self) {
|
36
|
+
return INT2FIX(Trace(self)->GetFrameCount());
|
37
|
+
}
|
38
|
+
|
39
|
+
VALUE Stack::Trace::AsArray(VALUE self) {
|
40
|
+
return Array(Trace(self)->AsArray());
|
41
|
+
}
|
42
|
+
|
43
|
+
VALUE Stack::Trace::CurrentStackTrace(int argc, VALUE argv[], VALUE self) {
|
44
|
+
VALUE frame_limit; VALUE options;
|
45
|
+
rb_scan_args(argc, argv, "11", &frame_limit, &options);
|
46
|
+
return Trace(v8::StackTrace::CurrentStackTrace(NUM2INT(frame_limit), StackTraceOptions(options)));
|
47
|
+
}
|
48
|
+
|
49
|
+
VALUE Stack::Frame::GetLineNumber(VALUE self) {
|
50
|
+
return INT2FIX(Frame(self)->GetLineNumber());
|
51
|
+
}
|
52
|
+
|
53
|
+
VALUE Stack::Frame::GetColumn(VALUE self) {
|
54
|
+
return INT2FIX(Frame(self)->GetColumn());
|
55
|
+
}
|
56
|
+
|
57
|
+
VALUE Stack::Frame::GetScriptName(VALUE self) {
|
58
|
+
return String(Frame(self)->GetScriptName());
|
59
|
+
}
|
60
|
+
|
61
|
+
VALUE Stack::Frame::GetScriptNameOrSourceURL(VALUE self) {
|
62
|
+
return String(Frame(self)->GetScriptNameOrSourceURL());
|
63
|
+
}
|
64
|
+
|
65
|
+
VALUE Stack::Frame::GetFunctionName(VALUE self) {
|
66
|
+
return String(Frame(self)->GetFunctionName());
|
67
|
+
}
|
68
|
+
|
69
|
+
VALUE Stack::Frame::IsEval(VALUE self) {
|
70
|
+
return Bool(Frame(self)->IsEval());
|
71
|
+
}
|
72
|
+
|
73
|
+
VALUE Stack::Frame::IsConstructor(VALUE self) {
|
74
|
+
return Bool(Frame(self)->IsConstructor());
|
75
|
+
}
|
76
|
+
}
|
data/ext/v8/string.cc
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
#include "rr.h"
|
2
|
+
|
3
|
+
namespace rr {
|
4
|
+
|
5
|
+
void String::Init() {
|
6
|
+
ClassBuilder("String", Primitive::Class).
|
7
|
+
defineSingletonMethod("New", &New).
|
8
|
+
defineSingletonMethod("NewSymbol", &NewSymbol).
|
9
|
+
defineSingletonMethod("Concat", &Concat).
|
10
|
+
defineMethod("Utf8Value", &Utf8Value).
|
11
|
+
store(&Class);
|
12
|
+
}
|
13
|
+
|
14
|
+
VALUE String::New(VALUE StringClass, VALUE string) {
|
15
|
+
return String(v8::String::New(RSTRING_PTR(string), (int)RSTRING_LEN(string)));
|
16
|
+
}
|
17
|
+
|
18
|
+
VALUE String::NewSymbol(VALUE self, VALUE string) {
|
19
|
+
return String(v8::String::NewSymbol(RSTRING_PTR(string), (int)RSTRING_LEN(string)));
|
20
|
+
}
|
21
|
+
|
22
|
+
VALUE String::Utf8Value(VALUE self) {
|
23
|
+
String str(self);
|
24
|
+
#ifdef HAVE_RUBY_ENCODING_H
|
25
|
+
return rb_enc_str_new(*v8::String::Utf8Value(*str), str->Utf8Length(), rb_enc_find("utf-8"));
|
26
|
+
#else
|
27
|
+
return rb_str_new(*v8::String::Utf8Value(*str), str->Utf8Length());
|
28
|
+
#endif
|
29
|
+
}
|
30
|
+
|
31
|
+
VALUE String::Concat(VALUE self, VALUE left, VALUE right) {
|
32
|
+
return String(v8::String::Concat(String(left), String(right)));
|
33
|
+
}
|
34
|
+
|
35
|
+
String::operator v8::Handle<v8::String>() const {
|
36
|
+
switch (TYPE(value)) {
|
37
|
+
case T_STRING:
|
38
|
+
return v8::String::New(RSTRING_PTR(value), (int)RSTRING_LEN(value));
|
39
|
+
case T_DATA:
|
40
|
+
return Ref<v8::String>::operator v8::Handle<v8::String>();
|
41
|
+
default:
|
42
|
+
VALUE string = rb_funcall(value, rb_intern("to_s"), 0);
|
43
|
+
return v8::String::New(RSTRING_PTR(string), (int)RSTRING_LEN(string));
|
44
|
+
}
|
45
|
+
}
|
46
|
+
|
47
|
+
} //namespace rr
|
data/ext/v8/template.cc
ADDED
@@ -0,0 +1,175 @@
|
|
1
|
+
#include "rr.h"
|
2
|
+
|
3
|
+
namespace rr {
|
4
|
+
void Template::Init() {
|
5
|
+
ClassBuilder("Template").
|
6
|
+
defineMethod("Set", &Set);
|
7
|
+
ObjectTemplate::Init();
|
8
|
+
FunctionTemplate::Init();
|
9
|
+
}
|
10
|
+
|
11
|
+
VALUE Template::Set(int argc, VALUE argv[], VALUE self) {
|
12
|
+
VALUE name; VALUE value; VALUE attributes;
|
13
|
+
rb_scan_args(argc, argv, "21", &name, &value, &attributes);
|
14
|
+
Void(Template(self)->Set(*String(name), *Value(value), PropertyAttribute(attributes)));
|
15
|
+
}
|
16
|
+
|
17
|
+
void ObjectTemplate::Init() {
|
18
|
+
ClassBuilder("ObjectTemplate", "Template").
|
19
|
+
defineSingletonMethod("New", &New).
|
20
|
+
defineMethod("NewInstance", &NewInstance).
|
21
|
+
defineMethod("SetAccessor", &SetAccessor).
|
22
|
+
defineMethod("SetNamedPropertyHandler", &SetNamedPropertyHandler).
|
23
|
+
defineMethod("SetIndexedPropertyHandler", &SetIndexedPropertyHandler).
|
24
|
+
defineMethod("SetCallAsFunctionHandler", &SetCallAsFunctionHandler).
|
25
|
+
defineMethod("MarkAsUndetectable", &MarkAsUndetectable).
|
26
|
+
defineMethod("SetAccessCheckCallbacks", &SetAccessCheckCallbacks).
|
27
|
+
defineMethod("InternalFieldCount", &InternalFieldCount).
|
28
|
+
defineMethod("SetInternalFieldCount", &SetInternalFieldCount).
|
29
|
+
store(&Class);
|
30
|
+
}
|
31
|
+
|
32
|
+
VALUE ObjectTemplate::New(VALUE self) {
|
33
|
+
return ObjectTemplate(v8::ObjectTemplate::New());
|
34
|
+
}
|
35
|
+
|
36
|
+
VALUE ObjectTemplate::NewInstance(VALUE self) {
|
37
|
+
return Object(ObjectTemplate(self)->NewInstance());
|
38
|
+
}
|
39
|
+
|
40
|
+
VALUE ObjectTemplate::SetAccessor(int argc, VALUE argv[], VALUE self) {
|
41
|
+
VALUE name; VALUE get; VALUE set; VALUE data; VALUE settings; VALUE attribs;
|
42
|
+
rb_scan_args(argc, argv, "24", &name, &get, &set, &data, &settings, &attribs);
|
43
|
+
Accessor accessor(get, set, data);
|
44
|
+
ObjectTemplate(self)->SetAccessor(
|
45
|
+
String(name),
|
46
|
+
accessor.accessorGetter(),
|
47
|
+
accessor.accessorSetter(),
|
48
|
+
accessor,
|
49
|
+
AccessControl(settings),
|
50
|
+
PropertyAttribute(attribs)
|
51
|
+
);
|
52
|
+
Void();
|
53
|
+
}
|
54
|
+
|
55
|
+
VALUE ObjectTemplate::SetNamedPropertyHandler(int argc, VALUE argv[], VALUE self) {
|
56
|
+
VALUE get; VALUE set; VALUE query; VALUE deleter; VALUE enumerator; VALUE data;
|
57
|
+
rb_scan_args(argc, argv, "15", &get, &set, &query, &deleter, &enumerator, &data);
|
58
|
+
Accessor accessor(get,set,query,deleter,enumerator,data);
|
59
|
+
ObjectTemplate(self)->SetNamedPropertyHandler(
|
60
|
+
accessor.namedPropertyGetter(),
|
61
|
+
accessor.namedPropertySetter(),
|
62
|
+
accessor.namedPropertyQuery(),
|
63
|
+
accessor.namedPropertyDeleter(),
|
64
|
+
accessor.namedPropertyEnumerator(),
|
65
|
+
accessor
|
66
|
+
);
|
67
|
+
Void();
|
68
|
+
}
|
69
|
+
|
70
|
+
VALUE ObjectTemplate::SetIndexedPropertyHandler(int argc, VALUE argv[], VALUE self) {
|
71
|
+
VALUE get; VALUE set; VALUE query; VALUE deleter; VALUE enumerator; VALUE data;
|
72
|
+
rb_scan_args(argc, argv, "15", &get, &set, &query, &deleter, &enumerator, &data);
|
73
|
+
Accessor accessor(get,set,query,deleter,enumerator,data);
|
74
|
+
ObjectTemplate(self)->SetIndexedPropertyHandler(
|
75
|
+
accessor.indexedPropertyGetter(),
|
76
|
+
accessor.indexedPropertySetter(),
|
77
|
+
accessor.indexedPropertyQuery(),
|
78
|
+
accessor.indexedPropertyDeleter(),
|
79
|
+
accessor.indexedPropertyEnumerator(),
|
80
|
+
accessor
|
81
|
+
);
|
82
|
+
Void();
|
83
|
+
}
|
84
|
+
|
85
|
+
VALUE ObjectTemplate::SetCallAsFunctionHandler(int argc, VALUE argv[], VALUE self) {
|
86
|
+
VALUE callback; VALUE data;
|
87
|
+
rb_scan_args(argc, argv, "11", &callback, &data);
|
88
|
+
Invocation invocation(callback, data);
|
89
|
+
Void(ObjectTemplate(self)->SetCallAsFunctionHandler(invocation, invocation));
|
90
|
+
}
|
91
|
+
|
92
|
+
VALUE ObjectTemplate::MarkAsUndetectable(VALUE self) {
|
93
|
+
Void(ObjectTemplate(self)->MarkAsUndetectable());
|
94
|
+
}
|
95
|
+
|
96
|
+
|
97
|
+
VALUE ObjectTemplate::SetAccessCheckCallbacks(int argc, VALUE argv[], VALUE self) {
|
98
|
+
VALUE named_handler; VALUE indexed_handler; VALUE data; VALUE turned_on_by_default;
|
99
|
+
rb_scan_args(argc, argv, "22", &named_handler, &indexed_handler, &data, &turned_on_by_default);
|
100
|
+
return not_implemented("ObjectTemplate::SetAccessCheckCallbacks");
|
101
|
+
}
|
102
|
+
|
103
|
+
VALUE ObjectTemplate::InternalFieldCount(VALUE self) {
|
104
|
+
return INT2FIX(ObjectTemplate(self)->InternalFieldCount());
|
105
|
+
}
|
106
|
+
|
107
|
+
VALUE ObjectTemplate::SetInternalFieldCount(VALUE self, VALUE count) {
|
108
|
+
Void(ObjectTemplate(self)->SetInternalFieldCount(NUM2INT(count)));
|
109
|
+
}
|
110
|
+
|
111
|
+
void FunctionTemplate::Init() {
|
112
|
+
ClassBuilder("FunctionTemplate", "Template").
|
113
|
+
defineSingletonMethod("New", &New).
|
114
|
+
defineMethod("GetFunction", &GetFunction).
|
115
|
+
defineMethod("SetCallHandler", &SetCallHandler).
|
116
|
+
defineMethod("InstanceTemplate", &InstanceTemplate).
|
117
|
+
defineMethod("Inherit", &Inherit).
|
118
|
+
defineMethod("PrototypeTemplate", &PrototypeTemplate).
|
119
|
+
defineMethod("SetClassName", &SetClassName).
|
120
|
+
defineMethod("SetHiddenPrototype", &SetHiddenPrototype).
|
121
|
+
defineMethod("ReadOnlyPrototype", &ReadOnlyPrototype).
|
122
|
+
defineMethod("HasInstance", &HasInstance).
|
123
|
+
store(&Class);
|
124
|
+
}
|
125
|
+
|
126
|
+
VALUE FunctionTemplate::New(int argc, VALUE argv[], VALUE self) {
|
127
|
+
VALUE code; VALUE data; VALUE signature;
|
128
|
+
rb_scan_args(argc, argv, "03", &code, &data, &signature);
|
129
|
+
if (RTEST(code)) {
|
130
|
+
Invocation invocation(code, data);
|
131
|
+
return FunctionTemplate(v8::FunctionTemplate::New(invocation, invocation, Signature(signature)));
|
132
|
+
} else {
|
133
|
+
return FunctionTemplate(v8::FunctionTemplate::New());
|
134
|
+
}
|
135
|
+
}
|
136
|
+
|
137
|
+
VALUE FunctionTemplate::GetFunction(VALUE self) {
|
138
|
+
return Function(FunctionTemplate(self)->GetFunction());
|
139
|
+
}
|
140
|
+
|
141
|
+
VALUE FunctionTemplate::SetCallHandler(int argc, VALUE argv[], VALUE self) {
|
142
|
+
VALUE code; VALUE data;
|
143
|
+
rb_scan_args(argc, argv, "11", &code, &data);
|
144
|
+
Invocation invocation(code, data);
|
145
|
+
Void(FunctionTemplate(self)->SetCallHandler(invocation, invocation));
|
146
|
+
}
|
147
|
+
|
148
|
+
VALUE FunctionTemplate::InstanceTemplate(VALUE self) {
|
149
|
+
return ObjectTemplate(FunctionTemplate(self)->InstanceTemplate());
|
150
|
+
}
|
151
|
+
|
152
|
+
VALUE FunctionTemplate::Inherit(VALUE self, VALUE parent) {
|
153
|
+
Void(FunctionTemplate(self)->Inherit(FunctionTemplate(parent)));
|
154
|
+
}
|
155
|
+
|
156
|
+
VALUE FunctionTemplate::PrototypeTemplate(VALUE self) {
|
157
|
+
return ObjectTemplate(FunctionTemplate(self)->PrototypeTemplate());
|
158
|
+
}
|
159
|
+
|
160
|
+
VALUE FunctionTemplate::SetClassName(VALUE self, VALUE name) {
|
161
|
+
Void(FunctionTemplate(self)->SetClassName(String(name)));
|
162
|
+
}
|
163
|
+
|
164
|
+
VALUE FunctionTemplate::SetHiddenPrototype(VALUE self, VALUE value) {
|
165
|
+
Void(FunctionTemplate(self)->SetHiddenPrototype(Bool(value)));
|
166
|
+
}
|
167
|
+
|
168
|
+
VALUE FunctionTemplate::ReadOnlyPrototype(VALUE self) {
|
169
|
+
Void(FunctionTemplate(self)->ReadOnlyPrototype());
|
170
|
+
}
|
171
|
+
|
172
|
+
VALUE FunctionTemplate::HasInstance(VALUE self, VALUE object) {
|
173
|
+
return Bool(FunctionTemplate(self)->HasInstance(Value(object)));
|
174
|
+
}
|
175
|
+
}
|
data/ext/v8/trycatch.cc
ADDED
@@ -0,0 +1,87 @@
|
|
1
|
+
#include "rr.h"
|
2
|
+
|
3
|
+
namespace rr {
|
4
|
+
VALUE TryCatch::Class;
|
5
|
+
|
6
|
+
void TryCatch::Init() {
|
7
|
+
ClassBuilder("TryCatch").
|
8
|
+
defineMethod("HasCaught", &HasCaught).
|
9
|
+
defineMethod("CanContinue", &CanContinue).
|
10
|
+
defineMethod("ReThrow", &ReThrow).
|
11
|
+
defineMethod("Exception", &Exception).
|
12
|
+
defineMethod("StackTrace", &StackTrace).
|
13
|
+
defineMethod("Message", &Message).
|
14
|
+
defineMethod("Reset", &Reset).
|
15
|
+
defineMethod("SetVerbose", &SetVerbose).
|
16
|
+
defineMethod("SetCaptureMessage", &SetCaptureMessage).
|
17
|
+
store(&Class);
|
18
|
+
VALUE v8 = rb_define_module("V8");
|
19
|
+
VALUE c = rb_define_module_under(v8, "C");
|
20
|
+
rb_define_singleton_method(c, "TryCatch", (VALUE (*)(...))&doTryCatch, -1);
|
21
|
+
}
|
22
|
+
|
23
|
+
TryCatch::TryCatch(v8::TryCatch* impl) {
|
24
|
+
this->impl = impl;
|
25
|
+
}
|
26
|
+
TryCatch::TryCatch(VALUE value) {
|
27
|
+
Data_Get_Struct(value, class v8::TryCatch, impl);
|
28
|
+
}
|
29
|
+
|
30
|
+
TryCatch::operator VALUE() {
|
31
|
+
return Data_Wrap_Struct(Class, 0, 0, impl);
|
32
|
+
}
|
33
|
+
|
34
|
+
VALUE TryCatch::HasCaught(VALUE self) {
|
35
|
+
return Bool(TryCatch(self)->HasCaught());
|
36
|
+
}
|
37
|
+
VALUE TryCatch::CanContinue(VALUE self) {
|
38
|
+
return Bool(TryCatch(self)->CanContinue());
|
39
|
+
}
|
40
|
+
VALUE TryCatch::ReThrow(VALUE self) {
|
41
|
+
return Value(TryCatch(self)->ReThrow());
|
42
|
+
}
|
43
|
+
VALUE TryCatch::Exception(VALUE self) {
|
44
|
+
return Value(TryCatch(self)->Exception());
|
45
|
+
}
|
46
|
+
VALUE TryCatch::StackTrace(VALUE self) {
|
47
|
+
return Value(TryCatch(self)->StackTrace());
|
48
|
+
}
|
49
|
+
VALUE TryCatch::Message(VALUE self) {
|
50
|
+
return rr::Message(TryCatch(self)->Message());
|
51
|
+
}
|
52
|
+
VALUE TryCatch::Reset(VALUE self) {
|
53
|
+
Void(TryCatch(self)->Reset());
|
54
|
+
}
|
55
|
+
VALUE TryCatch::SetVerbose(VALUE self, VALUE value) {
|
56
|
+
Void(TryCatch(self)->SetVerbose(Bool(value)));
|
57
|
+
}
|
58
|
+
VALUE TryCatch::SetCaptureMessage(VALUE self, VALUE value) {
|
59
|
+
Void(TryCatch(self)->SetCaptureMessage(Bool(value)));
|
60
|
+
}
|
61
|
+
|
62
|
+
VALUE TryCatch::doTryCatch(int argc, VALUE argv[], VALUE self) {
|
63
|
+
if (!rb_block_given_p()) {
|
64
|
+
return Qnil;
|
65
|
+
}
|
66
|
+
int state = 0;
|
67
|
+
VALUE code;
|
68
|
+
rb_scan_args(argc,argv,"00&", &code);
|
69
|
+
VALUE result = setupAndCall(&state, code);
|
70
|
+
if (state != 0) {
|
71
|
+
rb_jump_tag(state);
|
72
|
+
}
|
73
|
+
return result;
|
74
|
+
}
|
75
|
+
|
76
|
+
VALUE TryCatch::setupAndCall(int* state, VALUE code) {
|
77
|
+
v8::TryCatch trycatch;
|
78
|
+
rb_iv_set(code, "_v8_trycatch", TryCatch(&trycatch));
|
79
|
+
VALUE result = rb_protect(&doCall, code, state);
|
80
|
+
rb_iv_set(code, "_v8_trycatch", Qnil);
|
81
|
+
return result;
|
82
|
+
}
|
83
|
+
|
84
|
+
VALUE TryCatch::doCall(VALUE code) {
|
85
|
+
return rb_funcall(code, rb_intern("call"), 1, rb_iv_get(code, "_v8_trycatch"));
|
86
|
+
}
|
87
|
+
}
|