rice 3.0.0 → 4.0.3

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 (238) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +121 -0
  3. data/CONTRIBUTORS.md +19 -0
  4. data/Gemfile +3 -0
  5. data/README.md +44 -1025
  6. data/Rakefile +95 -12
  7. data/include/rice/rice.hpp +7766 -0
  8. data/include/rice/stl.hpp +1113 -0
  9. data/lib/mkmf-rice.rb +127 -0
  10. data/lib/version.rb +3 -0
  11. data/rice/Address_Registration_Guard.ipp +75 -32
  12. data/rice/Address_Registration_Guard_defn.hpp +60 -56
  13. data/rice/Arg.hpp +80 -4
  14. data/rice/Arg.ipp +51 -0
  15. data/rice/Constructor.hpp +12 -14
  16. data/rice/Data_Object.ipp +234 -107
  17. data/rice/Data_Object_defn.hpp +77 -117
  18. data/rice/Data_Type.hpp +1 -2
  19. data/rice/Data_Type.ipp +251 -295
  20. data/rice/Data_Type_defn.hpp +175 -243
  21. data/rice/Director.hpp +11 -6
  22. data/rice/Enum.hpp +54 -104
  23. data/rice/Enum.ipp +104 -230
  24. data/rice/Exception.hpp +2 -8
  25. data/rice/Exception.ipp +65 -0
  26. data/rice/Exception_defn.hpp +46 -47
  27. data/rice/Identifier.hpp +28 -28
  28. data/rice/Identifier.ipp +23 -27
  29. data/rice/Return.hpp +39 -0
  30. data/rice/Return.ipp +33 -0
  31. data/rice/detail/Exception_Handler.ipp +22 -62
  32. data/rice/detail/Exception_Handler_defn.hpp +76 -91
  33. data/rice/detail/Iterator.hpp +18 -88
  34. data/rice/detail/Iterator.ipp +47 -0
  35. data/rice/detail/Jump_Tag.hpp +21 -0
  36. data/rice/detail/MethodInfo.hpp +44 -0
  37. data/rice/detail/MethodInfo.ipp +78 -0
  38. data/rice/detail/NativeAttribute.hpp +53 -0
  39. data/rice/detail/NativeAttribute.ipp +83 -0
  40. data/rice/detail/NativeFunction.hpp +69 -0
  41. data/rice/detail/NativeFunction.ipp +248 -0
  42. data/rice/detail/RubyFunction.hpp +39 -0
  43. data/rice/detail/RubyFunction.ipp +92 -0
  44. data/rice/detail/Type.hpp +29 -0
  45. data/rice/detail/Type.ipp +138 -0
  46. data/rice/detail/TypeRegistry.hpp +50 -0
  47. data/rice/detail/TypeRegistry.ipp +106 -0
  48. data/rice/detail/Wrapper.hpp +51 -0
  49. data/rice/detail/Wrapper.ipp +151 -0
  50. data/rice/detail/default_allocation_func.hpp +8 -19
  51. data/rice/detail/default_allocation_func.ipp +9 -8
  52. data/rice/detail/from_ruby.hpp +2 -37
  53. data/rice/detail/from_ruby.ipp +1020 -46
  54. data/rice/detail/from_ruby_defn.hpp +38 -0
  55. data/rice/detail/function_traits.hpp +124 -0
  56. data/rice/detail/method_data.hpp +23 -15
  57. data/rice/detail/method_data.ipp +53 -0
  58. data/rice/detail/rice_traits.hpp +116 -0
  59. data/rice/detail/ruby.hpp +9 -46
  60. data/rice/detail/to_ruby.hpp +3 -17
  61. data/rice/detail/to_ruby.ipp +409 -31
  62. data/rice/detail/to_ruby_defn.hpp +48 -0
  63. data/rice/forward_declares.ipp +82 -0
  64. data/rice/global_function.hpp +16 -20
  65. data/rice/global_function.ipp +8 -17
  66. data/rice/rice.hpp +59 -0
  67. data/rice/ruby_mark.hpp +5 -3
  68. data/rice/ruby_try_catch.hpp +4 -4
  69. data/rice/stl.hpp +11 -0
  70. data/sample/callbacks/extconf.rb +3 -0
  71. data/sample/callbacks/sample_callbacks.cpp +10 -13
  72. data/sample/enum/extconf.rb +3 -0
  73. data/sample/enum/sample_enum.cpp +3 -17
  74. data/sample/enum/test.rb +2 -2
  75. data/sample/inheritance/animals.cpp +8 -24
  76. data/sample/inheritance/extconf.rb +3 -0
  77. data/sample/inheritance/test.rb +1 -1
  78. data/sample/map/extconf.rb +3 -0
  79. data/sample/map/map.cpp +10 -18
  80. data/sample/map/test.rb +1 -1
  81. data/test/embed_ruby.cpp +18 -5
  82. data/test/ext/t1/extconf.rb +3 -0
  83. data/test/ext/t1/t1.cpp +1 -3
  84. data/test/ext/t2/extconf.rb +3 -0
  85. data/test/ext/t2/t2.cpp +1 -1
  86. data/test/extconf.rb +23 -0
  87. data/test/ruby/test_callbacks_sample.rb +28 -0
  88. data/test/ruby/test_multiple_extensions.rb +18 -0
  89. data/test/ruby/test_multiple_extensions_same_class.rb +14 -0
  90. data/test/ruby/test_multiple_extensions_with_inheritance.rb +20 -0
  91. data/test/test_Address_Registration_Guard.cpp +23 -10
  92. data/test/test_Array.cpp +129 -73
  93. data/test/test_Attribute.cpp +147 -0
  94. data/test/test_Builtin_Object.cpp +34 -14
  95. data/test/test_Class.cpp +149 -275
  96. data/test/test_Constructor.cpp +10 -9
  97. data/test/test_Data_Object.cpp +133 -192
  98. data/test/test_Data_Type.cpp +322 -252
  99. data/test/test_Director.cpp +54 -41
  100. data/test/test_Enum.cpp +228 -103
  101. data/test/test_Exception.cpp +5 -6
  102. data/test/test_Hash.cpp +31 -30
  103. data/test/test_Identifier.cpp +4 -5
  104. data/test/test_Inheritance.cpp +221 -0
  105. data/test/test_Iterator.cpp +161 -0
  106. data/test/test_Jump_Tag.cpp +1 -1
  107. data/test/test_Keep_Alive.cpp +161 -0
  108. data/test/test_Memory_Management.cpp +2 -4
  109. data/test/test_Module.cpp +167 -110
  110. data/test/test_Object.cpp +41 -21
  111. data/test/test_Ownership.cpp +275 -0
  112. data/test/test_Self.cpp +205 -0
  113. data/test/test_Stl_Optional.cpp +90 -0
  114. data/test/test_Stl_Pair.cpp +144 -0
  115. data/test/test_Stl_SmartPointer.cpp +200 -0
  116. data/test/test_Stl_String.cpp +74 -0
  117. data/test/test_Stl_Vector.cpp +652 -0
  118. data/test/test_String.cpp +1 -2
  119. data/test/test_Struct.cpp +29 -39
  120. data/test/test_Symbol.cpp +1 -2
  121. data/test/test_To_From_Ruby.cpp +249 -285
  122. data/test/test_global_functions.cpp +39 -19
  123. data/test/unittest.hpp +0 -4
  124. metadata +70 -141
  125. data/Doxyfile +0 -2268
  126. data/Makefile.am +0 -26
  127. data/Makefile.in +0 -931
  128. data/README.mingw +0 -8
  129. data/aclocal.m4 +0 -1085
  130. data/ax_cxx_compile_stdcxx.m4 +0 -951
  131. data/bootstrap +0 -8
  132. data/config.guess +0 -1421
  133. data/config.sub +0 -1807
  134. data/configure +0 -7792
  135. data/configure.ac +0 -55
  136. data/depcomp +0 -791
  137. data/doxygen.ac +0 -314
  138. data/doxygen.am +0 -186
  139. data/extconf.rb +0 -70
  140. data/install-sh +0 -501
  141. data/missing +0 -215
  142. data/post-autoconf.rb +0 -22
  143. data/post-automake.rb +0 -28
  144. data/rice/Address_Registration_Guard.cpp +0 -22
  145. data/rice/Arg_impl.hpp +0 -129
  146. data/rice/Arg_operators.cpp +0 -21
  147. data/rice/Arg_operators.hpp +0 -19
  148. data/rice/Array.hpp +0 -214
  149. data/rice/Array.ipp +0 -256
  150. data/rice/Builtin_Object.hpp +0 -8
  151. data/rice/Builtin_Object.ipp +0 -50
  152. data/rice/Builtin_Object_defn.hpp +0 -50
  153. data/rice/Class.cpp +0 -57
  154. data/rice/Class.hpp +0 -8
  155. data/rice/Class.ipp +0 -6
  156. data/rice/Class_defn.hpp +0 -84
  157. data/rice/Data_Type.cpp +0 -54
  158. data/rice/Data_Type_fwd.hpp +0 -12
  159. data/rice/Director.cpp +0 -13
  160. data/rice/Exception.cpp +0 -54
  161. data/rice/Exception_Base.hpp +0 -8
  162. data/rice/Exception_Base.ipp +0 -13
  163. data/rice/Exception_Base_defn.hpp +0 -27
  164. data/rice/Hash.hpp +0 -230
  165. data/rice/Hash.ipp +0 -329
  166. data/rice/Identifier.cpp +0 -8
  167. data/rice/Jump_Tag.hpp +0 -24
  168. data/rice/Makefile.am +0 -121
  169. data/rice/Makefile.in +0 -884
  170. data/rice/Module.cpp +0 -84
  171. data/rice/Module.hpp +0 -8
  172. data/rice/Module.ipp +0 -6
  173. data/rice/Module_defn.hpp +0 -88
  174. data/rice/Module_impl.hpp +0 -281
  175. data/rice/Module_impl.ipp +0 -345
  176. data/rice/Object.cpp +0 -169
  177. data/rice/Object.hpp +0 -8
  178. data/rice/Object.ipp +0 -33
  179. data/rice/Object_defn.hpp +0 -214
  180. data/rice/Require_Guard.hpp +0 -21
  181. data/rice/String.cpp +0 -89
  182. data/rice/String.hpp +0 -91
  183. data/rice/Struct.cpp +0 -117
  184. data/rice/Struct.hpp +0 -162
  185. data/rice/Struct.ipp +0 -26
  186. data/rice/Symbol.cpp +0 -25
  187. data/rice/Symbol.hpp +0 -66
  188. data/rice/Symbol.ipp +0 -44
  189. data/rice/config.hpp +0 -47
  190. data/rice/config.hpp.in +0 -46
  191. data/rice/detail/Arguments.hpp +0 -118
  192. data/rice/detail/Auto_Function_Wrapper.hpp +0 -898
  193. data/rice/detail/Auto_Function_Wrapper.ipp +0 -3181
  194. data/rice/detail/Auto_Member_Function_Wrapper.hpp +0 -897
  195. data/rice/detail/Auto_Member_Function_Wrapper.ipp +0 -2501
  196. data/rice/detail/Caster.hpp +0 -103
  197. data/rice/detail/Not_Copyable.hpp +0 -25
  198. data/rice/detail/Wrapped_Function.hpp +0 -33
  199. data/rice/detail/cfp.hpp +0 -24
  200. data/rice/detail/cfp.ipp +0 -51
  201. data/rice/detail/check_ruby_type.cpp +0 -27
  202. data/rice/detail/check_ruby_type.hpp +0 -23
  203. data/rice/detail/creation_funcs.hpp +0 -37
  204. data/rice/detail/creation_funcs.ipp +0 -36
  205. data/rice/detail/define_method_and_auto_wrap.hpp +0 -31
  206. data/rice/detail/define_method_and_auto_wrap.ipp +0 -30
  207. data/rice/detail/demangle.cpp +0 -56
  208. data/rice/detail/demangle.hpp +0 -19
  209. data/rice/detail/env.hpp +0 -11
  210. data/rice/detail/method_data.cpp +0 -92
  211. data/rice/detail/node.hpp +0 -13
  212. data/rice/detail/protect.cpp +0 -29
  213. data/rice/detail/protect.hpp +0 -34
  214. data/rice/detail/ruby_version_code.hpp +0 -6
  215. data/rice/detail/ruby_version_code.hpp.in +0 -6
  216. data/rice/detail/st.hpp +0 -22
  217. data/rice/detail/win32.hpp +0 -16
  218. data/rice/detail/wrap_function.hpp +0 -66
  219. data/rice/protect.hpp +0 -38
  220. data/rice/protect.ipp +0 -1134
  221. data/rice/rubypp.rb +0 -97
  222. data/rice/to_from_ruby.hpp +0 -8
  223. data/rice/to_from_ruby.ipp +0 -418
  224. data/rice/to_from_ruby_defn.hpp +0 -70
  225. data/ruby/Makefile.am +0 -1
  226. data/ruby/Makefile.in +0 -628
  227. data/ruby/lib/Makefile.am +0 -3
  228. data/ruby/lib/Makefile.in +0 -506
  229. data/ruby/lib/mkmf-rice.rb.in +0 -217
  230. data/ruby/lib/version.rb +0 -3
  231. data/ruby.ac +0 -135
  232. data/sample/Makefile.am +0 -53
  233. data/sample/Makefile.in +0 -495
  234. data/test/Makefile.am +0 -73
  235. data/test/Makefile.in +0 -1219
  236. data/test/ext/Makefile.am +0 -41
  237. data/test/ext/Makefile.in +0 -483
  238. data/test/test_rice.rb +0 -45
