source: dev/BasicCompiler_Common/ParamImpl.cpp@ 75

Last change on this file since 75 was 75, checked in by dai_9181, 17 years ago

TYPEINFO→Typeへのリファクタリングを実施。64bitはほぼ完了。32bitが全般的に未完成。

File size: 5.8 KB
RevLine 
[52]1#include "common.h"
2
3#ifdef _AMD64_
4#include "../BasicCompiler64/opcode.h"
5#else
6#include "../BasicCompiler32/opcode.h"
7#endif
8
[75]9ParamImpl::ParamImpl(const char *buffer):
10 returnType()
11{
[52]12 ///////////////////////////
13 // パラメータ文字列を整理
14 ///////////////////////////
15
16 extern HANDLE hHeap;
17 int i,i2,i3;
18 char temporary[VN_SIZE];
19
20 i=0;
21 ParmsNum=0;
22 while(1){
23 if(buffer[i]=='\0') break;
24
25 for(i2=0;;i2++,i++){
26 if(buffer[i]=='\"'){
27 temporary[i2]=buffer[i];
28 for(i++,i2++;;i++,i2++){
29 temporary[i2]=buffer[i];
30 if(buffer[i]=='\"') break;
31 }
32 continue;
33 }
34
35 if(buffer[i]=='('){
36 i3=GetStringInPare(temporary+i2,buffer+i);
37 i2+=i3-1;
38 i+=i3-1;
39 continue;
40 }
41 if(buffer[i]=='['){
42 i3=GetStringInBracket(temporary+i2,buffer+i);
43 i2+=i3-1;
44 i+=i3-1;
45 continue;
46 }
47
48 if(buffer[i]==','||buffer[i]=='\0'){
49 temporary[i2]=0;
50 break;
51 }
52 temporary[i2]=buffer[i];
53 }
54
55 Parms[ParmsNum]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
56 lstrcpy(Parms[ParmsNum],temporary);
57 ParmsNum++;
58
[75]59 types.push_back( Type() );
60
[52]61 if(buffer[i]==',') i++;
62 }
63}
[75]64ParamImpl::ParamImpl(const Parameters &params):
65 returnType()
66{
67 ParmsNum = 0;
68 foreach( Parameter *pParam, params ){
69 Parms[ParmsNum]=0;
70 ParmsNum++;
[52]71
[75]72 types.push_back( *pParam );
[73]73 }
74}
[71]75ParamImpl::~ParamImpl(){
[52]76 int i2;
77
78 //パラメータ文字列を解放
79 for(i2=0;i2<ParmsNum;i2++){
80 if(Parms[i2]==(char *)-1) continue;
81
82 if(Parms[i2]) HeapDefaultFree(Parms[i2]);
83 }
84}
85
[75]86void ParamImpl::SetReturnType( const Type &returnType ){
87 this->returnType = returnType;
[52]88}
89
[75]90bool ParamImpl::_overload_check( int level, const Parameters &targetParms, const Type &targetResultType ){
[52]91 //パラメータを識別してオーバーロードを解決
92
93 //パラメータの個数が不一致の場合
[75]94 int max = (int)targetParms.size();
95 if(max!=ParmsNum){
96 return false;
97 }
[52]98
[73]99 Type argType;
100 for(int i=0;i<max;i++){
[75]101 Parameter &param = *targetParms[i];
[73]102
[52]103 if(Parms[i]){
[73]104 Type nullParam( DEF_NON );
105
106 NumOpe_GetType(Parms[i],
[75]107 (level==OVERLOAD_LEVEL0)? nullParam : param,
[73]108 argType);
[52]109 }
110 else{
[75]111 argType = types[i];
[52]112 }
113
[73]114 if(argType.GetBasicType()!=param.GetBasicType()){
[75]115 if(level==OVERLOAD_LEVEL1 || level == OVERLOAD_LEVEL0){
116 return false;
[52]117 }
[75]118 else if(level==OVERLOAD_LEVEL2){
[52]119 if(!(
[73]120 IsWholeNumberType(argType.GetBasicType())&&IsWholeNumberType(param.GetBasicType())||
121 IsRealNumberType(argType.GetBasicType())&&IsRealNumberType(param.GetBasicType())
[75]122 )){
123 return false;
124 }
[52]125 }
[75]126 else if(level==OVERLOAD_LEVEL3){
[73]127 if(argType.GetBasicType()==DEF_OBJECT||param.GetBasicType()==DEF_OBJECT) return 0;
[52]128 }
129 }
130 else{
[73]131 if(NATURAL_TYPE(argType.GetBasicType())==DEF_OBJECT || NATURAL_TYPE(argType.GetBasicType())==DEF_STRUCT){
[75]132 if(argType.GetIndex()!=param.GetIndex()){
133 return false;
134 }
[52]135 }
136 }
137 }
138
[75]139 if( !targetResultType.IsNull() ){
[52]140 //戻り値も比較対象にする
[75]141 if( !returnType.Equals( targetResultType ) ){
142 return false;
[52]143 }
144 }
145
[75]146 return true;
[52]147}
148
[75]149UserProc *ParamImpl::OverloadSolutionWithReturnType( const char *name, std::vector<UserProc *> &subs ){
[52]150 int sw=0;
[75]151 UserProc *pUserProc = NULL;
[52]152
[64]153 for( int level=OVERLOAD_MIN_LEVEL; level<=OVERLOAD_MAX_LEVEL; level++ ){
[75]154 foreach( UserProc *pTempUserProc, subs ){
[52]155
156 //エラーチェック
[75]157 if(_overload_check( level, pTempUserProc->Params(), pTempUserProc->ReturnType() )){
[52]158 if(sw){
159 SetError(52,name,cp);
160 return 0;
161 }
162 sw=1;
[64]163
[75]164 pUserProc = pTempUserProc;
[52]165 break;
166 }
167 }
168
[64]169 if( sw ) break;
[52]170 }
171
172 if(!sw){
173 SetError(52,name,cp);
174 return 0;
175 }
176
[75]177 return pUserProc;
[52]178}
[75]179UserProc *ParamImpl::OverloadSolution( const char *name, std::vector<UserProc *> &subs ){
[52]180 int sw=0;
[75]181 UserProc *pUserProc;
182 pUserProc=0;
[52]183
[64]184 for( int level=OVERLOAD_MIN_LEVEL; level<=OVERLOAD_MAX_LEVEL; level++ ){
[52]185
[75]186 foreach( UserProc *pTempUserProc, subs ){
[52]187
188 //エラーチェック
[75]189 if(_overload_check( level, pTempUserProc->Params(), Type() )){
[52]190 if(sw){
191 return OverloadSolutionWithReturnType(name,subs);
192 }
193 sw=1;
[64]194
[75]195 pUserProc = pTempUserProc;
[52]196 }
197 }
198
[64]199 if( sw ) break;
[52]200 }
201
202 if(!sw){
[75]203 foreach( UserProc *pTempUserProc, subs ){
[52]204
205 //エラーチェック
[75]206 if(pTempUserProc->Params().size()==this->ParmsNum){
[52]207 if(sw){
208 sw=0;
209 break;
210 }
211 sw=1;
212
[75]213 pUserProc=pTempUserProc;
[52]214 }
215 }
216 }
217
218 if(!sw){
219 SetError(52,name,cp);
220 return 0;
221 }
222
[75]223 return pUserProc;
[52]224}
225
[75]226bool ParamImpl::ErrorCheck( const string &procName, const Parameters &params, int SecondParmNum ){
227 if( SecondParmNum == -1 ) SecondParmNum = (int)params.size();
[52]228
[73]229 if(ParmsNum>(int)params.size()){
230 if(params[params.size()-1]->GetBasicType()!=DEF_ELLIPSE){
231 //パラメータが多すぎるとき
232 SetError(10,procName,cp);
233 return false;
234 }
235 }
236 else if(ParmsNum<(int)params.size()){
237 if(ParmsNum<SecondParmNum){
238 if(params[ParmsNum]->GetBasicType()==DEF_ELLIPSE){
239 return true;
240 }
[52]241
[73]242 //パラメータが少なすぎるとき
243 SetError(10,procName,cp);
244 return false;
245 }
246
247 //省略パラメータに "0" を指定する
248 for(;ParmsNum < (int)params.size();ParmsNum++){
249 extern HANDLE hHeap;
250 char temporary[64];
251 if(params[ParmsNum]->IsRef() == false) lstrcpy(temporary,"0");
252 else sprintf(temporary,"%c%c0",1,ESC_BYVAL);
253 Parms[ParmsNum]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
254 lstrcpy(Parms[ParmsNum],temporary);
255 }
256 }
257
258 return true;
259}
260
261void ParamImpl::MacroParameterSupport( const Parameters &params ){
262 for(int i=0;i<ParmsNum;i++){
263 if(Parms[i][0]=='\0'){
264 extern HANDLE hHeap;
265 char temporary[64];
266 if( params[i]->IsRef() == false ) lstrcpy(temporary,"0");
267 else sprintf(temporary,"%c%c0",1,ESC_BYVAL);
268 HeapDefaultFree(Parms[i]);
269 Parms[i]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
270 lstrcpy(Parms[i],temporary);
271 }
272 }
273}
Note: See TracBrowser for help on using the repository browser.