#include "common.h" #ifdef _AMD64_ #include "../BasicCompiler64/opcode.h" #else #include "../BasicCompiler32/opcode.h" #endif CParameter::CParameter(const char *buffer){ /////////////////////////// // パラメータ文字列を整理 /////////////////////////// extern HANDLE hHeap; int i,i2,i3; char temporary[VN_SIZE]; i=0; ParmsNum=0; while(1){ if(buffer[i]=='\0') break; for(i2=0;;i2++,i++){ if(buffer[i]=='\"'){ temporary[i2]=buffer[i]; for(i++,i2++;;i++,i2++){ temporary[i2]=buffer[i]; if(buffer[i]=='\"') break; } continue; } if(buffer[i]=='('){ i3=GetStringInPare(temporary+i2,buffer+i); i2+=i3-1; i+=i3-1; continue; } if(buffer[i]=='['){ i3=GetStringInBracket(temporary+i2,buffer+i); i2+=i3-1; i+=i3-1; continue; } if(buffer[i]==','||buffer[i]=='\0'){ temporary[i2]=0; break; } temporary[i2]=buffer[i]; } Parms[ParmsNum]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1); lstrcpy(Parms[ParmsNum],temporary); ParmsNum++; if(buffer[i]==',') i++; } ReturnTypeInfo.type=DEF_NON; ReturnTypeInfo.u.lpIndex=-1; } CParameter::CParameter(const PARAMETER_INFO *pParamInfo,const int ParmNum){ int i; for(i=0;iParmsNum=ParmNum; ReturnTypeInfo.type=DEF_NON; ReturnTypeInfo.u.lpIndex=-1; } CParameter::~CParameter(){ int i2; //パラメータ文字列を解放 for(i2=0;i2type){ if(NATURAL_TYPE(ReturnTypeInfo.type)==DEF_OBJECT || NATURAL_TYPE(ReturnTypeInfo.type)==DEF_STRUCT ){ if(ReturnTypeInfo.u.lpIndex != pReturnTypeInfo->u.lpIndex) return 0; } } else return 0; } return 1; } SUBINFO *CParameter::OverloadSolutionWithReturnType( const char *name, std::vector &subs ){ int sw=0; SUBINFO *psi; psi=0; for( int level=OVERLOAD_MIN_LEVEL; level<=OVERLOAD_MAX_LEVEL; level++ ){ foreach( SUBINFO *temp_psi, subs ){ TYPEINFO ReturnTypeInfo; ReturnTypeInfo.type=temp_psi->ReturnType; ReturnTypeInfo.u.lpIndex=temp_psi->u.ReturnIndex; //エラーチェック if(_overload_check(temp_psi->pParmInfo,temp_psi->ParmNum,&ReturnTypeInfo,level)){ if(sw){ SetError(52,name,cp); return 0; } sw=1; psi = temp_psi; break; } } if( sw ) break; } if(!sw){ SetError(52,name,cp); return 0; } return psi; } SUBINFO *CParameter::OverloadSolution( const char *name, std::vector &subs ){ int sw=0; SUBINFO *psi; psi=0; for( int level=OVERLOAD_MIN_LEVEL; level<=OVERLOAD_MAX_LEVEL; level++ ){ foreach( SUBINFO *temp_psi, subs ){ //エラーチェック if(_overload_check(temp_psi->pParmInfo,temp_psi->ParmNum,NULL,level)){ if(sw){ return OverloadSolutionWithReturnType(name,subs); } sw=1; psi = temp_psi; } } if( sw ) break; } if(!sw){ SUBINFO *temp_psi; foreach( temp_psi, subs ){ //エラーチェック if(temp_psi->ParmNum==this->ParmsNum){ if(sw){ sw=0; break; } sw=1; psi=temp_psi; } } } if(!sw){ SetError(52,name,cp); return 0; } return psi; } BOOL CParameter::ErrorCheck(const char *FuncName,PARAMETER_INFO *ppi,int pi_num,int SecondParmNum){ if(ParmsNum>pi_num){ if(ppi[pi_num-1].type!=DEF_ELLIPSE){ //パラメータが多すぎるとき SetError(10,FuncName,cp); return 0; } } else if(ParmsNum