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,47 @@
1
+ /*
2
+ * Copyright (c) 2008, 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 RBFFI_LASTERROR_H
31
+ #define RBFFI_LASTERROR_H
32
+
33
+ #ifdef __cplusplus
34
+ extern "C" {
35
+ #endif
36
+
37
+
38
+ void rbffi_LastError_Init(VALUE moduleFFI);
39
+
40
+ void rbffi_save_errno(void);
41
+
42
+ #ifdef __cplusplus
43
+ }
44
+ #endif
45
+
46
+ #endif /* RBFFI_LASTERROR_H */
47
+
@@ -0,0 +1,63 @@
1
+ #include "LongDouble.h"
2
+ #include <stdio.h>
3
+ #include <stdarg.h>
4
+ #include <float.h>
5
+
6
+ #if defined (__CYGWIN__) || defined(__INTERIX)
7
+ # define strtold(str, endptr) ((long double) strtod((str), (endptr)))
8
+ #endif /* defined (__CYGWIN__) */
9
+
10
+ static VALUE rb_cBigDecimal = Qnil;
11
+ static VALUE bigdecimal_load(VALUE unused);
12
+ static VALUE bigdecimal_failed(VALUE value);
13
+
14
+ VALUE
15
+ rbffi_longdouble_new(long double ld)
16
+ {
17
+ if (!RTEST(rb_cBigDecimal)) {
18
+ /* allow fallback if the bigdecimal library is unavailable in future ruby versions */
19
+ rb_cBigDecimal = rb_rescue(bigdecimal_load, Qnil, bigdecimal_failed, rb_cObject);
20
+ }
21
+
22
+ if (RTEST(rb_cBigDecimal) && rb_cBigDecimal != rb_cObject) {
23
+ char buf[128];
24
+ return rb_funcall(rb_cBigDecimal, rb_intern("new"), 1, rb_str_new(buf, sprintf(buf, "%.35Le", ld)));
25
+ }
26
+
27
+ /* Fall through to handling as a float */
28
+ return rb_float_new(ld);
29
+ }
30
+
31
+ long double
32
+ rbffi_num2longdouble(VALUE value)
33
+ {
34
+ if (TYPE(value) == T_FLOAT) {
35
+ return rb_num2dbl(value);
36
+ }
37
+
38
+ if (!RTEST(rb_cBigDecimal) && rb_const_defined(rb_cObject, rb_intern("BigDecimal"))) {
39
+ rb_cBigDecimal = rb_const_get(rb_cObject, rb_intern("BigDecimal"));
40
+ }
41
+
42
+ if (RTEST(rb_cBigDecimal) && rb_cBigDecimal != rb_cObject && RTEST(rb_obj_is_kind_of(value, rb_cBigDecimal))) {
43
+ VALUE s = rb_funcall(value, rb_intern("to_s"), 1, rb_str_new2("E"));
44
+ return strtold(RSTRING_PTR(s), NULL);
45
+ }
46
+
47
+ /* Fall through to handling as a float */
48
+ return rb_num2dbl(value);
49
+ }
50
+
51
+
52
+ static VALUE
53
+ bigdecimal_load(VALUE unused)
54
+ {
55
+ rb_require("bigdecimal");
56
+ return rb_const_get(rb_cObject, rb_intern("BigDecimal"));
57
+ }
58
+
59
+ static VALUE
60
+ bigdecimal_failed(VALUE value)
61
+ {
62
+ return value;
63
+ }
@@ -0,0 +1,51 @@
1
+ /*
2
+ * Copyright (c) 2012, 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 RBFFI_LONGDOUBLE_H
31
+ #define RBFFI_LONGDOUBLE_H
32
+
33
+ #include <ruby.h>
34
+
35
+ #ifdef __cplusplus
36
+ extern "C" {
37
+ #endif
38
+
39
+ #ifdef _MSC_VER
40
+ #define strtold strtod
41
+ #endif
42
+
43
+ extern VALUE rbffi_longdouble_new(long double ld);
44
+ extern long double rbffi_num2longdouble(VALUE value);
45
+
46
+ #ifdef __cplusplus
47
+ }
48
+ #endif
49
+
50
+ #endif /* RBFFI_LONGDOUBLE_H */
51
+
@@ -0,0 +1,168 @@
1
+ /*
2
+ * Copyright (c) 2010, 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
+ #include <ruby.h>
31
+
32
+ #include <ffi.h>
33
+ #include "rbffi.h"
34
+
35
+ #include "Type.h"
36
+ #include "MappedType.h"
37
+
38
+
39
+ static VALUE mapped_allocate(VALUE);
40
+ static VALUE mapped_initialize(VALUE, VALUE);
41
+ static void mapped_mark(MappedType *);
42
+ static ID id_native_type, id_to_native, id_from_native;
43
+
44
+ VALUE rbffi_MappedTypeClass = Qnil;
45
+
46
+ static VALUE
47
+ mapped_allocate(VALUE klass)
48
+ {
49
+ MappedType* m;
50
+
51
+ VALUE obj = Data_Make_Struct(klass, MappedType, mapped_mark, -1, m);
52
+
53
+ m->rbConverter = Qnil;
54
+ m->rbType = Qnil;
55
+ m->type = NULL;
56
+ m->base.nativeType = NATIVE_MAPPED;
57
+ m->base.ffiType = &ffi_type_void;
58
+
59
+ return obj;
60
+ }
61
+
62
+ /*
63
+ * call-seq: initialize(converter)
64
+ * @param [#native_type, #to_native, #from_native] converter +converter+ must respond to
65
+ * all these methods
66
+ * @return [self]
67
+ */
68
+ static VALUE
69
+ mapped_initialize(VALUE self, VALUE rbConverter)
70
+ {
71
+ MappedType* m = NULL;
72
+
73
+ if (!rb_respond_to(rbConverter, id_native_type)) {
74
+ rb_raise(rb_eNoMethodError, "native_type method not implemented");
75
+ }
76
+
77
+ if (!rb_respond_to(rbConverter, id_to_native)) {
78
+ rb_raise(rb_eNoMethodError, "to_native method not implemented");
79
+ }
80
+
81
+ if (!rb_respond_to(rbConverter, id_from_native)) {
82
+ rb_raise(rb_eNoMethodError, "from_native method not implemented");
83
+ }
84
+
85
+ Data_Get_Struct(self, MappedType, m);
86
+ m->rbType = rb_funcall2(rbConverter, id_native_type, 0, NULL);
87
+ if (!(rb_obj_is_kind_of(m->rbType, rbffi_TypeClass))) {
88
+ rb_raise(rb_eTypeError, "native_type did not return instance of FFI::Type");
89
+ }
90
+
91
+ m->rbConverter = rbConverter;
92
+ Data_Get_Struct(m->rbType, Type, m->type);
93
+ m->base.ffiType = m->type->ffiType;
94
+
95
+ return self;
96
+ }
97
+
98
+ static void
99
+ mapped_mark(MappedType* m)
100
+ {
101
+ rb_gc_mark(m->rbType);
102
+ rb_gc_mark(m->rbConverter);
103
+ }
104
+
105
+ /*
106
+ * call-seq: mapped_type.native_type
107
+ * @return [Type]
108
+ * Get native type of mapped type.
109
+ */
110
+ static VALUE
111
+ mapped_native_type(VALUE self)
112
+ {
113
+ MappedType*m = NULL;
114
+ Data_Get_Struct(self, MappedType, m);
115
+
116
+ return m->rbType;
117
+ }
118
+
119
+ /*
120
+ * call-seq: mapped_type.to_native(*args)
121
+ * @param args depends on {FFI::DataConverter} used to initialize +self+
122
+ */
123
+ static VALUE
124
+ mapped_to_native(int argc, VALUE* argv, VALUE self)
125
+ {
126
+ MappedType*m = NULL;
127
+
128
+ Data_Get_Struct(self, MappedType, m);
129
+
130
+ return rb_funcall2(m->rbConverter, id_to_native, argc, argv);
131
+ }
132
+
133
+ /*
134
+ * call-seq: mapped_type.from_native(*args)
135
+ * @param args depends on {FFI::DataConverter} used to initialize +self+
136
+ */
137
+ static VALUE
138
+ mapped_from_native(int argc, VALUE* argv, VALUE self)
139
+ {
140
+ MappedType*m = NULL;
141
+
142
+ Data_Get_Struct(self, MappedType, m);
143
+
144
+ return rb_funcall2(m->rbConverter, id_from_native, argc, argv);
145
+ }
146
+
147
+ void
148
+ rbffi_MappedType_Init(VALUE moduleFFI)
149
+ {
150
+ /*
151
+ * Document-class: FFI::Type::Mapped < FFI::Type
152
+ */
153
+ rbffi_MappedTypeClass = rb_define_class_under(rbffi_TypeClass, "Mapped", rbffi_TypeClass);
154
+
155
+ rb_global_variable(&rbffi_MappedTypeClass);
156
+
157
+ id_native_type = rb_intern("native_type");
158
+ id_to_native = rb_intern("to_native");
159
+ id_from_native = rb_intern("from_native");
160
+
161
+ rb_define_alloc_func(rbffi_MappedTypeClass, mapped_allocate);
162
+ rb_define_method(rbffi_MappedTypeClass, "initialize", mapped_initialize, 1);
163
+ rb_define_method(rbffi_MappedTypeClass, "type", mapped_native_type, 0);
164
+ rb_define_method(rbffi_MappedTypeClass, "native_type", mapped_native_type, 0);
165
+ rb_define_method(rbffi_MappedTypeClass, "to_native", mapped_to_native, -1);
166
+ rb_define_method(rbffi_MappedTypeClass, "from_native", mapped_from_native, -1);
167
+ }
168
+
@@ -0,0 +1,59 @@
1
+ /*
2
+ * Copyright (c) 2010, 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 RBFFI_MAPPEDTYPE_H
31
+ #define RBFFI_MAPPEDTYPE_H
32
+
33
+
34
+ #include <ruby.h>
35
+
36
+ #ifdef __cplusplus
37
+ extern "C" {
38
+ #endif
39
+
40
+
41
+ typedef struct MappedType_ {
42
+ Type base;
43
+ Type* type;
44
+ VALUE rbConverter;
45
+ VALUE rbType;
46
+
47
+ } MappedType;
48
+
49
+ void rbffi_MappedType_Init(VALUE moduleFFI);
50
+
51
+ extern VALUE rbffi_MappedTypeClass;
52
+
53
+
54
+ #ifdef __cplusplus
55
+ }
56
+ #endif
57
+
58
+ #endif /* RBFFI_MAPPEDTYPE_H */
59
+
@@ -0,0 +1,197 @@
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 _MSC_VER
32
+ # include <stdbool.h>
33
+ # include <stdint.h>
34
+ #else
35
+ # include "win32/stdbool.h"
36
+ # include "win32/stdint.h"
37
+ #endif
38
+ #include <limits.h>
39
+ #include <ruby.h>
40
+ #include "rbffi.h"
41
+ #include "AbstractMemory.h"
42
+ #include "Pointer.h"
43
+ #include "MemoryPointer.h"
44
+
45
+
46
+ static VALUE memptr_allocate(VALUE klass);
47
+ static void memptr_release(Pointer* ptr);
48
+ static VALUE memptr_malloc(VALUE self, long size, long count, bool clear);
49
+ static VALUE memptr_free(VALUE self);
50
+
51
+ VALUE rbffi_MemoryPointerClass;
52
+
53
+ #define MEMPTR(obj) ((MemoryPointer *) rbffi_AbstractMemory_Cast(obj, rbffi_MemoryPointerClass))
54
+
55
+ VALUE
56
+ rbffi_MemoryPointer_NewInstance(long size, long count, bool clear)
57
+ {
58
+ return memptr_malloc(memptr_allocate(rbffi_MemoryPointerClass), size, count, clear);
59
+ }
60
+
61
+ static VALUE
62
+ memptr_allocate(VALUE klass)
63
+ {
64
+ Pointer* p;
65
+ VALUE obj = Data_Make_Struct(klass, Pointer, NULL, memptr_release, p);
66
+ p->rbParent = Qnil;
67
+ p->memory.flags = MEM_RD | MEM_WR;
68
+
69
+ return obj;
70
+ }
71
+
72
+ /*
73
+ * call-seq: initialize(size, count=1, clear=true)
74
+ * @param [Fixnum, Bignum, Symbol, FFI::Type] size size of a memory cell (in bytes, or type whom size will be used)
75
+ * @param [Numeric] count number of cells in memory
76
+ * @param [Boolean] clear set memory to all-zero if +true+
77
+ * @return [self]
78
+ * A new instance of FFI::MemoryPointer.
79
+ */
80
+ static VALUE
81
+ memptr_initialize(int argc, VALUE* argv, VALUE self)
82
+ {
83
+ VALUE size = Qnil, count = Qnil, clear = Qnil;
84
+ int nargs = rb_scan_args(argc, argv, "12", &size, &count, &clear);
85
+
86
+ memptr_malloc(self, rbffi_type_size(size), nargs > 1 ? NUM2LONG(count) : 1,
87
+ RTEST(clear) || clear == Qnil);
88
+
89
+ if (rb_block_given_p()) {
90
+ return rb_ensure(rb_yield, self, memptr_free, self);
91
+ }
92
+
93
+ return self;
94
+ }
95
+
96
+ static VALUE
97
+ memptr_malloc(VALUE self, long size, long count, bool clear)
98
+ {
99
+ Pointer* p;
100
+ unsigned long msize;
101
+
102
+ Data_Get_Struct(self, Pointer, p);
103
+
104
+ msize = size * count;
105
+
106
+ p->storage = xmalloc(msize + 7);
107
+ if (p->storage == NULL) {
108
+ rb_raise(rb_eNoMemError, "Failed to allocate memory size=%ld bytes", msize);
109
+ return Qnil;
110
+ }
111
+ p->autorelease = true;
112
+ p->memory.typeSize = (int) size;
113
+ p->memory.size = msize;
114
+ /* ensure the memory is aligned on at least a 8 byte boundary */
115
+ p->memory.address = (char *) (((uintptr_t) p->storage + 0x7) & (uintptr_t) ~0x7UL);;
116
+ p->allocated = true;
117
+
118
+ if (clear && p->memory.size > 0) {
119
+ memset(p->memory.address, 0, p->memory.size);
120
+ }
121
+
122
+ return self;
123
+ }
124
+
125
+ static VALUE
126
+ memptr_free(VALUE self)
127
+ {
128
+ Pointer* ptr;
129
+
130
+ Data_Get_Struct(self, Pointer, ptr);
131
+
132
+ if (ptr->allocated) {
133
+ if (ptr->storage != NULL) {
134
+ xfree(ptr->storage);
135
+ ptr->storage = NULL;
136
+ }
137
+ ptr->allocated = false;
138
+ }
139
+
140
+ return self;
141
+ }
142
+
143
+ static void
144
+ memptr_release(Pointer* ptr)
145
+ {
146
+ if (ptr->autorelease && ptr->allocated && ptr->storage != NULL) {
147
+ xfree(ptr->storage);
148
+ ptr->storage = NULL;
149
+ }
150
+ xfree(ptr);
151
+ }
152
+
153
+ /*
154
+ * call-seq: from_string(s)
155
+ * @param [String] s string
156
+ * @return [MemoryPointer]
157
+ * Create a {MemoryPointer} with +s+ inside.
158
+ */
159
+ static VALUE
160
+ memptr_s_from_string(VALUE klass, VALUE to_str)
161
+ {
162
+ VALUE s = StringValue(to_str);
163
+ VALUE args[] = { INT2FIX(1), LONG2NUM(RSTRING_LEN(s) + 1), Qfalse };
164
+ VALUE obj = rb_class_new_instance(3, args, klass);
165
+ rb_funcall(obj, rb_intern("put_string"), 2, INT2FIX(0), s);
166
+
167
+ return obj;
168
+ }
169
+
170
+ void
171
+ rbffi_MemoryPointer_Init(VALUE moduleFFI)
172
+ {
173
+ VALUE ffi_Pointer;
174
+
175
+ ffi_Pointer = rbffi_PointerClass;
176
+
177
+ /*
178
+ * Document-class: FFI::MemoryPointer < FFI::Pointer
179
+ * A MemoryPointer is a specific {Pointer}. It points to a memory composed of cells. All cells have the
180
+ * same size.
181
+ *
182
+ * @example Create a new MemoryPointer
183
+ * mp = FFI::MemoryPointer.new(:long, 16) # Create a pointer on a memory of 16 long ints.
184
+ * @example Create a new MemoryPointer from a String
185
+ * mp1 = FFI::MemoryPointer.from_string("this is a string")
186
+ * # same as:
187
+ * mp2 = FFI::MemoryPointer.new(:char,16)
188
+ * mp2.put_string("this is a string")
189
+ */
190
+ rbffi_MemoryPointerClass = rb_define_class_under(moduleFFI, "MemoryPointer", ffi_Pointer);
191
+ rb_global_variable(&rbffi_MemoryPointerClass);
192
+
193
+ rb_define_alloc_func(rbffi_MemoryPointerClass, memptr_allocate);
194
+ rb_define_method(rbffi_MemoryPointerClass, "initialize", memptr_initialize, -1);
195
+ rb_define_singleton_method(rbffi_MemoryPointerClass, "from_string", memptr_s_from_string, 1);
196
+ }
197
+