# HG changeset patch # User Kazuma # Date 1477165036 -32400 # Node ID e6ad9016601ca62a50a729b2f71b078670382db7 # Parent d132d442dc3421cc8648807227c08a88569f2d6b Add Msgpack for Unity. diff -r d132d442dc34 -r e6ad9016601c src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/SingletonMessage.cs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/SingletonMessage.cs Sun Oct 23 04:37:16 2016 +0900 @@ -0,0 +1,9 @@ +using UnityEngine; +using System.Collections; + +public class SingletonMessage : MonoBehaviour { + + public static MsgPack.ObjectPacker getInstance () { + return new MsgPack.ObjectPacker(); + } +} diff -r d132d442dc34 -r e6ad9016601c src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/HEAD --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/HEAD Sun Oct 23 04:37:16 2016 +0900 @@ -0,0 +1,1 @@ +ref: refs/heads/master diff -r d132d442dc34 -r e6ad9016601c src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/config --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/config Sun Oct 23 04:37:16 2016 +0900 @@ -0,0 +1,13 @@ +[core] + repositoryformatversion = 0 + filemode = false + bare = false + logallrefupdates = true + symlinks = false + ignorecase = true +[remote "origin"] + url = https://github.com/masharada/msgpack-unity.git + fetch = +refs/heads/*:refs/remotes/origin/* +[branch "master"] + remote = origin + merge = refs/heads/master diff -r d132d442dc34 -r e6ad9016601c src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/description --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/description Sun Oct 23 04:37:16 2016 +0900 @@ -0,0 +1,1 @@ +Unnamed repository; edit this file 'description' to name the repository. diff -r d132d442dc34 -r e6ad9016601c src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/hooks/applypatch-msg.sample --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/hooks/applypatch-msg.sample Sun Oct 23 04:37:16 2016 +0900 @@ -0,0 +1,15 @@ +#!/bin/sh +# +# An example hook script to check the commit log message taken by +# applypatch from an e-mail message. +# +# The hook should exit with non-zero status after issuing an +# appropriate message if it wants to stop the commit. The hook is +# allowed to edit the commit message file. +# +# To enable this hook, rename this file to "applypatch-msg". + +. git-sh-setup +commitmsg="$(git rev-parse --git-path hooks/commit-msg)" +test -x "$commitmsg" && exec "$commitmsg" ${1+"$@"} +: diff -r d132d442dc34 -r e6ad9016601c src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/hooks/commit-msg.sample --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/hooks/commit-msg.sample Sun Oct 23 04:37:16 2016 +0900 @@ -0,0 +1,24 @@ +#!/bin/sh +# +# An example hook script to check the commit log message. +# Called by "git commit" with one argument, the name of the file +# that has the commit message. The hook should exit with non-zero +# status after issuing an appropriate message if it wants to stop the +# commit. The hook is allowed to edit the commit message file. +# +# To enable this hook, rename this file to "commit-msg". + +# Uncomment the below to add a Signed-off-by line to the message. +# Doing this in a hook is a bad idea in general, but the prepare-commit-msg +# hook is more suited to it. +# +# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') +# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" + +# This example catches duplicate Signed-off-by lines. + +test "" = "$(grep '^Signed-off-by: ' "$1" | + sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || { + echo >&2 Duplicate Signed-off-by lines. + exit 1 +} diff -r d132d442dc34 -r e6ad9016601c src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/hooks/post-update.sample --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/hooks/post-update.sample Sun Oct 23 04:37:16 2016 +0900 @@ -0,0 +1,8 @@ +#!/bin/sh +# +# An example hook script to prepare a packed repository for use over +# dumb transports. +# +# To enable this hook, rename this file to "post-update". + +exec git update-server-info diff -r d132d442dc34 -r e6ad9016601c src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/hooks/pre-applypatch.sample --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/hooks/pre-applypatch.sample Sun Oct 23 04:37:16 2016 +0900 @@ -0,0 +1,14 @@ +#!/bin/sh +# +# An example hook script to verify what is about to be committed +# by applypatch from an e-mail message. +# +# The hook should exit with non-zero status after issuing an +# appropriate message if it wants to stop the commit. +# +# To enable this hook, rename this file to "pre-applypatch". + +. git-sh-setup +precommit="$(git rev-parse --git-path hooks/pre-commit)" +test -x "$precommit" && exec "$precommit" ${1+"$@"} +: diff -r d132d442dc34 -r e6ad9016601c src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/hooks/pre-commit.sample --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/hooks/pre-commit.sample Sun Oct 23 04:37:16 2016 +0900 @@ -0,0 +1,49 @@ +#!/bin/sh +# +# An example hook script to verify what is about to be committed. +# Called by "git commit" with no arguments. The hook should +# exit with non-zero status after issuing an appropriate message if +# it wants to stop the commit. +# +# To enable this hook, rename this file to "pre-commit". + +if git rev-parse --verify HEAD >/dev/null 2>&1 +then + against=HEAD +else + # Initial commit: diff against an empty tree object + against=4b825dc642cb6eb9a060e54bf8d69288fbee4904 +fi + +# If you want to allow non-ASCII filenames set this variable to true. +allownonascii=$(git config --bool hooks.allownonascii) + +# Redirect output to stderr. +exec 1>&2 + +# Cross platform projects tend to avoid non-ASCII filenames; prevent +# them from being added to the repository. We exploit the fact that the +# printable range starts at the space character and ends with tilde. +if [ "$allownonascii" != "true" ] && + # Note that the use of brackets around a tr range is ok here, (it's + # even required, for portability to Solaris 10's /usr/bin/tr), since + # the square bracket bytes happen to fall in the designated range. + test $(git diff --cached --name-only --diff-filter=A -z $against | + LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0 +then + cat <<\EOF +Error: Attempt to add a non-ASCII file name. + +This can cause problems if you want to work with people on other platforms. + +To be portable it is advisable to rename the file. + +If you know what you are doing you can disable this check using: + + git config hooks.allownonascii true +EOF + exit 1 +fi + +# If there are whitespace errors, print the offending file names and fail. +exec git diff-index --check --cached $against -- diff -r d132d442dc34 -r e6ad9016601c src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/hooks/pre-push.sample --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/hooks/pre-push.sample Sun Oct 23 04:37:16 2016 +0900 @@ -0,0 +1,53 @@ +#!/bin/sh + +# An example hook script to verify what is about to be pushed. Called by "git +# push" after it has checked the remote status, but before anything has been +# pushed. If this script exits with a non-zero status nothing will be pushed. +# +# This hook is called with the following parameters: +# +# $1 -- Name of the remote to which the push is being done +# $2 -- URL to which the push is being done +# +# If pushing without using a named remote those arguments will be equal. +# +# Information about the commits which are being pushed is supplied as lines to +# the standard input in the form: +# +# +# +# This sample shows how to prevent push of commits where the log message starts +# with "WIP" (work in progress). + +remote="$1" +url="$2" + +z40=0000000000000000000000000000000000000000 + +while read local_ref local_sha remote_ref remote_sha +do + if [ "$local_sha" = $z40 ] + then + # Handle delete + : + else + if [ "$remote_sha" = $z40 ] + then + # New branch, examine all commits + range="$local_sha" + else + # Update to existing branch, examine new commits + range="$remote_sha..$local_sha" + fi + + # Check for WIP commit + commit=`git rev-list -n 1 --grep '^WIP' "$range"` + if [ -n "$commit" ] + then + echo >&2 "Found WIP commit in $local_ref, not pushing" + exit 1 + fi + fi +done + +exit 0 diff -r d132d442dc34 -r e6ad9016601c src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/hooks/pre-rebase.sample --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/hooks/pre-rebase.sample Sun Oct 23 04:37:16 2016 +0900 @@ -0,0 +1,169 @@ +#!/bin/sh +# +# Copyright (c) 2006, 2008 Junio C Hamano +# +# The "pre-rebase" hook is run just before "git rebase" starts doing +# its job, and can prevent the command from running by exiting with +# non-zero status. +# +# The hook is called with the following parameters: +# +# $1 -- the upstream the series was forked from. +# $2 -- the branch being rebased (or empty when rebasing the current branch). +# +# This sample shows how to prevent topic branches that are already +# merged to 'next' branch from getting rebased, because allowing it +# would result in rebasing already published history. + +publish=next +basebranch="$1" +if test "$#" = 2 +then + topic="refs/heads/$2" +else + topic=`git symbolic-ref HEAD` || + exit 0 ;# we do not interrupt rebasing detached HEAD +fi + +case "$topic" in +refs/heads/??/*) + ;; +*) + exit 0 ;# we do not interrupt others. + ;; +esac + +# Now we are dealing with a topic branch being rebased +# on top of master. Is it OK to rebase it? + +# Does the topic really exist? +git show-ref -q "$topic" || { + echo >&2 "No such branch $topic" + exit 1 +} + +# Is topic fully merged to master? +not_in_master=`git rev-list --pretty=oneline ^master "$topic"` +if test -z "$not_in_master" +then + echo >&2 "$topic is fully merged to master; better remove it." + exit 1 ;# we could allow it, but there is no point. +fi + +# Is topic ever merged to next? If so you should not be rebasing it. +only_next_1=`git rev-list ^master "^$topic" ${publish} | sort` +only_next_2=`git rev-list ^master ${publish} | sort` +if test "$only_next_1" = "$only_next_2" +then + not_in_topic=`git rev-list "^$topic" master` + if test -z "$not_in_topic" + then + echo >&2 "$topic is already up-to-date with master" + exit 1 ;# we could allow it, but there is no point. + else + exit 0 + fi +else + not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"` + /usr/bin/perl -e ' + my $topic = $ARGV[0]; + my $msg = "* $topic has commits already merged to public branch:\n"; + my (%not_in_next) = map { + /^([0-9a-f]+) /; + ($1 => 1); + } split(/\n/, $ARGV[1]); + for my $elem (map { + /^([0-9a-f]+) (.*)$/; + [$1 => $2]; + } split(/\n/, $ARGV[2])) { + if (!exists $not_in_next{$elem->[0]}) { + if ($msg) { + print STDERR $msg; + undef $msg; + } + print STDERR " $elem->[1]\n"; + } + } + ' "$topic" "$not_in_next" "$not_in_master" + exit 1 +fi + +exit 0 + +################################################################ + +This sample hook safeguards topic branches that have been +published from being rewound. + +The workflow assumed here is: + + * Once a topic branch forks from "master", "master" is never + merged into it again (either directly or indirectly). + + * Once a topic branch is fully cooked and merged into "master", + it is deleted. If you need to build on top of it to correct + earlier mistakes, a new topic branch is created by forking at + the tip of the "master". This is not strictly necessary, but + it makes it easier to keep your history simple. + + * Whenever you need to test or publish your changes to topic + branches, merge them into "next" branch. + +The script, being an example, hardcodes the publish branch name +to be "next", but it is trivial to make it configurable via +$GIT_DIR/config mechanism. + +With this workflow, you would want to know: + +(1) ... if a topic branch has ever been merged to "next". Young + topic branches can have stupid mistakes you would rather + clean up before publishing, and things that have not been + merged into other branches can be easily rebased without + affecting other people. But once it is published, you would + not want to rewind it. + +(2) ... if a topic branch has been fully merged to "master". + Then you can delete it. More importantly, you should not + build on top of it -- other people may already want to + change things related to the topic as patches against your + "master", so if you need further changes, it is better to + fork the topic (perhaps with the same name) afresh from the + tip of "master". + +Let's look at this example: + + o---o---o---o---o---o---o---o---o---o "next" + / / / / + / a---a---b A / / + / / / / + / / c---c---c---c B / + / / / \ / + / / / b---b C \ / + / / / / \ / + ---o---o---o---o---o---o---o---o---o---o---o "master" + + +A, B and C are topic branches. + + * A has one fix since it was merged up to "next". + + * B has finished. It has been fully merged up to "master" and "next", + and is ready to be deleted. + + * C has not merged to "next" at all. + +We would want to allow C to be rebased, refuse A, and encourage +B to be deleted. + +To compute (1): + + git rev-list ^master ^topic next + git rev-list ^master next + + if these match, topic has not merged in next at all. + +To compute (2): + + git rev-list master..topic + + if this is empty, it is fully merged to "master". diff -r d132d442dc34 -r e6ad9016601c src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/hooks/prepare-commit-msg.sample --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/hooks/prepare-commit-msg.sample Sun Oct 23 04:37:16 2016 +0900 @@ -0,0 +1,36 @@ +#!/bin/sh +# +# An example hook script to prepare the commit log message. +# Called by "git commit" with the name of the file that has the +# commit message, followed by the description of the commit +# message's source. The hook's purpose is to edit the commit +# message file. If the hook fails with a non-zero status, +# the commit is aborted. +# +# To enable this hook, rename this file to "prepare-commit-msg". + +# This hook includes three examples. The first comments out the +# "Conflicts:" part of a merge commit. +# +# The second includes the output of "git diff --name-status -r" +# into the message, just before the "git status" output. It is +# commented because it doesn't cope with --amend or with squashed +# commits. +# +# The third example adds a Signed-off-by line to the message, that can +# still be edited. This is rarely a good idea. + +case "$2,$3" in + merge,) + /usr/bin/perl -i.bak -ne 's/^/# /, s/^# #/#/ if /^Conflicts/ .. /#/; print' "$1" ;; + +# ,|template,) +# /usr/bin/perl -i.bak -pe ' +# print "\n" . `git diff --cached --name-status -r` +# if /^#/ && $first++ == 0' "$1" ;; + + *) ;; +esac + +# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') +# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" diff -r d132d442dc34 -r e6ad9016601c src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/hooks/update.sample --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/hooks/update.sample Sun Oct 23 04:37:16 2016 +0900 @@ -0,0 +1,128 @@ +#!/bin/sh +# +# An example hook script to block unannotated tags from entering. +# Called by "git receive-pack" with arguments: refname sha1-old sha1-new +# +# To enable this hook, rename this file to "update". +# +# Config +# ------ +# hooks.allowunannotated +# This boolean sets whether unannotated tags will be allowed into the +# repository. By default they won't be. +# hooks.allowdeletetag +# This boolean sets whether deleting tags will be allowed in the +# repository. By default they won't be. +# hooks.allowmodifytag +# This boolean sets whether a tag may be modified after creation. By default +# it won't be. +# hooks.allowdeletebranch +# This boolean sets whether deleting branches will be allowed in the +# repository. By default they won't be. +# hooks.denycreatebranch +# This boolean sets whether remotely creating branches will be denied +# in the repository. By default this is allowed. +# + +# --- Command line +refname="$1" +oldrev="$2" +newrev="$3" + +# --- Safety check +if [ -z "$GIT_DIR" ]; then + echo "Don't run this script from the command line." >&2 + echo " (if you want, you could supply GIT_DIR then run" >&2 + echo " $0 )" >&2 + exit 1 +fi + +if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then + echo "usage: $0 " >&2 + exit 1 +fi + +# --- Config +allowunannotated=$(git config --bool hooks.allowunannotated) +allowdeletebranch=$(git config --bool hooks.allowdeletebranch) +denycreatebranch=$(git config --bool hooks.denycreatebranch) +allowdeletetag=$(git config --bool hooks.allowdeletetag) +allowmodifytag=$(git config --bool hooks.allowmodifytag) + +# check for no description +projectdesc=$(sed -e '1q' "$GIT_DIR/description") +case "$projectdesc" in +"Unnamed repository"* | "") + echo "*** Project description file hasn't been set" >&2 + exit 1 + ;; +esac + +# --- Check types +# if $newrev is 0000...0000, it's a commit to delete a ref. +zero="0000000000000000000000000000000000000000" +if [ "$newrev" = "$zero" ]; then + newrev_type=delete +else + newrev_type=$(git cat-file -t $newrev) +fi + +case "$refname","$newrev_type" in + refs/tags/*,commit) + # un-annotated tag + short_refname=${refname##refs/tags/} + if [ "$allowunannotated" != "true" ]; then + echo "*** The un-annotated tag, $short_refname, is not allowed in this repository" >&2 + echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2 + exit 1 + fi + ;; + refs/tags/*,delete) + # delete tag + if [ "$allowdeletetag" != "true" ]; then + echo "*** Deleting a tag is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/tags/*,tag) + # annotated tag + if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1 + then + echo "*** Tag '$refname' already exists." >&2 + echo "*** Modifying a tag is not allowed in this repository." >&2 + exit 1 + fi + ;; + refs/heads/*,commit) + # branch + if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then + echo "*** Creating a branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/heads/*,delete) + # delete branch + if [ "$allowdeletebranch" != "true" ]; then + echo "*** Deleting a branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + refs/remotes/*,commit) + # tracking branch + ;; + refs/remotes/*,delete) + # delete tracking branch + if [ "$allowdeletebranch" != "true" ]; then + echo "*** Deleting a tracking branch is not allowed in this repository" >&2 + exit 1 + fi + ;; + *) + # Anything else (is there anything else?) + echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2 + exit 1 + ;; +esac + +# --- Finished +exit 0 diff -r d132d442dc34 -r e6ad9016601c src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/index Binary file src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/index has changed diff -r d132d442dc34 -r e6ad9016601c src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/info/exclude --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/info/exclude Sun Oct 23 04:37:16 2016 +0900 @@ -0,0 +1,6 @@ +# git ls-files --others --exclude-from=.git/info/exclude +# Lines that start with '#' are comments. +# For a project mostly in C, the following would be a good set of +# exclude patterns (uncomment them if you want to use them): +# *.[oa] +# *~ diff -r d132d442dc34 -r e6ad9016601c src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/logs/HEAD --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/logs/HEAD Sun Oct 23 04:37:16 2016 +0900 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 e7c80cc200584b818c491a184cfc6f2b5f9e17a8 Kazuma Takeda 1477164441 +0900 clone: from https://github.com/masharada/msgpack-unity.git diff -r d132d442dc34 -r e6ad9016601c src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/logs/refs/heads/master --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/logs/refs/heads/master Sun Oct 23 04:37:16 2016 +0900 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 e7c80cc200584b818c491a184cfc6f2b5f9e17a8 Kazuma Takeda 1477164441 +0900 clone: from https://github.com/masharada/msgpack-unity.git diff -r d132d442dc34 -r e6ad9016601c src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/logs/refs/remotes/origin/HEAD --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/logs/refs/remotes/origin/HEAD Sun Oct 23 04:37:16 2016 +0900 @@ -0,0 +1,1 @@ +0000000000000000000000000000000000000000 e7c80cc200584b818c491a184cfc6f2b5f9e17a8 Kazuma Takeda 1477164441 +0900 clone: from https://github.com/masharada/msgpack-unity.git diff -r d132d442dc34 -r e6ad9016601c src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/00/c8e51cd16ac10c74dd2f9974e6261ae72dfe4c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/00/c8e51cd16ac10c74dd2f9974e6261ae72dfe4c Sun Oct 23 04:37:16 2016 +0900 @@ -0,0 +1,5 @@ +xSn0 5 +"촇[Ѓf.E8Bɓ^/a_8Iv-|QJ +w~/`|bt~7g0Q 3V,fP 5BX>]dh +. B1ht[р*TCZXR,Hޖ*E[}*>xj J(Ы@# vu]k^ ntO.Nh-^ICrDIRBԠ ŜfʵN|V\- 2LZgdRWuJtgBA?!pQ<"n bΖ4&u3}p7zH~d4hJָ`EqS)ISy%r\@HhL-̘R! n‹ y^e97níU))e=O-ZWƟUB^CZp/d۽Ez ˦$Q i|}2|:#${||B6>G } +UPɓ8,J5jѱ|DӻL'u~M6OV*\,%}P< ~WGI&" *2C3Ìj#TV\- uSiqV MПon:߄qnxϣm`}: :7̣'܆Nrn\J2)uTk[R"αLUL!XJ2>uDӎZ. yW/[t \ No newline at end of file diff -r d132d442dc34 -r e6ad9016601c src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/05/4668352f9f1e28268bc74604ad4c73a3a24e74 Binary file src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/05/4668352f9f1e28268bc74604ad4c73a3a24e74 has changed diff -r d132d442dc34 -r e6ad9016601c src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/18/17b354ce3301394fc5af5f8a2a17b690812ec1 Binary file src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/18/17b354ce3301394fc5af5f8a2a17b690812ec1 has changed diff -r d132d442dc34 -r e6ad9016601c src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/1f/116ad7ca93823183d33d8223139c717df069c3 Binary file src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/1f/116ad7ca93823183d33d8223139c717df069c3 has changed diff -r d132d442dc34 -r e6ad9016601c src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/2d/f9bb3e0866da49532c79177f5a2febd5b8973e Binary file src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/2d/f9bb3e0866da49532c79177f5a2febd5b8973e has changed diff -r d132d442dc34 -r e6ad9016601c src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/30/6b516bef3bf54505433f44b53d4fc99311ecd6 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/30/6b516bef3bf54505433f44b53d4fc99311ecd6 Sun Oct 23 04:37:16 2016 +0900 @@ -0,0 +1,1 @@ +xUR͎0<Ũ'JESmIQ'45 h+0.|ߏVpů?$JXj3Zn../G q@Ț+RjUM 5X2! 'X+/eOջ@1:Ai#`{n "T3-=K8']zqf?hm Inm̸d-Wyz-#w%җ-G@#*,Ehh X yY5 pzt%69}> yZ@V}Zd"@?m,$/i D&,>WPo[<읡\54+Y%؅N;OHaGN&X㥔*5{43})a{bݍ]Gjh=G75 \ No newline at end of file diff -r d132d442dc34 -r e6ad9016601c src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/34/d46e7bef952bd8fabb5f2847d7a283855b83fe --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/34/d46e7bef952bd8fabb5f2847d7a283855b83fe Sun Oct 23 04:37:16 2016 +0900 @@ -0,0 +1,1 @@ +x}Sn06y^RIbT25ݦ !产,=<m]UVs3_|ϯq1 UQk,QLĚUr.8J (5 `J.Q$EuN[EJذP$a`)rXX`#T®N9C-#8i8*bntM'8='m˅k`YlNFsV2TYBf}0ji+\c$@43&3H!I;~&iߑ\%\ xRLa8$d2,i^-K@6%.Rt,Φ@.S4,C jI@ԐG7akCaXכ)4BG5G4Xx +iktӃ? J0Xy Gk6zby$%KOC|iG-lyNo:6^ϧʼn~%GwNvWtϠnX6t Mg_F8j:ԍK'/aLom?vVw_ \ No newline at end of file diff -r d132d442dc34 -r e6ad9016601c src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/46/d080685b602b8ccec7a343da7c62256c35ad0c Binary file src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/46/d080685b602b8ccec7a343da7c62256c35ad0c has changed diff -r d132d442dc34 -r e6ad9016601c src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/50/bcb39015be539af4a654036cef49a5f08c0321 Binary file src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/50/bcb39015be539af4a654036cef49a5f08c0321 has changed diff -r d132d442dc34 -r e6ad9016601c src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/57/543770118822a5eb91efa7cac5037297df169d Binary file src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/57/543770118822a5eb91efa7cac5037297df169d has changed diff -r d132d442dc34 -r e6ad9016601c src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/5e/618130994ffb0591f53545cf84a89f552df84f Binary file src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/5e/618130994ffb0591f53545cf84a89f552df84f has changed diff -r d132d442dc34 -r e6ad9016601c src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/5e/cbb52610087bad1c48572c99c998a4928013d5 Binary file src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/5e/cbb52610087bad1c48572c99c998a4928013d5 has changed diff -r d132d442dc34 -r e6ad9016601c src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/61/c2225fc4a2b7742c3b8d3ec6cb6f78aac73868 Binary file src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/61/c2225fc4a2b7742c3b8d3ec6cb6f78aac73868 has changed diff -r d132d442dc34 -r e6ad9016601c src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/6c/4d4e0b98bd4200dea587f867232aaf94fb7efa Binary file src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/6c/4d4e0b98bd4200dea587f867232aaf94fb7efa has changed diff -r d132d442dc34 -r e6ad9016601c src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/79/4aff4f6de364bc022a7653c2cde3116f184e8f Binary file src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/79/4aff4f6de364bc022a7653c2cde3116f184e8f has changed diff -r d132d442dc34 -r e6ad9016601c src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/79/a31fc6b0d5d061f5151d9e1ada8e54346e2c98 Binary file src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/79/a31fc6b0d5d061f5151d9e1ada8e54346e2c98 has changed diff -r d132d442dc34 -r e6ad9016601c src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/8c/c971fe5e16554747f616b1f65e26103b5f71ec Binary file src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/8c/c971fe5e16554747f616b1f65e26103b5f71ec has changed diff -r d132d442dc34 -r e6ad9016601c src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/9a/c0ec3d0fb15a1b74cb749b1d25189f5bab7ff1 Binary file src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/9a/c0ec3d0fb15a1b74cb749b1d25189f5bab7ff1 has changed diff -r d132d442dc34 -r e6ad9016601c src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/9c/6d483546704aaa1453f57ca14c6471830c91ac Binary file src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/9c/6d483546704aaa1453f57ca14c6471830c91ac has changed diff -r d132d442dc34 -r e6ad9016601c src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/a7/c97a61698cdf1839fcdcd447b37ecdd4ffd88e Binary file src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/a7/c97a61698cdf1839fcdcd447b37ecdd4ffd88e has changed diff -r d132d442dc34 -r e6ad9016601c src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/ae/899d9608dcb968d6073329c2cd45a4b9b825de Binary file src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/ae/899d9608dcb968d6073329c2cd45a4b9b825de has changed diff -r d132d442dc34 -r e6ad9016601c src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/be/c4d4c4558d625539410a5b3a2e69f48ec48f48 Binary file src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/be/c4d4c4558d625539410a5b3a2e69f48ec48f48 has changed diff -r d132d442dc34 -r e6ad9016601c src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/d5/40b060aeccc5b4e1ab26aec45267e8ae7393c2 Binary file src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/d5/40b060aeccc5b4e1ab26aec45267e8ae7393c2 has changed diff -r d132d442dc34 -r e6ad9016601c src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/e7/c80cc200584b818c491a184cfc6f2b5f9e17a8 Binary file src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/e7/c80cc200584b818c491a184cfc6f2b5f9e17a8 has changed diff -r d132d442dc34 -r e6ad9016601c src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/e9/8430e1f9a9d93e5971d6e65d0d70a771e6a070 Binary file src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/objects/e9/8430e1f9a9d93e5971d6e65d0d70a771e6a070 has changed diff -r d132d442dc34 -r e6ad9016601c src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/packed-refs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/packed-refs Sun Oct 23 04:37:16 2016 +0900 @@ -0,0 +1,2 @@ +# pack-refs with: peeled fully-peeled +e7c80cc200584b818c491a184cfc6f2b5f9e17a8 refs/remotes/origin/master diff -r d132d442dc34 -r e6ad9016601c src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/refs/heads/master --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/refs/heads/master Sun Oct 23 04:37:16 2016 +0900 @@ -0,0 +1,1 @@ +e7c80cc200584b818c491a184cfc6f2b5f9e17a8 diff -r d132d442dc34 -r e6ad9016601c src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/refs/remotes/origin/HEAD --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.git/refs/remotes/origin/HEAD Sun Oct 23 04:37:16 2016 +0900 @@ -0,0 +1,1 @@ +ref: refs/remotes/origin/master diff -r d132d442dc34 -r e6ad9016601c src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.gitignore --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/.gitignore Sun Oct 23 04:37:16 2016 +0900 @@ -0,0 +1,6 @@ +# Build Folders (you can keep bin if you'd like, to store dlls and pdbs) +bin +obj + +# mstest test results +TestResults \ No newline at end of file diff -r d132d442dc34 -r e6ad9016601c src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/README.md --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/README.md Sun Oct 23 04:37:16 2016 +0900 @@ -0,0 +1,34 @@ +# MessagePack for Unity + +## What is it? + +This is MessagePack serialization/deserialization for Unity (or Unity Pro.) + +This library is based on Kazuki's MessagePack for C# +(not the current official for CLI, because it depends on .NET framework 4.0.) + +## Install + +To install this, copy files in src to Assets folder in your project. + +## See also + + Official Library : https://github.com/msgpack/msgpack + + Original C# Implementation : https://github.com/kazuki/msgpack + +## License + + Copyright (C) 2011-2012 Kazuki Oikawa, Kazunari Kida + + 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. \ No newline at end of file diff -r d132d442dc34 -r e6ad9016601c src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/src/BoxingPacker.cs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/src/BoxingPacker.cs Sun Oct 23 04:37:16 2016 +0900 @@ -0,0 +1,184 @@ +// +// Copyright 2011 Kazuki Oikawa +// +// 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. +// + +using System; +using System.Collections; +using System.Collections.Generic; +using System.IO; +using System.Reflection; + +namespace MsgPack +{ + public class BoxingPacker + { + static Type KeyValuePairDefinitionType; + + static BoxingPacker () + { + KeyValuePairDefinitionType = typeof (KeyValuePair).GetGenericTypeDefinition (); + } + + public void Pack (Stream strm, object o) + { + MsgPackWriter writer = new MsgPackWriter (strm); + Pack (writer, o); + } + + public byte[] Pack (object o) + { + using (MemoryStream ms = new MemoryStream ()) { + Pack (ms, o); + return ms.ToArray (); + } + } + + void Pack (MsgPackWriter writer, object o) + { + if (o == null) { + writer.WriteNil (); + return; + } + + Type t = o.GetType (); + if (t.IsPrimitive) { + if (t.Equals (typeof (int))) writer.Write ((int)o); + else if (t.Equals (typeof (uint))) writer.Write ((uint)o); + else if (t.Equals (typeof (float))) writer.Write ((float)o); + else if (t.Equals (typeof (double))) writer.Write ((double)o); + else if (t.Equals (typeof (long))) writer.Write ((long)o); + else if (t.Equals (typeof (ulong))) writer.Write ((ulong)o); + else if (t.Equals (typeof (bool))) writer.Write ((bool)o); + else if (t.Equals (typeof (byte))) writer.Write ((byte)o); + else if (t.Equals (typeof (sbyte))) writer.Write ((sbyte)o); + else if (t.Equals (typeof (short))) writer.Write ((short)o); + else if (t.Equals (typeof (ushort))) writer.Write ((ushort)o); + else throw new NotSupportedException (); // char? + return; + } + + IDictionary dic = o as IDictionary; + if (dic != null) { + writer.WriteMapHeader (dic.Count); + foreach (System.Collections.DictionaryEntry e in dic) { + Pack (writer, e.Key); + Pack (writer, e.Value); + } + return; + } + + if (t.IsArray) { + Array ary = (Array)o; + Type et = t.GetElementType (); + + // KeyValuePair[] (Map Type) + if (et.IsGenericType && et.GetGenericTypeDefinition ().Equals (KeyValuePairDefinitionType)) { + PropertyInfo propKey = et.GetProperty ("Key"); + PropertyInfo propValue = et.GetProperty ("Value"); + writer.WriteMapHeader (ary.Length); + for (int i = 0; i < ary.Length; i ++) { + object e = ary.GetValue (i); + Pack (writer, propKey.GetValue (e, null)); + Pack (writer, propValue.GetValue (e, null)); + } + return; + } + + // Array + writer.WriteArrayHeader (ary.Length); + for (int i = 0; i < ary.Length; i ++) + Pack (writer, ary.GetValue (i)); + return; + } + } + + public object Unpack (Stream strm) + { + MsgPackReader reader = new MsgPackReader (strm); + return Unpack (reader); + } + + public object Unpack (byte[] buf, int offset, int size) + { + using (MemoryStream ms = new MemoryStream (buf, offset, size)) { + return Unpack (ms); + } + } + + public object Unpack (byte[] buf) + { + return Unpack (buf, 0, buf.Length); + } + + object Unpack (MsgPackReader reader) + { + if (!reader.Read ()) + throw new FormatException (); + + switch (reader.Type) { + case TypePrefixes.PositiveFixNum: + case TypePrefixes.NegativeFixNum: + case TypePrefixes.Int8: + case TypePrefixes.Int16: + case TypePrefixes.Int32: + return reader.ValueSigned; + case TypePrefixes.Int64: + return reader.ValueSigned64; + case TypePrefixes.UInt8: + case TypePrefixes.UInt16: + case TypePrefixes.UInt32: + return reader.ValueUnsigned; + case TypePrefixes.UInt64: + return reader.ValueUnsigned64; + case TypePrefixes.True: + return true; + case TypePrefixes.False: + return false; + case TypePrefixes.Float: + return reader.ValueFloat; + case TypePrefixes.Double: + return reader.ValueDouble; + case TypePrefixes.Nil: + return null; + case TypePrefixes.FixRaw: + case TypePrefixes.Raw16: + case TypePrefixes.Raw32: + byte[] raw = new byte[reader.Length]; + reader.ReadValueRaw (raw, 0, raw.Length); + return raw; + case TypePrefixes.FixArray: + case TypePrefixes.Array16: + case TypePrefixes.Array32: + object[] ary = new object[reader.Length]; + for (int i = 0; i < ary.Length; i ++) + ary[i] = Unpack (reader); + return ary; + case TypePrefixes.FixMap: + case TypePrefixes.Map16: + case TypePrefixes.Map32: + IDictionary dic = new Dictionary ((int)reader.Length); + int count = (int)reader.Length; + for (int i = 0; i < count; i ++) { + object k = Unpack (reader); + object v = Unpack (reader); + dic.Add (k, v); + } + return dic; + default: + throw new FormatException (); + } + } + } +} diff -r d132d442dc34 -r e6ad9016601c src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/src/CompiledPacker.cs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/src/CompiledPacker.cs Sun Oct 23 04:37:16 2016 +0900 @@ -0,0 +1,549 @@ +// +// Copyright 2011 Kazuki Oikawa +// +// 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. +// + +using System; +using System.Collections.Generic; +using System.IO; +using System.Reflection; +using System.Reflection.Emit; +using System.Threading; +using MsgPack.Compiler; + +namespace MsgPack +{ + public class CompiledPacker + { + static PackerBase _publicFieldPacker, _allFieldPacker; + PackerBase _packer; + + static CompiledPacker () + { + _publicFieldPacker = new MethodBuilderPacker (); + _allFieldPacker = new DynamicMethodPacker (); + } + + public CompiledPacker () : this (false) {} + public CompiledPacker (bool packPrivateField) + { + _packer = (packPrivateField ? _allFieldPacker : _publicFieldPacker); + } + + public void Prepare () + { + _packer.CreatePacker (); + _packer.CreateUnpacker (); + } + + #region Generics Pack/Unpack Methods + public byte[] Pack (T o) + { + using (MemoryStream ms = new MemoryStream ()) { + Pack (ms, o); + return ms.ToArray (); + } + } + + public void Pack (Stream strm, T o) + { + _packer.CreatePacker () (new MsgPackWriter (strm), o); + } + + public T Unpack (byte[] buf) + { + return Unpack (buf, 0, buf.Length); + } + + public T Unpack (byte[] buf, int offset, int size) + { + using (MemoryStream ms = new MemoryStream (buf, offset, size)) { + return Unpack (ms); + } + } + + public T Unpack (Stream strm) + { + return _packer.CreateUnpacker () (new MsgPackReader (strm)); + } + #endregion + + #region Non-generics Pack/Unpack Methods + public byte[] Pack (object o) + { + using (MemoryStream ms = new MemoryStream ()) { + Pack (ms, o); + return ms.ToArray (); + } + } + + public void Pack (Stream strm, object o) + { + throw new NotImplementedException (); + } + + public object Unpack (Type t, byte[] buf) + { + return Unpack (t, buf, 0, buf.Length); + } + + public object Unpack (Type t, byte[] buf, int offset, int size) + { + using (MemoryStream ms = new MemoryStream (buf, offset, size)) { + return Unpack (t, ms); + } + } + + public object Unpack (Type t, Stream strm) + { + throw new NotImplementedException (); + } + #endregion + + #region Compiled Packer Implementations + public abstract class PackerBase + { + Dictionary _packers = new Dictionary (); + Dictionary _unpackers = new Dictionary (); + + protected Dictionary _packMethods = new Dictionary (); + protected Dictionary _unpackMethods = new Dictionary (); + + protected PackerBase () + { + DefaultPackMethods.Register (_packMethods, _unpackMethods); + } + + public Action CreatePacker () + { + Delegate d; + lock (_packers) { + if (!_packers.TryGetValue (typeof (T), out d)) { + d = CreatePacker_Internal (); + _packers.Add (typeof (T), d); + } + } + return (Action)d; + } + + public Func CreateUnpacker () + { + Delegate d; + lock (_unpackers) { + if (!_unpackers.TryGetValue (typeof (T), out d)) { + d = CreateUnpacker_Internal (); + _unpackers.Add (typeof (T), d); + } + } + return (Func)d; + } + + protected abstract Action CreatePacker_Internal (); + protected abstract Func CreateUnpacker_Internal (); + } + public sealed class DynamicMethodPacker : PackerBase + { + private static MethodInfo LookupMemberMappingMethod; + static Dictionary> UnpackMemberMappings; + + static DynamicMethodPacker () + { + UnpackMemberMappings = new Dictionary> (); + LookupMemberMappingMethod = typeof (DynamicMethodPacker).GetMethod ("LookupMemberMapping", BindingFlags.Static | BindingFlags.NonPublic); + } + + public DynamicMethodPacker () : base () + { + } + + protected override Action CreatePacker_Internal () + { + DynamicMethod dm = CreatePacker (typeof (T), CreatePackDynamicMethod (typeof (T))); + return (Action)dm.CreateDelegate (typeof (Action)); + } + + protected override Func CreateUnpacker_Internal () + { + DynamicMethod dm = CreateUnpacker (typeof (T), CreateUnpackDynamicMethod (typeof (T))); + return (Func)dm.CreateDelegate (typeof (Func)); + } + + DynamicMethod CreatePacker (Type t, DynamicMethod dm) + { + ILGenerator il = dm.GetILGenerator (); + _packMethods.Add (t, dm); + PackILGenerator.EmitPackCode (t, dm, il, LookupMembers, FormatMemberName, LookupPackMethod); + return dm; + } + + DynamicMethod CreateUnpacker (Type t, DynamicMethod dm) + { + ILGenerator il = dm.GetILGenerator (); + _unpackMethods.Add (t, dm); + PackILGenerator.EmitUnpackCode (t, dm, il, LookupMembers, FormatMemberName, LookupUnpackMethod, + LookupMemberMapping, LookupMemberMappingMethod); + return dm; + } + + static DynamicMethod CreatePackDynamicMethod (Type t) + { + return CreateDynamicMethod (typeof (void), new Type[] {typeof (MsgPackWriter), t}); + } + + static DynamicMethod CreateUnpackDynamicMethod (Type t) + { + return CreateDynamicMethod (t, new Type[] {typeof (MsgPackReader)}); + } + + static MemberInfo[] LookupMembers (Type t) + { + BindingFlags baseFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; + System.Collections.Generic.List list = new System.Collections.Generic.List (); + list.AddRange (t.GetFields (baseFlags)); + // TODO: Add NonSerialized Attribute Filter ? + return list.ToArray (); + } + + MethodInfo LookupPackMethod (Type t) + { + MethodInfo mi; + DynamicMethod dm; + if (_packMethods.TryGetValue (t, out mi)) + return mi; + dm = CreatePackDynamicMethod (t); + return CreatePacker (t, dm); + } + + MethodInfo LookupUnpackMethod (Type t) + { + MethodInfo mi; + if (_unpackMethods.TryGetValue (t, out mi)) + return mi; + DynamicMethod dm = CreateUnpackDynamicMethod (t); + return CreateUnpacker (t, dm); + } + + static string FormatMemberName (MemberInfo m) + { + if (m.MemberType != MemberTypes.Field) + return m.Name; + + int pos; + string name = m.Name; + if (name[0] == '<' && (pos = name.IndexOf ('>')) > 1) + name = name.Substring (1, pos - 1); // Auto-Property (\<.+\>) + return name; + } + + static int _dynamicMethodIdx = 0; + static DynamicMethod CreateDynamicMethod (Type returnType, Type[] parameterTypes) + { + string name = "_" + Interlocked.Increment (ref _dynamicMethodIdx).ToString (); + return new DynamicMethod (name, returnType, parameterTypes, true); + } + + internal static IDictionary LookupMemberMapping (Type t) + { + IDictionary mapping; + lock (UnpackMemberMappings) { + if (!UnpackMemberMappings.TryGetValue (t, out mapping)) { + mapping = new Dictionary (); + UnpackMemberMappings.Add (t, mapping); + } + } + return mapping; + } + } + public sealed class MethodBuilderPacker : PackerBase + { + public const string AssemblyName = "MessagePackInternalAssembly"; + static AssemblyName DynamicAsmName; + static AssemblyBuilder DynamicAsmBuilder; + static ModuleBuilder DynamicModuleBuilder; + + private static MethodInfo LookupMemberMappingMethod; + static Dictionary> UnpackMemberMappings; + + static MethodBuilderPacker () + { + UnpackMemberMappings = new Dictionary> (); + LookupMemberMappingMethod = typeof (MethodBuilderPacker).GetMethod ("LookupMemberMapping", BindingFlags.Static | BindingFlags.NonPublic); + + DynamicAsmName = new AssemblyName (AssemblyName); + DynamicAsmBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly (DynamicAsmName, AssemblyBuilderAccess.Run); + DynamicModuleBuilder = DynamicAsmBuilder.DefineDynamicModule (DynamicAsmName.Name); + } + + public MethodBuilderPacker () : base () + { + } + + protected override Action CreatePacker_Internal () + { + TypeBuilder tb; + MethodBuilder mb; + CreatePackMethodBuilder (typeof (T), out tb, out mb); + _packMethods.Add (typeof (T), mb); + CreatePacker (typeof (T), mb); + MethodInfo mi = ToCallableMethodInfo (typeof (T), tb, true); + return (Action)Delegate.CreateDelegate (typeof (Action), mi); + } + + protected override Func CreateUnpacker_Internal () + { + TypeBuilder tb; + MethodBuilder mb; + CreateUnpackMethodBuilder (typeof (T), out tb, out mb); + _unpackMethods.Add (typeof (T), mb); + CreateUnpacker (typeof (T), mb); + MethodInfo mi = ToCallableMethodInfo (typeof (T), tb, false); + return (Func)Delegate.CreateDelegate (typeof (Func), mi); + } + + void CreatePacker (Type t, MethodBuilder mb) + { + ILGenerator il = mb.GetILGenerator (); + PackILGenerator.EmitPackCode (t, mb, il, LookupMembers, FormatMemberName, LookupPackMethod); + } + + void CreateUnpacker (Type t, MethodBuilder mb) + { + ILGenerator il = mb.GetILGenerator (); + PackILGenerator.EmitUnpackCode (t, mb, il, LookupMembers, FormatMemberName, LookupUnpackMethod, + LookupMemberMapping, LookupMemberMappingMethod); + } + + MethodInfo ToCallableMethodInfo (Type t, TypeBuilder tb, bool isPacker) + { + Type type = tb.CreateType (); + MethodInfo mi = type.GetMethod (isPacker ? "Pack" : "Unpack", BindingFlags.Static | BindingFlags.Public); + if (isPacker) { + _packMethods[t] = mi; + } else { + _unpackMethods[t] = mi; + } + return mi; + } + + MethodInfo LookupPackMethod (Type t) + { + MethodInfo mi; + TypeBuilder tb; + MethodBuilder mb; + if (_packMethods.TryGetValue (t, out mi)) + return mi; + CreatePackMethodBuilder (t, out tb, out mb); + _packMethods.Add (t, mb); + CreatePacker (t, mb); + return ToCallableMethodInfo (t, tb, true); + } + + MethodInfo LookupUnpackMethod (Type t) + { + MethodInfo mi; + TypeBuilder tb; + MethodBuilder mb; + if (_unpackMethods.TryGetValue (t, out mi)) + return mi; + CreateUnpackMethodBuilder (t, out tb, out mb); + _unpackMethods.Add (t, mb); + CreateUnpacker (t, mb); + return ToCallableMethodInfo (t, tb, false); + } + + static string FormatMemberName (MemberInfo m) + { + return m.Name; + } + + static MemberInfo[] LookupMembers (Type t) + { + BindingFlags baseFlags = BindingFlags.Instance | BindingFlags.Public; + System.Collections.Generic.List list = new System.Collections.Generic.List (); + list.AddRange (t.GetFields (baseFlags)); + // TODO: Add NonSerialized Attribute Filter ? + return list.ToArray (); + } + + static void CreatePackMethodBuilder (Type t, out TypeBuilder tb, out MethodBuilder mb) + { + tb = DynamicModuleBuilder.DefineType (t.Name + "PackerType", TypeAttributes.Public); + mb = tb.DefineMethod ("Pack", MethodAttributes.Static | MethodAttributes.Public, typeof (void), new Type[] {typeof (MsgPackWriter), t}); + } + + static void CreateUnpackMethodBuilder (Type t, out TypeBuilder tb, out MethodBuilder mb) + { + tb = DynamicModuleBuilder.DefineType (t.Name + "UnpackerType", TypeAttributes.Public); + mb = tb.DefineMethod ("Unpack", MethodAttributes.Static | MethodAttributes.Public, t, new Type[] {typeof (MsgPackReader)}); + } + + internal static IDictionary LookupMemberMapping (Type t) + { + IDictionary mapping; + lock (UnpackMemberMappings) { + if (!UnpackMemberMappings.TryGetValue (t, out mapping)) { + mapping = new Dictionary (); + UnpackMemberMappings.Add (t, mapping); + } + } + return mapping; + } + } + #endregion + + #region default pack/unpack methods + internal static class DefaultPackMethods + { + public static void Register (Dictionary packMethods, Dictionary unpackMethods) + { + RegisterPackMethods (packMethods); + RegisterUnpackMethods (unpackMethods); + } + + #region Pack + static void RegisterPackMethods (Dictionary packMethods) + { + Type type = typeof (DefaultPackMethods); + MethodInfo[] methods = type.GetMethods (BindingFlags.Static | BindingFlags.NonPublic); + string methodName = "Pack"; + for (int i = 0; i < methods.Length; i ++) { + if (!methodName.Equals (methods[i].Name)) + continue; + ParameterInfo[] parameters = methods[i].GetParameters (); + if (parameters.Length != 2 || parameters[0].ParameterType != typeof (MsgPackWriter)) + continue; + packMethods.Add (parameters[1].ParameterType, methods[i]); + } + } + + internal static void Pack (MsgPackWriter writer, string x) + { + if (x == null) { + writer.WriteNil (); + } else { + writer.Write (x, false); + } + } + #endregion + + #region Unpack + static void RegisterUnpackMethods (Dictionary unpackMethods) + { + BindingFlags flags = BindingFlags.Static | BindingFlags.NonPublic; + Type type = typeof (DefaultPackMethods); + MethodInfo mi = type.GetMethod ("Unpack_Signed", flags); + unpackMethods.Add (typeof (sbyte), mi); + unpackMethods.Add (typeof (short), mi); + unpackMethods.Add (typeof (int), mi); + + mi = type.GetMethod ("Unpack_Signed64", flags); + unpackMethods.Add (typeof (long), mi); + + mi = type.GetMethod ("Unpack_Unsigned", flags); + unpackMethods.Add (typeof (byte), mi); + unpackMethods.Add (typeof (ushort), mi); + unpackMethods.Add (typeof (char), mi); + unpackMethods.Add (typeof (uint), mi); + + mi = type.GetMethod ("Unpack_Unsigned64", flags); + unpackMethods.Add (typeof (ulong), mi); + + mi = type.GetMethod ("Unpack_Boolean", flags); + unpackMethods.Add (typeof (bool), mi); + + mi = type.GetMethod ("Unpack_Float", flags); + unpackMethods.Add (typeof (float), mi); + + mi = type.GetMethod ("Unpack_Double", flags); + unpackMethods.Add (typeof (double), mi); + + mi = type.GetMethod ("Unpack_String", flags); + unpackMethods.Add (typeof (string), mi); + } + + internal static int Unpack_Signed (MsgPackReader reader) + { + if (!reader.Read () || !reader.IsSigned ()) + UnpackFailed (); + return reader.ValueSigned; + } + + internal static long Unpack_Signed64 (MsgPackReader reader) + { + if (!reader.Read ()) + UnpackFailed (); + if (reader.IsSigned ()) + return reader.ValueSigned; + if (reader.IsSigned64 ()) + return reader.ValueSigned64; + UnpackFailed (); + return 0; // unused + } + + internal static uint Unpack_Unsigned (MsgPackReader reader) + { + if (!reader.Read () || !reader.IsUnsigned ()) + UnpackFailed (); + return reader.ValueUnsigned; + } + + internal static ulong Unpack_Unsigned64 (MsgPackReader reader) + { + if (!reader.Read ()) + UnpackFailed (); + if (reader.IsUnsigned ()) + return reader.ValueUnsigned; + if (reader.IsUnsigned64 ()) + return reader.ValueUnsigned64; + UnpackFailed (); + return 0; // unused + } + + internal static bool Unpack_Boolean (MsgPackReader reader) + { + if (!reader.Read () || !reader.IsBoolean ()) + UnpackFailed (); + return reader.ValueBoolean; + } + + internal static float Unpack_Float (MsgPackReader reader) + { + if (!reader.Read () || reader.Type != TypePrefixes.Float) + UnpackFailed (); + return reader.ValueFloat; + } + + internal static double Unpack_Double (MsgPackReader reader) + { + if (!reader.Read () || reader.Type != TypePrefixes.Double) + UnpackFailed (); + return reader.ValueDouble; + } + + internal static string Unpack_String (MsgPackReader reader) + { + if (!reader.Read () || !reader.IsRaw ()) + UnpackFailed (); + return reader.ReadRawString (); + } + + internal static void UnpackFailed () + { + throw new FormatException (); + } + #endregion + } + #endregion + } +} diff -r d132d442dc34 -r e6ad9016601c src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/src/Compiler/EmitExtensions.cs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/src/Compiler/EmitExtensions.cs Sun Oct 23 04:37:16 2016 +0900 @@ -0,0 +1,191 @@ +// +// Copyright 2011 Kazuki Oikawa +// +// 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. +// + +using System; +using System.Reflection; +using System.Reflection.Emit; + +namespace MsgPack.Compiler +{ + public static class EmitExtensions + { + public static void EmitLd (this ILGenerator il, Variable v) + { + switch (v.VarType) { + case VariableType.Arg: + EmitLdarg (il, v); + break; + case VariableType.Local: + EmitLdloc (il, v); + break; + default: + throw new ArgumentException (); + } + } + + public static void EmitLd (this ILGenerator il, params Variable[] list) + { + for (int i = 0; i < list.Length; i ++) + EmitLd (il, list[i]); + } + + public static void EmitLdarg (this ILGenerator il, Variable v) + { + if (v.VarType != VariableType.Arg) + throw new ArgumentException (); + + switch (v.Index) { + case 0: il.Emit (OpCodes.Ldarg_0); return; + case 1: il.Emit (OpCodes.Ldarg_1); return; + case 2: il.Emit (OpCodes.Ldarg_2); return; + case 3: il.Emit (OpCodes.Ldarg_3); return; + } + if (v.Index <= byte.MaxValue) { + il.Emit (OpCodes.Ldarg_S, (byte)v.Index); + } else if (v.Index <= short.MaxValue) { + il.Emit (OpCodes.Ldarg, v.Index); + } else { + throw new FormatException (); + } + } + + public static void EmitLdloc (this ILGenerator il, Variable v) + { + if (v.VarType != VariableType.Local) + throw new ArgumentException (); + + switch (v.Index) { + case 0: il.Emit (OpCodes.Ldloc_0); return; + case 1: il.Emit (OpCodes.Ldloc_1); return; + case 2: il.Emit (OpCodes.Ldloc_2); return; + case 3: il.Emit (OpCodes.Ldloc_3); return; + } + if (v.Index <= byte.MaxValue) { + il.Emit (OpCodes.Ldloc_S, (byte)v.Index); + } else if (v.Index <= short.MaxValue) { + il.Emit (OpCodes.Ldloc, v.Index); + } else { + throw new FormatException (); + } + } + + public static void EmitSt (this ILGenerator il, Variable v) + { + switch (v.VarType) { + case VariableType.Arg: + EmitStarg (il, v); + break; + case VariableType.Local: + EmitStloc (il, v); + break; + default: + throw new ArgumentException (); + } + } + + public static void EmitStarg (this ILGenerator il, Variable v) + { + if (v.VarType != VariableType.Arg) + throw new ArgumentException (); + + if (v.Index <= byte.MaxValue) { + il.Emit (OpCodes.Starg_S, (byte)v.Index); + } else if (v.Index <= short.MaxValue) { + il.Emit (OpCodes.Starg, v.Index); + } else { + throw new FormatException (); + } + } + + public static void EmitStloc (this ILGenerator il, Variable v) + { + if (v.VarType != VariableType.Local) + throw new ArgumentException (); + + switch (v.Index) { + case 0: il.Emit (OpCodes.Stloc_0); return; + case 1: il.Emit (OpCodes.Stloc_1); return; + case 2: il.Emit (OpCodes.Stloc_2); return; + case 3: il.Emit (OpCodes.Stloc_3); return; + } + if (v.Index <= byte.MaxValue) { + il.Emit (OpCodes.Stloc_S, (byte)v.Index); + } else if (v.Index <= short.MaxValue) { + il.Emit (OpCodes.Stloc, v.Index); + } else { + throw new FormatException (); + } + } + + public static void EmitLdc (this ILGenerator il, int v) + { + switch (v) { + case 0: il.Emit (OpCodes.Ldc_I4_0); return; + case 1: il.Emit (OpCodes.Ldc_I4_1); return; + case 2: il.Emit (OpCodes.Ldc_I4_2); return; + case 3: il.Emit (OpCodes.Ldc_I4_3); return; + case 4: il.Emit (OpCodes.Ldc_I4_4); return; + case 5: il.Emit (OpCodes.Ldc_I4_5); return; + case 6: il.Emit (OpCodes.Ldc_I4_6); return; + case 7: il.Emit (OpCodes.Ldc_I4_7); return; + case 8: il.Emit (OpCodes.Ldc_I4_8); return; + case -1: il.Emit (OpCodes.Ldc_I4_M1); return; + } + if (v <= sbyte.MaxValue && v >= sbyte.MinValue) { + il.Emit (OpCodes.Ldc_I4_S, (sbyte)v); + } else { + il.Emit (OpCodes.Ldc_I4, v); + } + } + + public static void EmitLd_False (this ILGenerator il) + { + il.Emit (OpCodes.Ldc_I4_1); + } + + public static void EmitLd_True (this ILGenerator il) + { + il.Emit (OpCodes.Ldc_I4_1); + } + + public static void EmitLdstr (this ILGenerator il, string v) + { + il.Emit (OpCodes.Ldstr, v); + } + + public static void EmitLdMember (this ILGenerator il, MemberInfo m) + { + if (m.MemberType == MemberTypes.Field) { + il.Emit (OpCodes.Ldfld, (FieldInfo)m); + } else if (m.MemberType == MemberTypes.Property) { + il.Emit (OpCodes.Callvirt, ((PropertyInfo)m).GetGetMethod (true)); + } else { + throw new ArgumentException (); + } + } + + public static void EmitStMember (this ILGenerator il, MemberInfo m) + { + if (m.MemberType == MemberTypes.Field) { + il.Emit (OpCodes.Stfld, (FieldInfo)m); + } else if (m.MemberType == MemberTypes.Property) { + il.Emit (OpCodes.Callvirt, ((PropertyInfo)m).GetSetMethod (true)); + } else { + throw new ArgumentException (); + } + } + } +} diff -r d132d442dc34 -r e6ad9016601c src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/src/Compiler/PackILGenerator.cs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/src/Compiler/PackILGenerator.cs Sun Oct 23 04:37:16 2016 +0900 @@ -0,0 +1,386 @@ +// +// Copyright 2011 Kazuki Oikawa +// +// 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. +// + +using System; +using System.Collections.Generic; +using System.Reflection; +using System.Reflection.Emit; +using System.Runtime.Serialization; + +namespace MsgPack.Compiler +{ + static class PackILGenerator + { + #region Pack IL Generator + public static void EmitPackCode (Type type, MethodInfo mi, ILGenerator il, + Func targetMemberSelector, + Func memberNameFormatter, + Func lookupPackMethod) + { + if (type.IsPrimitive || type.IsInterface) + throw new NotSupportedException (); + + Variable arg_writer = Variable.CreateArg (0); + Variable arg_obj = Variable.CreateArg (1); + Variable local_i = Variable.CreateLocal (il.DeclareLocal (typeof (int))); + + if (!type.IsValueType) { // null check + Label notNullLabel = il.DefineLabel (); + il.EmitLd (arg_obj); + il.Emit (OpCodes.Brtrue_S, notNullLabel); + il.EmitLd (arg_writer); + il.Emit (OpCodes.Call, typeof(MsgPackWriter).GetMethod("WriteNil", new Type[0])); + il.Emit (OpCodes.Ret); + il.MarkLabel (notNullLabel); + } + + if (type.IsArray) { + EmitPackArrayCode (mi, il, type, arg_writer, arg_obj, local_i, lookupPackMethod); + goto FinallyProcess; + } + + // MsgPackWriter.WriteMapHeader + MemberInfo[] members = targetMemberSelector (type); + il.EmitLd (arg_writer); + il.EmitLdc (members.Length); + il.Emit (OpCodes.Callvirt, typeof (MsgPackWriter).GetMethod("WriteMapHeader", new Type[]{typeof (int)})); + + for (int i = 0; i < members.Length; i ++) { + MemberInfo m = members[i]; + Type mt = m.GetMemberType (); + + // write field-name + il.EmitLd (arg_writer); + il.EmitLdstr (memberNameFormatter (m)); + il.EmitLd_True (); + il.Emit (OpCodes.Call, typeof (MsgPackWriter).GetMethod("Write", new Type[]{typeof (string), typeof (bool)})); + + // write value + EmitPackMemberValueCode (mt, il, arg_writer, arg_obj, m, null, type, mi, lookupPackMethod); + } + +FinallyProcess: + il.Emit (OpCodes.Ret); + } + + static void EmitPackArrayCode (MethodInfo mi, ILGenerator il, Type t, Variable var_writer, Variable var_obj, Variable var_loop, Func lookupPackMethod) + { + Type et = t.GetElementType (); + il.EmitLd (var_writer, var_obj); + il.Emit (OpCodes.Ldlen); + il.Emit (OpCodes.Call, typeof(MsgPackWriter).GetMethod("WriteArrayHeader", new Type[]{ typeof(int) })); + + Label beginLabel = il.DefineLabel (); + Label exprLabel = il.DefineLabel (); + + // for-loop: init loop counter + il.EmitLdc (0); + il.EmitSt (var_loop); + + // jump + il.Emit (OpCodes.Br_S, exprLabel); + + // mark begin-label + il.MarkLabel (beginLabel); + + // write element + EmitPackMemberValueCode (et, il, var_writer, var_obj, null, var_loop, t, mi, lookupPackMethod); + + // increment loop-counter + il.EmitLd (var_loop); + il.Emit (OpCodes.Ldc_I4_1); + il.Emit (OpCodes.Add); + il.EmitSt (var_loop); + + // mark expression label + il.MarkLabel (exprLabel); + + // expression + il.EmitLd (var_loop, var_obj); + il.Emit (OpCodes.Ldlen); + il.Emit (OpCodes.Blt_S, beginLabel); + } + + /// (optional) + /// (optional) + static void EmitPackMemberValueCode (Type type, ILGenerator il, Variable var_writer, Variable var_obj, + MemberInfo m, Variable elementIdx, Type currentType, MethodInfo currentMethod, Func lookupPackMethod) + { + MethodInfo mi; + il.EmitLd (var_writer, var_obj); + if (m != null) + il.EmitLdMember (m); + if (elementIdx != null) { + il.EmitLd (elementIdx); + il.Emit (OpCodes.Ldelem, type); + } + if (type.IsPrimitive) { + mi = typeof(MsgPackWriter).GetMethod("Write", new Type[]{type}); + } else { + if (currentType == type) { + mi = currentMethod; + } else { + mi = lookupPackMethod (type); + } + } + il.Emit (OpCodes.Call, mi); + } + #endregion + + #region Unpack IL Generator + public static void EmitUnpackCode (Type type, MethodInfo mi, ILGenerator il, + Func targetMemberSelector, + Func memberNameFormatter, + Func lookupUnpackMethod, + Func> lookupMemberMapping, + MethodInfo lookupMemberMappingMethod) + { + if (type.IsArray) { + EmitUnpackArrayCode (type, mi, il, targetMemberSelector, memberNameFormatter, lookupUnpackMethod); + } else { + EmitUnpackMapCode (type, mi, il, targetMemberSelector, memberNameFormatter, lookupUnpackMethod, lookupMemberMapping, lookupMemberMappingMethod); + } + } + + static void EmitUnpackMapCode (Type type, MethodInfo mi, ILGenerator il, + Func targetMemberSelector, + Func memberNameFormatter, + Func lookupUnpackMethod, + Func> lookupMemberMapping, + MethodInfo lookupMemberMappingMethod) + { + MethodInfo failedMethod = typeof (PackILGenerator).GetMethod ("UnpackFailed", BindingFlags.Static | BindingFlags.NonPublic); + MemberInfo[] members = targetMemberSelector (type); + IDictionary member_mapping = lookupMemberMapping (type); + for (int i = 0; i < members.Length; i ++) + member_mapping.Add (memberNameFormatter (members[i]), i); + + Variable msgpackReader = Variable.CreateArg (0); + Variable obj = Variable.CreateLocal (il.DeclareLocal (type)); + Variable num_of_fields = Variable.CreateLocal (il.DeclareLocal (typeof (int))); + Variable loop_idx = Variable.CreateLocal (il.DeclareLocal (typeof (int))); + Variable mapping = Variable.CreateLocal (il.DeclareLocal (typeof (IDictionary))); + Variable switch_idx = Variable.CreateLocal (il.DeclareLocal (typeof (int))); + Variable var_type = Variable.CreateLocal (il.DeclareLocal (typeof (Type))); + + // if (!MsgPackReader.Read()) UnpackFailed (); + // if (MsgPackReader.Type == TypePrefixes.Nil) return null; + // if (!MsgPackReader.IsMap ()) UnpackFailed (); + EmitUnpackReadAndTypeCheckCode (il, msgpackReader, typeof (MsgPackReader).GetMethod ("IsMap"), failedMethod, true); + + // type = typeof (T) + il.Emit (OpCodes.Ldtoken, type); + il.Emit (OpCodes.Call, typeof(Type).GetMethod ("GetTypeFromHandle")); + il.EmitSt (var_type); + + // mapping = LookupMemberMapping (typeof (T)) + il.EmitLd (var_type); + il.Emit (OpCodes.Call, lookupMemberMappingMethod); + il.EmitSt (mapping); + + // object o = FormatterServices.GetUninitializedObject (Type); + il.EmitLd (var_type); + il.Emit (OpCodes.Call, typeof (FormatterServices).GetMethod ("GetUninitializedObject")); + il.Emit (OpCodes.Castclass, type); + il.EmitSt (obj); + + // num_of_fields = (int)reader.Length + il.EmitLd (msgpackReader); + il.Emit (OpCodes.Call, typeof (MsgPackReader).GetProperty ("Length").GetGetMethod ()); + il.EmitSt (num_of_fields); + + // Loop labels + Label lblLoopStart = il.DefineLabel (); + Label lblLoopExpr = il.DefineLabel (); + + // i = 0; + il.EmitLdc (0); + il.EmitSt (loop_idx); + il.Emit (OpCodes.Br, lblLoopExpr); + il.MarkLabel (lblLoopStart); + + /* process */ + // if (!MsgPackReader.Read() || !MsgPackReader.IsRaw()) UnpackFailed(); + EmitUnpackReadAndTypeCheckCode (il, msgpackReader, typeof (MsgPackReader).GetMethod ("IsRaw"), failedMethod, false); + + // MsgPackReader.ReadRawString () + // if (!Dictionary.TryGetValue (,)) UnpackFailed(); + Label lbl3 = il.DefineLabel (); + il.EmitLd (mapping); + il.EmitLd (msgpackReader); + il.Emit (OpCodes.Call, typeof (MsgPackReader).GetMethod ("ReadRawString", new Type[0])); + il.Emit (OpCodes.Ldloca_S, (byte)switch_idx.Index); + il.Emit (OpCodes.Callvirt, typeof (IDictionary).GetMethod ("TryGetValue")); + il.Emit (OpCodes.Brtrue, lbl3); + il.Emit (OpCodes.Call, failedMethod); + il.MarkLabel (lbl3); + + // switch + Label[] switchCases = new Label[members.Length]; + for (int i = 0; i < switchCases.Length; i ++) + switchCases[i] = il.DefineLabel (); + Label switchCaseEndLabel = il.DefineLabel (); + il.EmitLd (switch_idx); + il.Emit (OpCodes.Switch, switchCases); + il.Emit (OpCodes.Call, failedMethod); + + for (int i = 0; i < switchCases.Length; i ++) { + il.MarkLabel (switchCases[i]); + MemberInfo minfo = members[i]; + Type mt = minfo.GetMemberType (); + MethodInfo unpack_method = lookupUnpackMethod (mt); + il.EmitLd (obj); + il.EmitLd (msgpackReader); + il.Emit (OpCodes.Call, unpack_method); + il.EmitStMember (minfo); + il.Emit (OpCodes.Br, switchCaseEndLabel); + } + il.MarkLabel (switchCaseEndLabel); + + // i ++ + il.EmitLd (loop_idx); + il.EmitLdc (1); + il.Emit (OpCodes.Add); + il.EmitSt (loop_idx); + + // i < num_of_fields; + il.MarkLabel (lblLoopExpr); + il.EmitLd (loop_idx); + il.EmitLd (num_of_fields); + il.Emit (OpCodes.Blt, lblLoopStart); + + // return + il.EmitLd (obj); + il.Emit (OpCodes.Ret); + } + + static void EmitUnpackArrayCode (Type arrayType, MethodInfo mi, ILGenerator il, + Func targetMemberSelector, + Func memberNameFormatter, + Func lookupUnpackMethod) + { + Type elementType = arrayType.GetElementType (); + MethodInfo failedMethod = typeof (PackILGenerator).GetMethod ("UnpackFailed", BindingFlags.Static | BindingFlags.NonPublic); + + Variable msgpackReader = Variable.CreateArg (0); + Variable obj = Variable.CreateLocal (il.DeclareLocal (arrayType)); + Variable num_of_elements = Variable.CreateLocal (il.DeclareLocal (typeof (int))); + Variable loop_idx = Variable.CreateLocal (il.DeclareLocal (typeof (int))); + Variable type = Variable.CreateLocal (il.DeclareLocal (typeof (Type))); + + // if (!MsgPackReader.Read() || !MsgPackReader.IsArray ()) UnpackFailed (); + EmitUnpackReadAndTypeCheckCode (il, msgpackReader, typeof (MsgPackReader).GetMethod ("IsArray"), failedMethod, true); + + // type = typeof (T) + il.Emit (OpCodes.Ldtoken, elementType); + il.Emit (OpCodes.Call, typeof(Type).GetMethod ("GetTypeFromHandle")); + il.EmitSt (type); + + // num_of_elements = (int)reader.Length + il.EmitLd (msgpackReader); + il.Emit (OpCodes.Call, typeof (MsgPackReader).GetProperty ("Length").GetGetMethod ()); + il.EmitSt (num_of_elements); + + // object o = Array.CreateInstance (Type, Length); + il.EmitLd (type); + il.EmitLd (num_of_elements); + il.Emit (OpCodes.Call, typeof (Array).GetMethod ("CreateInstance", new Type[] {typeof (Type), typeof (int)})); + il.Emit (OpCodes.Castclass, arrayType); + il.EmitSt (obj); + + // Unpack element method + MethodInfo unpack_method = lookupUnpackMethod (elementType); + + // Loop labels + Label lblLoopStart = il.DefineLabel (); + Label lblLoopExpr = il.DefineLabel (); + + // i = 0; + il.EmitLdc (0); + il.EmitSt (loop_idx); + il.Emit (OpCodes.Br, lblLoopExpr); + il.MarkLabel (lblLoopStart); + + /* process */ + il.EmitLd (obj, loop_idx); + il.EmitLd (msgpackReader); + il.Emit (OpCodes.Call, unpack_method); + il.Emit (OpCodes.Stelem, elementType); + + // i ++ + il.EmitLd (loop_idx); + il.EmitLdc (1); + il.Emit (OpCodes.Add); + il.EmitSt (loop_idx); + + // i < num_of_fields; + il.MarkLabel (lblLoopExpr); + il.EmitLd (loop_idx); + il.EmitLd (num_of_elements); + il.Emit (OpCodes.Blt, lblLoopStart); + + // return + il.EmitLd (obj); + il.Emit (OpCodes.Ret); + } + + static void EmitUnpackReadAndTypeCheckCode (ILGenerator il, Variable msgpackReader, MethodInfo typeCheckMethod, MethodInfo failedMethod, bool nullCheckAndReturn) + { + Label lblFailed = il.DefineLabel (); + Label lblNullReturn = nullCheckAndReturn ? il.DefineLabel () : default(Label); + Label lblPassed = il.DefineLabel (); + il.EmitLd (msgpackReader); + il.Emit (OpCodes.Call, typeof (MsgPackReader).GetMethod ("Read")); + il.Emit (OpCodes.Brfalse_S, lblFailed); + if (nullCheckAndReturn) { + il.EmitLd (msgpackReader); + il.Emit (OpCodes.Call, typeof (MsgPackReader).GetProperty ("Type").GetGetMethod ()); + il.EmitLdc ((int)TypePrefixes.Nil); + il.Emit (OpCodes.Beq_S, lblNullReturn); + } + il.EmitLd (msgpackReader); + il.Emit (OpCodes.Call, typeCheckMethod); + il.Emit (OpCodes.Brtrue_S, lblPassed); + il.Emit (OpCodes.Br, lblFailed); + if (nullCheckAndReturn) { + il.MarkLabel (lblNullReturn); + il.Emit (OpCodes.Ldnull); + il.Emit (OpCodes.Ret); + } + il.MarkLabel (lblFailed); + il.Emit (OpCodes.Call, failedMethod); + il.MarkLabel (lblPassed); + } + + /// Exception Helper + internal static void UnpackFailed () + { + throw new FormatException (); + } + #endregion + + #region Misc + static Type GetMemberType (this MemberInfo mi) + { + if (mi.MemberType == MemberTypes.Field) + return ((FieldInfo)mi).FieldType; + if (mi.MemberType == MemberTypes.Property) + return ((PropertyInfo)mi).PropertyType; + throw new ArgumentException (); + } + #endregion + } +} diff -r d132d442dc34 -r e6ad9016601c src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/src/Compiler/Variable.cs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/src/Compiler/Variable.cs Sun Oct 23 04:37:16 2016 +0900 @@ -0,0 +1,42 @@ +// +// Copyright 2011 Kazuki Oikawa +// +// 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. +// + +using System.Reflection.Emit; + +namespace MsgPack.Compiler +{ + public class Variable + { + Variable (VariableType type, int index) + { + this.VarType = type; + this.Index = index; + } + + public static Variable CreateLocal (LocalBuilder local) + { + return new Variable (VariableType.Local, local.LocalIndex); + } + + public static Variable CreateArg (int idx) + { + return new Variable (VariableType.Arg, idx); + } + + public VariableType VarType { get; set; } + public int Index { get; set; } + } +} diff -r d132d442dc34 -r e6ad9016601c src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/src/Compiler/VariableType.cs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/src/Compiler/VariableType.cs Sun Oct 23 04:37:16 2016 +0900 @@ -0,0 +1,24 @@ +// +// Copyright 2011 Kazuki Oikawa +// +// 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. +// + +namespace MsgPack.Compiler +{ + public enum VariableType + { + Local, + Arg + } +} diff -r d132d442dc34 -r e6ad9016601c src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/src/MsgPackReader.cs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/src/MsgPackReader.cs Sun Oct 23 04:37:16 2016 +0900 @@ -0,0 +1,258 @@ +// +// Copyright 2011 Kazuki Oikawa +// +// 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. +// + +using System; +using System.IO; +using System.Text; + +namespace MsgPack +{ + public class MsgPackReader + { + Stream _strm; + byte[] _tmp0 = new byte[8]; + byte[] _tmp1 = new byte[8]; + + Encoding _encoding = Encoding.UTF8; + //Decoder _decoder = Encoding.UTF8.GetDecoder (); + byte[] _buf = new byte[64]; + + public MsgPackReader (Stream strm) + { + _strm = strm; + } + + public TypePrefixes Type { get; private set; } + + public bool ValueBoolean { get; private set; } + public uint Length { get; private set; } + + public uint ValueUnsigned { get; private set; } + public ulong ValueUnsigned64 { get; private set; } + + public int ValueSigned { get; private set; } + public long ValueSigned64 { get; private set; } + + public float ValueFloat { get; private set; } + public double ValueDouble { get; private set; } + + public bool IsSigned () + { + return this.Type == TypePrefixes.NegativeFixNum || + this.Type == TypePrefixes.PositiveFixNum || + this.Type == TypePrefixes.Int8 || + this.Type == TypePrefixes.Int16 || + this.Type == TypePrefixes.Int32; + } + + public bool IsBoolean () + { + return this.Type == TypePrefixes.True || this.Type == TypePrefixes.False; + } + + public bool IsSigned64 () + { + return this.Type == TypePrefixes.Int64; + } + + public bool IsUnsigned () + { + return this.Type == TypePrefixes.PositiveFixNum || + this.Type == TypePrefixes.UInt8 || + this.Type == TypePrefixes.UInt16 || + this.Type == TypePrefixes.UInt32; + } + + public bool IsUnsigned64 () + { + return this.Type == TypePrefixes.UInt64; + } + + public bool IsRaw () + { + return this.Type == TypePrefixes.FixRaw || this.Type == TypePrefixes.Raw16 || this.Type == TypePrefixes.Raw32; + } + + public bool IsArray () + { + return this.Type == TypePrefixes.FixArray || this.Type == TypePrefixes.Array16 || this.Type == TypePrefixes.Array32; + } + + public bool IsMap () + { + return this.Type == TypePrefixes.FixMap || this.Type == TypePrefixes.Map16 || this.Type == TypePrefixes.Map32; + } + + public bool Read () + { + byte[] tmp0 = _tmp0, tmp1 = _tmp1; + int x = _strm.ReadByte (); + if (x < 0) + return false; // EOS + + if (x >= 0x00 && x <= 0x7f) { + this.Type = TypePrefixes.PositiveFixNum; + } else if (x >= 0xe0 && x <= 0xff) { + this.Type = TypePrefixes.NegativeFixNum; + } else if (x >= 0xa0 && x <= 0xbf) { + this.Type = TypePrefixes.FixRaw; + } else if (x >= 0x90 && x <= 0x9f) { + this.Type = TypePrefixes.FixArray; + } else if (x >= 0x80 && x <= 0x8f) { + this.Type = TypePrefixes.FixMap; + } else { + this.Type = (TypePrefixes)x; + } + + switch (this.Type) { + case TypePrefixes.Nil: + break; + case TypePrefixes.False: + ValueBoolean = false; + break; + case TypePrefixes.True: + ValueBoolean = true; + break; + case TypePrefixes.Float: + _strm.Read (tmp0, 0, 4); + if (BitConverter.IsLittleEndian) { + tmp1[0] = tmp0[3]; + tmp1[1] = tmp0[2]; + tmp1[2] = tmp0[1]; + tmp1[3] = tmp0[0]; + ValueFloat = BitConverter.ToSingle (tmp1, 0); + } else { + ValueFloat = BitConverter.ToSingle (tmp0, 0); + } + break; + case TypePrefixes.Double: + _strm.Read (tmp0, 0, 8); + if (BitConverter.IsLittleEndian) { + tmp1[0] = tmp0[7]; + tmp1[1] = tmp0[6]; + tmp1[2] = tmp0[5]; + tmp1[3] = tmp0[4]; + tmp1[4] = tmp0[3]; + tmp1[5] = tmp0[2]; + tmp1[6] = tmp0[1]; + tmp1[7] = tmp0[0]; + ValueDouble = BitConverter.ToDouble (tmp1, 0); + } else { + ValueDouble = BitConverter.ToDouble (tmp0, 0); + } + break; + case TypePrefixes.NegativeFixNum: + ValueSigned = (x & 0x1f) - 0x20; + break; + case TypePrefixes.PositiveFixNum: + ValueSigned = x & 0x7f; + ValueUnsigned = (uint)ValueSigned; + break; + case TypePrefixes.UInt8: + x = _strm.ReadByte (); + if (x < 0) + throw new FormatException (); + ValueUnsigned = (uint)x; + break; + case TypePrefixes.UInt16: + if (_strm.Read (tmp0, 0, 2) != 2) + throw new FormatException (); + ValueUnsigned = ((uint)tmp0[0] << 8) | (uint)tmp0[1]; + break; + case TypePrefixes.UInt32: + if (_strm.Read (tmp0, 0, 4) != 4) + throw new FormatException (); + ValueUnsigned = ((uint)tmp0[0] << 24) | ((uint)tmp0[1] << 16) | ((uint)tmp0[2] << 8) | (uint)tmp0[3]; + break; + case TypePrefixes.UInt64: + if (_strm.Read (tmp0, 0, 8) != 8) + throw new FormatException (); + ValueUnsigned64 = ((ulong)tmp0[0] << 56) | ((ulong)tmp0[1] << 48) | ((ulong)tmp0[2] << 40) | ((ulong)tmp0[3] << 32) | ((ulong)tmp0[4] << 24) | ((ulong)tmp0[5] << 16) | ((ulong)tmp0[6] << 8) | (ulong)tmp0[7]; + break; + case TypePrefixes.Int8: + x = _strm.ReadByte (); + if (x < 0) + throw new FormatException (); + ValueSigned = (sbyte)x; + break; + case TypePrefixes.Int16: + if (_strm.Read (tmp0, 0, 2) != 2) + throw new FormatException (); + ValueSigned = (short)((tmp0[0] << 8) | tmp0[1]); + break; + case TypePrefixes.Int32: + if (_strm.Read (tmp0, 0, 4) != 4) + throw new FormatException (); + ValueSigned = (tmp0[0] << 24) | (tmp0[1] << 16) | (tmp0[2] << 8) | tmp0[3]; + break; + case TypePrefixes.Int64: + if (_strm.Read (tmp0, 0, 8) != 8) + throw new FormatException (); + ValueSigned64 = ((long)tmp0[0] << 56) | ((long)tmp0[1] << 48) | ((long)tmp0[2] << 40) | ((long)tmp0[3] << 32) | ((long)tmp0[4] << 24) | ((long)tmp0[5] << 16) | ((long)tmp0[6] << 8) | (long)tmp0[7]; + break; + case TypePrefixes.FixRaw: + Length = (uint)(x & 0x1f); + break; + case TypePrefixes.FixArray: + case TypePrefixes.FixMap: + Length = (uint)(x & 0xf); + break; + case TypePrefixes.Raw16: + case TypePrefixes.Array16: + case TypePrefixes.Map16: + if (_strm.Read (tmp0, 0, 2) != 2) + throw new FormatException (); + Length = ((uint)tmp0[0] << 8) | (uint)tmp0[1]; + break; + case TypePrefixes.Raw32: + case TypePrefixes.Array32: + case TypePrefixes.Map32: + if (_strm.Read (tmp0, 0, 4) != 4) + throw new FormatException (); + Length = ((uint)tmp0[0] << 24) | ((uint)tmp0[1] << 16) | ((uint)tmp0[2] << 8) | (uint)tmp0[3]; + break; + default: + throw new FormatException (); + } + return true; + } + + public int ReadValueRaw (byte[] buf, int offset, int count) + { + return _strm.Read (buf, offset, count); + } + + public string ReadRawString () + { + return ReadRawString (_buf); + } + + public string ReadRawString (byte[] buf) + { + if (this.Length < buf.Length) { + if (ReadValueRaw (buf, 0, (int)this.Length) != this.Length) + throw new FormatException (); + return _encoding.GetString (buf, 0, (int)this.Length); + } + + // Poor implementation + byte[] tmp = new byte[(int)this.Length]; + if (ReadValueRaw (tmp, 0, tmp.Length) != tmp.Length) + throw new FormatException (); + return _encoding.GetString (tmp); + } + } +} diff -r d132d442dc34 -r e6ad9016601c src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/src/MsgPackWriter.cs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/src/MsgPackWriter.cs Sun Oct 23 04:37:16 2016 +0900 @@ -0,0 +1,321 @@ +// +// Copyright 2011 Kazuki Oikawa, Kazunari Kida +// +// 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. +// + +using System; +using System.IO; +using System.Text; + +namespace MsgPack +{ + public class MsgPackWriter + { + Stream _strm; + //Encoding _encoding = Encoding.UTF8; + Encoder _encoder = Encoding.UTF8.GetEncoder (); + byte[] _tmp = new byte[9]; + byte[] _buf = new byte[64]; + + public MsgPackWriter (Stream strm) + { + _strm = strm; + } + + public void Write (byte x) + { + if (x < 128) { + _strm.WriteByte (x); + } else { + byte[] tmp = _tmp; + tmp[0] = 0xcc; + tmp[1] = x; + _strm.Write (tmp, 0, 2); + } + } + + public void Write (ushort x) + { + if (x < 0x100) { + Write ((byte)x); + } else { + byte[] tmp = _tmp; + tmp[0] = 0xcd; + tmp[1] = (byte)(x >> 8); + tmp[2] = (byte)x; + _strm.Write (tmp, 0, 3); + } + } + + public void Write (char x) + { + Write ((ushort)x); + } + + public void Write (uint x) + { + if (x < 0x10000) { + Write ((ushort)x); + } else { + byte[] tmp = _tmp; + tmp[0] = 0xce; + tmp[1] = (byte)(x >> 24); + tmp[2] = (byte)(x >> 16); + tmp[3] = (byte)(x >> 8); + tmp[4] = (byte)x; + _strm.Write (tmp, 0, 5); + } + } + + public void Write (ulong x) + { + if (x < 0x100000000) { + Write ((uint)x); + } else { + byte[] tmp = _tmp; + tmp[0] = 0xcf; + tmp[1] = (byte)(x >> 56); + tmp[2] = (byte)(x >> 48); + tmp[3] = (byte)(x >> 40); + tmp[4] = (byte)(x >> 32); + tmp[5] = (byte)(x >> 24); + tmp[6] = (byte)(x >> 16); + tmp[7] = (byte)(x >> 8); + tmp[8] = (byte)x; + _strm.Write (tmp, 0, 9); + } + } + + public void Write (sbyte x) + { + if (x >= -32 && x <= -1) { + _strm.WriteByte ((byte)(0xe0 | (byte)x)); + } else if (x >= 0 && x <= 127) { + _strm.WriteByte ((byte)x); + } else { + byte[] tmp = _tmp; + tmp[0] = 0xd0; + tmp[1] = (byte)x; + _strm.Write (tmp, 0, 2); + } + } + + public void Write (short x) + { + if (x >= sbyte.MinValue && x <= sbyte.MaxValue) { + Write ((sbyte)x); + } else { + byte[] tmp = _tmp; + tmp[0] = 0xd1; + tmp[1] = (byte)(x >> 8); + tmp[2] = (byte)x; + _strm.Write (tmp, 0, 3); + } + } + + public void Write (int x) + { + if (x >= short.MinValue && x <= short.MaxValue) { + Write ((short)x); + } else { + byte[] tmp = _tmp; + tmp[0] = 0xd2; + tmp[1] = (byte)(x >> 24); + tmp[2] = (byte)(x >> 16); + tmp[3] = (byte)(x >> 8); + tmp[4] = (byte)x; + _strm.Write (tmp, 0, 5); + } + } + + public void Write (long x) + { + if (x >= int.MinValue && x <= int.MaxValue) { + Write ((int)x); + } else { + byte[] tmp = _tmp; + tmp[0] = 0xd3; + tmp[1] = (byte)(x >> 56); + tmp[2] = (byte)(x >> 48); + tmp[3] = (byte)(x >> 40); + tmp[4] = (byte)(x >> 32); + tmp[5] = (byte)(x >> 24); + tmp[6] = (byte)(x >> 16); + tmp[7] = (byte)(x >> 8); + tmp[8] = (byte)x; + _strm.Write (tmp, 0, 9); + } + } + + public void WriteNil () + { + _strm.WriteByte (0xc0); + } + + public void Write (bool x) + { + _strm.WriteByte ((byte)(x ? 0xc3 : 0xc2)); + } + + public void Write (float x) + { + byte[] raw = BitConverter.GetBytes (x); // unsafeコードを使う? + byte[] tmp = _tmp; + + tmp[0] = 0xca; + if (BitConverter.IsLittleEndian) { + tmp[1] = raw[3]; + tmp[2] = raw[2]; + tmp[3] = raw[1]; + tmp[4] = raw[0]; + } else { + tmp[1] = raw[0]; + tmp[2] = raw[1]; + tmp[3] = raw[2]; + tmp[4] = raw[3]; + } + _strm.Write (tmp, 0, 5); + } + + public void Write (double x) + { + byte[] raw = BitConverter.GetBytes (x); // unsafeコードを使う? + byte[] tmp = _tmp; + + tmp[0] = 0xcb; + if (BitConverter.IsLittleEndian) { + tmp[1] = raw[7]; + tmp[2] = raw[6]; + tmp[3] = raw[5]; + tmp[4] = raw[4]; + tmp[5] = raw[3]; + tmp[6] = raw[2]; + tmp[7] = raw[1]; + tmp[8] = raw[0]; + } else { + tmp[1] = raw[0]; + tmp[2] = raw[1]; + tmp[3] = raw[2]; + tmp[4] = raw[3]; + tmp[5] = raw[4]; + tmp[6] = raw[5]; + tmp[7] = raw[6]; + tmp[8] = raw[7]; + } + _strm.Write (tmp, 0, 9); + } + + public void Write (byte[] bytes) + { + WriteRawHeader (bytes.Length); + _strm.Write (bytes, 0, bytes.Length); + } + + public void WriteRawHeader (int N) + { + WriteLengthHeader (N, 32, 0xa0, 0xda, 0xdb); + } + + public void WriteArrayHeader (int N) + { + WriteLengthHeader (N, 16, 0x90, 0xdc, 0xdd); + } + + public void WriteMapHeader (int N) + { + WriteLengthHeader (N, 16, 0x80, 0xde, 0xdf); + } + + void WriteLengthHeader (int N, int fix_length, byte fix_prefix, byte len16bit_prefix, byte len32bit_prefix) + { + if (N < fix_length) { + _strm.WriteByte ((byte)(fix_prefix | N)); + } else { + byte[] tmp = _tmp; + int header_len; + if (N < 0x10000) { + tmp[0] = len16bit_prefix; + tmp[1] = (byte)(N >> 8); + tmp[2] = (byte)N; + header_len = 3; + } else { + tmp[0] = len32bit_prefix; + tmp[1] = (byte)(N >> 24); + tmp[2] = (byte)(N >> 16); + tmp[3] = (byte)(N >> 8); + tmp[4] = (byte)N; + header_len = 5; + } + _strm.Write (tmp, 0, header_len); + } + } + + public void Write (string x) + { + Write (x, false); + } + + public void Write (string x, bool highProbAscii) + { + Write (x, _buf, highProbAscii); + } + + public void Write (string x, byte[] buf) + { + Write (x, buf, false); + } + + public void Write (string x, byte[] buf, bool highProbAscii) + { + Encoder encoder = _encoder; + //fixed (char *pstr = x) + //fixed (byte *pbuf = buf) { + char[] str = x.ToCharArray(); + if (highProbAscii && x.Length <= buf.Length) { + bool isAsciiFullCompatible = true; + for (int i = 0; i < x.Length; i ++) { + //int v = (int)pstr[i]; + int v = (int)(x[i]); + if (v > 0x7f) { + isAsciiFullCompatible = false; + break; + } + buf[i] = (byte)v; + } + if (isAsciiFullCompatible) { + WriteRawHeader (x.Length); + _strm.Write (buf, 0, x.Length); + return; + } + } + + //WriteRawHeader (encoder.GetByteCount (pstr, x.Length, true)); + WriteRawHeader (encoder.GetByteCount (str, 0, x.Length, true)); + int str_len = x.Length; + //char *p = pstr; + int convertedChars, bytesUsed; + bool completed = true; + int j = 0; + while (str_len > 0 || !completed) { + //encoder.Convert (p, str_len, pbuf, buf.Length, false, out convertedChars, out bytesUsed, out completed); + encoder.Convert (str, j, str_len, buf, 0, buf.Length, false, out convertedChars, out bytesUsed, out completed); + _strm.Write (buf, 0, bytesUsed); + str_len -= convertedChars; + //p += convertedChars; + j += convertedChars; + } + //} + } + } +} diff -r d132d442dc34 -r e6ad9016601c src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/src/ObjectPacker.cs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/src/ObjectPacker.cs Sun Oct 23 04:37:16 2016 +0900 @@ -0,0 +1,259 @@ +// +// Copyright 2011 Kazuki Oikawa +// +// 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. +// + +using System; +using System.Collections.Generic; +using System.IO; +using System.Reflection; +using System.Runtime.Serialization; +using System.Text; + +namespace MsgPack +{ + public class ObjectPacker + { + byte[] _buf = new byte[64]; + //Encoding _encoding = Encoding.UTF8; + static Dictionary PackerMapping; + static Dictionary UnpackerMapping; + + delegate void PackDelegate (ObjectPacker packer, MsgPackWriter writer, object o); + delegate object UnpackDelegate (ObjectPacker packer, MsgPackReader reader); + + static ObjectPacker () + { + PackerMapping = new Dictionary (); + UnpackerMapping = new Dictionary (); + + PackerMapping.Add (typeof (string), StringPacker); + UnpackerMapping.Add (typeof (string), StringUnpacker); + } + + public byte[] Pack (object o) + { + using (MemoryStream ms = new MemoryStream ()) { + Pack (ms, o); + return ms.ToArray (); + } + } + + public void Pack (Stream strm, object o) + { + if (o != null && o.GetType ().IsPrimitive) + throw new NotSupportedException (); + MsgPackWriter writer = new MsgPackWriter (strm); + Pack (writer, o); + } + + void Pack (MsgPackWriter writer, object o) + { + if (o == null) { + writer.WriteNil (); + return; + } + + Type t = o.GetType (); + if (t.IsPrimitive) { + if (t.Equals (typeof (int))) writer.Write ((int)o); + else if (t.Equals (typeof (uint))) writer.Write ((uint)o); + else if (t.Equals (typeof (float))) writer.Write ((float)o); + else if (t.Equals (typeof (double))) writer.Write ((double)o); + else if (t.Equals (typeof (long))) writer.Write ((long)o); + else if (t.Equals (typeof (ulong))) writer.Write ((ulong)o); + else if (t.Equals (typeof (bool))) writer.Write ((bool)o); + else if (t.Equals (typeof (byte))) writer.Write ((byte)o); + else if (t.Equals (typeof (sbyte))) writer.Write ((sbyte)o); + else if (t.Equals (typeof (short))) writer.Write ((short)o); + else if (t.Equals (typeof (ushort))) writer.Write ((ushort)o); + else if (t.Equals (typeof (char))) writer.Write ((ushort)(char)o); + else throw new NotSupportedException (); + return; + } + + PackDelegate packer; + if (PackerMapping.TryGetValue (t, out packer)) { + packer (this, writer, o); + return; + } + + if (t.IsArray) { + Array ary = (Array)o; + writer.WriteArrayHeader (ary.Length); + for (int i = 0; i < ary.Length; i ++) + Pack (writer, ary.GetValue (i)); + return; + } + + ReflectionCacheEntry entry = ReflectionCache.Lookup (t); + writer.WriteMapHeader (entry.FieldMap.Count); + foreach (KeyValuePair pair in entry.FieldMap) { + writer.Write (pair.Key, _buf); + object v = pair.Value.GetValue (o); + if (pair.Value.FieldType.IsInterface && v != null) { + writer.WriteArrayHeader (2); + writer.Write (v.GetType().FullName); + } + Pack (writer, v); + } + } + + public T Unpack (byte[] buf) + { + return Unpack (buf, 0, buf.Length); + } + + public T Unpack (byte[] buf, int offset, int size) + { + using (MemoryStream ms = new MemoryStream (buf, offset, size)) { + return Unpack (ms); + } + } + + public T Unpack (Stream strm) + { + if (typeof (T).IsPrimitive) + throw new NotSupportedException (); + MsgPackReader reader = new MsgPackReader (strm); + return (T)Unpack (reader, typeof (T)); + } + + public object Unpack (Type type, byte[] buf) + { + return Unpack (type, buf, 0, buf.Length); + } + + public object Unpack (Type type, byte[] buf, int offset, int size) + { + using (MemoryStream ms = new MemoryStream (buf, offset, size)) { + return Unpack (type, ms); + } + } + + public object Unpack (Type type, Stream strm) + { + if (type.IsPrimitive) + throw new NotSupportedException (); + MsgPackReader reader = new MsgPackReader (strm); + return Unpack (reader, type); + } + + object Unpack (MsgPackReader reader, Type t) + { + if (t.IsPrimitive) { + if (!reader.Read ()) throw new FormatException (); + if (t.Equals (typeof (int)) && reader.IsSigned ()) return reader.ValueSigned; + else if (t.Equals (typeof (uint)) && reader.IsUnsigned ()) return reader.ValueUnsigned; + else if (t.Equals (typeof (float)) && reader.Type == TypePrefixes.Float) return reader.ValueFloat; + else if (t.Equals (typeof (double)) && reader.Type == TypePrefixes.Double) return reader.ValueDouble; + else if (t.Equals (typeof (long))) { + if (reader.IsSigned64 ()) + return reader.ValueSigned64; + if (reader.IsSigned ()) + return (long)reader.ValueSigned; + } else if (t.Equals (typeof (ulong))) { + if (reader.IsUnsigned64 ()) + return reader.ValueUnsigned64; + if (reader.IsUnsigned ()) + return (ulong)reader.ValueUnsigned; + } else if (t.Equals (typeof (bool)) && reader.IsBoolean ()) return (reader.Type == TypePrefixes.True); + else if (t.Equals (typeof (byte)) && reader.IsUnsigned ()) return (byte)reader.ValueUnsigned; + else if (t.Equals (typeof (sbyte)) && reader.IsSigned ()) return (sbyte)reader.ValueSigned; + else if (t.Equals (typeof (short)) && reader.IsSigned ()) return (short)reader.ValueSigned; + else if (t.Equals (typeof (ushort)) && reader.IsUnsigned ()) return (ushort)reader.ValueUnsigned; + else if (t.Equals (typeof (char)) && reader.IsUnsigned ()) return (char)reader.ValueUnsigned; + else throw new NotSupportedException (); + } + + UnpackDelegate unpacker; + if (UnpackerMapping.TryGetValue (t, out unpacker)) + return unpacker (this, reader); + + if (t.IsArray) { + if (!reader.Read () || (!reader.IsArray () && reader.Type != TypePrefixes.Nil)) + throw new FormatException (); + if (reader.Type == TypePrefixes.Nil) + return null; + Type et = t.GetElementType (); + Array ary = Array.CreateInstance (et, (int)reader.Length); + for (int i = 0; i < ary.Length; i ++) + ary.SetValue (Unpack (reader, et), i); + return ary; + } + + if (!reader.Read ()) + throw new FormatException (); + if (reader.Type == TypePrefixes.Nil) + return null; + if (t.IsInterface) { + if (reader.Type != TypePrefixes.FixArray && reader.Length != 2) + throw new FormatException (); + if (!reader.Read () || !reader.IsRaw ()) + throw new FormatException (); + CheckBufferSize ((int)reader.Length); + reader.ReadValueRaw (_buf, 0, (int)reader.Length); + t = Type.GetType (Encoding.UTF8.GetString (_buf, 0, (int)reader.Length)); + if (!reader.Read () || reader.Type == TypePrefixes.Nil) + throw new FormatException (); + } + if (!reader.IsMap ()) + throw new FormatException (); + + object o = FormatterServices.GetUninitializedObject (t); + ReflectionCacheEntry entry = ReflectionCache.Lookup (t); + int members = (int)reader.Length; + for (int i = 0; i < members; i ++) { + if (!reader.Read () || !reader.IsRaw ()) + throw new FormatException (); + CheckBufferSize ((int)reader.Length); + reader.ReadValueRaw (_buf, 0, (int)reader.Length); + string name = Encoding.UTF8.GetString (_buf, 0, (int)reader.Length); + FieldInfo f; + if (!entry.FieldMap.TryGetValue (name, out f)) + throw new FormatException (); + f.SetValue (o, Unpack (reader, f.FieldType)); + } + + IDeserializationCallback callback = o as IDeserializationCallback; + if (callback != null) + callback.OnDeserialization (this); + return o; + } + + void CheckBufferSize (int size) + { + if (_buf.Length < size) + Array.Resize (ref _buf, size); + } + + static void StringPacker (ObjectPacker packer, MsgPackWriter writer, object o) + { + writer.Write (Encoding.UTF8.GetBytes ((string)o)); + } + + static object StringUnpacker (ObjectPacker packer, MsgPackReader reader) + { + if (!reader.Read ()) + throw new FormatException (); + if (reader.Type == TypePrefixes.Nil) + return null; + if (!reader.IsRaw ()) + throw new FormatException (); + packer.CheckBufferSize ((int)reader.Length); + reader.ReadValueRaw (packer._buf, 0, (int)reader.Length); + return Encoding.UTF8.GetString (packer._buf, 0, (int)reader.Length); + } + } +} diff -r d132d442dc34 -r e6ad9016601c src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/src/ReflectionCache.cs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/src/ReflectionCache.cs Sun Oct 23 04:37:16 2016 +0900 @@ -0,0 +1,60 @@ +// +// Copyright 2011 Kazuki Oikawa +// +// 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. +// + +using System; +using System.Collections.Generic; + +namespace MsgPack +{ + public static class ReflectionCache + { + static Dictionary _cache; + + static ReflectionCache () + { + _cache = new Dictionary (); + } + + public static ReflectionCacheEntry Lookup (Type type) + { + ReflectionCacheEntry entry; + lock (_cache) { + if (_cache.TryGetValue (type, out entry)) + return entry; + } + + entry = new ReflectionCacheEntry (type); + lock (_cache) { + _cache[type] = entry; + } + return entry; + } + + public static void RemoveCache (Type type) + { + lock (_cache) { + _cache.Remove (type); + } + } + + public static void Clear () + { + lock (_cache) { + _cache.Clear (); + } + } + } +} diff -r d132d442dc34 -r e6ad9016601c src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/src/ReflectionCacheEntry.cs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/src/ReflectionCacheEntry.cs Sun Oct 23 04:37:16 2016 +0900 @@ -0,0 +1,44 @@ +// +// Copyright 2011 Kazuki Oikawa +// +// 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. +// + +using System; +using System.Collections.Generic; +using System.Reflection; + +namespace MsgPack +{ + public class ReflectionCacheEntry + { + const BindingFlags FieldBindingFlags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField | BindingFlags.SetField; + + public ReflectionCacheEntry (Type t) + { + FieldInfo[] fields = t.GetFields (FieldBindingFlags); + IDictionary map = new Dictionary (fields.Length); + for (int i = 0; i < fields.Length; i ++) { + FieldInfo f = fields[i]; + string name = f.Name; + int pos; + if (name[0] == '<' && (pos = name.IndexOf ('>')) > 1) + name = name.Substring (1, pos - 1); // Auto-Property (\<.+\>) + map[name] = f; + } + FieldMap = map; + } + + public IDictionary FieldMap { get; private set; } + } +} diff -r d132d442dc34 -r e6ad9016601c src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/src/TypePrefixes.cs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/csharp/jp.ac.u-ryukyu.ie.cr/jungle/persistent/msgpack/src/TypePrefixes.cs Sun Oct 23 04:37:16 2016 +0900 @@ -0,0 +1,48 @@ +// +// Copyright 2011 Kazuki Oikawa +// +// 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. +// + +namespace MsgPack +{ + public enum TypePrefixes : byte + { + PositiveFixNum = 0x00, // 0x00 - 0x7f + NegativeFixNum = 0xe0, // 0xe0 - 0xff + + Nil = 0xc0, + False = 0xc2, + True = 0xc3, + Float = 0xca, + Double = 0xcb, + UInt8 = 0xcc, + UInt16 = 0xcd, + UInt32 = 0xce, + UInt64 = 0xcf, + Int8 = 0xd0, + Int16 = 0xd1, + Int32 = 0xd2, + Int64 = 0xd3, + Raw16 = 0xda, + Raw32 = 0xdb, + Array16 = 0xdc, + Array32 = 0xdd, + Map16 = 0xde, + Map32 = 0xdf, + + FixRaw = 0xa0, // 0xa0 - 0xbf + FixArray = 0x90, // 0x90 - 0x9f + FixMap = 0x80, // 0x80 - 0x8f + } +}