rice 1.2.0 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (65) hide show
  1. data/Doxyfile +1 -1
  2. data/Makefile.in +130 -52
  3. data/README +45 -79
  4. data/Rakefile +1 -36
  5. data/aclocal.m4 +133 -61
  6. data/config.guess +43 -8
  7. data/config.sub +41 -13
  8. data/configure +1370 -1898
  9. data/configure.ac +2 -2
  10. data/doxygen.ac +1 -1
  11. data/extconf.rb +3 -1
  12. data/rice/Arg_impl.hpp +2 -2
  13. data/rice/Data_Type.cpp +34 -1
  14. data/rice/Data_Type.ipp +14 -5
  15. data/rice/Data_Type_defn.hpp +28 -1
  16. data/rice/Director.cpp +0 -6
  17. data/rice/Director.hpp +0 -8
  18. data/rice/Hash.hpp +1 -1
  19. data/rice/Makefile.am +2 -12
  20. data/rice/Makefile.in +111 -88
  21. data/rice/Object.cpp +8 -1
  22. data/rice/Object.ipp +1 -1
  23. data/rice/Object_defn.hpp +8 -0
  24. data/rice/config.hpp +3 -0
  25. data/rice/config.hpp.in +3 -0
  26. data/rice/detail/Auto_Function_Wrapper.ipp +1025 -512
  27. data/rice/detail/Auto_Member_Function_Wrapper.ipp +545 -272
  28. data/rice/detail/cfp.hpp +24 -0
  29. data/rice/detail/cfp.ipp +51 -0
  30. data/rice/detail/method_data.cpp +107 -336
  31. data/rice/detail/node.hpp +13 -13
  32. data/rice/detail/ruby.hpp +4 -0
  33. data/rice/detail/rubysig.hpp +19 -19
  34. data/rice/detail/traits.hpp +43 -0
  35. data/rice/generate_code.rb +37 -16
  36. data/rice/protect.hpp +1 -1
  37. data/rice/protect.ipp +448 -192
  38. data/rice/to_from_ruby.ipp +4 -12
  39. data/rice/to_from_ruby_defn.hpp +2 -2
  40. data/ruby/Makefile.in +99 -32
  41. data/ruby/lib/Makefile.in +61 -21
  42. data/ruby/lib/mkmf-rice.rb.in +9 -2
  43. data/ruby/lib/version.rb +1 -1
  44. data/sample/Makefile.in +33 -10
  45. data/test/Makefile.am +27 -0
  46. data/test/Makefile.in +270 -59
  47. data/test/ext/Makefile.am +43 -0
  48. data/test/ext/Makefile.in +399 -0
  49. data/test/ext/t1/Foo.hpp +10 -0
  50. data/test/ext/t1/extconf.rb +2 -0
  51. data/test/ext/t1/t1.cpp +15 -0
  52. data/test/ext/t2/extconf.rb +2 -0
  53. data/test/ext/t2/t2.cpp +11 -0
  54. data/test/test_Allocation_Strategies.cpp +1 -1
  55. data/test/test_Class.cpp +79 -0
  56. data/test/test_Data_Type.cpp +2 -2
  57. data/test/test_Director.cpp +114 -38
  58. data/test/test_Module.cpp +27 -2
  59. data/test/test_To_From_Ruby.cpp +4 -4
  60. data/test/test_rice.rb +9 -1
  61. metadata +23 -8
  62. data/rice/detail/method_data.cpp.rpp +0 -301
  63. data/rice/detail/mininode.cpp.rpp +0 -62
  64. data/rice/detail/mininode.hpp.rpp +0 -119
  65. data/rice/detail/remove_const.hpp +0 -21
@@ -1,13 +1,13 @@
1
- #ifndef Rice__detail__node__hpp_
2
- #define Rice__detail__node__hpp_
3
-
4
- /**
5
- * Helper header for the node.h ruby include file, which does
6
- * not have extern "C"
7
- */
8
-
9
- extern "C" {
10
- #include "node.h"
11
- }
12
-
13
- #endif
1
+ #ifndef Rice__detail__node__hpp_
2
+ #define Rice__detail__node__hpp_
3
+
4
+ /**
5
+ * Helper header for the node.h ruby include file, which does
6
+ * not have extern "C"
7
+ */
8
+
9
+ extern "C" {
10
+ #include "node.h"
11
+ }
12
+
13
+ #endif
@@ -65,6 +65,10 @@ extern "C" typedef VALUE (*RUBY_VALUE_FUNC)(VALUE);
65
65
  #define RHASH_TBL(hsh) RHASH(hsh)->tbl
66
66
  #endif
67
67
 
68
+ #ifndef RCLASS_M_TBL
69
+ #define RCLASS_M_TBL(c) RCLASS(c)->m_tbl
70
+ #endif
71
+
68
72
  // ruby.h has a few defines that conflict with Visual Studio's STL
69
73
  #if defined(_MSC_VER)
70
74
  #undef write
