This commit is contained in:
FURUHASHI Sadayuki 2012-12-20 10:39:47 -08:00
parent 754126644f
commit 85d65c59d2
20 changed files with 12 additions and 2161 deletions

View File

@ -1,7 +1,7 @@
// //
// MessagePack for C++ static resolution routine // MessagePack for C++ static resolution routine
// //
// Copyright (C) 2008-2009 FURUHASHI Sadayuki // Copyright (C) 2008-2010 FURUHASHI Sadayuki
// //
// Licensed under the Apache License, Version 2.0 (the "License"); // Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. // you may not use this file except in compliance with the License.
@ -124,6 +124,16 @@ private:
with_zone(); with_zone();
}; };
class managed_object : public object, private zone {
public:
managed_object() { }
~managed_object() { }
public:
zone& get_zone() { return *(zone*)this; }
const zone& get_zone() const { return *(const zone*)this; }
private:
managed_object(const managed_object&);
};
bool operator==(const object x, const object y); bool operator==(const object x, const object y);
bool operator!=(const object x, const object y); bool operator!=(const object x, const object y);

View File

@ -1 +0,0 @@
FURUHASHI Sadayuki <frsyuki _at_ users.sourceforge.jp>

View File

@ -1,34 +0,0 @@
2012-12-16 version 0.4.8:
* Fixed compile error on Rubinius. Function prototype rb_gc_enable() is no
longer needed.
2012-05-05 version 0.4.7:
* Fixed serialization of double values on ARM OABI architectures
* Fixed byteorder problem on big-endian platforms
* Don't use MRI internals in the Ruby extension for Rubinius
* Detect whether st.h is present and don't use RUBY_VM as the condition for
Rubinius
2011-08-08 version 0.4.6:
* Fixed compile error problem on Mac OS X Lion
2011-05-09 version 0.4.5:
* Improves compatibility with JRuby
2010-11-28 version 0.4.4:
* Adds Unpacker#feed_each method
* Improves compatibility with Rubinius
* Improves compatibility with ruby-1.8.5
* Encodings of String instances to UTF-8 on Ruby 1.9
2010-06-29 version 0.4.3:
* Adds MessagePack::VERSION constant
* Fixes SEGV problem caused by GC bug at MessagePack_Unpacker_mark

View File

@ -1,37 +0,0 @@
= MessagePack
== Description
MessagePack is a binary-based efficient object serialization library.
It enables to exchange structured objects between many languages like JSON.
But unlike JSON, it is very fast and small.
Simple usage is as follows:
require 'msgpack'
msg = [1,2,3].to_msgpack #=> "\x93\x01\x02\x03"
MessagePack.unpack(msg) #=> [1,2,3]
Use MessagePack::Unpacker for streaming deserialization.
== Installation
=== Archive Installation
ruby extconf.rb
make
make install
=== Gem Installation
gem install msgpack
== Copyright
Author:: frsyuki <frsyuki@users.sourceforge.jp>
Copyright:: Copyright (c) 2008-2010 FURUHASHI Sadayuki
License:: Apache License, Version 2.0

1
ruby/README.md Normal file
View File

@ -0,0 +1 @@
MessagePack for Ruby moved to https://github.com/msgpack/msgpack-ruby.

View File

@ -1,70 +0,0 @@
require 'rubygems'
require 'json'
require 'msgpack'
def show10(str)
puts "#{str.length/1024} KB"
puts str[0, 10].unpack('C*').map{|x|"%02x"%x}.join(' ') + " ..."
end
ary = []
i = 0
while i < (1<<24)
#ary << (1<<24)
ary << i
i += 1
end
GC.start
puts "----"
puts "MessagePack"
a = Time.now
packed = MessagePack::pack(ary)
b = Time.now
show10(packed)
sec = b - a
puts "#{sec} sec."
puts "#{packed.length.to_f / sec / 1024 / 1024 * 8} Mbps"
GC.start
=begin
puts "----"
puts "JSON"
a = Time.now
json = ary.to_json
b = Time.now
show10(json)
puts "#{b-a} sec."
ary = nil
GC.start
=end
puts "----"
puts "MessagePack"
a = Time.now
ary = MessagePack::unpack(packed)
b = Time.now
sec = b - a
puts "#{sec} sec."
puts "#{packed.length.to_f / sec / 1024 / 1024 * 8} Mbps"
p ary.size
p (1<<24)
ary = nil
GC.start
=begin
puts "----"
puts "JSON"
a = Time.now
ary = JSON::load(json)
b = Time.now
puts "#{b-a} sec."
=end

