ffi 0.4.0 → 0.5.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 (55) hide show
  1. data/README.rdoc +15 -15
  2. data/Rakefile +57 -8
  3. data/ext/ffi_c/AbstractMemory.c +101 -24
  4. data/ext/ffi_c/AbstractMemory.h +98 -6
  5. data/ext/ffi_c/ArrayType.c +129 -0
  6. data/ext/ffi_c/ArrayType.h +58 -0
  7. data/ext/ffi_c/AutoPointer.c +1 -0
  8. data/ext/ffi_c/Buffer.c +59 -43
  9. data/ext/ffi_c/Call.c +853 -0
  10. data/ext/ffi_c/Call.h +86 -0
  11. data/ext/ffi_c/ClosurePool.c +302 -0
  12. data/ext/ffi_c/ClosurePool.h +29 -0
  13. data/ext/ffi_c/DynamicLibrary.c +3 -0
  14. data/ext/ffi_c/Function.c +478 -0
  15. data/ext/ffi_c/Function.h +80 -0
  16. data/ext/ffi_c/FunctionInfo.c +221 -0
  17. data/ext/ffi_c/LastError.c +30 -6
  18. data/ext/ffi_c/MemoryPointer.c +50 -28
  19. data/ext/ffi_c/MethodHandle.c +346 -0
  20. data/ext/ffi_c/MethodHandle.h +53 -0
  21. data/ext/ffi_c/Pointer.c +73 -13
  22. data/ext/ffi_c/Pointer.h +31 -7
  23. data/ext/ffi_c/Struct.c +517 -224
  24. data/ext/ffi_c/Struct.h +60 -6
  25. data/ext/ffi_c/StructByValue.c +140 -0
  26. data/ext/ffi_c/StructByValue.h +53 -0
  27. data/ext/ffi_c/StructLayout.c +450 -0
  28. data/ext/ffi_c/Type.c +121 -22
  29. data/ext/ffi_c/Type.h +37 -8
  30. data/ext/ffi_c/Types.c +46 -61
  31. data/ext/ffi_c/Types.h +38 -7
  32. data/ext/ffi_c/Variadic.c +260 -0
  33. data/ext/ffi_c/compat.h +53 -3
  34. data/ext/ffi_c/extconf.rb +6 -7
  35. data/ext/ffi_c/ffi.c +45 -39
  36. data/ext/ffi_c/libffi.darwin.mk +2 -2
  37. data/ext/ffi_c/rbffi.h +3 -0
  38. data/lib/ffi/ffi.rb +7 -4
  39. data/lib/ffi/library.rb +34 -59
  40. data/lib/ffi/platform.rb +14 -4
  41. data/lib/ffi/struct.rb +110 -281
  42. data/lib/ffi/union.rb +4 -9
  43. data/lib/ffi/variadic.rb +1 -6
  44. data/spec/ffi/buffer_spec.rb +6 -0
  45. data/spec/ffi/callback_spec.rb +34 -3
  46. data/spec/ffi/function_spec.rb +73 -0
  47. data/spec/ffi/library_spec.rb +56 -52
  48. data/spec/ffi/pointer_spec.rb +3 -3
  49. data/spec/ffi/struct_callback_spec.rb +26 -3
  50. data/spec/ffi/struct_spec.rb +56 -3
  51. metadata +42 -11
  52. data/ext/ffi_c/Callback.c +0 -374
  53. data/ext/ffi_c/Callback.h +0 -47
  54. data/ext/ffi_c/Invoker.c +0 -962
  55. data/ext/ffi_c/NullPointer.c +0 -143
data/ext/ffi_c/Type.c CHANGED
@@ -1,3 +1,30 @@
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
+
1
28
  #include <sys/param.h>
2
29
  #include <sys/types.h>
3
30
  #include <ruby.h>
@@ -18,6 +45,8 @@ static void builtin_type_free(BuiltinType *);
18
45
  VALUE rbffi_TypeClass = Qnil;
19
46
 
20
47
  static VALUE classBuiltinType = Qnil;
48
+ static VALUE typeMap = Qnil, sizeMap = Qnil;
49
+ static ID id_find_type = 0, id_type_size = 0, id_size = 0;
21
50
 
22
51
  static VALUE
23
52
  type_allocate(VALUE klass)
@@ -26,9 +55,8 @@ type_allocate(VALUE klass)
26
55
  VALUE obj = Data_Make_Struct(klass, Type, NULL, -1, type);
27
56
 
28
57
  type->nativeType = -1;
29
- type->size = 0;
30
- type->alignment = 1;
31
-
58
+ type->ffiType = &ffi_type_void;
59
+
32
60
  return obj;
