Index: BasicCompiler64/Compile_Object.cpp
===================================================================
--- BasicCompiler64/Compile_Object.cpp	(revision 51)
+++ BasicCompiler64/Compile_Object.cpp	(revision 64)
@@ -2,5 +2,5 @@
 #include "opcode.h"
 
-void _call_constructor(CClass *pobj_c,char *CreateParameter,int ObjectSize,BOOL bSomeObjects){
+void _call_constructor(CClass *pobj_c,const char *CreateParameter,int ObjectSize,BOOL bSomeObjects){
 	////////////////////////////
 	// コンストラクタの呼び出し
@@ -73,18 +73,134 @@
 	}
 }
-int Operator_New(const char *Parameter,LONG_PTR *plpIndex){
-	char TypeName[VN_SIZE],CreateParameter[VN_SIZE],ObjectSize[VN_SIZE];
+void Operator_New( CClass &classObj, const char *objectSizeStr, const char *parameter, const TYPEINFO &baseTypeInfo ){
+	int typeSize = classObj.GetSize();
+
+	if(classObj.IsAbstract()){
+		//抽象クラスだったとき
+		SetError(125,classObj.name,cp);
+	}
+
+	BOOL bSomeObjects=0;
+	if(objectSizeStr[0]){
+		bSomeObjects=1;
+
+		int reg=REG_RAX;
+		int type = NumOpe(&reg,objectSizeStr,0,0,0);
+		if(!IsWholeNumberType(type)) SetError(49,NULL,cp);
+
+		//※添え字上限値であることを考慮
+		//add rax,1
+		op_add_RV(REG_RAX,1);
+
+		//オブジェクトの個数をrbxに一時保持
+		//※rbxは関数が呼ばれても不変
+		//mov rbx,rax
+		op_mov_RR(REG_RBX,REG_RAX);
+
+		//imul rax,size
+		op_imul_RV(sizeof(_int64),REG_RAX,typeSize);
+
+		//add rax,PTR_SIZE*3
+		op_add_RV(REG_RAX,PTR_SIZE*3);
+
+		//mov rcx,rax
+		op_mov_RR(REG_RCX,REG_RAX);
+	}
+	else{
+		//オブジェクトの個数をrbxに一時保持
+		//※rbxは関数が呼ばれても不変
+		//mov rbx,1
+		op_mov_RV(sizeof(_int64),REG_RBX,1);
+
+		//mov rcx,typeSize+PTR_SIZE*3
+		op_mov_RV(sizeof(_int64),REG_RCX,typeSize+PTR_SIZE*3);
+	}
+
+	if( baseTypeInfo.type == DEF_OBJECT ){
+		//DeleteはGCで処理
+
+		//call _System_GC_malloc_ForObject
+		extern SUBINFO *pSub_System_GC_malloc_ForObject;
+		op_call(pSub_System_GC_malloc_ForObject);
+	}
+	else{
+		//明示的なDeleteが必要
+
+		//call _System_GC_malloc_ForObjectPtr
+		extern SUBINFO *pSub_System_GC_malloc_ForObjectPtr;
+		op_call(pSub_System_GC_malloc_ForObjectPtr);
+	}
+
+
+	/*
+	確保されたヒープ領域のポインタ（callocの戻り値eax）をpPtrとすると、
+	pPtr-=sizeof(DWORD)*3
+	pPtr[0]=オブジェクトの個数
+	pPtr[1]=オブジェクトのサイズ
+	pPtr[2]=デストラクタの関数ポインタ
+	*/
+
+
+	//mov qword ptr[rax],rbx（オブジェクトの個数）
+	op_mov_MR(sizeof(_int64),REG_RBX,REG_RAX,0,MOD_BASE);
+
+	//add rax,PTR_SIZE
+	op_add_RV(REG_RAX,PTR_SIZE);
+
+
+	//mov qword ptr[rax],typeSize（オブジェクトのサイズ）
+	op_mov_MV(sizeof(_int64),REG_RAX,0,NON_OFFSET,typeSize);
+
+	//add rax,PTR_SIZE
+	op_add_RV(REG_RAX,PTR_SIZE);
+
+
+	CMethod *method = classObj.GetDestructorMethod();
+	if( method == NULL ) return;
+
+	//mov rcx,DestructorProcAddr
+	op_mov_RV(sizeof(_int64),REG_RCX,0);
+	obp-=sizeof(long);
+	pobj_SubAddrSchedule->add(method->psi,0);
+	method->psi->bUse=1;
+	obp+=sizeof(long);
+
+	//mov qword ptr[rax],rcx
+	op_mov_MR(sizeof(_int64),REG_RCX,REG_RAX,0,MOD_BASE);
+
+	//add rax,PTR_SIZE
+	op_add_RV(REG_RAX,PTR_SIZE);
+
+
+	// ※ここでプッシュされた値はNew演算子の戻り値となる
+	//mov qword ptr[rsp+offset],rax     ※スタックフレームを利用
+	pobj_sf->push(REG_RAX);
+
+
+	/////////////////////////////////////////////////////////////////////
+
+	////////////////////////////
+	// コンストラクタの呼び出し
+	////////////////////////////
+
+	_call_constructor(&classObj,parameter,typeSize,bSomeObjects);
+
+
+	//mov rax,qword ptr[rsp+offset]     ※スタックフレームを利用
+	pobj_sf->pop(REG_RAX);
+}
+int Operator_New(const char *Parameter,LONG_PTR *plpIndex,const TYPEINFO &baseTypeInfo ){
+	char TypeName[VN_SIZE],CreateParameter[VN_SIZE],objectSizeStr[VN_SIZE];
 	int i,i2;
-	int reg;
 
 	i=0;
 
 	if(Parameter[0]=='['){
-		i=GetStringInBracket(ObjectSize,Parameter);
-
-		SlideString(ObjectSize+1,-1);
-		ObjectSize[i-2]=0;
-	}
-	else ObjectSize[0]=0;
+		i=GetStringInBracket(objectSizeStr,Parameter);
+
+		SlideString(objectSizeStr+1,-1);
+		objectSizeStr[i-2]=0;
+	}
+	else objectSizeStr[0]=0;
 
 	for(i2=0;;i++,i2++){
@@ -109,5 +225,5 @@
 	}
 
-	int type,TypeSize;
+	int type;
 	type=GetTypeFixed(TypeName,plpIndex);
 	if(type==-1){
@@ -115,5 +231,4 @@
 		return 0;
 	}
-	TypeSize=GetTypeSize(type,*plpIndex);
 
 	if(type!=DEF_OBJECT){
@@ -129,111 +244,13 @@
 	pobj_c=(CClass *)*plpIndex;
 
-	if(pobj_c->IsAbstract()){
-		//抽象クラスだったとき
-		SetError(125,pobj_c->name,cp);
-	}
-
-	BOOL bSomeObjects=0;
-	if(ObjectSize[0]){
-		bSomeObjects=1;
-
-		reg=REG_RAX;
-		i2=NumOpe(&reg,ObjectSize,0,0,0);
-		if(!IsWholeNumberType(i2)) SetError(49,NULL,cp);
-
-		//※添え字上限値であることを考慮
-		//add rax,1
-		op_add64_value(REG_RAX,1);
-
-		//オブジェクトの個数をrbxに一時保持
-		//※rbxは関数が呼ばれても不変
-		//mov rbx,rax
-		op_mov64_ToReg_FromReg(REG_RBX,REG_RAX);
-
-		//imul rax,size
-		op_imul_value(sizeof(_int64),REG_RAX,TypeSize);
-
-		//add rax,PTR_SIZE*3
-		op_add64_value(REG_RAX,PTR_SIZE*3);
-
-		//mov rcx,rax
-		op_mov64_ToReg_FromReg(REG_RCX,REG_RAX);
-	}
-	else{
-		//オブジェクトの個数をrbxに一時保持
-		//※rbxは関数が呼ばれても不変
-		//mov rbx,1
-		op_mov_RV(sizeof(_int64),REG_RBX,1);
-
-		//mov rcx,TypeSize+PTR_SIZE*3
-		op_mov_RV(sizeof(_int64),REG_RCX,TypeSize+PTR_SIZE*3);
-	}
-
-	//call calloc
-	extern SUBINFO *pSub_calloc;
-	op_call(pSub_calloc);
-
-
-	/*
-	確保されたヒープ領域のポインタ（callocの戻り値eax）をpPtrとすると、
-	pPtr-=sizeof(DWORD)*3
-	pPtr[0]=オブジェクトの個数
-	pPtr[1]=オブジェクトのサイズ
-	pPtr[2]=デストラクタの関数ポインタ
-	*/
-
-
-	//mov qword ptr[rax],rbx（オブジェクトの個数）
-	op_mov_MR(sizeof(_int64),REG_RBX,REG_RAX,0,MOD_BASE);
-
-	//add rax,PTR_SIZE
-	op_add64_value(REG_RAX,PTR_SIZE);
-
-
-	//mov qword ptr[rax],TypeSize（オブジェクトのサイズ）
-	op_mov_MV(sizeof(_int64),REG_RAX,0,NON_OFFSET,TypeSize);
-
-	//add rax,PTR_SIZE
-	op_add64_value(REG_RAX,PTR_SIZE);
-
-
-	CMethod *method = pobj_c->GetDestructorMethod();
-	if( method == NULL ) return 0;
-
-	//mov rcx,DestructorProcAddr
-	op_mov_RV(sizeof(_int64),REG_RCX,0);
-	obp-=sizeof(long);
-	pobj_SubAddrSchedule->add(method->psi,0);
-	method->psi->bUse=1;
-	obp+=sizeof(long);
-
-	//mov qword ptr[rax],rcx
-	op_mov_MR(sizeof(_int64),REG_RCX,REG_RAX,0,MOD_BASE);
-
-	//add rax,PTR_SIZE
-	op_add64_value(REG_RAX,PTR_SIZE);
-
-
-	// ※ここでプッシュされた値はNew演算子の戻り値となる
-	//mov qword ptr[rsp+offset],rax     ※スタックフレームを利用
-	pobj_sf->push(REG_RAX);
-
-
-	/////////////////////////////////////////////////////////////////////
-
-	////////////////////////////
-	// コンストラクタの呼び出し
-	////////////////////////////
-
-	_call_constructor(pobj_c,CreateParameter,TypeSize,bSomeObjects);
-
-
-	//mov rax,qword ptr[rsp+offset]     ※スタックフレームを利用
-	pobj_sf->pop(REG_RAX);
-
+	Operator_New( *pobj_c, objectSizeStr, CreateParameter, baseTypeInfo );
+
+	if( baseTypeInfo.type == DEF_OBJECT ){
+		return DEF_OBJECT;
+	}
 	return DEF_PTR_OBJECT;
 }
 
-void OpcodeDelete(const char *Parameter){
+void OpcodeDelete(const char *Parameter, bool isSweeping){
 	int type;
 
@@ -254,5 +271,5 @@
 
 	//add rax,PTR_SIZE
-	op_add64_value(REG_RAX,PTR_SIZE);
+	op_add_RV(REG_RAX,PTR_SIZE);
 
 
@@ -261,5 +278,5 @@
 
 	//add rax,PTR_SIZE
-	op_add64_value(REG_RAX,PTR_SIZE);
+	op_add_RV(REG_RAX,PTR_SIZE);
 
 
@@ -268,9 +285,9 @@
 
 	//add rax,PTR_SIZE
-	op_add64_value(REG_RAX,PTR_SIZE);
+	op_add_RV(REG_RAX,PTR_SIZE);
 
 
 	//mov rcx,rax
-	op_mov64_ToReg_FromReg(REG_RCX,REG_RAX);
+	op_mov_RR(REG_RCX,REG_RAX);
 
 
@@ -279,6 +296,6 @@
 	jnz_back=obp;
 
-	//mov qword ptr[rsp+offset],rax     ※スタックフレームを利用
-	pobj_sf->push(REG_RAX);
+	//mov qword ptr[rsp+offset],rcx     ※スタックフレームを利用
+	pobj_sf->push(REG_RCX);
 
 	//call rdi
@@ -309,6 +326,13 @@
 	pobj_sf->pop(REG_RCX);
 
-	//call free
-	extern SUBINFO *pSub_free;
-	op_call(pSub_free);
+	if( isSweeping ){
+		//call _System_GC_free_for_SweepingDelete
+		extern SUBINFO *pSub_System_GC_free_for_SweepingDelete;
+		op_call(pSub_System_GC_free_for_SweepingDelete);
+	}
+	else{
+		//call free
+		extern SUBINFO *pSub_free;
+		op_call(pSub_free);
+	}
 }
