ffi 0.5.4 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of ffi might be problematic. Click here for more details.

Files changed (203) hide show
  1. data/LICENSE +1 -27
  2. data/Rakefile +2 -11
  3. data/ext/ffi_c/AbstractMemory.c +6 -8
  4. data/ext/ffi_c/AbstractMemory.h +23 -21
  5. data/ext/ffi_c/AutoPointer.c +0 -1
  6. data/ext/ffi_c/Buffer.c +23 -8
  7. data/ext/ffi_c/Call.c +28 -0
  8. data/ext/ffi_c/Call.h +5 -1
  9. data/ext/ffi_c/DynamicLibrary.c +0 -1
  10. data/ext/ffi_c/Function.c +19 -2
  11. data/ext/ffi_c/MemoryPointer.c +2 -3
  12. data/ext/ffi_c/Pointer.c +23 -9
  13. data/ext/ffi_c/Struct.c +142 -69
  14. data/ext/ffi_c/Struct.h +16 -7
  15. data/ext/ffi_c/StructLayout.c +92 -55
  16. data/ext/ffi_c/Type.c +5 -22
  17. data/ext/ffi_c/Type.h +1 -1
  18. data/ext/ffi_c/Types.c +8 -2
  19. data/ext/ffi_c/Types.h +2 -0
  20. data/ext/ffi_c/extconf.rb +11 -7
  21. data/ext/ffi_c/libffi/ChangeLog +900 -84
  22. data/ext/ffi_c/libffi/ChangeLog.libffi +311 -0
  23. data/ext/ffi_c/libffi/LICENSE +1 -1
  24. data/ext/ffi_c/libffi/Makefile.am +14 -4
  25. data/ext/ffi_c/libffi/Makefile.in +362 -211
  26. data/ext/ffi_c/libffi/README +70 -92
  27. data/ext/ffi_c/libffi/aclocal.m4 +6068 -4586
  28. data/ext/ffi_c/libffi/config.guess +125 -143
  29. data/ext/ffi_c/libffi/config.sub +103 -27
  30. data/ext/ffi_c/libffi/configure +11364 -18497
  31. data/ext/ffi_c/libffi/configure.ac +43 -4
  32. data/ext/ffi_c/libffi/doc/libffi.info +15 -15
  33. data/ext/ffi_c/libffi/doc/libffi.texi +1 -1
  34. data/ext/ffi_c/libffi/doc/stamp-vti +4 -4
  35. data/ext/ffi_c/libffi/doc/version.texi +4 -4
  36. data/ext/ffi_c/libffi/fficonfig.h.in +24 -3
  37. data/ext/ffi_c/libffi/include/Makefile.am +1 -1
  38. data/ext/ffi_c/libffi/include/Makefile.in +97 -50
  39. data/ext/ffi_c/libffi/include/ffi.h.in +8 -2
  40. data/ext/ffi_c/libffi/include/ffi_common.h +24 -0
  41. data/ext/ffi_c/libffi/libtool-version +1 -1
  42. data/ext/ffi_c/libffi/ltmain.sh +7346 -5870
  43. data/ext/ffi_c/libffi/m4/libtool.m4 +7360 -0
  44. data/ext/ffi_c/libffi/m4/ltoptions.m4 +368 -0
  45. data/ext/ffi_c/libffi/m4/ltsugar.m4 +123 -0
  46. data/ext/ffi_c/libffi/m4/ltversion.m4 +23 -0
  47. data/ext/ffi_c/libffi/m4/lt~obsolete.m4 +92 -0
  48. data/ext/ffi_c/libffi/man/Makefile.in +115 -62
  49. data/ext/ffi_c/libffi/man/ffi_call.3 +3 -3
  50. data/ext/ffi_c/libffi/missing +15 -8
  51. data/ext/ffi_c/libffi/src/arm/sysv.S +15 -8
  52. data/ext/ffi_c/libffi/src/avr32/ffi.c +421 -0
  53. data/ext/ffi_c/libffi/src/avr32/ffitarget.h +50 -0
  54. data/ext/ffi_c/libffi/src/avr32/sysv.S +208 -0
  55. data/ext/ffi_c/libffi/src/closures.c +47 -10
  56. data/ext/ffi_c/libffi/src/frv/ffi.c +1 -1
  57. data/ext/ffi_c/libffi/src/java_raw_api.c +0 -3
  58. data/ext/ffi_c/libffi/src/mips/ffi.c +135 -32
  59. data/ext/ffi_c/libffi/src/mips/ffitarget.h +37 -4
  60. data/ext/ffi_c/libffi/src/mips/n32.S +67 -10
  61. data/ext/ffi_c/libffi/src/mips/o32.S +8 -8
  62. data/ext/ffi_c/libffi/src/pa/ffi.c +7 -0
  63. data/ext/ffi_c/libffi/src/powerpc/aix.S +163 -64
  64. data/ext/ffi_c/libffi/src/powerpc/aix_closure.S +308 -112
  65. data/ext/ffi_c/libffi/src/powerpc/ffi.c +20 -7
  66. data/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +208 -80
  67. data/ext/ffi_c/libffi/src/powerpc/ffitarget.h +11 -3
  68. data/ext/ffi_c/libffi/src/powerpc/sysv.S +12 -23
  69. data/ext/ffi_c/libffi/src/s390/sysv.S +1 -1
  70. data/ext/ffi_c/libffi/src/sh/sysv.S +9 -9
  71. data/ext/ffi_c/libffi/src/sh64/ffi.c +37 -22
  72. data/ext/ffi_c/libffi/src/sh64/sysv.S +23 -14
  73. data/ext/ffi_c/libffi/src/sparc/ffi.c +21 -6
  74. data/ext/ffi_c/libffi/src/sparc/v8.S +55 -14
  75. data/ext/ffi_c/libffi/src/x86/darwin.S +10 -9
  76. data/ext/ffi_c/libffi/src/x86/ffi.c +293 -86
  77. data/ext/ffi_c/libffi/src/x86/ffi64.c +73 -19
  78. data/ext/ffi_c/libffi/src/x86/ffitarget.h +30 -0
  79. data/ext/ffi_c/libffi/src/x86/sysv.S +21 -4
  80. data/ext/ffi_c/libffi/src/x86/unix64.S +8 -4
  81. data/ext/ffi_c/libffi/src/x86/win32.S +633 -147
  82. data/ext/ffi_c/libffi/src/x86/win64.S +460 -0
  83. data/ext/ffi_c/libffi/testsuite/Makefile.am +63 -54
  84. data/ext/ffi_c/libffi/testsuite/Makefile.in +112 -77
  85. data/ext/ffi_c/libffi/testsuite/lib/libffi-dg.exp +12 -1
  86. data/ext/ffi_c/libffi/testsuite/libffi.call/call.exp +4 -4
  87. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn0.c +7 -15
  88. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn1.c +7 -15
  89. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn2.c +7 -15
  90. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn3.c +7 -15
  91. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn4.c +7 -15
  92. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn5.c +7 -14
  93. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn6.c +7 -15
  94. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_loc_fn0.c +95 -0
  95. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_stdcall.c +6 -14
  96. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_12byte.c +4 -12
  97. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_16byte.c +4 -12
  98. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_18byte.c +4 -12
  99. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_19byte.c +4 -12
  100. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_1_1byte.c +4 -12
  101. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte.c +4 -12
  102. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte1.c +4 -12
  103. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_24byte.c +4 -12
  104. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_2byte.c +4 -12
  105. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3_1byte.c +4 -12
  106. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte1.c +4 -12
  107. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte2.c +4 -12
  108. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4_1byte.c +4 -12
  109. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4byte.c +4 -12
  110. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5_1_byte.c +4 -12
  111. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5byte.c +4 -12
  112. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_64byte.c +4 -12
  113. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6_1_byte.c +4 -12
  114. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6byte.c +4 -12
  115. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7_1_byte.c +4 -12
  116. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7byte.c +4 -12
  117. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_8byte.c +4 -12
  118. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte1.c +4 -12
  119. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte2.c +4 -12
  120. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_double.c +4 -12
  121. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_float.c +4 -12
  122. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble.c +4 -12
  123. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split.c +134 -0
  124. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split2.c +117 -0
  125. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_pointer.c +11 -17
  126. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint16.c +4 -12
  127. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint32.c +4 -12
  128. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint64.c +7 -15
  129. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint16.c +4 -12
  130. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint32.c +4 -12
  131. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint64.c +7 -15
  132. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_dbls_struct.c +66 -0
  133. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_double.c +4 -12
  134. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_double_va.c +57 -0
  135. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_float.c +4 -13
  136. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble.c +105 -0
  137. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble_va.c +57 -0
  138. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_schar.c +4 -12
  139. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshort.c +4 -12
  140. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshortchar.c +4 -12
  141. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_uchar.c +4 -12
  142. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushort.c +4 -12
  143. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushortchar.c +4 -12
  144. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer.c +74 -0
  145. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer_stack.c +140 -0
  146. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_schar.c +4 -12
  147. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_sint.c +4 -12
  148. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_sshort.c +4 -12
  149. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uchar.c +4 -12
  150. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uint.c +4 -12
  151. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulonglong.c +8 -16
  152. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ushort.c +4 -12
  153. data/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_abi.c +37 -0
  154. data/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_typedef.c +25 -0
  155. data/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h +31 -0
  156. data/ext/ffi_c/libffi/testsuite/libffi.call/float2.c +2 -1
  157. data/ext/ffi_c/libffi/testsuite/libffi.call/huge_struct.c +342 -0
  158. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct.c +4 -12
  159. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct1.c +4 -12
  160. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct10.c +4 -12
  161. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct2.c +4 -12
  162. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct3.c +4 -12
  163. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct4.c +4 -12
  164. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct5.c +4 -12
  165. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct6.c +4 -12
  166. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct7.c +4 -12
  167. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct8.c +4 -12
  168. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct9.c +4 -12
  169. data/ext/ffi_c/libffi/testsuite/libffi.call/problem1.c +4 -12
  170. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ldl.c +1 -1
  171. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ll1.c +1 -1
  172. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_large.c +145 -0
  173. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_large2.c +148 -0
  174. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium.c +124 -0
  175. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium2.c +124 -0
  176. data/ext/ffi_c/libffi/testsuite/libffi.call/testclosure.c +70 -0
  177. data/ext/ffi_c/libffi/testsuite/libffi.special/ffitestcxx.h +10 -0
  178. data/ext/ffi_c/libffi/testsuite/libffi.special/special.exp +4 -5
  179. data/ext/ffi_c/libffi/testsuite/libffi.special/unwindtest.cc +17 -16
  180. data/ext/ffi_c/libffi/texinfo.tex +155 -427
  181. data/lib/ffi/autopointer.rb +79 -20
  182. data/lib/ffi/callback.rb +4 -10
  183. data/lib/ffi/enum.rb +28 -0
  184. data/lib/ffi/io.rb +28 -0
  185. data/lib/ffi/library.rb +237 -182
  186. data/lib/ffi/memorypointer.rb +28 -62
  187. data/lib/ffi/platform.rb +27 -0
  188. data/lib/ffi/pointer.rb +28 -0
  189. data/lib/ffi/struct.rb +55 -1
  190. data/lib/ffi/types.rb +29 -0
  191. data/lib/ffi/variadic.rb +29 -0
  192. data/spec/ffi/library_spec.rb +31 -5
  193. data/spec/ffi/rbx/attach_function_spec.rb +2 -1
  194. data/spec/ffi/rbx/memory_pointer_spec.rb +2 -1
  195. data/spec/ffi/spec_helper.rb +5 -1
  196. data/spec/ffi/struct_spec.rb +64 -0
  197. metadata +28 -8
  198. data/ext/ffi_c/libffi/TODO +0 -1
  199. data/ext/ffi_c/libffi/ltcf-c.sh +0 -861
  200. data/ext/ffi_c/libffi/ltcf-cxx.sh +0 -1069
  201. data/ext/ffi_c/libffi/ltcf-gcj.sh +0 -700
  202. data/ext/ffi_c/libffi/ltconfig +0 -2862
  203. data/ext/ffi_c/libffi/mkinstalldirs +0 -158
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2008, JRuby Project
1
+ Copyright (c) 2008, 2009 Ruby FFI contributors
2
2
  All rights reserved.
