mirror of
https://github.com/msgpack/msgpack-c.git
synced 2025-03-19 04:52:59 +01:00
MessagePack for Ruby moved to https://github.com/msgpack/msgpack
This commit is contained in:
parent
754126644f
commit
85d65c59d2
@ -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);
|
||||||
|
@ -1 +0,0 @@
|
|||||||
FURUHASHI Sadayuki <frsyuki _at_ users.sourceforge.jp>
|
|
@ -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
|
|
||||||
|
|
37
ruby/README
37
ruby/README
@ -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
1
ruby/README.md
Normal file
@ -0,0 +1 @@
|
|||||||
|
MessagePack for Ruby moved to https://github.com/msgpack/msgpack-ruby.
|
@ -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
|
|
||||||
|
|
@ -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 */
|
|
||||||
|
|
@ -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')
|
|
||||||
|
|
@ -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
|
|
||||||
|
|
@ -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
|
|
314
ruby/pack.c
314
ruby/pack.c
@ -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);
|
|
||||||
}
|
|
||||||
|
|
26
ruby/pack.h
26
ruby/pack.h
@ -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 */
|
|
||||||
|
|
@ -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);
|
|
||||||
}
|
|
@ -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
|
|
||||||
|
|
@ -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
|
|
||||||
|
|
@ -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
|
|
@ -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
|
|
||||||
|
|
1001
ruby/unpack.c
1001
ruby/unpack.c
File diff suppressed because it is too large
Load Diff
@ -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 */
|
|
||||||
|
|
@ -1,3 +0,0 @@
|
|||||||
module MessagePack
|
|
||||||
VERSION = "0.4.8"
|
|
||||||
end
|
|
Loading…
x
Reference in New Issue
Block a user