Index: /BasicCompiler32/Compile_Calc.cpp
===================================================================
--- /BasicCompiler32/Compile_Calc.cpp	(revision 127)
+++ /BasicCompiler32/Compile_Calc.cpp	(revision 128)
@@ -619,4 +619,23 @@
 
 
+	if( varType.IsObject() && Smoothie::Meta::blittableTypes.IsExist( calcType ) ){
+		// Blittable型をオブジェクトとして扱う
+		vector<UserProc *> userProcs;
+		Smoothie::Meta::blittableTypes.GetClass( calcType ).EnumStaticMethod( "_Create", userProcs );
+		if( userProcs.size() != 1 ){
+			SetError();
+			return;
+		}
+		UserProc *pUserProc = userProcs[0];
+
+		// call System.[TypeClass]._Create
+		op_call( pUserProc );
+
+		// push eax
+		op_push( REG_EAX );
+
+		calcType = pUserProc->ReturnType();
+	}
+
 
 	/////////////////////////////////
Index: /BasicCompiler32/Compile_Statement.cpp
===================================================================
--- /BasicCompiler32/Compile_Statement.cpp	(revision 127)
+++ /BasicCompiler32/Compile_Statement.cpp	(revision 128)
@@ -90,6 +90,5 @@
 	bool isLiteral;
 	BOOL bUseHeap;
-	bool result = TermOpe( leftTerm, Type(), resultType, isLiteral, &bUseHeap, NULL, true );
-
+	bool result = TermOpe( leftTerm, Type(), resultType, isLiteral, &bUseHeap, false, NULL, true );
 	if( result ){
 
Index: /BasicCompiler32/NumOpe.cpp
===================================================================
--- /BasicCompiler32/NumOpe.cpp	(revision 127)
+++ /BasicCompiler32/NumOpe.cpp	(revision 128)
@@ -227,5 +227,5 @@
 	return false;
 }
