therubyracer-discourse 0.12.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (91) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +23 -0
  3. data/.travis.yml +11 -0
  4. data/Changelog.md +247 -0
  5. data/Gemfile +9 -0
  6. data/README.md +176 -0
  7. data/Rakefile +42 -0
  8. data/benchmarks.rb +218 -0
  9. data/ext/v8/accessor.cc +181 -0
  10. data/ext/v8/array.cc +26 -0
  11. data/ext/v8/backref.cc +45 -0
  12. data/ext/v8/constants.cc +34 -0
  13. data/ext/v8/constraints.cc +52 -0
  14. data/ext/v8/context.cc +130 -0
  15. data/ext/v8/date.cc +18 -0
  16. data/ext/v8/exception.cc +38 -0
  17. data/ext/v8/extconf.rb +34 -0
  18. data/ext/v8/external.cc +43 -0
  19. data/ext/v8/function.cc +58 -0
  20. data/ext/v8/gc.cc +43 -0
  21. data/ext/v8/handles.cc +34 -0
  22. data/ext/v8/heap.cc +35 -0
  23. data/ext/v8/init.cc +39 -0
  24. data/ext/v8/invocation.cc +86 -0
  25. data/ext/v8/locker.cc +77 -0
  26. data/ext/v8/message.cc +51 -0
  27. data/ext/v8/object.cc +335 -0
  28. data/ext/v8/primitive.cc +8 -0
  29. data/ext/v8/rr.cc +83 -0
  30. data/ext/v8/rr.h +934 -0
  31. data/ext/v8/script.cc +115 -0
  32. data/ext/v8/signature.cc +18 -0
  33. data/ext/v8/stack.cc +76 -0
  34. data/ext/v8/string.cc +47 -0
  35. data/ext/v8/template.cc +175 -0
  36. data/ext/v8/trycatch.cc +87 -0
  37. data/ext/v8/v8.cc +87 -0
  38. data/ext/v8/value.cc +239 -0
  39. data/lib/v8.rb +30 -0
  40. data/lib/v8/access.rb +5 -0
  41. data/lib/v8/access/indices.rb +40 -0
  42. data/lib/v8/access/invocation.rb +47 -0
  43. data/lib/v8/access/names.rb +65 -0
  44. data/lib/v8/array.rb +26 -0
  45. data/lib/v8/context.rb +256 -0
  46. data/lib/v8/conversion.rb +36 -0
  47. data/lib/v8/conversion/array.rb +11 -0
  48. data/lib/v8/conversion/class.rb +119 -0
  49. data/lib/v8/conversion/code.rb +38 -0
  50. data/lib/v8/conversion/fixnum.rb +11 -0
  51. data/lib/v8/conversion/fundamental.rb +11 -0
  52. data/lib/v8/conversion/hash.rb +11 -0
  53. data/lib/v8/conversion/indentity.rb +31 -0
  54. data/lib/v8/conversion/method.rb +26 -0
  55. data/lib/v8/conversion/object.rb +28 -0
  56. data/lib/v8/conversion/primitive.rb +7 -0
  57. data/lib/v8/conversion/proc.rb +5 -0
  58. data/lib/v8/conversion/reference.rb +16 -0
  59. data/lib/v8/conversion/string.rb +12 -0
  60. data/lib/v8/conversion/symbol.rb +7 -0
  61. data/lib/v8/conversion/time.rb +13 -0
  62. data/lib/v8/error.rb +169 -0
  63. data/lib/v8/function.rb +28 -0
  64. data/lib/v8/object.rb +79 -0
  65. data/lib/v8/stack.rb +85 -0
  66. data/lib/v8/version.rb +3 -0
  67. data/lib/v8/weak.rb +73 -0
  68. data/spec/c/array_spec.rb +17 -0
  69. data/spec/c/constants_spec.rb +20 -0
  70. data/spec/c/exception_spec.rb +26 -0
  71. data/spec/c/external_spec.rb +9 -0
  72. data/spec/c/function_spec.rb +46 -0
  73. data/spec/c/handles_spec.rb +35 -0
  74. data/spec/c/locker_spec.rb +38 -0
  75. data/spec/c/object_spec.rb +46 -0
  76. data/spec/c/script_spec.rb +28 -0
  77. data/spec/c/string_spec.rb +16 -0
  78. data/spec/c/template_spec.rb +30 -0
  79. data/spec/c/trycatch_spec.rb +51 -0
  80. data/spec/mem/blunt_spec.rb +42 -0
  81. data/spec/redjs_spec.rb +10 -0
  82. data/spec/spec_helper.rb +45 -0
  83. data/spec/threading_spec.rb +64 -0
  84. data/spec/v8/context_spec.rb +19 -0
  85. data/spec/v8/conversion_spec.rb +52 -0
  86. data/spec/v8/error_spec.rb +165 -0
  87. data/spec/v8/function_spec.rb +9 -0
  88. data/spec/v8/object_spec.rb +15 -0
  89. data/thefrontside.png +0 -0
  90. data/therubyracer.gemspec +21 -0
  91. metadata +163 -0
@@ -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
@@ -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
+ }
@@ -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
+ }
@@ -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
@@ -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
+ }
@@ -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
+ }