rice 4.0.4 → 4.1.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 (94) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +30 -0
  3. data/Rakefile +1 -1
  4. data/include/rice/rice.hpp +2596 -1771
  5. data/include/rice/stl.hpp +1580 -271
  6. data/lib/mkmf-rice.rb +5 -2
  7. data/lib/version.rb +1 -1
  8. data/rice/Arg.hpp +6 -6
  9. data/rice/Arg.ipp +8 -9
  10. data/rice/Constructor.hpp +2 -2
  11. data/rice/Data_Object.ipp +69 -15
  12. data/rice/Data_Object_defn.hpp +1 -15
  13. data/rice/Data_Type.ipp +56 -86
  14. data/rice/Data_Type_defn.hpp +14 -17
  15. data/rice/Director.hpp +0 -1
  16. data/rice/Enum.ipp +31 -22
  17. data/rice/Exception.ipp +2 -3
  18. data/rice/Exception_defn.hpp +5 -5
  19. data/rice/HandlerRegistration.hpp +15 -0
  20. data/rice/Return.hpp +5 -4
  21. data/rice/Return.ipp +8 -3
  22. data/rice/detail/ExceptionHandler.hpp +8 -0
  23. data/rice/detail/ExceptionHandler.ipp +28 -0
  24. data/rice/detail/{Exception_Handler_defn.hpp → ExceptionHandler_defn.hpp} +17 -21
  25. data/rice/detail/HandlerRegistry.hpp +51 -0
  26. data/rice/detail/HandlerRegistry.ipp +20 -0
  27. data/rice/detail/InstanceRegistry.hpp +34 -0
  28. data/rice/detail/InstanceRegistry.ipp +50 -0
  29. data/rice/detail/MethodInfo.ipp +1 -1
  30. data/rice/detail/NativeAttribute.hpp +26 -15
  31. data/rice/detail/NativeAttribute.ipp +76 -47
  32. data/rice/detail/NativeFunction.hpp +60 -13
  33. data/rice/detail/NativeFunction.ipp +103 -85
  34. data/rice/detail/NativeIterator.hpp +49 -0
  35. data/rice/detail/NativeIterator.ipp +102 -0
  36. data/rice/detail/NativeRegistry.hpp +31 -0
  37. data/rice/detail/{method_data.ipp → NativeRegistry.ipp} +20 -16
  38. data/rice/detail/Registries.hpp +26 -0
  39. data/rice/detail/Registries.ipp +23 -0
  40. data/rice/detail/RubyFunction.hpp +6 -11
  41. data/rice/detail/RubyFunction.ipp +10 -22
  42. data/rice/detail/Type.hpp +1 -1
  43. data/rice/detail/Type.ipp +2 -2
  44. data/rice/detail/TypeRegistry.hpp +8 -11
  45. data/rice/detail/TypeRegistry.ipp +3 -28
  46. data/rice/detail/Wrapper.hpp +0 -2
  47. data/rice/detail/Wrapper.ipp +73 -23
  48. data/rice/detail/cpp_protect.hpp +93 -0
  49. data/rice/detail/default_allocation_func.ipp +1 -1
  50. data/rice/detail/from_ruby.ipp +206 -2
  51. data/rice/detail/to_ruby.ipp +39 -5
  52. data/rice/detail/to_ruby_defn.hpp +1 -1
  53. data/rice/forward_declares.ipp +6 -0
  54. data/rice/global_function.hpp +0 -4
  55. data/rice/global_function.ipp +0 -6
  56. data/rice/rice.hpp +29 -24
  57. data/rice/stl.hpp +6 -1
  58. data/test/embed_ruby.cpp +0 -15
  59. data/test/test_Array.cpp +20 -24
  60. data/test/test_Class.cpp +8 -47
  61. data/test/test_Constructor.cpp +0 -2
  62. data/test/test_Data_Object.cpp +25 -11
  63. data/test/test_Data_Type.cpp +124 -28
  64. data/test/test_Director.cpp +12 -13
  65. data/test/test_Enum.cpp +65 -26
  66. data/test/test_Inheritance.cpp +9 -9
  67. data/test/test_Iterator.cpp +134 -5
  68. data/test/test_Keep_Alive.cpp +7 -7
  69. data/test/test_Memory_Management.cpp +1 -1
  70. data/test/test_Module.cpp +25 -62
  71. data/test/test_Object.cpp +66 -3
  72. data/test/test_Ownership.cpp +12 -13
  73. data/test/test_Self.cpp +12 -13
  74. data/test/test_Stl_Map.cpp +696 -0
  75. data/test/test_Stl_Optional.cpp +3 -3
  76. data/test/test_Stl_Pair.cpp +38 -2
  77. data/test/test_Stl_Reference_Wrapper.cpp +102 -0
  78. data/test/test_Stl_SmartPointer.cpp +5 -5
  79. data/test/test_Stl_Unordered_Map.cpp +697 -0
  80. data/test/test_Stl_Variant.cpp +301 -0
  81. data/test/test_Stl_Vector.cpp +200 -41
  82. data/test/test_Struct.cpp +3 -3
  83. data/test/test_To_From_Ruby.cpp +6 -0
  84. data/test/test_Tracking.cpp +239 -0
  85. data/test/unittest.hpp +13 -4
  86. metadata +23 -13
  87. data/rice/detail/Exception_Handler.hpp +0 -8
  88. data/rice/detail/Exception_Handler.ipp +0 -28
  89. data/rice/detail/Iterator.hpp +0 -23
  90. data/rice/detail/Iterator.ipp +0 -47
  91. data/rice/detail/function_traits.hpp +0 -124
  92. data/rice/detail/method_data.hpp +0 -29
  93. data/rice/detail/rice_traits.hpp +0 -116
  94. data/rice/ruby_try_catch.hpp +0 -86
