Changeset 75 in dev for BasicCompiler64/Compile_ProcOp.cpp
- Timestamp:
- Mar 20, 2007, 4:36:16 AM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
BasicCompiler64/Compile_ProcOp.cpp
r73 r75 2 2 #include "Opcode.h" 3 3 4 void SystemProc( char *name){4 void SystemProc( const char *name ){ 5 5 if(lstrcmp(name,"_System_GetEip")==0){ 6 6 //mov rax,qword ptr[rsp] … … 22 22 } 23 23 24 extern BOOL bCompilingGlobal; 25 BOOL bBackCompilingGlobal; 26 bBackCompilingGlobal=bCompilingGlobal; 27 bCompilingGlobal=1; 24 UserProc *pBackUserProc; 25 pBackUserProc = &UserProc::CompilingUserProc(); 26 UserProc::CompileStartForGlobalArea(); 28 27 29 28 int BackCp; … … 56 55 *((long *)(OpBuffer+StackFrameSchedule))=pobj_sf->GetFrameSize(); 57 56 58 bCompilingGlobal=bBackCompilingGlobal;57 UserProc::CompileStartForUserProc( pBackUserProc ); 59 58 cp=BackCp; 60 59 … … 70 69 StackFrameSchedule=obp-sizeof(long); 71 70 72 extern int MaxGlobalVarNum; 73 extern VARIABLE *GlobalVar; 74 int i; 75 for(i=0;i<MaxGlobalVarNum;i++){ 76 if(memicmp(GlobalVar[i].name,"Static%",7)==0){ 71 foreach( Variable *pVar, globalVars ){ 72 if(memicmp(pVar->GetName().c_str(),"Static%",7)==0){ 77 73 //コンストラクタ呼び出し 78 if( GlobalVar[i].type==DEF_OBJECT){74 if( pVar->IsObject() ){ 79 75 80 76 //エラー用 81 cp=GlobalVar[i].source_code_address; 82 83 TYPEINFO TypeInfo; 84 TypeInfo.type=GlobalVar[i].type; 85 TypeInfo.u.lpIndex=GlobalVar[i].u.index; 77 cp=pVar->source_code_address; 78 86 79 CallConstructor( 87 GlobalVar[i].name,88 GlobalVar[i].SubScripts,89 TypeInfo,90 GlobalVar[i].ConstractParameter);80 pVar->GetName().c_str(), 81 pVar->GetSubScriptsPtr(), 82 *pVar, 83 pVar->paramStrForConstructor.c_str()); 91 84 } 92 85 } … … 107 100 108 101 109 extern BOOL bCompilingGlobal; 110 BOOL bBackCompilingGlobal; 111 bBackCompilingGlobal=bCompilingGlobal; 112 bCompilingGlobal=1; 102 UserProc *pBackUserProc; 103 pBackUserProc = &UserProc::CompilingUserProc(); 104 UserProc::CompileStartForGlobalArea(); 113 105 114 106 obj_LexScopes.CallDestructorsOfScopeEnd(); 115 107 116 bCompilingGlobal=bBackCompilingGlobal;108 UserProc::CompileStartForUserProc( pBackUserProc ); 117 109 118 110 … … 204 196 } 205 197 } 206 void CompileBufferInProcedure( SubInfo *psi){198 void CompileBufferInProcedure(UserProc *pUserProc){ 207 199 extern char *basbuf; 208 200 extern HANDLE hHeap; 209 extern SubInfo**ppSubHash;201 extern UserProc **ppSubHash; 210 202 extern BOOL bDebugCompile; 211 int i3,i4, VarSize,BufferSize;203 int i3,i4,BufferSize; 212 204 char temporary[VN_SIZE]; 213 205 214 206 BufferSize=128; 215 207 216 if(psi->bUse==0||psi->bCompile) return; 217 218 219 psi->bCompile=1; 208 if( pUserProc->IsUsing() == false || pUserProc->IsCompiled() ) return; 209 210 pUserProc->CompleteCompile(); 220 211 221 212 extern BOOL bSystemProc; 222 if(memcmp(p si->name,"_System_",8)==0) bSystemProc=1;213 if(memcmp(pUserProc->GetName().c_str(),"_System_",8)==0) bSystemProc=1; 223 214 else bSystemProc=0; 224 215 225 216 extern BOOL bDebugSupportProc; 226 if(memcmp(p si->name,"_DebugSys_",10)==0){217 if(memcmp(pUserProc->GetName().c_str(),"_DebugSys_",10)==0){ 227 218 if(!bDebugCompile){ 228 psi->pVar=(VARIABLE *)HeapAlloc(hHeap,0,1); 229 psi->VarNum=0; 219 pUserProc->localVars.clear(); 230 220 return; 231 221 } … … 234 224 else bDebugSupportProc=0; 235 225 236 p si->CompileAddress=obp;237 238 if(p si->bSystem){226 pUserProc->beginOpAddress=obp; 227 228 if(pUserProc->IsSystem()){ 239 229 //////////////////// 240 230 // 特殊関数 … … 250 240 pobj_sf=new CStackFrame(); 251 241 252 SystemProc(p si->name);242 SystemProc(pUserProc->GetName().c_str()); 253 243 254 244 //スタックフレーム管理用オブジェクトを破棄 … … 256 246 pobj_sf=0; 257 247 258 psi->EndOpAddr=obp; 259 psi->pVar=(VARIABLE *)HeapAlloc(hHeap,0,1); 260 psi->VarNum=0; 248 pUserProc->endOpAddress=obp; 249 pUserProc->localVars.clear(); 261 250 return; 262 251 } 263 252 264 cp=p si->address;253 cp=pUserProc->GetCodePos(); 265 254 for(;;cp++){ 266 255 if(IsCommandDelimitation(basbuf[cp])) break; … … 303 292 304 293 //ローカル変数に関する情報 305 extern VARIABLE *LocalVar;306 extern int MaxLocalVarNum;307 294 extern int AllLocalVarSize; 308 LocalVar=(VARIABLE *)HeapAlloc(hHeap,0,sizeof(VARIABLE));309 MaxLocalVarNum=0;310 295 AllLocalVarSize=0; 296 pUserProc->localVars.clear(); 311 297 312 298 //ローカル変数アドレススケジュール … … 324 310 ///////////////////////////////////// 325 311 326 for(i3=psi->RealParmNum-1;i3>=0;i3--){ 327 //変数データを追加 328 LocalVar=(VARIABLE *)HeapReAlloc(hHeap,0,LocalVar,(MaxLocalVarNum+1)*sizeof(VARIABLE)); 329 330 lstrcpy(LocalVar[MaxLocalVarNum].name,psi->realParams[i3].GetVarName.c_str()); 331 332 // TODO: パラメータのConst定義の指定が未完成 333 LocalVar[MaxLocalVarNum].bConst=false; 334 335 LocalVar[MaxLocalVarNum].bArray=psi->realParams[i3].IsArray()?TRUE:FALSE; 336 memcpy(LocalVar[MaxLocalVarNum].SubScripts,psi->realParams[i3].GetSubScriptsPtr(),MAX_ARRAYDIM*sizeof(int)); 337 338 LocalVar[MaxLocalVarNum].type=psi->realParams[i3].GetBasicType(); 339 if(LocalVar[MaxLocalVarNum].type==DEF_OBJECT 340 ||LocalVar[MaxLocalVarNum].type==DEF_STRUCT){ 341 if(psi->bExport) 342 SetError(24,NULL,cp); 343 } 344 345 LocalVar[MaxLocalVarNum].u.index=psi->realParams[i3].GetIndex(); 346 347 if(psi->realParams[i3].IsRef() == false&&psi->realParams[i3].IsStruct()){ 312 //パラメータ用の変数データを考慮 313 for(i3=(int)pUserProc->RealParams().size()-1;i3>=0;i3--){ 314 Parameter ¶m = *pUserProc->RealParams()[i3]; 315 316 Variable *pVar = new Variable( param.GetVarName(), param, false, param.IsRef() ); 317 318 if( param.IsArray() ){ 319 pVar->SetArray( param.GetSubScriptsPtr() ); 320 } 321 322 int varSize; 323 if( param.IsRef() == false && param.IsStruct() ){ 348 324 //構造体のByValパラメータ 349 LocalVar[MaxLocalVarNum].fRef=REF_PARAMETER | OBJECT_PARAMETER;350 VarSize=PTR_SIZE;325 pVar->ThisIsParameter(); 326 varSize=PTR_SIZE; 351 327 } 352 328 else{ 353 if(psi->realParams[i3].IsRef() == false&&psi->realParams[i3].IsArray()){ 354 LocalVar[MaxLocalVarNum].fRef=0; 355 VarSize=GetTypeSize(LocalVar[MaxLocalVarNum].type,LocalVar[MaxLocalVarNum].u.index); 356 if(VarSize%PTR_SIZE) VarSize+=PTR_SIZE-(VarSize%PTR_SIZE); 329 if( param.IsArray() == false ){ 330 varSize = pVar->GetMemorySize(); 357 331 } 358 332 else{ 359 LocalVar[MaxLocalVarNum].fRef=REF_PARAMETER; 360 VarSize=PTR_SIZE; 361 } 362 } 363 AllLocalVarSize+=VarSize; 364 LocalVar[MaxLocalVarNum].offset=AllLocalVarSize; 333 varSize=PTR_SIZE; 334 } 335 } 336 AllLocalVarSize+=varSize; 337 pVar->offset=AllLocalVarSize; 365 338 366 339 //レキシカルスコープ情報 367 LocalVar[MaxLocalVarNum].ScopeLevel=obj_LexScopes.GetNowLevel();368 LocalVar[MaxLocalVarNum].ScopeStartAddress=obj_LexScopes.GetStartAddress();369 LocalVar[MaxLocalVarNum].bLiving=TRUE;370 371 MaxLocalVarNum++;340 pVar->ScopeLevel=obj_LexScopes.GetNowLevel(); 341 pVar->ScopeStartAddress=obj_LexScopes.GetStartAddress(); 342 pVar->bLiving=TRUE; 343 344 pUserProc->localVars.push_back( pVar ); 372 345 } 373 346 … … 377 350 378 351 //コンパイル中の関数が属するクラス 379 pobj_CompilingClass=p si->pobj_ParentClass;380 352 pobj_CompilingClass=pUserProc->GetParentClassPtr(); 353 381 354 //コンパイルスタートをクラス管理クラスに追加 382 pobj_DBClass->StartCompile( p si);355 pobj_DBClass->StartCompile( pUserProc ); 383 356 384 357 //コンパイル中の関数 385 extern SubInfo *pCompilingSubInfo; 386 pCompilingSubInfo=psi; 358 UserProc::CompileStartForUserProc( pUserProc ); 387 359 388 360 //スタックフレーム管理用クラスを初期化 … … 394 366 // ここからコード生成 395 367 396 for(i3=psi->RealParmNum-1;i3>=0;i3--){ 368 for(i3=(int)pUserProc->RealParams().size()-1;i3>=0;i3--){ 369 Parameter ¶m = *pUserProc->RealParams()[i3]; 397 370 if(i3==3){ 398 if(p si->realParams[i3].IsReal()&&psi->realParams[i3].IsRef() == false){371 if(param.IsReal()&¶m.IsRef() == false){ 399 372 //movsd qword ptr[rsp+0x20],xmm3 400 373 op_movsd_MR(REG_XMM3,REG_RSP,0x20,MOD_BASE_DISP32); … … 406 379 } 407 380 if(i3==2){ 408 if(p si->realParams[i3].IsReal()&&psi->realParams[i3].IsRef() == false){381 if(param.IsReal()&¶m.IsRef() == false){ 409 382 //movsd qword ptr[rsp+0x18],xmm2 410 383 op_movsd_MR(REG_XMM2,REG_RSP,0x18,MOD_BASE_DISP32); … … 416 389 } 417 390 if(i3==1){ 418 if(p si->realParams[i3].IsReal()&&psi->realParams[i3].IsRef() == false){391 if(param.IsReal()&¶m.IsRef() == false){ 419 392 //movsd qword ptr[rsp+0x10],xmm1 420 393 op_movsd_MR(REG_XMM1,REG_RSP,0x10,MOD_BASE_DISP32); … … 426 399 } 427 400 if(i3==0){ 428 if(p si->realParams[i3].IsReal()&&psi->realParams[i3].IsRef() == false){401 if(param.IsReal()&¶m.IsRef() == false){ 429 402 //movsd qword ptr[rsp+0x8],xmm0 430 403 op_movsd_MR(REG_XMM0,REG_RSP,0x8,MOD_BASE_DISP32); … … 458 431 BaseLocalVar=AllLocalVarSize; 459 432 460 if( psi->ReturnType!=DEF_NON){433 if( !pUserProc->ReturnType().IsNull() ){ 461 434 //戻り値が存在するとき 462 435 463 char *temp; 464 if(psi->name[0]==1&&psi->name[1]==ESC_OPERATOR) temp="_System_ReturnValue"; 465 else temp=psi->name; 466 467 if(psi->ReturnType==DEF_STRUCT && psi->isReturnRef == false){ 436 const char *temp = pUserProc->GetName().c_str(); 437 if( temp[0]==1&&temp[1]==ESC_OPERATOR ){ 438 temp = "_System_ReturnValue"; 439 } 440 441 if( pUserProc->ReturnType().IsStruct() ){ 468 442 //戻り値用の構造体(値型)はパラメータで引き渡される 469 443 } 470 444 else{ 471 445 //戻り値用の変数の定義 472 if( psi->isReturnRef ){ 473 sprintf(temporary,"%c%c",1,ESC_BYREF); 474 } 475 else temporary[0]=0; 476 477 sprintf(temporary+lstrlen(temporary),"%s%c%c",temp,1,ESC_AS); 478 GetTypeName(psi->ReturnType,psi->u.ReturnIndex,temporary+lstrlen(temporary)); 446 sprintf(temporary,"%s%c%c%s",temp,1,ESC_AS, pUserProc->ReturnType().ToString().c_str() ); 479 447 480 448 OpcodeDim(temporary,0); … … 497 465 498 466 //call _DebugSys_StartProc 499 extern SubInfo*pSub_DebugSys_StartProc;467 extern UserProc *pSub_DebugSys_StartProc; 500 468 op_call(pSub_DebugSys_StartProc); 501 469 } 502 470 503 471 if(pobj_CompilingClass){ 504 if( lstrcmp(psi->name,pobj_CompilingClass->name)==0){472 if( pUserProc->GetName() == pobj_CompilingClass->name ){ 505 473 //////////////////////////////////// 506 474 // コンストラクタをコンパイルするとき … … 550 518 551 519 Opcode_CallProc(temporary, 552 pobj_CompilingClass->pobj_InheritsClass->GetConstructorMethod()->p si,520 pobj_CompilingClass->pobj_InheritsClass->GetConstructorMethod()->pUserProc, 553 521 0, 554 522 "", … … 558 526 //基底クラスのコンストラクタを暗黙的に呼び出す 559 527 Opcode_CallProc("", 560 pobj_CompilingClass->pobj_InheritsClass->GetConstructorMethod()->p si,528 pobj_CompilingClass->pobj_InheritsClass->GetConstructorMethod()->pUserProc, 561 529 0, 562 530 "", … … 568 536 for(i3=0;i3<pobj_CompilingClass->iMemberNum;i3++){ 569 537 CMember *pMember = pobj_CompilingClass->ppobj_Member[i3]; 570 if(pMember-> TypeInfo.type==DEF_OBJECT){538 if(pMember->IsObject()){ 571 539 // オブジェクトメンバを発見したとき 572 540 … … 574 542 pMember->name, 575 543 1, ESC_NEW, 576 pMember-> TypeInfo.u.pobj_Class->name );544 pMember->GetClass().name ); 577 545 OpcodeCalc( temporary ); 578 546 } … … 598 566 } 599 567 } 600 else if( psi->name[0]=='~'){568 else if( pUserProc->IsDestructor() ){ 601 569 //デストラクタをコンパイルしたとき 602 570 … … 609 577 ////////////////////////////////////////// 610 578 ////// プロシージャ内をコンパイル //////// 611 if(psi->dwType==SUBTYPE_SUB) CompileBuffer(ESC_ENDSUB,0); 612 else if(psi->dwType==SUBTYPE_FUNCTION) CompileBuffer(ESC_ENDFUNCTION,0); 613 else if(psi->dwType==SUBTYPE_MACRO) CompileBuffer(ESC_ENDMACRO,0); 579 if(pUserProc->IsMacro()) CompileBuffer(ESC_ENDMACRO,0); 580 else{ 581 if(pUserProc->IsSub()) CompileBuffer(ESC_ENDSUB,0); 582 else if(pUserProc->IsFunction()) CompileBuffer(ESC_ENDFUNCTION,0); 583 } 614 584 ////////////////////////////////////////// 615 585 ////////////////////////////////////////// … … 623 593 pobj_CompilingClass->NotifyFinishConstructorCompile(); 624 594 } 625 else if( psi->name[0]=='~'){595 else if( pUserProc->IsDestructor() ){ 626 596 //////////////////////////////////// 627 597 //デストラクタをコンパイルしたとき … … 638 608 if( method ){ 639 609 Opcode_CallProc("", 640 method->p si,610 method->pUserProc, 641 611 0, 642 612 "", … … 659 629 int offset = pobj_CompilingClass->GetMemberOffset( pMember->name, NULL ); 660 630 661 if(pMember-> TypeInfo.type==DEF_OBJECT){662 CMethod *method = pMember-> TypeInfo.u.pobj_Class->GetDestructorMethod();631 if(pMember->IsObject()){ 632 CMethod *method = pMember->GetClass().GetDestructorMethod(); 663 633 if( method ){ 664 634 for(i4=MemberObjectNum-1;i4>=0;i4--){ … … 670 640 671 641 //call destructor 672 op_call(method->p si);642 op_call(method->pUserProc); 673 643 } 674 644 } … … 705 675 HeapDefaultFree(WithInfo.pWithCp); 706 676 707 //重複エラー情報管理のメモリを解放708 for(i3=0;i3<SynonymErrorNum;i3++) HeapDefaultFree(SynonymErrorWords[i3]);709 HeapDefaultFree(SynonymErrorWords);710 711 677 //ローカルオブジェクト(レキシカルスコープレベル=0)の解放処理 712 678 obj_LexScopes.CallDestructorsOfScopeEnd(); … … 720 686 if(bDebugCompile&&bDebugSupportProc==0){ 721 687 //call _DebugSys_EndProc 722 extern SubInfo*pSub_DebugSys_EndProc;688 extern UserProc *pSub_DebugSys_EndProc; 723 689 op_call(pSub_DebugSys_EndProc); 724 690 } 725 691 726 if( psi->ReturnType!=DEF_NON){692 if( !pUserProc->ReturnType().IsNull() ){ 727 693 ////////////////////////////////// 728 694 // 戻り値をraxまたはxmm0に設定 … … 730 696 731 697 RELATIVE_VAR RelativeVar; 732 LONG_PTR lpIndex; 733 734 char *temp; 735 if(psi->name[0]==1&&psi->name[1]==ESC_OPERATOR) 698 699 const char *temp = pUserProc->GetName().c_str(); 700 if( temp[0]==1 && temp[1]==ESC_OPERATOR ){ 736 701 temp="_System_ReturnValue"; 737 else temp=psi->name;738 GetVarOffsetReadWrite(temp,& i3,&RelativeVar,&lpIndex);739 740 i3=p si->ReturnType;702 } 703 GetVarOffsetReadWrite(temp,&RelativeVar,Type()); 704 705 i3=pUserProc->ReturnType().GetBasicType(); 741 706 742 707 if(i3==DEF_OBJECT || i3==DEF_STRUCT){ … … 772 737 } 773 738 HeapDefaultFree(pLocalVarAddrSchedule); 774 for (i3=0;i3<MaxLocalVarNum;i3++){739 foreach( Variable *pVar, pUserProc->localVars ){ 775 740 //後にデバッグで利用する 776 LocalVar[i3].offset=AllLocalVarSize+pobj_sf->GetFrameSize()-LocalVar[i3].offset;741 pVar->offset = AllLocalVarSize + pobj_sf->GetFrameSize() - pVar->offset; 777 742 } 778 743 … … 812 777 813 778 814 psi->EndOpAddr=obp; 815 psi->pVar=LocalVar; 816 psi->VarNum=MaxLocalVarNum; 817 818 //ローカル変数のネーム情報は後に解放する 779 pUserProc->endOpAddress=obp; 780 781 782 //重複エラー情報管理のメモリを解放 783 for(i3=0;i3<SynonymErrorNum;i3++) HeapDefaultFree(SynonymErrorWords[i3]); 784 HeapDefaultFree(SynonymErrorWords); 819 785 } 820 786 void CompileLocal(){ 821 extern SubInfo**ppSubHash;787 extern UserProc **ppSubHash; 822 788 int i2; 823 SubInfo *psi;789 UserProc *pUserProc; 824 790 825 791 extern BOOL bDll; 826 792 if(bDll){ 827 793 //DLLの場合はグローバル変数を初期化するための関数を一番初めにコンパイルする 828 p si=GetSubHash("_System_InitDllGlobalVariables");829 if(p si){830 CompileBufferInProcedure(p si);794 pUserProc=GetSubHash("_System_InitDllGlobalVariables"); 795 if(pUserProc){ 796 CompileBufferInProcedure(pUserProc); 831 797 } 832 798 else SetError(300,NULL,cp); … … 835 801 //_System_InitStaticLocalVariablesは一番最後にコンパイル 836 802 //※一般関数内の静的変数オブジェクトをすべて収集しなければならない 837 extern SubInfo*pSub_System_InitStaticLocalVariables;838 pSub_System_InitStaticLocalVariables-> bCompile=1;803 extern UserProc *pSub_System_InitStaticLocalVariables; 804 pSub_System_InitStaticLocalVariables->CompleteCompile(); 839 805 840 806 //_System_Call_Destructor_of_GlobalObjectは一番最後にコンパイル 841 extern SubInfo*pSub_System_Call_Destructor_of_GlobalObject;842 pSub_System_Call_Destructor_of_GlobalObject-> bCompile=1;807 extern UserProc *pSub_System_Call_Destructor_of_GlobalObject; 808 pSub_System_Call_Destructor_of_GlobalObject->CompleteCompile(); 843 809 844 810 Repeat: 845 811 for(i2=0;i2<MAX_HASH;i2++){ 846 p si=ppSubHash[i2];847 while(p si){848 CompileBufferInProcedure(p si);849 p si=psi->pNextData;812 pUserProc=ppSubHash[i2]; 813 while(pUserProc){ 814 CompileBufferInProcedure(pUserProc); 815 pUserProc=pUserProc->pNextData; 850 816 } 851 817 } … … 853 819 //プロシージャコンパイルによって、プロシージャコンパイルが必要になる場合 854 820 for(i2=0;i2<MAX_HASH;i2++){ 855 p si=ppSubHash[i2];856 while(p si){857 if( psi->bUse&&psi->bCompile==0&&psi->bVirtual==0){821 pUserProc=ppSubHash[i2]; 822 while(pUserProc){ 823 if( pUserProc->IsUsing() && pUserProc->IsCompiled() == false ){ 858 824 goto Repeat; 859 825 } 860 826 861 p si=psi->pNextData;827 pUserProc=pUserProc->pNextData; 862 828 } 863 829 } 864 830 865 831 //_System_InitStaticLocalVariablesは一番最後にコンパイル 866 pSub_System_InitStaticLocalVariables-> bCompile=0;832 pSub_System_InitStaticLocalVariables->KillCompileStatus(); 867 833 CompileBufferInProcedure(pSub_System_InitStaticLocalVariables); 868 834 869 835 //_System_Call_Destructor_of_GlobalObjectは一番最後にコンパイル 870 pSub_System_Call_Destructor_of_GlobalObject-> bCompile=0;836 pSub_System_Call_Destructor_of_GlobalObject->KillCompileStatus(); 871 837 CompileBufferInProcedure(pSub_System_Call_Destructor_of_GlobalObject); 872 838 }
Note:
See TracChangeset
for help on using the changeset viewer.