Index: trunk/abdev/BasicCompiler_Common/src/Class.cpp
===================================================================
--- trunk/abdev/BasicCompiler_Common/src/Class.cpp	(revision 407)
+++ trunk/abdev/BasicCompiler_Common/src/Class.cpp	(revision 409)
@@ -246,25 +246,4 @@
 		//継承先が読み取られていないとき
 		compiler.GetObjectModule().meta.GetClasses().LookaheadClass(inheritsClass.GetName().c_str());
-	}
-
-	//メンバをコピー
-	BOOST_FOREACH( CMember *inheritsClassDynamicMember, inheritsClass.GetDynamicMembers() ){
-		CMember *pMember = new CMember( *inheritsClassDynamicMember );
-
-		// アクセシビリティ
-		if( inheritsClassDynamicMember->IsPrivate() ){
-			pMember->SetAccessibility( Prototype::None );
-		}
-		else{
-			pMember->SetAccessibility( inheritsClassDynamicMember->GetAccessibility() );
-		}
-
-		// メンバのみ、型パラメータを解決する（メソッドのほうは呼び出し時に解決する）
-		if( pMember->GetType().IsTypeParameter() )
-		{
-			pMember->ResetType( actualTypeParameters[pMember->GetType().GetFormalTypeIndex()] );
-		}
-
-		dynamicMembers.push_back( pMember );
 	}
 
@@ -592,5 +571,6 @@
 }
 