-bool TermOpe( const char *term, const Type &baseType, Type &resultType, bool &isLiteral, BOOL *pbUseHeap, bool *pIsClassName, bool isProcedureCallOnly ){
+bool TermOpe( const char *term, const Type &baseType, Type &resultType, bool &isLiteral, BOOL *pbUseHeap, bool isWantObject, bool *pIsClassName, bool isProcedureCallOnly ){
 	char parameter[VN_SIZE];
 
@@ -255,5 +255,17 @@
 		bool isClassName = false;
 		Type leftType;
-		if( !TermOpe( termLeft, baseType, leftType, isLiteral, pbUseHeap, &isClassName ) ){
+		if( GetTermType( termLeft, leftType, isLiteral, &isClassName ) ){
+			if( isClassName == false && Smoothie::Meta::blittableTypes.IsExist( leftType ) ){
+				// 左側のオブジェクト部分がBlittable型のとき
+
+				char temporary[VN_SIZE];
+				lstrcpy( temporary, termLeft );
+				sprintf( termLeft, "%s(%s)",
+					Smoothie::Meta::blittableTypes.Find( leftType ).GetCreateStaticMethodFullName().c_str(),
+					temporary );
+			}
+		}
+
+		if( !TermOpe( termLeft, baseType, leftType, isLiteral, pbUseHeap, true, &isClassName ) ){
 			goto globalArea;
 		}
Index: /BasicCompiler32/Opcode.h
===================================================================
--- /BasicCompiler32/Opcode.h	(revision 127)
+++ /BasicCompiler32/Opcode.h	(revision 128)
@@ -102,5 +102,13 @@
 //NumOpe.cpp
 void PushReturnValue(int type);
-bool TermOpe( const char *term, const Type &baseType, Type &resultType, bool &isLiteral, BOOL *pbUseHeap, bool *pIsClassName = NULL, bool isProcedureCallOnly = false );
+bool TermOpe(
+			 const char *term,
+			 const Type &baseType,
+			 Type &resultType,
+			 bool &isLiteral,
+			 BOOL *pbUseHeap,
+			 bool isWantObject = false,
+			 bool *pIsClassName = NULL,
+			 bool isProcedureCallOnly = false );
 bool NumOpe( int reg,
 			const char *expression,
Index: /BasicCompiler64/BasicCompiler.vcproj
===================================================================
--- /BasicCompiler64/BasicCompiler.vcproj	(revision 127)
+++ /BasicCompiler64/BasicCompiler.vcproj	(revision 128)
@@ -157,8 +157,8 @@
 				RuntimeLibrary="1"
 				UsePrecompiledHeader="0"
-				PrecompiledHeaderFile=".\Debug/BasicCompiler.pch"
-				AssemblerListingLocation=".\Debug/"
-				ObjectFile=".\Debug/"
-				ProgramDataBaseFileName=".\Debug/"
+				PrecompiledHeaderFile=".\SmallDebug/BasicCompiler.pch"
+				AssemblerListingLocation=".\SmallDebug/"
+				ObjectFile=".\SmallDebug/"
+				ProgramDataBaseFileName=".\SmallDebug/"
 				BrowseInformation="0"
 				WarningLevel="3"
@@ -188,5 +188,5 @@
 				IgnoreDefaultLibraryNames=""
 				GenerateDebugInformation="false"
-				ProgramDatabaseFile=".\Debug/BasicCompiler64.pdb"
+				ProgramDatabaseFile=".\SmallDebug/BasicCompiler64.pdb"
 				SubSystem="2"
 				TargetMachine="0"
Index: /BasicCompiler64/Compile_Calc.cpp
===================================================================
--- /BasicCompiler64/Compile_Calc.cpp	(revision 127)
+++ /BasicCompiler64/Compile_Calc.cpp	(revision 128)
@@ -227,4 +227,22 @@
 	}
 
+	if( varType.IsObject() && Smoothie::Meta::blittableTypes.IsExist( calcType ) ){
+		// Blittable型をオブジェクトとして扱う
+		vector<UserProc *> userProcs;
+		Smoothie::Meta::blittableTypes.GetClass( calcType ).EnumStaticMethod( "_Create", userProcs );
+		if( userProcs.size() != 1 ){
+			SetError();
+			return;
+		}
+		UserProc *pUserProc = userProcs[0];
+
+		// mov rcx, rax
+		op_mov_RR( REG_RCX, REG_RAX );
+
+		// call System.[TypeClass]._Create
+		op_call( pUserProc );
+
+		calcType = pUserProc->ReturnType();
+	}
 
 	/////////////////////////////////
Index: /BasicCompiler64/Compile_Statement.cpp
===================================================================
--- /BasicCompiler64/Compile_Statement.cpp	(revision 127)
+++ /BasicCompiler64/Compile_Statement.cpp	(revision 128)
@@ -94,5 +94,5 @@
 	bool isLiteral;
 	BOOL bUseHeap;
-	bool result = TermOpe( leftTerm, Type(), resultType, isLiteral, &bUseHeap, NULL, true );
+	bool result = TermOpe( leftTerm, Type(), resultType, isLiteral, &bUseHeap, false, NULL, true );
 
 	delete pobj_reg;
Index: /BasicCompiler64/NumOpe.cpp
===================================================================
--- /BasicCompiler64/NumOpe.cpp	(revision 127)
+++ /BasicCompiler64/NumOpe.cpp	(revision 128)
@@ -224,5 +224,5 @@
 	return false;
 }
-bool TermOpe( const char *term, const Type &baseType, Type &resultType, bool &isLiteral, BOOL *pbUseHeap, bool *pIsClassName, bool isProcedureCallOnly ){
+bool TermOpe( const char *term, const Type &baseType, Type &resultType, bool &isLiteral, BOOL *pbUseHeap, bool isWantObject, bool *pIsClassName, bool isProcedureCallOnly ){
 	char parameter[VN_SIZE];
 
@@ -252,5 +252,17 @@
 		bool isClassName = false;
 		Type leftType;
-		if( !TermOpe( termLeft, baseType, leftType, isLiteral, pbUseHeap, &isClassName ) ){
+		if( GetTermType( termLeft, leftType, isLiteral, &isClassName ) ){
+			if( isClassName == false && Smoothie::Meta::blittableTypes.IsExist( leftType ) ){
+				// 左側のオブジェクト部分がBlittable型のとき
+
+				char temporary[VN_SIZE];
+				lstrcpy( temporary, termLeft );
+				sprintf( termLeft, "%s(%s)",
+					Smoothie::Meta::blittableTypes.Find( leftType ).GetCreateStaticMethodFullName().c_str(),
+					temporary );
+			}
+		}
+
+		if( !TermOpe( termLeft, baseType, leftType, isLiteral, pbUseHeap, true, &isClassName ) ){
 			goto globalArea;
 		}
@@ -705,4 +717,21 @@
 					//型名
 					if( Type::StringToType( term, resultType ) ){
+
+						if( resultType.IsObject() ){
+							if( resultType.GetClass().IsBlittableType() ){
+								// Blittable型のときは基本型として扱う
+								// ※ただし、コンパイル中のメソッドがBlittable型クラスに属していないこと
+								if( UserProc::IsLocalAreaCompiling()
+									&& UserProc::CompilingUserProc().HasParentClass()
+									&& UserProc::CompilingUserProc().GetParentClass().IsBlittableType() )
+								{
+									// コンパイル中のメソッドがBlittable型クラスに属している
+								}
+								else{
+									resultType = resultType.GetClass().GetBlittableType();
+								}
+							}
+						}
+
 						resultType.SetBasicType( resultType.GetBasicType() | FLAG_CAST );
 					}
Index: /BasicCompiler64/Opcode.h
===================================================================
--- /BasicCompiler64/Opcode.h	(revision 127)
+++ /BasicCompiler64/Opcode.h	(revision 128)
@@ -251,5 +251,13 @@
 
 //NumOpe.cpp
-bool TermOpe( const char *term, const Type &baseType, Type &resultType, bool &isLiteral, BOOL *pbUseHeap, bool *pIsClassName = NULL, bool isProcedureCallOnly = false );
+bool TermOpe(
+			 const char *term,
+			 const Type &baseType,
+			 Type &resultType,
+			 bool &isLiteral,
+			 BOOL *pbUseHeap,
+			 bool isWantObject = false,
+			 bool *pIsClassName = NULL,
+			 bool isProcedureCallOnly = false );
 bool NumOpe( int *pReg,
 		   const char *Command,
Index: /BasicCompiler_Common/Class.cpp
===================================================================
--- /BasicCompiler_Common/Class.cpp	(revision 127)
+++ /BasicCompiler_Common/Class.cpp	(revision 128)
@@ -911,4 +911,7 @@
 	char temporary[VN_SIZE];
 
+	// Blittable型管理オブジェクトを初期化
+	Smoothie::Meta::blittableTypes.clear();
+
 	// 名前空間管理
 	NamespaceScopes &namespaceScopes = Smoothie::Lexical::liveingNamespaceScopes;
@@ -971,8 +974,15 @@
 
 				i+=2;
-				//アラインメント修飾子
+				Type blittableType;
 				if(memicmp(basbuf+i,"Align(",6)==0){
+					//アラインメント修飾子
 					i+=6;
 					i=JumpStringInPare(basbuf,i)+1;
+				}
+				else if( memicmp( basbuf + i, "Blittable(", 10 ) == 0 ){
+					// Blittable修飾子
+					i+=10;
+					i+=GetStringInPare_RemovePare(temporary,basbuf+i)+1;
+					Type::StringToType( temporary, blittableType );
 				}
 
@@ -1013,4 +1023,12 @@
 					}
 				}
+
+				// Blittable型の場合
+				if( !blittableType.IsNull() ){
+					pClass->SetBlittableType( blittableType );
+
+					// Blittable型として登録
+					Smoothie::Meta::blittableTypes.push_back( BlittableType( blittableType, pClass ) );
+				}
 		}
 	}
@@ -1344,7 +1362,7 @@
 			i+=2;
 
-			//アラインメント修飾子
 			int iAlign=0;
 			if(memicmp(basbuf+i,"Align(",6)==0){
+				//アラインメント修飾子
 				i+=6;
 				i+=GetStringInPare_RemovePare(temporary,basbuf+i)+1;
@@ -1353,4 +1371,9 @@
 				if(!(iAlign==1||iAlign==2||iAlign==4||iAlign==8||iAlign==16))
 					SetError(51,NULL,i);
+			}
+			else if( memicmp( basbuf + i, "Blittable(", 10 ) == 0 ){
+				// Blittable修飾子
+				i+=10;
+				i=JumpStringInPare(basbuf,i)+1;
 			}
 
@@ -1416,21 +1439,4 @@
 						goto InheritsError;
 					}
-				}
-				else if( memicmp( basbuf + i+1,"Blittable", 9 ) == 0 &&
-					basbuf[i+10] == 1 && basbuf[i+11] == ESC_INHERITS ){
-						// Blittable Inherits
-
-						for(i+=12,i2=0;;i++,i2++){
-							if(IsCommandDelimitation(basbuf[i])){
-								temporary[i2]=0;
-								break;
-							}
-							temporary[i2]=basbuf[i];
-						}
-
-						Type type;
-						Type::StringToType( temporary, type );
-						pobj_c->SetBlittableType( type );
-
 				}
 