View File

@ -1,90 +0,0 @@
/*
* MessagePack for Ruby
*
* Copyright (C) 2008-2010 FURUHASHI Sadayuki
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef COMPAT_H__
#define COMPAT_H__
#ifdef HAVE_RUBY_ENCODING_H
#include "ruby/encoding.h"
#define COMPAT_HAVE_ENCODING
extern int s_enc_utf8;
extern int s_enc_ascii8bit;
extern int s_enc_usascii;
extern VALUE s_enc_utf8_value;
#endif
/* MRI 1.9 */
#if defined(RUBY_VM)
#define COMPAT_RERAISE rb_exc_raise(rb_errinfo())
/* JRuby */
#elif defined(JRUBY)
#define COMPAT_RERAISE rb_exc_raise(rb_gv_get("$!"))
/* MRI 1.8 and Rubinius */
#else
#define COMPAT_RERAISE rb_exc_raise(ruby_errinfo)
#endif
#ifndef RBIGNUM_POSITIVE_P
/* JRuby */
#if defined(JRUBY)
#define RBIGNUM_POSITIVE_P(b) (rb_funcall(b, rb_intern(">="), 1, INT2FIX(0)) == Qtrue)
#define rb_big2ull(b) rb_num2ull(b)
/*#define rb_big2ll(b) rb_num2ll(b)*/
/* MRI 1.8 */
#else
#define RBIGNUM_POSITIVE_P(b) (RBIGNUM(b)->sign)
#endif
#endif
/* JRuby */
#if defined(JRUBY)
static inline void rb_gc_enable() { return; }
static inline void rb_gc_disable() { return; }
#endif
/* MRI 1.8.5 */
#ifndef RSTRING_PTR
#define RSTRING_PTR(s) (RSTRING(s)->ptr)
#endif
/* MRI 1.8.5 */
#ifndef RSTRING_LEN
#define RSTRING_LEN(s) (RSTRING(s)->len)
#endif
/* MRI 1.8.5 */
#ifndef RARRAY_PTR
#define RARRAY_PTR(s) (RARRAY(s)->ptr)
#endif
/* MRI 1.8.5 */
#ifndef RARRAY_LEN
#define RARRAY_LEN(s) (RARRAY(s)->len)
#endif
#endif /* compat.h */

View File

@ -1,7 +0,0 @@
require 'mkmf'
require './version.rb'
$CFLAGS << %[ -I.. -Wall -O3 -DMESSAGEPACK_VERSION=\\"#{MessagePack::VERSION}\\" -g]
have_header("ruby/st.h")
have_header("st.h")
create_makefile('msgpack')

View File

@ -1,36 +0,0 @@
#!/bin/sh
mkdir -p ext
mkdir -p msgpack
cp extconf.rb ext/
cp pack.c ext/
cp pack.h ext/
cp rbinit.c ext/
cp unpack.c ext/
cp unpack.h ext/
cp compat.h ext/
cp version.rb ext/
cp ../msgpack/pack_define.h msgpack/
cp ../msgpack/pack_template.h msgpack/
cp ../msgpack/unpack_define.h msgpack/
cp ../msgpack/unpack_template.h msgpack/
cp ../msgpack/sysdep.h msgpack/
cp ../test/cases.mpac test/
cp ../test/cases_compact.mpac test/
cp ../test/cases.json test/
gem build msgpack.gemspec
rdoc rbinit.c pack.c unpack.c
if [ $? -eq 0 ]; then
rm -rf ext msgpack test/msgpack_test.rb
fi
# gem install gem-compile # on msys
# gem compile msgpack-$version.gem # on msys
# gem compile msgpack-$version.gem -p mswin32 # on msys
# gem push msgpack-$version.gem
# gem push msgpack-$version-x86-mingw32.gem
# gem push msgpack-$version-mswin32.gem

