/* * Document-method: Bignum#to_msgpack * * call-seq: * bignum.to_msgpack(out = '') -> String * * Serializes the Bignum into raw bytes. */ static VALUE MessagePack_Bignum_to_msgpack(int argc, VALUE *argv, VALUE self) { ARG_BUFFER(out, argc, argv); if(RBIGNUM_POSITIVE_P(self)) { msgpack_pack_uint64(out, rb_big2ull(self)); } else { msgpack_pack_int64(out, rb_big2ll(self)); } return out; }
/* * Document-method: Bignum#to_msgpack * * call-seq: * bignum.to_msgpack(out = '') -> String * * Serializes the Bignum into raw bytes. */ static VALUE MessagePack_Bignum_to_msgpack(int argc, VALUE *argv, VALUE self) { ARG_BUFFER(out, argc, argv); // FIXME bignum if(RBIGNUM_SIGN(self)) { // positive msgpack_pack_uint64(out, rb_big2ull(self)); } else { // negative msgpack_pack_int64(out, rb_big2ll(self)); } return out; }
void mochilo_pack_bignum(mochilo_buf *buf, VALUE rb_bignum) { if (RBIGNUM_POSITIVE_P(rb_bignum)) { uint64_t bignum = rb_big2ull(rb_bignum); mochilo_buf_putc(buf, MSGPACK_T_UINT64); mochilo_buf_put64be(buf, &bignum); } else { int64_t bignum = rb_big2ll(rb_bignum); mochilo_buf_putc(buf, MSGPACK_T_INT64); mochilo_buf_put64be(buf, &bignum); } }
void value_to_generic(int type, VALUE src, fiddle_generic * dst) { int signed_p = 1; if (type < 0) { type = -1 * type; signed_p = 0; } switch (type) { case TYPE_VOID: break; case TYPE_VOIDP: dst->pointer = NUM2PTR(rb_Integer(src)); break; case TYPE_CHAR: dst->schar = NUM2INT(src); break; case TYPE_SHORT: dst->sshort = NUM2INT(src); break; case TYPE_INT: dst->sint = NUM2INT(src); break; case TYPE_LONG: if (signed_p) dst->slong = NUM2LONG(src); else dst->ulong = NUM2LONG(src); break; #if HAVE_LONG_LONG case TYPE_LONG_LONG: dst->long_long = rb_big2ull(src); break; #endif case TYPE_FLOAT: dst->ffloat = (float)NUM2DBL(src); break; case TYPE_DOUBLE: dst->ddouble = NUM2DBL(src); break; default: rb_raise(rb_eRuntimeError, "unknown type %d", type); } }
void callback(ffi_cif *cif, void *resp, void **args, void *ctx) { VALUE self = (VALUE)ctx; VALUE rbargs = rb_iv_get(self, "@args"); VALUE ctype = rb_iv_get(self, "@ctype"); int argc = RARRAY_LENINT(rbargs); VALUE *params = xcalloc(argc, sizeof(VALUE *)); VALUE ret; VALUE cPointer; int i, type; cPointer = rb_const_get(mFiddle, rb_intern("Pointer")); for (i = 0; i < argc; i++) { type = NUM2INT(RARRAY_PTR(rbargs)[i]); switch (type) { case TYPE_VOID: argc = 0; break; case TYPE_INT: params[i] = INT2NUM(*(int *)args[i]); break; case TYPE_VOIDP: params[i] = rb_funcall(cPointer, rb_intern("[]"), 1, PTR2NUM(*(void **)args[i])); break; case TYPE_LONG: params[i] = LONG2NUM(*(long *)args[i]); break; case TYPE_CHAR: params[i] = INT2NUM(*(char *)args[i]); break; case TYPE_DOUBLE: params[i] = rb_float_new(*(double *)args[i]); break; case TYPE_FLOAT: params[i] = rb_float_new(*(float *)args[i]); break; #if HAVE_LONG_LONG case TYPE_LONG_LONG: params[i] = rb_ull2inum(*(unsigned LONG_LONG *)args[i]); break; #endif default: rb_raise(rb_eRuntimeError, "closure args: %d", type); } } ret = rb_funcall2(self, rb_intern("call"), argc, params); type = NUM2INT(ctype); switch (type) { case TYPE_VOID: break; case TYPE_LONG: *(long *)resp = NUM2LONG(ret); break; case TYPE_CHAR: *(char *)resp = NUM2INT(ret); break; case TYPE_VOIDP: *(void **)resp = NUM2PTR(ret); break; case TYPE_INT: *(int *)resp = NUM2INT(ret); break; case TYPE_DOUBLE: *(double *)resp = NUM2DBL(ret); break; case TYPE_FLOAT: *(float *)resp = (float)NUM2DBL(ret); break; #if HAVE_LONG_LONG case TYPE_LONG_LONG: *(unsigned LONG_LONG *)resp = rb_big2ull(ret); break; #endif default: rb_raise(rb_eRuntimeError, "closure retval: %d", type); } xfree(params); }