data/test/test_Object.cpp CHANGED
@@ -172,9 +172,72 @@ TESTCASE(call_return_rice_object)
172
172
  ASSERT_EQUAL(Object(detail::to_ruby(3)), three);
173
173
  }
174
174
 
175
- /*TESTCASE(test_mark)
175
+ TESTCASE(call_with_keywords)
176
+ {
177
+ Module kernel = Module("Kernel");
178
+
179
+
180
+ Hash keywords;
181
+ keywords[":exception"] = false;
182
+ Object result = kernel.call("Integer", "charlie", keywords);
183
+ ASSERT_EQUAL(Qnil, result.value());
184
+
185
+ keywords[":exception"] = true;
186
+
187
+ ASSERT_EXCEPTION_CHECK(
188
+ Exception,
189
+ kernel.call("Integer", "charlie", keywords),
190
+ ASSERT_EQUAL("invalid value for Integer(): \"charlie\"", ex.what())
191
+ );
192
+ }
193
+
194
+ TESTCASE(const_set_get_by_id)
195
+ {
196
+ Class c(anonymous_class());
197
+ Object v1 = detail::to_ruby(42);
198
+ Object v2 = c.const_set(rb_intern("FOO"), v1);
199
+ ASSERT_EQUAL(v1, v2);
200
+ ASSERT_EQUAL(v1, c.const_get(rb_intern("FOO")));
201
+ }
202
+
203
+ TESTCASE(const_set_get_by_identifier)
204
+ {
205
+ Class c(anonymous_class());
206
+ Object v1 = detail::to_ruby(42);
207
+ Object v2 = c.const_set(Identifier("FOO"), v1);
208
+ ASSERT_EQUAL(v1, v2);
209
+ ASSERT_EQUAL(v1, c.const_get(Identifier("FOO")));
210
+ }
211
+
212
+ TESTCASE(const_set_get_by_string)
213
+ {
214
+ Class c(anonymous_class());
215
+ Object v1 = detail::to_ruby(42);
216
+ Object v2 = c.const_set("FOO", v1);
217
+ ASSERT_EQUAL(v1, v2);
218
+ ASSERT_EQUAL(v1, c.const_get("FOO"));
219
+ }
220
+
221
+ TESTCASE(remove_const)
222
+ {
223
+ Module m(anonymous_module());
224
+ Object v = detail::to_ruby(42);
225
+ m.const_set("FOO", v);
226
+ ASSERT_EQUAL(v, m.const_get("FOO"));
227
+ m.remove_const("FOO");
228
+ ASSERT_EXCEPTION_CHECK(
229
+ Exception,
230
+ m.const_get("FOO"),
231
+ ASSERT_EQUAL(
232
+ Object(rb_eNameError),
233
+ Object(CLASS_OF(ex.value()))
234
+ )
235
+ );
236
+ }
237
+
238
+ TESTCASE(test_mark)
176
239
  {
177
240
  Object o(INT2NUM(42));
178
241
  rb_gc_start();
179
- ASSERT_EQUAL(42, detail::From_Ruby<int>::convert(o.value()));
180
- }*/
242
+ ASSERT_EQUAL(42, detail::From_Ruby<int>().convert(o.value()));
243
+ }
@@ -13,11 +13,11 @@ namespace
13
13
  class MyClass
