Changeset 131 in dev for BasicCompiler_Common/Class.cpp
- Timestamp:
- Jun 4, 2007, 7:49:17 AM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
BasicCompiler_Common/Class.cpp
r129 r131 102 102 foreach( CMember *member, objClass.staticMembers ){ 103 103 char temporary[VN_SIZE]; 104 sprintf(temporary,"%s.%s",objClass. name,member->name);104 sprintf(temporary,"%s.%s",objClass.GetName().c_str(),member->name); 105 105 dim( 106 106 temporary, … … 151 151 152 152 153 CClass::CClass( const NamespaceScopes &namespaceScopes, const NamespaceScopesCollection &importedNamespaces, const char *name )154 : namespaceScopes( namespaceScopes)153 CClass::CClass( const NamespaceScopes &namespaceScopes, const NamespaceScopesCollection &importedNamespaces, const string &name ) 154 : Prototype( namespaceScopes, name ) 155 155 , importedNamespaces( importedNamespaces ) 156 156 , ConstructorMemberSubIndex( 0 ) … … 168 168 , pobj_NextClass( NULL ) 169 169 { 170 this->name=(char *)HeapAlloc(hHeap,0,lstrlen(name)+1);171 lstrcpy(this->name,name);172 170 } 173 171 CClass::~CClass(){ 174 172 int i; 175 176 //クラス名177 HeapDefaultFree(name);178 173 179 174 if(ppobj_Member){ … … 202 197 } 203 198 199 bool CClass::IsInheritsInterface( const CClass *pInterfaceClass ) const 200 { 201 BOOST_FOREACH( const InheritedInterface &objInterface, interfaces ){ 202 if( pInterfaceClass == &objInterface.GetInterfaceClass() ){ 203 return true; 204 } 205 } 206 return false; 207 } 208 204 209 bool CClass::IsEqualSymbol( const NamespaceScopes &namespaceScopes, const string &name ) const 205 210 { … … 253 258 } 254 259 255 bool CClass::Inherits( const CClass &inheritsClass, int nowLine ){ 260 bool CClass::Inherits( const char *inheritNames, int nowLine ){ 261 int i = 0; 262 bool isInheritsClass = false; 263 while( true ){ 264 265 char temporary[VN_SIZE]; 266 for( int i2=0;; i++, i2++ ){ 267 if( inheritNames[i] == '\0' || inheritNames[i] == ',' ){ 268 temporary[i2] = 0; 269 break; 270 } 271 temporary[i2] = inheritNames[i]; 272 } 273 274 //継承元クラスを取得 275 const CClass *pInheritsClass = pobj_DBClass->Find(temporary); 276 if( !pInheritsClass ){ 277 SetError(106,temporary,i); 278 return false; 279 } 280 281 if( pInheritsClass->IsInterface() ){ 282 // インターフェイスを継承する 283 if( !InheritsInterface( *pInheritsClass, nowLine ) ){ 284 return false; 285 } 286 } 287 else if( pInheritsClass->IsClass() ){ 288 // クラスを継承する 289 isInheritsClass = true; 290 291 if( !InheritsClass( *pInheritsClass, nowLine ) ){ 292 return false; 293 } 294 } 295 else{ 296 SetError(135,NULL,nowLine); 297 return false; 298 } 299 300 if( inheritNames[i] == '\0' ){ 301 break; 302 } 303 i++; 304 } 305 306 if( !isInheritsClass ){ 307 // クラスを一つも継承していないとき 308 const CClass *pObjectClass = pobj_DBClass->Find("Object"); 309 if( !pObjectClass ){ 310 SetError(106,"Object",i); 311 return false; 312 } 313 314 if( !InheritsClass( *pObjectClass, i ) ){ 315 return false; 316 } 317 } 318 319 return true; 320 } 321 bool CClass::InheritsClass( const CClass &inheritsClass, int nowLine ){ 256 322 257 323 //ループ継承でないかをチェック 258 324 if(pobj_LoopRefCheck->check(inheritsClass)){ 259 SetError(123,inheritsClass. name,nowLine);325 SetError(123,inheritsClass.GetName(),nowLine); 260 326 return false; 261 327 } … … 263 329 if( inheritsClass.ppobj_Member == 0 ){ 264 330 //継承先が読み取られていないとき 265 pobj_LoopRefCheck->add(this-> name);266 pobj_DBClass->GetClass_recur(inheritsClass. name);267 pobj_LoopRefCheck->del(this-> name);331 pobj_LoopRefCheck->add(this->GetName().c_str()); 332 pobj_DBClass->GetClass_recur(inheritsClass.GetName().c_str()); 333 pobj_LoopRefCheck->del(this->GetName().c_str()); 268 334 } 269 335 … … 317 383 //ループ継承でないかをチェック 318 384 if(pobj_LoopRefCheck->check(inheritsInterface)){ 319 SetError(123,inheritsInterface. name,nowLine);385 SetError(123,inheritsInterface.GetName(),nowLine); 320 386 return false; 321 387 } … … 323 389 if( inheritsInterface.ppobj_Member == 0 ){ 324 390 //継承先が読み取られていないとき 325 pobj_LoopRefCheck->add(this-> name);326 pobj_DBClass->GetClass_recur(inheritsInterface. name);327 pobj_LoopRefCheck->del(this-> name);391 pobj_LoopRefCheck->add(this->GetName().c_str()); 392 pobj_DBClass->GetClass_recur(inheritsInterface.GetName().c_str()); 393 pobj_LoopRefCheck->del(this->GetName().c_str()); 328 394 } 329 395 … … 348 414 } 349 415 416 interfaces.push_back( InheritedInterface( const_cast<CClass *>(&inheritsInterface), vtbl_num ) ); 417 350 418 //仮想関数の数 351 419 vtbl_num += inheritsInterface.vtbl_num; 352 353 /*354 TODO: インターフェイス向けの機構を作る355 //継承先のクラスをメンバとして保持する356 pobj_InheritsClass = &inheritsInterface;357 */358 420 359 421 return true; … … 404 466 //メンバ 405 467 for( int i=0;i<iMemberNum;i++){ 406 if( lstrcmp(name,ppobj_Member[i]->name)==0){468 if( GetName() == ppobj_Member[i]->name ){ 407 469 return 1; 408 470 } … … 411 473 //静的メンバ 412 474 foreach( CMember *member, staticMembers ){ 413 if( lstrcmp( name, member->name ) == 0){475 if( GetName() == member->name ){ 414 476 return 1; 415 477 } … … 1066 1128 BOOL fConstructor=0,bDestructor=0; 1067 1129 1068 if(lstrcmp(temporary,pobj_c-> name)==0){1130 if(lstrcmp(temporary,pobj_c->GetName().c_str())==0){ 1069 1131 //コンストラクタの場合 1070 1132 … … 1077 1139 else if(temporary[0]=='~'){ 1078 1140 //デストラクタの場合はその名前が正しいかチェックを行う 1079 if(lstrcmp(temporary+1,pobj_c-> name)!=0)1141 if(lstrcmp(temporary+1,pobj_c->GetName().c_str())!=0) 1080 1142 SetError(117,NULL,nowLine); 1081 1143 else … … 1170 1232 if(pobj_LoopRefCheck->check(pMember->GetClass())){ 1171 1233 extern int cp; 1172 SetError(124,pMember->GetClass(). name,cp);1234 SetError(124,pMember->GetClass().GetName(),cp); 1173 1235 return 0; 1174 1236 } 1175 1237 1176 pobj_LoopRefCheck->add(objClass. name);1238 pobj_LoopRefCheck->add(objClass.GetName().c_str()); 1177 1239 1178 1240 i2=MemberVar_LoopRefCheck(pMember->GetClass()); 1179 1241 if(bRet==1) bRet=i2; 1180 1242 1181 pobj_LoopRefCheck->del(objClass. name);1243 pobj_LoopRefCheck->del(objClass.GetName().c_str()); 1182 1244 } 1183 1245 } … … 1243 1305 1244 1306 if(lpszInheritsClass){ 1245 if(lstrcmp(lpszInheritsClass,pobj_c-> name)!=0){1307 if(lstrcmp(lpszInheritsClass,pobj_c->GetName().c_str())!=0){ 1246 1308 //継承先先読み用 1247 1309 continue; … … 1271 1333 } 1272 1334 1273 if(lstrcmpi(temporary,pobj_c-> name)==0){1335 if(lstrcmpi(temporary,pobj_c->GetName().c_str())==0){ 1274 1336 SetError(105,temporary,i); 1275 1337 goto Interface_InheritsError; … … 1284 1346 1285 1347 //継承させる 1286 if( !pobj_c->Inherits Interface( *pInheritsClass, i ) ){1348 if( !pobj_c->InheritsClass( *pInheritsClass, i ) ){ 1287 1349 goto Interface_InheritsError; 1288 1350 } … … 1394 1456 1395 1457 if(lpszInheritsClass){ 1396 if( lstrcmp(lpszInheritsClass,pobj_c->name)!=0){1458 if( pobj_c->GetName() != lpszInheritsClass ){ 1397 1459 //継承先先読み用 1398 1460 continue; … … 1418 1480 else dwAccess=ACCESS_PUBLIC; 1419 1481 1420 if( lstrcmp( pobj_c->name, "Object" ) == 0|| dwClassType == ESC_TYPE ){1421 // 継承無し1422 pobj_c->pobj_InheritsClass =0;1423 1424 // 仮想関数の数を初期化1425 pobj_c->vtbl_num =0;1482 if( pobj_c->GetName() == "Object" || dwClassType == ESC_TYPE ){ 1483 // 継承無し 1484 pobj_c->pobj_InheritsClass = NULL; 1485 1486 // 仮想関数の数を初期化 1487 pobj_c->vtbl_num = 0; 1426 1488 } 1427 1489 else{ … … 1439 1501 } 1440 1502 1441 if(lstrcmpi(temporary,pobj_c-> name)==0){1503 if(lstrcmpi(temporary,pobj_c->GetName().c_str())==0){ 1442 1504 SetError(105,temporary,i); 1443 1505 goto InheritsError; … … 1450 1512 } 1451 1513 1452 //継承元クラスを取得 1453 const CClass *pInheritsClass = Find(temporary); 1454 if( !pInheritsClass ){ 1455 SetError(106,temporary,i); 1456 goto InheritsError; 1457 } 1458 1459 if( pInheritsClass->IsInterface() ){ 1460 // クラスを継承していないとき 1461 const CClass *pObjectClass = Find("Object"); 1462 if( !pObjectClass ){ 1463 SetError(106,"Object",i); 1464 goto InheritsError; 1465 } 1466 1467 if( !pobj_c->Inherits( *pObjectClass, i ) ){ 1468 goto InheritsError; 1469 } 1470 } 1471 1472 //継承させる 1473 if( !pobj_c->Inherits( *pInheritsClass, i ) ){ 1474 goto InheritsError; 1475 } 1514 pobj_c->Inherits( temporary, i ); 1476 1515 } 1477 1516 InheritsError: … … 1596 1635 if(pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->GetClass().ppobj_Member==0){ 1597 1636 //参照先が読み取られていないとき 1598 GetClass_recur(pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->GetClass(). name);1637 GetClass_recur(pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->GetClass().GetName().c_str()); 1599 1638 } 1600 1639 } … … 1603 1642 if(pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->IsStruct()){ 1604 1643 //循環参照のチェック 1605 pobj_LoopRefCheck->add(pobj_c-> name);1644 pobj_LoopRefCheck->add(pobj_c->GetName().c_str()); 1606 1645 if(!MemberVar_LoopRefCheck(pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->GetClass())){ 1607 1646 //エラー回避 1608 1647 pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->SetBasicType( DEF_PTR_VOID ); 1609 1648 } 1610 pobj_LoopRefCheck->del(pobj_c-> name);1649 pobj_LoopRefCheck->del(pobj_c->GetName().c_str()); 1611 1650 } 1612 1651 } … … 1709 1748 , 1 1710 1749 , ESC_NEW 1711 , "" // 名前空間 (TODO: 実装)1712 , objClass. name// クラス名1713 , referenceOffsetsBuffer // 参照メンバオフセット配列1714 , numOfReference // 参照メンバの個数1750 , "" // 名前空間 (TODO: 実装) 1751 , objClass.GetName().c_str() // クラス名 1752 , referenceOffsetsBuffer // 参照メンバオフセット配列 1753 , numOfReference // 参照メンバの個数 1715 1754 ); 1716 1755 … … 1749 1788 sprintf( temporary 1750 1789 , "tempType=Search(\"%s\",\"%s\")" 1751 , "" // 名前空間 (TODO: 実装)1752 , objClass. name// クラス名1790 , "" // 名前空間 (TODO: 実装) 1791 , objClass.GetName().c_str() // クラス名 1753 1792 ); 1754 1793 … … 1759 1798 , "tempType.SetBaseType(Search(\"%s\",\"%s\"))" 1760 1799 , "" // 名前空間 (TODO: 実装) 1761 , objClass.pobj_InheritsClass-> name// 基底クラス名1800 , objClass.pobj_InheritsClass->GetName().c_str() // 基底クラス名 1762 1801 ); 1763 1802
Note:
See TracChangeset
for help on using the changeset viewer.