data/rice/ruby_mark.hpp CHANGED
@@ -5,9 +5,11 @@
5
5
  /*! This function can be specialized for a particular type to override
6
6
  * the default behavior (which is to not mark any additional objects).
7
7
  */
8
- template<typename T>
9
- void ruby_mark(T * /* obj */)
8
+ namespace Rice
10
9
  {
10
+ template<typename T>
11
+ void ruby_mark(T* data)
12
+ {
13
+ }
11
14
  }
12
-
13
15
  #endif // ruby_mark__hpp
@@ -1,11 +1,11 @@
1
1
  #ifndef Rice__ruby_try_catch__hpp_
2
2
  #define Rice__ruby_try_catch__hpp_
3
3
 
4
- #include "Exception_Base_defn.hpp"
5
- #include "Jump_Tag.hpp"
6
- #include "detail/ruby.hpp"
7
4
  #include <stdexcept>
8
5
 
6
+ #include "detail/Jump_Tag.hpp"
7
+ #include "Exception_defn.hpp"
8
+
9
9
  /*! \def RUBY_TRY
10
10
  * \brief Start a block to catch Ruby exceptions and rethrow them.
11
11
  */
@@ -41,7 +41,7 @@
41
41
  * \brief End a RUBY_TRY block.
42
42
  */
