Ignore:
Timestamp:
Feb 10, 2007, 5:44:58 PM (17 years ago)
Author:
dai_9181
Message:

オーバーロード解決用の関数保持リストを "SUBINFO " ではなく、"vector<SUBINFO *>" に変更した。

File:
1 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler_Common/Subroutine.cpp

    r46 r50  
    104104    return true;
    105105}
    106 int GetReturnTypeOfProc(int idProc,void *pInfo,char *name,char *Parameter,LONG_PTR *plpRetIndex){
     106
     107
     108int CallProc(int idProc,void *pInfo,char *name,char *Parameter,LONG_PTR *plpRetIndex){
    107109    int ret_type;
    108110
     
    129131        ////////////////////////
    130132
    131         SUBINFO **ppsi;
    132         int num;
    133         ppsi=GetOverloadSubHash(name,&num);
    134         if(num){
     133        std::vector<SUBINFO *> subs;
     134        GetOverloadSubHash(name,subs);
     135        if(subs.size()){
    135136            //オーバーロードを解決
    136             psi=OverloadSolutionWithStrParam(name,ppsi,num,Parameter,ObjectName,NULL);
    137             HeapDefaultFree(ppsi);
     137            psi=OverloadSolutionWithStrParam(name,subs,Parameter,ObjectName,NULL);
    138138
    139139            if(!psi) return 0;
     
    141141
    142142
    143         ret_type=psi->ReturnType;
    144         *plpRetIndex=psi->u.ReturnIndex;
     143        Opcode_CallProc(Parameter,psi,0,ObjectName,RefType);
     144        if( plpRetIndex ){
     145            *plpRetIndex = psi->u.ReturnIndex;
     146        }
     147        return psi->ReturnType;
    145148    }
    146149    else if(idProc==PROC_DLL){
     
    151154        pdi=(DECLAREINFO *)pInfo;
    152155
    153         ret_type=pdi->ReturnType;
    154         *plpRetIndex=pdi->u.ReturnIndex;
     156        ret_type=Opcode_CallDllProc(Parameter,pdi,plpRetIndex);
    155157    }
    156158    else if(idProc==PROC_BUILTIN){
     
    161163        FuncId=(int)(_int64)pInfo;
    162164
    163         ret_type=GetFunctionType(FuncId);
    164         *plpRetIndex=-1;
     165        TYPEINFO ReturnTypeInfo = { DEF_LONG, NULL };
     166        Opcode_CallFunc( Parameter, FuncId, ReturnTypeInfo );
     167        if( plpRetIndex ){
     168            *plpRetIndex = ReturnTypeInfo.u.lpIndex;
     169        }
     170        return ReturnTypeInfo.type;
    165171    }
    166172    else if(idProc==PROC_PTR){
     
    173179
    174180        extern PROCPTRINFO *pProcPtrInfo;
    175         ret_type=pProcPtrInfo[lpIndex].ReturnType;
    176         *plpRetIndex=pProcPtrInfo[lpIndex].u.ReturnIndex;
     181        ret_type=Opcode_CallProcPtr(name,Parameter,&pProcPtrInfo[lpIndex],plpRetIndex);
    177182    }
    178183
    179184    return ret_type;
    180185}
    181 BOOL GetReturnTypeOfPropertyMethod(char *variable,char *RightSide,TYPEINFO *pRetTypeInfo){
     186BOOL CallPropertyMethod(char *variable,char *RightSide,TYPEINFO *pRetTypeInfo){
    182187    //プロパティ用のメソッドを呼び出す
    183188
     
    192197
    193198    //オーバーロード用の関数リストを作成
    194     SUBINFO **ppsi;
    195     int num;
    196     ppsi=GetOverloadSubHash(VarName,&num);
    197     if(num==0){
     199    std::vector<SUBINFO *> subs;
     200    GetOverloadSubHash(VarName,subs);
     201    if(subs.size()==0){
    198202        return 0;
    199203    }
     
    210214    //オーバーロードを解決
    211215    SUBINFO *psi;
    212     psi=OverloadSolutionWithStrParam(VarName,ppsi,num,Parameter,ObjectName,NULL);
    213     HeapDefaultFree(ppsi);
     216    psi=OverloadSolutionWithStrParam(VarName,subs,Parameter,ObjectName,NULL);
     217
     218    if(psi){
     219        //呼び出し
     220        Opcode_CallProc(Parameter,psi,0,ObjectName,RefType);
     221
     222        if( pRetTypeInfo ){
     223            pRetTypeInfo->type = psi->ReturnType;
     224            pRetTypeInfo->u.lpIndex = psi->u.ReturnIndex;
     225        }
     226    }
     227
     228    HeapDefaultFree(Parameter);
     229
     230    return 1;
     231}
     232
     233
     234int GetReturnTypeOfProc(int idProc,void *pInfo,char *name,char *Parameter,LONG_PTR *plpRetIndex){
     235    int ret_type;
     236
     237    if(idProc==PROC_DEFAULT){
     238        /////////////////////
     239        // ユーザー定義関数
     240        /////////////////////
     241
     242        SUBINFO *psi;
     243        psi=(SUBINFO *)pInfo;
     244
     245        //GetSubHash内でエラー提示が行われた場合
     246        if(psi==(SUBINFO *)-1) return -1;
     247
     248
     249        //オブジェクト名を取得
     250        char ObjectName[VN_SIZE];
     251        int RefType;
     252        SplitObjectName(name,ObjectName,&RefType);
     253
     254
     255        ////////////////////////
     256        // オーバーロードを解決
     257        ////////////////////////
     258
     259        std::vector<SUBINFO *> subs;
     260        GetOverloadSubHash(name,subs);
     261        if( subs.size() > 0 ){
     262            //オーバーロードを解決
     263            psi=OverloadSolutionWithStrParam(name,subs,Parameter,ObjectName,NULL);
     264
     265            if(!psi) return 0;
     266        }
     267
     268
     269        ret_type=psi->ReturnType;
     270        *plpRetIndex=psi->u.ReturnIndex;
     271    }
     272    else if(idProc==PROC_DLL){
     273        /////////////////////////
     274        // DLL関数
     275        /////////////////////////
     276        DECLAREINFO *pdi;
     277        pdi=(DECLAREINFO *)pInfo;
     278
     279        ret_type=pdi->ReturnType;
     280        *plpRetIndex=pdi->u.ReturnIndex;
     281    }
     282    else if(idProc==PROC_BUILTIN){
     283        /////////////////////////
     284        // 組み込み関数
     285        /////////////////////////
     286        int FuncId;
     287        FuncId=(int)(_int64)pInfo;
     288
     289        ret_type=GetFunctionType(FuncId);
     290        *plpRetIndex=-1;
     291    }
     292    else if(idProc==PROC_PTR){
     293        /////////////////
     294        // 関数ポインタ
     295        /////////////////
     296
     297        LONG_PTR lpIndex;
     298        GetVarType(name,&lpIndex,0);
     299
     300        extern PROCPTRINFO *pProcPtrInfo;
     301        ret_type=pProcPtrInfo[lpIndex].ReturnType;
     302        *plpRetIndex=pProcPtrInfo[lpIndex].u.ReturnIndex;
     303    }
     304
     305    return ret_type;
     306}
     307BOOL GetReturnTypeOfPropertyMethod(char *variable,char *RightSide,TYPEINFO *pRetTypeInfo){
     308    //プロパティ用のメソッドを呼び出す
     309
     310    //配列要素を取得
     311    char VarName[VN_SIZE],ArrayElements[VN_SIZE];
     312    GetArrayElement(variable,VarName,ArrayElements);
     313
     314    //オブジェクト名を取得
     315    char ObjectName[VN_SIZE];
     316    int RefType;
     317    SplitObjectName(VarName,ObjectName,&RefType);
     318
     319    //オーバーロード用の関数リストを作成
     320    std::vector<SUBINFO *> subs;
     321    GetOverloadSubHash(VarName,subs);
     322    if(subs.size()==0){
     323        return 0;
     324    }
     325
     326    //パラメータを整備
     327    char *Parameter;
     328    Parameter=(char *)HeapAlloc(hHeap,0,lstrlen(ArrayElements)+lstrlen(RightSide)+32);
     329    lstrcpy(Parameter,ArrayElements);
     330    if(RightSide){
     331        if(Parameter[0]&&RightSide[0]) lstrcat(Parameter,",");
     332        lstrcat(Parameter,RightSide);
     333    }
     334
     335    //オーバーロードを解決
     336    SUBINFO *psi;
     337    psi=OverloadSolutionWithStrParam(VarName,subs,Parameter,ObjectName,NULL);
    214338
    215339    if(psi){
     
    225349//インデクサ(getter)の戻り値を取得
    226350bool GetReturnTypeOfIndexerGetterProc(CClass *pobj_Class,TYPEINFO &RetTypeInfo){
    227     SUBINFO **ppsi;
    228     int num;
    229     ppsi=pobj_Class->GetOperatorSubInfo(CALC_ARRAY_GET,num);
    230     if(num==0){
    231         HeapDefaultFree(ppsi);
    232 
     351    std::vector<SUBINFO *> subs;
     352    pobj_Class->EnumMethod( CALC_ARRAY_GET, subs );
     353    if( subs.size() == 0 ){
    233354        return false;
    234355    }
    235356
    236     RetTypeInfo.type = ppsi[0]->ReturnType;
    237     RetTypeInfo.u.lpIndex = ppsi[0]->u.ReturnIndex;
    238 
    239     HeapDefaultFree(ppsi);
     357    RetTypeInfo.type = subs[0]->ReturnType;
     358    RetTypeInfo.u.lpIndex = subs[0]->u.ReturnIndex;
    240359
    241360    return true;
Note: See TracChangeset for help on using the changeset viewer.