fix userPtr mode
diff --git a/readme.md b/readme.md
index d51ee5c..48f51e5 100644
--- a/readme.md
+++ b/readme.md
@@ -1,5 +1,5 @@
 
-Xbyak 3.50 ; JIT assembler for x86(IA32), x64(AMD64, x86-64) by C++
+Xbyak 3.51 ; JIT assembler for x86(IA32), x64(AMD64, x86-64) by C++
 =============
 
 Abstract
@@ -222,6 +222,7 @@
 History
 -------------
 
+* 2012/Mar/23 ver 3.51 fix userPtr mode
 * 2012/Mar/19 ver 3.50 support AutoGrow mode
 * 2011/Nov/09 ver 3.05 fix bit property of rip addresing / support movsxd
 * 2011/Aug/15 ver 3.04 fix dealing with imm8 such as add(dword [ebp-8], 0xda); (thanks to lolcat)
diff --git a/readme.txt b/readme.txt
index 6498e54..943155e 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,5 +1,5 @@
 

-    C++用x86(IA-32), x64(AMD64, x86-64) JITアセンブラ Xbyak version 3.50

+    C++用x86(IA-32), x64(AMD64, x86-64) JITアセンブラ Xbyak version 3.51

 

 -----------------------------------------------------------------------------

 ◎概要

@@ -242,6 +242,7 @@
 -----------------------------------------------------------------------------

 ◎履歴

 

+2012/03/23 ver 3.51 userPtrモードがバグったのを修正

 2012/03/19 ver 3.50 AutoGrowモードサポート

 2011/11/09 ver 3.05 rip相対の64bitサイズ以外の扱いのバグ修正 / movsxdサポート

 2011/08/15 ver 3.04 add(dword [ebp-8], 0xda);などにおけるimm8の扱いのバグ修正(thanks to lolcat)

diff --git a/sample/test0.cpp b/sample/test0.cpp
index c7504d1..cf3db88 100644
--- a/sample/test0.cpp
+++ b/sample/test0.cpp
@@ -129,6 +129,10 @@
 			CodeArray::protect(p, codeSize, true);
 			Sample s(p, codeSize);
 			int (*func)(int) = (int (*)(int))s.getCode();
+			if ((uint8*)func != p) {
+				fprintf(stderr, "internal error %p %p\n", p, func);
+				return 1;
+			}
 			printf("0 + ... + %d = %d\n", 100, func(100));
 			CodeArray::protect(p, codeSize, false);
 		}
diff --git a/xbyak/xbyak.h b/xbyak/xbyak.h
index b405a8b..5c0de25 100644
--- a/xbyak/xbyak.h
+++ b/xbyak/xbyak.h
@@ -53,7 +53,7 @@
 
 enum {
 	DEFAULT_MAX_CODE_SIZE = 4096,
-	VERSION = 0x3500, /* 0xABCD = A.BC(D) */
+	VERSION = 0x3510, /* 0xABCD = A.BC(D) */
 };
 
 #ifndef MIE_INTEGER_TYPE_DEFINED
@@ -422,6 +422,7 @@
 	Type getType(size_t maxSize, void *userPtr) const
 	{
 		if (userPtr == AutoGrow) return AUTO_GROW;
+		if (userPtr) return USER_BUF;
 		if (maxSize <= MAX_FIXED_BUF_SIZE) return FIXED_BUF;
 		return ALLOC_BUF;
 	}
diff --git a/xbyak/xbyak_mnemonic.h b/xbyak/xbyak_mnemonic.h
index 9b4eccd..4283b51 100644
--- a/xbyak/xbyak_mnemonic.h
+++ b/xbyak/xbyak_mnemonic.h
@@ -1,4 +1,4 @@
-const char *getVersionString() const { return "3.50"; }
+const char *getVersionString() const { return "3.51"; }
 void packssdw(const Mmx& mmx, const Operand& op) { opMMX(mmx, op, 0x6B); }
 void packsswb(const Mmx& mmx, const Operand& op) { opMMX(mmx, op, 0x63); }
 void packuswb(const Mmx& mmx, const Operand& op) { opMMX(mmx, op, 0x67); }