therubyracer-st 0.11.0beta5-x86-mingw32

Sign up to get free protection for your applications and to get access to all the features.
Files changed (93) hide show
  1. data/.gitignore +23 -0
  2. data/.travis.yml +10 -0
  3. data/Changelog.md +242 -0
  4. data/Gemfile +15 -0
  5. data/README.md +185 -0
  6. data/Rakefile +58 -0
  7. data/benchmarks.rb +217 -0
  8. data/ext/v8/accessor.cc +181 -0
  9. data/ext/v8/array.cc +26 -0
  10. data/ext/v8/backref.cc +54 -0
  11. data/ext/v8/build.rb +53 -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 +23 -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 +31 -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 +334 -0
  28. data/ext/v8/primitive.cc +8 -0
  29. data/ext/v8/rr.cc +83 -0
  30. data/ext/v8/rr.h +883 -0
  31. data/ext/v8/script.cc +80 -0
  32. data/ext/v8/signature.cc +18 -0
  33. data/ext/v8/stack.cc +75 -0
  34. data/ext/v8/string.cc +47 -0
  35. data/ext/v8/template.cc +175 -0
  36. data/ext/v8/trycatch.cc +86 -0
  37. data/ext/v8/v8.cc +87 -0
  38. data/ext/v8/value.cc +239 -0
  39. data/lib/v8.rb +36 -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 +243 -0
  46. data/lib/v8/conversion.rb +35 -0
  47. data/lib/v8/conversion/array.rb +11 -0
  48. data/lib/v8/conversion/class.rb +120 -0
  49. data/lib/v8/conversion/code.rb +38 -0
  50. data/lib/v8/conversion/fundamental.rb +11 -0
  51. data/lib/v8/conversion/hash.rb +11 -0
  52. data/lib/v8/conversion/indentity.rb +31 -0
  53. data/lib/v8/conversion/method.rb +26 -0
  54. data/lib/v8/conversion/object.rb +28 -0
  55. data/lib/v8/conversion/primitive.rb +7 -0
  56. data/lib/v8/conversion/proc.rb +5 -0
  57. data/lib/v8/conversion/reference.rb +16 -0
  58. data/lib/v8/conversion/string.rb +12 -0
  59. data/lib/v8/conversion/symbol.rb +7 -0
  60. data/lib/v8/conversion/time.rb +13 -0
  61. data/lib/v8/error.rb +25 -0
  62. data/lib/v8/error/protect.rb +20 -0
  63. data/lib/v8/error/try.rb +15 -0
  64. data/lib/v8/function.rb +28 -0
  65. data/lib/v8/helper.rb +30 -0
  66. data/lib/v8/object.rb +79 -0
  67. data/lib/v8/util/weakcell.rb +29 -0
  68. data/lib/v8/version.rb +3 -0
  69. data/spec/c/array_spec.rb +17 -0
  70. data/spec/c/constants_spec.rb +20 -0
  71. data/spec/c/exception_spec.rb +26 -0
  72. data/spec/c/external_spec.rb +9 -0
  73. data/spec/c/function_spec.rb +46 -0
  74. data/spec/c/handles_spec.rb +35 -0
  75. data/spec/c/locker_spec.rb +38 -0
  76. data/spec/c/object_spec.rb +46 -0
  77. data/spec/c/script_spec.rb +28 -0
  78. data/spec/c/string_spec.rb +16 -0
  79. data/spec/c/template_spec.rb +30 -0
  80. data/spec/c/trycatch_spec.rb +51 -0
  81. data/spec/mem/blunt_spec.rb +42 -0
  82. data/spec/redjs_spec.rb +10 -0
  83. data/spec/spec_helper.rb +45 -0
  84. data/spec/threading_spec.rb +52 -0
  85. data/spec/v8/context_spec.rb +19 -0
  86. data/spec/v8/conversion_spec.rb +9 -0
  87. data/spec/v8/error_spec.rb +21 -0
  88. data/spec/v8/function_spec.rb +9 -0
  89. data/spec/v8/object_spec.rb +15 -0
  90. data/thefrontside.png +0 -0
  91. data/therubyracer.gemspec +20 -0
  92. data/vendor/v8.dll +0 -0
  93. metadata +161 -0