Index: /BasicCompiler_Common/Class.h
===================================================================
--- /BasicCompiler_Common/Class.h	(revision 127)
+++ /BasicCompiler_Common/Class.h	(revision 128)
@@ -130,5 +130,5 @@
 	bool IsBlittableType() const
 	{
-		return blittableType.IsNull();
+		return !blittableType.IsNull();
 	}
 	const Type &GetBlittableType() const
Index: /BasicCompiler_Common/Intermediate_Step2.cpp
===================================================================
--- /BasicCompiler_Common/Intermediate_Step2.cpp	(revision 127)
+++ /BasicCompiler_Common/Intermediate_Step2.cpp	(revision 128)
@@ -418,4 +418,8 @@
 				if( Command[i2] == 1 && Command[i2+1] == ESC_ENUM ){
 					i2 += 2;
+				}
+				else if( memicmp( Command + i2, "Blittable(", 10 ) == 0 ){
+					i2 += 10;
+					i2 = JumpStringInPare(Command,i2)+1;
 				}
 
Index: /BasicCompiler_Common/NumOpe_GetType.cpp
===================================================================
--- /BasicCompiler_Common/NumOpe_GetType.cpp	(revision 127)
+++ /BasicCompiler_Common/NumOpe_GetType.cpp	(revision 128)
@@ -294,5 +294,5 @@
 }
 
