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

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • BasicCompiler32/Compile_CallProc.cpp

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