Index: trunk/abdev/BasicCompiler64/NumOpe.cpp
===================================================================
--- trunk/abdev/BasicCompiler64/NumOpe.cpp	(revision 350)
+++ trunk/abdev/BasicCompiler64/NumOpe.cpp	(revision 355)
@@ -590,7 +590,11 @@
 			BOOL *pbUseHeap )
 {
-
 	int i,i2,i3;
 	char temporary[1024],temp2[1024];
+
+	if( (string)expression == "typeInfo=t2" )
+	{
+		int test=0;
+	}
 
 	if(expression[0]=='\0'){
@@ -602,134 +606,118 @@
 		// リテラル配列の場合
 
-		if( !baseType.IsPointer() ){
-			SetError(1,NULL,cp);
+		int dataTableOffset;
+		if( !compiler.GetObjectModule().dataTable.MakeLiteralArrayBuffer( expression, baseType, dataTableOffset ) )
+		{
 			return false;
 		}
-		Type tempBaseType( baseType );
-		tempBaseType.PtrLevelDown();
-
-		char *buffer = (char *)malloc( lstrlen( expression ) + 1 );
-		lstrcpy( buffer, expression );
-		RemoveStringBracket( buffer );
-
-		void *binary = malloc( 1 );
-		int num = 0;
-
-		i = 0;
-		while( buffer[i] ){
-			i = GetOneParameter( buffer, i, temporary );
-			if( buffer[i] == ',' ){
-				i++;
-			}
-
-			Type resultType;
+
+		//mov reg,i2
+		compiler.codeGenerator.op_mov_RV( sizeof(_int64), *pReg, dataTableOffset, Schedule::DataTable );
+
+		resultType = baseType;
+
+		return true;
+	}
+
+	bool isLiteralCalculation;
+	if( NumOpe_GetType( expression, baseType, resultType, &isLiteralCalculation ) )
+	{
+		if( isLiteralCalculation )
+		{
+			//右辺値が数値の定数式の場合
 			_int64 i64data;
-			if( !StaticCalculation( true, temporary, tempBaseType.GetBasicType(), &i64data, resultType ) ){
+			StaticCalculation(true, expression,baseType.GetBasicType(),&i64data,resultType);
+
+			if(resultType.IsReal()){
+				if(baseType.IsReal()) resultType=baseType;
+
+				int xmmReg = pobj_reg->GetNextXmmReg();
+				*pReg = xmmReg;
+
+				if(resultType.IsDouble()){
+					i3 = compiler.GetObjectModule().dataTable.Add( i64data );
+
+					//movlpd xmm_reg,qword ptr[data table offset]
+					compiler.codeGenerator.op_movlpd_RM( xmmReg, 0, i3, MOD_DISP32, Schedule::DataTable );
+				}
+				if(resultType.IsSingle()){
+					double dbl;
+					memcpy(&dbl,&i64data,sizeof(_int64));
+
+					float flt;
+					int i32data;
+					flt=(float)dbl;
+					memcpy(&i32data,&flt,sizeof(long));
+
+					i3 = compiler.GetObjectModule().dataTable.Add( i32data );
+
+					//movss xmm_reg,dword ptr[data table offset]
+					compiler.codeGenerator.op_movss_RM( xmmReg, 0, i3, MOD_DISP32, Schedule::DataTable );
+				}
+			}
+			else{
+				if(!resultType.Is64()){
+					//整数（符号有り/無し）
+
+					i3=(long)i64data;
+
+					if(resultType.GetBasicSize()==sizeof(char)) i3=i3&0x000000FF;
+					if(resultType.GetBasicSize()==sizeof(short)) i3=i3&0x0000FFFF;
+
+					i64data=(_int64)i3;
+				}
+
+				//mov reg,i64data
+				compiler.codeGenerator.op_mov_RV64(*pReg,i64data);
+			}
+			return true;
+		}
+	}
+
+	if( expression[0] == 1 )
+	{
+		if( expression[1]==ESC_NEW )
+		{
+			//New演算子（オブジェクト生成）
+
+			if( pobj_BlockReg->check(REG_RAX) ){
+				SetError();
+			}
+
+			//////////////////////////////////////////////////////
+			/////    レジスタ資源のバックアップ
+			{	BACKUP_REGISTER_RESOURCE
+			//////////////////////////////////////////////////////
+
+				if( !Operator_New( expression+2, baseType, resultType ) ){
+					return false;
+				}
+
+			/////////////////////////////////////////////
+			//////   レジスタ資源を復元
+				RESTORE_REGISTER_RESOURCE
+			}////////////////////////////////////////////
+
+			//mov reg,rax
+			compiler.codeGenerator.op_mov_RR( *pReg, REG_RAX );
+
+			return true;
+		}
+		else if( expression[1] == ESC_SYSTEM_STATIC_NEW )
+		{
+			// 静的領域にオブジェクトを作る
+
+			// 静的領域にオブジェクトを生成
+			int dataTableOffset;
+			if( !compiler.GetObjectModule().dataTable.MakeConstObjectToProcessStaticBuffer( expression + 2, resultType, dataTableOffset ) )
+			{
 				return false;
 			}
-			if( !resultType.IsWhole() ){
-				// TODO: 実数に未対応
-				SetError();
-				return false;
-			}
-
-			binary = realloc( binary, ( num + 1 ) * tempBaseType.GetSize() );
-			memcpy( (char *)binary + (num * tempBaseType.GetSize()), &i64data, tempBaseType.GetSize() );
-			num++;
-		}
-
-		i2 = compiler.GetObjectModule().dataTable.AddBinary( binary, num * tempBaseType.GetSize() );
-
-		//mov reg,i2
-		compiler.codeGenerator.op_mov_RV(sizeof(_int64),*pReg,i2, Schedule::DataTable );
-
-		free( buffer );
-
-		resultType = baseType;
-
-		return true;
-	}
-
-	bool isLiteralCalculation;
-	if( !NumOpe_GetType( expression, baseType, resultType, &isLiteralCalculation ) )
-	{
-		return false;
-	}
-	if( isLiteralCalculation )
-	{
-		//右辺値が数値の定数式の場合
-		_int64 i64data;
-		StaticCalculation(true, expression,baseType.GetBasicType(),&i64data,resultType);
-
-		if(resultType.IsReal()){
-			if(baseType.IsReal()) resultType=baseType;
-
-			int xmmReg = pobj_reg->GetNextXmmReg();
-			*pReg = xmmReg;
-
-			if(resultType.IsDouble()){
-				i3 = compiler.GetObjectModule().dataTable.Add( i64data );
-
-				//movlpd xmm_reg,qword ptr[data table offset]
-				compiler.codeGenerator.op_movlpd_RM( xmmReg, 0, i3, MOD_DISP32, Schedule::DataTable );
-			}
-			if(resultType.IsSingle()){
-				double dbl;
-				memcpy(&dbl,&i64data,sizeof(_int64));
-
-				float flt;
-				int i32data;
-				flt=(float)dbl;
-				memcpy(&i32data,&flt,sizeof(long));
-
-				i3 = compiler.GetObjectModule().dataTable.Add( i32data );
-
-				//movss xmm_reg,dword ptr[data table offset]
-				compiler.codeGenerator.op_movss_RM( xmmReg, 0, i3, MOD_DISP32, Schedule::DataTable );
-			}
-		}
-		else{
-			if(!resultType.Is64()){
-				//整数（符号有り/無し）
-
-				i3=(long)i64data;
-
-				if(resultType.GetBasicSize()==sizeof(char)) i3=i3&0x000000FF;
-				if(resultType.GetBasicSize()==sizeof(short)) i3=i3&0x0000FFFF;
-
-				i64data=(_int64)i3;
-			}
-
-			//mov reg,i64data
-			compiler.codeGenerator.op_mov_RV64(*pReg,i64data);
-		}
-		return true;
-	}
-
-	if(expression[0]==1&& expression[1]==ESC_NEW ){
-		//New演算子（オブジェクト生成）
-
-		if( pobj_BlockReg->check(REG_RAX) ){
-			SetError();
-		}
-
-		//////////////////////////////////////////////////////
-		/////    レジスタ資源のバックアップ
-		{	BACKUP_REGISTER_RESOURCE
-		//////////////////////////////////////////////////////
-
-			if( !Operator_New( expression+2, baseType, resultType ) ){
-				return false;
-			}
-
-		/////////////////////////////////////////////
-		//////   レジスタ資源を復元
-			RESTORE_REGISTER_RESOURCE
-		}////////////////////////////////////////////
-
-		//mov reg,rax
-		compiler.codeGenerator.op_mov_RR( *pReg, REG_RAX );
-
-		return true;
+
+			//mov reg,i2
+			compiler.codeGenerator.op_mov_RV( sizeof(_int64), *pReg, dataTableOffset, Schedule::DataTable);
+
+			return true;
+		}
 	}
 
@@ -850,22 +838,4 @@
 					|| term[0] == '\"' )
 				{
-					if( !baseType.IsPointer() )
-					{
-						//要求タイプがオブジェクト、または未定のとき
-
-						//String型オブジェクトを生成
-						NewStringObject(UseReg,term);
-
-						type_stack[sp]=DEF_OBJECT;
-						index_stack[sp]=(LONG_PTR)compiler.GetObjectModule().meta.GetClasses().GetStringClassPtr();
-						bLiteralCalculation=0;
-
-						if(bXmm) pobj_reg->LockXmmReg();
-						else pobj_reg->LockReg();
-
-						sp++;
-						break;
-					}
-
 					bool isEx = true;
 					if( term[0] == '\"' )
@@ -893,4 +863,26 @@
 						i3=lstrlen(term);
 					}
+
+					if( !baseType.IsPointer() )
+					{
+						//要求タイプがオブジェクト、または未定のとき
+
+						//String型オブジェクトを生成
+						i2 = compiler.GetObjectModule().dataTable.MakeConstStringObjectToProcessStaticBuffer( term );
+
+						//mov reg,i2
+						compiler.codeGenerator.op_mov_RV(sizeof(_int64),UseReg,i2, Schedule::DataTable);
+
+						type_stack[sp]=DEF_OBJECT;
+						index_stack[sp]=(LONG_PTR)compiler.GetObjectModule().meta.GetClasses().GetStringClassPtr();
+						bLiteralCalculation=0;
+
+						if(bXmm) pobj_reg->LockXmmReg();
+						else pobj_reg->LockReg();
+
+						sp++;
+						break;
+					}
+
 StrLiteral:
 
