rice 1.2.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rice
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Paul Brannan
@@ -10,10 +10,19 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2009-10-26 00:00:00 -04:00
13
+ date: 2009-12-14 00:00:00 -05:00
14
14
  default_executable:
15
- dependencies: []
16
-
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
17
+ name: rubyforge
18
+ type: :development
19
+ version_requirement:
20
+ version_requirements: !ruby/object:Gem::Requirement
21
+ requirements:
22
+ - - ">="
23
+ - !ruby/object:Gem::Version
24
+ version: "0"
25
+ version:
17
26
  description: |
18
27
  Rice is a C++ interface to Ruby's C API. It provides a type-safe and
19
28
  exception-safe interface in order to make embedding Ruby and writing
@@ -154,9 +163,9 @@ files:
154
163
  - rice/detail/node.hpp
155
164
  - rice/detail/Wrapped_Function.hpp
156
165
  - rice/detail/protect.hpp
157
- - rice/detail/mininode.cpp.rpp
158
166
  - rice/detail/demangle.hpp
159
167
  - rice/detail/define_method_and_auto_wrap.hpp
168
+ - rice/detail/traits.hpp
160
169
  - rice/detail/default_allocation_func.ipp
161
170
  - rice/detail/wrap_function.hpp
162
171
  - rice/detail/Caster.hpp
@@ -166,13 +175,11 @@ files:
166
175
  - rice/detail/st.hpp
167
176
  - rice/detail/from_ruby.hpp
168
177
  - rice/detail/win32.hpp
169
- - rice/detail/mininode.hpp.rpp
170
178
  - rice/detail/creation_funcs.ipp
171
179
  - rice/detail/to_ruby.hpp
172
- - rice/detail/remove_const.hpp
173
180
  - rice/detail/Auto_Function_Wrapper.hpp
181
+ - rice/detail/cfp.hpp
174
182
  - rice/detail/env.hpp
175
- - rice/detail/method_data.cpp.rpp
176
183
  - rice/detail/to_ruby.ipp
177
184
  - rice/detail/method_data.hpp
178
185
  - rice/detail/Exception_Handler.hpp
@@ -184,6 +191,7 @@ files:
184
191
  - rice/detail/Iterator.hpp
185
192
  - rice/detail/Not_Copyable.hpp
186
193
  - rice/detail/Exception_Handler_defn.hpp
194
+ - rice/detail/cfp.ipp
187
195
  - rice/detail/define_method_and_auto_wrap.ipp
188
196
  - rice/detail/Auto_Function_Wrapper.ipp
189
197
  - rice/detail/Exception_Handler.ipp
@@ -225,6 +233,13 @@ files:
225
233
  - test/test_Enum.cpp
226
234
  - test/test_Address_Registration_Guard.cpp
227
235
  - test/test_Director.cpp
236
+ - test/ext/Makefile.am
237
+ - test/ext/Makefile.in
238
+ - test/ext/t1/extconf.rb
239
+ - test/ext/t1/Foo.hpp
240
+ - test/ext/t1/t1.cpp
241
+ - test/ext/t2/extconf.rb
242
+ - test/ext/t2/t2.cpp
228
243
  has_rdoc: true
229
244
  homepage: http://rice.rubyforge.org/
230
245
  licenses: []