43
43
  #define RUBY_CATCH \
44
- catch(::Rice::Exception_Base const & ex) \
44
+ catch(::Rice::Exception const & ex) \
45
45
  { \
46
46
  RUBY_RETHROW(ex.value()); \
47
47
  } \
data/rice/stl.hpp ADDED
@@ -0,0 +1,11 @@
1
+ #ifndef Rice__stl__hpp_
2
+ #define Rice__stl__hpp_
3
+
4
+ #include "stl/string.hpp"
5
+ #include "stl/complex.hpp"
6
+ #include "stl/optional.hpp"
7
+ #include "stl/pair.hpp"
8
+ #include "stl/smart_ptr.hpp"
9
+ #include "stl/vector.hpp"
10
+
11
+ #endif // Rice__stl__hpp_
@@ -1,3 +1,6 @@
1
+ require 'bundler/setup'
2
+ require 'rice'
1
3
  require 'mkmf-rice'
4
+
2
5
  create_makefile('sample_callbacks')
3
6
 
@@ -1,24 +1,25 @@
1
- #include "rice/Data_Type.hpp"
2
- #include "rice/Constructor.hpp"
3
- #include "rice/String.hpp"
1
+ #include <rice/rice.hpp>
4
2
 
5
3
  using namespace Rice;
