VALUE rb_dlhandle_to_ptr(VALUE self) { struct dl_handle *dlhandle; Data_Get_Struct(self, struct dl_handle, dlhandle); return rb_dlptr_new(dlhandle, sizeof(dlhandle), 0); }
VALUE rb_dlptr_malloc(long size, freefunc_t func) { void *ptr; ptr = ruby_xmalloc((size_t)size); memset(ptr,0,(size_t)size); return rb_dlptr_new(ptr, size, func); }
static int rb_dl_scan_callback_args(long stack[], const char *proto, int *argc, VALUE argv[]) { int i; long *sp; VALUE val; sp = stack; for (i=1; proto[i]; i++) { switch (proto[i]) { case 'C': { char v; v = (char)(*sp); sp++; val = INT2NUM(v); } break; case 'H': { short v; v = (short)(*sp); sp++; val = INT2NUM(v); } break; case 'I': { int v; v = (int)(*sp); sp++; val = INT2NUM(v); } break; case 'L': { long v; v = (long)(*sp); sp++; val = INT2NUM(v); } break; case 'F': { float v; memcpy(&v, sp, sizeof(float)); sp += sizeof(float)/sizeof(long); val = rb_float_new(v); } break; case 'D': { double v; memcpy(&v, sp, sizeof(double)); sp += sizeof(double)/sizeof(long); val = rb_float_new(v); } break; case 'P': { void *v; memcpy(&v, sp, sizeof(void*)); sp++; val = rb_dlptr_new(v, 0, 0); } break; case 'S': { char *v; memcpy(&v, sp, sizeof(void*)); sp++; val = rb_tainted_str_new2(v); } break; default: rb_raise(rb_eDLTypeError, "unsupported type `%c'", proto[i]); break; } argv[i-1] = val; } *argc = (i - 1); return (*argc); }