Sha256: 2bb0ff71983a5c12dbf7cf99442bc0fb202c1544c261f612c5c97b9150d285fd

Contents?: true

Size: 1.66 KB

Versions: 2

Compression:

Stored size: 1.66 KB

Contents

#include <ruby.h>
#include "MemoryPointer.h"
#include "Types.h"

ffi_type*
rb_FFI_NativeTypeToFFI(NativeType type)
{
    switch (type) {
        case VOID:
            return &ffi_type_void;
        case INT8:
            return &ffi_type_sint8;
        case UINT8:
            return &ffi_type_uint8;
        case INT32:
            return &ffi_type_sint32;
        case UINT32:
            return &ffi_type_uint32;
        case INT64:
            return &ffi_type_sint64;
        case UINT64:
            return &ffi_type_uint64;
        case FLOAT32:
            return &ffi_type_float;
        case FLOAT64:
            return &ffi_type_double;
        case STRING:
        case RBXSTRING:
        case POINTER:
            return &ffi_type_pointer;
        default:
            return NULL;
    }
}

VALUE
rb_FFI_NativeValueToRuby(NativeType type, const void* ptr)
{
    switch (type) {
        case VOID:
            return Qnil;        
        case INT8:
        case INT16:
        case INT32:
            return INT2FIX(*(int *) ptr);
        case UINT8:
        case UINT16:
        case UINT32:
            return INT2FIX(*(unsigned int *) ptr);
        case INT64:
            return LL2NUM(*(signed long long *) ptr);
        case UINT64:
            return ULL2NUM(*(unsigned long long *) ptr);
        case FLOAT32:
            return rb_float_new(*(float *) ptr);
        case FLOAT64:
            return rb_float_new(*(double *) ptr);
        case STRING:
            return rb_str_new2(*(char **) ptr);
        case POINTER:
            return rb_FFI_MemoryPointer_new(*(void **) ptr);
        default:
            rb_raise(rb_eRuntimeError, "Unknown type: %d", type);
    }
}

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
ffi-0.1.0 ext/Types.c
ffi-0.1.1 ext/Types.c