@@ -1,19 +1,19 @@
1
- #ifndef Rice__detail__rubysig__hpp_
2
- #define Rice__detail__rubysig__hpp_
3
-
4
- #include "ruby_version_code.hpp"
5
-
6
- /**
7
- * Helper header for the rubysig.h ruby include file, which does
8
- * not have extern "C"
9
- */
10
-
11
- #if RICE__RUBY_VERSION_CODE < 190
12
-
13
- extern "C" {
14
- #include "rubysig.h"
15
- }
16
-
17
- #endif
18
-
19
- #endif
1
+ #ifndef Rice__detail__rubysig__hpp_
2
+ #define Rice__detail__rubysig__hpp_
3
+
4
+ #include "ruby_version_code.hpp"
5
+
6
+ /**
7
+ * Helper header for the rubysig.h ruby include file, which does
8
+ * not have extern "C"
9
+ */
10
+
11
+ #if RICE__RUBY_VERSION_CODE < 190
12
+
13
+ extern "C" {
14
+ #include "rubysig.h"
15
+ }
16
+
17
+ #endif
18
+
19
+ #endif
@@ -0,0 +1,43 @@
1
+ #ifndef Rice__detail__traits__hpp_
2
+ #define Rice__detail__traits__hpp_
3
+
4
+ namespace Rice
5
+ {
6
+ namespace detail
7
+ {
8
+
9
+ /**
10
+ * Remove const from a type
11
+ */
12
+ template<typename T>
13
+ struct remove_const { typedef T Type; };
14
+
15
+ template<typename T>
16
+ struct remove_const<const T> { typedef T Type; };
17
+
18
+ /**
19
+ * Remove a reference from a type
20
+ */
21
+ template<typename T>
22
+ struct remove_ref { typedef T Type; };
23
+
24
+ template<typename T>
25
+ struct remove_ref<T &> { typedef T Type; };
26
+
27
+ /**
28
+ * Do both of the above in one easy step
29
+ */
30
+ template<typename T>
31
+ struct sanitize
32
+ {
33
+ typedef T Type;
34
+ //typedef typename remove_const<
35
+ //typename remove_ref<T>::Type
36
+ //>::Type Type;
37
+ };
38
+
39
+ }
40
+ }
41
+
42
+
43
+ #endif // Rice__detail__traits__hpp_
@@ -124,7 +124,7 @@ docstring = <<END
124
124
  /*! E.g.:
125
125
  * \\code
126
126
  * VALUE x = protect(rb_ary_new);
127
- * protect(rb_ary_push(x, INT2NUM(42));
127
+ * protect(rb_ary_push, x, INT2NUM(42));
128
128
  * \\endcode
129
129
  *
130
130
  * Note that this function makes copies of all of its arguments; it
@@ -139,48 +139,64 @@ ipp_template = <<END
139
139
  namespace detail
140
140
  {
141
141
 
142
- template<typename Fun%(typenames)>
142
+ template<typename Ret_T, typename Fun%(typenames)>
143
143
  class Ruby_Function_%(j)
144
144
  {
145
145
  public:
146
146
  Ruby_Function_%(j)(Fun f%(member_args));
147
- inline VALUE operator()();
147
+ inline void operator()();
148
148
  static inline VALUE call(Ruby_Function_%(j) * f);
149
+ Ret_T const & result() const { return result_; }
150
+
149
151
  private:
150
152
  Fun f_;
151
153
  %(member_decls)
154
+ Ret_T result_; // TODO: use placement new
152
155
  };
153
156
 
154
- template<typename Fun%(typenames)>
155
- inline Ruby_Function_%(j)<Fun%(types)>::
157
+ template<typename Ret_T, typename Fun%(typenames)>
158
+ inline Ruby_Function_%(j)<Ret_T, Fun%(types)>::
156
159
  Ruby_Function_%(j)(Fun f%(member_args))
157
160
  : f_(f)%(initializers)
158
161
  { }
159
162
 
160
- template<typename Fun%(typenames)>
161
- inline VALUE Ruby_Function_%(j)<Fun%(types)>::
163
+ template<typename Ret_T, typename Fun%(typenames)>
164
+ inline void Ruby_Function_%(j)<Ret_T, Fun%(types)>::
162
165
  operator()()
163
166
  {
164
- return f_(%(member_params));
167
+ result_ = f_(%(member_params));
165
168
  }
166
169
 
167
- template<typename Fun%(typenames)>
168
- inline VALUE Ruby_Function_%(j)<Fun%(types)>::
170
+ template<typename Ret_T, typename Fun%(typenames)>
171
+ inline VALUE Ruby_Function_%(j)<Ret_T, Fun%(types)>::
169
172
  call(Ruby_Function_%(j) * f)
170
173
  {
171
- return (*f)();
174
+ (*f)();
175
+ return Qnil;
172
176
  }
173
177
 
174
178
  } // namespace detail
175
179
 
180
+ template<typename Ret_T, typename Fun%(typenames)>
181
+ inline Ret_T protect(Fun fun%(args))
182
+ {
183
+ typedef detail::Ruby_Function_%(j)<Ret_T, Fun%(types)> RF;
184
+ RF f(fun%(params));
185
+ detail::protect(
186
+ RUBY_VALUE_FUNC(RF::call),
187
+ reinterpret_cast<VALUE>(&f));
188
+ return f.result();
189
+ }
190
+
176
191
  template<typename Fun%(typenames)>
177
192
  inline VALUE protect(Fun fun%(args))
178
193
  {
179
- typedef detail::Ruby_Function_%(j)<Fun%(types)> RF;
194
+ typedef detail::Ruby_Function_%(j)<VALUE, Fun%(types)> RF;
180
195
  RF f(fun%(params));
181
- return detail::protect(
196
+ detail::protect(
182
197
  RUBY_VALUE_FUNC(RF::call),
183
198
  reinterpret_cast<VALUE>(&f));
199
+ return f.result();
184
200
  }
185
201
 
186
202
  // ---------------------------------------------------------------------
@@ -521,6 +537,7 @@ ipp_head = <<END
521
537
  #include "method_data.hpp"
522
538
  #include "../ruby_try_catch.hpp"
523
539
  #include "../to_from_ruby.hpp"
540
+ #include "traits.hpp"
524
541
  END
525
542
  ipp_tail = <<END
526
543
  template<typename Func_T, typename Ret_T>
@@ -669,11 +686,13 @@ wrap_header(hpp_filename, 'Rice::detail', docstring, true, hpp_head) do |hpp|
669
686
  scan_args_list = t_array.map { |x| ", &varg#{x}"}
670
687
  typenames = t_array.map { |x| "Arg#{x}_T" }.join(', ')
671
688
  arg_convert_list = t_array.map do |x|
672
- "Arg#{x}_T arg#{x} = args->getArgumentOrDefault<Arg#{x}_T>(#{x}, varg#{x});"
689
+ "typedef typename sanitize< Arg#{x}_T >::Type Arg#{x}_Type;\n\t\t" +
690
+ "Arg#{x}_Type arg#{x} = args->getArgumentOrDefault<Arg#{x}_Type>(#{x}, varg#{x});"
673
691
  end.join("\n\t\t\t")
674
692
  self_arg_convert_list = (0...j).to_a.map do |x|
675
693
  n = x + 1
676
- "Arg#{n}_T arg#{n} = args->getArgumentOrDefault<Arg#{n}_T>(#{x}, varg#{x});"
694
+ "typedef typename sanitize< Arg#{n}_T >::Type Arg#{n}_Type;\n\t\t" +
695
+ "Arg#{n}_Type arg#{n} = args->getArgumentOrDefault<Arg#{n}_Type>(#{x}, varg#{x});"
677
696
  end.join("\n\t\t\t")
678
697
  if j == MAX_ARGS then
679
698
  typename_list = t_array.map { |x| "typename Arg#{x}_T" }.join(', ')
@@ -1045,6 +1064,7 @@ ipp_head = <<END
1045
1064
  #include "method_data.hpp"
1046
1065
  #include "../ruby_try_catch.hpp"
1047
1066
  #include "../to_from_ruby.hpp"
1067
+ #include "traits.hpp"
1048
1068
  #include <typeinfo>
1049
1069
  END
1050
1070
  ipp_filename = 'detail/Auto_Member_Function_Wrapper.ipp'
@@ -1059,7 +1079,8 @@ wrap_header(hpp_filename, 'Rice::detail', docstring, true) do |hpp|
1059
1079
  typenames = t_array.map { |x| ", Arg#{x}_T" }
1060
1080
  typenames_n = t_array.map { |x| "Arg#{x}_T" }.join(', ')
1061
1081
  arg_convert_list = t_array.map do |x|
1062
- "Arg#{x}_T arg#{x} = args->getArgumentOrDefault<Arg#{x}_T>(#{x}, varg#{x});"
1082
+ "typedef typename sanitize< Arg#{x}_T >::Type Arg#{x}_Type;\n\t\t" +
1083
+ "Arg#{x}_Type arg#{x} = args->getArgumentOrDefault<Arg#{x}_Type>(#{x}, varg#{x});"
1063
1084
  end.join("\n\t\t")
1064
1085
  if j == MAX_ARGS then
1065
1086
  typename_list = t_array.map { |x| ", typename Arg#{x}_T" }.join
@@ -21,7 +21,7 @@ namespace Rice
21
21
  /*! E.g.:
22
22
  * \code
23
23
  * VALUE x = protect(rb_ary_new);
24
- * protect(rb_ary_push(x, INT2NUM(42));
24
+ * protect(rb_ary_push, x, INT2NUM(42));
25
25
  * \endcode
26
26
  *
27
27
  * Note that this function makes copies of all of its arguments; it
@@ -14,48 +14,64 @@ namespace Rice
14
14
  namespace detail
15
15
  {
16
16
 
17
- template<typename Fun>
17
+ template<typename Ret_T, typename Fun>
18
18
  class Ruby_Function_0
19
19
  {
20
20
  public:
21
21
  Ruby_Function_0(Fun f);
22
- inline VALUE operator()();
22
+ inline void operator()();
23
23
  static inline VALUE call(Ruby_Function_0 * f);
24
+ Ret_T const & result() const { return result_; }
25
+
24
26
  private:
25
27
  Fun f_;
26
28
 
29
+ Ret_T result_; // TODO: use placement new
27
30
  };
28
31
 
29
- template<typename Fun>
30
- inline Ruby_Function_0<Fun>::
32
+ template<typename Ret_T, typename Fun>
33
+ inline Ruby_Function_0<Ret_T, Fun>::
31
34
  Ruby_Function_0(Fun f)
32
35
  : f_(f)
33
36
  { }
34
37
 
35
- template<typename Fun>
36
- inline VALUE Ruby_Function_0<Fun>::
38
+ template<typename Ret_T, typename Fun>
39
+ inline void Ruby_Function_0<Ret_T, Fun>::
37
40
  operator()()
38
41
  {
39
- return f_();
42
+ result_ = f_();
40
43
  }
41
44
 
42
- template<typename Fun>
43
- inline VALUE Ruby_Function_0<Fun>::
45
+ template<typename Ret_T, typename Fun>
46
+ inline VALUE Ruby_Function_0<Ret_T, Fun>::
44
47
  call(Ruby_Function_0 * f)
45
48
  {
46
- return (*f)();
49
+ (*f)();
50
+ return Qnil;
47
51
  }
48
52
 
49
53
  } // namespace detail
50
54
 
55
+ template<typename Ret_T, typename Fun>
56
+ inline Ret_T protect(Fun fun)
57
+ {
58
+ typedef detail::Ruby_Function_0<Ret_T, Fun> RF;
59
+ RF f(fun);
60
+ detail::protect(
61
+ RUBY_VALUE_FUNC(RF::call),
62
+ reinterpret_cast<VALUE>(&f));
63
+ return f.result();
64
+ }
65
+
51
66
  template<typename Fun>
52
67
  inline VALUE protect(Fun fun)
53
68
  {
54
- typedef detail::Ruby_Function_0<Fun> RF;
69
+ typedef detail::Ruby_Function_0<VALUE, Fun> RF;
55
70
  RF f(fun);
56
- return detail::protect(
71
+ detail::protect(
57
72
  RUBY_VALUE_FUNC(RF::call),
58
73
  reinterpret_cast<VALUE>(&f));
74
+ return f.result();
59
75
  }
60
76
 
61
77
  // ---------------------------------------------------------------------
@@ -63,48 +79,64 @@ inline VALUE protect(Fun fun)
63
79
  namespace detail
64
80
  {
65
81
 
66
- template<typename Fun, typename T1>
82
+ template<typename Ret_T, typename Fun, typename T1>
67
83
  class Ruby_Function_1
68
84
  {
69
85
  public:
70
86
  Ruby_Function_1(Fun f, T1 const & t1);
71
- inline VALUE operator()();
87
+ inline void operator()();
72
88
  static inline VALUE call(Ruby_Function_1 * f);
89
+ Ret_T const & result() const { return result_; }
90
+
73
91
  private:
74
92
  Fun f_;
75
93
  T1 const & t1_;
94
+ Ret_T result_; // TODO: use placement new
76
95
  };
77
96
 
78
- template<typename Fun, typename T1>
79
- inline Ruby_Function_1<Fun, T1>::
97
+ template<typename Ret_T, typename Fun, typename T1>
98
+ inline Ruby_Function_1<Ret_T, Fun, T1>::
80
99
  Ruby_Function_1(Fun f, T1 const & t1)
81
100
  : f_(f), t1_(t1)
82
101
  { }
83
102
 
84
- template<typename Fun, typename T1>
85
- inline VALUE Ruby_Function_1<Fun, T1>::
103
+ template<typename Ret_T, typename Fun, typename T1>
104
+ inline void Ruby_Function_1<Ret_T, Fun, T1>::
86
105
  operator()()
87
106
  {
88
- return f_(t1_);
107
+ result_ = f_(t1_);
89
108
  }
90
109
 
91
- template<typename Fun, typename T1>
92
- inline VALUE Ruby_Function_1<Fun, T1>::
110
+ template<typename Ret_T, typename Fun, typename T1>
111
+ inline VALUE Ruby_Function_1<Ret_T, Fun, T1>::
93
112
  call(Ruby_Function_1 * f)
94
113
  {
95
- return (*f)();
114
+ (*f)();
115
+ return Qnil;
96
116
  }
97
117
 
98
118
  } // namespace detail
99
119
 
120
+ template<typename Ret_T, typename Fun, typename T1>
121
+ inline Ret_T protect(Fun fun, T1 const & t1)
122
+ {
123
+ typedef detail::Ruby_Function_1<Ret_T, Fun, T1> RF;
124
+ RF f(fun, t1);
125
+ detail::protect(
126
+ RUBY_VALUE_FUNC(RF::call),
127
+ reinterpret_cast<VALUE>(&f));
128
+ return f.result();
129
+ }
130
+
100
131
  template<typename Fun, typename T1>
101
132
  inline VALUE protect(Fun fun, T1 const & t1)
102
133
  {
103
- typedef detail::Ruby_Function_1<Fun, T1> RF;
134
+ typedef detail::Ruby_Function_1<VALUE, Fun, T1> RF;
104
135
  RF f(fun, t1);
105
- return detail::protect(
136
+ detail::protect(
106
137
  RUBY_VALUE_FUNC(RF::call),
107
138
  reinterpret_cast<VALUE>(&f));
139
+ return f.result();
108
140
  }
109
141
 
110
142
  // ---------------------------------------------------------------------
@@ -112,48 +144,64 @@ inline VALUE protect(Fun fun, T1 const & t1)
112
144
  namespace detail
113
145
  {
114
146
 
115
- template<typename Fun, typename T1, typename T2>
147
+ template<typename Ret_T, typename Fun, typename T1, typename T2>
116
148
  class Ruby_Function_2
117
149
  {
118
150
  public:
119
151
  Ruby_Function_2(Fun f, T1 const & t1, T2 const & t2);
120
- inline VALUE operator()();
152
+ inline void operator()();
121
153
  static inline VALUE call(Ruby_Function_2 * f);
154
+ Ret_T const & result() const { return result_; }
155
+
122
156
  private:
123
157
  Fun f_;
124
158
  T1 const & t1_; T2 const & t2_;
159
+ Ret_T result_; // TODO: use placement new
125
160
  };
126
161
 
127
- template<typename Fun, typename T1, typename T2>
128
- inline Ruby_Function_2<Fun, T1, T2>::
162
+ template<typename Ret_T, typename Fun, typename T1, typename T2>
163
+ inline Ruby_Function_2<Ret_T, Fun, T1, T2>::
129
164
  Ruby_Function_2(Fun f, T1 const & t1, T2 const & t2)
130
165
  : f_(f), t1_(t1), t2_(t2)
131
166
  { }
132
167
 
133
- template<typename Fun, typename T1, typename T2>
134
- inline VALUE Ruby_Function_2<Fun, T1, T2>::
168
+ template<typename Ret_T, typename Fun, typename T1, typename T2>
169
+ inline void Ruby_Function_2<Ret_T, Fun, T1, T2>::
135
170
  operator()()
136
171
  {
137
- return f_(t1_, t2_);
172
+ result_ = f_(t1_, t2_);
138
173
  }
139
174
 
140
- template<typename Fun, typename T1, typename T2>
141
- inline VALUE Ruby_Function_2<Fun, T1, T2>::
175
+ template<typename Ret_T, typename Fun, typename T1, typename T2>
176
+ inline VALUE Ruby_Function_2<Ret_T, Fun, T1, T2>::
142
177
  call(Ruby_Function_2 * f)
143
178
  {
144
- return (*f)();
179
+ (*f)();
180
+ return Qnil;
145
181
  }
146
182
 
147
183
  } // namespace detail
148
184
 
185
+ template<typename Ret_T, typename Fun, typename T1, typename T2>
186
+ inline Ret_T protect(Fun fun, T1 const & t1, T2 const & t2)
187
+ {
188
+ typedef detail::Ruby_Function_2<Ret_T, Fun, T1, T2> RF;
189
+ RF f(fun, t1, t2);
190
+ detail::protect(
191
+ RUBY_VALUE_FUNC(RF::call),
192
+ reinterpret_cast<VALUE>(&f));
193
+ return f.result();
194
+ }
195
+
149
196
  template<typename Fun, typename T1, typename T2>
150
197
  inline VALUE protect(Fun fun, T1 const & t1, T2 const & t2)
151
198
  {
152
- typedef detail::Ruby_Function_2<Fun, T1, T2> RF;
199
+ typedef detail::Ruby_Function_2<VALUE, Fun, T1, T2> RF;
153
200
  RF f(fun, t1, t2);
154
- return detail::protect(
201
+ detail::protect(
155
202
  RUBY_VALUE_FUNC(RF::call),
156
203
  reinterpret_cast<VALUE>(&f));
204
+ return f.result();
157
205
  }
158
206
 
159
207
  // ---------------------------------------------------------------------
@@ -161,48 +209,64 @@ inline VALUE protect(Fun fun, T1 const & t1, T2 const & t2)
161
209
  namespace detail
162
210
  {
163
211
 
164
- template<typename Fun, typename T1, typename T2, typename T3>
212
+ template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3>
165
213
  class Ruby_Function_3
166
214
  {
167
215
  public:
168
216
  Ruby_Function_3(Fun f, T1 const & t1, T2 const & t2, T3 const & t3);
169
- inline VALUE operator()();
217
+ inline void operator()();
170
218
  static inline VALUE call(Ruby_Function_3 * f);
219
+ Ret_T const & result() const { return result_; }
220
+
171
221
  private:
172
222
  Fun f_;
173
223
  T1 const & t1_; T2 const & t2_; T3 const & t3_;
224
+ Ret_T result_; // TODO: use placement new
174
225
  };
175
226
 
176
- template<typename Fun, typename T1, typename T2, typename T3>
177
- inline Ruby_Function_3<Fun, T1, T2, T3>::
227
+ template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3>
228
+ inline Ruby_Function_3<Ret_T, Fun, T1, T2, T3>::
178
229
  Ruby_Function_3(Fun f, T1 const & t1, T2 const & t2, T3 const & t3)
179
230
  : f_(f), t1_(t1), t2_(t2), t3_(t3)
180
231
  { }
181
232
 
182
- template<typename Fun, typename T1, typename T2, typename T3>
183
- inline VALUE Ruby_Function_3<Fun, T1, T2, T3>::
233
+ template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3>
234
+ inline void Ruby_Function_3<Ret_T, Fun, T1, T2, T3>::
184
235
  operator()()
185
236
  {
186
- return f_(t1_, t2_, t3_);
237
+ result_ = f_(t1_, t2_, t3_);
187
238
  }
188
239
 
189
- template<typename Fun, typename T1, typename T2, typename T3>
190
- inline VALUE Ruby_Function_3<Fun, T1, T2, T3>::
240
+ template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3>
241
+ inline VALUE Ruby_Function_3<Ret_T, Fun, T1, T2, T3>::
191
242
  call(Ruby_Function_3 * f)
192
243
  {
193
- return (*f)();
244
+ (*f)();
245
+ return Qnil;
194
246
  }
195
247
 
196
248
  } // namespace detail
197
249
 
250
+ template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3>
251
+ inline Ret_T protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3)
252
+ {
253
+ typedef detail::Ruby_Function_3<Ret_T, Fun, T1, T2, T3> RF;
254
+ RF f(fun, t1, t2, t3);
255
+ detail::protect(
256
+ RUBY_VALUE_FUNC(RF::call),
257
+ reinterpret_cast<VALUE>(&f));
258
+ return f.result();
259
+ }
260
+
198
261
  template<typename Fun, typename T1, typename T2, typename T3>
199
262
  inline VALUE protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3)
200
263
  {
201
- typedef detail::Ruby_Function_3<Fun, T1, T2, T3> RF;
264
+ typedef detail::Ruby_Function_3<VALUE, Fun, T1, T2, T3> RF;
202
265
  RF f(fun, t1, t2, t3);
203
- return detail::protect(
266
+ detail::protect(
204
267
  RUBY_VALUE_FUNC(RF::call),
205
268
  reinterpret_cast<VALUE>(&f));
269
+ return f.result();
206
270
  }
207
271
 
208
272
  // ---------------------------------------------------------------------
@@ -210,48 +274,64 @@ inline VALUE protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3)
210
274
  namespace detail
211
275
  {
212
276
 
213
- template<typename Fun, typename T1, typename T2, typename T3, typename T4>
277
+ template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4>
214
278
  class Ruby_Function_4
215
279
  {
216
280
  public:
217
281
  Ruby_Function_4(Fun f, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4);
218
- inline VALUE operator()();
282
+ inline void operator()();
219
283
  static inline VALUE call(Ruby_Function_4 * f);
284
+ Ret_T const & result() const { return result_; }
285
+
220
286
  private:
221
287
  Fun f_;
222
288
  T1 const & t1_; T2 const & t2_; T3 const & t3_; T4 const & t4_;
289
+ Ret_T result_; // TODO: use placement new
223
290
  };
224
291
 
225
- template<typename Fun, typename T1, typename T2, typename T3, typename T4>
226
- inline Ruby_Function_4<Fun, T1, T2, T3, T4>::
292
+ template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4>
293
+ inline Ruby_Function_4<Ret_T, Fun, T1, T2, T3, T4>::
227
294
  Ruby_Function_4(Fun f, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4)
228
295
  : f_(f), t1_(t1), t2_(t2), t3_(t3), t4_(t4)
229
296
  { }
230
297
 
231
- template<typename Fun, typename T1, typename T2, typename T3, typename T4>
232
- inline VALUE Ruby_Function_4<Fun, T1, T2, T3, T4>::
298
+ template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4>
299
+ inline void Ruby_Function_4<Ret_T, Fun, T1, T2, T3, T4>::
233
300
  operator()()
234
301
  {
235
- return f_(t1_, t2_, t3_, t4_);
302
+ result_ = f_(t1_, t2_, t3_, t4_);
236
303
  }
237
304
 
238
- template<typename Fun, typename T1, typename T2, typename T3, typename T4>
239
- inline VALUE Ruby_Function_4<Fun, T1, T2, T3, T4>::
305
+ template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4>
306
+ inline VALUE Ruby_Function_4<Ret_T, Fun, T1, T2, T3, T4>::
240
307
  call(Ruby_Function_4 * f)
241
308
  {
242
- return (*f)();
309
+ (*f)();
310
+ return Qnil;
243
311
  }
244
312
 
245
313
  } // namespace detail
246
314
 
315
+ template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4>
316
+ inline Ret_T protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4)
317
+ {
318
+ typedef detail::Ruby_Function_4<Ret_T, Fun, T1, T2, T3, T4> RF;
319
+ RF f(fun, t1, t2, t3, t4);
320
+ detail::protect(
321
+ RUBY_VALUE_FUNC(RF::call),
322
+ reinterpret_cast<VALUE>(&f));
323
+ return f.result();
324
+ }
325
+
247
326
  template<typename Fun, typename T1, typename T2, typename T3, typename T4>
248
327
  inline VALUE protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4)
249
328
  {
250
- typedef detail::Ruby_Function_4<Fun, T1, T2, T3, T4> RF;
329
+ typedef detail::Ruby_Function_4<VALUE, Fun, T1, T2, T3, T4> RF;
251
330
  RF f(fun, t1, t2, t3, t4);
252
- return detail::protect(
331
+ detail::protect(
253
332
  RUBY_VALUE_FUNC(RF::call),
254
333
  reinterpret_cast<VALUE>(&f));
334
+ return f.result();
255
335
  }
256
336
 
257
337
  // ---------------------------------------------------------------------
@@ -259,48 +339,64 @@ inline VALUE protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3, T4 co
259
339
  namespace detail
260
340
  {
261
341
 
262
- template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5>
342
+ template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5>
263
343
  class Ruby_Function_5
264
344
  {
265
345
  public:
266
346
  Ruby_Function_5(Fun f, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5);
267
- inline VALUE operator()();
347
+ inline void operator()();
268
348
  static inline VALUE call(Ruby_Function_5 * f);
349
+ Ret_T const & result() const { return result_; }
350
+
269
351
  private:
270
352
  Fun f_;
271
353
  T1 const & t1_; T2 const & t2_; T3 const & t3_; T4 const & t4_; T5 const & t5_;
354
+ Ret_T result_; // TODO: use placement new
272
355
  };
273
356
 
274
- template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5>
275
- inline Ruby_Function_5<Fun, T1, T2, T3, T4, T5>::
357
+ template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5>
358
+ inline Ruby_Function_5<Ret_T, Fun, T1, T2, T3, T4, T5>::
276
359
  Ruby_Function_5(Fun f, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5)
277
360
  : f_(f), t1_(t1), t2_(t2), t3_(t3), t4_(t4), t5_(t5)
278
361
  { }
279
362
 
280
- template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5>
281
- inline VALUE Ruby_Function_5<Fun, T1, T2, T3, T4, T5>::
363
+ template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5>
364
+ inline void Ruby_Function_5<Ret_T, Fun, T1, T2, T3, T4, T5>::
282
365
  operator()()
283
366
  {
284
- return f_(t1_, t2_, t3_, t4_, t5_);
367
+ result_ = f_(t1_, t2_, t3_, t4_, t5_);
285
368
  }
286
369
 
287
- template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5>
288
- inline VALUE Ruby_Function_5<Fun, T1, T2, T3, T4, T5>::
370
+ template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5>
371
+ inline VALUE Ruby_Function_5<Ret_T, Fun, T1, T2, T3, T4, T5>::
289
372
  call(Ruby_Function_5 * f)
290
373
  {
291
- return (*f)();
374
+ (*f)();
375
+ return Qnil;
292
376
  }
293
377
 
294
378
  } // namespace detail
295
379
 
380
+ template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5>
381
+ inline Ret_T protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5)
382
+ {
383
+ typedef detail::Ruby_Function_5<Ret_T, Fun, T1, T2, T3, T4, T5> RF;
384
+ RF f(fun, t1, t2, t3, t4, t5);
385
+ detail::protect(
386
+ RUBY_VALUE_FUNC(RF::call),
387
+ reinterpret_cast<VALUE>(&f));
388
+ return f.result();
389
+ }
390
+
296
391
  template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5>
297
392
  inline VALUE protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5)
298
393
  {
299
- typedef detail::Ruby_Function_5<Fun, T1, T2, T3, T4, T5> RF;
394
+ typedef detail::Ruby_Function_5<VALUE, Fun, T1, T2, T3, T4, T5> RF;
300
395
  RF f(fun, t1, t2, t3, t4, t5);
301
- return detail::protect(
396
+ detail::protect(
302
397
  RUBY_VALUE_FUNC(RF::call),
303
398
  reinterpret_cast<VALUE>(&f));
399
+ return f.result();
304
400
  }
305
401
 
306
402
  // ---------------------------------------------------------------------
@@ -308,48 +404,64 @@ inline VALUE protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3, T4 co
308
404
  namespace detail
309
405
  {
310
406
 
311
- template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
407
+ template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
312
408
  class Ruby_Function_6
313
409
  {
314
410
  public:
315
411
  Ruby_Function_6(Fun f, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6);
316
- inline VALUE operator()();
412
+ inline void operator()();
317
413
  static inline VALUE call(Ruby_Function_6 * f);
414
+ Ret_T const & result() const { return result_; }
415
+
318
416
  private:
319
417
  Fun f_;
320
418
  T1 const & t1_; T2 const & t2_; T3 const & t3_; T4 const & t4_; T5 const & t5_; T6 const & t6_;
419
+ Ret_T result_; // TODO: use placement new
321
420
  };
322
421
 
323
- template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
324
- inline Ruby_Function_6<Fun, T1, T2, T3, T4, T5, T6>::
422
+ template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
423
+ inline Ruby_Function_6<Ret_T, Fun, T1, T2, T3, T4, T5, T6>::
325
424
  Ruby_Function_6(Fun f, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6)
326
425
  : f_(f), t1_(t1), t2_(t2), t3_(t3), t4_(t4), t5_(t5), t6_(t6)
327
426
  { }
328
427
 
329
- template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
330
- inline VALUE Ruby_Function_6<Fun, T1, T2, T3, T4, T5, T6>::
428
+ template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
429
+ inline void Ruby_Function_6<Ret_T, Fun, T1, T2, T3, T4, T5, T6>::
331
430
  operator()()
332
431
  {
333
- return f_(t1_, t2_, t3_, t4_, t5_, t6_);
432
+ result_ = f_(t1_, t2_, t3_, t4_, t5_, t6_);
334
433
  }
335
434
 
336
- template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
337
- inline VALUE Ruby_Function_6<Fun, T1, T2, T3, T4, T5, T6>::
435
+ template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
436
+ inline VALUE Ruby_Function_6<Ret_T, Fun, T1, T2, T3, T4, T5, T6>::
338
437
  call(Ruby_Function_6 * f)
339
438
  {
340
- return (*f)();
439
+ (*f)();
440
+ return Qnil;
341
441
  }
342
442
 
343
443
  } // namespace detail
344
444
 
445
+ template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
446
+ inline Ret_T protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6)
447
+ {
448
+ typedef detail::Ruby_Function_6<Ret_T, Fun, T1, T2, T3, T4, T5, T6> RF;
449
+ RF f(fun, t1, t2, t3, t4, t5, t6);
450
+ detail::protect(
451
+ RUBY_VALUE_FUNC(RF::call),
452
+ reinterpret_cast<VALUE>(&f));
453
+ return f.result();
454
+ }
455
+
345
456
  template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6>
346
457
  inline VALUE protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6)
347
458
  {
348
- typedef detail::Ruby_Function_6<Fun, T1, T2, T3, T4, T5, T6> RF;
459
+ typedef detail::Ruby_Function_6<VALUE, Fun, T1, T2, T3, T4, T5, T6> RF;
349
460
  RF f(fun, t1, t2, t3, t4, t5, t6);
350
- return detail::protect(
461
+ detail::protect(
351
462
  RUBY_VALUE_FUNC(RF::call),
352
463
  reinterpret_cast<VALUE>(&f));
464
+ return f.result();
353
465
  }
354
466
 
355
467
  // ---------------------------------------------------------------------
@@ -357,48 +469,64 @@ inline VALUE protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3, T4 co
357
469
  namespace detail
358
470
  {
359
471
 
360
- template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
472
+ template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
361
473
  class Ruby_Function_7
362
474
  {
363
475
  public:
364
476
  Ruby_Function_7(Fun f, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7);
365
- inline VALUE operator()();
477
+ inline void operator()();
366
478
  static inline VALUE call(Ruby_Function_7 * f);
479
+ Ret_T const & result() const { return result_; }
480
+
367
481
  private:
368
482
  Fun f_;
369
483
  T1 const & t1_; T2 const & t2_; T3 const & t3_; T4 const & t4_; T5 const & t5_; T6 const & t6_; T7 const & t7_;
484
+ Ret_T result_; // TODO: use placement new
370
485
  };
371
486
 
372
- template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
373
- inline Ruby_Function_7<Fun, T1, T2, T3, T4, T5, T6, T7>::
487
+ template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
488
+ inline Ruby_Function_7<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7>::
374
489
  Ruby_Function_7(Fun f, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7)
375
490
  : f_(f), t1_(t1), t2_(t2), t3_(t3), t4_(t4), t5_(t5), t6_(t6), t7_(t7)
376
491
  { }
377
492
 
378
- template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
379
- inline VALUE Ruby_Function_7<Fun, T1, T2, T3, T4, T5, T6, T7>::
493
+ template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
494
+ inline void Ruby_Function_7<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7>::
380
495
  operator()()
381
496
  {
382
- return f_(t1_, t2_, t3_, t4_, t5_, t6_, t7_);
497
+ result_ = f_(t1_, t2_, t3_, t4_, t5_, t6_, t7_);
383
498
  }
384
499
 
385
- template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
386
- inline VALUE Ruby_Function_7<Fun, T1, T2, T3, T4, T5, T6, T7>::
500
+ template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
501
+ inline VALUE Ruby_Function_7<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7>::
387
502
  call(Ruby_Function_7 * f)
388
503
  {
389
- return (*f)();
504
+ (*f)();
505
+ return Qnil;
390
506
  }
391
507
 
392
508
  } // namespace detail
393
509
 
510
+ template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
511
+ inline Ret_T protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7)
512
+ {
513
+ typedef detail::Ruby_Function_7<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7> RF;
514
+ RF f(fun, t1, t2, t3, t4, t5, t6, t7);
515
+ detail::protect(
516
+ RUBY_VALUE_FUNC(RF::call),
517
+ reinterpret_cast<VALUE>(&f));
518
+ return f.result();
519
+ }
520
+
394
521
  template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7>
395
522
  inline VALUE protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7)
396
523
  {
397
- typedef detail::Ruby_Function_7<Fun, T1, T2, T3, T4, T5, T6, T7> RF;
524
+ typedef detail::Ruby_Function_7<VALUE, Fun, T1, T2, T3, T4, T5, T6, T7> RF;
398
525
  RF f(fun, t1, t2, t3, t4, t5, t6, t7);
399
- return detail::protect(
526
+ detail::protect(
400
527
  RUBY_VALUE_FUNC(RF::call),
401
528
  reinterpret_cast<VALUE>(&f));
529
+ return f.result();
402
530
  }
403
531
 
404
532
  // ---------------------------------------------------------------------
@@ -406,48 +534,64 @@ inline VALUE protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3, T4 co
406
534
  namespace detail
407
535
  {
408
536
 
409
- template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
537
+ template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
410
538
  class Ruby_Function_8
411
539
  {
412
540
  public:
413
541
  Ruby_Function_8(Fun f, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7, T8 const & t8);
414
- inline VALUE operator()();
542
+ inline void operator()();
415
543
  static inline VALUE call(Ruby_Function_8 * f);
544
+ Ret_T const & result() const { return result_; }
545
+
416
546
  private:
417
547
  Fun f_;
418
548
  T1 const & t1_; T2 const & t2_; T3 const & t3_; T4 const & t4_; T5 const & t5_; T6 const & t6_; T7 const & t7_; T8 const & t8_;
549
+ Ret_T result_; // TODO: use placement new
419
550
  };
420
551
 
421
- template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
422
- inline Ruby_Function_8<Fun, T1, T2, T3, T4, T5, T6, T7, T8>::
552
+ template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
553
+ inline Ruby_Function_8<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7, T8>::
423
554
  Ruby_Function_8(Fun f, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7, T8 const & t8)
424
555
  : f_(f), t1_(t1), t2_(t2), t3_(t3), t4_(t4), t5_(t5), t6_(t6), t7_(t7), t8_(t8)
425
556
  { }
426
557
 
427
- template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
428
- inline VALUE Ruby_Function_8<Fun, T1, T2, T3, T4, T5, T6, T7, T8>::
558
+ template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
559
+ inline void Ruby_Function_8<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7, T8>::
429
560
  operator()()
430
561
  {
431
- return f_(t1_, t2_, t3_, t4_, t5_, t6_, t7_, t8_);
562
+ result_ = f_(t1_, t2_, t3_, t4_, t5_, t6_, t7_, t8_);
432
563
  }
433
564
 
434
- template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
435
- inline VALUE Ruby_Function_8<Fun, T1, T2, T3, T4, T5, T6, T7, T8>::
565
+ template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
566
+ inline VALUE Ruby_Function_8<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7, T8>::
436
567
  call(Ruby_Function_8 * f)
437
568
  {
438
- return (*f)();
569
+ (*f)();
570
+ return Qnil;
439
571
  }
440
572
 
441
573
  } // namespace detail
442
574
 
575
+ template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
576
+ inline Ret_T protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7, T8 const & t8)
577
+ {
578
+ typedef detail::Ruby_Function_8<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7, T8> RF;
579
+ RF f(fun, t1, t2, t3, t4, t5, t6, t7, t8);
580
+ detail::protect(
581
+ RUBY_VALUE_FUNC(RF::call),
582
+ reinterpret_cast<VALUE>(&f));
583
+ return f.result();
584
+ }
585
+
443
586
  template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
444
587
  inline VALUE protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7, T8 const & t8)
445
588
  {
446
- typedef detail::Ruby_Function_8<Fun, T1, T2, T3, T4, T5, T6, T7, T8> RF;
589
+ typedef detail::Ruby_Function_8<VALUE, Fun, T1, T2, T3, T4, T5, T6, T7, T8> RF;
447
590
  RF f(fun, t1, t2, t3, t4, t5, t6, t7, t8);
448
- return detail::protect(
591
+ detail::protect(
449
592
  RUBY_VALUE_FUNC(RF::call),
450
593
  reinterpret_cast<VALUE>(&f));
594
+ return f.result();
451
595
  }
452
596
 
453
597
  // ---------------------------------------------------------------------
@@ -455,48 +599,64 @@ inline VALUE protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3, T4 co
455
599
  namespace detail
456
600
  {
457
601
 
458
- template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
602
+ template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
459
603
  class Ruby_Function_9
460
604
  {
461
605
  public:
462
606
  Ruby_Function_9(Fun f, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9);
463
- inline VALUE operator()();
607
+ inline void operator()();
464
608
  static inline VALUE call(Ruby_Function_9 * f);
609
+ Ret_T const & result() const { return result_; }
610
+
465
611
  private:
466
612
  Fun f_;
467
613
  T1 const & t1_; T2 const & t2_; T3 const & t3_; T4 const & t4_; T5 const & t5_; T6 const & t6_; T7 const & t7_; T8 const & t8_; T9 const & t9_;
614
+ Ret_T result_; // TODO: use placement new
468
615
  };
469
616
 
470
- template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
471
- inline Ruby_Function_9<Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9>::
617
+ template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
618
+ inline Ruby_Function_9<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9>::
472
619
  Ruby_Function_9(Fun f, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9)
473
620
  : f_(f), t1_(t1), t2_(t2), t3_(t3), t4_(t4), t5_(t5), t6_(t6), t7_(t7), t8_(t8), t9_(t9)
474
621
  { }
475
622
 
476
- template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
477
- inline VALUE Ruby_Function_9<Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9>::
623
+ template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
624
+ inline void Ruby_Function_9<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9>::
478
625
  operator()()
479
626
  {
480
- return f_(t1_, t2_, t3_, t4_, t5_, t6_, t7_, t8_, t9_);
627
+ result_ = f_(t1_, t2_, t3_, t4_, t5_, t6_, t7_, t8_, t9_);
481
628
  }
482
629
 
483
- template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
484
- inline VALUE Ruby_Function_9<Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9>::
630
+ template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
631
+ inline VALUE Ruby_Function_9<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9>::
485
632
  call(Ruby_Function_9 * f)
486
633
  {
487
- return (*f)();
634
+ (*f)();
635
+ return Qnil;
488
636
  }
489
637
 
490
638
  } // namespace detail
491
639
 
640
+ template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
641
+ inline Ret_T protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9)
642
+ {
643
+ typedef detail::Ruby_Function_9<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9> RF;
644
+ RF f(fun, t1, t2, t3, t4, t5, t6, t7, t8, t9);
645
+ detail::protect(
646
+ RUBY_VALUE_FUNC(RF::call),
647
+ reinterpret_cast<VALUE>(&f));
648
+ return f.result();
649
+ }
650
+
492
651
  template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
493
652
  inline VALUE protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9)
494
653
  {
495
- typedef detail::Ruby_Function_9<Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9> RF;
654
+ typedef detail::Ruby_Function_9<VALUE, Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9> RF;
496
655
  RF f(fun, t1, t2, t3, t4, t5, t6, t7, t8, t9);
497
- return detail::protect(
656
+ detail::protect(
498
657
  RUBY_VALUE_FUNC(RF::call),
499
658
  reinterpret_cast<VALUE>(&f));
659
+ return f.result();
500
660
  }
501
661
 
502
662
  // ---------------------------------------------------------------------
@@ -504,48 +664,64 @@ inline VALUE protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3, T4 co
504
664
  namespace detail
505
665
  {
506
666
 
507
- template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10>
667
+ template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10>
508
668
  class Ruby_Function_10
509
669
  {
510
670
  public:
511
671
  Ruby_Function_10(Fun f, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9, T10 const & t10);
512
- inline VALUE operator()();
672
+ inline void operator()();
513
673
  static inline VALUE call(Ruby_Function_10 * f);
674
+ Ret_T const & result() const { return result_; }
675
+
514
676
  private:
515
677
  Fun f_;
516
678
  T1 const & t1_; T2 const & t2_; T3 const & t3_; T4 const & t4_; T5 const & t5_; T6 const & t6_; T7 const & t7_; T8 const & t8_; T9 const & t9_; T10 const & t10_;
679
+ Ret_T result_; // TODO: use placement new
517
680
  };
518
681
 
519
- template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10>
520
- inline Ruby_Function_10<Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>::
682
+ template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10>
683
+ inline Ruby_Function_10<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>::
521
684
  Ruby_Function_10(Fun f, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9, T10 const & t10)
522
685
  : f_(f), t1_(t1), t2_(t2), t3_(t3), t4_(t4), t5_(t5), t6_(t6), t7_(t7), t8_(t8), t9_(t9), t10_(t10)
523
686
  { }
524
687
 
525
- template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10>
526
- inline VALUE Ruby_Function_10<Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>::
688
+ template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10>
689
+ inline void Ruby_Function_10<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>::
527
690
  operator()()
528
691
  {
529
- return f_(t1_, t2_, t3_, t4_, t5_, t6_, t7_, t8_, t9_, t10_);
692
+ result_ = f_(t1_, t2_, t3_, t4_, t5_, t6_, t7_, t8_, t9_, t10_);
530
693
  }
531
694
 
532
- template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10>
533
- inline VALUE Ruby_Function_10<Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>::
695
+ template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10>
696
+ inline VALUE Ruby_Function_10<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>::
534
697
  call(Ruby_Function_10 * f)
535
698
  {
536
- return (*f)();
699
+ (*f)();
700
+ return Qnil;
537
701
  }
538
702
 
539
703
  } // namespace detail
540
704
 
705
+ template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10>
706
+ inline Ret_T protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9, T10 const & t10)
707
+ {
708
+ typedef detail::Ruby_Function_10<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> RF;
709
+ RF f(fun, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10);
710
+ detail::protect(
711
+ RUBY_VALUE_FUNC(RF::call),
712
+ reinterpret_cast<VALUE>(&f));
713
+ return f.result();
714
+ }
715
+
541
716
  template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10>
542
717
  inline VALUE protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9, T10 const & t10)
543
718
  {
544
- typedef detail::Ruby_Function_10<Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> RF;
719
+ typedef detail::Ruby_Function_10<VALUE, Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> RF;
545
720
  RF f(fun, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10);
546
- return detail::protect(
721
+ detail::protect(
547
722
  RUBY_VALUE_FUNC(RF::call),
548
723
  reinterpret_cast<VALUE>(&f));
724
+ return f.result();
549
725
  }
550
726
 
551
727
  // ---------------------------------------------------------------------
@@ -553,48 +729,64 @@ inline VALUE protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3, T4 co
553
729
  namespace detail
554
730
  {
555
731
 
556
- template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11>
732
+ template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11>
557
733
  class Ruby_Function_11
558
734
  {
559
735
  public:
560
736
  Ruby_Function_11(Fun f, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9, T10 const & t10, T11 const & t11);
561
- inline VALUE operator()();
737
+ inline void operator()();
562
738
  static inline VALUE call(Ruby_Function_11 * f);
739
+ Ret_T const & result() const { return result_; }
740
+
563
741
  private:
564
742
  Fun f_;
565
743
  T1 const & t1_; T2 const & t2_; T3 const & t3_; T4 const & t4_; T5 const & t5_; T6 const & t6_; T7 const & t7_; T8 const & t8_; T9 const & t9_; T10 const & t10_; T11 const & t11_;
744
+ Ret_T result_; // TODO: use placement new
566
745
  };
567
746
 
568
- template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11>
569
- inline Ruby_Function_11<Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>::
747
+ template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11>
748
+ inline Ruby_Function_11<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>::
570
749
  Ruby_Function_11(Fun f, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9, T10 const & t10, T11 const & t11)
571
750
  : f_(f), t1_(t1), t2_(t2), t3_(t3), t4_(t4), t5_(t5), t6_(t6), t7_(t7), t8_(t8), t9_(t9), t10_(t10), t11_(t11)
572
751
  { }
573
752
 
574
- template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11>
575
- inline VALUE Ruby_Function_11<Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>::
753
+ template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11>
754
+ inline void Ruby_Function_11<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>::
576
755
  operator()()
577
756
  {
578
- return f_(t1_, t2_, t3_, t4_, t5_, t6_, t7_, t8_, t9_, t10_, t11_);
757
+ result_ = f_(t1_, t2_, t3_, t4_, t5_, t6_, t7_, t8_, t9_, t10_, t11_);
579
758
  }
580
759
 
581
- template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11>
582
- inline VALUE Ruby_Function_11<Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>::
760
+ template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11>
761
+ inline VALUE Ruby_Function_11<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>::
583
762
  call(Ruby_Function_11 * f)
584
763
  {
585
- return (*f)();
764
+ (*f)();
765
+ return Qnil;
586
766
  }
587
767
 
588
768
  } // namespace detail
589
769
 
770
+ template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11>
771
+ inline Ret_T protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9, T10 const & t10, T11 const & t11)
772
+ {
773
+ typedef detail::Ruby_Function_11<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> RF;
774
+ RF f(fun, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11);
775
+ detail::protect(
776
+ RUBY_VALUE_FUNC(RF::call),
777
+ reinterpret_cast<VALUE>(&f));
778
+ return f.result();
779
+ }
780
+
590
781
  template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11>
591
782
  inline VALUE protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9, T10 const & t10, T11 const & t11)
592
783
  {
593
- typedef detail::Ruby_Function_11<Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> RF;
784
+ typedef detail::Ruby_Function_11<VALUE, Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> RF;
594
785
  RF f(fun, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11);
595
- return detail::protect(
786
+ detail::protect(
596
787
  RUBY_VALUE_FUNC(RF::call),
597
788
  reinterpret_cast<VALUE>(&f));
789
+ return f.result();
598
790
  }
599
791
 
600
792
  // ---------------------------------------------------------------------
@@ -602,48 +794,64 @@ inline VALUE protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3, T4 co
602
794
  namespace detail
603
795
  {
604
796
 
605
- template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12>
797
+ template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12>
606
798
  class Ruby_Function_12
607
799
  {
608
800
  public:
609
801
  Ruby_Function_12(Fun f, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9, T10 const & t10, T11 const & t11, T12 const & t12);
610
- inline VALUE operator()();
802
+ inline void operator()();
611
803
  static inline VALUE call(Ruby_Function_12 * f);
804
+ Ret_T const & result() const { return result_; }
805
+
612
806
  private:
613
807
  Fun f_;
614
808
  T1 const & t1_; T2 const & t2_; T3 const & t3_; T4 const & t4_; T5 const & t5_; T6 const & t6_; T7 const & t7_; T8 const & t8_; T9 const & t9_; T10 const & t10_; T11 const & t11_; T12 const & t12_;
809
+ Ret_T result_; // TODO: use placement new
615
810
  };
616
811
 
617
- template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12>
618
- inline Ruby_Function_12<Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>::
812
+ template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12>
813
+ inline Ruby_Function_12<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>::
619
814
  Ruby_Function_12(Fun f, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9, T10 const & t10, T11 const & t11, T12 const & t12)
620
815
  : f_(f), t1_(t1), t2_(t2), t3_(t3), t4_(t4), t5_(t5), t6_(t6), t7_(t7), t8_(t8), t9_(t9), t10_(t10), t11_(t11), t12_(t12)
621
816
  { }
622
817
 
623
- template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12>
624
- inline VALUE Ruby_Function_12<Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>::
818
+ template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12>
819
+ inline void Ruby_Function_12<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>::
625
820
  operator()()
626
821
  {
627
- return f_(t1_, t2_, t3_, t4_, t5_, t6_, t7_, t8_, t9_, t10_, t11_, t12_);
822
+ result_ = f_(t1_, t2_, t3_, t4_, t5_, t6_, t7_, t8_, t9_, t10_, t11_, t12_);
628
823
  }
629
824
 
630
- template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12>
631
- inline VALUE Ruby_Function_12<Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>::
825
+ template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12>
826
+ inline VALUE Ruby_Function_12<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>::
632
827
  call(Ruby_Function_12 * f)
633
828
  {
634
- return (*f)();
829
+ (*f)();
830
+ return Qnil;
635
831
  }
636
832
 
637
833
  } // namespace detail
638
834
 
835
+ template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12>
836
+ inline Ret_T protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9, T10 const & t10, T11 const & t11, T12 const & t12)
837
+ {
838
+ typedef detail::Ruby_Function_12<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> RF;
839
+ RF f(fun, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12);
840
+ detail::protect(
841
+ RUBY_VALUE_FUNC(RF::call),
842
+ reinterpret_cast<VALUE>(&f));
843
+ return f.result();
844
+ }
845
+
639
846
  template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12>
640
847
  inline VALUE protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9, T10 const & t10, T11 const & t11, T12 const & t12)
641
848
  {
642
- typedef detail::Ruby_Function_12<Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> RF;
849
+ typedef detail::Ruby_Function_12<VALUE, Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> RF;
643
850
  RF f(fun, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12);
644
- return detail::protect(
851
+ detail::protect(
645
852
  RUBY_VALUE_FUNC(RF::call),
646
853
  reinterpret_cast<VALUE>(&f));
854
+ return f.result();
647
855
  }
648
856
 
649
857
  // ---------------------------------------------------------------------
@@ -651,48 +859,64 @@ inline VALUE protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3, T4 co
651
859
  namespace detail
652
860
  {
653
861
 
654
- template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13>
862
+ template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13>
655
863
  class Ruby_Function_13
656
864
  {
657
865
  public:
658
866
  Ruby_Function_13(Fun f, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9, T10 const & t10, T11 const & t11, T12 const & t12, T13 const & t13);
659
- inline VALUE operator()();
867
+ inline void operator()();
660
868
  static inline VALUE call(Ruby_Function_13 * f);
869
+ Ret_T const & result() const { return result_; }
870
+
661
871
  private:
662
872
  Fun f_;
663
873
  T1 const & t1_; T2 const & t2_; T3 const & t3_; T4 const & t4_; T5 const & t5_; T6 const & t6_; T7 const & t7_; T8 const & t8_; T9 const & t9_; T10 const & t10_; T11 const & t11_; T12 const & t12_; T13 const & t13_;
874
+ Ret_T result_; // TODO: use placement new
664
875
  };
665
876
 
666
- template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13>
667
- inline Ruby_Function_13<Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>::
877
+ template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13>
878
+ inline Ruby_Function_13<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>::
668
879
  Ruby_Function_13(Fun f, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9, T10 const & t10, T11 const & t11, T12 const & t12, T13 const & t13)
669
880
  : f_(f), t1_(t1), t2_(t2), t3_(t3), t4_(t4), t5_(t5), t6_(t6), t7_(t7), t8_(t8), t9_(t9), t10_(t10), t11_(t11), t12_(t12), t13_(t13)
670
881
  { }
671
882
 
672
- template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13>
673
- inline VALUE Ruby_Function_13<Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>::
883
+ template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13>
884
+ inline void Ruby_Function_13<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>::
674
885
  operator()()
675
886
  {
676
- return f_(t1_, t2_, t3_, t4_, t5_, t6_, t7_, t8_, t9_, t10_, t11_, t12_, t13_);
887
+ result_ = f_(t1_, t2_, t3_, t4_, t5_, t6_, t7_, t8_, t9_, t10_, t11_, t12_, t13_);
677
888
  }
678
889
 
679
- template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13>
680
- inline VALUE Ruby_Function_13<Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>::
890
+ template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13>
891
+ inline VALUE Ruby_Function_13<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>::
681
892
  call(Ruby_Function_13 * f)
682
893
  {
683
- return (*f)();
894
+ (*f)();
895
+ return Qnil;
684
896
  }
685
897
 
686
898
  } // namespace detail
687
899
 
900
+ template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13>
901
+ inline Ret_T protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9, T10 const & t10, T11 const & t11, T12 const & t12, T13 const & t13)
902
+ {
903
+ typedef detail::Ruby_Function_13<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> RF;
904
+ RF f(fun, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13);
905
+ detail::protect(
906
+ RUBY_VALUE_FUNC(RF::call),
907
+ reinterpret_cast<VALUE>(&f));
908
+ return f.result();
909
+ }
910
+
688
911
  template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13>
689
912
  inline VALUE protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9, T10 const & t10, T11 const & t11, T12 const & t12, T13 const & t13)
690
913
  {
691
- typedef detail::Ruby_Function_13<Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> RF;
914
+ typedef detail::Ruby_Function_13<VALUE, Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> RF;
692
915
  RF f(fun, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13);
693
- return detail::protect(
916
+ detail::protect(
694
917
  RUBY_VALUE_FUNC(RF::call),
695
918
  reinterpret_cast<VALUE>(&f));
919
+ return f.result();
696
920
  }
697
921
 
698
922
  // ---------------------------------------------------------------------
@@ -700,48 +924,64 @@ inline VALUE protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3, T4 co
700
924
  namespace detail
701
925
  {
702
926
 
703
- template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14>
927
+ template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14>
704
928
  class Ruby_Function_14
705
929
  {
706
930
  public:
707
931
  Ruby_Function_14(Fun f, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9, T10 const & t10, T11 const & t11, T12 const & t12, T13 const & t13, T14 const & t14);
708
- inline VALUE operator()();
932
+ inline void operator()();
709
933
  static inline VALUE call(Ruby_Function_14 * f);
934
+ Ret_T const & result() const { return result_; }
935
+
710
936
  private:
711
937
  Fun f_;
712
938
  T1 const & t1_; T2 const & t2_; T3 const & t3_; T4 const & t4_; T5 const & t5_; T6 const & t6_; T7 const & t7_; T8 const & t8_; T9 const & t9_; T10 const & t10_; T11 const & t11_; T12 const & t12_; T13 const & t13_; T14 const & t14_;
939
+ Ret_T result_; // TODO: use placement new
713
940
  };
714
941
 
715
- template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14>
716
- inline Ruby_Function_14<Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>::
942
+ template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14>
943
+ inline Ruby_Function_14<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>::
717
944
  Ruby_Function_14(Fun f, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9, T10 const & t10, T11 const & t11, T12 const & t12, T13 const & t13, T14 const & t14)
718
945
  : f_(f), t1_(t1), t2_(t2), t3_(t3), t4_(t4), t5_(t5), t6_(t6), t7_(t7), t8_(t8), t9_(t9), t10_(t10), t11_(t11), t12_(t12), t13_(t13), t14_(t14)
719
946
  { }
720
947
 
721
- template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14>
722
- inline VALUE Ruby_Function_14<Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>::
948
+ template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14>
949
+ inline void Ruby_Function_14<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>::
723
950
  operator()()
724
951
  {
725
- return f_(t1_, t2_, t3_, t4_, t5_, t6_, t7_, t8_, t9_, t10_, t11_, t12_, t13_, t14_);
952
+ result_ = f_(t1_, t2_, t3_, t4_, t5_, t6_, t7_, t8_, t9_, t10_, t11_, t12_, t13_, t14_);
726
953
  }
727
954
 
728
- template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14>
729
- inline VALUE Ruby_Function_14<Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>::
955
+ template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14>
956
+ inline VALUE Ruby_Function_14<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>::
730
957
  call(Ruby_Function_14 * f)
731
958
  {
732
- return (*f)();
959
+ (*f)();
960
+ return Qnil;
733
961
  }
734
962
 
735
963
  } // namespace detail
736
964
 
965
+ template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14>
966
+ inline Ret_T protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9, T10 const & t10, T11 const & t11, T12 const & t12, T13 const & t13, T14 const & t14)
967
+ {
968
+ typedef detail::Ruby_Function_14<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> RF;
969
+ RF f(fun, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14);
970
+ detail::protect(
971
+ RUBY_VALUE_FUNC(RF::call),
972
+ reinterpret_cast<VALUE>(&f));
973
+ return f.result();
974
+ }
975
+
737
976
  template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14>
738
977
  inline VALUE protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9, T10 const & t10, T11 const & t11, T12 const & t12, T13 const & t13, T14 const & t14)
739
978
  {
740
- typedef detail::Ruby_Function_14<Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> RF;
979
+ typedef detail::Ruby_Function_14<VALUE, Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> RF;
741
980
  RF f(fun, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14);
742
- return detail::protect(
981
+ detail::protect(
743
982
  RUBY_VALUE_FUNC(RF::call),
744
983
  reinterpret_cast<VALUE>(&f));
984
+ return f.result();
745
985
  }
746
986
 
747
987
  // ---------------------------------------------------------------------
@@ -749,48 +989,64 @@ inline VALUE protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3, T4 co
749
989
  namespace detail
750
990
  {
751
991
 
752
- template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15>
992
+ template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15>
753
993
  class Ruby_Function_15
754
994
  {
755
995
  public:
756
996
  Ruby_Function_15(Fun f, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9, T10 const & t10, T11 const & t11, T12 const & t12, T13 const & t13, T14 const & t14, T15 const & t15);
757
- inline VALUE operator()();
997
+ inline void operator()();
758
998
  static inline VALUE call(Ruby_Function_15 * f);
999
+ Ret_T const & result() const { return result_; }
1000
+
759
1001
  private:
760
1002
  Fun f_;
761
1003
  T1 const & t1_; T2 const & t2_; T3 const & t3_; T4 const & t4_; T5 const & t5_; T6 const & t6_; T7 const & t7_; T8 const & t8_; T9 const & t9_; T10 const & t10_; T11 const & t11_; T12 const & t12_; T13 const & t13_; T14 const & t14_; T15 const & t15_;
1004
+ Ret_T result_; // TODO: use placement new
762
1005
  };
763
1006
 
764
- template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15>
765
- inline Ruby_Function_15<Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>::
1007
+ template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15>
1008
+ inline Ruby_Function_15<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>::
766
1009
  Ruby_Function_15(Fun f, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9, T10 const & t10, T11 const & t11, T12 const & t12, T13 const & t13, T14 const & t14, T15 const & t15)
767
1010
  : f_(f), t1_(t1), t2_(t2), t3_(t3), t4_(t4), t5_(t5), t6_(t6), t7_(t7), t8_(t8), t9_(t9), t10_(t10), t11_(t11), t12_(t12), t13_(t13), t14_(t14), t15_(t15)
768
1011
  { }
769
1012
 
770
- template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15>
771
- inline VALUE Ruby_Function_15<Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>::
1013
+ template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15>
1014
+ inline void Ruby_Function_15<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>::
772
1015
  operator()()
773
1016
  {
774
- return f_(t1_, t2_, t3_, t4_, t5_, t6_, t7_, t8_, t9_, t10_, t11_, t12_, t13_, t14_, t15_);
1017
+ result_ = f_(t1_, t2_, t3_, t4_, t5_, t6_, t7_, t8_, t9_, t10_, t11_, t12_, t13_, t14_, t15_);
775
1018
  }
776
1019
 
777
- template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15>
778
- inline VALUE Ruby_Function_15<Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>::
1020
+ template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15>
1021
+ inline VALUE Ruby_Function_15<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>::
779
1022
  call(Ruby_Function_15 * f)
780
1023
  {
781
- return (*f)();
1024
+ (*f)();
1025
+ return Qnil;
782
1026
  }
783
1027
 
784
1028
  } // namespace detail
785
1029
 
1030
+ template<typename Ret_T, typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15>
1031
+ inline Ret_T protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9, T10 const & t10, T11 const & t11, T12 const & t12, T13 const & t13, T14 const & t14, T15 const & t15)
1032
+ {
1033
+ typedef detail::Ruby_Function_15<Ret_T, Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> RF;
1034
+ RF f(fun, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15);
1035
+ detail::protect(
1036
+ RUBY_VALUE_FUNC(RF::call),
1037
+ reinterpret_cast<VALUE>(&f));
1038
+ return f.result();
1039
+ }
1040
+
786
1041
  template<typename Fun, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10, typename T11, typename T12, typename T13, typename T14, typename T15>
787
1042
  inline VALUE protect(Fun fun, T1 const & t1, T2 const & t2, T3 const & t3, T4 const & t4, T5 const & t5, T6 const & t6, T7 const & t7, T8 const & t8, T9 const & t9, T10 const & t10, T11 const & t11, T12 const & t12, T13 const & t13, T14 const & t14, T15 const & t15)
788
1043
  {
789
- typedef detail::Ruby_Function_15<Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> RF;
1044
+ typedef detail::Ruby_Function_15<VALUE, Fun, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> RF;
790
1045
  RF f(fun, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15);
791
- return detail::protect(
1046
+ detail::protect(
792
1047
  RUBY_VALUE_FUNC(RF::call),
793
1048
  reinterpret_cast<VALUE>(&f));
1049
+ return f.result();
794
1050
  }
795
1051
 
796
1052
  // ---------------------------------------------------------------------