@@ -0,0 +1,80 @@
1
+ #include "rr.h"
2
+
3
+ namespace rr {
4
+
5
+ void Script::Init() {
6
+ ClassBuilder("Script").
7
+ defineSingletonMethod("New", &New).
8
+ defineMethod("Run", &Run).
9
+ store(&Class);
10
+ ClassBuilder("ScriptOrigin").
11
+ defineSingletonMethod("new", &ScriptOrigin::initialize).
12
+ store(&ScriptOrigin::Class);
13
+ ClassBuilder("ScriptData").
14
+ defineSingletonMethod("PreCompile", &ScriptData::PreCompile).
15
+ defineSingletonMethod("New", &ScriptData::New).
16
+ defineMethod("Length", &ScriptData::Length).
17
+ defineMethod("Data", &ScriptData::Data).
18
+ defineMethod("HasError", &ScriptData::HasError).
19
+ store(&ScriptData::Class);
20
+ }
21
+
22
+ VALUE ScriptOrigin::initialize(int argc, VALUE argv[], VALUE self) {
23
+ VALUE name; VALUE line_offset; VALUE column_offset;
24
+ rb_scan_args(argc, argv, "12", &name, &line_offset, &column_offset);
25
+ v8::Handle<v8::Integer> loff = v8::Integer::New(RTEST(line_offset) ? NUM2INT(line_offset) : 0);
26
+ v8::Handle<v8::Integer> coff = v8::Integer::New(RTEST(column_offset) ? NUM2INT(column_offset) : 0);
27
+ return ScriptOrigin(new v8::ScriptOrigin(*String(name), loff, coff));
28
+ }
29
+
30
+ VALUE ScriptData::PreCompile(VALUE self, VALUE input, VALUE length) {
31
+ #ifdef HAVE_RUBY_ENCODING_H
32
+ if (!rb_equal(rb_enc_from_encoding(rb_utf8_encoding()), rb_obj_encoding(input))) {
33
+ rb_warn("ScriptData::Precompile only accepts UTF-8 encoded source, not: %s", RSTRING_PTR(rb_inspect(rb_obj_encoding(input))));
34
+ }
35
+ #endif
36
+ return ScriptData(v8::ScriptData::PreCompile(RSTRING_PTR(input), NUM2INT(length)));
37
+ }
38
+ VALUE ScriptData::New(VALUE self, VALUE data, VALUE length) {
39
+ return ScriptData(v8::ScriptData::New(RSTRING_PTR(data), NUM2INT(length)));
40
+ }
41
+ VALUE ScriptData::Length(VALUE self) {
42
+ return ScriptData(self)->Length();
43
+ }
44
+ VALUE ScriptData::Data(VALUE self) {
45
+ ScriptData data(self);
46
+ #ifdef HAVE_RUBY_ENCODING_H
47
+ return rb_enc_str_new(data->Data(), data->Length(), rb_enc_find("BINARY"));
48
+ #else
49
+ return rb_str_new(data->Data(), data->Length());
50
+ #endif
51
+ }
52
+
53
+ VALUE ScriptData::HasError(VALUE self) {
54
+ return ScriptData(self)->HasError();
55
+ }
56
+
57
+ VALUE Script::New(int argc, VALUE argv[], VALUE self) {
58
+ VALUE source; VALUE origin; VALUE pre_data; VALUE script_data;
59
+ rb_scan_args(argc, argv, "13", &source, &origin, &pre_data, &script_data);
60
+ if (argc == 2) {
61
+ VALUE filename = origin;
62
+ return Script(v8::Script::New(String(source), Value(filename)));
63
+ } else {
64
+ return Script(v8::Script::New(String(source), ScriptOrigin(origin), ScriptData(pre_data), String(script_data)));
65
+ }
66
+ }
67
+
68
+ VALUE Script::Run(VALUE self) {
69
+ return Value(Script(self)->Run());
70
+ }
71
+
72
+ template <> void Pointer<v8::ScriptData>::unwrap(VALUE value) {
73
+ Data_Get_Struct(value, class v8::ScriptData, pointer);
74
+ }
75
+
76
+ template <> void Pointer<v8::ScriptOrigin>::unwrap(VALUE value) {
77
+ Data_Get_Struct(value, class v8::ScriptOrigin, pointer);
78
+ }
79
+
80
+ } //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,75 @@
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("IsEval", &Frame::IsEval).
26
+ defineMethod("IsConstructor", &Frame::IsConstructor).
27
+ store(&Frame::Class);
28
+ }
29
+
30
+ VALUE Stack::Trace::GetFrame(VALUE self, VALUE index) {
31
+ return Frame(Trace(self)->GetFrame(NUM2UINT(index)));
32
+ }
33
+
34
+ VALUE Stack::Trace::GetFrameCount(VALUE self) {
35
+ return INT2FIX(Trace(self)->GetFrameCount());
36
+ }
37
+
38
+ VALUE Stack::Trace::AsArray(VALUE self) {
39
+ return Array(Trace(self)->AsArray());
40
+ }
41
+
42
+ VALUE Stack::Trace::CurrentStackTrace(int argc, VALUE argv[], VALUE self) {
43
+ VALUE frame_limit; VALUE options;
44
+ rb_scan_args(argc, argv, "11", &frame_limit, &options);
45
+ return Trace(v8::StackTrace::CurrentStackTrace(NUM2INT(frame_limit), StackTraceOptions(options)));
46
+ }
47
+
48
+ VALUE Stack::Frame::GetLineNumber(VALUE self) {
49
+ return INT2FIX(Frame(self)->GetLineNumber());
50
+ }
51
+
52
+ VALUE Stack::Frame::GetColumn(VALUE self) {
53
+ return INT2FIX(Frame(self)->GetColumn());
54
+ }
55
+
56
+ VALUE Stack::Frame::GetScriptName(VALUE self) {
57
+ return String(Frame(self)->GetScriptName());
58
+ }
59
+
60
+ VALUE Stack::Frame::GetScriptNameOrSourceURL(VALUE self) {
61
+ return String(Frame(self)->GetScriptNameOrSourceURL());
62
+ }
63
+
64
+ VALUE Stack::Frame::GetFunctionName(VALUE self) {
65
+ return String(Frame(self)->GetFunctionName());
66
+ }
67
+
68
+ VALUE Stack::Frame::IsEval(VALUE self) {
69
+ return Bool(Frame(self)->IsEval());
70
+ }
71
+
72
+ VALUE Stack::Frame::IsConstructor(VALUE self) {
73
+ return Bool(Frame(self)->IsConstructor());
74
+ }
75
+ }
@@ -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,86 @@
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() : impl(new v8::TryCatch()), allocated(true) {}
24
+ TryCatch::TryCatch(VALUE value) : allocated(false) {
25
+ Data_Get_Struct(value, class v8::TryCatch, impl);
26
+ }
27
+ TryCatch::~TryCatch() {
28
+ if (this->allocated) {
29
+ delete this->impl;
30
+ }
31
+ }
32
+ TryCatch::operator VALUE() {
33
+ return Data_Wrap_Struct(Class, 0, 0, impl);
34
+ }
35
+
36
+ VALUE TryCatch::HasCaught(VALUE self) {
37
+ return Bool(TryCatch(self)->HasCaught());
38
+ }
39
+ VALUE TryCatch::CanContinue(VALUE self) {
40
+ return Bool(TryCatch(self)->CanContinue());
41
+ }
42
+ VALUE TryCatch::ReThrow(VALUE self) {
43
+ return Value(TryCatch(self)->ReThrow());
44
+ }
45
+ VALUE TryCatch::Exception(VALUE self) {
46
+ return Value(TryCatch(self)->Exception());
47
+ }
48
+ VALUE TryCatch::StackTrace(VALUE self) {
49
+ return Value(TryCatch(self)->StackTrace());
50
+ }
51
+ VALUE TryCatch::Message(VALUE self) {
52
+ return rr::Message(TryCatch(self)->Message());
53
+ }
54
+ VALUE TryCatch::Reset(VALUE self) {
55
+ Void(TryCatch(self)->Reset());
56
+ }
57
+ VALUE TryCatch::SetVerbose(VALUE self, VALUE value) {
58
+ Void(TryCatch(self)->SetVerbose(Bool(value)));
59
+ }
60
+ VALUE TryCatch::SetCaptureMessage(VALUE self, VALUE value) {
61
+ Void(TryCatch(self)->SetCaptureMessage(Bool(value)));
62
+ }
63
+
64
+ VALUE TryCatch::doTryCatch(int argc, VALUE argv[], VALUE self) {
65
+ if (!rb_block_given_p()) {
66
+ return Qnil;
67
+ }
68
+ int state = 0;
69
+ VALUE code;
70
+ rb_scan_args(argc,argv,"00&", &code);
71
+ VALUE result = setupAndCall(&state, code);
72
+ if (state != 0) {
73
+ rb_jump_tag(state);
74
+ }
75
+ return result;
76
+ }
77
+
78
+ VALUE TryCatch::setupAndCall(int* state, VALUE code) {
79
+ return rb_protect(&doCall, code, state);
80
+ }
81
+
82
+ VALUE TryCatch::doCall(VALUE code) {
83
+ TryCatch trycatch;
84
+ return rb_funcall(code, rb_intern("call"), 1, (VALUE)trycatch);
85
+ }
86
+ }