0
@@ -1005,8 +1005,22 @@ void ffi_call(STATE, cpu c, OBJECT ptr) {
0
+typedef void (*nf_take_8)(uint8_t);
0
+typedef void (*nf_take_16)(uint16_t);
0
+typedef void (*nf_take_32)(uint32_t);
0
+typedef void (*nf_take_64)(uint64_t);
0
+typedef uint8_t (*nf_return_8)();
0
+typedef uint16_t (*nf_return_16)();
0
+typedef uint32_t (*nf_return_32)();
0
+typedef uint64_t (*nf_return_64)();
0
+typedef unsigned long (*nf_return_long)();
0
+typedef unsigned long long (*nf_return_ll)();
0
+typedef float (*nf_return_float)();
0
+typedef double (*nf_return_double)();
0
OBJECT ffi_get_field(char *ptr, int offset, int type) {
0
- nf_converter conv = (nf_converter)ffi_get_from_converter(type);
0
rni_context *ctx = subtend_retrieve_context();
0
@@ -1015,20 +1029,28 @@ OBJECT ffi_get_field(char *ptr, int offset, int type) {
0
sz = ffi_type_size(type);
0
- (void)conv(*((uint8_t*)ptr));
0
+ nf_take_8 conv = (nf_take_8)ffi_get_from_converter(type);
0
+ conv(*((uint8_t*)ptr));
0
- (void)conv(*((uint16_t*)ptr));
0
+ nf_take_16 conv = (nf_take_16)ffi_get_from_converter(type);
0
+ conv(*((uint16_t*)ptr));
0
- (void)conv(*((uint32_t*)ptr));
0
+ nf_take_32 conv = (nf_take_32)ffi_get_from_converter(type);
0
+ conv(*((uint32_t*)ptr));
0
- (void)conv(*((uint64_t*)ptr));
0
+ nf_take_64 conv = (nf_take_64)ffi_get_from_converter(type);
0
+ conv(*((uint64_t*)ptr));
0
return cpu_stack_pop(ctx->state, ctx->cpu);
0
@@ -1039,34 +1061,97 @@ void ffi_set_field(char *ptr, int offset, int type, OBJECT val) {
0
rni_context *ctx = subtend_retrieve_context();
0
- nf_converter conv = (nf_converter)ffi_get_to_converter(type);
0
sz = ffi_type_size(type);
0
cpu_stack_push(ctx->state, ctx->cpu, val, FALSE);
0
+ case FFI_TYPE_UCHAR: {
0
+ nf_return_8 conv = (nf_return_8)ffi_get_to_converter(type);
0
+ case FFI_TYPE_USHORT: {
0
+ nf_return_16 conv = (nf_return_16)ffi_get_to_converter(type);
0
+ memcpy(ptr, &u16, sz);
0
+ nf_return_32 conv = (nf_return_32)ffi_get_to_converter(type);
0
+ memcpy(ptr, &u32, sz);
0
+ nf_return_ll conv = (nf_return_ll)ffi_get_to_converter(type);
0
+ unsigned long long v = conv();
0
+ memcpy(ptr, &v, sizeof(long long));
0
+ case FFI_TYPE_ULONG: {
0
+ nf_return_long conv = (nf_return_long)ffi_get_to_converter(type);
0
+ memcpy(ptr, &v, sizeof(long));
0
+ case FFI_TYPE_FLOAT: {
0
+ nf_return_float conv = (nf_return_float)ffi_get_to_converter(type);
0
+ memcpy(ptr, &v, sizeof(float));
0
+ case FFI_TYPE_DOUBLE: {
0
+ nf_return_double conv = (nf_return_double)ffi_get_to_converter(type);
0
+ memcpy(ptr, &v, sizeof(double));
0
+ nf_return_8 conv = (nf_return_8)ffi_get_from_converter(type);
0
- u16 = (uint16_t)conv();
0
+ nf_return_16 conv = (nf_return_16)ffi_get_from_converter(type);
0
- u32 = (uint32_t)conv();
0
+ nf_return_32 conv = (nf_return_32)ffi_get_from_converter(type);
0
- u64 = (uint64_t)conv();
0
+ nf_return_64 conv = (nf_return_64)ffi_get_from_converter(type);
Comments
No one has commented yet.