alinta-ffi 1.9.19

Sign up to get free protection for your applications and to get access to all the features.
Files changed (195) hide show
  1. checksums.yaml +7 -0
  2. data/COPYING +49 -0
  3. data/LICENSE +24 -0
  4. data/README.md +112 -0
  5. data/Rakefile +243 -0
  6. data/ext/ffi_c/AbstractMemory.c +1109 -0
  7. data/ext/ffi_c/AbstractMemory.h +175 -0
  8. data/ext/ffi_c/ArrayType.c +162 -0
  9. data/ext/ffi_c/ArrayType.h +59 -0
  10. data/ext/ffi_c/Buffer.c +365 -0
  11. data/ext/ffi_c/Call.c +517 -0
  12. data/ext/ffi_c/Call.h +110 -0
  13. data/ext/ffi_c/ClosurePool.c +283 -0
  14. data/ext/ffi_c/ClosurePool.h +57 -0
  15. data/ext/ffi_c/DataConverter.c +91 -0
  16. data/ext/ffi_c/DynamicLibrary.c +339 -0
  17. data/ext/ffi_c/DynamicLibrary.h +98 -0
  18. data/ext/ffi_c/Function.c +998 -0
  19. data/ext/ffi_c/Function.h +87 -0
  20. data/ext/ffi_c/FunctionInfo.c +271 -0
  21. data/ext/ffi_c/LastError.c +184 -0
  22. data/ext/ffi_c/LastError.h +47 -0
  23. data/ext/ffi_c/LongDouble.c +63 -0
  24. data/ext/ffi_c/LongDouble.h +51 -0
  25. data/ext/ffi_c/MappedType.c +168 -0
  26. data/ext/ffi_c/MappedType.h +59 -0
  27. data/ext/ffi_c/MemoryPointer.c +197 -0
  28. data/ext/ffi_c/MemoryPointer.h +53 -0
  29. data/ext/ffi_c/MethodHandle.c +358 -0
  30. data/ext/ffi_c/MethodHandle.h +55 -0
  31. data/ext/ffi_c/Platform.c +129 -0
  32. data/ext/ffi_c/Platform.h +45 -0
  33. data/ext/ffi_c/Pointer.c +508 -0
  34. data/ext/ffi_c/Pointer.h +63 -0
  35. data/ext/ffi_c/Struct.c +829 -0
  36. data/ext/ffi_c/Struct.h +106 -0
  37. data/ext/ffi_c/StructByReference.c +190 -0
  38. data/ext/ffi_c/StructByReference.h +50 -0
  39. data/ext/ffi_c/StructByValue.c +150 -0
  40. data/ext/ffi_c/StructByValue.h +55 -0
  41. data/ext/ffi_c/StructLayout.c +698 -0
  42. data/ext/ffi_c/Thread.c +352 -0
  43. data/ext/ffi_c/Thread.h +95 -0
  44. data/ext/ffi_c/Type.c +397 -0
  45. data/ext/ffi_c/Type.h +62 -0
  46. data/ext/ffi_c/Types.c +139 -0
  47. data/ext/ffi_c/Types.h +89 -0
  48. data/ext/ffi_c/Variadic.c +304 -0
  49. data/ext/ffi_c/compat.h +78 -0
  50. data/ext/ffi_c/extconf.rb +71 -0
  51. data/ext/ffi_c/ffi.c +98 -0
  52. data/ext/ffi_c/libffi.bsd.mk +40 -0
  53. data/ext/ffi_c/libffi.darwin.mk +105 -0
  54. data/ext/ffi_c/libffi.gnu.mk +32 -0
  55. data/ext/ffi_c/libffi.mk +18 -0
  56. data/ext/ffi_c/libffi.vc.mk +26 -0
  57. data/ext/ffi_c/libffi.vc64.mk +26 -0
  58. data/ext/ffi_c/rbffi.h +57 -0
  59. data/ext/ffi_c/rbffi_endian.h +59 -0
  60. data/ext/ffi_c/win32/stdbool.h +8 -0
  61. data/ext/ffi_c/win32/stdint.h +201 -0
  62. data/ffi.gemspec +23 -0
  63. data/gen/Rakefile +30 -0
  64. data/lib/ffi.rb +20 -0
  65. data/lib/ffi/autopointer.rb +203 -0
  66. data/lib/ffi/buffer.rb +4 -0
  67. data/lib/ffi/callback.rb +4 -0
  68. data/lib/ffi/enum.rb +296 -0
  69. data/lib/ffi/errno.rb +43 -0
  70. data/lib/ffi/ffi.rb +44 -0
  71. data/lib/ffi/io.rb +62 -0
  72. data/lib/ffi/library.rb +590 -0
  73. data/lib/ffi/managedstruct.rb +84 -0
  74. data/lib/ffi/memorypointer.rb +1 -0
  75. data/lib/ffi/platform.rb +164 -0
  76. data/lib/ffi/platform/aarch64-linux/types.conf +104 -0
  77. data/lib/ffi/platform/arm-linux/types.conf +104 -0
  78. data/lib/ffi/platform/i386-cygwin/types.conf +3 -0
  79. data/lib/ffi/platform/i386-darwin/types.conf +100 -0
  80. data/lib/ffi/platform/i386-freebsd/types.conf +152 -0
  81. data/lib/ffi/platform/i386-gnu/types.conf +107 -0
  82. data/lib/ffi/platform/i386-linux/types.conf +103 -0
  83. data/lib/ffi/platform/i386-netbsd/types.conf +126 -0
  84. data/lib/ffi/platform/i386-openbsd/types.conf +128 -0
  85. data/lib/ffi/platform/i386-solaris/types.conf +122 -0
  86. data/lib/ffi/platform/i386-windows/types.conf +105 -0
  87. data/lib/ffi/platform/ia64-linux/types.conf +104 -0
  88. data/lib/ffi/platform/mips-linux/types.conf +102 -0
  89. data/lib/ffi/platform/mips64el-linux/types.conf +104 -0
  90. data/lib/ffi/platform/mipsel-linux/types.conf +102 -0
  91. data/lib/ffi/platform/powerpc-aix/types.conf +180 -0
  92. data/lib/ffi/platform/powerpc-darwin/types.conf +100 -0
  93. data/lib/ffi/platform/powerpc-linux/types.conf +100 -0
  94. data/lib/ffi/platform/powerpc64-linux/types.conf +104 -0
  95. data/lib/ffi/platform/s390-linux/types.conf +102 -0
  96. data/lib/ffi/platform/s390x-linux/types.conf +102 -0
  97. data/lib/ffi/platform/sparc-linux/types.conf +102 -0
  98. data/lib/ffi/platform/sparc-solaris/types.conf +128 -0
  99. data/lib/ffi/platform/sparc64-linux/types.conf +102 -0
  100. data/lib/ffi/platform/sparcv9-solaris/types.conf +128 -0
  101. data/lib/ffi/platform/x86_64-cygwin/types.conf +3 -0
  102. data/lib/ffi/platform/x86_64-darwin/types.conf +126 -0
  103. data/lib/ffi/platform/x86_64-freebsd/types.conf +128 -0
  104. data/lib/ffi/platform/x86_64-linux/types.conf +102 -0
  105. data/lib/ffi/platform/x86_64-netbsd/types.conf +128 -0
  106. data/lib/ffi/platform/x86_64-openbsd/types.conf +134 -0
  107. data/lib/ffi/platform/x86_64-solaris/types.conf +122 -0
  108. data/lib/ffi/platform/x86_64-windows/types.conf +120 -0
  109. data/lib/ffi/pointer.rb +161 -0
  110. data/lib/ffi/struct.rb +371 -0
  111. data/lib/ffi/struct_layout_builder.rb +227 -0
  112. data/lib/ffi/tools/const_generator.rb +229 -0
  113. data/lib/ffi/tools/generator.rb +60 -0
  114. data/lib/ffi/tools/generator_task.rb +36 -0
  115. data/lib/ffi/tools/struct_generator.rb +194 -0
  116. data/lib/ffi/tools/types_generator.rb +134 -0
  117. data/lib/ffi/types.rb +194 -0
  118. data/lib/ffi/union.rb +43 -0
  119. data/lib/ffi/variadic.rb +78 -0
  120. data/lib/ffi/version.rb +4 -0
  121. data/libtest/Benchmark.c +52 -0
  122. data/libtest/BoolTest.c +34 -0
  123. data/libtest/BufferTest.c +31 -0
  124. data/libtest/ClosureTest.c +205 -0
  125. data/libtest/EnumTest.c +51 -0
  126. data/libtest/FunctionTest.c +70 -0
  127. data/libtest/GNUmakefile +149 -0
  128. data/libtest/GlobalVariable.c +62 -0
  129. data/libtest/LastErrorTest.c +21 -0
  130. data/libtest/NumberTest.c +132 -0
  131. data/libtest/PointerTest.c +63 -0
  132. data/libtest/ReferenceTest.c +23 -0
  133. data/libtest/StringTest.c +34 -0
  134. data/libtest/StructTest.c +243 -0
  135. data/libtest/UnionTest.c +43 -0
  136. data/libtest/VariadicTest.c +99 -0
  137. data/spec/ffi/LICENSE.SPECS +22 -0
  138. data/spec/ffi/async_callback_spec.rb +35 -0
  139. data/spec/ffi/bitmask_spec.rb +575 -0
  140. data/spec/ffi/bool_spec.rb +32 -0
  141. data/spec/ffi/buffer_spec.rb +279 -0
  142. data/spec/ffi/callback_spec.rb +773 -0
  143. data/spec/ffi/custom_param_type.rb +37 -0
  144. data/spec/ffi/custom_type_spec.rb +74 -0
  145. data/spec/ffi/dup_spec.rb +52 -0
  146. data/spec/ffi/enum_spec.rb +423 -0
  147. data/spec/ffi/errno_spec.rb +20 -0
  148. data/spec/ffi/ffi_spec.rb +28 -0
  149. data/spec/ffi/fixtures/Benchmark.c +52 -0
  150. data/spec/ffi/fixtures/BitmaskTest.c +51 -0
  151. data/spec/ffi/fixtures/BoolTest.c +34 -0
  152. data/spec/ffi/fixtures/BufferTest.c +31 -0
  153. data/spec/ffi/fixtures/ClosureTest.c +205 -0
  154. data/spec/ffi/fixtures/EnumTest.c +51 -0
  155. data/spec/ffi/fixtures/FunctionTest.c +142 -0
  156. data/spec/ffi/fixtures/GNUmakefile +149 -0
  157. data/spec/ffi/fixtures/GlobalVariable.c +62 -0
  158. data/spec/ffi/fixtures/LastErrorTest.c +21 -0
  159. data/spec/ffi/fixtures/NumberTest.c +132 -0
  160. data/spec/ffi/fixtures/PipeHelper.h +21 -0
  161. data/spec/ffi/fixtures/PipeHelperPosix.c +41 -0
  162. data/spec/ffi/fixtures/PipeHelperWindows.c +72 -0
  163. data/spec/ffi/fixtures/PointerTest.c +63 -0
  164. data/spec/ffi/fixtures/ReferenceTest.c +23 -0
  165. data/spec/ffi/fixtures/StringTest.c +34 -0
  166. data/spec/ffi/fixtures/StructTest.c +243 -0
  167. data/spec/ffi/fixtures/UnionTest.c +43 -0
  168. data/spec/ffi/fixtures/VariadicTest.c +99 -0
  169. data/spec/ffi/fixtures/classes.rb +438 -0
  170. data/spec/ffi/function_spec.rb +97 -0
  171. data/spec/ffi/io_spec.rb +16 -0
  172. data/spec/ffi/library_spec.rb +286 -0
  173. data/spec/ffi/long_double.rb +30 -0
  174. data/spec/ffi/managed_struct_spec.rb +68 -0
  175. data/spec/ffi/memorypointer_spec.rb +78 -0
  176. data/spec/ffi/number_spec.rb +247 -0
  177. data/spec/ffi/platform_spec.rb +114 -0
  178. data/spec/ffi/pointer_spec.rb +285 -0
  179. data/spec/ffi/rbx/attach_function_spec.rb +34 -0
  180. data/spec/ffi/rbx/memory_pointer_spec.rb +198 -0
  181. data/spec/ffi/rbx/spec_helper.rb +6 -0
  182. data/spec/ffi/rbx/struct_spec.rb +18 -0
  183. data/spec/ffi/spec_helper.rb +93 -0
  184. data/spec/ffi/string_spec.rb +118 -0
  185. data/spec/ffi/strptr_spec.rb +50 -0
  186. data/spec/ffi/struct_by_ref_spec.rb +43 -0
  187. data/spec/ffi/struct_callback_spec.rb +69 -0
  188. data/spec/ffi/struct_initialize_spec.rb +35 -0
  189. data/spec/ffi/struct_packed_spec.rb +50 -0
  190. data/spec/ffi/struct_spec.rb +882 -0
  191. data/spec/ffi/typedef_spec.rb +91 -0
  192. data/spec/ffi/union_spec.rb +67 -0
  193. data/spec/ffi/variadic_spec.rb +132 -0
  194. data/spec/spec.opts +4 -0
  195. metadata +309 -0