3
3
 
4
4
  Redistribution and use in source and binary forms, with or without
@@ -23,29 +23,3 @@ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
23
23
  CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24
24
  OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25
25
  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26
-
27
- Copyright (c) 2007, Evan Phoenix
28
- All rights reserved.
29
-
30
- Redistribution and use in source and binary forms, with or without
31
- modification, are permitted provided that the following conditions are met:
32
-
33
- * Redistributions of source code must retain the above copyright notice, this
34
- list of conditions and the following disclaimer.
35
- * Redistributions in binary form must reproduce the above copyright notice
36
- this list of conditions and the following disclaimer in the documentation
37
- and/or other materials provided with the distribution.
38
- * Neither the name of the Evan Phoenix nor the names of its contributors
39
- may be used to endorse or promote products derived from this software
40
- without specific prior written permission.
41
-
42
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
43
- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
44
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
45
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
46
- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
47
- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
48
- SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
49
- CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
50
- OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
51
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
data/Rakefile CHANGED
@@ -12,16 +12,7 @@ require 'date'
12
12
  require 'fileutils'
13
13
  require 'rbconfig'
14
14
 
15
- begin
16
- require 'bones'
17
- Bones.setup
18
- rescue LoadError
19
- begin
20
- load 'tasks/setup.rb'
21
- rescue LoadError
22
- raise RuntimeError, '### please install the "bones" gem ###'
23
- end
24
- end
15
+ load 'tasks/setup.rb'
25
16
 
