Changeset 75 in dev for BasicCompiler32/Compile_ProcOp.cpp


Ignore:
Timestamp:
Mar 20, 2007, 4:36:16 AM (17 years ago)
Author:
dai_9181
Message:

TYPEINFO→Typeへのリファクタリングを実施。64bitはほぼ完了。32bitが全般的に未完成。

File:
1 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler32/Compile_ProcOp.cpp

    r73 r75  
    33
    44
    5 void SystemProc(char *name){
     5void SystemProc( const char *name ){
    66    if(lstrcmp(name,"_System_GetEip")==0){
    77        //mov eax,dword ptr[esp]
     
    6969                    cp=GlobalVar[i].source_code_address;
    7070
    71                     TYPEINFO TypeInfo;
     71                    Type TypeInfo;
    7272                    TypeInfo.type=GlobalVar[i].type;
    7373                    TypeInfo.u.lpIndex=GlobalVar[i].u.index;
     
    214214}
    215215
    216 void CompileBufferInProcedure(SubInfo *psi){
     216void CompileBufferInProcedure(UserProc *pUserProc){
    217217    extern char *basbuf;
    218218    extern HANDLE hHeap;
    219     extern SubInfo **ppSubHash;
     219    extern UserProc **ppSubHash;
    220220    extern BOOL bDebugCompile;
    221221    int i3,i4,VarSize,LocalVarSchedule,EspOffsetSchedule,BufferSize,BaseOffset;
     
    224224    BufferSize=128;
    225225
    226     if(psi->bUse==0||psi->bCompile) return;
    227 
    228     psi->bCompile=1;
     226    if( pUserProc->IsUsing() == false || pUserProc->IsCompiled() ) return;
     227
     228    pUserProc->CompleteCompile();
    229229
    230230    extern BOOL bSystemProc;
    231     if(memcmp(psi->name,"_System_",8)==0) bSystemProc=1;
     231    if(memcmp(pUserProc->GetName().c_str(),"_System_",8)==0) bSystemProc=1;
    232232    else bSystemProc=0;
    233233
    234234    extern BOOL bDebugSupportProc;
    235     if(memcmp(psi->name,"_DebugSys_",10)==0){
     235    if(memcmp(pUserProc->GetName().c_str(),"_DebugSys_",10)==0){
    236236        if(!bDebugCompile){
    237             psi->pVar=(VARIABLE *)HeapAlloc(hHeap,0,1);
    238             psi->VarNum=0;
     237            pUserProc->pVar=(VARIABLE *)HeapAlloc(hHeap,0,1);
     238            pUserProc->VarNum=0;
    239239            return;
    240240        }
     
    243243    else bDebugSupportProc=0;
    244244
    245     psi->CompileAddress=obp;
    246 
    247     if(psi->bSystem){
     245    pUserProc->beginOpAddress=obp;
     246
     247    if(pUserProc->IsSystem()){
    248248        extern int MaxLocalVarNum;
    249249        extern int AllLocalVarSize;
     
    251251        AllLocalVarSize=0;
    252252
    253         SystemProc(psi->name);
    254 
    255         psi->EndOpAddr=obp;
    256         psi->pVar=(VARIABLE *)HeapAlloc(hHeap,0,1);
    257         psi->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;
    258258        return;
    259259    }
    260260
    261     cp=psi->address;
     261    cp=pUserProc->GetCodePos();
    262262    for(;;cp++){
    263263        if(IsCommandDelimitation(basbuf[cp])) break;
     
    280280
    281281    //パラメータ用の変数データを考慮
    282     for(i3=psi->realParams.size()-1;i3>=0;i3--){
    283         Parameter &param = *psi->realParams[i3];
     282    for(i3=(int)pUserProc->RealParams().size()-1;i3>=0;i3--){
     283        Parameter &param = *pUserProc->RealParams()[i3];
    284284
    285285        //変数データを追加
     
    297297        if(LocalVar[MaxLocalVarNum].type==DEF_OBJECT
    298298            ||LocalVar[MaxLocalVarNum].type==DEF_STRUCT){
    299                 if(psi->bExport)
     299                if(pUserProc->IsExport())
    300300                    SetError(24,NULL,cp);
    301301        }
     
    340340
    341341    //コンパイル中の関数が属するクラス
    342     pobj_CompilingClass=psi->pobj_ParentClass;
     342    pobj_CompilingClass=pUserProc->GetParentClassPtr();
    343343
    344344    //コンパイルスタートをクラス管理クラスに追加
    345     pobj_DBClass->StartCompile( psi );
     345    pobj_DBClass->StartCompile( pUserProc );
    346346
    347347    //コンパイル中の関数
    348     extern SubInfo *pCompilingSubInfo;
    349     pCompilingSubInfo=psi;
     348    extern UserProc *pCompilingUserProc;
     349    pCompilingUserProc=pUserProc;
    350350
    351351
     
    373373    OpBuffer[obp++]=(char)0x57;
    374374
    375     if(psi->ReturnType!=DEF_NON){
     375    if( !pUserProc->ReturnType().IsNull() ){
    376376        //戻り値が存在するとき
    377377
    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() ){
    383384            //戻り値用の構造体(値型)はパラメータで引き渡される
    384385        }
    385386        else{
    386387            //戻り値用の変数の定義
    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() );
    394389
    395390            OpcodeDim(temporary,0);
     
    444439
    445440        //call _DebugSys_StartProc
    446         extern SubInfo *pSub_DebugSys_StartProc;
     441        extern UserProc *pSub_DebugSys_StartProc;
    447442        op_call(pSub_DebugSys_StartProc);
    448443    }
    449444
    450445    if(pobj_CompilingClass){
    451         if(lstrcmp(psi->name,pobj_CompilingClass->name)==0){
     446        if( pUserProc->GetName() == pobj_CompilingClass->name ){
    452447            ////////////////////////////////////
    453448            // コンストラクタをコンパイルするとき
     
    497492
    498493                    Opcode_CallProc(temporary,
    499                         pobj_CompilingClass->pobj_InheritsClass->GetConstructorMethod()->psi,
     494                        pobj_CompilingClass->pobj_InheritsClass->GetConstructorMethod()->pUserProc,
    500495                        0,
    501496                        "",
     
    505500                    //基底クラスのコンストラクタを暗黙的に呼び出す
    506501                    Opcode_CallProc("",
    507                         pobj_CompilingClass->pobj_InheritsClass->GetConstructorMethod()->psi,
     502                        pobj_CompilingClass->pobj_InheritsClass->GetConstructorMethod()->pUserProc,
    508503                        0,
    509504                        "",
     
    548543            }
    549544        }
    550         else if(psi->name[0]=='~'){
     545        else if( pUserProc->IsDestructor() ){
    551546            //デストラクタをコンパイルしたとき
    552547
     
    559554    //////////////////////////////////////////
    560555    ////// プロシージャ内をコンパイル ////////
    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    }
    564561    //////////////////////////////////////////
    565562    //////////////////////////////////////////
     
    573570            pobj_CompilingClass->NotifyFinishConstructorCompile();
    574571        }
    575         else if(psi->name[0]=='~'){
     572        else if( pUserProc->IsDestructor() ){
    576573            ////////////////////////////////////
    577574            //デストラクタをコンパイルしたとき
     
    588585                if( method ){
    589586                    Opcode_CallProc("",
    590                         method->psi,
     587                        method->pUserProc,
    591588                        0,
    592589                        "",
     
    631628
    632629                            //call destructor
    633                             op_call( method->psi );
     630                            op_call( method->pUserProc );
    634631                        }
    635632                    }
     
    666663    HeapDefaultFree(WithInfo.pWithCp);
    667664
    668     //重複エラー情報管理のメモリを解放
    669     for(i3=0;i3<SynonymErrorNum;i3++) HeapDefaultFree(SynonymErrorWords[i3]);
    670     HeapDefaultFree(SynonymErrorWords);
    671 
    672665    //push ebp
    673666    AllLocalVarSize+=sizeof(long);
     
    686679
    687680        //call _DebugSys_EndProc
    688         extern SubInfo *pSub_DebugSys_EndProc;
     681        extern UserProc *pSub_DebugSys_EndProc;
    689682        op_call(pSub_DebugSys_EndProc);
    690683    }
    691684
    692     if(psi->ReturnType!=DEF_NON){
     685    if( !pUserProc->ReturnType().IsNull() ){
    693686        //戻り値をeax、edxに設定
    694687        RELATIVE_VAR RelativeVar;
    695688        LONG_PTR lpIndex;
    696689
    697         char *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 ){
    699692            temp="_System_ReturnValue";
    700         else temp=psi->name;
     693        }
    701694        GetVarOffsetReadWrite(temp,&i3,&RelativeVar,&lpIndex);
    702695
    703         i3=psi->ReturnType;
     696        i3=pUserProc->ReturnType().GetBasicType();
    704697
    705698        if(i3==DEF_OBJECT || i3==DEF_STRUCT){
     
    808801
    809802        //call _esp_error
    810         extern SubInfo *pSub_esp_error;
     803        extern UserProc *pSub_esp_error;
    811804        op_call( pSub_esp_error );
    812805
     
    824817    op_add_esp(AllLocalVarSize-BaseOffset);
    825818
    826     if(BaseOffset==0||psi->bCdecl){
     819    if( BaseOffset==0 || pUserProc->IsCdecl() ){
    827820        //ret 0
    828821        OpBuffer[obp++]=(char)0xC3;
     
    835828    }
    836829
    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
    840840
    841841    //ローカル変数のネーム情報は後に解放する
    842842}
    843843void CompileLocal(){
    844     extern SubInfo **ppSubHash;
     844    extern UserProc **ppSubHash;
    845845    int i2;
    846     SubInfo *psi;
     846    UserProc *pUserProc;
    847847
    848848    extern BOOL bDll;
    849849    if(bDll){
    850850        //DLLの場合はグローバル変数を初期化するための関数を一番初めにコンパイルする
    851         psi=GetSubHash("_System_InitDllGlobalVariables");
    852         if(psi){
    853             CompileBufferInProcedure(psi);
     851        pUserProc=GetSubHash("_System_InitDllGlobalVariables");
     852        if(pUserProc){
     853            CompileBufferInProcedure(pUserProc);
    854854        }
    855855        else SetError(300,NULL,cp);
     
    858858    //_System_InitStaticLocalVariablesは一番最後にコンパイル
    859859    //※一般関数内の静的変数オブジェクトをすべて収集しなければならない
    860     extern SubInfo *pSub_System_InitStaticLocalVariables;
    861     pSub_System_InitStaticLocalVariables->bCompile=1;
     860    extern UserProc *pSub_System_InitStaticLocalVariables;
     861    pSub_System_InitStaticLocalVariables->CompleteCompile();
    862862
    863863    //_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();
    866866
    867867Repeat:
    868868    for(i2=0;i2<MAX_HASH;i2++){
    869         psi=ppSubHash[i2];
    870         while(psi){
    871             CompileBufferInProcedure(psi);
    872             psi=psi->pNextData;
     869        pUserProc=ppSubHash[i2];
     870        while(pUserProc){
     871            CompileBufferInProcedure(pUserProc);
     872            pUserProc=pUserProc->pNextData;
    873873        }
    874874    }
     
    876876    //プロシージャコンパイルによって、プロシージャコンパイルが必要になる場合
    877877    for(i2=0;i2<MAX_HASH;i2++){
    878         psi=ppSubHash[i2];
    879         while(psi){
    880             if(psi->bUse&&psi->bCompile==0){
     878        pUserProc=ppSubHash[i2];
     879        while(pUserProc){
     880            if( pUserProc->IsUsing() && pUserProc->IsCompiled() == false ){
    881881                goto Repeat;
    882882            }
    883883
    884             psi=psi->pNextData;
     884            pUserProc=pUserProc->pNextData;
    885885        }
    886886    }
    887887
    888888    //_System_InitStaticLocalVariablesは一番最後にコンパイル
    889     pSub_System_InitStaticLocalVariables->bCompile=0;
     889    pSub_System_InitStaticLocalVariables->KillCompileStatus();
    890890    CompileBufferInProcedure(pSub_System_InitStaticLocalVariables);
    891891
    892892    //_System_Call_Destructor_of_GlobalObjectは一番最後にコンパイル
    893     pSub_System_Call_Destructor_of_GlobalObject->bCompile=0;
     893    pSub_System_Call_Destructor_of_GlobalObject->KillCompileStatus();
    894894    CompileBufferInProcedure(pSub_System_Call_Destructor_of_GlobalObject);
    895895}
Note: See TracChangeset for help on using the changeset viewer.