-bool GetTermType( const char *term, Type &resultType, bool &isLiteral, bool *pIsClassName = NULL ){
+bool GetTermType( const char *term, Type &resultType, bool &isLiteral, bool *pIsClassName ){
 	char parameter[VN_SIZE];
 
@@ -322,5 +322,20 @@
 		bool isClassName = false;
 		Type leftType;
-		if( !GetTermType( termLeft, leftType, isLiteral, &isClassName ) ){
+		if( GetTermType( termLeft, leftType, isLiteral, &isClassName ) ){
+			if( isClassName == false && Smoothie::Meta::blittableTypes.IsExist( leftType ) ){
+				// 左側のオブジェクト部分がBlittable型のとき
+
+				char temporary[VN_SIZE];
+				lstrcpy( temporary, termLeft );
+				sprintf( termLeft, "%s(%s)",
+					Smoothie::Meta::blittableTypes.Find( leftType ).GetCreateStaticMethodFullName().c_str(),
+					temporary );
+
+				if( !GetTermType( termLeft, leftType, isLiteral, &isClassName ) ){
+					goto globalArea;
+				}
+			}
+		}
+		else{
 			goto globalArea;
 		}
@@ -615,4 +630,21 @@
 					//型名
 					if( Type::StringToType( term, resultType ) ){
+
+						if( resultType.IsObject() ){
+							if( resultType.GetClass().IsBlittableType() ){
+								// Blittable型のときは基本型として扱う
+								// ※ただし、コンパイル中のメソッドがBlittable型クラスに属していないこと
+								if( UserProc::IsLocalAreaCompiling()
+									&& UserProc::CompilingUserProc().HasParentClass()
+									&& UserProc::CompilingUserProc().GetParentClass().IsBlittableType() )
+								{
+									// コンパイル中のメソッドがBlittable型クラスに属している
+								}
+								else{
+									resultType = resultType.GetClass().GetBlittableType();
+								}
+							}
+						}
+
 						resultType.SetBasicType( resultType.GetBasicType() | FLAG_CAST );
 					}
@@ -656,8 +688,4 @@
 					//////////////////
 					// 何らかの識別子
-
-						if( strstr(term,"T.B")){
-							int test=0;
-						}
 
 					bool isLiteral = true;
Index: /BasicCompiler_Common/Procedure.cpp
===================================================================
--- /BasicCompiler_Common/Procedure.cpp	(revision 127)
+++ /BasicCompiler_Common/Procedure.cpp	(revision 128)
@@ -105,4 +105,5 @@
 		}
 		else if(sourceOfParams[i]==1&&sourceOfParams[i+1]==ESC_AS){
+			// As指定
 			i+=2;
 
@@ -131,4 +132,11 @@
 				SetError(3,temporary,nowLine);
 				type.SetBasicType( DEF_PTR_VOID );
+			}
+
+			if( type.IsObject() ){
+				if( type.GetClass().IsBlittableType() ){
+					// Blittable型のときは基本型として扱う
+					type = type.GetClass().GetBlittableType();
+				}
 			}
 		}
Index: /BasicCompiler_Common/Type.cpp
===================================================================
--- /BasicCompiler_Common/Type.cpp	(revision 127)
+++ /BasicCompiler_Common/Type.cpp	(revision 128)
@@ -522,2 +522,7 @@
 	return Type( DEF_OBJECT, *pobj_DBClass->GetStringClassPtr() );
 }
