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
  • BasicCompiler64/Compile_CallProc.cpp

    r47 r50  
    2929    pLocalVarAddrSchedule[LocalVarAddrScheduleNum]=obp;
    3030    LocalVarAddrScheduleNum++;
    31 }
    32 
    33 int CallProc(int idProc,void *pInfo,char *name,char *Parameter,LONG_PTR *plpRetIndex){
    34     int ret_type;
    35 
    36     if(idProc==PROC_DEFAULT){
    37         /////////////////////
    38         // ユーザー定義関数
    39         /////////////////////
    40 
    41         SUBINFO *psi;
    42         psi=(SUBINFO *)pInfo;
    43 
    44         //GetSubHash内でエラー提示が行われた場合
    45         if(psi==(SUBINFO *)-1) return -1;
    46 
    47 
    48         //オブジェクト名を取得
    49         char ObjectName[VN_SIZE];
    50         int RefType;
    51         SplitObjectName(name,ObjectName,&RefType);
    52 
    53 
    54         ////////////////////////
    55         // オーバーロードを解決
    56         ////////////////////////
    57 
    58         SUBINFO **ppsi;
    59         int num;
    60         ppsi=GetOverloadSubHash(name,&num);
    61         if(num){
    62             //オーバーロードを解決
    63             psi=OverloadSolutionWithStrParam(name,ppsi,num,Parameter,ObjectName,NULL);
    64             HeapDefaultFree(ppsi);
    65 
    66             if(!psi) return 0;
    67         }
    68 
    69 
    70         Opcode_CallProc(Parameter,psi,0,ObjectName,RefType);
    71         if( plpRetIndex ){
    72             *plpRetIndex = psi->u.ReturnIndex;
    73         }
    74         return psi->ReturnType;
    75     }
    76     else if(idProc==PROC_DLL){
    77         /////////////////////////
    78         // DLL関数
    79         /////////////////////////
    80         DECLAREINFO *pdi;
    81         pdi=(DECLAREINFO *)pInfo;
    82 
    83         ret_type=Opcode_CallDllProc(Parameter,pdi,plpRetIndex);
    84     }
    85     else if(idProc==PROC_BUILTIN){
    86         /////////////////////////
    87         // 組み込み関数
    88         /////////////////////////
    89         int FuncId;
    90         FuncId=(int)(_int64)pInfo;
    91 
    92         TYPEINFO ReturnTypeInfo = { DEF_LONG, NULL };
    93         Opcode_CallFunc( Parameter, FuncId, ReturnTypeInfo );
    94         if( plpRetIndex ){
    95             *plpRetIndex = ReturnTypeInfo.u.lpIndex;
    96         }
    97         return ReturnTypeInfo.type;
    98     }
    99     else if(idProc==PROC_PTR){
    100         /////////////////
    101         // 関数ポインタ
    102         /////////////////
    103 
    104         LONG_PTR lpIndex;
    105         GetVarType(name,&lpIndex,0);
    106 
    107         extern PROCPTRINFO *pProcPtrInfo;
    108         ret_type=Opcode_CallProcPtr(name,Parameter,&pProcPtrInfo[lpIndex],plpRetIndex);
    109     }
    110 
    111     return ret_type;
    112 }
    113 
    114 BOOL CallPropertyMethod(char *variable,char *RightSide,TYPEINFO *pRetTypeInfo){
    115     //プロパティ用のメソッドを呼び出す
    116 
    117     //配列要素を取得
    118     char VarName[VN_SIZE],ArrayElements[VN_SIZE];
    119     GetArrayElement(variable,VarName,ArrayElements);
    120 
    121     //オブジェクト名を取得
    122     char ObjectName[VN_SIZE];
    123     int RefType;
    124     SplitObjectName(VarName,ObjectName,&RefType);
    125 
    126     //オーバーロード用の関数リストを作成
    127     SUBINFO **ppsi;
    128     int num;
    129     ppsi=GetOverloadSubHash(VarName,&num);
    130     if(num==0){
    131         return 0;
    132     }
    133 
    134     //パラメータを整備
    135     char *Parameter;
    136     Parameter=(char *)HeapAlloc(hHeap,0,lstrlen(ArrayElements)+lstrlen(RightSide)+32);
    137     lstrcpy(Parameter,ArrayElements);
    138     if(RightSide){
    139         if(Parameter[0]&&RightSide[0]) lstrcat(Parameter,",");
    140         lstrcat(Parameter,RightSide);
    141     }
    142 
    143     //オーバーロードを解決
    144     SUBINFO *psi;
    145     psi=OverloadSolutionWithStrParam(VarName,ppsi,num,Parameter,ObjectName,NULL);
    146     HeapDefaultFree(ppsi);
    147 
    148     if(psi){
    149         //呼び出し
    150         Opcode_CallProc(Parameter,psi,0,ObjectName,RefType);
    151 
    152         if( pRetTypeInfo ){
    153             pRetTypeInfo->type = psi->ReturnType;
    154             pRetTypeInfo->u.lpIndex = psi->u.ReturnIndex;
    155         }
    156     }
    157 
    158     HeapDefaultFree(Parameter);
    159 
    160     return 1;
    16131}
    16232
Note: See TracChangeset for help on using the changeset viewer.