View File

@ -1,17 +0,0 @@
require './version.rb'
Gem::Specification.new do |s|
s.platform = Gem::Platform::RUBY
s.name = "msgpack"
s.version = MessagePack::VERSION
s.summary = "MessagePack, a binary-based efficient data interchange format."
s.author = "FURUHASHI Sadayuki"
s.email = "frsyuki@users.sourceforge.jp"
s.homepage = "http://msgpack.org/"
s.rubyforge_project = "msgpack"
s.has_rdoc = true
s.rdoc_options = ["ext"]
s.require_paths = ["lib"]
s.files = Dir["ext/**/*", "msgpack/**/*", "test/**/*"]
s.test_files = Dir["test/test_*.rb"]
s.extensions = Dir["ext/**/extconf.rb"]
end

View File

@ -1,314 +0,0 @@
/*
* MessagePack for Ruby packing routine
*
* Copyright (C) 2008-2010 FURUHASHI Sadayuki
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#define RSTRING_NOT_MODIFIED
#include "ruby.h"
#include "compat.h"
#include "msgpack/pack_define.h"
static ID s_to_msgpack;
static ID s_append;
#define msgpack_pack_inline_func(name) \
static inline void msgpack_pack ## name
#define msgpack_pack_inline_func_cint(name) \
static inline void msgpack_pack ## name
#define msgpack_pack_user VALUE
#define msgpack_pack_append_buffer(user, buf, len) \
((TYPE(user) == T_STRING) ? \
rb_str_buf_cat(user, (const void*)buf, len) : \
rb_funcall(user, s_append, 1, rb_str_new((const void*)buf,len)))
#include "msgpack/pack_template.h"
#if defined(HAVE_RUBY_ST_H)
#include "ruby/st.h" // ruby hash on Ruby 1.9
#elif defined(HAVE_ST_H)
#include "st.h" // ruby hash on Ruby 1.8
#endif
#define ARG_BUFFER(name, argc, argv) \
VALUE name; \
if(argc == 1) { \
name = argv[0]; \
} else if(argc == 0) { \
name = rb_str_buf_new(0); \
} else { \
rb_raise(rb_eArgError, "wrong number of arguments (%d for 0)", argc); \
}
/*
* Document-method: NilClass#to_msgpack
*
* call-seq:
* nil.to_msgpack(out = '') -> String
*
* Serializes the nil into raw bytes.
*/
static VALUE MessagePack_NilClass_to_msgpack(int argc, VALUE *argv, VALUE self)
{
ARG_BUFFER(out, argc, argv);
msgpack_pack_nil(out);
return out;
}
/*
* Document-method: TrueClass#to_msgpack
*
* call-seq:
* true.to_msgpack(out = '') -> String
*
* Serializes the true into raw bytes.
*/
static VALUE MessagePack_TrueClass_to_msgpack(int argc, VALUE *argv, VALUE self)
{
ARG_BUFFER(out, argc, argv);
msgpack_pack_true(out);
return out;
}
/*
* Document-method: FalseClass#to_msgpack
*
* call-seq:
* false.to_msgpack(out = '') -> String
*
* Serializes false into raw bytes.
*/
static VALUE MessagePack_FalseClass_to_msgpack(int argc, VALUE *argv, VALUE self)
{
ARG_BUFFER(out, argc, argv);
msgpack_pack_false(out);
return out;
}
/*
* Document-method: Fixnum#to_msgpack
*
* call-seq:
* fixnum.to_msgpack(out = '') -> String
*
* Serializes the Fixnum into raw bytes.
*/
static VALUE MessagePack_Fixnum_to_msgpack(int argc, VALUE *argv, VALUE self)
{
ARG_BUFFER(out, argc, argv);
#ifdef JRUBY
msgpack_pack_long(out, FIXNUM_P(self) ? FIX2LONG(self) : rb_num2ll(self));
#else
msgpack_pack_long(out, FIX2LONG(self));
#endif
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);
if(RBIGNUM_POSITIVE_P(self)) {
msgpack_pack_uint64(out, rb_big2ull(self));
} else {
msgpack_pack_int64(out, rb_big2ll(self));
}
return out;
}
/*
* Document-method: Float#to_msgpack
*
* call-seq:
* float.to_msgpack(out = '') -> String
*
* Serializes the Float into raw bytes.
*/
static VALUE MessagePack_Float_to_msgpack(int argc, VALUE *argv, VALUE self)
{
ARG_BUFFER(out, argc, argv);
msgpack_pack_double(out, rb_num2dbl(self));
return out;
}
/*
* Document-method: String#to_msgpack
*
* call-seq:
* string.to_msgpack(out = '') -> String
*
* Serializes the String into raw bytes.
*/
static VALUE MessagePack_String_to_msgpack(int argc, VALUE *argv, VALUE self)
{
ARG_BUFFER(out, argc, argv);
#ifdef COMPAT_HAVE_ENCODING
int enc = ENCODING_GET(self);
if(enc != s_enc_utf8 && enc != s_enc_ascii8bit && enc != s_enc_usascii) {
if(!ENC_CODERANGE_ASCIIONLY(self)) {
self = rb_str_encode(self, s_enc_utf8_value, 0, Qnil);
}
}
#endif
msgpack_pack_raw(out, RSTRING_LEN(self));
msgpack_pack_raw_body(out, RSTRING_PTR(self), RSTRING_LEN(self));
return out;
}
/*
* Document-method: Symbol#to_msgpack
*
* call-seq:
* symbol.to_msgpack(out = '') -> String
*
* Serializes the Symbol into raw bytes.
*/
static VALUE MessagePack_Symbol_to_msgpack(int argc, VALUE *argv, VALUE self)
{
#ifdef COMPAT_HAVE_ENCODING
return MessagePack_String_to_msgpack(argc, argv, rb_id2str(SYM2ID(self)));
#else
ARG_BUFFER(out, argc, argv);
const char* name = rb_id2name(SYM2ID(self));
size_t len = strlen(name);
msgpack_pack_raw(out, len);
msgpack_pack_raw_body(out, name, len);
return out;
#endif
}
/*
* Document-method: Array#to_msgpack
*
* call-seq:
* array.to_msgpack(out = '') -> String
*
* Serializes the Array into raw bytes.
* This calls to_msgpack method reflectively for internal elements.
*/
static VALUE MessagePack_Array_to_msgpack(int argc, VALUE *argv, VALUE self)
{
ARG_BUFFER(out, argc, argv);
// FIXME check sizeof(long) > sizeof(unsigned int) && RARRAY_LEN(self) > UINT_MAX
unsigned int ary_length = (unsigned int)RARRAY_LEN(self);
unsigned int i = 0;
msgpack_pack_array(out, ary_length);
for(; i < ary_length; ++i) {
VALUE p = rb_ary_entry(self, i);
rb_funcall(p, s_to_msgpack, 1, out);
}
return out;
}
#ifndef RHASH_SIZE // Ruby 1.8
#define RHASH_SIZE(h) (RHASH(h)->tbl ? RHASH(h)->tbl->num_entries : 0)
#endif
static int MessagePack_Hash_to_msgpack_foreach(VALUE key, VALUE value, VALUE out)
{
if (key == Qundef) { return ST_CONTINUE; }
rb_funcall(key, s_to_msgpack, 1, out);
rb_funcall(value, s_to_msgpack, 1, out);
return ST_CONTINUE;
}
/*
* Document-method: Hash#to_msgpack
*
* call-seq:
* hash.to_msgpack(out = '') -> String
*
* Serializes the Hash into raw bytes.
* This calls to_msgpack method reflectively for internal keys and values.
*/
static VALUE MessagePack_Hash_to_msgpack(int argc, VALUE *argv, VALUE self)
{
ARG_BUFFER(out, argc, argv);
// FIXME check sizeof(st_index_t) > sizeof(unsigned int) && RARRAY_LEN(self) > UINT_MAX
msgpack_pack_map(out, (unsigned int)RHASH_SIZE(self));
rb_hash_foreach(self, MessagePack_Hash_to_msgpack_foreach, out);
return out;
}
/**
* Document-method: MessagePack.pack
*
* call-seq:
* MessagePack.pack(object, out = '') -> String
*
* Serializes the object into raw bytes. The encoding of the string is ASCII-8BIT on Ruby 1.9.
* This method is same as object.to_msgpack(out = '').
*
* _out_ is an object that implements *<<* method like String or IO.
*/
static VALUE MessagePack_pack(int argc, VALUE* argv, VALUE self)
{
VALUE out;
if(argc == 1) {
out = rb_str_buf_new(0);
} else if(argc == 2) {
out = argv[1];
} else {
rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)", argc);
}
return rb_funcall(argv[0], s_to_msgpack, 1, out);
}
void Init_msgpack_pack(VALUE mMessagePack)
{
s_to_msgpack = rb_intern("to_msgpack");
s_append = rb_intern("<<");
rb_define_method(rb_cNilClass, "to_msgpack", MessagePack_NilClass_to_msgpack, -1);
rb_define_method(rb_cTrueClass, "to_msgpack", MessagePack_TrueClass_to_msgpack, -1);
rb_define_method(rb_cFalseClass, "to_msgpack", MessagePack_FalseClass_to_msgpack, -1);
rb_define_method(rb_cFixnum, "to_msgpack", MessagePack_Fixnum_to_msgpack, -1);
rb_define_method(rb_cBignum, "to_msgpack", MessagePack_Bignum_to_msgpack, -1);
rb_define_method(rb_cFloat, "to_msgpack", MessagePack_Float_to_msgpack, -1);
rb_define_method(rb_cString, "to_msgpack", MessagePack_String_to_msgpack, -1);
rb_define_method(rb_cArray, "to_msgpack", MessagePack_Array_to_msgpack, -1);
rb_define_method(rb_cHash, "to_msgpack", MessagePack_Hash_to_msgpack, -1);
rb_define_method(rb_cSymbol, "to_msgpack", MessagePack_Symbol_to_msgpack, -1);
/**
* MessagePack module is defined in rbinit.c file.
* mMessagePack = rb_define_module("MessagePack");
*/
rb_define_module_function(mMessagePack, "pack", MessagePack_pack, -1);
}