6
4
 
7
5
  namespace
8
6
  {
9
7
 
10
- class CallbackHolder {
8
+ class CallbackHolder
9
+ {
11
10
  public:
12
11
 
13
- void registerCallback(Rice::Object cb) {
14
- callback = cb;
12
+ void registerCallback(Rice::Object cb)
13
+ {
14
+ callback_ = cb;
15
15
  }
16
16
 
17
- Rice::Object fireCallback(Rice::String param) {
18
- return callback.call("call", param);
17
+ Rice::Object fireCallback(Rice::String param)
18
+ {
19
+ return callback_.call("call", param);
19
20
  }
20
21
 
21
- Rice::Object callback;
22
+ Rice::Object callback_;
22
23
  };
23
24
 
24
25
  } // namespace
@@ -26,13 +27,9 @@ namespace
26
27
  extern "C"
27
28
  void Init_sample_callbacks()
28
29
  {
29
- RUBY_TRY
30
- {
31
30
  define_class<CallbackHolder>("CallbackHolder")
32
31
  .define_constructor(Constructor<CallbackHolder>())
33
32
  .define_method("register_callback", &CallbackHolder::registerCallback)
34
33
  .define_method("fire_callback", &CallbackHolder::fireCallback);
35
- }
36
- RUBY_CATCH
37
34
  }
38
35
 
@@ -1,3 +1,6 @@
1
+ require 'bundler/setup'
2
+ require 'rice'
1
3
  require 'mkmf-rice'
4
+
2
5
  create_makefile('sample_enum')
3
6
 
@@ -1,5 +1,4 @@
1
- #include "rice/Enum.hpp"
2
- #include "rice/ruby_try_catch.hpp"
1
+ #include <rice/rice.hpp>
3
2
 
4
3
  using namespace Rice;
5
4
 
@@ -13,8 +12,6 @@ enum Sample_Enum
13
12
  SE_BAZ = 100,
14
13
  };
15
14
 
16
- Rice::Enum<Sample_Enum> sample_enum_type;
17
-
18
15
  char const * description(Sample_Enum e)
19
16
  {
20
17
  switch(e)
@@ -28,27 +25,16 @@ char const * description(Sample_Enum e)
28
25
 
29
26
  } // namespace
30
27
 
31
- template<>
32
- Sample_Enum from_ruby<Sample_Enum>(Object x)
33
- {
34
- Data_Object<Sample_Enum> d(x, sample_enum_type);
35
- return *d;
36
- }
37
-
38
28
  extern "C"
39
29
  void Init_sample_enum()
40
30
  {
41
- RUBY_TRY
42
- {
43
- sample_enum_type =
31
+ Rice::Enum<Sample_Enum> sample_enum_type =
44
32
  define_enum<Sample_Enum>("Sample_Enum")
45
33
  .define_value("FOO", SE_FOO)
46
34
  .define_value("BAR", SE_BAR)
47
35
  .define_value("BAZ", SE_BAZ);
48
-
36
+
49
37
  sample_enum_type
50
38
  .define_method("description", description);
51
- }
52
- RUBY_CATCH
53
39
  }
54
40
 
data/sample/enum/test.rb CHANGED
@@ -1,8 +1,8 @@
1
- require 'sample_enum'
1
+ require_relative 'sample_enum'
2
2
 
3
3
  Sample_Enum.each { |x| p x }
4
4
  s = Sample_Enum::FOO
5
5
  puts s
6
6
  puts s.inspect
7
7
  puts s < Sample_Enum::BAR
8
-
8
+ s.description
@@ -1,43 +1,31 @@
1
- #include "rice/Data_Type.hpp"
2
- #include "rice/Constructor.hpp"
1
+ #include <rice/rice.hpp>
3
2
 
4
3
  using namespace Rice;
5
4
 
6
5
  class Organism
7
6
  {
8
7
  public:
9
- virtual ~Organism() = 0;
8
+ virtual ~Organism() = default;
10
9
  virtual char const * name() = 0;
11
10
  };
12
11
 
13
- Organism::
14
- ~Organism()
15
- {
16
- }
17
-
18
12
  class Animal
19
13
  : public Organism
20
14
  {
21
15
  public:
22
- virtual ~Animal() = 0;
23
16
  virtual char const * speak() = 0;
24
17
  };
25
18
 
26
- Animal::
27
- ~Animal()
28
- {
29
- }
30
-
31
19
  class Bear
32
20
  : public Animal
33
21
  {
34
22
  public:
35
- virtual char const * name()
23
+ char const * name() override
36
24
  {
37
25
  return "Bear";
38
26
  }
39
27
 
40
- virtual char const * speak()
28
+ char const * speak() override
41
29
  {
42
30
  return "I'm smarter than the average bear";
43
31
  }
@@ -47,12 +35,12 @@ class Dog
47
35
  : public Animal
48
36
  {
49
37
  public:
50
- virtual char const * name()
38
+ char const * name() override
51
39
  {
52
40
  return "Dog";
53
41
  }
54
42
 
55
- virtual char const * speak()
43
+ char const * speak() override
56
44
  {
57
45
  return "Woof woof";
58
46
  }
@@ -62,12 +50,12 @@ class Rabbit
62
50
  : public Animal
63
51
  {
64
52
  public:
65
- virtual char const * name()
53
+ char const * name() override
66
54
  {
67
55
  return "Rabbit";
68
56
  }
69
57
 
70
- virtual char const * speak()
58
+ char const * speak() override
71
59
  {
72
60
  return "What's up, doc?";
73
61
  }
@@ -76,8 +64,6 @@ public:
76
64
  extern "C"
77
65
  void Init_animals(void)
78
66
  {
79
- RUBY_TRY
80
- {
81
67
  define_class<Organism>("Organism")
82
68
  .define_method("name", &Organism::name);
83
69
 
@@ -92,7 +78,5 @@ void Init_animals(void)
92
78
 
93
79
  define_class<Rabbit, Animal>("Rabbit")
94
80
  .define_constructor(Constructor<Rabbit>());
95
- }
96
- RUBY_CATCH
97
81
  }
98
82
 
@@ -1,3 +1,6 @@
1
+ require 'bundler/setup'
2
+ require 'rice'
1
3
  require 'mkmf-rice'
4
+
2
5
  create_makefile('animals')
3
6
 
@@ -1,4 +1,4 @@
1
- require 'animals'
1
+ require_relative 'animals'
2
2
 
3
3
  [ Bear, Dog, Rabbit].each do |klass|
4
4
  animal = klass.new
@@ -1,3 +1,6 @@
1
+ require 'bundler/setup'
2
+ require 'rice'
1
3
  require 'mkmf-rice'
4
+
2
5
  create_makefile('map')
3
6
 
data/sample/map/map.cpp CHANGED
@@ -1,5 +1,4 @@
1
- #include "rice/Data_Type.hpp"
2
- #include "rice/Constructor.hpp"
1
+ #include <rice/rice.hpp>
3
2
 
4
3
  #include <map>
5
4
 
@@ -45,37 +44,30 @@ private:
45
44
  Value_Map map_;
46
45
  };
47
46
 
48
- Data_Type<Map> rb_cMap;
49
-
50
47
  } // namespace
51
48
 
52
49
  template<>
53
- Object to_ruby<Map::value_type>(Map::value_type const & p)
50
+ struct detail::To_Ruby<Map::value_type>
54
51
  {
55
- return protect(rb_assoc_new, p.first, p.second);
56
- }
52
+ static VALUE convert(Map::value_type const & pair)
53
+ {
54
+ return detail::protect(rb_assoc_new, pair.first.value(), pair.second.value());
55
+ }
56
+ };
57
57
 
58
58
  #include <iostream>
59
59
  extern "C"
60
60
  void Init_map(void)
61
61
  {
62
- RUBY_TRY
63
- {
64
- Map::iterator (Map::*begin)() = &Map::begin;
65
- Map::iterator (Map::*end)() = &Map::end;
66
62
  Rice::Module rb_mStd = define_module("Std");
67
63
 
68
64
  // TODO: no delete method on the map, because I'm not sure how to
69
65
  // make delete work properly while iterating
70
- rb_cMap =
66
+ Data_Type<Map> rb_cMap =
71
67
  define_class_under<Map>(rb_mStd, "Map")
72
68
  .define_constructor(Constructor<Map>())
73
69
  .define_method("[]", &Map::bracket)
74
70
  .define_method("[]=", &Map::bracket_equals)
75
- .define_iterator(begin, end)
76
- .include_module(rb_mEnumerable)
77
- ;
78
- }
79
- RUBY_CATCH
71
+ .define_iterator(&Map::begin, &Map::end)
72
+ .include_module(rb_mEnumerable);
80
73
  }
81
-
data/sample/map/test.rb CHANGED
@@ -1,4 +1,4 @@
1
- require 'map'
1
+ require_relative 'map.so'
2
2
  m = Std::Map.new
3
3
  m[0] = 1
4
4
  m[1] = 2
data/test/embed_ruby.cpp CHANGED
@@ -1,4 +1,5 @@
1
- #include <ruby.h>
1
+ #include <rice/rice.hpp>
2
+ #include <ruby/version.h>
2
3
 
3
4
  void embed_ruby()
4
5
  {
@@ -7,15 +8,27 @@ void embed_ruby()
7
8
  if (!initialized__)
8
9
  {
9
10
  int argc = 0;
10
- char* argv = (char*)malloc(1);
11
- argv[0] = 0;
11
+ char* argv = nullptr;
12
12
  char** pArgv = &argv;
13
13
 
14
14
  ruby_sysinit(&argc, &pArgv);
15
- RUBY_INIT_STACK;
16
15
  ruby_init();
17
16
  ruby_init_loadpath();
18
17
 
19
18
  initialized__ = true;
19
+
20
+ // Because Ruby 3 no longer initializes the GC module when embedding, calling GC.stress
21
+ // results in a crash.
22
+ // See https://bugs.ruby-lang.org/issues/17643
23
+ if (RUBY_API_VERSION_MAJOR == 3 &&
24
+ RUBY_API_VERSION_MINOR == 0 &&
25
+ RUBY_API_VERSION_TEENY == 0)
26
+ {
27
+ // do nothing
28
+ }
29
+ else
30
+ {
31
+ rb_eval_string("GC.stress = true");
32
+ }
20
33
  }
21
- }
34
+ }
@@ -1,2 +1,5 @@
1
+ require 'bundler/setup'
2
+ require 'rice'
1
3
  require 'mkmf-rice'
4
+
2
5
  create_makefile('t1')
data/test/ext/t1/t1.cpp CHANGED
@@ -1,7 +1,5 @@
1
1
  #include "Foo.hpp"
2
-
3
- #include "rice/Data_Type.hpp"
4
- #include "rice/Constructor.hpp"
2
+ #include <rice/rice.hpp>
5
3
 
6
4
  using namespace Rice;
7
5
 
@@ -1,2 +1,5 @@
1
+ require 'bundler/setup'
2
+ require 'rice'
1
3
  require 'mkmf-rice'
4
+
2
5
  create_makefile('t2')
data/test/ext/t2/t2.cpp CHANGED
@@ -1,5 +1,5 @@
1
1
  #include "../t1/Foo.hpp"
2
- #include "rice/Data_Type.hpp"
2
+ #include <rice/rice.hpp>
3
3
 
4
4
  using namespace Rice;
5
5
 
data/test/extconf.rb ADDED
@@ -0,0 +1,23 @@
1
+ require 'bundler/setup'
2
+ require 'rice'
3
+ require 'mkmf-rice'
4
+ require 'rbconfig'
5
+
6
+ # Totally hack mkmf to make a unittest executable instead of a shared library
7
+ target_exe = "unittest#{RbConfig::CONFIG['EXEEXT']}"
8
+ $cleanfiles << target_exe
9
+
10
+ create_makefile(target_exe) do |conf|
11
+ conf << "\n"
12
+ conf << "#{target_exe}: $(OBJS)"
13
+ conf << "\t$(ECHO) linking executable unittest"
14
+ conf << "\t-$(Q)$(RM) $(@)"
15
+
16
+ if IS_MSWIN
17
+ conf << "\t$(Q) $(CXX) -Fe$(@) $(OBJS) $(LIBS) $(LOCAL_LIBS) -link $(ldflags) $(LIBPATH)"
18
+ else
19
+ conf << "\t$(Q) $(CXX) -o $@ $(OBJS) $(LIBPATH) $(LOCAL_LIBS) $(LIBS)"
20
+ end
21
+
22
+ conf << "\n"
23
+ end
@@ -0,0 +1,28 @@
1
+ $: << File.join(File.dirname(__FILE__), '..', 'sample')
2
+
3
+ require 'rubygems'
4
+ gem 'minitest'
5
+ require 'minitest/autorun'
6
+ require_relative '../../sample/callbacks/sample_callbacks'
7
+
8
+ class CallbacksTest < Minitest::Test
9
+ def test_callbacks_sample_lambda
10
+ cb = CallbackHolder.new
11
+ cb.register_callback(lambda do |param|
12
+ "Callback got: #{param}"
13
+ end)
14
+
15
+ assert_equal "Callback got: Hello", cb.fire_callback("Hello")
16
+ end
17
+
18
+ def hello_world(param)
19
+ "Method got: #{param}"
20
+ end
21
+
22
+ def test_callbacks_sample_method
23
+ cb = CallbackHolder.new
24
+ cb.register_callback method(:hello_world)
25
+
26
+ assert_equal "Method got: Hello", cb.fire_callback("Hello")
27
+ end
28
+ end
@@ -0,0 +1,18 @@
1
+ $: << File.join(__dir__, '..', '..', 'sample')
2
+
3
+ require 'minitest'
4
+ require 'minitest/autorun'
5
+
6
+ class MultipleExtensionTest < Minitest::Test
7
+ def test_multiple_extensions
8
+ # Rinse
9
+ require 'map/map'
10
+ m = Std::Map.new
11
+ m[0] = 1
12
+
13
+ # And repeat
14
+ require 'enum/sample_enum'
15
+ m = Std::Map.new
16
+ m[0] = 1
17
+ end
18
+ end
@@ -0,0 +1,14 @@
1
+ $: << File.join(__dir__, '..', 'ext')
2
+
3
+ require 'minitest'
4
+ require 'minitest/autorun'
5
+
6
+ class MultipleExtensionsSameClassTest < Minitest::Test
7
+ def test_multiple_extensions_same_class
8
+ require 't1/t1'
9
+ require 't2/t2'
10
+
11
+ foo = Foo.new
12
+ assert_equal 42, foo.foo
13
+ end
14
+ end
@@ -0,0 +1,20 @@
1
+ $: << File.join(__dir__, '..', '..', 'sample')
2
+ # Load a library that uses inheritance
3
+ require 'inheritance/animals'
4
+
5
+ # Then load a different library
6
+ require 'enum/sample_enum'
7
+
8
+ require 'minitest'
9
+ require 'minitest/autorun'
10
+
11
+ class MultipleExtensionTest < Minitest::Test
12
+ def test_multiple_extensions_with_inheritance
13
+
14
+ # And make sure we can call methods in the base class on a derived
15
+ # instance
16
+ dog = Dog.new
17
+ assert_equal dog.name, "Dog"
18
+ assert_equal dog.speak, "Woof woof"
19
+ end
20
+ end
@@ -1,6 +1,6 @@
1
1
  #include "unittest.hpp"
2
2
  #include "embed_ruby.hpp"
3
- #include "rice/Address_Registration_Guard.hpp"
3
+ #include <rice/rice.hpp>
4
4
 
5
5
  using namespace Rice;
6
6
 
@@ -30,15 +30,28 @@ TESTCASE(get_address)
30
30
  ASSERT_EQUAL(&v, g.address());
31
31
  }