-bool CClass::DupliCheckAll(const char *name){
+bool CClass::DupliCheckAll(const char *name) const
+{
 	//重複チェック
 
@@ -607,11 +587,23 @@
 	return 0;
 }
-bool CClass::DupliCheckMember(const char *name){
+bool CClass::DupliCheckMember(const char *name) const
+{
 	//重複チェック
 
+	if( this->HasSuperClass() )
+	{
+		if( this->GetSuperClass().DupliCheckMember( name ) )
+		{
+			// 基底クラスで重複が発見された
+			return true;
+		}
+	}
+
 	// 動的メンバ
-	BOOST_FOREACH( CMember *pMember, dynamicMembers ){
-		if( GetName() == pMember->GetName() ){
-			return 1;
+	BOOST_FOREACH( CMember *pMember, dynamicMembers )
+	{
+		if( GetName() == pMember->GetName() )
+		{
+			return true;
 		}
 	}
@@ -620,9 +612,31 @@
 	BOOST_FOREACH( CMember *pMember, staticMembers ){
 		if( GetName() == pMember->GetName() ){
-			return 1;
-		}
-	}
-
-	return 0;
+			return true;
+		}
+	}
+
+	return false;
+}
+
+const CMember *CClass::FindDynamicMember( const char *memberName ) const
+{
+	if( this->HasSuperClass() )
+	{
+		// 基底クラスで検索
+		const CMember *result = this->GetSuperClass().FindDynamicMember( memberName );
+		if( result )
+		{
+			return result;
+		}
+	}
+
+	BOOST_FOREACH( CMember *pMember, GetDynamicMembers() )
+	{
+		if( pMember->GetName() == memberName )
+		{
+			return pMember;
+		}
+	}
+	return NULL;
 }
 
@@ -679,53 +693,188 @@
 int CClass::GetSize() const
 {
-	return GetMemberOffset( NULL, NULL );
+	int resultSize = 0;
+
+	int alignment = 1;
+	if( this->IsStructure() )
+	{
+		// 構造体のとき
+
+		if( this->GetFixedAlignment() )
+		{
+			// アラインメントの固定値が指定されていた場合はそれを取得
+			alignment = this->GetFixedAlignment();
+		}
+	}
+	else
+	{
+		// それ以外
+
+		if( this->HasSuperClass() )
+		{
+			// 基底クラスのサイズを追加
+			resultSize += this->GetSuperClass().GetSize();
+
+			// 基底クラスのアラインメントを取得
+			alignment = this->GetSuperClass().GetAlignment();
+		}
+		else
+		{
+			// 基底クラスが存在しないとき
+
+			// 仮想関数が存在する場合はvtbl及びvtblMasterListへのポインタのサイズを追加
+			resultSize += IsExistVirtualFunctions() ? PTR_SIZE*2 : 0;
+		}
+	}
+
+	BOOST_FOREACH( CMember *pMember, dynamicMembers )
+	{
+		// メンバサイズ
+		int tempMemberSize = pMember->GetType().GetSize();
+
+		// 一時アラインメントを算出
+		int tempAlignment = tempMemberSize;
+		if( pMember->GetType().IsStruct() )
+		{
+			// メンバが構造体の場合は、メンバのアラインメントを取得
+			tempAlignment = pMember->GetType().GetClass().GetAlignment();
+		}
+
+		// アラインメントを考慮してパディングを追加
+		if( GetFixedAlignment() && alignment < tempAlignment )
+		{
+			if( resultSize % alignment )
+			{
+				resultSize += alignment - ( resultSize % alignment );
+			}
+		}
+		else
+		{
+			if( alignment < tempAlignment )
+			{
+				// 最大アラインメントを更新
+				alignment = tempAlignment;
+			}
+
+			if( tempMemberSize == 0 )
+			{
+				if( !pMember->GetType().IsStruct() )
+				{
+					SetError();
+				}
+
+				//メンバを持たない構造体
+				//※何もしない（オフセットの計算をしない）
+			}
+			else{
+				if( resultSize % tempAlignment )
+				{
+					resultSize += tempAlignment - ( resultSize % tempAlignment );
+				}
+			}
+		}
+
+		// メンバサイズを加算（配列を考慮）
+		resultSize += tempMemberSize * Variable::GetSubScriptCounts( pMember->GetSubscripts() );
+	}
+
+	if( alignment )
+	{
+		// 末尾アラインメントを考慮してパディングを追加
+		if( resultSize % alignment )
+		{
+			resultSize += alignment - ( resultSize % alignment );
+		}
+	}
+
+	return resultSize;
 }
 
 //メンバのオフセットを取得
-int CClass::GetMemberOffset( const char *memberName, int *pMemberNum ) const
-{
-	int i2;
-
-	//仮想関数が存在する場合はvtbl及びvtblMasterListへのポインタのサイズを追加
-	int offset = IsExistVirtualFunctions() ? PTR_SIZE*2 : 0;
+int CClass::GetMemberOffset( const char *memberName ) const
+{
+	int resultSize = 0;
 
 	int alignment = 1;
-	if( GetFixedAlignment() )
-	{
-		alignment = GetFixedAlignment();
-	}
-
-	int iMaxAlign=0;
-	int i = -1;
-	BOOST_FOREACH( CMember *pMember, dynamicMembers ){
-		i++;
-
-		i2 = pMember->GetType().GetSize();
-
-		//アラインメントを算出
-		int member_size;
-		if( pMember->GetType().IsStruct() ){
-			//メンバクラスのアラインメントを取得
-			member_size=pMember->GetType().GetClass().GetAlignment();
-		}
-		else{
-			//メンバサイズを取得
-			member_size=i2;
-		}
-		if(iMaxAlign<member_size) iMaxAlign=member_size;
-
-		//アラインメントを考慮
-		if(GetFixedAlignment()&&GetFixedAlignment()<member_size){
-			if(offset%alignment) offset+=alignment-(offset%alignment);
-		}
-		else{
-			if(alignment<member_size) alignment=member_size;
-
-			if(member_size==0){
-				//メンバを持たないクラス
+	if( this->IsStructure() )
+	{
+		// 構造体のとき
+
+		if( this->GetFixedAlignment() )
+		{
+			// アラインメントの固定値が指定されていた場合はそれを取得
+			alignment = this->GetFixedAlignment();
+		}
+	}
+	else
+	{
+		// それ以外
+
+		if( this->HasSuperClass() )
+		{
+			if( this->GetSuperClass().HasDynamicMember( memberName ) )
+			{
+				// 基底クラスのメンバを取得
+				return this->GetSuperClass().GetMemberOffset( memberName );
+			}
+
+			// 基底クラスのサイズを追加
+			resultSize += this->GetSuperClass().GetSize();
+
+			// 基底クラスのアラインメントを取得
+			alignment = this->GetSuperClass().GetAlignment();
+		}
+		else
+		{
+			// 基底クラスが存在しないとき
+
+			// 仮想関数が存在する場合はvtbl及びvtblMasterListへのポインタのサイズを追加
+			resultSize += IsExistVirtualFunctions() ? PTR_SIZE*2 : 0;
+		}
+	}
+
+	BOOST_FOREACH( CMember *pMember, dynamicMembers )
+	{
+		// メンバサイズ
+		int tempMemberSize = pMember->GetType().GetSize();
+
+		// 一時アラインメントを算出
+		int tempAlignment = tempMemberSize;
+		if( pMember->GetType().IsStruct() )
+		{
+			// メンバが構造体の場合は、メンバのアラインメントを取得
+			tempAlignment = pMember->GetType().GetClass().GetAlignment();
+		}
+
+		// アラインメントを考慮してパディングを追加
+		if( GetFixedAlignment() && alignment < tempAlignment )
+		{
+			if( resultSize % alignment )
+			{
+				resultSize += alignment - ( resultSize % alignment );
+			}
+		}
+		else
+		{
+			if( alignment < tempAlignment )
+			{
+				// 最大アラインメントを更新
+				alignment = tempAlignment;
+			}
+
+			if( tempMemberSize == 0 )
+			{
+				if( !pMember->GetType().IsStruct() )
+				{
+					SetError();
+				}
+
+				//メンバを持たない構造体
 				//※何もしない（オフセットの計算をしない）
 			}
 			else{
-				if(offset%member_size) offset+=member_size-(offset%member_size);
+				if( resultSize % tempAlignment )
+				{
+					resultSize += tempAlignment - ( resultSize % tempAlignment );
+				}
 			}
 		}
@@ -733,50 +882,71 @@
 		if(memberName){
 			//メンバ指定がある場合は、オフセットを返す
-			if( pMember->GetName() == memberName ){
-				if(pMemberNum) *pMemberNum=i;
-				return offset;
-			}
-		}
-
-		//配列を考慮したメンバサイズを取得
-		member_size = i2 * Variable::GetSubScriptCounts( pMember->GetSubscripts() );
-
-		//メンバサイズを加算
-		offset+= member_size;
-	}
-
-	if(iMaxAlign<alignment) alignment=iMaxAlign;
-
-	//アラインメントを考慮
-	if(alignment){
-		if(offset%alignment) offset+=alignment-(offset%alignment);
-	}
-
-	if(pMemberNum) *pMemberNum=i;
-	return offset;
+			if( pMember->GetName() == memberName )
+			{
+				return resultSize;
+			}
+		}
+
+		// メンバサイズを加算（配列を考慮）
+		resultSize += tempMemberSize * Variable::GetSubScriptCounts( pMember->GetSubscripts() );
+	}
+
+	if( alignment )
+	{
+		// 末尾アラインメントを考慮してパディングを追加
+		if( resultSize % alignment )
+		{
+			resultSize += alignment - ( resultSize % alignment );
+		}
+	}
+
+	return resultSize;
 }
 int CClass::GetAlignment() const
 {
-	//仮想関数が存在する場合は関数リストへのポインタのサイズを追加
-	int alignment = IsExistVirtualFunctions() ? PTR_SIZE : 0;
-
-	BOOST_FOREACH( CMember *pMember, dynamicMembers ){
-		int member_size;
-		if(pMember->GetType().IsStruct()){
-			//メンバクラスのアラインメントを取得
-			member_size=pMember->GetType().GetClass().GetAlignment();
-		}
-		else{
-			//メンバサイズを取得
-			member_size = pMember->GetType().GetSize();
-		}
-
-		//アラインメントをセット
-		if(alignment<member_size) alignment=member_size;
-	}
-
-	if(alignment==0) return 0;
-
-	if(GetFixedAlignment()) alignment=GetFixedAlignment();
+	int alignment = 1;
+	if( this->IsStructure() )
+	{
+		// 構造体のとき
+
+		if( this->GetFixedAlignment() )
+		{
+			// アラインメントの固定値が指定されていた場合はそれを取得
+			return this->GetFixedAlignment();
+		}
+	}
+	else
+	{
+		// それ以外
+
+		if( this->HasSuperClass() )
+		{
+			// 基底クラスのアラインメントを取得
+			alignment = this->GetSuperClass().GetAlignment();
+		}
+		else
+		{
+			// 基底クラスが存在しないとき
+
+			// 仮想関数が存在する場合はvtbl及びvtblMasterListへのポインタのサイズを追加
+			alignment = PTR_SIZE;
+		}
+	}
+
+	BOOST_FOREACH( CMember *pMember, dynamicMembers )
+	{
+		int tempAlignment = pMember->GetType().GetSize();
+		if( pMember->GetType().IsStruct() )
+		{
+			// メンバが構造体の場合は、メンバのアラインメントを取得
+			tempAlignment = pMember->GetType().GetClass().GetAlignment();
+		}
+
+		if( alignment < tempAlignment )
+		{
+			// 最大アラインメントを更新
+			alignment = tempAlignment;
+		}
+	}
 
 	return alignment;
@@ -1187,5 +1357,5 @@
 		}
 
-		if( objClass.HasSuperClass() ){
+		if( objClass.HasSuperClass() || objClass.GetDynamicMembers().size() ){
 			sprintf( temporary
 				, "tempType=Search(\"%s\")"
@@ -1196,22 +1366,27 @@
 			ChangeOpcode( temporary );
 
-			sprintf( temporary
-				, "tempType.SetBaseType(Search(\"%s\"))"
-				, objClass.GetSuperClass().GetFullName().c_str()
-			);
-
-			// コンパイル
-			ChangeOpcode( temporary );
-
-
-			// メンバの型を示すTypeInfoオブジェクトへのDataOffset配列の静的データ定義文字列を取得
-			sprintf(
-				temporary,
-				"tempType.SetMembers([%s],[%s],%d)",
-				objClass.GetStaticDefiningStringAsMemberNames().c_str(),
-				objClass.GetStaticDefiningStringAsMemberTypeInfoNames().c_str(),
-				objClass.GetDynamicMembers().size()
-			);
-			ChangeOpcode( temporary );
+			if( objClass.HasSuperClass() )
+			{
+				sprintf( temporary
+					, "tempType.SetBaseType(Search(\"%s\"))"
+					, objClass.GetSuperClass().GetFullName().c_str()
+				);
+
+				// コンパイル
+				ChangeOpcode( temporary );
+			}
+
+			if( objClass.GetDynamicMembers().size() )
+			{
+				// メンバの型を示すTypeInfoオブジェクトへのDataOffset配列の静的データ定義文字列を取得
+				sprintf(
+					temporary,
+					"tempType.SetMembers([%s],[%s],%d)",
+					objClass.GetStaticDefiningStringAsMemberNames().c_str(),
+					objClass.GetStaticDefiningStringAsMemberTypeInfoNames().c_str(),
+					objClass.GetDynamicMembers().size()
+				);
+				ChangeOpcode( temporary );
+			}
 		}
 	}
