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
  • BasicCompiler64/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){
    35     extern HANDLE hHeap;
    36     int i;
    37 
     34bool Opcode_CallProcPtr( const char *variable, const char *lpszParms,ProcPointer *pProcPointer){
    3835
    3936    extern BOOL bDebugCompile;
     
    4946    //パラメータオブジェクトを生成
    5047    ParamImpl *pobj_parameter=0;
    51     pobj_parameter=new ParamImpl(Parameter);
     48    pobj_parameter=new ParamImpl(lpszParms);
    5249
    5350    //エラーチェック
    54     if( !pobj_parameter->ErrorCheck(variable,pi->pParmInfo,pi->ParmNum,pi->ParmNum) ){
     51    if( !pobj_parameter->ErrorCheck(variable,pProcPointer->Params() ) ){
    5552        //パラメータにエラーがあるときは処理を終える
    56         return pi->ReturnType;
     53        return false;
    5754    }
    5855
    5956    //スタックフレームに存在する既存のパラメータをバックアップ
    60     pobj_parameter->BackupParameter(pi->ParmNum);
     57    pobj_parameter->BackupParameter( (int)pProcPointer->Params().size() );
    6158
    6259    //一時オブジェクトを生成
    63     pobj_parameter->NewTempParameters( variable,pi->pParmInfo,pi->ParmNum,pi->ParmNum );
     60    pobj_parameter->NewTempParameters( variable,pProcPointer->Params() );
    6461
    6562    //レジスタ、スタックフレームにセット
    66     pobj_parameter->SetParameter(variable,pi->pParmInfo,pi->ParmNum,pi->ParmNum);
     63    pobj_parameter->SetParameter(variable,pProcPointer->Params() );
    6764
    6865
    6966
    7067    RELATIVE_VAR RelativeVar;
    71     LONG_PTR lp;
    72     GetVarOffsetReadOnly(variable,&i,&RelativeVar,&lp);
     68    GetVarOffsetReadOnly(variable,&RelativeVar,Type());
    7369    SetVarPtrToReg(REG_RAX,&RelativeVar);
    7470
     
    8884
    8985    //スタックフレームに存在する既存のパラメータを復元
    90     pobj_parameter->RestoreParameter(pi->ParmNum);
     86    pobj_parameter->RestoreParameter( (int)pProcPointer->Params().size() );
    9187
    9288    //パラメータオブジェクトを破棄
    9389    delete pobj_parameter;
    9490
    95     return pi->ReturnType;
     91    return true;
    9692}
    9793
    98 void Opcode_CallProc(const char *Parameter,SubInfo *psi,DWORD dwFlags,char *ObjectName,int RefType){
     94bool Opcode_CallProc(const char *Parameter,UserProc *pUserProc,DWORD dwFlags,const char *ObjectName,int RefType){
    9995    int i2;
    10096
    101     if(psi->dwType==SUBTYPE_MACRO){
    102         if(lstrcmpi(psi->name,"Print")==0){
     97    if( pUserProc->IsMacro() ){
     98        if( lstrcmpi( pUserProc->GetName().c_str(), "Print" ) == 0 ){
    10399            Opcode_Print(Parameter,0);
    104             return;
    105         }
    106         if(lstrcmpi(psi->name,"Input")==0){
     100            return true;
     101        }
     102        if( lstrcmpi( pUserProc->GetName().c_str(), "Input" ) == 0 ){
    107103            Opcode_Input(Parameter);
    108             return;
    109         }
    110         if(lstrcmpi(psi->name,"Write")==0){
     104            return true;
     105        }
     106        if( lstrcmpi( pUserProc->GetName().c_str(), "Write" ) == 0 ){
    111107            Opcode_Print(Parameter,1);
    112             return;
    113         }
    114     }
    115 
    116     psi->bUse=1;
     108            return true;
     109        }
     110    }
     111
     112    pUserProc->Using();
    117113
    118114    bool isStatic = false;
    119     CClass *pobj_c = NULL;
     115    const CClass *pobj_c = NULL;
    120116    CMethod *pMethod = NULL;
    121     if(psi->pobj_ParentClass){
     117    if( pUserProc->GetParentClassPtr() ){
    122118        //クラスのメンバ関数を呼び出す場合はアクセスチェックを行う
    123119        if(ObjectName[0]){
     
    128124            else{
    129125                //"->"によってオブジェクトを指定する通常のメンバ関数呼び出し
    130                 int type = GetVarType(ObjectName,(LONG_PTR *)&pobj_c,0);
    131                 if(!(NATURAL_TYPE(type)==DEF_OBJECT)){
     126                Type varType;
     127                GetVarType( ObjectName, varType, false );
     128                pobj_c = &varType.GetClass();
     129                if( NATURAL_TYPE( varType.GetBasicType() ) != DEF_OBJECT ){
    132130                    pobj_c=pobj_DBClass->check(ObjectName);
    133131                    if( pobj_c ){
     
    143141            if(dwFlags&PROCFLAG_NEW){
    144142                //New演算子によるコンストラクタ呼び出し
    145                 pobj_c=psi->pobj_ParentClass;
     143                pobj_c=pUserProc->GetParentClassPtr();
    146144            }
    147145            else{
     
    156154        /////////////////////////////////
    157155        pMethod = NULL;
    158         if( ! isStatic ) pMethod = pobj_c->GetMethodInfo( psi );
     156        if( ! isStatic ) pMethod = pobj_c->GetMethodInfo( pUserProc );
    159157        if( ! pMethod ){
    160158            //動的メソッドが取得できなかったときは静的メソッドを当たる
    161             pMethod = pobj_c->GetStaticMethodInfo( psi );
     159            pMethod = pobj_c->GetStaticMethodInfo( pUserProc );
    162160            if( !pMethod ){
    163161                SetError(300,NULL,cp);
    164                 return;
     162                return false;
    165163            }
    166164
     
    180178                //同一クラスオブジェクトの場合はプライベートアクセスを容認する
    181179                if(dwAccess==ACCESS_NON){
    182                     SetError(109,psi->name,cp);
    183                     return;
     180                    SetError(109,pUserProc->GetName(),cp);
     181                    return false;
    184182                }
    185183            }
     
    187185                if(dwAccess==ACCESS_PRIVATE||
    188186                    dwAccess==ACCESS_NON){
    189                     SetError(109,psi->name,cp);
    190                     return;
     187                    SetError(109,pUserProc->GetName(),cp);
     188                    return false;
    191189                }
    192190                if(dwAccess==ACCESS_PROTECTED){
    193                     SetError(110,psi->name,cp);
    194                     return;
     191                    SetError(110,pUserProc->GetName(),cp);
     192                    return false;
    195193                }
    196194            }
     
    199197            //クラス内部からの呼び出し(継承によるACCESS_NONのみをエラーとする)
    200198            if(dwAccess==ACCESS_NON){
    201                 SetError(109,psi->name,cp);
    202                 return;
     199                SetError(109,pUserProc->GetName(),cp);
     200                return false;
    203201            }
    204202        }
     
    211209
    212210    char temporary[VN_SIZE]={0};
    213     if( psi->pobj_ParentClass && isStatic == false ){
     211    if( pUserProc->GetParentClassPtr() && isStatic == false ){
    214212        //_System_LocalThis(第一パラメータ)のダミーを作成
    215213        lstrcpy(temporary,"0,");
     
    234232
    235233    //エラーチェック
    236     if( !pobj_parameter->ErrorCheck(psi->name,psi->realParams,psi->SecondParmNum) ){
     234    if( !pobj_parameter->ErrorCheck(pUserProc->GetName(),pUserProc->RealParams(),pUserProc->GetSecondParmNum() ) ){
    237235        //パラメータにエラーがあるときは処理を終える
    238         return;
    239     }
    240 
    241     if(psi->dwType==SUBTYPE_MACRO){
     236        return false;
     237    }
     238
     239    if(pUserProc->IsMacro()){
    242240        //マクロ関数の場合は、パラメータ省略を考慮する
    243         pobj_parameter->MacroParameterSupport(psi->realParams);
     241        pobj_parameter->MacroParameterSupport( pUserProc->RealParams() );
    244242    }
    245243
    246244    //スタックフレームに存在する既存のパラメータをバックアップ
    247     pobj_parameter->BackupParameter(psi->RealParmNum);
     245    pobj_parameter->BackupParameter( (int)pUserProc->RealParams().size() );
    248246
    249247    //一時オブジェクトを生成
    250     pobj_parameter->NewTempParameters( psi->name,psi->realParams,psi->RealSecondParmNum );
     248    pobj_parameter->NewTempParameters( pUserProc->GetName(),pUserProc->RealParams(),pUserProc->GetRealSecondParmNum() );
    251249
    252250    //レジスタ、スタックフレームにセット
    253     pobj_parameter->SetParameter(psi->name,psi->realParams,psi->RealSecondParmNum);
    254 
    255     if(psi->ReturnType==DEF_STRUCT && psi->isReturnRef == false){
     251    pobj_parameter->SetParameter(pUserProc->GetName(),pUserProc->RealParams(),pUserProc->GetRealSecondParmNum() );
     252
     253    if(pUserProc->ReturnType().IsStruct() ){
    256254        //////////////////////////////////////////////////////
    257255        // 戻り値に構造体インスタンスを持つ場合
     
    265263        //////////////////////////////////////////////////////
    266264
    267             int object_size = psi->u.Return_pobj_c->GetSize();
     265            int object_size = pUserProc->ReturnType().GetClass().GetSize();
    268266
    269267            //mov rcx,object_size
     
    271269
    272270            //call calloc
    273             extern SubInfo *pSub_calloc;
     271            extern UserProc *pSub_calloc;
    274272            op_call(pSub_calloc);
    275273
     
    282280        }////////////////////////////////////////////
    283281
    284         if( psi->pobj_ParentClass && isStatic == false ){
     282        if( pUserProc->GetParentClassPtr() && isStatic == false ){
    285283            //mov rdx,r13
    286284            op_mov_RR(REG_RDX,REG_R13);
     
    293291
    294292
    295     if( psi->pobj_ParentClass && isStatic == false ){
     293    if( pUserProc->GetParentClassPtr() && isStatic == false ){
    296294        ///////////////////////////////
    297295        // メンバ関数の場合
     
    305303                if( pMethod->isConst ){
    306304                    //Constアクセスが可能なメソッドの場合
    307                     if( !GetVarOffsetReadOnly( ObjectName, &i2, &RelativeVar, 0 ) ) return;
     305                    if( !GetVarOffsetReadOnly( ObjectName, &RelativeVar, Type() ) ){
     306                        return false;
     307                    }
    308308                }
    309309                else{
    310310                    //Constアクセスが不可能なメソッドの場合
    311                     if( !GetVarOffsetReadWrite( ObjectName, &i2, &RelativeVar, 0 ) ) return;
     311                    if( !GetVarOffsetReadWrite( ObjectName, &RelativeVar, Type() ) ){
     312                        return false;
     313                    }
    312314                }
    313315
     
    334336    }
    335337
    336     if(psi->bVirtual){
     338    if( pUserProc->IsVirtual() ){
    337339        //仮想関数(オブジェクトメソッド)呼び出し
    338340        //pObj->func_table->func1
     
    343345        op_mov_RM(sizeof(_int64),REG_R11,REG_RCX,0,MOD_BASE);
    344346
    345         i2 = pobj_c->GetFuncNumInVtbl( psi );
     347        i2 = pobj_c->GetFuncNumInVtbl( pUserProc );
    346348
    347349        //call qword ptr[r11+func_index]
     
    364366
    365367        //call ProcAddr
    366         op_call(psi);
     368        op_call(pUserProc);
    367369    }
    368370
    369371    /* 64コンパイラでは不要
    370     if(pdi->bCdecl){
     372    if(pDllProc->bCdecl){
    371373        //add esp,ParmSize
    372374    }*/
     
    380382
    381383    //スタックフレームに存在する既存のパラメータを復元
    382     pobj_parameter->RestoreParameter(psi->RealParmNum);
     384    pobj_parameter->RestoreParameter( (int)pUserProc->RealParams().size() );
    383385
    384386    //パラメータオブジェクトを破棄
    385387    delete pobj_parameter;
     388
     389    return true;
    386390}
    387391
    388 int Opcode_CallDllProc(char *Parameter,DECLAREINFO *pdi,LONG_PTR *plpIndex){
    389     char *temporary;
    390 
    391     temporary=(char *)HeapAlloc(hHeap,0,lstrlen(Parameter)+1);
     392bool Opcode_CallDllProc( const char *lpszParms, DllProc *pDllProc ){
    392393
    393394    extern BOOL bDebugCompile;
    394395    extern BOOL bDebugSupportProc;
    395     if(bDebugCompile&&bDebugSupportProc==0&&lstrcmp(pdi->name,"DebugBreak")!=0)
     396    if(bDebugCompile&&bDebugSupportProc==0&& pDllProc->GetName() != "DebugBreak" ){
    396397        Call_DebugSys_SaveContext();
    397 
     398    }
    398399
    399400
     
    404405    //パラメータオブジェクトを生成
    405406    ParamImpl *pobj_parameter=0;
    406     pobj_parameter=new ParamImpl(Parameter);
     407    pobj_parameter=new ParamImpl(lpszParms);
    407408
    408409    //エラーチェック
    409     if( !pobj_parameter->ErrorCheck(pdi->name,pdi->pParmInfo,pdi->ParmNum,pdi->ParmNum) ){
     410    if( !pobj_parameter->ErrorCheck( pDllProc->GetName(), pDllProc->Params() ) ){
    410411        //パラメータにエラーがあるときは処理を終える
    411         return pdi->ReturnType;
     412        return false;
    412413    }
    413414
    414415    //スタックフレームに存在する既存のパラメータをバックアップ
    415     pobj_parameter->BackupParameter(pdi->ParmNum);
     416    pobj_parameter->BackupParameter( (int)pDllProc->Params().size() );
    416417
    417418    //一時オブジェクトを生成
    418     pobj_parameter->NewTempParameters( pdi->name,pdi->pParmInfo,pdi->ParmNum,pdi->ParmNum );
     419    pobj_parameter->NewTempParameters( pDllProc->GetName(), pDllProc->Params() );
    419420
    420421    //レジスタ、スタックフレームにセット
    421     pobj_parameter->SetParameter(pdi->name,pdi->pParmInfo,pdi->ParmNum,pdi->ParmNum);
     422    pobj_parameter->SetParameter(pDllProc->GetName(), pDllProc->Params() );
    422423
    423424
     
    429430
    430431    //call dword ptr[ImportTable]
    431     op_call( pdi );
     432    op_call( pDllProc );
    432433
    433434    /* 64コンパイラでは不要
    434     if(pdi->bCdecl){
     435    if(pDllProc->bCdecl){
    435436        //add esp,ParmSize
    436437    }*/
     
    440441
    441442    //スタックフレームに存在する既存のパラメータを復元
    442     pobj_parameter->RestoreParameter(pdi->ParmNum);
     443    pobj_parameter->RestoreParameter( (int)pDllProc->Params().size() );
    443444
    444445    //パラメータオブジェクトを破棄
    445446    delete pobj_parameter;
    446447
    447     if(plpIndex) *plpIndex=pdi->u.ReturnIndex;
    448 
    449     HeapDefaultFree(temporary);
    450 
    451     return pdi->ReturnType;
     448    return true;
    452449}
Note: See TracChangeset for help on using the changeset viewer.