@@ -1,301 +0,0 @@
1
- #include "method_data.hpp"
2
-
3
- // TODO: This is silly, autoconf...
4
- #undef PACKAGE_NAME
5
- #undef PACKAGE_STRING
6
- #undef PACKAGE_TARNAME
7
- #undef PACKAGE_VERSION
8
-
9
- #include "../config.hpp"
10
-
11
- #ruby <<END
12
- MAX_ARGS = 15
13
- nil
14
- END
15
-
16
- #if defined(HAVE_NODE_H)
17
- /* pre-YARV */
18
- #include <node.h>
19
- #elif defined(REALLY_HAVE_RUBY_NODE_H)
20
- /* YARV */
21
- #include <ruby/node.h>
22
- #else
23
- /* YARV without node.h */
24
- #include "mininode.hpp"
25
- using namespace Rice::detail::Mininode;
26
- #endif
27
-
28
- #include "env.hpp"
29
-
30
- #ifdef RUBY_VM
31
-
32
- /* YARV */
33
-
34
- namespace
35
- {
36
-
37
- struct rb_thread_struct
38
- {
39
- VALUE self;
40
- void *vm;
41
- VALUE *stack;
42
- unsigned long stack_size;
43
- VALUE *cfp;
44
- /* ... */
45
- };
46
-
47
- typedef struct rb_thread_struct rb_thread_t;
48
-
49
- } // namespace
50
-
51
- extern "C" rb_thread_t * ruby_current_thread;
52
-
53
- #endif
54
-
55
- namespace
56
- {
57
-
58
- #ifdef RUBY_VM
59
-
60
- /* YARV */
61
-
62
- #define CFP_DATA_MEMO_NODE_AND_PC cfp[0]
63
- #define CFP_METHOD_CLASS cfp[11]
64
-
65
- /* On YARV, we store the method data on the stack. We don't have to pop
66
- * it off the stack, because the stack pointer will be reset to the
67
- * previous frame's stack pointer when the function returns.
68
- */
69
- static void fix_frame()
70
- {
71
- do {
72
- VALUE * cfp = ruby_current_thread->cfp;
73
- CFP_DATA_MEMO_NODE_AND_PC = RBASIC(CFP_METHOD_CLASS)->klass;
74
-
75
- if(rb_type(CFP_DATA_MEMO_NODE_AND_PC) != T_NODE)
76
- {
77
- /* This can happen for module functions that are created after
78
- * the stub function */
79
- rb_raise(
80
- rb_eRuntimeError,
81
- "Cannot find method data for module function");
82
- }
83
- else
84
- {
85
- CFP_METHOD_CLASS = RCLASS_SUPER(CFP_METHOD_CLASS);
86
- }
87
- } while(0);
88
- }
89
-
90
- #define FIX_FRAME() \
91
- fix_frame()
92
-
93
- static NODE * data_memo_node()
94
- {
95
- VALUE * cfp = ruby_current_thread->cfp;
96
- return (NODE *)CFP_DATA_MEMO_NODE_AND_PC;
97
- }
98
-
99
- #else
100
-
101
- /* pre-YARV */
102
-
103
- /* Okay to not pop this temporary frame, since it will be popped by the
104
- * caller
105
- */
106
- #define FIX_FRAME() \
107
- struct FRAME _frame = *ruby_frame; \
108
- _frame.last_class = RCLASS(ruby_frame->last_class)->super; \
109
- _frame.prev = ruby_frame; \
110
- ruby_frame = &_frame; \
111
-
112
- static NODE * data_memo_node()
113
- {
114
- return (NODE *)(RBASIC(ruby_frame->prev->last_class)->klass);
115
- }
116
-
117
- #endif
118
-
119
- typedef VALUE (*Method_Func)(ANYARGS);
120
-
121
- static Method_Func actual_cfunc()
122
- {
123
- return data_memo_node()->nd_cfnc;
124
- }
125
-
126
- static VALUE data_wrapper_m1(int argc, VALUE * argv, VALUE self)
127
- {
128
- VALUE result;
129
- FIX_FRAME();
130
- result = (*actual_cfunc())(argc, argv, self);
131
- return result;
132
- }
133
-
134
- static VALUE data_wrapper_0(VALUE self)
135
- {
136
- VALUE result;
137
- FIX_FRAME();
138
- result = (*actual_cfunc())(self);
139
- return result;
140
- }
141
-
142
- #ruby <<END
143
- (1..MAX_ARGS).each do |i|
144
- params = (1..i).map { |j| "VALUE arg#{j}" }.join(', ')
145
- args = (1..i).map { |j| "arg#{j}" }.join(', ')
146
-
147
- puts <<-END
148
- static VALUE data_wrapper_#{i}(VALUE self, #{params})
149
- {
150
- VALUE result;
151
- FIX_FRAME();
152
- result = (*actual_cfunc())(self, #{args});
153
- return result;
154
- }
155
- END
156
- end
157
-
158
- nil
159
- END
160
-
161
- } // namespace
162
-
163
- /* Define a method and attach data to it.
164
- *
165
- * The method looks to ruby like a normal aliased CFUNC, with a modified
166
- * origin class:
167
- *
168
- * NODE_FBODY
169
- * |- (u1) orig - origin class
170
- * | |- basic
171
- * | | |- flags - origin class flags + FL_SINGLETON
172
- * | | +- klass - NODE_MEMO
173
- * | | |- (u1) cfnc - actual C function to call
174
- * | | |- (u2) rval - stored data
175
- * | | +- (u3) 0
176
- * | |- iv_tbl - 0
177
- * | |- m_tbl - 0
178
- * | +- super - actual origin class
179
- * |- (u2) mid - name of the method
180
- * +- (u3) head - NODE_CFUNC
181
- * |- (u1) cfnc - wrapper function to call
182
- * +- (u2) argc - function arity
183
- *
184
- * Or, on YARV:
185
- *
186
- * NODE_FBODY
187
- * |- (u1) oid - name of the method
188
- * +- (u2) body - NODE_METHOD
189
- * |- (u1) clss - origin class
190
- * | |- basic
191
- * | | |- flags - origin class flags + FL_SINGLETON
192
- * | | +- klass - NODE_MEMO
193
- * | | |- (u1) cfnc - actual C function to call
194
- * | | |- (u2) rval - stored data
195
- * | | +- (u3) 0
196
- * | |- ptr - rb_classext_t
197
- * | | |- super - actual origin class
198
- * | | +- iv_tbl - 0
199
- * | |- m_tbl - 0
200
- * | +- iv_index_tbl - 0?
201
- * |- (u2) body - NODE_CFUNC
202
- * | |- (u1) cfnc - wrapper function to call
203
- * | |- (u2) argc - function arity
204
- * +- (u3) noex - NOEX_PUBLIC
205
- *
206
- * When the wrapper function is called, last_class is set to the origin
207
- * class found in the FBODY node. So that the method data will be
208
- * accessible, and so last_class will point to klass and not to our MEMO
209
- * node, it is necessary to "fix" the current frame.
210
- *
211
- * Pre-YARV, this means we duplicate the current frame and set last_class:
212
- *
213
- * ruby_frame
214
- * |- last_class - klass
215
- * |- prev
216
- * | |- last_class - NODE_MEMO
217
- * | | |- (u1) cfnc - actual C function to call
218
- * | | |- (u2) rval - stored data
219
- * | | +- (u3) 0
220
- * | |- prev - the real previous frame
221
- * | +- ...
222
- * +- ...
223
- *
224
- * The method data is then accessible via
225
- * ruby_frame->prev->last_class->rval.
226
- *
227
- * On YARV, the current frame is not duplicated; rather, the method data
228
- * is placed on the stack and is referenced by one of the unused members
229
- * of the control frame (the program counter):
230
- *
231
- * ruby_current_thread->cfp
232
- * |- pc - NODE_MEMO
233
- * | |- (u1) cfnc - actual C function to call
234
- * | |- (u2) rval - stored data
235
- * | +- (u3) 0
236
- * |- method_class - klass
237
- * +- ...
238
- *
239
- */
240
- VALUE
241
- Rice::detail::
242
- define_method_with_data(
243
- VALUE klass, ID id, VALUE (*cfunc)(ANYARGS), int arity, VALUE data)
244
- {
245
- /* TODO: origin should have #to_s and #inspect methods defined */
246
- #ifdef HAVE_RB_CLASS_BOOT
247
- VALUE origin = rb_class_boot(klass);
248
- #else
249
- VALUE origin = rb_class_new(klass);
250
- #endif
251
- NODE * node;
252
-
253
- VALUE (*data_wrapper)(ANYARGS);
254
- switch(arity)
255
- {
256
- #ruby <<END
257
- (0..MAX_ARGS).each do |i|
258
- puts <<-END
259
- case #{i}: data_wrapper = RUBY_METHOD_FUNC(data_wrapper_#{i}); break;
260
- END
261
- end
262
- nil
263
- END
264
- case -1: data_wrapper = RUBY_METHOD_FUNC(data_wrapper_m1); break;
265
- default: rb_raise(rb_eArgError, "unsupported arity %d", arity);
266
- }
267
-
268
- FL_SET(origin, FL_SINGLETON);
269
- rb_singleton_class_attached(origin, klass);
270
- rb_name_class(origin, SYM2ID(rb_class_name(klass)));
271
-
272
- RBASIC(origin)->klass = (VALUE)NEW_NODE(NODE_MEMO, cfunc, data, 0);
273
-
274
- #ifdef RUBY_VM
275
- /* YARV */
276
- node = NEW_FBODY(
277
- NEW_METHOD(
278
- NEW_CFUNC(data_wrapper, arity),
279
- origin,
280
- NOEX_PUBLIC),
281
- id);
282
- st_insert(RCLASS_M_TBL(klass), id, (st_data_t)node);
283
- #else
284
- /* pre-YARV */
285
- node = NEW_FBODY(
286
- NEW_CFUNC(data_wrapper, arity),
287
- id,
288
- origin);
289
- rb_add_method(klass, id, node, NOEX_PUBLIC);
290
- #endif
291
-
292
- return Qnil;
293
- }
294
-
295
- VALUE
296
- Rice::detail::
297
- method_data()
298
- {
299
- return data_memo_node()->nd_rval;
300
- }
301
-
@@ -1,62 +0,0 @@
1
- // TODO: This is silly, autoconf...
2
- #undef PACKAGE_NAME
3
- #undef PACKAGE_STRING
4
- #undef PACKAGE_TARNAME
5
- #undef PACKAGE_VERSION
6
-
7
- #include "../config.hpp"
8
-
9
- // TODO: This is silly, autoconf...
10
- #undef PACKAGE_NAME
11
- #undef PACKAGE_STRING
12
- #undef PACKAGE_TARNAME
13
- #undef PACKAGE_VERSION
14
-
15
- #if !defined(HAVE_NODE_H) && !defined(REALLY_HAVE_RUBY_NODE_H)
16
-
17
- #include "mininode.hpp"
18
- #include <cstring>
19
-
20
- extern "C"
21
- char const * ruby_node_name(int node);
22
-
23
- namespace
24
- {
25
-
26
- int node_value(char const * name)
27
- {
28
- /* TODO: any way to end the block? */
29
- int j;
30
- for(j = 0; ; ++j)
31
- {
32
- if(!std::strcmp(name, ruby_node_name(j)))
33
- {
34
- return j;
35
- }
36
- }
37
- }
38
-
39
- } // namespace
40
-
41
- #ruby <<END
42
- require 'node_names'
43
- NODE_NAMES.each do |name|
44
- puts <<-END
45
- static int NODE_#{name}_ = -1;
46
-
47
- int Rice::detail::Mininode::get_NODE_#{name}()
48
- {
49
- if(NODE_#{name}_ == -1)
50
- {
51
- NODE_#{name}_ = node_value("NODE_#{name}");
52
- }
53
-
54
- return NODE_#{name}_;
55
- }
56
- END
57
- end
58
- nil
59
- END
60
-
61
- #endif
62
-
@@ -1,119 +0,0 @@
1
- #ifndef Rice__detail__mininode__hpp
2
- #define Rice__detail__mininode__hpp
3
-
4
- #include "ruby.hpp"
5
-
6
- // TODO: This is silly, autoconf...
7
- #undef PACKAGE_NAME
8
- #undef PACKAGE_STRING
9
- #undef PACKAGE_TARNAME
10
- #undef PACKAGE_VERSION
11
-
12
- #include "../config.hpp"
13
-
14
- // TODO: This is silly, autoconf...
15
- #undef PACKAGE_NAME
16
- #undef PACKAGE_STRING
17
- #undef PACKAGE_TARNAME
18
- #undef PACKAGE_VERSION
19
-
20
- #if !defined(HAVE_NODE_H) && !defined(REALLY_HAVE_RUBY_NODE_H)
21
-
22
- namespace Rice
23
- {
24
-
25
- namespace detail
26
- {
27
-
28
- namespace Mininode
29
- {
30
-
31
- typedef struct RNode {
32
- unsigned long flags;
33
- void * reserved;
34
- union {
35
- struct RNode * node;
36
- VALUE (*cfunc)(ANYARGS);
37
- } u1;
38
- union {
39
- struct RNode * node;
40
- VALUE value;
41
- } u2;
42
- union {
43
- struct RNode * node;
44
- } u3;
45
- } NODE;
46
-
47
- #define nd_cfnc u1.cfunc
48
- #define nd_rval u2.value
49
-
50
- /* TODO: No way to know the correct size of node_type */
51
- enum node_type {
52
- NODE_FOO,
53
- };
54
-
55
- extern "C"
56
- void rb_add_method(VALUE, ID, NODE *, int);
57
-
58
- extern "C"
59
- NODE *rb_node_newnode(enum node_type, VALUE, VALUE, VALUE);
60
-
61
- template<typename T, typename A0, typename A1, typename A2>
62
- inline NODE * NEW_NODE(T t, A0 a0, A1 a1, A2 a2)
63
- {
64
- return rb_node_newnode((node_type)t, (VALUE)a0, (VALUE)a1, (VALUE)a2);
65
- }
66
-
67
- #ruby <<END
68
- require 'node_names'
69
-
70
- NODE_NAMES.each do |name|
71
- puts "#define NODE_#{name} Rice::detail::Mininode::get_NODE_#{name}()"
72
- end
73
-
74
- puts
75
-
76
- NODE_NAMES.each do |name|
77
- puts "int get_NODE_#{name}();"
78
- end
79
- nil
80
- END
81
-
82
- static const int NOEX_PUBLIC = 0x0;
83
-
84
- inline NODE * NEW_METHOD(NODE * body, VALUE origin, int noex)
85
- {
86
- return NEW_NODE(NODE_METHOD, origin, body, noex);
87
- }
88
-
89
- #ifdef RUBY_VM
90
-
91
- inline NODE * NEW_FBODY(NODE * body, ID id)
92
- {
93
- return NEW_NODE(NODE_FBODY, id, body, 0);
94
- }
95
-
96
- #else
97
-
98
- inline NODE * NEW_FBODY(NODE * body, ID id, VALUE origin)
99
- {
100
- return NEW_NODE(NODE_FBODY, body, id, origin);
101
- }
102
-
103
- #endif // RUBY_VM
104
-
105
- inline NODE * NEW_CFUNC(RUBY_METHOD_FUNC cfunc, int arity)
106
- {
107
- return NEW_NODE(NODE_CFUNC, cfunc, arity, 0);
108
- }
109
-
110
- } // namespace Mininode
111
-
112
- } // namespace detail
113
-
114
- } // namespace Rice
115
-
116
- #endif
117
-
118
- #endif // Rice__detail__mininode__hpp
119
-