View File

@ -1,26 +0,0 @@
/*
* MessagePack for Ruby packing routine
*
* Copyright (C) 2008-2010 FURUHASHI Sadayuki
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef PACK_H__
#define PACK_H__
#include "ruby.h"
void Init_msgpack_pack(VALUE mMessagePack);
#endif /* pack.h */

View File

@ -1,66 +0,0 @@
/*
* MessagePack for Ruby
*
* Copyright (C) 2008-2010 FURUHASHI Sadayuki
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "pack.h"
#include "unpack.h"
#include "compat.h"
static VALUE mMessagePack;
#ifdef COMPAT_HAVE_ENCODING
int s_enc_utf8;
int s_enc_ascii8bit;
int s_enc_usascii;
VALUE s_enc_utf8_value;
#endif
/**
* Document-module: MessagePack
*
* MessagePack is a binary-based efficient object serialization library.
* It enables to exchange structured objects between many languages like JSON.
* But unlike JSON, it is very fast and small.
*
* You can install MessagePack with rubygems.
*
* gem install msgpack
*
* Simple usage is as follows:
*
* require 'msgpack'
* msg = [1,2,3].to_msgpack #=> "\x93\x01\x02\x03"
* MessagePack.unpack(msg) #=> [1,2,3]
*
* Use Unpacker class for streaming deserialization.
*
*/
void Init_msgpack(void)
{
mMessagePack = rb_define_module("MessagePack");
rb_define_const(mMessagePack, "VERSION", rb_str_new2(MESSAGEPACK_VERSION));
#ifdef COMPAT_HAVE_ENCODING
s_enc_ascii8bit = rb_ascii8bit_encindex();
s_enc_utf8 = rb_utf8_encindex();
s_enc_usascii = rb_usascii_encindex();
s_enc_utf8_value = rb_enc_from_encoding(rb_utf8_encoding());
#endif
Init_msgpack_unpack(mMessagePack);
Init_msgpack_pack(mMessagePack);
}