32
32
 
33
- TESTCASE(swap)
33
+ TESTCASE(move_construct)
34
34
  {
35
- VALUE v = Qnil;
36
- VALUE v2 = Qnil;
37
- Address_Registration_Guard g(&v);
38
- Address_Registration_Guard g2(&v2);
39
- g.swap(g2);
40
- ASSERT_EQUAL(&v, g2.address());
41
- ASSERT_EQUAL(&v2, g.address());
42
- // TODO: ensure addresses are still registered
35
+ VALUE value = detail::to_ruby("Value 1");
36
+
37
+ Address_Registration_Guard guard1(&value);
38
+ Address_Registration_Guard guard2(std::move(guard1));
39
+
40
+ ASSERT((guard1.address() == nullptr));
41
+ ASSERT_EQUAL(&value, guard2.address());
42
+ }
43
+
44
+ TESTCASE(move_assign)
45
+ {
46
+ VALUE value1 = detail::to_ruby("Value 1");
47
+ VALUE value2 = detail::to_ruby("Value 2");
48
+
49
+ Address_Registration_Guard guard1(&value1);
50
+ Address_Registration_Guard guard2(&value2);
51
+
52
+ guard2 = std::move(guard1);
53
+
54
+ ASSERT((guard1.address() == nullptr));
55
+ ASSERT_EQUAL(&value1, guard2.address());
43
56
  }
44
57