33
61
  }
34
62
 
@@ -45,8 +73,7 @@ type_initialize(VALUE self, VALUE value)
45
73
  } else if (rb_obj_is_kind_of(value, rbffi_TypeClass)) {
46
74
  Data_Get_Struct(value, Type, other);
47
75
  type->nativeType = other->nativeType;
48
- type->size = other->size;
49
- type->alignment = other->alignment;
76
+ type->ffiType = other->ffiType;
50
77
  } else {
51
78
  rb_raise(rb_eArgError, "wrong type");
52
79
  }
@@ -61,7 +88,7 @@ type_size(VALUE self)
61
88
 
62
89
  Data_Get_Struct(self, Type, type);
63
90
 
64
- return INT2FIX(type->size);
91
+ return INT2FIX(type->ffiType->size);
65
92
  }
66
93
 
67
94
  static VALUE
@@ -71,7 +98,7 @@ type_alignment(VALUE self)
71
98
 
72
99
  Data_Get_Struct(self, Type, type);
73
100
 
74
- return INT2FIX(type->alignment);
101
+ return INT2FIX(type->ffiType->alignment);
75
102
  }
76
103
 
77
104
  static VALUE
@@ -82,7 +109,7 @@ type_inspect(VALUE self)
82
109
 
83
110
  Data_Get_Struct(self, Type, type);
84
111
  snprintf(buf, sizeof(buf), "#<FFI::Type:%p size=%d alignment=%d>",
85
- type, type->size, type->alignment);
112
+ type, (int) type->ffiType->size, (int) type->ffiType->alignment);
86
113
 
87
114
  return rb_str_new2(buf);
88
115
  }
@@ -96,8 +123,6 @@ enum_allocate(VALUE klass)
96
123
  obj = Data_Make_Struct(klass, Type, NULL, -1, type);
97
124
  type->nativeType = NATIVE_ENUM;
98
125
  type->ffiType = &ffi_type_sint;
99
- type->size = ffi_type_sint.size;
100
- type->alignment = ffi_type_sint.alignment;
101
126
 
102
127
  return obj;
103
128
  }
@@ -105,26 +130,28 @@ enum_allocate(VALUE klass)
105
130
  int
106
131
  rbffi_Type_GetIntValue(VALUE type)
107
132
  {
108
- if (rb_obj_is_kind_of(type, rbffi_TypeClass)) {
109
- Type* t;
110
- Data_Get_Struct(type, Type, t);
111
- return t->nativeType;
112
- } else {
113
- rb_raise(rb_eArgError, "Invalid type argument");
133
+ Type* t;
134
+
135
+ if (!rb_obj_is_kind_of(type, rbffi_TypeClass)) {
136
+ rb_raise(rb_eTypeError, "wrong type. Expected (FFI::Type)");
114
137
  }
138
+
139
+ Data_Get_Struct(type, Type, t);
140
+
141
+ return t->nativeType;
115
142
  }
116
143
 
117
144
  static VALUE
118
145
  builtin_type_new(VALUE klass, int nativeType, ffi_type* ffiType, const char* name)
119
146
  {
120
147
  BuiltinType* type;
121
- VALUE obj = Data_Make_Struct(klass, BuiltinType, NULL, builtin_type_free, type);
148
+ VALUE obj = Qnil;
149
+
150
+ obj = Data_Make_Struct(klass, BuiltinType, NULL, builtin_type_free, type);
122
151
 
123
152
  type->name = strdup(name);
124
153
  type->type.nativeType = nativeType;
125
154
  type->type.ffiType = ffiType;
126
- type->type.size = ffiType->size;
127
- type->type.alignment = ffiType->alignment;
128
155
 
129
156
  return obj;
130
157
  }
@@ -143,18 +170,90 @@ builtin_type_inspect(VALUE self)
143
170
  BuiltinType *type;
144
171
 
145
172
  Data_Get_Struct(self, BuiltinType, type);
146
- snprintf(buf, sizeof(buf), "#<FFI::Type::Builtin:%ssize=%d alignment=%d>",
147
- type->name, type->type.size, type->type.alignment);
173
+ snprintf(buf, sizeof(buf), "#<FFI::Type::Builtin:%s size=%d alignment=%d>",
174
+ type->name, (int) type->type.ffiType->size, type->type.ffiType->alignment);
148
175
 
149
176
  return rb_str_new2(buf);
150
177
  }
151
178
 
