Changeset 50 in dev for BasicCompiler_Common/Subroutine.cpp
- Timestamp:
- Feb 10, 2007, 5:44:58 PM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
BasicCompiler_Common/Subroutine.cpp
r46 r50 104 104 return true; 105 105 } 106 int GetReturnTypeOfProc(int idProc,void *pInfo,char *name,char *Parameter,LONG_PTR *plpRetIndex){ 106 107 108 int CallProc(int idProc,void *pInfo,char *name,char *Parameter,LONG_PTR *plpRetIndex){ 107 109 int ret_type; 108 110 … … 129 131 //////////////////////// 130 132 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()){ 135 136 //オーバーロードを解決 136 psi=OverloadSolutionWithStrParam(name,ppsi,num,Parameter,ObjectName,NULL); 137 HeapDefaultFree(ppsi); 137 psi=OverloadSolutionWithStrParam(name,subs,Parameter,ObjectName,NULL); 138 138 139 139 if(!psi) return 0; … … 141 141 142 142 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; 145 148 } 146 149 else if(idProc==PROC_DLL){ … … 151 154 pdi=(DECLAREINFO *)pInfo; 152 155 153 ret_type=pdi->ReturnType; 154 *plpRetIndex=pdi->u.ReturnIndex; 156 ret_type=Opcode_CallDllProc(Parameter,pdi,plpRetIndex); 155 157 } 156 158 else if(idProc==PROC_BUILTIN){ … … 161 163 FuncId=(int)(_int64)pInfo; 162 164 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; 165 171 } 166 172 else if(idProc==PROC_PTR){ … … 173 179 174 180 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); 177 182 } 178 183 179 184 return ret_type; 180 185 } 181 BOOL GetReturnTypeOfPropertyMethod(char *variable,char *RightSide,TYPEINFO *pRetTypeInfo){186 BOOL CallPropertyMethod(char *variable,char *RightSide,TYPEINFO *pRetTypeInfo){ 182 187 //プロパティ用のメソッドを呼び出す 183 188 … … 192 197 193 198 //オーバーロード用の関数リストを作成 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){ 198 202 return 0; 199 203 } … … 210 214 //オーバーロードを解決 211 215 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 234 int 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 } 307 BOOL 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); 214 338 215 339 if(psi){ … … 225 349 //インデクサ(getter)の戻り値を取得 226 350 bool 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 ){ 233 354 return false; 234 355 } 235 356 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; 240 359 241 360 return true;
Note:
See TracChangeset
for help on using the changeset viewer.