ruby binding: fix Fixnum serialization bug on x86_64

git-svn-id: file:///Users/frsyuki/project/msgpack-git/svn/x@88 5a5092ae-2292-43ba-b2d5-dcab9c1a2731
This commit is contained in:
frsyuki 2009-02-15 09:10:00 +00:00
parent 15837bc332
commit 8f3444c081
4 changed files with 134 additions and 17 deletions

View File

@ -1,5 +1,5 @@
AC_INIT(msgpack/unpack_template.h)
AM_INIT_AUTOMAKE(msgpack, 0.2.0)
AM_INIT_AUTOMAKE(msgpack, 0.2.1)
AC_CONFIG_HEADER(config.h)
AC_PROG_LIBTOOL

View File

@ -68,15 +68,14 @@
* Integer
*/
// wrapper
msgpack_pack_inline_func(int)(msgpack_pack_user x, int d)
static inline void msgpack_pack_compress_int32(msgpack_pack_user x, uint32_t d)
{
if(d < -32) {
if(d < -32768) {
if(d < -(1<<5)) {
if(d < -(1<<15)) {
// signed 32
const unsigned char buf[5] = {0xd2, STORE_BE32(d)};
msgpack_pack_append_buffer(x, buf, 5);
} else if(d < -128) {
} else if(d < -(1<<7)) {
// signed 16
const unsigned char buf[3] = {0xd1, STORE_BE16(d)};
msgpack_pack_append_buffer(x, buf, 3);
@ -85,15 +84,15 @@ msgpack_pack_inline_func(int)(msgpack_pack_user x, int d)
const unsigned char buf[2] = {0xd0, (uint8_t)d};
msgpack_pack_append_buffer(x, buf, 2);
}
} else if(d < 128) {
} else if(d < (1<<7)) {
// fixnum
msgpack_pack_append_buffer(x, (uint8_t*)&d, 1);
} else {
if(d < 256) {
if(d < (1<<8)) {
// unsigned 8
const unsigned char buf[2] = {0xcc, (uint8_t)d};
msgpack_pack_append_buffer(x, buf, 2);
} else if(d < 65536) {
} else if(d < (1<<16)) {
// unsigned 16
const unsigned char buf[3] = {0xcd, STORE_BE16(d)};
msgpack_pack_append_buffer(x, buf, 3);
@ -105,11 +104,10 @@ msgpack_pack_inline_func(int)(msgpack_pack_user x, int d)
}
}
// wrapper
msgpack_pack_inline_func(unsigned_int)(msgpack_pack_user x, unsigned int d)
static inline void msgpack_pack_compress_uint32(msgpack_pack_user x, uint32_t d)
{
if(d < 256) {
if(d < 128) {
if(d < (1<<8)) {
if(d < (1<<7)) {
// fixnum
msgpack_pack_append_buffer(x, (unsigned char*)&d, 1);
} else {
@ -118,7 +116,7 @@ msgpack_pack_inline_func(unsigned_int)(msgpack_pack_user x, unsigned int d)
msgpack_pack_append_buffer(x, buf, 2);
}
} else {
if(d < 65536) {
if(d < (1<<16)) {
// unsigned 16
const unsigned char buf[3] = {0xcd, STORE_BE16(d)};
msgpack_pack_append_buffer(x, buf, 3);
@ -130,6 +128,123 @@ msgpack_pack_inline_func(unsigned_int)(msgpack_pack_user x, unsigned int d)
}
}
static inline void msgpack_pack_compress_int64(msgpack_pack_user x, int64_t d)
{
if(d < -(1LL<<5)) {
if(d < -(1LL<<15)) {
if(d < -(1LL<<31)) {
// signed 64
const unsigned char buf[9] = {0xd3, STORE_BE64(d)};
msgpack_pack_append_buffer(x, buf, 9);
} else {
// signed 32
const unsigned char buf[5] = {0xd2, STORE_BE32(d)};
msgpack_pack_append_buffer(x, buf, 5);
}
} else {
if(d < -(1<<7)) {
// signed 16
const unsigned char buf[3] = {0xd1, STORE_BE16(d)};
msgpack_pack_append_buffer(x, buf, 3);
} else {
// signed 8
const unsigned char buf[2] = {0xd0, (uint8_t)d};
msgpack_pack_append_buffer(x, buf, 2);
}
}
} else if(d < (1<<7)) {
// fixnum
msgpack_pack_append_buffer(x, (uint8_t*)&d, 1);
} else {
if(d < (1LL<<16)) {
if(d < (1<<8)) {
// unsigned 8
const unsigned char buf[2] = {0xcc, (uint8_t)d};
msgpack_pack_append_buffer(x, buf, 2);
} else {
// unsigned 16
const unsigned char buf[3] = {0xcd, STORE_BE16(d)};
msgpack_pack_append_buffer(x, buf, 3);
}
} else {
if(d < (1LL<<32)) {
// unsigned 32
const unsigned char buf[5] = {0xce, STORE_BE32(d)};
msgpack_pack_append_buffer(x, buf, 5);
} else {
// unsigned 64
const unsigned char buf[9] = {0xcf, STORE_BE64(d)};
msgpack_pack_append_buffer(x, buf, 9);
}
}
}
}
static inline void msgpack_pack_compress_uint64(msgpack_pack_user x, uint64_t d)
{
if(d < (1ULL<<8)) {
if(d < (1<<7)) {
// fixnum
msgpack_pack_append_buffer(x, (unsigned char*)&d, 1);
} else {
// unsigned 8
const unsigned char buf[2] = {0xcc, (uint8_t)d};
msgpack_pack_append_buffer(x, buf, 2);
}
} else {
if(d < (1ULL<<16)) {
// signed 16
const unsigned char buf[3] = {0xcd, STORE_BE16(d)};
msgpack_pack_append_buffer(x, buf, 3);
} else if(d < (1ULL<<32)) {
// signed 32
const unsigned char buf[5] = {0xce, STORE_BE32(d)};
msgpack_pack_append_buffer(x, buf, 5);
} else {
// signed 64
const unsigned char buf[9] = {0xcf, STORE_BE64(d)};
msgpack_pack_append_buffer(x, buf, 9);
}
}
}
msgpack_pack_inline_func(int)(msgpack_pack_user x, int d)
{
#if SIZEOF_INT == 8
msgpack_pack_compress_int64(x, d);
#else
msgpack_pack_compress_int32(x, d);
#endif
}
msgpack_pack_inline_func(unsigned_int)(msgpack_pack_user x, unsigned int d)
{
#if SIZEOF_INT == 8
msgpack_pack_compress_uint64(x, d);
#else
msgpack_pack_compress_uint32(x, d);
#endif
}
msgpack_pack_inline_func(long)(msgpack_pack_user x, long d)
{
#if SIZEOF_LONG == 8
msgpack_pack_compress_int64(x, d);
#else
msgpack_pack_compress_int32(x, d);
#endif
}
msgpack_pack_inline_func(unsigned_long)(msgpack_pack_user x, unsigned long d)
{
#if SIZEOF_LONG == 8
msgpack_pack_compress_uint64(x, d);
#else
msgpack_pack_compress_uint32(x, d);
#endif
}
msgpack_pack_inline_func(uint8)(msgpack_pack_user x, uint8_t d)
{
if(d < 128) {

View File

@ -2,7 +2,7 @@ module MessagePack
module VERSION #:nodoc:
MAJOR = 0
MINOR = 2
TINY = 0
TINY = 1
STRING = [MAJOR, MINOR, TINY].join('.')
end

View File

@ -20,7 +20,7 @@
#include <stdint.h>
#define msgpack_pack_inline_func(name) \
static void msgpack_pack_##name
static inline void msgpack_pack_##name
#define msgpack_pack_user VALUE
@ -30,6 +30,8 @@
/*
static void msgpack_pack_int(VALUE x, int d);
static void msgpack_pack_unsigned_int(VALUE x, unsigned int d);
static void msgpack_pack_long(VALUE x, long d);
static void msgpack_pack_unsigned_long(VALUE x, unsigned long d);
static void msgpack_pack_uint8(VALUE x, uint8_t d);
static void msgpack_pack_uint16(VALUE x, uint16_t d);
static void msgpack_pack_uint32(VALUE x, uint32_t d);
@ -93,7 +95,7 @@ static VALUE MessagePack_FalseClass_to_msgpack(int argc, VALUE *argv, VALUE self
static VALUE MessagePack_Fixnum_to_msgpack(int argc, VALUE *argv, VALUE self)
{
ARG_BUFFER(out, argc, argv);
msgpack_pack_int(out, FIX2INT(self));
msgpack_pack_long(out, FIX2LONG(self));
return out;
}