179
+ int
180
+ rbffi_type_size(VALUE type)
181
+ {
182
+ int t = TYPE(type);
183
+ if (t == T_FIXNUM || t == T_BIGNUM) {
184
+ return NUM2INT(type);
185
+ } else if (t == T_SYMBOL) {
186
+ /*
187
+ * Try looking up directly in the type and size maps
188
+ */
189
+ VALUE nType;
190
+ if ((nType = rb_hash_aref(typeMap, type)) != Qnil) {
191
+ VALUE nSize = rb_hash_aref(sizeMap, nType);
192
+ if (TYPE(nSize) == T_FIXNUM) {
193
+ return FIX2INT(nSize);
194
+ }
195
+ }
196
+ // Not found - call up to the ruby version to resolve
197
+ return NUM2INT(rb_funcall2(rbffi_FFIModule, id_type_size, 1, &type));
198
+ } else {
199
+ return NUM2INT(rb_funcall2(type, id_size, 0, NULL));
200
+ }
201
+ }
202
+
203
+ VALUE
204
+ rbffi_Type_Lookup(VALUE name)
205
+ {
206
+ int t = TYPE(name);
207
+ if (t == T_SYMBOL || t == T_STRING) {
208
+ /*
209
+ * Try looking up directly in the type Map
210
+ */
211
+ VALUE nType;
212
+ if ((nType = rb_hash_aref(typeMap, name)) != Qnil && rb_obj_is_kind_of(nType, rbffi_TypeClass)) {
213
+ return nType;
214
+ }
215
+ } else if (rb_obj_is_kind_of(name, rbffi_TypeClass)) {
216
+
217
+ return name;
218
+ }
219
+
220
+ /* Nothing found - let caller handle raising exceptions */
221
+ return Qnil;
222
+ }
223
+
224
+ /**
225
+ * rbffi_Type_Find() is like rbffi_Type_Lookup, but an error is raised if the
226
+ * type is not found.
227
+ */
228
+ VALUE
229
+ rbffi_Type_Find(VALUE name)
230
+ {
231
+ VALUE rbType = rbffi_Type_Lookup(name);
232
+
233
+ if (!RTEST(rbType)) {
234
+ VALUE typeName = rb_funcall2(name, rb_intern("inspect"), 0, NULL);
235
+ rb_raise(rb_eTypeError, "Invalid type (%s)", RSTRING_PTR(typeName));
236
+ }
237
+
238
+ return rbType;
239
+ }
240
+
152
241
  void
153
242
  rbffi_Type_Init(VALUE moduleFFI)