View File

@ -1,46 +0,0 @@
#!/usr/bin/env ruby
here = File.dirname(__FILE__)
require "#{here}/test_helper"
begin
require 'json'
rescue LoadError
require 'rubygems'
require 'json'
end
CASES_PATH = "#{here}/cases.mpac"
CASES_COMPACT_PATH = "#{here}/cases_compact.mpac"
CASES_JSON_PATH = "#{here}/cases.json"
class MessagePackTestCases < Test::Unit::TestCase
def feed_file(path)
pac = MessagePack::Unpacker.new
pac.feed File.read(path)
pac
end
def test_compare_compact
pac = feed_file(CASES_PATH)
cpac = feed_file(CASES_COMPACT_PATH)
objs = []; pac.each {| obj| objs << obj }
cobjs = []; cpac.each {|cobj| cobjs << cobj }
objs.zip(cobjs).each {|obj, cobj|
assert_equal(obj, cobj)
}
end
def test_compare_json
pac = feed_file(CASES_PATH)
objs = []; pac.each {|obj| objs << obj }
jobjs = JSON.load File.read(CASES_JSON_PATH)
objs.zip(jobjs) {|obj, jobj|
assert_equal(obj, jobj)
}
end
end

View File

@ -1,68 +0,0 @@
#!/usr/bin/env ruby
require File.dirname(__FILE__)+'/test_helper'
if RUBY_VERSION < "1.9"
exit
end
class MessagePackTestEncoding < Test::Unit::TestCase
def self.it(name, &block)
define_method("test_#{name}", &block)
end
it "US-ASCII" do
check_unpack "abc".force_encoding("US-ASCII")
end
it "UTF-8 ascii" do
check_unpack "abc".force_encoding("UTF-8")
end
it "UTF-8 mbstr" do
check_unpack "\xE3\x81\x82".force_encoding("UTF-8")
end
it "UTF-8 invalid" do
check_unpack "\xD0".force_encoding("UTF-8")
end
it "ASCII-8BIT" do
check_unpack "\xD0".force_encoding("ASCII-8BIT")
end
it "EUC-JP" do
x = "\xA4\xA2".force_encoding("EUC-JP")
check_unpack(x)
end
it "EUC-JP invalid" do
begin
"\xD0".force_encoding("EUC-JP").to_msgpack
assert(false)
rescue Encoding::InvalidByteSequenceError
assert(true)
end
end
private
def check_unpack(str)
if str.encoding.to_s == "ASCII-8BIT"
should_str = str.dup.force_encoding("UTF-8")
else
should_str = str.encode("UTF-8")
end
raw = str.to_msgpack
r = MessagePack.unpack(str.to_msgpack)
assert_equal(r.encoding.to_s, "UTF-8")
assert_equal(r, should_str.force_encoding("UTF-8"))
if str.valid_encoding?
sym = str.to_sym
r = MessagePack.unpack(sym.to_msgpack)
assert_equal(r.encoding.to_s, "UTF-8")
assert_equal(r, should_str.force_encoding("UTF-8"))
end
end
end