26
17
  LIBEXT = case Config::CONFIG['host_os'].downcase
27
18
  when /darwin/
@@ -84,7 +75,7 @@ PROJ.name = 'ffi'
84
75
  PROJ.authors = 'Wayne Meissner'
85
76
  PROJ.email = 'wmeissner@gmail.com'
86
77
  PROJ.url = 'http://wiki.github.com/ffi/ffi'
87
- PROJ.version = '0.5.4'
78
+ PROJ.version = '0.6.0'
88
79
  PROJ.rubyforge.name = 'ffi'
89
80
  PROJ.readme_file = 'README.rdoc'
90
81
 
@@ -49,7 +49,6 @@ memory_allocate(VALUE klass)
49
49
  AbstractMemory* memory;
50
50
  VALUE obj;
51
51
  obj = Data_Make_Struct(klass, AbstractMemory, NULL, -1, memory);
52
- memory->ops = &rbffi_AbstractMemoryOps;
53
52
  memory->access = MEM_RD | MEM_WR;
54
53
 
55
54
  return obj;
@@ -137,6 +136,8 @@ NUM_OP(int32, int32_t, NUM2INT, INT2NUM);
137
136
  NUM_OP(uint32, uint32_t, NUM2UINT, UINT2NUM);
138
137
  NUM_OP(int64, int64_t, NUM2LL, LL2NUM);
