source: dev/BasicCompiler_Common/ParamImpl.cpp@ 71

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

Parameter.cpp→ParamImpl.cpp
CParameter→ParamImpl

Type.cpp、Type.hを用意した。

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