rice 4.0.4 → 4.1.0

Sign up to get free protection for your applications and to get access to all the features.
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