rice 1.1.0 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Doxyfile +1 -1
- data/Makefile.in +3 -2
- data/README +247 -16
- data/aclocal.m4 +62 -51
- data/configure +1585 -1456
- data/extconf.rb +9 -1
- data/rice/Arg.hpp +8 -0
- data/rice/Arg_impl.hpp +124 -0
- data/rice/Arg_operators.cpp +21 -0
- data/rice/Arg_operators.hpp +19 -0
- data/rice/Constructor.hpp +150 -0
- data/rice/Data_Type.ipp +51 -6
- data/rice/Director.cpp +19 -0
- data/rice/Director.hpp +47 -0
- data/rice/Enum.hpp +2 -3
- data/rice/Enum.ipp +1 -1
- data/rice/Hash.hpp +1 -1
- data/rice/Makefile.am +7 -0
- data/rice/Makefile.in +18 -7
- data/rice/Module_impl.hpp +36 -3
- data/rice/Module_impl.ipp +56 -7
- data/rice/VM.cpp +2 -2
- data/rice/config.hpp +1 -1
- data/rice/detail/Arguments.hpp +118 -0
- data/rice/detail/Auto_Function_Wrapper.hpp +206 -96
- data/rice/detail/Auto_Function_Wrapper.ipp +1687 -144
- data/rice/detail/Auto_Member_Function_Wrapper.hpp +234 -123
- data/rice/detail/Auto_Member_Function_Wrapper.ipp +1133 -306
- data/rice/detail/Caster.hpp +3 -1
- data/rice/detail/creation_funcs.hpp +0 -8
- data/rice/detail/creation_funcs.ipp +1 -27
- data/rice/detail/define_method_and_auto_wrap.hpp +3 -1
- data/rice/detail/define_method_and_auto_wrap.ipp +4 -3
- data/rice/detail/object_call.ipp +1 -1
- data/rice/detail/ruby.hpp +1 -33
- data/rice/detail/wrap_function.hpp +103 -48
- data/rice/detail/wrap_function.ipp +154 -96
- data/rice/generate_code.rb +520 -55
- data/rice/global_function.hpp +12 -1
- data/rice/global_function.ipp +14 -2
- data/ruby/Makefile.in +5 -4
- data/ruby/lib/Makefile.in +4 -3
- data/ruby/lib/version.rb +1 -1
- data/sample/Makefile.in +4 -3
- data/test/Makefile.am +2 -0
- data/test/Makefile.in +32 -13
- data/test/test_Class.cpp +36 -14
- data/test/test_Constructor.cpp +176 -1
- data/test/test_Data_Type.cpp +121 -0
- data/test/test_Director.cpp +225 -0
- data/test/test_Enum.cpp +33 -0
- data/test/test_Module.cpp +175 -0
- data/test/test_global_functions.cpp +70 -1
- metadata +27 -7
data/rice/global_function.hpp
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
#ifndef Rice__global_function__hpp_
|
2
2
|
#define Rice__global_function__hpp_
|
3
3
|
|
4
|
+
#include "Arg.hpp"
|
5
|
+
|
4
6
|
namespace Rice
|
5
7
|
{
|
6
8
|
|
@@ -13,7 +15,16 @@ namespace Rice
|
|
13
15
|
template<typename Func_T>
|
14
16
|
void define_global_function(
|
15
17
|
char const * name,
|
16
|
-
Func_T func
|
18
|
+
Func_T func,
|
19
|
+
Arguments* arguments = 0);
|
20
|
+
|
21
|
+
// FIXME: See Module::define_method with Arg
|
22
|
+
template<typename Func_T>
|
23
|
+
void define_global_function(
|
24
|
+
char const * name,
|
25
|
+
Func_T func,
|
26
|
+
Arg const& arg);
|
27
|
+
|
17
28
|
|
18
29
|
} // Rice
|
19
30
|
|
data/rice/global_function.ipp
CHANGED
@@ -3,8 +3,20 @@
|
|
3
3
|
template<typename Func_T>
|
4
4
|
void Rice::define_global_function(
|
5
5
|
char const * name,
|
6
|
-
Func_T func
|
6
|
+
Func_T func,
|
7
|
+
Arguments* arguments)
|
7
8
|
{
|
8
|
-
Module(rb_mKernel).define_module_function(name, func);
|
9
|
+
Module(rb_mKernel).define_module_function(name, func, arguments);
|
10
|
+
}
|
11
|
+
|
12
|
+
template<typename Func_T>
|
13
|
+
void Rice::define_global_function(
|
14
|
+
char const * name,
|
15
|
+
Func_T func,
|
16
|
+
Arg const& arg)
|
17
|
+
{
|
18
|
+
Arguments* args = new Arguments();
|
19
|
+
args->add(arg);
|
20
|
+
define_global_function(name, func, args);
|
9
21
|
}
|
10
22
|
|
data/ruby/Makefile.in
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Makefile.in generated by automake 1.10.
|
1
|
+
# Makefile.in generated by automake 1.10.2 from Makefile.am.
|
2
2
|
# @configure_input@
|
3
3
|
|
4
4
|
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
|
@@ -183,6 +183,7 @@ sharedstatedir = @sharedstatedir@
|
|
183
183
|
srcdir = @srcdir@
|
184
184
|
sysconfdir = @sysconfdir@
|
185
185
|
target_alias = @target_alias@
|
186
|
+
top_build_prefix = @top_build_prefix@
|
186
187
|
top_builddir = @top_builddir@
|
187
188
|
top_srcdir = @top_srcdir@
|
188
189
|
SUBDIRS = lib
|
@@ -193,8 +194,8 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
|
|
193
194
|
@for dep in $?; do \
|
194
195
|
case '$(am__configure_deps)' in \
|
195
196
|
*$$dep*) \
|
196
|
-
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
|
197
|
-
|
197
|
+
( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
|
198
|
+
&& { if test -f $@; then exit 0; else break; fi; }; \
|
198
199
|
exit 1;; \
|
199
200
|
esac; \
|
200
201
|
done; \
|
@@ -294,7 +295,7 @@ ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
|
|
294
295
|
unique=`for i in $$list; do \
|
295
296
|
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
296
297
|
done | \
|
297
|
-
$(AWK) '{ files[$$0] = 1;
|
298
|
+
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
|
298
299
|
END { if (nonempty) { for (i in files) print i; }; }'`; \
|
299
300
|
mkid -fID $$unique
|
300
301
|
tags: TAGS
|
data/ruby/lib/Makefile.in
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Makefile.in generated by automake 1.10.
|
1
|
+
# Makefile.in generated by automake 1.10.2 from Makefile.am.
|
2
2
|
# @configure_input@
|
3
3
|
|
4
4
|
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
|
@@ -182,6 +182,7 @@ sharedstatedir = @sharedstatedir@
|
|
182
182
|
srcdir = @srcdir@
|
183
183
|
sysconfdir = @sysconfdir@
|
184
184
|
target_alias = @target_alias@
|
185
|
+
top_build_prefix = @top_build_prefix@
|
185
186
|
top_builddir = @top_builddir@
|
186
187
|
top_srcdir = @top_srcdir@
|
187
188
|
rubydir = @RUBY_SITELIBDIR@
|
@@ -193,8 +194,8 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
|
|
193
194
|
@for dep in $?; do \
|
194
195
|
case '$(am__configure_deps)' in \
|
195
196
|
*$$dep*) \
|
196
|
-
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
|
197
|
-
|
197
|
+
( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
|
198
|
+
&& { if test -f $@; then exit 0; else break; fi; }; \
|
198
199
|
exit 1;; \
|
199
200
|
esac; \
|
200
201
|
done; \
|
data/ruby/lib/version.rb
CHANGED
data/sample/Makefile.in
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Makefile.in generated by automake 1.10.
|
1
|
+
# Makefile.in generated by automake 1.10.2 from Makefile.am.
|
2
2
|
# @configure_input@
|
3
3
|
|
4
4
|
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
|
@@ -171,6 +171,7 @@ sharedstatedir = @sharedstatedir@
|
|
171
171
|
srcdir = @srcdir@
|
172
172
|
sysconfdir = @sysconfdir@
|
173
173
|
target_alias = @target_alias@
|
174
|
+
top_build_prefix = @top_build_prefix@
|
174
175
|
top_builddir = @top_builddir@
|
175
176
|
top_srcdir = @top_srcdir@
|
176
177
|
RUBY_EXTCONF_OPTIONS = -I@RICE_ROOT@/ruby/lib
|
@@ -193,8 +194,8 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
|
|
193
194
|
@for dep in $?; do \
|
194
195
|
case '$(am__configure_deps)' in \
|
195
196
|
*$$dep*) \
|
196
|
-
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
|
197
|
-
|
197
|
+
( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
|
198
|
+
&& { if test -f $@; then exit 0; else break; fi; }; \
|
198
199
|
exit 1;; \
|
199
200
|
esac; \
|
200
201
|
done; \
|
data/test/Makefile.am
CHANGED
data/test/Makefile.in
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Makefile.in generated by automake 1.10.
|
1
|
+
# Makefile.in generated by automake 1.10.2 from Makefile.am.
|
2
2
|
# @configure_input@
|
3
3
|
|
4
4
|
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
|
@@ -50,7 +50,8 @@ am_unittest_OBJECTS = unittest.$(OBJEXT) \
|
|
50
50
|
test_Allocation_Strategies.$(OBJEXT) test_Array.$(OBJEXT) \
|
51
51
|
test_Builtin_Object.$(OBJEXT) test_Class.$(OBJEXT) \
|
52
52
|
test_Constructor.$(OBJEXT) test_Critical_Guard.$(OBJEXT) \
|
53
|
-
test_Data_Object.$(OBJEXT)
|
53
|
+
test_Data_Object.$(OBJEXT) test_Data_Type.$(OBJEXT) \
|
54
|
+
test_Director.$(OBJEXT) test_Enum.$(OBJEXT) \
|
54
55
|
test_Exception.$(OBJEXT) test_Hash.$(OBJEXT) \
|
55
56
|
test_Identifier.$(OBJEXT) test_Jump_Tag.$(OBJEXT) \
|
56
57
|
test_Module.$(OBJEXT) test_Object.$(OBJEXT) \
|
@@ -206,6 +207,7 @@ sharedstatedir = @sharedstatedir@
|
|
206
207
|
srcdir = @srcdir@
|
207
208
|
sysconfdir = @sysconfdir@
|
208
209
|
target_alias = @target_alias@
|
210
|
+
top_build_prefix = @top_build_prefix@
|
209
211
|
top_builddir = @top_builddir@
|
210
212
|
top_srcdir = @top_srcdir@
|
211
213
|
unittest_SOURCES = \
|
@@ -218,6 +220,8 @@ unittest_SOURCES = \
|
|
218
220
|
test_Constructor.cpp \
|
219
221
|
test_Critical_Guard.cpp \
|
220
222
|
test_Data_Object.cpp \
|
223
|
+
test_Data_Type.cpp \
|
224
|
+
test_Director.cpp \
|
221
225
|
test_Enum.cpp \
|
222
226
|
test_Exception.cpp \
|
223
227
|
test_Hash.cpp \
|
@@ -254,8 +258,8 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
|
|
254
258
|
@for dep in $?; do \
|
255
259
|
case '$(am__configure_deps)' in \
|
256
260
|
*$$dep*) \
|
257
|
-
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
|
258
|
-
|
261
|
+
( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
|
262
|
+
&& { if test -f $@; then exit 0; else break; fi; }; \
|
259
263
|
exit 1;; \
|
260
264
|
esac; \
|
261
265
|
done; \
|
@@ -303,6 +307,8 @@ distclean-compile:
|
|
303
307
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_Constructor.Po@am__quote@
|
304
308
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_Critical_Guard.Po@am__quote@
|
305
309
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_Data_Object.Po@am__quote@
|
310
|
+
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_Data_Type.Po@am__quote@
|
311
|
+
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_Director.Po@am__quote@
|
306
312
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_Enum.Po@am__quote@
|
307
313
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_Exception.Po@am__quote@
|
308
314
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_Hash.Po@am__quote@
|
@@ -337,7 +343,7 @@ ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
|
|
337
343
|
unique=`for i in $$list; do \
|
338
344
|
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
339
345
|
done | \
|
340
|
-
$(AWK) '{ files[$$0] = 1;
|
346
|
+
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
|
341
347
|
END { if (nonempty) { for (i in files) print i; }; }'`; \
|
342
348
|
mkid -fID $$unique
|
343
349
|
tags: TAGS
|
@@ -380,7 +386,7 @@ distclean-tags:
|
|
380
386
|
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
|
381
387
|
|
382
388
|
check-TESTS: $(TESTS)
|
383
|
-
@failed=0; all=0; xfail=0; xpass=0; skip=0;
|
389
|
+
@failed=0; all=0; xfail=0; xpass=0; skip=0; \
|
384
390
|
srcdir=$(srcdir); export srcdir; \
|
385
391
|
list=' $(TESTS) '; \
|
386
392
|
if test -n "$$list"; then \
|
@@ -391,7 +397,7 @@ check-TESTS: $(TESTS)
|
|
391
397
|
if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
|
392
398
|
all=`expr $$all + 1`; \
|
393
399
|
case " $(XFAIL_TESTS) " in \
|
394
|
-
|
400
|
+
*[\ \ ]$$tst[\ \ ]*) \
|
395
401
|
xpass=`expr $$xpass + 1`; \
|
396
402
|
failed=`expr $$failed + 1`; \
|
397
403
|
echo "XPASS: $$tst"; \
|
@@ -403,7 +409,7 @@ check-TESTS: $(TESTS)
|
|
403
409
|
elif test $$? -ne 77; then \
|
404
410
|
all=`expr $$all + 1`; \
|
405
411
|
case " $(XFAIL_TESTS) " in \
|
406
|
-
|
412
|
+
*[\ \ ]$$tst[\ \ ]*) \
|
407
413
|
xfail=`expr $$xfail + 1`; \
|
408
414
|
echo "XFAIL: $$tst"; \
|
409
415
|
;; \
|
@@ -417,23 +423,36 @@ check-TESTS: $(TESTS)
|
|
417
423
|
echo "SKIP: $$tst"; \
|
418
424
|
fi; \
|
419
425
|
done; \
|
426
|
+
if test "$$all" -eq 1; then \
|
427
|
+
tests="test"; \
|
428
|
+
All=""; \
|
429
|
+
else \
|
430
|
+
tests="tests"; \
|
431
|
+
All="All "; \
|
432
|
+
fi; \
|
420
433
|
if test "$$failed" -eq 0; then \
|
421
434
|
if test "$$xfail" -eq 0; then \
|
422
|
-
banner="All
|
435
|
+
banner="$$All$$all $$tests passed"; \
|
423
436
|
else \
|
424
|
-
|
437
|
+
if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \
|
438
|
+
banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \
|
425
439
|
fi; \
|
426
440
|
else \
|
427
441
|
if test "$$xpass" -eq 0; then \
|
428
|
-
banner="$$failed of $$all tests failed"; \
|
442
|
+
banner="$$failed of $$all $$tests failed"; \
|
429
443
|
else \
|
430
|
-
|
444
|
+
if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \
|
445
|
+
banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \
|
431
446
|
fi; \
|
432
447
|
fi; \
|
433
448
|
dashes="$$banner"; \
|
434
449
|
skipped=""; \
|
435
450
|
if test "$$skip" -ne 0; then \
|
436
|
-
|
451
|
+
if test "$$skip" -eq 1; then \
|
452
|
+
skipped="($$skip test was not run)"; \
|
453
|
+
else \
|
454
|
+
skipped="($$skip tests were not run)"; \
|
455
|
+
fi; \
|
437
456
|
test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
|
438
457
|
dashes="$$skipped"; \
|
439
458
|
fi; \
|
data/test/test_Class.cpp
CHANGED
@@ -9,6 +9,7 @@
|
|
9
9
|
#include <iostream>
|
10
10
|
|
11
11
|
using namespace Rice;
|
12
|
+
using namespace std;
|
12
13
|
|
13
14
|
TESTSUITE(Class);
|
14
15
|
|
@@ -87,7 +88,7 @@ namespace
|
|
87
88
|
|
88
89
|
bool define_method_simple_ok;
|
89
90
|
|
90
|
-
void define_method_simple_helper(
|
91
|
+
void define_method_simple_helper()
|
91
92
|
{
|
92
93
|
define_method_simple_ok = true;
|
93
94
|
}
|
@@ -130,19 +131,27 @@ TESTCASE(define_module_function_simple)
|
|
130
131
|
namespace
|
131
132
|
{
|
132
133
|
|
133
|
-
int define_method_int_result;
|
134
|
+
int define_method_int_result;
|
134
135
|
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
136
|
+
class IntHelper {
|
137
|
+
public:
|
138
|
+
IntHelper() { }
|
139
|
+
|
140
|
+
void define_method_int_helper(int i)
|
141
|
+
{
|
142
|
+
define_method_int_result = i;
|
143
|
+
}
|
144
|
+
};
|
139
145
|
|
140
146
|
} // namespace
|
141
147
|
|
142
148
|
TESTCASE(define_method_int)
|
143
149
|
{
|
144
|
-
Class c
|
145
|
-
|
150
|
+
Class c =
|
151
|
+
define_class<IntHelper>("IntHelper")
|
152
|
+
.define_constructor(Constructor<IntHelper>())
|
153
|
+
.define_method("foo", &IntHelper::define_method_int_helper);
|
154
|
+
|
146
155
|
Object o = c.call("new");
|
147
156
|
define_method_int_result = 0;
|
148
157
|
o.call("foo", 42);
|
@@ -151,9 +160,13 @@ TESTCASE(define_method_int)
|
|
151
160
|
|
152
161
|
TESTCASE(define_method_int_passed_two_args)
|
153
162
|
{
|
154
|
-
Class c
|
155
|
-
|
163
|
+
Class c =
|
164
|
+
define_class<IntHelper>("IntHelper")
|
165
|
+
.define_constructor(Constructor<IntHelper>())
|
166
|
+
.define_method("foo", &IntHelper::define_method_int_helper);
|
167
|
+
|
156
168
|
Object o = c.call("new");
|
169
|
+
|
157
170
|
ASSERT_EXCEPTION_CHECK(
|
158
171
|
Exception,
|
159
172
|
o.call("foo", 1, 2),
|
@@ -166,9 +179,13 @@ TESTCASE(define_method_int_passed_two_args)
|
|
166
179
|
|
167
180
|
TESTCASE(define_method_int_passed_no_args)
|
168
181
|
{
|
169
|
-
Class c
|
170
|
-
|
182
|
+
Class c =
|
183
|
+
define_class<IntHelper>("IntHelper")
|
184
|
+
.define_constructor(Constructor<IntHelper>())
|
185
|
+
.define_method("foo", &IntHelper::define_method_int_helper);
|
186
|
+
|
171
187
|
Object o = c.call("new");
|
188
|
+
|
172
189
|
ASSERT_EXCEPTION_CHECK(
|
173
190
|
Exception,
|
174
191
|
o.call("foo"),
|
@@ -191,7 +208,7 @@ struct Foo
|
|
191
208
|
int define_method_int_foo_result_i;
|
192
209
|
Foo * define_method_int_foo_result_x;
|
193
210
|
|
194
|
-
void define_method_int_foo_helper(
|
211
|
+
void define_method_int_foo_helper(int i, Foo * x)
|
195
212
|
{
|
196
213
|
define_method_int_foo_result_i = i;
|
197
214
|
define_method_int_foo_result_x = x;
|
@@ -221,6 +238,11 @@ TESTCASE(define_method_int_foo)
|
|
221
238
|
ASSERT_EQUAL(foo, define_method_int_foo_result_x);
|
222
239
|
}
|
223
240
|
|
241
|
+
|
242
|
+
TESTCASE(define_method_with_default_arguments)
|
243
|
+
{
|
244
|
+
}
|
245
|
+
|
224
246
|
namespace
|
225
247
|
{
|
226
248
|
|
@@ -234,7 +256,7 @@ void handle_silly_exception(Silly_Exception const & ex)
|
|
234
256
|
throw Exception(rb_eRuntimeError, "SILLY");
|
235
257
|
}
|
236
258
|
|
237
|
-
void throw_silly_exception(
|
259
|
+
void throw_silly_exception()
|
238
260
|
{
|
239
261
|
throw Silly_Exception();
|
240
262
|
}
|
data/test/test_Constructor.cpp
CHANGED
@@ -1,7 +1,11 @@
|
|
1
1
|
#include "unittest.hpp"
|
2
2
|
#include "rice/Constructor.hpp"
|
3
3
|
#include "rice/Data_Type.hpp"
|
4
|
-
|
4
|
+
|
5
|
+
#include "rice/detail/env.hpp"
|
6
|
+
|
7
|
+
#include <iostream>
|
8
|
+
using namespace std;
|
5
9
|
|
6
10
|
using namespace Rice;
|
7
11
|
|
@@ -60,4 +64,175 @@ TESTCASE(non_default_constructor)
|
|
60
64
|
ASSERT_EQUAL(rb_cNon_Default_Constructible, o.class_of());
|
61
65
|
ASSERT_EQUAL(42, o->i());
|
62
66
|
}
|
67
|
+
/*
|
68
|
+
namespace {
|
69
|
+
|
70
|
+
class AbstractClass
|
71
|
+
{
|
72
|
+
public:
|
73
|
+
|
74
|
+
int doSomething()
|
75
|
+
{
|
76
|
+
return doSomethingImpl();
|
77
|
+
}
|
78
|
+
|
79
|
+
int doSomethingParam(int a, int b)
|
80
|
+
{
|
81
|
+
return doSomethingParamImpl(a, b);
|
82
|
+
}
|
83
|
+
|
84
|
+
virtual int doSomethingImpl() = 0;
|
85
|
+
|
86
|
+
virtual int doSomethingParamImpl(int a, int b) = 0;
|
87
|
+
};
|
88
|
+
|
89
|
+
class Director : public AbstractClass
|
90
|
+
{
|
91
|
+
Rice::Object m_rbSelf;
|
92
|
+
|
93
|
+
public:
|
94
|
+
Director(Rice::Object self) : m_rbSelf(self) { }
|
95
|
+
|
96
|
+
virtual int doSomethingImpl()
|
97
|
+
{
|
98
|
+
cout << endl << "In Impl, frame's last_func is " << rb_id2name(ruby_frame->last_func) << endl;
|
99
|
+
cout << endl << "In Impl, frame's orig_func is " << rb_id2name(ruby_frame->orig_func) << endl;
|
100
|
+
cout << endl << "In Impl, frame's last_class is " << Class(ruby_frame->last_class).name().str() << endl;
|
101
|
+
|
102
|
+
cout << endl << "In Impl, frame's prev's last_func is " << rb_id2name(ruby_frame->prev->last_func) << endl;
|
103
|
+
cout << endl << "In Impl, frame's prev's orig_func is " << rb_id2name(ruby_frame->prev->orig_func) << endl;
|
104
|
+
|
105
|
+
cout << endl << "We've got classname (frame) " << rb_obj_classname(ruby_frame->self) << " vs (self) " << rb_obj_classname(m_rbSelf.value()) << endl;
|
106
|
+
cout << endl << "We've got classname (frame prev) " << rb_obj_classname(ruby_frame->prev->self) << " vs (self) " << rb_obj_classname(m_rbSelf.value()) << endl;
|
107
|
+
|
108
|
+
// Need to get the Ruby callee, compare that to m_rbSelf, and
|
109
|
+
// if they're equal, go UP the chain, otherwise go DOWN
|
110
|
+
if(ruby_frame->self == m_rbSelf.value()) {
|
111
|
+
// As doSomethingImpl is pure virtual, we need to implement a default here so
|
112
|
+
// that super calls don't blow things up
|
113
|
+
return 100;
|
114
|
+
} else {
|
115
|
+
return from_ruby<int>( m_rbSelf.call("do_something_impl") );
|
116
|
+
}
|
117
|
+
|
118
|
+
}
|
119
|
+
|
120
|
+
virtual int doSomethingParamImpl(int a, int b)
|
121
|
+
{
|
122
|
+
return from_ruby<int>( m_rbSelf.call("do_something_param_impl", a, b) );
|
123
|
+
}
|
124
|
+
};
|
125
|
+
}
|
126
|
+
|
127
|
+
TESTCASE(director_system_polymorphic_calls)
|
128
|
+
{
|
129
|
+
Data_Type<AbstractClass> a = define_class<AbstractClass>("__AbstractClass__");
|
63
130
|
|
131
|
+
Data_Type<Director> d = define_class<Director, AbstractClass>("AbstractClass");
|
132
|
+
d.define_constructor(Constructor<Director, Rice::Object>());
|
133
|
+
d.define_method("do_something", &AbstractClass::doSomething);
|
134
|
+
d.define_method("do_something_impl", &Director::doSomethingImpl);
|
135
|
+
|
136
|
+
Module m = define_module("Testing");
|
137
|
+
m.instance_eval(
|
138
|
+
"class MyWorker < AbstractClass;"
|
139
|
+
"def do_something_impl; 8; end;"
|
140
|
+
"end"
|
141
|
+
);
|
142
|
+
|
143
|
+
Object result = m.instance_eval("worker = MyWorker.new; worker.do_something");
|
144
|
+
|
145
|
+
ASSERT_EQUAL(
|
146
|
+
8, from_ruby<int>(result.value())
|
147
|
+
);
|
148
|
+
}
|
149
|
+
|
150
|
+
TESTCASE(director_system_polymorphic_calls_with_parameters)
|
151
|
+
{
|
152
|
+
Data_Type<AbstractClass> a = define_class<AbstractClass>("__AbstractClass__");
|
153
|
+
|
154
|
+
Data_Type<Director> d = define_class<Director, AbstractClass>("AbstractClass");
|
155
|
+
d.define_constructor(Constructor<Director, Rice::Object>());
|
156
|
+
d.define_method("do_something_param", &AbstractClass::doSomethingParam);
|
157
|
+
d.define_method("do_something_param_impl", &Director::doSomethingParamImpl);
|
158
|
+
|
159
|
+
Module m = define_module("Testing");
|
160
|
+
m.instance_eval(
|
161
|
+
"class MyWorker < AbstractClass;"
|
162
|
+
"def do_something_param_impl(a, b); a * b; end;"
|
163
|
+
"end"
|
164
|
+
);
|
165
|
+
|
166
|
+
Object result = m.instance_eval("worker = MyWorker.new; worker.do_something_param(2, 10)");
|
167
|
+
|
168
|
+
ASSERT_EQUAL(
|
169
|
+
20, from_ruby<int>(result.value())
|
170
|
+
);
|
171
|
+
}
|
172
|
+
|
173
|
+
TESTCASE(director_system_polymorphic_calls_very_deep)
|
174
|
+
{
|
175
|
+
Data_Type<AbstractClass> a = define_class<AbstractClass>("__AbstractClass__");
|
176
|
+
|
177
|
+
Data_Type<Director> d = define_class<Director, AbstractClass>("AbstractClass");
|
178
|
+
d.define_constructor(Constructor<Director, Rice::Object>());
|
179
|
+
d.define_method("do_something", &AbstractClass::doSomething);
|
180
|
+
d.define_method("do_something_impl", &Director::doSomethingImpl);
|
181
|
+
|
182
|
+
Module m = define_module("Testing");
|
183
|
+
m.instance_eval(
|
184
|
+
"class MyWorker < AbstractClass;"
|
185
|
+
"def do_something_impl; 4; end;"
|
186
|
+
"end;"
|
187
|
+
"class MyWorker2 < MyWorker;"
|
188
|
+
"def do_something_impl; 6; end;"
|
189
|
+
"end;"
|
190
|
+
"class MyWorker3 < MyWorker2;"
|
191
|
+
"def do_something_impl; 8; end;"
|
192
|
+
"end;"
|
193
|
+
"class MyWorker4 < MyWorker3;"
|
194
|
+
"def do_something_impl; 10; end;"
|
195
|
+
"end;"
|
196
|
+
);
|
197
|
+
|
198
|
+
Object result = m.instance_eval("worker = MyWorker4.new; worker.do_something");
|
199
|
+
|
200
|
+
ASSERT_EQUAL(
|
201
|
+
10, from_ruby<int>(result.value())
|
202
|
+
);
|
203
|
+
}
|
204
|
+
|
205
|
+
TESTCASE(director_system_super_calls_dont_infinite_loop)
|
206
|
+
{
|
207
|
+
Data_Type<AbstractClass> a = define_class<AbstractClass>("__AbstractClass__");
|
208
|
+
|
209
|
+
Data_Type<Director> d = define_class<Director, AbstractClass>("AbstractClass");
|
210
|
+
d.define_constructor(Constructor<Director, Rice::Object>());
|
211
|
+
d.define_method("do_something", &AbstractClass::doSomething);
|
212
|
+
d.define_method("do_something_impl", &Director::doSomethingImpl);
|
213
|
+
|
214
|
+
Module m = define_module("Testing");
|
215
|
+
m.instance_eval(
|
216
|
+
"class MyWorker < AbstractClass;"
|
217
|
+
"@@call_count = 0;"
|
218
|
+
"def do_something_impl;"
|
219
|
+
"@@call_count += 1;"
|
220
|
+
"if @@call_count == 1; super; else; -1; end;"
|
221
|
+
"end; end;"
|
222
|
+
);
|
223
|
+
|
224
|
+
Object result = m.instance_eval("worker = MyWorker.new; worker.do_something");
|
225
|
+
|
226
|
+
// -1 means that the do_something_impl got called twice, aka we were in an infinite loop
|
227
|
+
// had the class var check not been there
|
228
|
+
ASSERT_NOT_EQUAL(
|
229
|
+
-1,
|
230
|
+
from_ruby<int>(result.value())
|
231
|
+
);
|
232
|
+
|
233
|
+
ASSERT_EQUAL(
|
234
|
+
100,
|
235
|
+
from_ruby<int>(result.value())
|
236
|
+
);
|
237
|
+
}
|
238
|
+
*/
|