#include "common.h" #ifdef _AMD64_ #include "../BasicCompiler64/opcode.h" #else #include "../BasicCompiler32/opcode.h" #endif ParamImpl::ParamImpl(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; } ParamImpl::ParamImpl(const PARAMETER_INFO *pParamInfo,const int ParmNum){ int i; for(i=0;iParmsNum=ParmNum; ReturnTypeInfo.type=DEF_NON; ReturnTypeInfo.u.lpIndex=-1; } ParamImpl::ParamImpl(const Parameters ¶ms){ int count = 0; foreach( Parameter *pParam, params ){ types[count].type = pParam->GetBasicType(); types[count].u.lpIndex = pParam->GetIndex(); count++; } this->ParmsNum=params.size(); ReturnTypeInfo.type=DEF_NON; ReturnTypeInfo.u.lpIndex=-1; } ParamImpl::~ParamImpl(){ 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 *ParamImpl::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->params,&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 *ParamImpl::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->params,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->params.size()==this->ParmsNum){ if(sw){ sw=0; break; } sw=1; psi=temp_psi; } } } if(!sw){ SetError(52,name,cp); return 0; } return psi; } BOOL ParamImpl::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(int)params.size()){ if(params[params.size()-1]->GetBasicType()!=DEF_ELLIPSE){ //パラメータが多すぎるとき SetError(10,procName,cp); return false; } } else if(ParmsNum<(int)params.size()){ if(ParmsNumGetBasicType()==DEF_ELLIPSE){ return true; } //パラメータが少なすぎるとき SetError(10,procName,cp); return false; } //省略パラメータに "0" を指定する for(;ParmsNum < (int)params.size();ParmsNum++){ extern HANDLE hHeap; char temporary[64]; if(params[ParmsNum]->IsRef() == false) lstrcpy(temporary,"0"); else sprintf(temporary,"%c%c0",1,ESC_BYVAL); Parms[ParmsNum]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1); lstrcpy(Parms[ParmsNum],temporary); } } return true; } void ParamImpl::MacroParameterSupport(PARAMETER_INFO *ppi){ for(int i=0;iIsRef() == false ) lstrcpy(temporary,"0"); else sprintf(temporary,"%c%c0",1,ESC_BYVAL); HeapDefaultFree(Parms[i]); Parms[i]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1); lstrcpy(Parms[i],temporary); } } }