Changeset 89 in dev
- Timestamp:
- Apr 4, 2007, 2:03:09 AM (18 years ago)
- Files:
-
- 1 deleted
- 15 edited
Legend:
- Unmodified
- Added
- Removed
-
BasicCompiler32/BasicCompiler.vcproj
r88 r89 605 605 <File 606 606 RelativePath="..\BasicCompiler_Common\Overload.cpp" 607 >608 <FileConfiguration609 Name="Debug|Win32"610 >611 <Tool612 Name="VCCLCompilerTool"613 PreprocessorDefinitions=""614 />615 </FileConfiguration>616 <FileConfiguration617 Name="Release|Win32"618 >619 <Tool620 Name="VCCLCompilerTool"621 PreprocessorDefinitions=""622 />623 </FileConfiguration>624 <FileConfiguration625 Name="English_Rel|Win32"626 >627 <Tool628 Name="VCCLCompilerTool"629 PreprocessorDefinitions=""630 />631 </FileConfiguration>632 </File>633 <File634 RelativePath="..\BasicCompiler_Common\preprocessor.cpp"635 607 > 636 608 <FileConfiguration -
BasicCompiler32/Compile_ProcOp.cpp
r86 r89 204 204 obp+=31; 205 205 } 206 else if( userProc.GetName() == "InitializeUserTypes" ){ 206 else if( userProc.GetName() == "InitializeUserTypes" 207 && userProc.HasParentClass() 208 && (string)userProc.GetParentClass().name == "_System_TypeBase" ){ 209 210 pobj_DBClass->Compile_System_InitializeUserTypes(); 207 211 } 208 212 else{ … … 243 247 pUserProc->beginOpAddress=obp; 244 248 249 //コンパイル中の関数が属するクラス 250 pobj_CompilingClass=pUserProc->GetParentClassPtr(); 251 252 //コンパイルスタートをクラス管理クラスに追加 253 pobj_DBClass->StartCompile( pUserProc ); 254 255 //コンパイル中の関数 256 UserProc::CompileStartForUserProc( pUserProc ); 257 245 258 if(pUserProc->IsSystem()){ 259 //////////////////// 260 // 特殊関数 261 //////////////////// 262 246 263 extern int AllLocalVarSize; 247 264 AllLocalVarSize=0; … … 313 330 AllLocalVarSize+=sizeof(long); 314 331 315 //コンパイル中の関数が属するクラス316 pobj_CompilingClass=pUserProc->GetParentClassPtr();317 318 //コンパイルスタートをクラス管理クラスに追加319 pobj_DBClass->StartCompile( pUserProc );320 321 //コンパイル中の関数322 UserProc::CompileStartForUserProc( pUserProc );323 324 332 325 333 /////////////////////// … … 358 366 } 359 367 else{ 360 //戻り値用の変数の定義 361 sprintf(temporary,"%s%c%c%s",temp,1,ESC_AS, pUserProc->ReturnType().ToString().c_str() ); 368 if( pUserProc->ReturnType().IsObject() ){ 369 sprintf(temporary,"%s=Nothing%c%c%s",temp,1,ESC_AS, pUserProc->ReturnType().ToString().c_str() ); 370 } 371 else{ 372 //戻り値用の変数の定義 373 sprintf(temporary,"%s%c%c%s",temp,1,ESC_AS, pUserProc->ReturnType().ToString().c_str() ); 374 } 362 375 363 376 OpcodeDim(temporary,0); … … 464 477 RemoveStringPare(temporary); 465 478 466 Opcode_CallProc(temporary, 467 pobj_CompilingClass->pobj_InheritsClass->GetConstructorMethod()->pUserProc, 468 0, 469 "", 470 0); 479 Type dummyType; 480 CallProc( PROC_DEFAULT 481 , pobj_CompilingClass->pobj_InheritsClass->GetConstructorMethod()->pUserProc 482 , pobj_CompilingClass->pobj_InheritsClass->GetConstructorMethod()->pUserProc->GetName().c_str() 483 , temporary 484 , dummyType ); 471 485 } 472 486 else{ -
BasicCompiler32/Compile_Var.cpp
r79 r89 1219 1219 } 1220 1220 1221 /* 1222 TODO: 消す 1223 変数は抽象クラスでもOK 1221 1224 if( type.IsObject() ){ 1222 1225 if( type.GetClass().IsAbstract() ){ … … 1225 1228 } 1226 1229 } 1230 */ 1227 1231 } 1228 1232 -
BasicCompiler64/BasicCompiler.vcproj
r88 r89 1321 1321 </File> 1322 1322 <File 1323 RelativePath="..\BasicCompiler_Common\preprocessor.cpp"1324 >1325 </File>1326 <File1327 1323 RelativePath="..\BasicCompiler_Common\RSrcSection.cpp" 1328 1324 > -
BasicCompiler64/Compile_ProcOp.cpp
r86 r89 195 195 obp+=31; 196 196 } 197 else if( userProc.GetName() == "InitializeUserTypes" ){ 197 else if( userProc.GetName() == "InitializeUserTypes" 198 && userProc.HasParentClass() 199 && (string)userProc.GetParentClass().name == "_System_TypeBase" ){ 200 201 pobj_DBClass->Compile_System_InitializeUserTypes(); 198 202 } 199 203 else{ … … 233 237 pUserProc->beginOpAddress=obp; 234 238 239 //コンパイル中の関数が属するクラス 240 pobj_CompilingClass=pUserProc->GetParentClassPtr(); 241 242 //コンパイルスタートをクラス管理クラスに追加 243 pobj_DBClass->StartCompile( pUserProc ); 244 245 //コンパイル中の関数 246 UserProc::CompileStartForUserProc( pUserProc ); 247 235 248 if(pUserProc->IsSystem()){ 236 249 //////////////////// … … 351 364 extern int LocalVar_ThisPtrOffset; 352 365 LocalVar_ThisPtrOffset=AllLocalVarSize; 353 354 //コンパイル中の関数が属するクラス355 pobj_CompilingClass=pUserProc->GetParentClassPtr();356 357 //コンパイルスタートをクラス管理クラスに追加358 pobj_DBClass->StartCompile( pUserProc );359 360 //コンパイル中の関数361 UserProc::CompileStartForUserProc( pUserProc );362 366 363 367 //スタックフレーム管理用クラスを初期化 … … 446 450 } 447 451 else{ 448 //戻り値用の変数の定義 449 sprintf(temporary,"%s%c%c%s",temp,1,ESC_AS, pUserProc->ReturnType().ToString().c_str() ); 452 if( pUserProc->ReturnType().IsObject() ){ 453 sprintf(temporary,"%s=Nothing%c%c%s",temp,1,ESC_AS, pUserProc->ReturnType().ToString().c_str() ); 454 } 455 else{ 456 //戻り値用の変数の定義 457 sprintf(temporary,"%s%c%c%s",temp,1,ESC_AS, pUserProc->ReturnType().ToString().c_str() ); 458 } 450 459 451 460 OpcodeDim(temporary,0); … … 520 529 RemoveStringPare(temporary); 521 530 522 Opcode_CallProc(temporary, 523 pobj_CompilingClass->pobj_InheritsClass->GetConstructorMethod()->pUserProc, 524 0, 525 "", 526 0); 531 Type dummyType; 532 CallProc( PROC_DEFAULT 533 , pobj_CompilingClass->pobj_InheritsClass->GetConstructorMethod()->pUserProc 534 , pobj_CompilingClass->pobj_InheritsClass->GetConstructorMethod()->pUserProc->GetName().c_str() 535 , temporary 536 , dummyType ); 527 537 } 528 538 else{ -
BasicCompiler64/Compile_Var.cpp
r79 r89 1207 1207 } 1208 1208 1209 /* 1210 TODO: 消す 1211 変数は抽象クラスでもOK 1209 1212 if( type.IsObject() ){ 1210 1213 if( type.GetClass().IsAbstract() ){ … … 1213 1216 } 1214 1217 } 1218 */ 1215 1219 } 1216 1220 void SetVarPtrToReg(int reg,RELATIVE_VAR *pRelativeVar){ -
BasicCompiler64/MakePeHdr.cpp
r88 r89 157 157 //クラス情報を取得(※注 - GetSubInfoの後に呼び出す) 158 158 pobj_DBClass->GetAllClassInfo(); 159 160 // 実行時型情報の確定コード(InitializeUserTypesメソッドの実装コード)を生成161 pobj_DBClass->GenerateRuntimeTypeInfo();162 159 163 160 //コードと行番号の関係 -
BasicCompiler_Common/Class.cpp
r87 r89 117 117 118 118 //ネイティブコードバッファの再確保 119 extern int obp_AllocSize; 120 if(obp_AllocSize<obp+8192){ 121 obp_AllocSize+=8192; 122 OpBuffer=(char *)HeapReAlloc(hHeap,0,OpBuffer,obp_AllocSize); //matea 123 } 119 ReallocNativeCodeBuffer(); 120 124 121 i++; 125 122 } … … 198 195 199 196 void CClass::Inherits( CClass *pInheritsClass ){ 200 int i3;201 197 202 198 //メンバをコピー … … 207 203 pInheritsClass->iMemberNum*sizeof(CMember *)); 208 204 iMemberNum=pInheritsClass->iMemberNum; 209 for(i 3=0;i3<pInheritsClass->iMemberNum;i3++){205 for(int i3=0;i3<pInheritsClass->iMemberNum;i3++){ 210 206 ppobj_Member[i3]=new CMember( *pInheritsClass->ppobj_Member[i3] ); 211 207 … … 315 311 { 316 312 for( int i=(int)methods.size()-1; i>=0; i-- ){ 317 if( pUserProc == methods[i]->pUserProc ) return methods[i]; 313 if( pUserProc == methods[i]->pUserProc ){ 314 return methods[i]; 315 } 318 316 } 319 317 return NULL; … … 1350 1348 1351 1349 1352 if(pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->IsObject()|| 1353 pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->IsStruct()){ 1350 if(pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->IsStruct()){ 1354 1351 if(pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->GetClass().ppobj_Member==0){ 1355 1352 //参照先が読み取られていないとき … … 1359 1356 1360 1357 1361 if(pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->Is Object()){1358 if(pobj_c->ppobj_Member[pobj_c->iMemberNum-1]->IsStruct()){ 1362 1359 //循環参照のチェック 1363 1360 pobj_LoopRefCheck->add(pobj_c->name); … … 1422 1419 delete pobj_LoopRefCheck; 1423 1420 pobj_LoopRefCheck=0; 1424 } 1425 1426 void CDBClass::GenerateRuntimeTypeInfo(){ 1421 1422 // イテレータ用のデータを作る 1423 pobj_DBClass->Iterator_Init(); 1424 } 1425 1426 void CDBClass::Compile_System_InitializeUserTypes(){ 1427 1428 //////////////////////////////////////////////////////////////////// 1429 // クラス登録 1430 //////////////////////////////////////////////////////////////////// 1431 1432 // イテレータをリセット 1433 Iterator_Reset(); 1434 1435 while( Iterator_HasNext() ){ 1436 CClass *pClass = Iterator_GetNext(); 1437 1438 char temporary[VN_SIZE]; 1439 sprintf( temporary 1440 , "Add(%c%c_System_TypeForClass(\"%s\",\"%s\"))" 1441 , 1 1442 , ESC_NEW 1443 , "" // 名前空間 (TODO: 実装) 1444 , pClass->name // クラス名 1445 ); 1446 1447 // コンパイル 1448 ChangeOpcode( temporary ); 1449 1450 // ネイティブコードバッファの再確保 1451 ReallocNativeCodeBuffer(); 1452 } 1453 1454 1455 //////////////////////////////////////////////////////////////////// 1456 // 継承関係登録 1457 //////////////////////////////////////////////////////////////////// 1458 // TODO: 未完成 1459 /* 1460 1461 // イテレータをリセット 1462 Iterator_Reset(); 1463 1464 while( Iterator_HasNext() ){ 1465 CClass *pClass = Iterator_GetNext(); 1466 1467 sprintf( genBuffer + length 1468 , "obj.Search( \"%s\" ).SetBaseType( Search( \"%s\" ) ):" 1469 , "" // クラス名 1470 , pClass->name // クラス名 1471 ); 1472 length += lstrlen( genBuffer + length ); 1473 1474 while( length + 8192 > max ){ 1475 max += 8192; 1476 genBuffer = (char *)realloc( genBuffer, max ); 1477 } 1478 }*/ 1427 1479 } 1428 1480 … … 1475 1527 ////////////////////// 1476 1528 1477 void CDBClass::Iterator_ Reset(void){1529 void CDBClass::Iterator_Init(void){ 1478 1530 if(ppobj_IteClass) HeapDefaultFree(ppobj_IteClass); 1479 1531 … … 1498 1550 } 1499 1551 } 1552 void CDBClass::Iterator_Reset(void){ 1553 iIteNextNum = 0; 1554 } 1500 1555 BOOL CDBClass::Iterator_HasNext(void){ 1501 1556 if(iIteNextNum<iIteMaxNum) return 1; -
BasicCompiler_Common/Class.h
r87 r89 217 217 void GetClass_recur(const char *lpszInheritsClass); 218 218 void GetAllClassInfo(void); 219 void GenerateRuntimeTypeInfo();219 void Compile_System_InitializeUserTypes(); 220 220 221 221 … … 252 252 int iIteNextNum; 253 253 public: 254 void Iterator_Init(void); 254 255 void Iterator_Reset(void); 255 256 BOOL Iterator_HasNext(void); -
BasicCompiler_Common/Compile.cpp
r78 r89 7 7 #endif 8 8 9 int obp,obp_AllocSize;10 int GlobalOpBufferSize;11 char *OpBuffer;12 13 9 //ラベルアドレス 14 10 LABEL *pLabelNames; … … 36 32 //With情報 37 33 WITHINFO WithInfo; 34 35 36 int obp,obp_AllocSize; 37 int GlobalOpBufferSize; 38 char *OpBuffer; 39 void ReallocNativeCodeBuffer(){ 40 if(obp_AllocSize<obp+8192){ 41 obp_AllocSize+=8192; 42 OpBuffer=(char *)HeapReAlloc(hHeap,0,OpBuffer,obp_AllocSize); //matea 43 } 44 } 38 45 39 46 … … 428 435 OpcodeDim(Command+2,0); 429 436 430 if(obp_AllocSize<obp+8192){ 431 obp_AllocSize+=8192; 432 OpBuffer=(char *)HeapReAlloc(hHeap,0,OpBuffer,obp_AllocSize); 433 } 437 // ネイティブコードバッファの再確保 438 ReallocNativeCodeBuffer(); 434 439 435 440 if(basbuf[cp]=='\0') break; -
BasicCompiler_Common/Object.cpp
r75 r89 64 64 65 65 //ネイティブコードバッファの再確保 66 extern int obp_AllocSize; 67 if(obp_AllocSize<obp+8192){ 68 obp_AllocSize+=8192; 69 OpBuffer=(char *)HeapReAlloc(hHeap,0,OpBuffer,obp_AllocSize); //matea 70 } 66 ReallocNativeCodeBuffer(); 71 67 } 72 68 } -
BasicCompiler_Common/Procedure.h
r78 r89 155 155 return *pParentClass; 156 156 } 157 bool HasParentClass() const 158 { 159 return ( pParentClass != NULL ); 160 } 157 161 void SetMethod( CMethod *pMethod ){ 158 162 this->pMethod = pMethod; -
BasicCompiler_Common/common.h
r88 r89 496 496 497 497 //Compile.cpp 498 void ReallocNativeCodeBuffer(); 498 499 void GetIdentifierToken( char *token, const char *source, int &pos ); 499 500 int JumpStatement(const char *source, int &pos); -
BasicCompiler_Common/include/Source.h
r88 r89 29 29 class BasicSource : public Text 30 30 { 31 static const string generateDirectiveName; 32 31 33 void Realloc( int newLength ){ 32 34 buffer = (char *)realloc( buffer, newLength + 255 ); -
BasicCompiler_Common/src/Source.cpp
r88 r89 4 4 #include <windows.h> 5 5 6 7 const string BasicSource::generateDirectiveName = "#generate"; 6 8 7 9 … … 409 411 410 412 void BasicSource::ChangeReturnLineChar(){ 413 int i,i2; 414 411 415 #ifdef _DEBUG 412 416 //改行コードの整合性チェック 413 for( i nt i=0; ; i++ ){417 for( i=0; ; i++ ){ 414 418 if( buffer[i] == '\0' ){ 415 419 break; … … 433 437 434 438 //改行コードのCRLFをLFに変換 435 int i,i2;436 439 for(i=0,i2=0;;i++,i2++){ 437 440 if(buffer[i]=='\r'&&buffer[i+1]=='\n') i++; … … 551 554 if(i>LastFileByte[layer]){ 552 555 HeapDefaultFree(LayerDir[layer]); 556 LayerDir[layer]=0; 553 557 layer--; 554 558 } … … 842 846 } 843 847 844 bool BasicSource::Generate( const string &genName, const char *buffer ){ 845 return true; 848 bool BasicSource::Generate( const string &genName, const char *genBuffer ){ 849 const int genBufferLength = lstrlen( genBuffer ); 850 851 #ifdef _DEBUG 852 // 挿入ソースに改行コードが含まれていないかを検査する 853 for( int i=0; genBuffer[i] ; i++ ){ 854 if( genBuffer[i] == '\n' ){ 855 SetError(); 856 break; 857 } 858 } 859 #endif 860 861 bool isFound = false; 862 863 for( int i=0; ; i++ ){ 864 if( i == 0 || buffer[i] == '\n' ){ 865 if( buffer[i] == '\n' ){ 866 i++; 867 } 868 while( IsBlank( buffer[i] ) ){ 869 i++; 870 } 871 872 int startIndex = i; 873 874 if( memicmp( buffer + i, generateDirectiveName.c_str(), generateDirectiveName.size() ) == 0 ){ 875 i += (int)generateDirectiveName.size(); 876 while( IsBlank( buffer[i] ) ){ 877 i++; 878 } 879 880 char temporary[VN_SIZE]; 881 for( int i2=0; ; i++, i2++ ){ 882 if( buffer[i] == '\n' ){ 883 temporary[i2] = 0; 884 break; 885 } 886 temporary[i2] = buffer[i]; 887 } 888 if( genName == temporary ){ 889 // 一致 890 891 int endIndex = i; 892 893 int lengthOffset = genBufferLength - ( endIndex - startIndex ); 894 895 Realloc( length + lengthOffset ); 896 SlideString( buffer + endIndex, lengthOffset ); 897 memcpy( buffer + startIndex, genBuffer, genBufferLength ); 898 899 isFound = true; 900 901 break; 902 } 903 } 904 } 905 } 906 907 return isFound; 846 908 } 847 909
Note:
See TracChangeset
for help on using the changeset viewer.