Changeset 75 in dev for BasicCompiler32/Compile_ProcOp.cpp
- Timestamp:
- Mar 20, 2007, 4:36:16 AM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
BasicCompiler32/Compile_ProcOp.cpp
r73 r75 3 3 4 4 5 void SystemProc( char *name){5 void SystemProc( const char *name ){ 6 6 if(lstrcmp(name,"_System_GetEip")==0){ 7 7 //mov eax,dword ptr[esp] … … 69 69 cp=GlobalVar[i].source_code_address; 70 70 71 T YPEINFOTypeInfo;71 Type TypeInfo; 72 72 TypeInfo.type=GlobalVar[i].type; 73 73 TypeInfo.u.lpIndex=GlobalVar[i].u.index; … … 214 214 } 215 215 216 void CompileBufferInProcedure( SubInfo *psi){216 void CompileBufferInProcedure(UserProc *pUserProc){ 217 217 extern char *basbuf; 218 218 extern HANDLE hHeap; 219 extern SubInfo**ppSubHash;219 extern UserProc **ppSubHash; 220 220 extern BOOL bDebugCompile; 221 221 int i3,i4,VarSize,LocalVarSchedule,EspOffsetSchedule,BufferSize,BaseOffset; … … 224 224 BufferSize=128; 225 225 226 if( psi->bUse==0||psi->bCompile) return;227 228 p si->bCompile=1;226 if( pUserProc->IsUsing() == false || pUserProc->IsCompiled() ) return; 227 228 pUserProc->CompleteCompile(); 229 229 230 230 extern BOOL bSystemProc; 231 if(memcmp(p si->name,"_System_",8)==0) bSystemProc=1;231 if(memcmp(pUserProc->GetName().c_str(),"_System_",8)==0) bSystemProc=1; 232 232 else bSystemProc=0; 233 233 234 234 extern BOOL bDebugSupportProc; 235 if(memcmp(p si->name,"_DebugSys_",10)==0){235 if(memcmp(pUserProc->GetName().c_str(),"_DebugSys_",10)==0){ 236 236 if(!bDebugCompile){ 237 p si->pVar=(VARIABLE *)HeapAlloc(hHeap,0,1);238 p si->VarNum=0;237 pUserProc->pVar=(VARIABLE *)HeapAlloc(hHeap,0,1); 238 pUserProc->VarNum=0; 239 239 return; 240 240 } … … 243 243 else bDebugSupportProc=0; 244 244 245 p si->CompileAddress=obp;246 247 if(p si->bSystem){245 pUserProc->beginOpAddress=obp; 246 247 if(pUserProc->IsSystem()){ 248 248 extern int MaxLocalVarNum; 249 249 extern int AllLocalVarSize; … … 251 251 AllLocalVarSize=0; 252 252 253 SystemProc(p si->name);254 255 p si->EndOpAddr=obp;256 p si->pVar=(VARIABLE *)HeapAlloc(hHeap,0,1);257 p si->VarNum=0;253 SystemProc(pUserProc->GetName().c_str()); 254 255 pUserProc->endOpAddress=obp; 256 pUserProc->pVar=(VARIABLE *)HeapAlloc(hHeap,0,1); 257 pUserProc->VarNum=0; 258 258 return; 259 259 } 260 260 261 cp=p si->address;261 cp=pUserProc->GetCodePos(); 262 262 for(;;cp++){ 263 263 if(IsCommandDelimitation(basbuf[cp])) break; … … 280 280 281 281 //パラメータ用の変数データを考慮 282 for(i3= psi->realParams.size()-1;i3>=0;i3--){283 Parameter ¶m = *p si->realParams[i3];282 for(i3=(int)pUserProc->RealParams().size()-1;i3>=0;i3--){ 283 Parameter ¶m = *pUserProc->RealParams()[i3]; 284 284 285 285 //変数データを追加 … … 297 297 if(LocalVar[MaxLocalVarNum].type==DEF_OBJECT 298 298 ||LocalVar[MaxLocalVarNum].type==DEF_STRUCT){ 299 if(p si->bExport)299 if(pUserProc->IsExport()) 300 300 SetError(24,NULL,cp); 301 301 } … … 340 340 341 341 //コンパイル中の関数が属するクラス 342 pobj_CompilingClass=p si->pobj_ParentClass;342 pobj_CompilingClass=pUserProc->GetParentClassPtr(); 343 343 344 344 //コンパイルスタートをクラス管理クラスに追加 345 pobj_DBClass->StartCompile( p si);345 pobj_DBClass->StartCompile( pUserProc ); 346 346 347 347 //コンパイル中の関数 348 extern SubInfo *pCompilingSubInfo;349 pCompiling SubInfo=psi;348 extern UserProc *pCompilingUserProc; 349 pCompilingUserProc=pUserProc; 350 350 351 351 … … 373 373 OpBuffer[obp++]=(char)0x57; 374 374 375 if( psi->ReturnType!=DEF_NON){375 if( !pUserProc->ReturnType().IsNull() ){ 376 376 //戻り値が存在するとき 377 377 378 char *temp; 379 if(psi->name[0]==1&&psi->name[1]==ESC_OPERATOR) temp="_System_ReturnValue"; 380 else temp=psi->name; 381 382 if(psi->ReturnType==DEF_STRUCT && psi->isReturnRef == false){ 378 const char *temp = pUserProc->GetName().c_str(); 379 if( temp[0]==1&&temp[1]==ESC_OPERATOR ){ 380 temp = "_System_ReturnValue"; 381 } 382 383 if( pUserProc->ReturnType().IsStruct() ){ 383 384 //戻り値用の構造体(値型)はパラメータで引き渡される 384 385 } 385 386 else{ 386 387 //戻り値用の変数の定義 387 if( psi->isReturnRef ){ 388 sprintf(temporary,"%c%c",1,ESC_BYREF); 389 } 390 else temporary[0]=0; 391 392 sprintf(temporary+lstrlen(temporary),"%s%c%c",temp,1,ESC_AS); 393 GetTypeName(psi->ReturnType,psi->u.ReturnIndex,temporary+lstrlen(temporary)); 388 sprintf(temporary,"%s%c%c%s",temp,1,ESC_AS, pUserProc->ReturnType().ToString().c_str() ); 394 389 395 390 OpcodeDim(temporary,0); … … 444 439 445 440 //call _DebugSys_StartProc 446 extern SubInfo*pSub_DebugSys_StartProc;441 extern UserProc *pSub_DebugSys_StartProc; 447 442 op_call(pSub_DebugSys_StartProc); 448 443 } 449 444 450 445 if(pobj_CompilingClass){ 451 if( lstrcmp(psi->name,pobj_CompilingClass->name)==0){446 if( pUserProc->GetName() == pobj_CompilingClass->name ){ 452 447 //////////////////////////////////// 453 448 // コンストラクタをコンパイルするとき … … 497 492 498 493 Opcode_CallProc(temporary, 499 pobj_CompilingClass->pobj_InheritsClass->GetConstructorMethod()->p si,494 pobj_CompilingClass->pobj_InheritsClass->GetConstructorMethod()->pUserProc, 500 495 0, 501 496 "", … … 505 500 //基底クラスのコンストラクタを暗黙的に呼び出す 506 501 Opcode_CallProc("", 507 pobj_CompilingClass->pobj_InheritsClass->GetConstructorMethod()->p si,502 pobj_CompilingClass->pobj_InheritsClass->GetConstructorMethod()->pUserProc, 508 503 0, 509 504 "", … … 548 543 } 549 544 } 550 else if( psi->name[0]=='~'){545 else if( pUserProc->IsDestructor() ){ 551 546 //デストラクタをコンパイルしたとき 552 547 … … 559 554 ////////////////////////////////////////// 560 555 ////// プロシージャ内をコンパイル //////// 561 if(psi->dwType==SUBTYPE_SUB) CompileBuffer(ESC_ENDSUB,0); 562 else if(psi->dwType==SUBTYPE_FUNCTION) CompileBuffer(ESC_ENDFUNCTION,0); 563 else if(psi->dwType==SUBTYPE_MACRO) CompileBuffer(ESC_ENDMACRO,0); 556 if(pUserProc->IsMacro()) CompileBuffer(ESC_ENDMACRO,0); 557 else{ 558 if(pUserProc->IsSub()) CompileBuffer(ESC_ENDSUB,0); 559 else if(pUserProc->IsFunction()) CompileBuffer(ESC_ENDFUNCTION,0); 560 } 564 561 ////////////////////////////////////////// 565 562 ////////////////////////////////////////// … … 573 570 pobj_CompilingClass->NotifyFinishConstructorCompile(); 574 571 } 575 else if( psi->name[0]=='~'){572 else if( pUserProc->IsDestructor() ){ 576 573 //////////////////////////////////// 577 574 //デストラクタをコンパイルしたとき … … 588 585 if( method ){ 589 586 Opcode_CallProc("", 590 method->p si,587 method->pUserProc, 591 588 0, 592 589 "", … … 631 628 632 629 //call destructor 633 op_call( method->p si);630 op_call( method->pUserProc ); 634 631 } 635 632 } … … 666 663 HeapDefaultFree(WithInfo.pWithCp); 667 664 668 //重複エラー情報管理のメモリを解放669 for(i3=0;i3<SynonymErrorNum;i3++) HeapDefaultFree(SynonymErrorWords[i3]);670 HeapDefaultFree(SynonymErrorWords);671 672 665 //push ebp 673 666 AllLocalVarSize+=sizeof(long); … … 686 679 687 680 //call _DebugSys_EndProc 688 extern SubInfo*pSub_DebugSys_EndProc;681 extern UserProc *pSub_DebugSys_EndProc; 689 682 op_call(pSub_DebugSys_EndProc); 690 683 } 691 684 692 if( psi->ReturnType!=DEF_NON){685 if( !pUserProc->ReturnType().IsNull() ){ 693 686 //戻り値をeax、edxに設定 694 687 RELATIVE_VAR RelativeVar; 695 688 LONG_PTR lpIndex; 696 689 697 c har *temp;698 if( psi->name[0]==1&&psi->name[1]==ESC_OPERATOR)690 const char *temp = pUserProc->GetName().c_str(); 691 if( temp[0]==1 && temp[1]==ESC_OPERATOR ){ 699 692 temp="_System_ReturnValue"; 700 else temp=psi->name;693 } 701 694 GetVarOffsetReadWrite(temp,&i3,&RelativeVar,&lpIndex); 702 695 703 i3=p si->ReturnType;696 i3=pUserProc->ReturnType().GetBasicType(); 704 697 705 698 if(i3==DEF_OBJECT || i3==DEF_STRUCT){ … … 808 801 809 802 //call _esp_error 810 extern SubInfo*pSub_esp_error;803 extern UserProc *pSub_esp_error; 811 804 op_call( pSub_esp_error ); 812 805 … … 824 817 op_add_esp(AllLocalVarSize-BaseOffset); 825 818 826 if( BaseOffset==0||psi->bCdecl){819 if( BaseOffset==0 || pUserProc->IsCdecl() ){ 827 820 //ret 0 828 821 OpBuffer[obp++]=(char)0xC3; … … 835 828 } 836 829 837 psi->EndOpAddr=obp; 838 psi->pVar=LocalVar; 839 psi->VarNum=MaxLocalVarNum; 830 pUserProc->endOpAddress=obp; 831 pUserProc->pVar=LocalVar; 832 pUserProc->VarNum=MaxLocalVarNum; 833 834 835 //重複エラー情報管理のメモリを解放 836 for(i3=0;i3<SynonymErrorNum;i3++) HeapDefaultFree(SynonymErrorWords[i3]); 837 HeapDefaultFree(SynonymErrorWords); 838 SynonymErrorWords=0; 839 840 840 841 841 //ローカル変数のネーム情報は後に解放する 842 842 } 843 843 void CompileLocal(){ 844 extern SubInfo**ppSubHash;844 extern UserProc **ppSubHash; 845 845 int i2; 846 SubInfo *psi;846 UserProc *pUserProc; 847 847 848 848 extern BOOL bDll; 849 849 if(bDll){ 850 850 //DLLの場合はグローバル変数を初期化するための関数を一番初めにコンパイルする 851 p si=GetSubHash("_System_InitDllGlobalVariables");852 if(p si){853 CompileBufferInProcedure(p si);851 pUserProc=GetSubHash("_System_InitDllGlobalVariables"); 852 if(pUserProc){ 853 CompileBufferInProcedure(pUserProc); 854 854 } 855 855 else SetError(300,NULL,cp); … … 858 858 //_System_InitStaticLocalVariablesは一番最後にコンパイル 859 859 //※一般関数内の静的変数オブジェクトをすべて収集しなければならない 860 extern SubInfo*pSub_System_InitStaticLocalVariables;861 pSub_System_InitStaticLocalVariables-> bCompile=1;860 extern UserProc *pSub_System_InitStaticLocalVariables; 861 pSub_System_InitStaticLocalVariables->CompleteCompile(); 862 862 863 863 //_System_Call_Destructor_of_GlobalObjectは一番最後にコンパイル 864 extern SubInfo*pSub_System_Call_Destructor_of_GlobalObject;865 pSub_System_Call_Destructor_of_GlobalObject-> bCompile=1;864 extern UserProc *pSub_System_Call_Destructor_of_GlobalObject; 865 pSub_System_Call_Destructor_of_GlobalObject->CompleteCompile(); 866 866 867 867 Repeat: 868 868 for(i2=0;i2<MAX_HASH;i2++){ 869 p si=ppSubHash[i2];870 while(p si){871 CompileBufferInProcedure(p si);872 p si=psi->pNextData;869 pUserProc=ppSubHash[i2]; 870 while(pUserProc){ 871 CompileBufferInProcedure(pUserProc); 872 pUserProc=pUserProc->pNextData; 873 873 } 874 874 } … … 876 876 //プロシージャコンパイルによって、プロシージャコンパイルが必要になる場合 877 877 for(i2=0;i2<MAX_HASH;i2++){ 878 p si=ppSubHash[i2];879 while(p si){880 if( psi->bUse&&psi->bCompile==0){878 pUserProc=ppSubHash[i2]; 879 while(pUserProc){ 880 if( pUserProc->IsUsing() && pUserProc->IsCompiled() == false ){ 881 881 goto Repeat; 882 882 } 883 883 884 p si=psi->pNextData;884 pUserProc=pUserProc->pNextData; 885 885 } 886 886 } 887 887 888 888 //_System_InitStaticLocalVariablesは一番最後にコンパイル 889 pSub_System_InitStaticLocalVariables-> bCompile=0;889 pSub_System_InitStaticLocalVariables->KillCompileStatus(); 890 890 CompileBufferInProcedure(pSub_System_InitStaticLocalVariables); 891 891 892 892 //_System_Call_Destructor_of_GlobalObjectは一番最後にコンパイル 893 pSub_System_Call_Destructor_of_GlobalObject-> bCompile=0;893 pSub_System_Call_Destructor_of_GlobalObject->KillCompileStatus(); 894 894 CompileBufferInProcedure(pSub_System_Call_Destructor_of_GlobalObject); 895 895 }
Note:
See TracChangeset
for help on using the changeset viewer.