+
+const string BlittableType::GetCreateStaticMethodFullName() const
+{
+	return pClass->GetNamespaceScopes().ToString() + "." + pClass->GetName() + "._Create";
+}
Index: /BasicCompiler_Common/Type.h
===================================================================
--- /BasicCompiler_Common/Type.h	(revision 127)
+++ /BasicCompiler_Common/Type.h	(revision 128)
@@ -130,2 +130,62 @@
 	static bool StringToType( const string &typeName, Type &type );
 };
+
+class BlittableType
+{
+	Type basicType;
+	CClass *pClass;
+public:
+	BlittableType( const Type &basicType, CClass *pClass )
+		: basicType( basicType )
+		, pClass( pClass )
+	{
+	}
+	BlittableType(){}
+	const Type &GetBasicType() const
+	{
+		return basicType;
+	}
+	const CClass *GetClassPtr() const
+	{
+		return pClass;
+	}
+	const string GetCreateStaticMethodFullName() const;
+};
+class BlittableTypes : public vector<BlittableType>
+{
+public:
+	bool IsExist( Type type ) const
+	{
+		const BlittableTypes &blittableTypes = *this;
+		BOOST_FOREACH( const BlittableType &blittableType, blittableTypes ){
+			if( blittableType.GetBasicType().Equals( type ) ){
+				return true;
+			}
+		}
+		return false;
+	}
+	const BlittableType &Find( const Type &type ) const
+	{
+		const BlittableTypes &blittableTypes = *this;
+		BOOST_FOREACH( const BlittableType &blittableType, blittableTypes ){
+			if( blittableType.GetBasicType().Equals( type ) ){
+				return blittableType;
+			}
+		}
+		throw "Blittable型ではない";
+	}
+	const CClass *GetClassPtr( const Type &type ) const
+	{
+		const BlittableTypes &blittableTypes = *this;
+		BOOST_FOREACH( const BlittableType &blittableType, blittableTypes ){
+			if( blittableType.GetBasicType().Equals( type ) ){
+				return blittableType.GetClassPtr();
+			}
+		}
+		return NULL;
+	}
+	const CClass &GetClass( const Type &type ) const
+	{
+		return *GetClassPtr( type );
+	}
+};
Index: /BasicCompiler_Common/VariableOpe.cpp
===================================================================
--- /BasicCompiler_Common/VariableOpe.cpp	(revision 127)
+++ /BasicCompiler_Common/VariableOpe.cpp	(revision 128)
@@ -1203,4 +1203,20 @@
 	}
 