14
14
  {
15
15
  public:
16
- static inline uint32_t constructorCalls = 0;
17
- static inline uint32_t copyConstructorCalls = 0;
18
- static inline uint32_t moveConstructorCalls = 0;
19
- static inline uint32_t destructorCalls = 0;
20
- static inline uint32_t methodCalls = 0;
16
+ static inline int constructorCalls = 0;
17
+ static inline int copyConstructorCalls = 0;
18
+ static inline int moveConstructorCalls = 0;
19
+ static inline int destructorCalls = 0;
20
+ static inline int methodCalls = 0;
21
21
 
22
22
  static void reset()
23
23
  {
@@ -145,7 +145,7 @@ TESTCASE(TransferPointer)
145
145
  my_class = nil
146
146
  end)";
147
147
 
148
- m.instance_eval(code);
148
+ m.module_eval(code);
149
149
  rb_gc_start();
150
150
 
151
151
  ASSERT_EQUAL(10, MyClass::constructorCalls);
@@ -169,7 +169,7 @@ TESTCASE(KeepPointer)
169
169
  my_class.set_flag(i)
170
170
  end)";
171
171
 
172
- m.instance_eval(code);
172
+ m.module_eval(code);
173
173
  rb_gc_start();
174
174
 
175
175
  ASSERT_EQUAL(1, MyClass::constructorCalls);
@@ -193,7 +193,7 @@ TESTCASE(KeepReference)
193
193
  my_class.set_flag(i)
194
194
  end)";
195
195
 
196
- m.instance_eval(code);
196
+ m.module_eval(code);
197
197
  rb_gc_start();
198
198
 
199
199
  ASSERT_EQUAL(1, MyClass::constructorCalls);
@@ -217,7 +217,7 @@ TESTCASE(CopyReference)
217
217
  my_class.set_flag(i)
218
218
  end)";
219
219
 
220
- m.instance_eval(code);
220
+ m.module_eval(code);
221
221
  rb_gc_start();
222
222
 
223
223
  ASSERT_EQUAL(1, MyClass::constructorCalls);
@@ -227,7 +227,7 @@ TESTCASE(CopyReference)
227
227
  ASSERT_EQUAL(0, Factory::instance_->flag);
228
228
  }
229
229
 
230
- /*TESTCASE(TransferValue)
230
+ TESTCASE(TransferValue)
231
231
  {
232
232
  Factory::reset();
233
233
  MyClass::reset();
@@ -240,7 +240,7 @@ TESTCASE(CopyReference)
240
240
  my_class.set_flag(i)
241
241
  end)";
242
242
 
243
- m.instance_eval(code);
243
+ m.module_eval(code);
244
244
  rb_gc_start();
245
245
 
246
246
  ASSERT_EQUAL(10, MyClass::constructorCalls);
@@ -263,7 +263,7 @@ TESTCASE(MoveValue)
263
263
  my_class.set_flag(i)
264
264
  end)";
265
265
 
266
- m.instance_eval(code);
266
+ m.module_eval(code);
267
267
  rb_gc_start();
268
268
 
269
269
  ASSERT_EQUAL(10, MyClass::constructorCalls);
@@ -272,4 +272,3 @@ TESTCASE(MoveValue)
272
272
  ASSERT_EQUAL(30, MyClass::destructorCalls);
273
273
  ASSERT(!Factory::instance_);
274
274
  }
275
- */
data/test/test_Self.cpp CHANGED
@@ -13,11 +13,11 @@ namespace
13
13
  class SelfClass
