therubyracer 0.10.2 → 0.11.0beta1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of therubyracer might be problematic. Click here for more details.

Files changed (159) hide show
  1. data/.gitignore +21 -11
  2. data/.travis.yml +2 -1
  3. data/Changelog.md +46 -0
  4. data/Gemfile +16 -1
  5. data/README.md +31 -13
  6. data/Rakefile +42 -23
  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 +56 -0
  11. data/ext/v8/build.rb +51 -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 +14 -18
  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 +878 -36
  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 +30 -22
  40. data/lib/v8/access.rb +5 -87
  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 +19 -10
  45. data/lib/v8/context.rb +85 -78
  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 +18 -123
  62. data/lib/v8/error/protect.rb +20 -0
  63. data/lib/v8/error/try.rb +15 -0
  64. data/lib/v8/function.rb +18 -34
  65. data/lib/v8/object.rb +48 -52
  66. data/lib/v8/util/weakcell.rb +29 -0
  67. data/lib/v8/version.rb +2 -2
  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 +40 -4
  83. data/spec/threading_spec.rb +52 -0
  84. data/spec/v8/context_spec.rb +19 -0
  85. data/spec/v8/conversion_spec.rb +9 -0
  86. data/spec/v8/error_spec.rb +15 -125
  87. data/spec/v8/function_spec.rb +9 -0
  88. data/therubyracer.gemspec +15 -24
  89. metadata +102 -135
  90. data/.gitmodules +0 -3
  91. data/.rspec +0 -1
  92. data/.yardopts +0 -1
  93. data/bin/therubyracer +0 -11
  94. data/ext/v8/rr.cpp +0 -189
  95. data/ext/v8/v8.cpp +0 -48
  96. data/ext/v8/v8_array.cpp +0 -48
  97. data/ext/v8/v8_array.h +0 -8
  98. data/ext/v8/v8_callbacks.cpp +0 -81
  99. data/ext/v8/v8_callbacks.h +0 -8
  100. data/ext/v8/v8_context.cpp +0 -92
  101. data/ext/v8/v8_context.h +0 -6
  102. data/ext/v8/v8_date.cpp +0 -34
  103. data/ext/v8/v8_date.h +0 -6
  104. data/ext/v8/v8_debug.cpp +0 -17
  105. data/ext/v8/v8_debug.h +0 -6
  106. data/ext/v8/v8_exception.cpp +0 -133
  107. data/ext/v8/v8_exception.h +0 -11
  108. data/ext/v8/v8_external.cpp +0 -70
  109. data/ext/v8/v8_external.h +0 -8
  110. data/ext/v8/v8_function.cpp +0 -69
  111. data/ext/v8/v8_function.h +0 -11
  112. data/ext/v8/v8_handle.cpp +0 -186
  113. data/ext/v8/v8_handle.h +0 -48
  114. data/ext/v8/v8_locker.cpp +0 -139
  115. data/ext/v8/v8_locker.h +0 -6
  116. data/ext/v8/v8_message.cpp +0 -67
  117. data/ext/v8/v8_message.h +0 -10
  118. data/ext/v8/v8_object.cpp +0 -122
  119. data/ext/v8/v8_object.h +0 -10
  120. data/ext/v8/v8_script.cpp +0 -36
  121. data/ext/v8/v8_script.h +0 -8
  122. data/ext/v8/v8_string.cpp +0 -52
  123. data/ext/v8/v8_string.h +0 -9
  124. data/ext/v8/v8_template.cpp +0 -344
  125. data/ext/v8/v8_template.h +0 -8
  126. data/ext/v8/v8_try_catch.cpp +0 -70
  127. data/ext/v8/v8_try_catch.h +0 -5
  128. data/ext/v8/v8_v8.cpp +0 -35
  129. data/ext/v8/v8_v8.h +0 -6
  130. data/ext/v8/v8_value.cpp +0 -175
  131. data/ext/v8/v8_value.h +0 -10
  132. data/ext/v8/v8_weakref.cpp +0 -61
  133. data/ext/v8/v8_weakref.h +0 -29
  134. data/lib/v8/c/locker.rb +0 -18
  135. data/lib/v8/cli.rb +0 -133
  136. data/lib/v8/portal.rb +0 -86
  137. data/lib/v8/portal/caller.rb +0 -37
  138. data/lib/v8/portal/constructor.rb +0 -98
  139. data/lib/v8/portal/function.rb +0 -63
  140. data/lib/v8/portal/interceptors.rb +0 -152
  141. data/lib/v8/portal/proxies.rb +0 -151
  142. data/lib/v8/portal/templates.rb +0 -73
  143. data/lib/v8/stack.rb +0 -66
  144. data/lib/v8/tap.rb +0 -9
  145. data/spec/ext/array_spec.rb +0 -15
  146. data/spec/ext/cxt_spec.rb +0 -57
  147. data/spec/ext/ext_spec_helper.rb +0 -27
  148. data/spec/ext/func_spec.rb +0 -64
  149. data/spec/ext/object_spec.rb +0 -10
  150. data/spec/ext/string_spec.rb +0 -11
  151. data/spec/ext/try_catch_spec.rb +0 -60
  152. data/spec/redjs_helper.rb +0 -3
  153. data/spec/v8/portal/proxies_spec.rb +0 -106
  154. data/specmem/handle_memspec.rb +0 -41
  155. data/specmem/object_memspec.rb +0 -14
  156. data/specmem/proxies_memspec.rb +0 -49
  157. data/specmem/spec_helper.rb +0 -24
  158. data/specthread/spec_helper.rb +0 -2
  159. data/specthread/threading_spec.rb +0 -13
data/ext/v8/script.cc ADDED
@@ -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
+ }
data/ext/v8/stack.cc ADDED
@@ -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
+ }
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
@@ -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
+ }