154
243
  {
155
244
  VALUE moduleNativeType;
156
245
  VALUE classType = rbffi_TypeClass = rb_define_class_under(moduleFFI, "Type", rb_cObject);
157
246
  VALUE classEnum = rb_define_class_under(moduleFFI, "Enum", classType);
247
+
248
+ rb_define_const(moduleFFI, "TypeDefs", typeMap = rb_hash_new());
249
+ rb_define_const(moduleFFI, "SizeTypes", sizeMap = rb_hash_new());
250
+ rb_global_variable(&typeMap);
251
+ rb_global_variable(&sizeMap);
252
+ id_find_type = rb_intern("find_type");
253
+ id_type_size = rb_intern("type_size");
254
+ id_size = rb_intern("size");
255
+
256
+
158
257
  classBuiltinType = rb_define_class_under(rbffi_TypeClass, "Builtin", rbffi_TypeClass);
159
258
  moduleNativeType = rb_define_module_under(moduleFFI, "NativeType");
160
259
 
@@ -166,7 +265,7 @@ rbffi_Type_Init(VALUE moduleFFI)
166
265
  rb_define_method(classType, "initialize", type_initialize, 1);
167
266
  rb_define_method(classType, "size", type_size, 0);
168
267
  rb_define_method(classType, "alignment", type_alignment, 0);
169
- rb_define_method(classBuiltinType, "inspect", type_inspect, 0);
268
+ rb_define_method(classType, "inspect", type_inspect, 0);
170
269
 
171
270
  // Make Type::Builtin non-allocatable
172
271
  rb_undef_method(CLASS_OF(classBuiltinType), "new");
data/ext/ffi_c/Type.h CHANGED
@@ -1,5 +1,32 @@
1
- #ifndef _TYPE_H
2
- #define _TYPE_H
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_TYPE_H
29
+ #define RBFFI_TYPE_H
3
30
 
4
31
  #include <ruby.h>
5
32
  #include <ffi.h>
@@ -8,21 +35,23 @@
8
35
  extern "C" {
9
36
  #endif
10
37
 
38
+ typedef struct Type_ Type;
39
+
40
+ #include "Types.h"
11
41
 
12
- typedef struct Type_ {
42
+ struct Type_ {
13
43
  NativeType nativeType;
14
44
  ffi_type* ffiType;
15
- int size;
16
- int alignment;
17
- } Type;
45
+ };
18
46
 
19
47
  extern VALUE rbffi_TypeClass;
20
48
  extern int rbffi_Type_GetIntValue(VALUE type);
21
-
49
+ extern VALUE rbffi_Type_Lookup(VALUE type);
50
+ extern VALUE rbffi_Type_Find(VALUE type);
22
51
 
23
52
  #ifdef __cplusplus
24
53
  }
25
54
  #endif
26
55
 
27
- #endif /* _TYPE_H */
56
+ #endif /* RBFFI_TYPE_H */
28
57
 
data/ext/ffi_c/Types.c CHANGED
@@ -1,51 +1,43 @@
1
+ /*
2
+ * Copyright (c) 2009, Wayne Meissner
3
+ * Copyright (c) 2009, Luc Heinrich
4
+ * Copyright (c) 2009, Aman Gupta.
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
+ *
10
+ * * Redistributions of source code must retain the above copyright notice, this
11
+ * list of conditions and the following disclaimer.
12
+ * * Redistributions in binary form must reproduce the above copyright notice
13
+ * this list of conditions and the following disclaimer in the documentation
14
+ * and/or other materials provided with the distribution.
15
+ * * The name of the author or authors may not be used to endorse or promote
16
+ * products derived from this software without specific prior written permission.
17
+ *
18
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
22
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
24
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
25
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
26
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
+ */
29
+
1
30
  #include <ruby.h>
2
31
  #include "Pointer.h"
3
32
  #include "rbffi.h"
4
- #include "Callback.h"
33
+ #include "Function.h"
34
+ #include "StructByValue.h"
5
35
  #include "Types.h"
36
+ #include "Struct.h"
37
+ #include "MemoryPointer.h"
6
38
 
7
39
  static ID id_find = 0;
8
40
 
9
- ffi_type*
10
- rbffi_NativeType_ToFFI(NativeType type)
11
- {
12
- switch (type) {
13
- case NATIVE_VOID:
14
- return &ffi_type_void;
15
- case NATIVE_INT8:
16
- return &ffi_type_sint8;
17
- case NATIVE_UINT8:
18
- return &ffi_type_uint8;
19
- case NATIVE_INT16:
20
- return &ffi_type_sint16;
21
- case NATIVE_UINT16:
22
- return &ffi_type_uint16;
23
- case NATIVE_BOOL:
24
- case NATIVE_INT32:
25
- case NATIVE_ENUM:
26
- return &ffi_type_sint32;
27
- case NATIVE_UINT32:
28
- return &ffi_type_uint32;
29
- case NATIVE_INT64:
30
- return &ffi_type_sint64;
31
- case NATIVE_UINT64:
32
- return &ffi_type_uint64;
33
- case NATIVE_FLOAT32:
34
- return &ffi_type_float;
35
- case NATIVE_FLOAT64:
36
- return &ffi_type_double;
37
- case NATIVE_STRING:
38
- case NATIVE_RBXSTRING:
39
- case NATIVE_POINTER:
40
- case NATIVE_BUFFER_IN:
41
- case NATIVE_BUFFER_OUT:
42
- case NATIVE_BUFFER_INOUT:
43
- case NATIVE_CALLBACK:
44
- return &ffi_type_pointer;
45
- default:
46
- return NULL;
47
- }
48
- }
49
41
 
50
42
  VALUE
51
43
  rbffi_NativeValue_ToRuby(Type* type, VALUE rbType, const void* ptr, VALUE enums)
@@ -74,34 +66,27 @@ rbffi_NativeValue_ToRuby(Type* type, VALUE rbType, const void* ptr, VALUE enums)
74
66
  case NATIVE_FLOAT64:
75
67
  return rb_float_new(*(double *) ptr);
76
68
  case NATIVE_STRING:
77
- return (*(char **)ptr) ? rb_tainted_str_new2(*(char **) ptr) : Qnil;
69
+ return (*(void **) ptr != NULL) ? rb_tainted_str_new2(*(char **) ptr) : Qnil;
78
70
  case NATIVE_POINTER:
79
71
  return rbffi_Pointer_NewInstance(*(void **) ptr);
80
72
  case NATIVE_BOOL:
81
73
  return ((int) *(ffi_arg *) ptr) ? Qtrue : Qfalse;
82
74
  case NATIVE_ENUM:
83
- {
84
- VALUE enum_obj = rb_funcall(enums, id_find, 1, rbType);
85
- if (enum_obj == Qnil) {
86
- VALUE s = rb_inspect(rbType);
87
- rb_raise(rb_eRuntimeError, "Unknown enumeration: %s", StringValueCStr(s));
88
- }
89
- return rb_funcall(enum_obj, id_find, 1, INT2NUM((unsigned int) *(ffi_arg *) ptr));
90
- }
75
+ return rb_funcall(rbType, id_find, 1, INT2NUM((unsigned int) *(ffi_arg *) ptr));
76
+
77
+ case NATIVE_FUNCTION:
91
78
  case NATIVE_CALLBACK: {
92
- CallbackInfo* cbInfo;
93
- VALUE argv[6];
94
- VALUE funcptr = rbffi_Pointer_NewInstance(*(void **) ptr);
79
+ return rbffi_Function_NewInstance(rbType, rbffi_Pointer_NewInstance(*(void **) ptr));
80
+ }
81
+ case NATIVE_STRUCT: {
82
+ StructByValue* sbv = (StructByValue *)type;
83
+ AbstractMemory* mem;
84
+ VALUE rbMemory = rbffi_MemoryPointer_NewInstance(1, sbv->base.ffiType->size, false);
95
85
 
96
- Data_Get_Struct(rbType, CallbackInfo, cbInfo);
97
- argv[0] = funcptr;
98
- argv[1] = cbInfo->rbParameterTypes;
99
- argv[2] = ID2SYM(rb_intern("cb")); // just shove a dummy value
100
- argv[3] = cbInfo->rbReturnType;
101
- argv[4] = rb_str_new2("default");
102
- argv[5] = Qnil;
86
+ Data_Get_Struct(rbMemory, AbstractMemory, mem);
87
+ memcpy(mem->address, ptr, sbv->base.ffiType->size);
103
88
 
104
- return rb_class_new_instance(6, argv, rbffi_InvokerClass);
89
+ return rb_class_new_instance(1, &rbMemory, sbv->rbStructClass);
105
90
  }
106
91
 
107
92
  default:
data/ext/ffi_c/Types.h CHANGED
@@ -1,12 +1,39 @@
1
- #ifndef _TYPES_H
2
- #define _TYPES_H
1
+ /*
2
+ * Copyright (c) 2008, 2009, Wayne Meissner
3
+ * Copyright (c) 2009, Luc Heinrich <luc@honk-honk.com>
4
+ *
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
+ *
10
+ * * Redistributions of source code must retain the above copyright notice, this
11
+ * list of conditions and the following disclaimer.
12
+ * * Redistributions in binary form must reproduce the above copyright notice
13
+ * this list of conditions and the following disclaimer in the documentation
14
+ * and/or other materials provided with the distribution.
15
+ * * The name of the author or authors may not be used to endorse or promote
16
+ * products derived from this software without specific prior written permission.
17
+ *
18
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
22
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
24
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
25
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
26
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
+ */
29
+
30
+ #ifndef RBFFI_TYPES_H
31
+ #define RBFFI_TYPES_H
3
32
 
4
33
  #ifdef __cplusplus
5
34
  extern "C" {
6
35
  #endif
7
- #ifdef VOID
8
- # undef VOID
9
- #endif
36
+
10
37
  typedef enum {
11
38
  NATIVE_VOID,
12
39
  NATIVE_INT8,
@@ -21,6 +48,7 @@ typedef enum {
21
48
  NATIVE_FLOAT64,
22
49
  NATIVE_POINTER,
23
50
  NATIVE_CALLBACK,
51
+ NATIVE_FUNCTION,
24
52
  NATIVE_BUFFER_IN,
25
53
  NATIVE_BUFFER_OUT,
26
54
  NATIVE_BUFFER_INOUT,
@@ -37,12 +65,15 @@ typedef enum {
37
65
  NATIVE_VARARGS,
38
66
  /** A typedef-ed enum */
39
67
  NATIVE_ENUM,
68
+ /** Struct-by-value param or result */
69
+ NATIVE_STRUCT,
70
+ /** An array type definition */
71
+ NATIVE_ARRAY,
40
72
  } NativeType;
41
73
 
42
74
  #include <ffi.h>
43
75
  #include "Type.h"
44
76
 
45
- extern ffi_type* rbffi_NativeType_ToFFI(NativeType type);
46
77
  VALUE rbffi_NativeValue_ToRuby(Type* type, VALUE rbType, const void* ptr, VALUE enums);
47
78
  void rbffi_Types_Init(VALUE moduleFFI);
48
79
 
@@ -50,5 +81,5 @@ void rbffi_Types_Init(VALUE moduleFFI);
50
81
  }
51
82
  #endif
52
83
 
53
- #endif /* _TYPES_H */
84
+ #endif /* RBFFI_TYPES_H */
54
85