14
14
  {
15
15
  public:
16
- static inline uint32_t constructorCalls = 0;
17
- static inline uint32_t copyConstructorCalls = 0;
18
- static inline uint32_t moveConstructorCalls = 0;
19
- static inline uint32_t destructorCalls = 0;
20
- static inline uint32_t methodCalls = 0;
16
+ static inline int constructorCalls = 0;
17
+ static inline int copyConstructorCalls = 0;
18
+ static inline int moveConstructorCalls = 0;
19
+ static inline int destructorCalls = 0;
20
+ static inline int methodCalls = 0;
21
21
 
22
22
  static void reset()
23
23
  {
@@ -94,7 +94,7 @@ TESTCASE(SelfPointer)
94
94
  SelfClass::reset();
95
95
 
96
96
  Module m = define_module("TestingModule");
97
- Object selfClass1 = m.instance_eval("SelfClass.new");
97
+ Object selfClass1 = m.module_eval("SelfClass.new");
98
98
  Object selfClass2 = selfClass1.call("self_pointer");
99
99
  ASSERT(selfClass2.is_equal(selfClass1));
100
100
 
@@ -113,7 +113,7 @@ TESTCASE(SelfReference)
113
113
  SelfClass::reset();
114
114
 
115
115
  Module m = define_module("TestingModule");
116
- Object selfClass1 = m.instance_eval("SelfClass.new");
116
+ Object selfClass1 = m.module_eval("SelfClass.new");
117
117
  Object selfClass2 = selfClass1.call("self_reference");
118
118
  ASSERT(selfClass2.is_equal(selfClass1));
119
119
 
@@ -132,7 +132,7 @@ TESTCASE(SelfValue)
132
132
  SelfClass::reset();
133
133
 
134
134
  Module m = define_module("TestingModule");
135
- Object selfClass1 = m.instance_eval("SelfClass.new");
135
+ Object selfClass1 = m.module_eval("SelfClass.new");
136
136
  Object selfClass2 = selfClass1.call("self_value");
137
137
  ASSERT(!selfClass2.is_equal(selfClass1));
138
138
 
@@ -151,7 +151,7 @@ TESTCASE(SelfPointerLambda)
151
151
  SelfClass::reset();
152
152
 
153
153
  Module m = define_module("TestingModule");
154
- Object selfClass1 = m.instance_eval("SelfClass.new");
154
+ Object selfClass1 = m.module_eval("SelfClass.new");
155
155
  Object selfClass2 = selfClass1.call("self_pointer_lambda");
156
156
  ASSERT(selfClass2.is_equal(selfClass1));
157
157
 
@@ -162,8 +162,7 @@ TESTCASE(SelfPointerLambda)
162
162
  ASSERT_EQUAL(1, SelfClass::constructorCalls);
163
163
  ASSERT_EQUAL(0, SelfClass::copyConstructorCalls);
164
164
  ASSERT_EQUAL(0, SelfClass::moveConstructorCalls);
165
- // TODO: re-enable this. It fails regularly on Ubuntu + Ruby 2.7, and nothing else.
166
- // ASSERT_EQUAL(0, SelfClass::destructorCalls);
165
+ ASSERT_EQUAL(0, SelfClass::destructorCalls);
167
166
  }
168
167
 
169
168
  TESTCASE(SelfReferenceLambda)
@@ -171,7 +170,7 @@ TESTCASE(SelfReferenceLambda)
171
170
  SelfClass::reset();
172
171
 
173
172
  Module m = define_module("TestingModule");
174
- Object selfClass1 = m.instance_eval("SelfClass.new");
173
+ Object selfClass1 = m.module_eval("SelfClass.new");
175
174
  Object selfClass2 = selfClass1.call("self_reference_lambda");
176
175
  ASSERT(selfClass2.is_equal(selfClass1));
177
176
 
@@ -190,7 +189,7 @@ TESTCASE(SelfValueLambda)
190
189
  SelfClass::reset();
191
190
 
192
191
  Module m = define_module("TestingModule");
193
- Object selfClass1 = m.instance_eval("SelfClass.new");
192
+ Object selfClass1 = m.module_eval("SelfClass.new");
194
193
  Object selfClass2 = selfClass1.call("self_value_lambda");
195
194
  ASSERT(!selfClass2.is_equal(selfClass1));
196
195