View File

@ -1,10 +0,0 @@
require 'test/unit'
begin
require File.dirname(__FILE__) + '/../msgpack'
rescue LoadError
require File.dirname(__FILE__) + '/../lib/msgpack'
end
if ENV["GC_STRESS"]
GC.stress = true
end

View File

@ -1,308 +0,0 @@
#!/usr/bin/env ruby
require File.dirname(__FILE__)+'/test_helper'
class MessagePackTestPackUnpack < Test::Unit::TestCase
def self.it(name, &block)
define_method("test_#{name}", &block)
end
it "nil" do
check 1, nil
end
it "true" do
check 1, true
end
it "false" do
check 1, false
end
it "zero" do
check 1, 0
end
it "positive fixnum" do
check 1, 1
check 1, (1<<6)
check 1, (1<<7)-1
end
it "positive int 8" do
check 1, -1
check 2, (1<<7)
check 2, (1<<8)-1
end
it "positive int 16" do
check 3, (1<<8)
check 3, (1<<16)-1
end
it "positive int 32" do
check 5, (1<<16)
check 5, (1<<32)-1
end
it "positive int 64" do
check 9, (1<<32)
check 9, (1<<64)-1
end
it "negative fixnum" do
check 1, -1
check 1, -((1<<5)-1)
check 1, -(1<<5)
end
it "negative int 8" do
check 2, -((1<<5)+1)
check 2, -(1<<7)
end
it "negative int 16" do
check 3, -((1<<7)+1)
check 3, -(1<<15)
end
it "negative int 32" do
check 5, -((1<<15)+1)
check 5, -(1<<31)
end
it "negative int 64" do
check 9, -((1<<31)+1)
check 9, -(1<<63)
end
it "double" do
check 9, 1.0
check 9, 0.1
check 9, -0.1
check 9, -1.0
end
it "fixraw" do
check_raw 1, 0
check_raw 1, (1<<5)-1
end
it "raw 16" do
check_raw 3, (1<<5)
check_raw 3, (1<<16)-1
end
it "raw 32" do
check_raw 5, (1<<16)
#check_raw 5, (1<<32)-1 # memory error
end
it "fixarray" do
check_array 1, 0
check_array 1, (1<<4)-1
end
it "array 16" do
check_array 3, (1<<4)
check_array 3, (1<<16)-1
end
it "array 32" do
check_array 5, (1<<16)
#check_array 5, (1<<32)-1 # memory error
end
it "nil" do
match nil, "\xc0"
end
it "false" do
match false, "\xc2"
end
it "true" do
match true, "\xc3"
end
it "0" do
match 0, "\x00"
end
it "127" do
match 127, "\x7f"
end
it "128" do
match 128, "\xcc\x80"
end
it "256" do
match 256, "\xcd\x01\x00"
end
it "-1" do
match -1, "\xff"
end
it "-33" do
match -33, "\xd0\xdf"
end
it "-129" do
match -129, "\xd1\xff\x7f"
end
it "{1=>1}" do
obj = {1=>1}
match obj, "\x81\x01\x01"
end
it "1.0" do
match 1.0, "\xcb\x3f\xf0\x00\x00\x00\x00\x00\x00"
end
it "[]" do
match [], "\x90"
end
it "[0, 1, ..., 14]" do
obj = (0..14).to_a
match obj, "\x9f\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e"
end
it "[0, 1, ..., 15]" do
obj = (0..15).to_a
match obj, "\xdc\x00\x10\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
end
it "{}" do
obj = {}
match obj, "\x80"
end
## FIXME
# it "{0=>0, 1=>1, ..., 14=>14}" do
# a = (0..14).to_a;
# match Hash[*a.zip(a).flatten], "\x8f\x05\x05\x0b\x0b\x00\x00\x06\x06\x0c\x0c\x01\x01\x07\x07\x0d\x0d\x02\x02\x08\x08\x0e\x0e\x03\x03\x09\x09\x04\x04\x0a\x0a"
# end
#
# it "{0=>0, 1=>1, ..., 15=>15}" do
# a = (0..15).to_a;
# match Hash[*a.zip(a).flatten], "\xde\x00\x10\x05\x05\x0b\x0b\x00\x00\x06\x06\x0c\x0c\x01\x01\x07\x07\x0d\x0d\x02\x02\x08\x08\x0e\x0e\x03\x03\x09\x09\x0f\x0f\x04\x04\x0a\x0a"
# end
## FIXME
# it "fixmap" do
# check_map 1, 0
# check_map 1, (1<<4)-1
# end
#
# it "map 16" do
# check_map 3, (1<<4)
# check_map 3, (1<<16)-1
# end
#
# it "map 32" do
# check_map 5, (1<<16)
# #check_map 5, (1<<32)-1 # memory error
# end
it "buffer" do
str = "a"*32*1024*4
raw = str.to_msgpack
pac = MessagePack::Unpacker.new
len = 0
parsed = false
n = 655
time = raw.size / n
time += 1 unless raw.size % n == 0
off = 0
time.times do
assert(!parsed)
fe = raw[off, n]
assert(fe.length > 0)
off += fe.length
#pac.feed fe
#pac.each {|obj|
pac.feed_each(fe) {|obj|
assert(!parsed)
assert_equal(obj, str)
parsed = true
}
end
assert(parsed)
end
it "gc mark" do
obj = [1024, {["a","b"]=>["c","d"]}, ["e","f"], "d", 70000, 4.12, 1.5, 1.5, 1.5]
num = 4
raw = obj.to_msgpack * num
pac = MessagePack::Unpacker.new
parsed = 0
raw.split(//).each do |b|
#pac.feed(b)
pac.feed_each(b) {|o|
GC.start
assert_equal(obj, o)
parsed += 1
}
GC.start
end
assert_equal(parsed, num)
end
it "streaming backward compatibility" do
obj = [1024, {["a","b"]=>["c","d"]}, ["e","f"], "d", 70000, 4.12, 1.5, 1.5, 1.5]
num = 4
raw = obj.to_msgpack * num
pac = MessagePack::Unpacker.new
buffer = ""
nread = 0
parsed = 0
raw.split(//).each do |b|
buffer << b
nread = pac.execute(buffer, nread)
if pac.finished?
o = pac.data
assert_equal(obj, o)
parsed += 1
pac.reset
buffer.slice!(0, nread)
nread = 0
next unless buffer.empty?
end
end
assert_equal(parsed, num)
end
it "MessagePack::VERSION constant" do
p MessagePack::VERSION
end
private
def check(len, obj)
v = obj.to_msgpack
assert_equal(v.length, len)
assert_equal(MessagePack.unpack(v), obj)
end
def check_raw(overhead, num)
check num+overhead, " "*num
end
def check_array(overhead, num)
check num+overhead, Array.new(num)
end
def match(obj, buf)
assert_equal(obj.to_msgpack, buf)
assert_equal(MessagePack::unpack(buf), obj)
end
end

File diff suppressed because it is too large Load Diff

View File

@ -1,26 +0,0 @@
/*
* MessagePack for Ruby unpacking routine
*
* Copyright (C) 2008-2010 FURUHASHI Sadayuki
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef UNPACK_H__
#define UNPACK_H__
#include "ruby.h"
void Init_msgpack_unpack(VALUE mMessagePack);
#endif /* unpack.h */

View File

@ -1,3 +0,0 @@
module MessagePack
VERSION = "0.4.8"
end