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

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler32/Compile_CallProc.cpp

    r73 r75  
    88void Call_DebugSys_SaveContext(){
    99    //call _System_GetEip
    10     extern SubInfo *pSub_System_GetEip;
     10    extern UserProc *pSub_System_GetEip;
    1111    op_call(pSub_System_GetEip);
    1212
     
    1818
    1919    //call _DebugSys_SaveContext
    20     extern SubInfo *pSub_DebugSys_SaveContext;
     20    extern UserProc *pSub_DebugSys_SaveContext;
    2121    op_call(pSub_DebugSys_SaveContext);
    2222}
     
    3232
    3333
    34 int Opcode_CallProcPtr(char *variable,char *Parameter,PROCPTRINFO *pi,LONG_PTR *plpIndex){
     34int Opcode_CallProcPtr(char *variable,char *Parameter,ProcPointer *pProcPointer,LONG_PTR *plpIndex){
    3535    extern HANDLE hHeap;
    3636    int i;
     
    5252
    5353    //エラーチェック
    54     if( !pobj_parameter->ErrorCheck(variable,pi->pParmInfo,pi->ParmNum,pi->ParmNum) ){
     54    if( !pobj_parameter->ErrorCheck(variable,pProcPointer->Params() ) ){
    5555        //パラメータにエラーがあるときは処理を終える
    56         return pi->ReturnType;
     56        return pProcPointer->ReturnType().GetBasicType();
    5757    }
    5858
    5959    //一時オブジェクトを生成
    60     pobj_parameter->NewTempParameters( variable,pi->pParmInfo,pi->ParmNum,pi->ParmNum );
     60    pobj_parameter->NewTempParameters( variable,pProcPointer->Params() );
    6161
    6262    //レジスタ、スタックフレームにセット
    63     pobj_parameter->SetParameter(variable,pi->pParmInfo,pi->ParmNum,pi->ParmNum);
     63    pobj_parameter->SetParameter(variable,pProcPointer->Params() );
    6464
    6565
     
    8989    delete pobj_parameter;
    9090
    91     if(plpIndex) *plpIndex=pi->u.ReturnIndex;
    92 
    93     return pi->ReturnType;
     91    if(plpIndex) *plpIndex=pProcPointer->ReturnType().GetIndex();
     92
     93    return pProcPointer->ReturnType().GetBasicType();
    9494}
    9595
    96 void Opcode_CallProc(const char *Parameter,SubInfo *psi,DWORD dwFlags,char *ObjectName,int RefType){
     96void Opcode_CallProc(const char *Parameter,UserProc *pUserProc,DWORD dwFlags,char *ObjectName,int RefType){
    9797    int i2;
    9898
    99     if(psi->dwType==SUBTYPE_MACRO){
    100         if(lstrcmpi(psi->name,"Print")==0){
     99    if( pUserProc->IsMacro() ){
     100        if( lstrcmpi( pUserProc->GetName().c_str(), "Print" ) == 0 ){
    101101            Opcode_Print(Parameter,0);
    102102            return;
    103103        }
    104         if(lstrcmpi(psi->name,"Input")==0){
     104        if( lstrcmpi( pUserProc->GetName().c_str(), "Input" ) == 0 ){
    105105            Opcode_Input(Parameter);
    106106            return;
    107107        }
    108         if(lstrcmpi(psi->name,"Write")==0){
     108        if( lstrcmpi( pUserProc->GetName().c_str(), "Write" ) == 0 ){
    109109            Opcode_Print(Parameter,1);
    110110            return;
     
    112112    }
    113113
    114     psi->bUse=1;
     114    pUserProc->Using();
    115115
    116116    bool isStatic = false;
    117117    CClass *pobj_c = NULL;
    118118    CMethod *pMethod = NULL;
    119     if(psi->pobj_ParentClass){
     119    if( pUserProc->GetParentClassPtr() ){
    120120        //クラスのメンバ関数を呼び出す場合はアクセスチェックを行う
    121121        if(ObjectName[0]){
     
    141141            if(dwFlags&PROCFLAG_NEW){
    142142                //New演算子によるコンストラクタ呼び出し
    143                 pobj_c=psi->pobj_ParentClass;
     143                pobj_c=pUserProc->GetParentClassPtr();
    144144            }
    145145            else{
     
    154154        /////////////////////////////////
    155155        pMethod = NULL;
    156         if( ! isStatic ) pMethod = pobj_c->GetMethodInfo( psi );
     156        if( ! isStatic ) pMethod = pobj_c->GetMethodInfo( pUserProc );
    157157        if( ! pMethod ){
    158158            //動的メソッドが取得できなかったときは静的メソッドを当たる
    159             pMethod = pobj_c->GetStaticMethodInfo( psi );
     159            pMethod = pobj_c->GetStaticMethodInfo( pUserProc );
    160160            if( !pMethod ){
    161161                SetError(300,NULL,cp);
     
    178178                //同一クラスオブジェクトの場合はプライベートアクセスを容認する
    179179                if(dwAccess==ACCESS_NON){
    180                     SetError(109,psi->name,cp);
     180                    SetError(109,pUserProc->GetName(),cp);
    181181                    return;
    182182                }
     
    185185                if(dwAccess==ACCESS_PRIVATE||
    186186                    dwAccess==ACCESS_NON){
    187                     SetError(109,psi->name,cp);
     187                    SetError(109,pUserProc->GetName(),cp);
    188188                    return;
    189189                }
    190190                if(dwAccess==ACCESS_PROTECTED){
    191                     SetError(110,psi->name,cp);
     191                    SetError(110,pUserProc->GetName(),cp);
    192192                    return;
    193193                }
     
    197197            //クラス内部からの呼び出し(継承によるACCESS_NONのみをエラーとする)
    198198            if(dwAccess==ACCESS_NON){
    199                 SetError(109,psi->name,cp);
     199                SetError(109,pUserProc->GetName(),cp);
    200200                return;
    201201            }
     
    210210
    211211    char temporary[VN_SIZE]={0};
    212     if( psi->pobj_ParentClass && isStatic == false ){
     212    if( pUserProc->GetParentClassPtr() && isStatic == false ){
    213213        //_System_LocalThis(第一パラメータ)のダミーを作成
    214214        lstrcpy(temporary,"0,");
     
    230230
    231231    //エラーチェック
    232     if( !pobj_parameter->ErrorCheck(psi->name,psi->realParams,psi->SecondParmNum) ){
     232    if( !pobj_parameter->ErrorCheck(pUserProc->GetName(),pUserProc->RealParams(),pUserProc->GetSecondParmNum() ) ){
    233233        //パラメータにエラーがあるときは処理を終える
    234234        return;
    235235    }
    236236
    237     if(psi->dwType==SUBTYPE_MACRO){
     237    if(pUserProc->IsMacro()){
    238238        //マクロ関数の場合は、パラメータ省略を考慮する
    239         pobj_parameter->MacroParameterSupport( psi->realParams );
     239        pobj_parameter->MacroParameterSupport( pUserProc->RealParams() );
    240240    }
    241241
    242242    //一時オブジェクトを生成
    243     int tempSize = pobj_parameter->NewTempParameters( psi->name,psi->realParams,psi->RealSecondParmNum );
     243    int tempSize = pobj_parameter->NewTempParameters( pUserProc->GetName(),pUserProc->RealParams(),pUserProc->GetRealSecondParmNum() );
    244244
    245245    //レジスタ、スタックフレームにセット
    246     int ParmSize;
    247     ParmSize=pobj_parameter->SetParameter(psi->name,psi->realParams,psi->RealSecondParmNum);
    248 
    249     if(psi->ReturnType==DEF_STRUCT && psi->isReturnRef == false){
     246    int ParmSize = pobj_parameter->SetParameter(pUserProc->GetName(),pUserProc->RealParams(),pUserProc->GetRealSecondParmNum() );
     247
     248    if(pUserProc->ReturnType().IsStruct() ){
    250249        //////////////////////////////////////////////////////
    251250        // 戻り値に構造体インスタンスを持つ場合
     
    253252        //////////////////////////////////////////////////////
    254253
    255         int object_size = psi->u.Return_pobj_c->GetSize();
     254        int object_size = pUserProc->ReturnType().GetClass().GetSize();
    256255
    257256        //push object_size
     
    259258
    260259        //call calloc
    261         extern SubInfo *pSub_calloc;
     260        extern UserProc *pSub_calloc;
    262261        op_call(pSub_calloc);
    263262
     
    267266
    268267
    269     if( psi->pobj_ParentClass && isStatic == false ){
     268    if( pUserProc->GetParentClassPtr() && isStatic == false ){
    270269        //////////////////////////////////////////////////////
    271270        // メンバ関数の場合
     
    310309    }
    311310
    312     if(psi->bVirtual){
     311    if( pUserProc->IsVirtual() ){
    313312        //仮想関数(オブジェクトメソッド)呼び出し
    314313        //pObj->func_table->func1
     
    320319        OpBuffer[obp++]=(char)0x11;
    321320
    322         i2 = pobj_c->GetFuncNumInVtbl( psi );
     321        i2 = pobj_c->GetFuncNumInVtbl( pUserProc );
    323322
    324323        //call dword ptr[edx+func_index]
     
    339338
    340339        //call ProcAddr
    341         op_call(psi);
    342     }
    343 
    344     if(psi->bCdecl){
     340        op_call(pUserProc);
     341    }
     342
     343    if(pUserProc->IsCdecl()){
    345344        //add esp,ParmSize
    346345        op_add_esp(ParmSize);
     
    354353}
    355354
    356 int Opcode_CallDllProc(char *Parameter,DECLAREINFO *pdi,LONG_PTR *plpIndex){
     355int Opcode_CallDllProc(char *Parameter,DllProc *pDllProc,LONG_PTR *plpIndex){
    357356    char *temporary;
    358357
     
    361360    extern BOOL bDebugCompile;
    362361    extern BOOL bDebugSupportProc;
    363     if(bDebugCompile&&bDebugSupportProc==0&&lstrcmp(pdi->name,"DebugBreak")!=0)
     362    if(bDebugCompile&&bDebugSupportProc==0&& pDllProc->GetName() != "DebugBreak" ){
    364363        Call_DebugSys_SaveContext();
    365 
    366     pdi->bUse=1;
     364    }
    367365
    368366
     
    376374
    377375    //エラーチェック
    378     if( !pobj_parameter->ErrorCheck(pdi->name,pdi->pParmInfo,pdi->ParmNum,pdi->ParmNum) ){
     376    if( !pobj_parameter->ErrorCheck( pDllProc->GetName(), pDllProc->Params() ) ){
    379377        //パラメータにエラーがあるときは処理を終える
    380         return pdi->ReturnType;
     378        return pDllProc->ReturnType().GetBasicType();
    381379    }
    382380
    383381    //一時オブジェクトを生成
    384     pobj_parameter->NewTempParameters( pdi->name,pdi->pParmInfo,pdi->ParmNum,pdi->ParmNum );
     382    pobj_parameter->NewTempParameters( pDllProc->GetName(), pDllProc->Params() );
    385383
    386384    //レジスタ、スタックフレームにセット
    387     int ParmSize;
    388     ParmSize=pobj_parameter->SetParameter(pdi->name,pdi->pParmInfo,pdi->ParmNum,pdi->ParmNum);
     385    int ParmSize = pobj_parameter->SetParameter(pDllProc->GetName(), pDllProc->Params() );
    389386
    390387
     
    392389
    393390    //call dword ptr[LookupTable]
     391    pDllProc->Using();
    394392    OpBuffer[obp++]=(char)0xFF;
    395393    OpBuffer[obp++]=(char)0x15;
    396     pobj_ImportAddrSchedule->add(pdi);
     394    pobj_ImportAddrSchedule->add(pDllProc);
    397395    obp+=sizeof(long);
    398396
    399     if(pdi->bCdecl){
     397    if(pDllProc->IsCdecl()){
    400398        //add esp,ParmSize
    401399        op_add_esp(ParmSize);
     
    408406    delete pobj_parameter;
    409407
    410     if(plpIndex) *plpIndex=pdi->u.ReturnIndex;
     408    if(plpIndex) *plpIndex=pDllProc->ReturnType().GetIndex();
    411409
    412410    HeapDefaultFree(temporary);
    413411
    414     return pdi->ReturnType;
     412    return pDllProc->ReturnType().GetBasicType();
    415413}
Note: See TracChangeset for help on using the changeset viewer.