139
138
  NUM_OP(uint64, uint64_t, NUM2ULL, ULL2NUM);
139
+ NUM_OP(long, long, NUM2LONG, LONG2NUM);
140
+ NUM_OP(ulong, unsigned long, NUM2ULONG, ULONG2NUM);
140
141
  NUM_OP(float32, float, NUM2DBL, rb_float_new);
141
142
  NUM_OP(float64, double, NUM2DBL, rb_float_new);
142
143
 
@@ -227,7 +228,7 @@ memory_get_array_of_string(int argc, VALUE* argv, VALUE self)
227
228
 
228
229
  } else {
229
230
  checkBounds(ptr, off, sizeof (char*));
230
- for ( ; off < ptr->size - sizeof (void *); off += sizeof (void *)) {
231
+ for ( ; off < ptr->size - (long) sizeof (void *); off += (long) sizeof (void *)) {
231
232
  const char* strptr = *(const char**) (ptr->address + off);
232
233
  if (strptr == NULL) {
233
234
  break;
@@ -400,6 +401,8 @@ MemoryOps rbffi_AbstractMemoryOps = {
400
401
  .uint32 = &memory_op_uint32,
401
402
  .int64 = &memory_op_int64,
402
403
  .uint64 = &memory_op_uint64,
404
+ .slong = &memory_op_long,
405
+ .ulong = &memory_op_ulong,
403
406
  .float32 = &memory_op_float32,
404
407
  .float64 = &memory_op_float64,
405
408
  .pointer = &memory_op_pointer,
@@ -433,6 +436,7 @@ rbffi_AbstractMemory_Init(VALUE moduleFFI)
433
436
  INT(int16);
434
437
  INT(int32);
435
438
  INT(int64);
439
+ INT(long);
436
440
 
437
441
  #define ALIAS(name, old) \
438
442
  rb_define_alias(classMemory, "put_" #name, "put_" #old); \
@@ -449,12 +453,6 @@ rbffi_AbstractMemory_Init(VALUE moduleFFI)
449
453
  ALIAS(int, int32);
450
454
  ALIAS(long_long, int64);
451
455
 
452
- if (sizeof(long) == 4) {
453
- ALIAS(long, int32);
454
- } else {
455
- ALIAS(long, int64);
456
- }
457
-
458
456
  rb_define_method(classMemory, "put_float32", memory_put_float32, 2);
459
457
  rb_define_method(classMemory, "get_float32", memory_get_float32, 1);
460
458
  rb_define_alias(classMemory, "put_float", "put_float32");
@@ -61,6 +61,8 @@ typedef struct {
61
61
  MemoryOp* uint32;
62
62
  MemoryOp* int64;
63
63
  MemoryOp* uint64;
64
+ MemoryOp* slong;
65
+ MemoryOp* ulong;
64
66
  MemoryOp* float32;
65
67
  MemoryOp* float64;
66
68
  MemoryOp* pointer;
@@ -72,9 +74,12 @@ struct AbstractMemory_ {
72
74
  long size;
73
75
  int access;
74
76
  int typeSize;
75
- MemoryOps* ops;
76
77
  };
77
78
 
79
+
80
+ extern VALUE rbffi_AbstractMemoryClass;
81
+ extern MemoryOps rbffi_AbstractMemoryOps;
82
+
78
83
  extern void rbffi_AbstractMemory_Init(VALUE ffiModule);
79
84
 
80
85
  extern AbstractMemory* rbffi_AbstractMemory_Cast(VALUE obj, VALUE klass);
@@ -107,36 +112,37 @@ checkWrite(AbstractMemory* mem)
107
112
  }
108
113
 
109
114
  static inline MemoryOp*
110
- memory_get_op(AbstractMemory* ptr, Type* type)
115
+ get_memory_op(Type* type)
111
116
  {
112
- if (ptr == NULL || ptr->ops == NULL || type == NULL) {
113
- return NULL;
114
- }
115
117
  switch (type->nativeType) {
116
118
  case NATIVE_INT8:
117
- return ptr->ops->int8;
119
+ return rbffi_AbstractMemoryOps.int8;
118
120
  case NATIVE_UINT8:
119
- return ptr->ops->uint8;
121
+ return rbffi_AbstractMemoryOps.uint8;
120
122
  case NATIVE_INT16:
121
- return ptr->ops->int16;
123
+ return rbffi_AbstractMemoryOps.int16;
122
124
  case NATIVE_UINT16:
123
- return ptr->ops->uint16;
125
+ return rbffi_AbstractMemoryOps.uint16;
124
126
  case NATIVE_INT32:
125
- return ptr->ops->int32;
127
+ return rbffi_AbstractMemoryOps.int32;
126
128
  case NATIVE_UINT32:
127
- return ptr->ops->uint32;
129
+ return rbffi_AbstractMemoryOps.uint32;
128
130
  case NATIVE_INT64:
129
- return ptr->ops->int64;
131
+ return rbffi_AbstractMemoryOps.int64;
130
132
  case NATIVE_UINT64:
131
- return ptr->ops->uint64;
133
+ return rbffi_AbstractMemoryOps.uint64;
134
+ case NATIVE_LONG:
135
+ return rbffi_AbstractMemoryOps.slong;
136
+ case NATIVE_ULONG:
137
+ return rbffi_AbstractMemoryOps.ulong;
132
138
  case NATIVE_FLOAT32:
133
- return ptr->ops->float32;
139
+ return rbffi_AbstractMemoryOps.float32;
134
140
  case NATIVE_FLOAT64:
135
- return ptr->ops->float64;
141
+ return rbffi_AbstractMemoryOps.float64;
136
142
  case NATIVE_POINTER:
137
- return ptr->ops->pointer;
143
+ return rbffi_AbstractMemoryOps.pointer;
138
144
  case NATIVE_STRING:
139
- return ptr->ops->strptr;
145
+ return rbffi_AbstractMemoryOps.strptr;
140
146
  default:
141
147
  return NULL;
142
148
  }
@@ -148,10 +154,6 @@ memory_get_op(AbstractMemory* ptr, Type* type)
148
154
 
149
155
 
150
156
 
151
- extern VALUE rbffi_AbstractMemoryClass;
152
- extern MemoryOps rbffi_AbstractMemoryOps;
153
-
154
-
155
157
  #ifdef __cplusplus
156
158
  }
157
159
  #endif
@@ -25,7 +25,6 @@ autoptr_allocate(VALUE klass)
25
25
  AutoPointer* p;
26
26
  VALUE obj = Data_Make_Struct(klass, AutoPointer, autoptr_mark, -1, p);
27
27
  p->parent = Qnil;
28
- p->memory.ops = &rbffi_AbstractMemoryOps;
29
28
  p->memory.access = MEM_RD | MEM_WR;
30
29
 
31
30
  return obj;
@@ -54,7 +54,6 @@ buffer_allocate(VALUE klass)
54
54
 
55
55
  obj = Data_Make_Struct(klass, Buffer, NULL, buffer_release, buffer);
56
56
  buffer->rbParent = Qnil;
57
- buffer->memory.ops = &rbffi_AbstractMemoryOps;
58
57
  buffer->memory.access = MEM_RD | MEM_WR;
59
58
 
60
59
  return obj;
@@ -111,20 +110,18 @@ buffer_alloc_inout(int argc, VALUE* argv, VALUE klass)
111
110
  }
112
111
 
113
112
  static VALUE
114
- buffer_plus(VALUE self, VALUE rbOffset)
113
+ slice(VALUE self, long offset, long len)
115
114
  {
116
115
  Buffer* ptr;
117
116
  Buffer* result;
118
117
  VALUE obj = Qnil;
119
- long offset = NUM2LONG(rbOffset);
120
-
118
+
121
119
  Data_Get_Struct(self, Buffer, ptr);
122
- checkBounds(&ptr->memory, offset, 1);
120
+ checkBounds(&ptr->memory, offset, len);
123
121
 
124
122
  obj = Data_Make_Struct(BufferClass, Buffer, buffer_mark, -1, result);
125
123
  result->memory.address = ptr->memory.address + offset;
126
- result->memory.size = ptr->memory.size - offset;
127
- result->memory.ops = ptr->memory.ops;
124
+ result->memory.size = len;
128
125
  result->memory.access = ptr->memory.access;
129
126
  result->memory.typeSize = ptr->memory.typeSize;
130
127
  result->rbParent = self;
@@ -132,6 +129,23 @@ buffer_plus(VALUE self, VALUE rbOffset)
132
129
  return obj;
133
130
  }
134
131
 
132
+ static VALUE
133
+ buffer_plus(VALUE self, VALUE rbOffset)
134
+ {
135
+ Buffer* ptr;
136
+ long offset = NUM2LONG(rbOffset);
137
+
138
+ Data_Get_Struct(self, Buffer, ptr);
139
+
140
+ return slice(self, offset, ptr->memory.size - offset);
141
+ }
142
+
143
+ static VALUE
144
+ buffer_slice(VALUE self, VALUE rbOffset, VALUE rbLength)
145
+ {
146
+ return slice(self, NUM2LONG(rbOffset), NUM2LONG(rbLength));
147
+ }
148
+
135
149
  static VALUE
136
150
  buffer_inspect(VALUE self)
137
151
  {
@@ -153,7 +167,7 @@ buffer_free(VALUE self)
153
167
 
154
168
  Data_Get_Struct(self, Buffer, ptr);
155
169
  if (ptr->storage != NULL) {
156
- free(ptr->storage);
170
+ xfree(ptr->storage);
157
171
  ptr->storage = NULL;
158
172
  }
159
173
 
@@ -185,4 +199,5 @@ rbffi_Buffer_Init(VALUE moduleFFI)
185
199
  rb_define_method(BufferClass, "inspect", buffer_inspect, 0);
186
200
  rb_define_alias(BufferClass, "length", "total");
187
201
  rb_define_method(BufferClass, "+", buffer_plus, 1);
202
+ rb_define_method(BufferClass, "slice", buffer_slice, 2);
188
203
  }
@@ -60,6 +60,7 @@
60
60
  #define INT16_ADJ (4)
61
61
  #define INT32_ADJ (4)
62
62
  #define INT64_ADJ (8)
63
+ #define LONG_ADJ (sizeof(long))
63
64
  #define FLOAT32_ADJ (4)
64
65
  #define FLOAT64_ADJ (8)
65
66
  #define ADDRESS_ADJ (sizeof(void *))
@@ -186,6 +187,17 @@ rbffi_SetupCallParams(int argc, VALUE* argv, int paramCount, NativeType* paramTy
186
187
  ++argidx;
187
188
  break;
188
189
 
190
+ case NATIVE_LONG:
191
+ *(ffi_sarg *) param = NUM2LONG(argv[argidx]);
192
+ ADJ(param, LONG);
193
+ ++argidx;
194
+ break;
195
+
196
+ case NATIVE_ULONG:
197
+ *(ffi_arg *) param = NUM2ULONG(argv[argidx]);
198
+ ADJ(param, LONG);
199
+ ++argidx;
200
+ break;
189
201
 
190
202
  case NATIVE_FLOAT32:
191
203
  if (type != T_FLOAT && type != T_FIXNUM) {
@@ -431,6 +443,8 @@ rbffi_GetInvoker(FunctionType *fnInfo)
431
443
  case NATIVE_UINT16:
432
444
  case NATIVE_INT32:
433
445
  case NATIVE_UINT32:
446
+ case NATIVE_LONG:
447
+ case NATIVE_ULONG:
434
448
  #ifdef __x86_64__
435
449
  case NATIVE_INT64:
436
450
  case NATIVE_UINT64:
@@ -452,6 +466,8 @@ rbffi_GetInvoker(FunctionType *fnInfo)
452
466
  case NATIVE_UINT16:
453
467
  case NATIVE_INT32:
454
468
  case NATIVE_UINT32:
469
+ case NATIVE_LONG:
470
+ case NATIVE_ULONG:
455
471
  #ifdef __x86_64__
456
472
  case NATIVE_INT64:
457
473
  case NATIVE_UINT64:
@@ -536,6 +552,12 @@ rbffi_GetLongValue(int idx, VALUE* argv, FunctionType* fnInfo)
536
552
  /* Special handling/checking for unsigned 32 bit integers */
537
553
  return getUnsignedInt32(value, type);
538
554
 
555
+ case NATIVE_LONG:
556
+ return NUM2LONG(value);
557
+
558
+ case NATIVE_ULONG:
559
+ return NUM2ULONG(value);
560
+
539
561
  #ifdef __x86_64__
540
562
  case NATIVE_INT64:
541
563
  if (type != T_FIXNUM && type != T_BIGNUM) {
@@ -609,6 +631,9 @@ returnL(FunctionType* fnInfo, L* result)
609
631
  case NATIVE_INT32:
610
632
  return INT2NUM(*(signed int *) result);
611
633
 
634
+ case NATIVE_LONG:
635
+ return LONG2NUM(*(signed long *) result);
636
+
612
637
  case NATIVE_UINT8:
613
638
  return UINT2NUM(*(unsigned char *) result);
614
639
 
@@ -618,6 +643,9 @@ returnL(FunctionType* fnInfo, L* result)
618
643
  case NATIVE_UINT32:
619
644
  return UINT2NUM(*(unsigned int *) result);
620
645
 
646
+ case NATIVE_ULONG:
647
+ return ULONG2NUM(*(unsigned long *) result);
648
+
621
649
  #ifdef __x86_64__
622
650
  case NATIVE_INT64:
623
651
  return LL2NUM(*(signed long long *) result);
@@ -35,7 +35,9 @@
35
35
  extern "C" {
36
36
  #endif
37
37
 
38
- #if defined(__i386__) && defined(HAVE_RAW_API) && !defined(_WIN32) && !defined(__WIN32__)
38
+ #if defined(__i386__) && \
39
+ (defined(HAVE_RAW_API) || defined(USE_INTERNAL_LIBFFI)) && \
40
+ !defined(_WIN32) && !defined(__WIN32__)
39
41
  # define USE_RAW
40
42
  #endif
41
43
 
@@ -57,6 +59,8 @@ typedef union {
57
59
  #endif
58
60
  signed long long i64;
59
61
  unsigned long long u64;
62
+ signed long sl;
63
+ unsigned long ul;
60
64
  void* ptr;
61
65
  float f32;
62
66
  double f64;
@@ -157,7 +157,6 @@ symbol_new(VALUE library, void* address, VALUE name)
157
157
  sym->memory.size = LONG_MAX;
158
158
  sym->memory.typeSize = 1;
159
159
  sym->memory.access = MEM_RD | MEM_WR;
160
- sym->memory.ops = &rbffi_AbstractMemoryOps;
161
160
  sym->library = library;
162
161
  sym->name = name;
163
162
 
@@ -81,7 +81,6 @@ function_allocate(VALUE klass)
81
81
  obj = Data_Make_Struct(klass, Function, function_mark, function_free, fn);
82
82
 
83
83
  fn->memory.access = MEM_RD;
84
- fn->memory.ops = &rbffi_AbstractMemoryOps;
85
84
 
86
85
  fn->rbProc = Qnil;
87
86
  fn->rbFunctionInfo = Qnil;
@@ -250,7 +249,13 @@ function_attach(VALUE self, VALUE module, VALUE name)
250
249
  Data_Get_Struct(self, Function, fn);
251
250
 
252
251
  if (fn->info->parameterCount == -1) {
253
- rb_raise(rb_eRuntimeError, "Cannot attach variadic functions");
252
+ rb_raise(rb_eRuntimeError, "cannot attach variadic functions");
253
+ return Qnil;
254
+ }
255
+
256
+ if (!rb_obj_is_kind_of(module, rb_cModule)) {
257
+ rb_raise(rb_eRuntimeError, "trying to attach function to non-module");
258
+ return Qnil;
254
259
  }
255
260
 
256
261
  if (fn->methodHandle == NULL) {
@@ -350,6 +355,12 @@ callback_invoke(ffi_cif* cif, void* retval, void** parameters, void* user_data)
350
355
  case NATIVE_UINT64:
351
356
  param = ULL2NUM(*(uint64_t *) parameters[i]);
352
357
  break;
358
+ case NATIVE_LONG:
359
+ param = LONG2NUM(*(long *) parameters[i]);
360
+ break;
361
+ case NATIVE_ULONG:
362
+ param = ULONG2NUM(*(unsigned long *) parameters[i]);
363
+ break;
353
364
  case NATIVE_FLOAT32:
354
365
  param = rb_float_new(*(float *) parameters[i]);
355
366
  break;
@@ -397,6 +408,12 @@ callback_invoke(ffi_cif* cif, void* retval, void** parameters, void* user_data)
397
408
  case NATIVE_UINT64:
398
409
  *((uint64_t *) retval) = NUM2ULL(rbReturnValue);
399
410
  break;
411
+ case NATIVE_LONG:
412
+ *((ffi_sarg *) retval) = NUM2LONG(rbReturnValue);
413
+ break;
414
+ case NATIVE_ULONG:
415
+ *((ffi_arg *) retval) = NUM2ULONG(rbReturnValue);
416
+ break;
400
417
  case NATIVE_FLOAT32:
401
418
  *((float *) retval) = (float) NUM2DBL(rbReturnValue);
402
419
  break;
@@ -63,7 +63,6 @@ memptr_allocate(VALUE klass)
63
63
  {
64
64
  MemoryPointer* p;
65
65
  VALUE obj = Data_Make_Struct(klass, MemoryPointer, NULL, memptr_release, p);
66
- p->memory.ops = &rbffi_AbstractMemoryOps;
67
66
  p->memory.access = MEM_RD | MEM_WR;
68
67
 
69
68
  return obj;
@@ -106,7 +105,7 @@ memptr_malloc(VALUE self, long size, long count, bool clear)
106
105
  /* ensure the memory is aligned on at least a 8 byte boundary */
107
106
  p->memory.address = (char *) (((uintptr_t) p->storage + 0x7) & (uintptr_t) ~0x7UL);;
108
107
  p->allocated = true;
109
-
108
+
110
109
  if (clear && p->memory.size > 0) {
111
110
  memset(p->memory.address, 0, p->memory.size);
112
111
  }
@@ -135,7 +134,7 @@ memptr_free(VALUE self)
135
134
 
136
135
  if (ptr->allocated) {
137
136
  if (ptr->storage != NULL) {
138
- free(ptr->storage);
137
+ xfree(ptr->storage);
139
138
  ptr->storage = NULL;
140
139
  }
141
140
  ptr->allocated = false;