Index: trunk/abdev/BasicCompiler32/NumOpe.cpp
===================================================================
--- trunk/abdev/BasicCompiler32/NumOpe.cpp	(revision 350)
+++ trunk/abdev/BasicCompiler32/NumOpe.cpp	(revision 355)
@@ -604,47 +604,12 @@
 		// リテラル配列の場合
 
-		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;
-			_int64 i64data;
-			if( !StaticCalculation( true, temporary, tempBaseType.GetBasicType(), &i64data, resultType ) ){
-				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 eax,i2
-		compiler.codeGenerator.op_mov_RV(REG_EAX,i2, Schedule::DataTable );
-
-		free( buffer );
+		compiler.codeGenerator.op_mov_RV(REG_EAX,dataTableOffset, Schedule::DataTable );
 
 		resultType = baseType;
@@ -657,59 +622,77 @@
 
 	bool isLiteralCalculation;
-	if( !NumOpe_GetType( expression, baseType, resultType, &isLiteralCalculation ) )
+	if( NumOpe_GetType( expression, baseType, resultType, &isLiteralCalculation ) )
 	{
-		return false;
-	}
-	if( isLiteralCalculation )
+		if( isLiteralCalculation )
+		{
+			//右辺値が数値の定数式の場合
+			_int64 i64data;
+			StaticCalculation(true, expression,baseType.GetBasicType(),&i64data,resultType);
+
+			if( resultType.GetBasicSize() == sizeof(_int64) ){
+				//64ビット（符号有り整数/実数）
+
+				//push HILONG(i64data)
+				compiler.codeGenerator.op_push_V((long)*(long *)(((char *)(&i64data))+4));
+
+				//push LOLONG(i64data)
+				compiler.codeGenerator.op_push_V(*(long *)(&i64data));
+			}
+			else if( resultType.IsSingle() ){
+				//single実数
+
+				double dbl;
+				memcpy(&dbl,&i64data,sizeof(_int64));
+
+				float flt;
+				flt=(float)dbl;
+				long l;
+				memcpy(&l,&flt,sizeof(long));
+
+				//push flt
+				compiler.codeGenerator.op_push_V(l);
+			}
+			else{
+				//整数（符号有り/無し）
+
+				long l = (long)i64data;
+
+				if(resultType.GetBasicSize()==sizeof(char)) l = l & 0x000000FF;
+				if(resultType.GetBasicSize()==sizeof(short)) l = l & 0x0000FFFF;
+
+				//push term
+				compiler.codeGenerator.op_push_V(l);
+			}
+			return true;
+		}
+	}
+
+	if(expression[0]==1 )
 	{
-		//右辺値が数値の定数式の場合
-		_int64 i64data;
-		StaticCalculation(true, expression,baseType.GetBasicType(),&i64data,resultType);
-
-		if( resultType.GetBasicSize() == sizeof(_int64) ){
-			//64ビット（符号有り整数/実数）
-
-			//push HILONG(i64data)
-			compiler.codeGenerator.op_push_V((long)*(long *)(((char *)(&i64data))+4));
-
-			//push LOLONG(i64data)
-			compiler.codeGenerator.op_push_V(*(long *)(&i64data));
-		}
-		else if( resultType.IsSingle() ){
-			//single実数
-
-			double dbl;
-			memcpy(&dbl,&i64data,sizeof(_int64));
-
-			float flt;
-			flt=(float)dbl;
-			long l;
-			memcpy(&l,&flt,sizeof(long));
-
-			//push flt
-			compiler.codeGenerator.op_push_V(l);
-		}
-		else{
-			//整数（符号有り/無し）
-
-			long l = (long)i64data;
-
-			if(resultType.GetBasicSize()==sizeof(char)) l = l & 0x000000FF;
-			if(resultType.GetBasicSize()==sizeof(short)) l = l & 0x0000FFFF;
-
-			//push term
-			compiler.codeGenerator.op_push_V(l);
-		}
-		return true;
-	}
-
-	if(expression[0]==1&& expression[1]==ESC_NEW ){
-		//New演算子（オブジェクト生成）
-
-		if( !Operator_New( expression+2, baseType, resultType ) ){
-			return false;
-		}
-
-		return true;
+		if( expression[1]==ESC_NEW ){
+			//New演算子（オブジェクト生成）
+
+			if( !Operator_New( expression+2, baseType, resultType ) ){
+				return false;
+			}
+
+			return true;
+		}
+		else if( expression[1] == ESC_SYSTEM_STATIC_NEW )
+		{
+			// 静的領域にオブジェクトを作る
+
+			// 静的領域にオブジェクトを生成
+			int dataTableOffset;
+			if( !compiler.GetObjectModule().dataTable.MakeConstObjectToProcessStaticBuffer( expression + 2, resultType, dataTableOffset ) )
+			{
+				return false;
+			}
+
+			// push value
+			compiler.codeGenerator.op_push_V( dataTableOffset, Schedule::DataTable );
+
+			return true;
+		}
 	}
 
@@ -736,9 +719,4 @@
 	//リテラル値のみの計算かどうかを判別するためのフラグ
 	BOOL bLiteralCalculation=1;
-
-	//リテラル演算の場合を考慮した演算前の再配置スケジュール
-	CReloc *pobj_BackReloc;
-	pobj_BackReloc=new CReloc();
-	pobj_BackReloc->copy(pobj_Reloc);
 
 	double dbl;
@@ -819,19 +797,4 @@
 					|| term[0] == '\"' )
 				{
-					if( !baseType.IsPointer() )
-					{
-						//要求タイプがオブジェクト、または未定のとき
-
-						//String型オブジェクトを生成
-						NewStringObject(term);
-
-						type_stack[sp]=DEF_OBJECT;
-						index_stack[sp]=(LONG_PTR)compiler.GetObjectModule().meta.GetClasses().GetStringClassPtr();
-						bLiteralCalculation=0;
-
-						sp++;
-						break;
-					}
-
 					bool isEx = true;
 					if( term[0] == '\"' )
@@ -858,4 +821,22 @@
 						}
 						i3=lstrlen(term);
+					}
+
+					if( !baseType.IsPointer() )
+					{
+						//要求タイプがオブジェクト、または未定のとき
+
+						//String型オブジェクトを生成
+						i2 = compiler.GetObjectModule().dataTable.MakeConstStringObjectToProcessStaticBuffer( term );
+						
+						// push value
+						compiler.codeGenerator.op_push_V( i2, Schedule::DataTable );
+
+						type_stack[sp]=DEF_OBJECT;
+						index_stack[sp]=(LONG_PTR)compiler.GetObjectModule().meta.GetClasses().GetStringClassPtr();
+						bLiteralCalculation=0;
+
+						sp++;
+						break;
 					}
 StrLiteral:
@@ -1200,7 +1181,4 @@
 	}
 
-	//再配置スケジュールバックアップ情報を解放
-	delete pobj_BackReloc;
-
 	return isSuccessful;
 }