@@ -0,0 +1,106 @@
1
+ /*
2
+ * Copyright (c) 2008, 2009, Wayne Meissner
3
+ * Copyright (c) 2009, Luc Heinrich <luc@honk-honk.com>
4
+ *
5
+ * Copyright (c) 2008-2013, Ruby FFI project contributors
6
+ * All rights reserved.
7
+ *
8
+ * Redistribution and use in source and binary forms, with or without
9
+ * modification, are permitted provided that the following conditions are met:
10
+ * * Redistributions of source code must retain the above copyright
11
+ * notice, this list of conditions and the following disclaimer.
12
+ * * Redistributions in binary form must reproduce the above copyright
13
+ * notice, this list of conditions and the following disclaimer in the
14
+ * documentation and/or other materials provided with the distribution.
15
+ * * Neither the name of the Ruby FFI project nor the
16
+ * names of its contributors may be used to endorse or promote products
17
+ * derived from this software without specific prior written permission.
18
+ *
19
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
20
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22
+ * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
23
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
26
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
+ */
30
+
31
+ #ifndef RBFFI_STRUCT_H
32
+ #define RBFFI_STRUCT_H
33
+
34
+ #include "extconf.h"
35
+ #include "AbstractMemory.h"
36
+ #include "Type.h"
37
+ #ifdef RUBY_1_9
38
+ #include <ruby/st.h>
39
+ #else
40
+ #include <st.h>
41
+ #endif
42
+
43
+ #ifdef __cplusplus
44
+ extern "C" {
45
+ #endif
46
+
47
+ extern void rbffi_Struct_Init(VALUE ffiModule);
48
+ extern void rbffi_StructLayout_Init(VALUE ffiModule);
49
+ typedef struct StructField_ StructField;
50
+ typedef struct StructLayout_ StructLayout;
51
+ typedef struct Struct_ Struct;
52
+
53
+ struct StructField_ {
54
+ Type* type;
55
+ unsigned int offset;
56
+
57
+ int referenceIndex;
58
+
59
+ bool referenceRequired;
60
+ VALUE rbType;
61
+ VALUE rbName;
62
+
63
+ VALUE (*get)(StructField* field, Struct* s);
64
+ void (*put)(StructField* field, Struct* s, VALUE value);
65
+
66
+ MemoryOp* memoryOp;
67
+ };
68
+
69
+ struct StructLayout_ {
70
+ Type base;
71
+ StructField** fields;
72
+ int fieldCount;
73
+ int size;
74
+ int align;
75
+ ffi_type** ffiTypes;
76
+ struct st_table* fieldSymbolTable;
77
+
78
+ /** The number of reference tracking fields in this struct */
79
+ int referenceFieldCount;
80
+
81
+ VALUE rbFieldNames;
82
+ VALUE rbFieldMap;
83
+ VALUE rbFields;
84
+ };
85
+
86
+ struct Struct_ {
87
+ StructLayout* layout;
88
+ AbstractMemory* pointer;
89
+ VALUE* rbReferences;
90
+
91
+ VALUE rbLayout;
92
+ VALUE rbPointer;
93
+ };
94
+
95
+ extern VALUE rbffi_StructClass, rbffi_StructLayoutClass;
96
+ extern VALUE rbffi_StructLayoutFieldClass, rbffi_StructLayoutFunctionFieldClass;
97
+ extern VALUE rbffi_StructLayoutArrayFieldClass;
98
+ extern VALUE rbffi_StructInlineArrayClass;
99
+ extern VALUE rbffi_StructLayoutCharArrayClass;
100
+
101
+ #ifdef __cplusplus
102
+ }
103
+ #endif
104
+
105
+ #endif /* RBFFI_STRUCT_H */
106
+
@@ -0,0 +1,190 @@
1
+ /*
2
+ * Copyright (c) 2010, Wayne Meissner
3
+ * All rights reserved.
4
+ *
5
+ * Redistribution and use in source and binary forms, with or without
6
+ * modification, are permitted provided that the following conditions are met:
7
+ *
8
+ * * Redistributions of source code must retain the above copyright notice, this
9
+ * list of conditions and the following disclaimer.
10
+ * * Redistributions in binary form must reproduce the above copyright notice
11
+ * this list of conditions and the following disclaimer in the documentation
12
+ * and/or other materials provided with the distribution.
13
+ * * The name of the author or authors may not be used to endorse or promote
14
+ * products derived from this software without specific prior written permission.
15
+ *
16
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
20
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
23
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26
+ */
27
+
28
+ #ifndef _MSC_VER
29
+ # include <sys/param.h>
30
+ #endif
31
+ #include <sys/types.h>
32
+ #include <stdio.h>
33
+ #ifndef _MSC_VER
34
+ # include <stdint.h>
35
+ # include <stdbool.h>
36
+ #else
37
+ # include "win32/stdbool.h"
38
+ # include "win32/stdint.h"
39
+ #endif
40
+ #include <errno.h>
41
+ #include <ruby.h>
42
+
43
+ #include <ffi.h>
44
+ #include "rbffi.h"
45
+ #include "compat.h"
46
+
47
+ #include "Pointer.h"
48
+ #include "Struct.h"
49
+ #include "StructByReference.h"
50
+
51
+
52
+ #define FFI_ALIGN(v, a) (((((size_t) (v))-1) | ((a)-1))+1)
53
+
54
+ static VALUE sbr_allocate(VALUE);
55
+ static VALUE sbr_initialize(VALUE, VALUE);
56
+ static void sbr_mark(StructByReference *);
57
+
58
+ VALUE rbffi_StructByReferenceClass = Qnil;
59
+
60
+ static VALUE
61
+ sbr_allocate(VALUE klass)
62
+ {
63
+ StructByReference* sbr;
64
+
65
+ VALUE obj = Data_Make_Struct(klass, StructByReference, sbr_mark, -1, sbr);
66
+
67
+ sbr->rbStructClass = Qnil;
68
+
69
+ return obj;
70
+ }
71
+
72
+ /*
73
+ * call-seq: initialize(struc_class)
74
+ * @param [Struct] struct_calss
75
+ * @return [self]
76
+ * A new instance of StructByReference.
77
+ */
78
+ static VALUE
79
+ sbr_initialize(VALUE self, VALUE rbStructClass)
80
+ {
81
+ StructByReference* sbr = NULL;
82
+
83
+ if (!rb_class_inherited_p(rbStructClass, rbffi_StructClass)) {
84
+ rb_raise(rb_eTypeError, "wrong type (expected subclass of FFI::Struct)");
85
+ }
86
+
87
+ Data_Get_Struct(self, StructByReference, sbr);
88
+ sbr->rbStructClass = rbStructClass;
89
+
90
+ return self;
91
+ }
92
+
93
+ static void
94
+ sbr_mark(StructByReference *sbr)
95
+ {
96
+ rb_gc_mark(sbr->rbStructClass);
97
+ }
98
+
99
+
100
+ /*
101
+ * call-seq: struct_class
102
+ * @return [Struct]
103
+ * Get +struct_class+.
104
+ */
105
+ static VALUE
106
+ sbr_struct_class(VALUE self)
107
+ {
108
+ StructByReference* sbr;
109
+
110
+ Data_Get_Struct(self, StructByReference, sbr);
111
+
112
+ return sbr->rbStructClass;
113
+ }
114
+
115
+ /*
116
+ * call-seq: native_type
117
+ * @return [Class]
118
+ * Always get {FFI::Type}::POINTER.
119
+ */
120
+ static VALUE
121
+ sbr_native_type(VALUE self)
122
+ {
123
+ return rb_const_get(rbffi_TypeClass, rb_intern("POINTER"));
124
+ }
125
+
126
+ /*
127
+ * call-seq: to_native(value, ctx)
128
+ * @param [nil, Struct] value
129
+ * @param [nil] ctx
130
+ * @return [AbstractMemory] Pointer on +value+.
131
+ */
132
+ static VALUE
133
+ sbr_to_native(VALUE self, VALUE value, VALUE ctx)
134
+ {
135
+ StructByReference* sbr;
136
+ Struct* s;
137
+
138
+ if (unlikely(value == Qnil)) {
139
+ return rbffi_NullPointerSingleton;
140
+ }
141
+
142
+ Data_Get_Struct(self, StructByReference, sbr);
143
+ if (!rb_obj_is_kind_of(value, sbr->rbStructClass)) {
144
+ rb_raise(rb_eTypeError, "wrong argument type %s (expected %s)",
145
+ rb_obj_classname(value),
146
+ RSTRING_PTR(rb_class_name(sbr->rbStructClass)));
147
+ }
148
+
149
+ Data_Get_Struct(value, Struct, s);
150
+
151
+ return s->rbPointer;
152
+ }
153
+
154
+ /*
155
+ * call-seq: from_native(value, ctx)
156
+ * @param [AbstractMemory] value
157
+ * @param [nil] ctx
158
+ * @return [Struct]
159
+ * Create a struct from content of memory +value+.
160
+ */
161
+ static VALUE
162
+ sbr_from_native(VALUE self, VALUE value, VALUE ctx)
163
+ {
164
+ StructByReference* sbr;
165
+
166
+ Data_Get_Struct(self, StructByReference, sbr);
167
+
168
+ return rb_class_new_instance(1, &value, sbr->rbStructClass);
169
+ }
170
+
171
+
172
+ void
173
+ rbffi_StructByReference_Init(VALUE moduleFFI)
174
+ {
175
+ /*
176
+ * Document-class: FFI::StructByReference
177
+ * This class includes {FFI::DataConverter} module.
178
+ */
179
+ rbffi_StructByReferenceClass = rb_define_class_under(moduleFFI, "StructByReference", rb_cObject);
180
+ rb_global_variable(&rbffi_StructByReferenceClass);
181
+ rb_include_module(rbffi_StructByReferenceClass, rb_const_get(moduleFFI, rb_intern("DataConverter")));
182
+
183
+ rb_define_alloc_func(rbffi_StructByReferenceClass, sbr_allocate);
184
+ rb_define_method(rbffi_StructByReferenceClass, "initialize", sbr_initialize, 1);
185
+ rb_define_method(rbffi_StructByReferenceClass, "struct_class", sbr_struct_class, 0);
186
+ rb_define_method(rbffi_StructByReferenceClass, "native_type", sbr_native_type, 0);
187
+ rb_define_method(rbffi_StructByReferenceClass, "to_native", sbr_to_native, 2);
188
+ rb_define_method(rbffi_StructByReferenceClass, "from_native", sbr_from_native, 2);
189
+ }
190
+
@@ -0,0 +1,50 @@
1
+ /*
2
+ * Copyright (c) 2009, Wayne Meissner
3
+ * All rights reserved.
4
+ *
5
+ * Redistribution and use in source and binary forms, with or without
6
+ * modification, are permitted provided that the following conditions are met:
7
+ *
8
+ * * Redistributions of source code must retain the above copyright notice, this
9
+ * list of conditions and the following disclaimer.
10
+ * * Redistributions in binary form must reproduce the above copyright notice
11
+ * this list of conditions and the following disclaimer in the documentation
12
+ * and/or other materials provided with the distribution.
13
+ * * The name of the author or authors may not be used to endorse or promote
14
+ * products derived from this software without specific prior written permission.
15
+ *
16
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
20
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
23
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26
+ */
27
+
28
+ #ifndef RBFFI_STRUCTBYREFERENCE_H
29
+ #define RBFFI_STRUCTBYREFERENCE_H
30
+
31
+ #include <ruby.h>
32
+
33
+ #ifdef __cplusplus
34
+ extern "C" {
35
+ #endif
36
+
37
+ typedef struct StructByReference_ {
38
+ VALUE rbStructClass;
39
+ } StructByReference;
40
+
41
+ void rbffi_StructByReference_Init(VALUE moduleFFI);
42
+
43
+ extern VALUE rbffi_StructByReferenceClass;
44
+
45
+ #ifdef __cplusplus
46
+ }
47
+ #endif
48
+
49
+ #endif /* RBFFI_STRUCTBYREFERENCE_H */
50
+
@@ -0,0 +1,150 @@
1
+ /*
2
+ * Copyright (c) 2009, Wayne Meissner
3
+ *
4
+ * Copyright (c) 2008-2013, Ruby FFI project contributors
5
+ * All rights reserved.
6
+ *
7
+ * Redistribution and use in source and binary forms, with or without
8
+ * modification, are permitted provided that the following conditions are met:
9
+ * * Redistributions of source code must retain the above copyright
10
+ * notice, this list of conditions and the following disclaimer.
11
+ * * Redistributions in binary form must reproduce the above copyright
12
+ * notice, this list of conditions and the following disclaimer in the
13
+ * documentation and/or other materials provided with the distribution.
14
+ * * Neither the name of the Ruby FFI project nor the
15
+ * names of its contributors may be used to endorse or promote products
16
+ * derived from this software without specific prior written permission.
17
+ *
18
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
19
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21
+ * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
22
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
24
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
25
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
+ */
29
+
30
+ #ifndef _MSC_VER
31
+ #include <sys/param.h>
32
+ #endif
33
+ #include <sys/types.h>
34
+ #include <stdio.h>
35
+ #ifndef _MSC_VER
36
+ # include <stdint.h>
37
+ # include <stdbool.h>
38
+ #else
39
+ # include "win32/stdbool.h"
40
+ # include "win32/stdint.h"
41
+ #endif
42
+ #include <errno.h>
43
+ #include <ruby.h>
44
+
45
+ #include <ffi.h>
46
+ #include "rbffi.h"
47
+ #include "compat.h"
48
+
49
+ #include "Type.h"
50
+ #include "StructByValue.h"
51
+ #include "Struct.h"
52
+
53
+ #define FFI_ALIGN(v, a) (((((size_t) (v))-1) | ((a)-1))+1)
54
+
55
+ static VALUE sbv_allocate(VALUE);
56
+ static VALUE sbv_initialize(VALUE, VALUE);
57
+ static void sbv_mark(StructByValue *);
58
+ static void sbv_free(StructByValue *);
59
+
60
+ VALUE rbffi_StructByValueClass = Qnil;
61
+
62
+ static VALUE
63
+ sbv_allocate(VALUE klass)
64
+ {
65
+ StructByValue* sbv;
66
+
67
+ VALUE obj = Data_Make_Struct(klass, StructByValue, sbv_mark, sbv_free, sbv);
68
+
69
+ sbv->rbStructClass = Qnil;
70
+ sbv->rbStructLayout = Qnil;
71
+ sbv->base.nativeType = NATIVE_STRUCT;
72
+
73
+ sbv->base.ffiType = xcalloc(1, sizeof(*sbv->base.ffiType));
74
+ sbv->base.ffiType->size = 0;
75
+ sbv->base.ffiType->alignment = 1;
76
+ sbv->base.ffiType->type = FFI_TYPE_STRUCT;
77
+
78
+ return obj;
79
+ }
80
+
81
+ static VALUE
82
+ sbv_initialize(VALUE self, VALUE rbStructClass)
83
+ {
84
+ StructByValue* sbv = NULL;
85
+ StructLayout* layout = NULL;
86
+ VALUE rbLayout = Qnil;
87
+
88
+ rbLayout = rb_ivar_get(rbStructClass, rb_intern("@layout"));
89
+ if (!rb_obj_is_instance_of(rbLayout, rbffi_StructLayoutClass)) {
90
+ rb_raise(rb_eTypeError, "wrong type in @layout ivar (expected FFI::StructLayout)");
91
+ }
92
+
93
+ Data_Get_Struct(rbLayout, StructLayout, layout);
94
+ Data_Get_Struct(self, StructByValue, sbv);
95
+ sbv->rbStructClass = rbStructClass;
96
+ sbv->rbStructLayout = rbLayout;
97
+
98
+ /* We can just use everything from the ffi_type directly */
99
+ *sbv->base.ffiType = *layout->base.ffiType;
100
+
101
+ return self;
102
+ }
103
+
104
+ static void
105
+ sbv_mark(StructByValue *sbv)
106
+ {
107
+ rb_gc_mark(sbv->rbStructClass);
108
+ rb_gc_mark(sbv->rbStructLayout);
109
+ }
110
+
111
+ static void
112
+ sbv_free(StructByValue *sbv)
113
+ {
114
+ xfree(sbv->base.ffiType);
115
+ xfree(sbv);
116
+ }
117
+
118
+
119
+ static VALUE
120
+ sbv_layout(VALUE self)
121
+ {
122
+ StructByValue* sbv;
123
+
124
+ Data_Get_Struct(self, StructByValue, sbv);
125
+ return sbv->rbStructLayout;
126
+ }
127
+
128
+ static VALUE
129
+ sbv_struct_class(VALUE self)
130
+ {
131
+ StructByValue* sbv;
132
+
133
+ Data_Get_Struct(self, StructByValue, sbv);
134
+
135
+ return sbv->rbStructClass;
136
+ }
137
+
138
+ void
139
+ rbffi_StructByValue_Init(VALUE moduleFFI)
140
+ {
141
+ rbffi_StructByValueClass = rb_define_class_under(moduleFFI, "StructByValue", rbffi_TypeClass);
142
+ rb_global_variable(&rbffi_StructByValueClass);
143
+ rb_define_const(rbffi_TypeClass, "Struct", rbffi_StructByValueClass);
144
+
145
+ rb_define_alloc_func(rbffi_StructByValueClass, sbv_allocate);
146
+ rb_define_method(rbffi_StructByValueClass, "initialize", sbv_initialize, 1);
147
+ rb_define_method(rbffi_StructByValueClass, "layout", sbv_layout, 0);
148
+ rb_define_method(rbffi_StructByValueClass, "struct_class", sbv_struct_class, 0);
149
+ }
150
+