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
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 returnType()
11{
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
59 types.push_back( Type() );
60
61 if(buffer[i]==',') i++;
62 }
63}
64ParamImpl::ParamImpl(const Parameters &params):
65 returnType()
66{
67 ParmsNum = 0;
68 foreach( Parameter *pParam, params ){
69 Parms[ParmsNum]=0;
70 ParmsNum++;
71
72 types.push_back( *pParam );
73 }
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( const Type &returnType ){
87 this->returnType = returnType;
88}
89
90bool ParamImpl::_overload_check( int level, const Parameters &targetParms, const Type &targetResultType ){
91 //パラメータを識別してオーバーロードを解決
92
93 //パラメータの個数が不一致の場合
94 int max = (int)targetParms.size();
95 if(max!=ParmsNum){
96 return false;
97 }
98
99 Type argType;
100 for(int i=0;i<max;i++){
101 Parameter &param = *targetParms[i];
102
103 if(Parms[i]){
104 Type nullParam( DEF_NON );
105
106 NumOpe_GetType(Parms[i],
107 (level==OVERLOAD_LEVEL0)? nullParam : param,
108 argType);
109 }
110 else{
111 argType = types[i];
112 }
113
114 if(argType.GetBasicType()!=param.GetBasicType()){
115 if(level==OVERLOAD_LEVEL1 || level == OVERLOAD_LEVEL0){
116 return false;
117 }
118 else if(level==OVERLOAD_LEVEL2){
119 if(!(
120 IsWholeNumberType(argType.GetBasicType())&&IsWholeNumberType(param.GetBasicType())||
121 IsRealNumberType(argType.GetBasicType())&&IsRealNumberType(param.GetBasicType())
122 )){
123 return false;
124 }
125 }
126 else if(level==OVERLOAD_LEVEL3){
127 if(argType.GetBasicType()==DEF_OBJECT||param.GetBasicType()==DEF_OBJECT) return 0;
128 }
129 }
130 else{
131 if(NATURAL_TYPE(argType.GetBasicType())==DEF_OBJECT || NATURAL_TYPE(argType.GetBasicType())==DEF_STRUCT){
132 if(argType.GetIndex()!=param.GetIndex()){
133 return false;
134 }
135 }
136 }
137 }
138
139 if( !targetResultType.IsNull() ){
140 //戻り値も比較対象にする
141 if( !returnType.Equals( targetResultType ) ){
142 return false;
143 }
144 }
145
146 return true;
147}
148
149UserProc *ParamImpl::OverloadSolutionWithReturnType( const char *name, std::vector<UserProc *> &subs ){
150 int sw=0;
151 UserProc *pUserProc = NULL;
152
153 for( int level=OVERLOAD_MIN_LEVEL; level<=OVERLOAD_MAX_LEVEL; level++ ){
154 foreach( UserProc *pTempUserProc, subs ){
155
156 //エラーチェック
157 if(_overload_check( level, pTempUserProc->Params(), pTempUserProc->ReturnType() )){
158 if(sw){
159 SetError(52,name,cp);
160 return 0;
161 }
162 sw=1;
163
164 pUserProc = pTempUserProc;
165 break;
166 }
167 }
168
169 if( sw ) break;
170 }
171
172 if(!sw){
173 SetError(52,name,cp);
174 return 0;
175 }
176
177 return pUserProc;
178}
179UserProc *ParamImpl::OverloadSolution( const char *name, std::vector<UserProc *> &subs ){
180 int sw=0;
181 UserProc *pUserProc;
182 pUserProc=0;
183
184 for( int level=OVERLOAD_MIN_LEVEL; level<=OVERLOAD_MAX_LEVEL; level++ ){
185
186 foreach( UserProc *pTempUserProc, subs ){
187
188 //エラーチェック
189 if(_overload_check( level, pTempUserProc->Params(), Type() )){
190 if(sw){
191 return OverloadSolutionWithReturnType(name,subs);
192 }
193 sw=1;
194
195 pUserProc = pTempUserProc;
196 }
197 }
198
199 if( sw ) break;
200 }
201
202 if(!sw){
203 foreach( UserProc *pTempUserProc, subs ){
204
205 //エラーチェック
206 if(pTempUserProc->Params().size()==this->ParmsNum){
207 if(sw){
208 sw=0;
209 break;
210 }
211 sw=1;
212
213 pUserProc=pTempUserProc;
214 }
215 }
216 }
217
218 if(!sw){
219 SetError(52,name,cp);
220 return 0;
221 }
222
223 return pUserProc;
224}
225
226bool ParamImpl::ErrorCheck( const string &procName, const Parameters &params, int SecondParmNum ){
227 if( SecondParmNum == -1 ) SecondParmNum = (int)params.size();
228
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 }
241
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.