+	if( type.IsObject() ){
+		if( type.GetClass().IsBlittableType() ){
+			// Blittable型のときは基本型として扱う
+			// ※ただし、コンパイル中のメソッドがBlittable型クラスに属していないこと
+			if( UserProc::IsLocalAreaCompiling()
+				&& UserProc::CompilingUserProc().HasParentClass()
+				&& UserProc::CompilingUserProc().GetParentClass().IsBlittableType() )
+			{
+				// コンパイル中のメソッドがBlittable型クラスに属している
+			}
+			else{
+				type = type.GetClass().GetBlittableType();
+			}
+		}
+	}
+
 	if(dwFlags&DIMFLAG_STATIC){
 		if( UserProc::IsGlobalAreaCompiling() ){
Index: /BasicCompiler_Common/calculation.cpp
===================================================================
--- /BasicCompiler_Common/calculation.cpp	(revision 127)
+++ /BasicCompiler_Common/calculation.cpp	(revision 128)
@@ -698,4 +698,11 @@
 							}
 
+							if( tempType.IsObject() ){
+								if( tempType.GetClass().IsBlittableType() ){
+									// Blittable型のときは基本型として扱う
+									tempType = tempType.GetClass().GetBlittableType();
+								}
+							}
+
 							type[pnum] = tempType.GetBasicType();
 							before_index[pnum] = tempType.GetIndex();
Index: /BasicCompiler_Common/common.h
===================================================================
--- /BasicCompiler_Common/common.h	(revision 127)
+++ /BasicCompiler_Common/common.h	(revision 128)
@@ -47,7 +47,7 @@
 
 #ifdef _AMD64_
-#define VER_INFO		"(x64) β rev.248"
+#define VER_INFO		"(x64) β rev.255"
 #else
-#define VER_INFO		"β rev.248"
+#define VER_INFO		"β rev.255"
 #endif
 
@@ -439,4 +439,5 @@
 int AutoBigCast(int BaseType,int CalcType);
 BOOL CheckCalcType(int idCalc,int *type,int sp);
+bool GetTermType( const char *term, Type &resultType, bool &isLiteral, bool *pIsClassName = NULL );
 bool NumOpe_GetType( const char *expression, const Type &baseType, Type &resultType );
 
Index: /BasicCompiler_Common/include/Smoothie.h
===================================================================
--- /BasicCompiler_Common/include/Smoothie.h	(revision 127)
+++ /BasicCompiler_Common/include/Smoothie.h	(revision 128)
@@ -40,4 +40,5 @@
 		static NamespaceScopesCollection namespaceScopesCollection;
 		static NamespaceScopesCollection importedNamespaces;
+		static BlittableTypes blittableTypes;
 	};
 
Index: /BasicCompiler_Common/src/Smoothie.cpp
===================================================================
--- /BasicCompiler_Common/src/Smoothie.cpp	(revision 127)
+++ /BasicCompiler_Common/src/Smoothie.cpp	(revision 128)
@@ -23,4 +23,5 @@
 NamespaceScopesCollection Smoothie::Meta::namespaceScopesCollection;
 NamespaceScopesCollection Smoothie::Meta::importedNamespaces;
+BlittableTypes Smoothie::Meta::blittableTypes;
 
 bool Smoothie::isFullCompile = false;
