rice 4.3.2 → 4.5.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +66 -25
- data/README.md +7 -2
- data/Rakefile +7 -1
- data/include/rice/rice.hpp +7321 -4470
- data/include/rice/stl.hpp +769 -222
- data/lib/mkmf-rice.rb +37 -95
- data/rice/Address_Registration_Guard.hpp +72 -3
- data/rice/Arg.hpp +19 -5
- data/rice/Arg.ipp +24 -0
- data/rice/Callback.hpp +21 -0
- data/rice/Callback.ipp +13 -0
- data/rice/Constructor.hpp +4 -27
- data/rice/Constructor.ipp +79 -0
- data/rice/Data_Object.hpp +74 -3
- data/rice/Data_Object.ipp +324 -32
- data/rice/Data_Type.hpp +215 -3
- data/rice/Data_Type.ipp +125 -64
- data/rice/Director.hpp +0 -2
- data/rice/Enum.hpp +4 -6
- data/rice/Enum.ipp +101 -57
- data/rice/Exception.hpp +62 -2
- data/rice/Exception.ipp +7 -12
- data/rice/JumpException.hpp +44 -0
- data/rice/JumpException.ipp +48 -0
- data/rice/MemoryView.hpp +11 -0
- data/rice/MemoryView.ipp +43 -0
- data/rice/Return.hpp +6 -26
- data/rice/Return.ipp +10 -16
- data/rice/detail/DefaultHandler.hpp +12 -0
- data/rice/detail/DefaultHandler.ipp +8 -0
- data/rice/detail/HandlerRegistry.hpp +5 -35
- data/rice/detail/HandlerRegistry.ipp +7 -11
- data/rice/detail/InstanceRegistry.hpp +1 -4
- data/rice/detail/MethodInfo.hpp +15 -5
- data/rice/detail/MethodInfo.ipp +78 -6
- data/rice/detail/Native.hpp +32 -0
- data/rice/detail/Native.ipp +129 -0
- data/rice/detail/NativeAttributeGet.hpp +51 -0
- data/rice/detail/NativeAttributeGet.ipp +51 -0
- data/rice/detail/NativeAttributeSet.hpp +43 -0
- data/rice/detail/NativeAttributeSet.ipp +82 -0
- data/rice/detail/NativeCallbackFFI.hpp +55 -0
- data/rice/detail/NativeCallbackFFI.ipp +151 -0
- data/rice/detail/NativeCallbackSimple.hpp +30 -0
- data/rice/detail/NativeCallbackSimple.ipp +29 -0
- data/rice/detail/NativeFunction.hpp +20 -21
- data/rice/detail/NativeFunction.ipp +199 -64
- data/rice/detail/NativeIterator.hpp +8 -11
- data/rice/detail/NativeIterator.ipp +27 -31
- data/rice/detail/NativeRegistry.hpp +24 -17
- data/rice/detail/NativeRegistry.ipp +23 -56
- data/rice/detail/Proc.hpp +4 -0
- data/rice/detail/Proc.ipp +85 -0
- data/rice/detail/Registries.hpp +0 -7
- data/rice/detail/Registries.ipp +0 -18
- data/rice/detail/RubyFunction.hpp +0 -3
- data/rice/detail/RubyFunction.ipp +4 -8
- data/rice/detail/RubyType.hpp +19 -0
- data/rice/detail/RubyType.ipp +187 -0
- data/rice/detail/TupleIterator.hpp +14 -0
- data/rice/detail/Type.hpp +5 -6
- data/rice/detail/Type.ipp +150 -33
- data/rice/detail/TypeRegistry.hpp +15 -7
- data/rice/detail/TypeRegistry.ipp +105 -12
- data/rice/detail/Wrapper.hpp +6 -5
- data/rice/detail/Wrapper.ipp +45 -23
- data/rice/detail/cpp_protect.hpp +5 -6
- data/rice/detail/default_allocation_func.ipp +0 -2
- data/rice/detail/from_ruby.hpp +37 -3
- data/rice/detail/from_ruby.ipp +911 -454
- data/rice/detail/ruby.hpp +18 -0
- data/rice/detail/to_ruby.hpp +41 -3
- data/rice/detail/to_ruby.ipp +437 -113
- data/rice/global_function.hpp +0 -4
- data/rice/global_function.ipp +1 -2
- data/rice/rice.hpp +105 -22
- data/rice/ruby_mark.hpp +4 -3
- data/rice/stl.hpp +4 -0
- data/test/embed_ruby.cpp +4 -1
- data/test/extconf.rb +2 -0
- data/test/ruby/test_multiple_extensions_same_class.rb +14 -14
- data/test/test_Address_Registration_Guard.cpp +5 -0
- data/test/test_Array.cpp +12 -1
- data/test/test_Attribute.cpp +103 -21
- data/test/test_Builtin_Object.cpp +5 -0
- data/test/test_Callback.cpp +231 -0
- data/test/test_Class.cpp +5 -31
- data/test/test_Constructor.cpp +69 -6
- data/test/test_Data_Object.cpp +9 -4
- data/test/test_Data_Type.cpp +428 -64
- data/test/test_Director.cpp +10 -5
- data/test/test_Enum.cpp +152 -40
- data/test/test_Exception.cpp +235 -0
- data/test/test_File.cpp +70 -0
- data/test/test_From_Ruby.cpp +542 -0
- data/test/test_Hash.cpp +5 -0
- data/test/test_Identifier.cpp +5 -0
- data/test/test_Inheritance.cpp +6 -1
- data/test/test_Iterator.cpp +5 -0
- data/test/test_JumpException.cpp +22 -0
- data/test/test_Keep_Alive.cpp +6 -1
- data/test/test_Keep_Alive_No_Wrapper.cpp +5 -0
- data/test/test_Memory_Management.cpp +5 -0
- data/test/test_Module.cpp +118 -64
- data/test/test_Native_Registry.cpp +2 -33
- data/test/test_Object.cpp +5 -0
- data/test/test_Overloads.cpp +631 -0
- data/test/test_Ownership.cpp +67 -4
- data/test/test_Proc.cpp +45 -0
- data/test/test_Self.cpp +5 -0
- data/test/test_Stl_Exception.cpp +109 -0
- data/test/test_Stl_Map.cpp +22 -8
- data/test/test_Stl_Optional.cpp +5 -0
- data/test/test_Stl_Pair.cpp +7 -2
- data/test/test_Stl_Reference_Wrapper.cpp +5 -0
- data/test/test_Stl_SmartPointer.cpp +210 -5
- data/test/test_Stl_String.cpp +5 -0
- data/test/test_Stl_String_View.cpp +5 -0
- data/test/test_Stl_Type.cpp +147 -0
- data/test/test_Stl_Unordered_Map.cpp +18 -7
- data/test/test_Stl_Variant.cpp +5 -0
- data/test/test_Stl_Vector.cpp +130 -8
- data/test/test_String.cpp +5 -0
- data/test/test_Struct.cpp +5 -0
- data/test/test_Symbol.cpp +5 -0
- data/test/test_Template.cpp +192 -0
- data/test/test_To_Ruby.cpp +152 -0
- data/test/test_Tracking.cpp +1 -0
- data/test/test_Type.cpp +100 -0
- data/test/test_global_functions.cpp +53 -6
- data/test/unittest.cpp +8 -0
- metadata +37 -20
- data/lib/version.rb +0 -3
- data/rice/Address_Registration_Guard_defn.hpp +0 -79
- data/rice/Data_Object_defn.hpp +0 -84
- data/rice/Data_Type_defn.hpp +0 -190
- data/rice/Exception_defn.hpp +0 -68
- data/rice/HandlerRegistration.hpp +0 -15
- data/rice/Identifier.hpp +0 -50
- data/rice/Identifier.ipp +0 -29
- data/rice/detail/ExceptionHandler.hpp +0 -8
- data/rice/detail/ExceptionHandler.ipp +0 -28
- data/rice/detail/ExceptionHandler_defn.hpp +0 -77
- data/rice/detail/Jump_Tag.hpp +0 -21
- data/rice/detail/NativeAttribute.hpp +0 -64
- data/rice/detail/NativeAttribute.ipp +0 -112
- data/rice/detail/from_ruby_defn.hpp +0 -38
- data/rice/detail/to_ruby_defn.hpp +0 -48
- data/test/test_Jump_Tag.cpp +0 -17
- data/test/test_To_From_Ruby.cpp +0 -399
data/rice/global_function.hpp
CHANGED
@@ -1,8 +1,6 @@
|
|
1
1
|
#ifndef Rice__global_function__hpp_
|
2
2
|
#define Rice__global_function__hpp_
|
3
3
|
|
4
|
-
#include "Arg.hpp"
|
5
|
-
|
6
4
|
namespace Rice
|
7
5
|
{
|
8
6
|
//! Define an global function
|
@@ -20,6 +18,4 @@ namespace Rice
|
|
20
18
|
void define_global_function(char const * name, Function_T&& func, Arg_Ts const& ...args);
|
21
19
|
} // Rice
|
22
20
|
|
23
|
-
#include "global_function.ipp"
|
24
|
-
|
25
21
|
#endif // Rice__global_function__hpp_
|
data/rice/global_function.ipp
CHANGED
@@ -1,7 +1,6 @@
|
|
1
|
-
#include "cpp_api/Module.hpp"
|
2
1
|
|
3
2
|
template<typename Function_T, typename...Arg_Ts>
|
4
3
|
void Rice::define_global_function(char const * name, Function_T&& func, Arg_Ts const& ...args)
|
5
4
|
{
|
6
|
-
|
5
|
+
Module(rb_mKernel).define_module_function(name, std::forward<Function_T>(func), args...);
|
7
6
|
}
|
data/rice/rice.hpp
CHANGED
@@ -1,64 +1,147 @@
|
|
1
1
|
#ifndef Rice__hpp_
|
2
2
|
#define Rice__hpp_
|
3
3
|
|
4
|
-
//
|
4
|
+
// Ruby
|
5
5
|
#include "detail/ruby.hpp"
|
6
|
+
|
7
|
+
// C++ headers -h has to come after Ruby on MacOS for reasons I do not understand
|
8
|
+
#include <cstdio>
|
9
|
+
#include <string>
|
10
|
+
#include <typeinfo>
|
11
|
+
#include <typeindex>
|
12
|
+
|
13
|
+
#ifdef _MSC_VER
|
14
|
+
// Prevent _strdup deprecated message on MSVC
|
15
|
+
#define strdup _strdup
|
16
|
+
#endif
|
17
|
+
|
18
|
+
// Traits
|
6
19
|
#include "traits/rice_traits.hpp"
|
7
20
|
#include "traits/function_traits.hpp"
|
8
21
|
#include "traits/method_traits.hpp"
|
9
22
|
#include "traits/attribute_traits.hpp"
|
10
23
|
|
24
|
+
// Helpers
|
25
|
+
#include "detail/TupleIterator.hpp"
|
26
|
+
|
11
27
|
// Code for C++ to call Ruby
|
12
|
-
#include "
|
13
|
-
#include "
|
28
|
+
#include "Exception.hpp"
|
29
|
+
#include "JumpException.hpp"
|
30
|
+
#include "JumpException.ipp"
|
14
31
|
#include "detail/RubyFunction.hpp"
|
32
|
+
#include "detail/RubyFunction.ipp"
|
15
33
|
|
16
|
-
//
|
17
|
-
#include "detail/ExceptionHandler.hpp"
|
34
|
+
// C++ API declarations
|
18
35
|
#include "detail/Type.hpp"
|
36
|
+
#include "cpp_api/Encoding.hpp"
|
37
|
+
#include "cpp_api/Identifier.hpp"
|
38
|
+
#include "cpp_api/Identifier.ipp"
|
39
|
+
#include "cpp_api/Object.hpp"
|
40
|
+
#include "cpp_api/Builtin_Object.hpp"
|
41
|
+
#include "cpp_api/String.hpp"
|
42
|
+
#include "cpp_api/Symbol.hpp"
|
43
|
+
#include "cpp_api/Array.hpp"
|
44
|
+
#include "cpp_api/Hash.hpp"
|
45
|
+
|
46
|
+
// Type Conversion declarations
|
47
|
+
#include "detail/RubyType.hpp"
|
48
|
+
#include "detail/RubyType.ipp"
|
49
|
+
#include "detail/Wrapper.hpp"
|
50
|
+
#include "detail/to_ruby.hpp"
|
51
|
+
#include "detail/from_ruby.hpp"
|
52
|
+
#include "detail/Native.hpp"
|
53
|
+
|
54
|
+
// Registries
|
19
55
|
#include "detail/TypeRegistry.hpp"
|
20
56
|
#include "detail/InstanceRegistry.hpp"
|
57
|
+
#include "detail/DefaultHandler.hpp"
|
21
58
|
#include "detail/HandlerRegistry.hpp"
|
22
59
|
#include "detail/NativeRegistry.hpp"
|
23
60
|
#include "detail/Registries.hpp"
|
24
|
-
|
25
|
-
|
26
|
-
#include "Return.hpp"
|
61
|
+
|
62
|
+
// To / From Ruby
|
27
63
|
#include "Arg.hpp"
|
28
|
-
#include "
|
29
|
-
#include "
|
30
|
-
#include "
|
31
|
-
#include "
|
64
|
+
#include "Arg.ipp"
|
65
|
+
#include "Return.hpp"
|
66
|
+
#include "Return.ipp"
|
67
|
+
#include "detail/to_ruby.ipp"
|
68
|
+
#include "detail/from_ruby.ipp"
|
69
|
+
#include "detail/Proc.hpp"
|
70
|
+
|
71
|
+
// Registries
|
72
|
+
#include "detail/TypeRegistry.ipp"
|
73
|
+
#include "detail/InstanceRegistry.ipp"
|
74
|
+
#include "detail/DefaultHandler.ipp"
|
75
|
+
#include "detail/HandlerRegistry.ipp"
|
76
|
+
#include "detail/NativeRegistry.ipp"
|
77
|
+
#include "detail/Registries.ipp"
|
78
|
+
|
79
|
+
#include "detail/Type.ipp"
|
80
|
+
|
81
|
+
// Code for Ruby to call C++
|
32
82
|
#include "Exception.ipp"
|
33
|
-
#include "detail/
|
83
|
+
#include "detail/cpp_protect.hpp"
|
84
|
+
#include "detail/Wrapper.ipp"
|
85
|
+
#include "detail/MethodInfo.hpp"
|
86
|
+
#include "detail/MethodInfo.ipp"
|
87
|
+
#include "detail/Native.ipp"
|
88
|
+
#include "detail/NativeAttributeGet.hpp"
|
89
|
+
#include "detail/NativeAttributeGet.ipp"
|
90
|
+
#include "detail/NativeAttributeSet.hpp"
|
91
|
+
#include "detail/NativeAttributeSet.ipp"
|
34
92
|
#include "detail/NativeFunction.hpp"
|
93
|
+
#include "detail/NativeFunction.ipp"
|
35
94
|
#include "detail/NativeIterator.hpp"
|
36
|
-
#include "
|
95
|
+
#include "detail/NativeIterator.ipp"
|
96
|
+
#include "detail/NativeCallbackFFI.hpp"
|
97
|
+
#include "detail/NativeCallbackFFI.ipp"
|
98
|
+
#include "detail/NativeCallbackSimple.hpp"
|
99
|
+
#include "detail/NativeCallbackSimple.ipp"
|
100
|
+
#include "detail/Proc.ipp"
|
101
|
+
|
102
|
+
// C++ API definitions
|
103
|
+
#include "cpp_api/Encoding.ipp"
|
104
|
+
#include "cpp_api/Object.ipp"
|
105
|
+
#include "cpp_api/Builtin_Object.ipp"
|
106
|
+
#include "cpp_api/String.ipp"
|
107
|
+
#include "cpp_api/Array.ipp"
|
108
|
+
#include "cpp_api/Hash.ipp"
|
109
|
+
#include "cpp_api/Symbol.ipp"
|
37
110
|
|
38
|
-
// C++ classes for using the Ruby API
|
39
|
-
#include "cpp_api/Object.hpp"
|
40
|
-
#include "cpp_api/Builtin_Object.hpp"
|
41
|
-
#include "cpp_api/String.hpp"
|
42
|
-
#include "cpp_api/Array.hpp"
|
43
|
-
#include "cpp_api/Hash.hpp"
|
44
|
-
#include "cpp_api/Symbol.hpp"
|
45
111
|
#include "cpp_api/Module.hpp"
|
112
|
+
#include "cpp_api/Module.ipp"
|
46
113
|
#include "cpp_api/Class.hpp"
|
114
|
+
#include "cpp_api/Class.ipp"
|
47
115
|
#include "cpp_api/Struct.hpp"
|
116
|
+
#include "cpp_api/Struct.ipp"
|
117
|
+
|
48
118
|
#include "Address_Registration_Guard.hpp"
|
119
|
+
#include "Address_Registration_Guard.ipp"
|
49
120
|
#include "global_function.hpp"
|
121
|
+
#include "global_function.ipp"
|
50
122
|
|
51
|
-
// Code
|
123
|
+
// Code involved in creating custom DataTypes (ie, Ruby classes that wrap C++ classes)
|
52
124
|
#include "ruby_mark.hpp"
|
53
125
|
#include "detail/default_allocation_func.hpp"
|
54
126
|
#include "Director.hpp"
|
55
127
|
#include "Data_Type.hpp"
|
128
|
+
#include "Data_Type.ipp"
|
56
129
|
#include "detail/default_allocation_func.ipp"
|
57
130
|
#include "Constructor.hpp"
|
131
|
+
#include "Constructor.ipp"
|
132
|
+
#include "Callback.hpp"
|
133
|
+
#include "Callback.ipp"
|
58
134
|
#include "Data_Object.hpp"
|
135
|
+
#include "Data_Object.ipp"
|
59
136
|
#include "Enum.hpp"
|
137
|
+
#include "Enum.ipp"
|
138
|
+
#include "MemoryView.hpp"
|
139
|
+
#include "MemoryView.ipp"
|
60
140
|
|
61
141
|
// Dependent on Module, Class, Array and String
|
62
142
|
#include "forward_declares.ipp"
|
63
143
|
|
144
|
+
// For now include libc support - maybe should be separate header file someday
|
145
|
+
#include "libc/file.hpp"
|
146
|
+
|
64
147
|
#endif // Rice__hpp_
|
data/rice/ruby_mark.hpp
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
#ifndef
|
2
|
-
#define
|
1
|
+
#ifndef Rice__ruby_mark__hpp_
|
2
|
+
#define Rice__ruby_mark__hpp_
|
3
3
|
|
4
4
|
//! Default function to call to mark a data object.
|
5
5
|
/*! This function can be specialized for a particular type to override
|
@@ -12,4 +12,5 @@ namespace Rice
|
|
12
12
|
{
|
13
13
|
}
|
14
14
|
}
|
15
|
-
#endif //
|
15
|
+
#endif // Rice__ruby_mark__hpp_
|
16
|
+
|
data/rice/stl.hpp
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
#ifndef Rice__stl__hpp_
|
2
2
|
#define Rice__stl__hpp_
|
3
3
|
|
4
|
+
#include "stl/exception.hpp"
|
5
|
+
#include "stl/exception_ptr.hpp"
|
4
6
|
#include "stl/string.hpp"
|
5
7
|
#include "stl/string_view.hpp"
|
6
8
|
#include "stl/complex.hpp"
|
@@ -8,6 +10,8 @@
|
|
8
10
|
#include "stl/reference_wrapper.hpp"
|
9
11
|
#include "stl/smart_ptr.hpp"
|
10
12
|
#include "stl/monostate.hpp"
|
13
|
+
#include "stl/type_index.hpp"
|
14
|
+
#include "stl/type_info.hpp"
|
11
15
|
#include "stl/variant.hpp"
|
12
16
|
#include "stl/pair.hpp"
|
13
17
|
#include "stl/map.hpp"
|
data/test/embed_ruby.cpp
CHANGED
@@ -7,15 +7,18 @@ void embed_ruby()
|
|
7
7
|
|
8
8
|
if (!initialized__)
|
9
9
|
{
|
10
|
+
RUBY_INIT_STACK;
|
11
|
+
|
10
12
|
int argc = 0;
|
11
13
|
char* argv = nullptr;
|
12
14
|
char** pArgv = &argv;
|
13
15
|
|
14
16
|
ruby_sysinit(&argc, &pArgv);
|
17
|
+
|
15
18
|
ruby_init();
|
16
19
|
ruby_init_loadpath();
|
17
20
|
|
18
|
-
#if RUBY_API_VERSION_MAJOR == 3 && RUBY_API_VERSION_MINOR >=
|
21
|
+
#if RUBY_API_VERSION_MAJOR == 3 && RUBY_API_VERSION_MINOR >= 1
|
19
22
|
// Force the prelude / builtins
|
20
23
|
const char* opts[] = { "ruby", "-e;" };
|
21
24
|
ruby_options(2, (char**)opts);
|
data/test/extconf.rb
CHANGED
@@ -2,6 +2,8 @@ require 'bundler/setup'
|
|
2
2
|
require 'mkmf-rice'
|
3
3
|
require 'rbconfig'
|
4
4
|
|
5
|
+
abort "libffi not found" unless have_libffi
|
6
|
+
|
5
7
|
# Totally hack mkmf to make a unittest executable instead of a shared library
|
6
8
|
target_exe = "unittest#{RbConfig::CONFIG['EXEEXT']}"
|
7
9
|
$cleanfiles << target_exe
|
@@ -1,14 +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
|
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
|
data/test/test_Array.cpp
CHANGED
@@ -24,13 +24,24 @@ SETUP(Array)
|
|
24
24
|
embed_ruby();
|
25
25
|
}
|
26
26
|
|
27
|
-
|
27
|
+
TEARDOWN(Array)
|
28
|
+
{
|
29
|
+
rb_gc_start();
|
30
|
+
}
|
31
|
+
|
32
|
+
TESTCASE(construct_default)
|
28
33
|
{
|
29
34
|
Array a;
|
30
35
|
ASSERT_EQUAL(T_ARRAY, rb_type(a));
|
31
36
|
ASSERT_EQUAL(0, RARRAY_LEN(a.value()));
|
32
37
|
}
|
33
38
|
|
39
|
+
TESTCASE(construct_capacity)
|
40
|
+
{
|
41
|
+
Array a((long)10);
|
42
|
+
ASSERT_EQUAL(0, RARRAY_LEN(a.value()));
|
43
|
+
}
|
44
|
+
|
34
45
|
TESTCASE(construct_from_vector_of_int)
|
35
46
|
{
|
36
47
|
std::vector<int> v;
|
data/test/test_Attribute.cpp
CHANGED
@@ -14,12 +14,23 @@ SETUP(Attribute)
|
|
14
14
|
embed_ruby();
|
15
15
|
}
|
16
16
|
|
17
|
+
TEARDOWN(Attribute)
|
18
|
+
{
|
19
|
+
Rice::detail::Registries::instance.types.clearUnverifiedTypes();
|
20
|
+
rb_gc_start();
|
21
|
+
}
|
22
|
+
|
17
23
|
namespace
|
18
24
|
{
|
19
25
|
class SomeClass
|
20
26
|
{
|
21
27
|
};
|
22
28
|
|
29
|
+
class NotAssignable
|
30
|
+
{
|
31
|
+
NotAssignable& operator=(const NotAssignable&) = delete;
|
32
|
+
};
|
33
|
+
|
23
34
|
struct DataStruct
|
24
35
|
{
|
25
36
|
static inline float staticFloat = 1.0;
|
@@ -29,7 +40,9 @@ namespace
|
|
29
40
|
std::string readWriteString = "Read Write";
|
30
41
|
int writeInt = 0;
|
31
42
|
const char* readChars = "Read some chars!";
|
43
|
+
const int constInt = 5;
|
32
44
|
SomeClass someClass;
|
45
|
+
NotAssignable notAssignable;
|
33
46
|
|
34
47
|
std::string inspect()
|
35
48
|
{
|
@@ -57,21 +70,28 @@ TESTCASE(attributes)
|
|
57
70
|
// Test readonly attribute
|
58
71
|
Object result = o.call("read_chars");
|
59
72
|
ASSERT_EQUAL("Read some chars!", detail::From_Ruby<char*>().convert(result));
|
60
|
-
ASSERT_EXCEPTION_CHECK(
|
61
|
-
Exception,
|
62
|
-
o.call("read_char=", "some text"),
|
63
|
-
ASSERT(std::string(ex.what()).find("undefined method `read_char='") == 0)
|
64
|
-
);
|
65
73
|
|
74
|
+
if constexpr (!oldRuby)
|
75
|
+
{
|
76
|
+
ASSERT_EXCEPTION_CHECK(
|
77
|
+
Exception,
|
78
|
+
o.call("read_char=", "some text"),
|
79
|
+
ASSERT(std::string(ex.what()).find("undefined method `read_char='") == 0)
|
80
|
+
);
|
81
|
+
}
|
66
82
|
// Test writeonly attribute
|
67
83
|
result = o.call("write_int=", 5);
|
68
84
|
ASSERT_EQUAL(5, detail::From_Ruby<int>().convert(result.value()));
|
69
85
|
ASSERT_EQUAL(5, dataStruct->writeInt);
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
86
|
+
|
87
|
+
if constexpr (!oldRuby)
|
88
|
+
{
|
89
|
+
ASSERT_EXCEPTION_CHECK(
|
90
|
+
Exception,
|
91
|
+
o.call("write_int", 3),
|
92
|
+
ASSERT(std::string(ex.what()).find("undefined method `write_int'") == 0)
|
93
|
+
);
|
94
|
+
}
|
75
95
|
|
76
96
|
// Test readwrite attribute
|
77
97
|
result = o.call("read_write_string=", "Set a string");
|
@@ -82,6 +102,48 @@ TESTCASE(attributes)
|
|
82
102
|
ASSERT_EQUAL("Set a string", detail::From_Ruby<std::string>().convert(result.value()));
|
83
103
|
}
|
84
104
|
|
105
|
+
TESTCASE(const_attribute)
|
106
|
+
{
|
107
|
+
Class c = define_class<DataStruct>("DataStruct")
|
108
|
+
.define_constructor(Constructor<DataStruct>())
|
109
|
+
.define_attr("const_int", &DataStruct::constInt);
|
110
|
+
|
111
|
+
Data_Object<DataStruct> o = c.call("new");
|
112
|
+
const DataStruct* dataStruct = o.get();
|
113
|
+
|
114
|
+
if constexpr (!oldRuby)
|
115
|
+
{
|
116
|
+
ASSERT_EXCEPTION_CHECK(
|
117
|
+
Exception,
|
118
|
+
o.call("const_int=", 5),
|
119
|
+
ASSERT(std::string(ex.what()).find("undefined method `const_int='") == 0)
|
120
|
+
);
|
121
|
+
}
|
122
|
+
}
|
123
|
+
|
124
|
+
TESTCASE(not_copyable_attribute)
|
125
|
+
{
|
126
|
+
Class notAssignableClass = define_class<NotAssignable>("NotAssignable")
|
127
|
+
.define_constructor(Constructor<NotAssignable>());
|
128
|
+
|
129
|
+
Class c = define_class<DataStruct>("DataStruct")
|
130
|
+
.define_constructor(Constructor<DataStruct>())
|
131
|
+
.define_attr("not_assignable", &DataStruct::notAssignable);
|
132
|
+
|
133
|
+
Data_Object<NotAssignable> notAssignable = notAssignableClass.call("new");
|
134
|
+
|
135
|
+
Data_Object<DataStruct> o = c.call("new");
|
136
|
+
|
137
|
+
if constexpr (!oldRuby)
|
138
|
+
{
|
139
|
+
ASSERT_EXCEPTION_CHECK(
|
140
|
+
Exception,
|
141
|
+
o.call("not_assignable=", notAssignable),
|
142
|
+
ASSERT(std::string(ex.what()).find("undefined method `not_assignable='") == 0)
|
143
|
+
);
|
144
|
+
}
|
145
|
+
}
|
146
|
+
|
85
147
|
TESTCASE(static_attributes)
|
86
148
|
{
|
87
149
|
Class c = define_class<DataStruct>("DataStruct")
|
@@ -98,11 +160,15 @@ TESTCASE(static_attributes)
|
|
98
160
|
|
99
161
|
result = c.call("static_string");
|
100
162
|
ASSERT_EQUAL("Static string", detail::From_Ruby<std::string>().convert(result.value()));
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
163
|
+
|
164
|
+
if constexpr (!oldRuby)
|
165
|
+
{
|
166
|
+
ASSERT_EXCEPTION_CHECK(
|
167
|
+
Exception,
|
168
|
+
c.call("static_string=", true),
|
169
|
+
ASSERT(std::string(ex.what()).find("undefined method `static_string='") == 0)
|
170
|
+
);
|
171
|
+
}
|
106
172
|
}
|
107
173
|
|
108
174
|
TESTCASE(global_attributes)
|
@@ -128,20 +194,36 @@ TESTCASE(not_defined)
|
|
128
194
|
Data_Type<DataStruct> c = define_class<DataStruct>("DataStruct");
|
129
195
|
|
130
196
|
#ifdef _MSC_VER
|
131
|
-
const char* message = "
|
197
|
+
const char* message = "The following types are not registered with Rice:\n class `anonymous namespace'::SomeClass\n";
|
132
198
|
#else
|
133
|
-
const char* message = "
|
199
|
+
const char* message = "The following types are not registered with Rice:\n (anonymous namespace)::SomeClass\n";
|
134
200
|
#endif
|
135
201
|
|
202
|
+
c.define_singleton_attr("some_class_static", &DataStruct::someClassStatic);
|
203
|
+
|
136
204
|
ASSERT_EXCEPTION_CHECK(
|
137
205
|
std::invalid_argument,
|
138
|
-
|
206
|
+
Rice::detail::Registries::instance.types.validateTypes(),
|
139
207
|
ASSERT_EQUAL(message, ex.what())
|
140
208
|
);
|
141
209
|
|
210
|
+
#ifdef _MSC_VER
|
211
|
+
message = "Type is not registered with Rice: class `anonymous namespace'::SomeClass";
|
212
|
+
#else
|
213
|
+
message = "Type is not registered with Rice: (anonymous namespace)::SomeClass";
|
214
|
+
#endif
|
215
|
+
|
142
216
|
ASSERT_EXCEPTION_CHECK(
|
143
|
-
|
144
|
-
c.
|
217
|
+
Rice::Exception,
|
218
|
+
c.call("some_class_static"),
|
145
219
|
ASSERT_EQUAL(message, ex.what())
|
146
220
|
);
|
147
|
-
|
221
|
+
|
222
|
+
c.define_attr("some_class", &DataStruct::someClass);
|
223
|
+
Object o = c.call("new");
|
224
|
+
ASSERT_EXCEPTION_CHECK(
|
225
|
+
Rice::Exception,
|
226
|
+
o.call("some_class"),
|
227
|
+
ASSERT_EQUAL(message, ex.what())
|
228
|
+
);
|
229
|
+
}
|