|
1 | 1 | #include <fiddle.h> |
2 | 2 |
|
3 | 3 | ffi_type * |
4 | | -int_to_ffi_type(int type) |
| 4 | +rb_fiddle_int_to_ffi_type(int type) |
5 | 5 | { |
6 | 6 | int signed_p = 1; |
7 | 7 |
|
@@ -33,66 +33,90 @@ int_to_ffi_type(int type) |
33 | 33 | return &ffi_type_float; |
34 | 34 | case TYPE_DOUBLE: |
35 | 35 | return &ffi_type_double; |
| 36 | + case TYPE_CONST_STRING: |
| 37 | + return &ffi_type_pointer; |
36 | 38 | default: |
37 | 39 | rb_raise(rb_eRuntimeError, "unknown type %d", type); |
38 | 40 | } |
39 | 41 | return &ffi_type_pointer; |
40 | 42 | } |
41 | 43 |
|
| 44 | +ffi_type * |
| 45 | +int_to_ffi_type(int type) |
| 46 | +{ |
| 47 | + return rb_fiddle_int_to_ffi_type(type); |
| 48 | +} |
| 49 | + |
42 | 50 | void |
43 | | -value_to_generic(int type, VALUE src, fiddle_generic * dst) |
| 51 | +rb_fiddle_value_to_generic(int type, VALUE *src, fiddle_generic *dst) |
44 | 52 | { |
45 | 53 | switch (type) { |
46 | 54 | case TYPE_VOID: |
47 | 55 | break; |
48 | 56 | case TYPE_VOIDP: |
49 | | - dst->pointer = NUM2PTR(rb_Integer(src)); |
| 57 | + dst->pointer = NUM2PTR(rb_Integer(*src)); |
50 | 58 | break; |
51 | 59 | case TYPE_CHAR: |
52 | | - dst->schar = (signed char)NUM2INT(src); |
| 60 | + dst->schar = (signed char)NUM2INT(*src); |
53 | 61 | break; |
54 | 62 | case -TYPE_CHAR: |
55 | | - dst->uchar = (unsigned char)NUM2UINT(src); |
| 63 | + dst->uchar = (unsigned char)NUM2UINT(*src); |
56 | 64 | break; |
57 | 65 | case TYPE_SHORT: |
58 | | - dst->sshort = (unsigned short)NUM2INT(src); |
| 66 | + dst->sshort = (unsigned short)NUM2INT(*src); |
59 | 67 | break; |
60 | 68 | case -TYPE_SHORT: |
61 | | - dst->sshort = (signed short)NUM2UINT(src); |
| 69 | + dst->sshort = (signed short)NUM2UINT(*src); |
62 | 70 | break; |
63 | 71 | case TYPE_INT: |
64 | | - dst->sint = NUM2INT(src); |
| 72 | + dst->sint = NUM2INT(*src); |
65 | 73 | break; |
66 | 74 | case -TYPE_INT: |
67 | | - dst->uint = NUM2UINT(src); |
| 75 | + dst->uint = NUM2UINT(*src); |
68 | 76 | break; |
69 | 77 | case TYPE_LONG: |
70 | | - dst->slong = NUM2LONG(src); |
| 78 | + dst->slong = NUM2LONG(*src); |
71 | 79 | break; |
72 | 80 | case -TYPE_LONG: |
73 | | - dst->ulong = NUM2ULONG(src); |
| 81 | + dst->ulong = NUM2ULONG(*src); |
74 | 82 | break; |
75 | 83 | #if HAVE_LONG_LONG |
76 | 84 | case TYPE_LONG_LONG: |
77 | | - dst->slong_long = NUM2LL(src); |
| 85 | + dst->slong_long = NUM2LL(*src); |
78 | 86 | break; |
79 | 87 | case -TYPE_LONG_LONG: |
80 | | - dst->ulong_long = NUM2ULL(src); |
| 88 | + dst->ulong_long = NUM2ULL(*src); |
81 | 89 | break; |
82 | 90 | #endif |
83 | 91 | case TYPE_FLOAT: |
84 | | - dst->ffloat = (float)NUM2DBL(src); |
| 92 | + dst->ffloat = (float)NUM2DBL(*src); |
85 | 93 | break; |
86 | 94 | case TYPE_DOUBLE: |
87 | | - dst->ddouble = NUM2DBL(src); |
| 95 | + dst->ddouble = NUM2DBL(*src); |
| 96 | + break; |
| 97 | + case TYPE_CONST_STRING: |
| 98 | + if (NIL_P(*src)) { |
| 99 | + dst->pointer = NULL; |
| 100 | + } |
| 101 | + else { |
| 102 | + dst->pointer = rb_string_value_cstr(src); |
| 103 | + } |
88 | 104 | break; |
89 | 105 | default: |
90 | 106 | rb_raise(rb_eRuntimeError, "unknown type %d", type); |
91 | 107 | } |
92 | 108 | } |
93 | 109 |
|
| 110 | +void |
| 111 | +value_to_generic(int type, VALUE src, fiddle_generic *dst) |
| 112 | +{ |
| 113 | + /* src isn't safe from GC when type is TYPE_CONST_STRING and src |
| 114 | + * isn't String. */ |
| 115 | + return rb_fiddle_value_to_generic(type, &src, dst); |
| 116 | +} |
| 117 | + |
94 | 118 | VALUE |
95 | | -generic_to_value(VALUE rettype, fiddle_generic retval) |
| 119 | +rb_fiddle_generic_to_value(VALUE rettype, fiddle_generic retval) |
96 | 120 | { |
97 | 121 | int type = NUM2INT(rettype); |
98 | 122 | VALUE cPointer; |
@@ -131,11 +155,24 @@ generic_to_value(VALUE rettype, fiddle_generic retval) |
131 | 155 | return rb_float_new(retval.ffloat); |
132 | 156 | case TYPE_DOUBLE: |
133 | 157 | return rb_float_new(retval.ddouble); |
| 158 | + case TYPE_CONST_STRING: |
| 159 | + if (retval.pointer) { |
| 160 | + return rb_str_new_cstr(retval.pointer); |
| 161 | + } |
| 162 | + else { |
| 163 | + return Qnil; |
| 164 | + } |
134 | 165 | default: |
135 | 166 | rb_raise(rb_eRuntimeError, "unknown type %d", type); |
136 | 167 | } |
137 | 168 |
|
138 | 169 | UNREACHABLE; |
139 | 170 | } |
140 | 171 |
|
| 172 | +VALUE |
| 173 | +generic_to_value(VALUE rettype, fiddle_generic retval) |
| 174 | +{ |
| 175 | + return rb_fiddle_generic_to_value(rettype, retval); |
| 176 | +} |
| 177 | + |
141 | 178 | /* vim: set noet sw=4 sts=4 */ |
0 commit comments