source: dev/BasicCompiler_Common/VariableOpe.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: 29.0 KB
Line 
1#include "../BasicCompiler_Common/common.h"
2
3#ifdef _AMD64_
4#include "../BasicCompiler64/opcode.h"
5#else
6#include "../BasicCompiler32/opcode.h"
7#endif
8
9BOOL IsVariableTopChar(char c){
10 if((c>='A'&&c<='Z')||(c>='a'&&c<='z')||c=='_') return 1;
11 return 0;
12}
13BOOL IsVariableChar(char c){
14 if((c>='A'&&c<='Z')||(c>='a'&&c<='z')||(c>='0'&&c<='9')||
15 c=='%'||c=='!'||c=='#'||c=='$'||
16 c=='_'||c=='.') return 1;
17 return 0;
18}
19BOOL IsPtrType(int type){
20 if(type==-1) return 0;
21
22 if(PTR_LEVEL(type)||type==DEF_PTR_VOID||type==DEF_PTR_PROC||
23 (type&FLAG_PTR) ) return 1;
24
25 return 0;
26}
27BOOL IsSignedType(int type){
28 switch(type){
29 case DEF_SBYTE:
30 case DEF_INTEGER:
31 case DEF_LONG:
32 case DEF_INT64:
33 case DEF_SINGLE:
34 case DEF_DOUBLE:
35 case DEF_CHAR:
36 return 1;
37 default:
38 break;
39 }
40 return 0;
41}
42BOOL IsNaturalWholeNumberType(int type){
43 switch(type){
44 case DEF_SBYTE:
45 case DEF_BYTE:
46 case DEF_INTEGER:
47 case DEF_WORD:
48 case DEF_LONG:
49 case DEF_DWORD:
50 case DEF_INT64:
51 case DEF_QWORD:
52 case DEF_CHAR:
53 return 1;
54 default:
55 break;
56 }
57 return 0;
58}
59BOOL IsWholeNumberType(int type){
60 return (
61 IsNaturalWholeNumberType(type)
62 || IsPtrType(type)
63 || type == DEF_BOOLEAN
64 );
65}
66BOOL IsRealNumberType(int type){
67 switch(type){
68 case DEF_DOUBLE:
69 case DEF_SINGLE:
70 return 1;
71 default:
72 break;
73 }
74 return 0;
75}
76BOOL Is64Type(int type){
77 switch(type){
78 case DEF_INT64:
79 case DEF_QWORD:
80 return 1;
81 default:
82 break;
83 }
84#ifdef _AMD64_
85 return IsPtrType(type);
86#else
87 return 0;
88#endif
89}
90int GetSignedType(int type){
91 switch(type){
92 case DEF_BYTE:
93 return DEF_SBYTE;
94 case DEF_WORD:
95 return DEF_INTEGER;
96 case DEF_DWORD:
97 return DEF_LONG;
98 case DEF_QWORD:
99 return DEF_INT64;
100 default:
101 break;
102 }
103#ifdef _AMD64_
104 if(IsPtrType(type)) return DEF_INT64;
105#else
106 if(IsPtrType(type)) return DEF_LONG;
107#endif
108 return type;
109}
110int GetUnsignedType(int type){
111 switch(type){
112 case DEF_SBYTE:
113 return DEF_BYTE;
114 case DEF_INTEGER:
115 return DEF_WORD;
116 case DEF_LONG:
117 return DEF_DWORD;
118 case DEF_INT64:
119 return DEF_QWORD;
120 case DEF_CHAR:
121 if( isUnicode ) return DEF_WORD;
122 return DEF_BYTE;
123 }
124 return type;
125}
126int GetTypeSize(int type,LONG_PTR lpIndex){
127 if(type==DEF_LONG){
128 if(lpIndex==LITERAL_NULL||lpIndex==LITERAL_M128_0||lpIndex==LITERAL_0_255)
129 return sizeof(BYTE);
130 else if(lpIndex==LITERAL_M32768_0||lpIndex==LITERAL_0_65535)
131 return sizeof(WORD);
132
133 return sizeof(DWORD);
134 }
135
136 //整数型
137 if(type==DEF_INT64||type==DEF_QWORD)
138 return sizeof(_int64);
139 else if(type==DEF_LONG||type==DEF_DWORD)
140 return sizeof(DWORD);
141 else if(type==DEF_INTEGER||type==DEF_WORD)
142 return sizeof(WORD);
143 else if(type==DEF_SBYTE||type==DEF_BYTE || type == DEF_BOOLEAN)
144 return sizeof(BYTE);
145
146 //実数型
147 else if(type==DEF_DOUBLE) return sizeof(double);
148 else if(type==DEF_SINGLE) return sizeof(float);
149
150 //文字型
151 else if( type == DEF_CHAR ){
152 if( isUnicode ) return sizeof( WORD );
153 return sizeof( BYTE );
154 }
155
156 //ポインタ型
157 else if(IsPtrType(type)) return PTR_SIZE;
158
159 else if( type == DEF_STRUCT ){
160 if(lpIndex == 0 || lpIndex == -1){
161 SetError(300,NULL,cp);
162 return 0;
163 }
164
165 const CClass *pobj_c=(CClass *)lpIndex;
166
167 return pobj_c->GetSize();
168 }
169
170 else if(type==DEF_OBJECT){
171 return PTR_SIZE;
172 }
173 else{
174 SetError(300,NULL,cp);
175 }
176 return 0;
177}
178int GetPtrType(int type){
179 return MAKE_PTR_TYPE(NATURAL_TYPE(type),PTR_LEVEL(type)+1);
180}
181int GetTypeFixed(const char *TypeName,LONG_PTR *lpNum){
182 int type;
183
184 if(lpNum) *lpNum=-1;
185
186 if(TypeName[0]=='*'){
187 if(TypeName[1]==1&&(TypeName[2]==ESC_FUNCTION||TypeName[2]==ESC_SUB)){
188 //関数ポインタ(*Function)
189 return DEF_PTR_PROC;
190 }
191
192 type=GetTypeFixed(TypeName+1,lpNum);
193 if(type==-1) return -1;
194
195 return GetPtrType(type);
196 }
197
198 //整数型
199 if(lstrcmpi(TypeName,"SByte")==0) return DEF_SBYTE;
200 else if(lstrcmpi(TypeName,"Byte")==0) return DEF_BYTE;
201 else if(lstrcmpi(TypeName,"Integer")==0) return DEF_INTEGER;
202 else if(lstrcmpi(TypeName,"WORD")==0) return DEF_WORD;
203 else if(lstrcmpi(TypeName,"Long")==0) return DEF_LONG;
204 else if(lstrcmpi(TypeName,"DWORD")==0) return DEF_DWORD;
205 else if(lstrcmpi(TypeName,"Int64")==0) return DEF_INT64;
206 else if(lstrcmpi(TypeName,"QWORD")==0) return DEF_QWORD;
207
208 //実数型
209 else if(lstrcmpi(TypeName,"Single")==0) return DEF_SINGLE;
210 else if(lstrcmpi(TypeName,"Double")==0) return DEF_DOUBLE;
211
212 //文字型
213 //else if( lstrcmpi( TypeName, "Char" ) == 0 ) return DEF_CHAR;
214
215 //bool型
216 else if( lstrcmpi( TypeName, "Boolean" ) == 0 ) return DEF_BOOLEAN;
217
218 //ポインタ型
219 //※VoidPtr型以外のポインタ型はTypeDef宣言により定義される
220 else if(lstrcmpi(TypeName,"VoidPtr")==0) return DEF_PTR_VOID;
221
222 //その他
223 else if(lstrcmpi(TypeName,"Any")==0) return DEF_ANY;
224
225
226 ////////////////////
227 // TypeDefされた型
228 ////////////////////
229 int i;
230 i=pobj_DBTypeDef->check(TypeName);
231 if(i!=-1){
232 return GetTypeFixed(pobj_DBTypeDef->ppobj_TypeDef[i]->lpszBaseName,lpNum);
233 }
234
235 if(!lpNum) return -1;
236
237 //クラス
238 CClass *pobj_c;
239 pobj_c=pobj_DBClass->check(TypeName);
240 if(pobj_c){
241 *lpNum=(LONG_PTR)pobj_c;
242
243 if( pobj_c->IsStructure() ){
244 return DEF_STRUCT;
245 }
246 else{
247 return DEF_OBJECT;
248 }
249 }
250
251 return -1;
252}
253void GetOriginalTypeName(char *buffer){
254 // TypeDefされた型に対して、オリジナルの型の名前に変更する
255
256 if(buffer[0]=='*'){
257 if(buffer[1]==1&&(buffer[2]==ESC_FUNCTION||buffer[2]==ESC_SUB)) return;
258
259 GetOriginalTypeName(buffer+1);
260 return;
261 }
262
263 int i;
264 i=pobj_DBTypeDef->check(buffer);
265 if(i!=-1){
266 lstrcpy(buffer,pobj_DBTypeDef->ppobj_TypeDef[i]->lpszBaseName);
267 GetOriginalTypeName(buffer);
268 }
269}
270BOOL GetTypeName(int type,LONG_PTR lpIndex,char *name){
271 if(PTR_LEVEL(type)){
272 //ポインタ型
273 name[0]='*';
274 return GetTypeName(MAKE_PTR_TYPE(NATURAL_TYPE(type),PTR_LEVEL(type)-1),lpIndex,name+1);
275 }
276
277 //整数型
278 if(type==DEF_SBYTE) lstrcpy(name,"SByte");
279 else if(type==DEF_BYTE) lstrcpy(name,"Byte");
280 else if(type==DEF_INTEGER) lstrcpy(name,"Integer");
281 else if(type==DEF_WORD) lstrcpy(name,"Word");
282 else if(type==DEF_LONG) lstrcpy(name,"Long");
283 else if(type==DEF_DWORD) lstrcpy(name,"DWord");
284 else if(type==DEF_INT64) lstrcpy(name,"Int64");
285 else if(type==DEF_QWORD) lstrcpy(name,"QWord");
286
287 //実数型
288 else if(type==DEF_SINGLE) lstrcpy(name,"Single");
289 else if(type==DEF_DOUBLE) lstrcpy(name,"Double");
290
291 //文字型
292 //else if(type==DEF_CHAR) lstrcpy(name,"Char");
293
294 //bool型
295 else if(type==DEF_BOOLEAN) lstrcpy(name,"Boolean");
296
297 //オブジェクト
298 else if(type==DEF_OBJECT || type==DEF_STRUCT){
299 if(lpIndex==0) lstrcpy(name,"non");
300 else{
301 lstrcpy(name,((CClass *)lpIndex)->name);
302 }
303 }
304
305 //ポインタ型
306 else if(type==DEF_PTR_VOID) lstrcpy(name,"VoidPtr");
307
308 else if(type==DEF_PTR_PROC){
309 if(lpIndex==-1) lstrcpy(name,"VoidPtr");
310 else{
311 extern ProcPointer **ppProcPointer;
312 if( ppProcPointer[lpIndex]->ReturnType().IsNull() )
313 lstrcpy(name,"*Sub");
314 else lstrcpy(name,"*Function");
315 }
316 }
317
318 else{
319 extern int cp;
320 SetError(1,NULL,cp);
321 return 0;
322 }
323 return 1;
324}
325
326Type GetStringTypeInfo(){
327 extern CClass *pobj_StringClass;
328 Type type( DEF_OBJECT, *pobj_StringClass );
329 return type;
330}
331
332bool FormatUseProcReturnObject( const char *term, char *procName, char *parameter, CClass::RefType &refType, char *member ){
333 int p1 = 0, p2 = 0;
334
335 for( int i=0; term[i]!='\0' ; i++ ){
336
337 if( term[i] == '[' ){
338 i = JumpStringInBracket( term, i + 1 );
339 if( term[i] == '\0' ) break;
340 continue;
341 }
342 if( term[i] == '(' ){
343 int temp_p = i;
344 i = JumpStringInPare( term, i + 1 ) + 1;
345 if( term[i] == '\0' ) break;
346 if( term[i] == '.'
347 || term[i] == 1 && term[i] == ESC_PSMEM ){
348 p1 = temp_p;
349 p2 = i;
350 }
351 continue;
352 }
353 }
354 if( !p1 ) return false;
355
356 //メソッド名
357 memcpy( procName, term, p1 );
358 procName[p1] = 0;
359
360 //パラメータ
361 memcpy( parameter, term + p1 + 1, p2 - p1 - 2 );
362 parameter[ p2 - p1 - 2 ] = 0;
363
364 //参照タイプ
365 if( term[p2] == '.' ){
366 refType = CClass::Dot;
367 }
368 else{
369 refType = CClass::Pointer;
370 p2++;
371 }
372
373 //メンバ
374 lstrcpy( member, term + p2 + 1 );
375
376 return true;
377}
378
379BOOL GetVarFormatString(char *buffer,char *array,char *array2,char *NestMember,CClass::RefType &refType){
380 extern int cp;
381 int i,i2,i3;
382 char cPare_Open,cPare_Close;
383
384 array[0]=0;
385 array2[0]=0;
386 NestMember[0]=0;
387 for(i=0;;i++){
388 if(buffer[i]=='\"'){
389 for(i++;;i++){
390 if(IsDBCSLeadByte(buffer[i])){
391 i++;
392 continue;
393 }
394 if(buffer[i]=='\"') break;
395 }
396 }
397 if(buffer[i]=='['||buffer[i]=='('){
398 if(buffer[i]=='['){
399 cPare_Open='[';
400 cPare_Close=']';
401 }
402 else{
403 cPare_Open='(';
404 cPare_Close=')';
405 }
406 buffer[i]=0;
407 for(i++,i2=0;;i++,i2++){
408 if(buffer[i]==cPare_Open){
409 if(cPare_Open=='[') i3=GetStringInBracket(array+i2,buffer+i);
410 else i3=GetStringInPare(array+i2,buffer+i);
411 i+=i3-1;
412 i2+=i3-1;
413 continue;
414 }
415 if(buffer[i]==cPare_Close){
416 array[i2]=0;
417 break;
418 }
419 array[i2]=buffer[i];
420 }
421 if(buffer[i+1]==cPare_Open){
422 for(i+=2,i2=0;;i++,i2++){
423 if(buffer[i]==cPare_Open){
424 if(cPare_Open=='[') i3=GetStringInBracket(array2+i2,buffer+i);
425 else i3=GetStringInPare(array2+i2,buffer+i);
426 i+=i3-1;
427 i2+=i3-1;
428 continue;
429 }
430 if(buffer[i]==cPare_Close){
431 array2[i2]=0;
432 break;
433 }
434 array2[i2]=buffer[i];
435 }
436 if(buffer[i+1]==cPare_Open){
437 SetError(14,buffer,cp);
438 return 0;
439 }
440 }
441 continue;
442 }
443 if(buffer[i]=='.'){
444 lstrcpy(NestMember,buffer+i+1);
445 refType = CClass::Dot;
446 buffer[i]=0;
447 break;
448 }
449 if(buffer[i]==1&&buffer[i+1]==ESC_PSMEM){
450 lstrcpy(NestMember,buffer+i+2);
451 refType = CClass::Pointer;
452 buffer[i]=0;
453 break;
454 }
455 if(buffer[i]=='\0') break;
456 }
457 return 1;
458}
459
460void GetArrayElement( const char *buffer,char *variable,char *array_element){
461 array_element[0]=0;
462
463 if(buffer[lstrlen(buffer)-1]!=']'){
464 lstrcpy(variable,buffer);
465 return;
466 }
467
468 int i,i2;
469 for(i=0;;i++){
470 if(buffer[i]=='\0') break;
471 if(buffer[i]=='['){
472 i2=GetStringInBracket(array_element,buffer+i);
473 i+=i2-1;
474 continue;
475 }
476 }
477
478 lstrcpy(variable,buffer);
479 variable[lstrlen(variable)-lstrlen(array_element)]=0;
480
481 RemoveStringBracket(array_element);
482}
483
484BOOL CheckVarNameError(char *name,int nowLine){
485 int i2;
486
487 if(!IsVariableTopChar(name[0])){
488 SetError(1,NULL,nowLine);
489 return 0;
490 }
491 for(i2=1;;i2++){
492 if(name[i2]=='\0') break;
493 if(!IsVariableChar(name[i2])){
494 SetError(1,NULL,nowLine);
495 return 0;
496 }
497 }
498 return 1;
499}
500
501int JumpSubScripts(const int *ss){
502 //DIMで定義された並んだ配列の数だけアドレスを進める
503 int i,i2;
504 for(i=0,i2=1;i<255;i++){
505 if(ss[i]==-1) break;
506 i2*=ss[i]+1;
507 }
508 return i2;
509}
510void GetArrange(char *variable,char *variAnswer,int *SubScripts){
511 extern int cp;
512 int i,i2,i3,i4;
513 double dbl;
514 _int64 i64data;
515 BOOL bBracket;
516 char temporary[VN_SIZE];
517
518 for(i=0;;i++){
519 if(variable[i]=='('||variable[i]=='['){
520 if(variable[i]=='[') bBracket=1;
521 else bBracket=0;
522
523 variAnswer[i]=0;
524 for(i++,i2=0,i3=0;;i++,i2++){
525 if(variable[i]==','){
526 temporary[i2]=0;
527
528 Type resultType;
529 if( !StaticCalculation(true, temporary,0,&i64data,resultType) ){
530 return;
531 }
532 if(resultType.IsReal()){
533 memcpy(&dbl,&i64data,sizeof(double));
534 i64data=(_int64)dbl;
535 }
536
537 if(i64data<0){
538 //error
539 SubScripts[i3]=0;
540 }
541 else SubScripts[i3]=(int)i64data;
542 i3++;
543 i2=-1;
544 continue;
545 }
546 if(variable[i]=='('){
547 i4=GetStringInPare(temporary+i2,variable+i);
548 i2+=i4-1;
549 i+=i4-1;
550 continue;
551 }
552 if(variable[i]=='['){
553 i4=GetStringInBracket(temporary+i2,variable+i);
554 i2+=i4-1;
555 i+=i4-1;
556 continue;
557 }
558 if(variable[i]==')'&&bBracket==0||
559 variable[i]==']'&&bBracket){
560 temporary[i2]=0;
561 if(i2==0){
562 SubScripts[i3]=-2;
563 break;
564 }
565
566 Type resultType;
567 if( !StaticCalculation(true, temporary,0,&i64data,resultType) ){
568 return;
569 }
570 if(resultType.IsReal()){
571 memcpy(&dbl,&i64data,sizeof(double));
572 i64data=(_int64)dbl;
573 }
574
575 if(i64data<0){
576 //error
577 SubScripts[i3]=0;
578 }
579 else SubScripts[i3]=(int)i64data;
580 SubScripts[i3+1]=-1;
581 break;
582 }
583 if(variable[i]=='\"'){
584 SetError(1,NULL,cp);
585 return;
586 }
587 temporary[i2]=variable[i];
588 }
589 break;
590 }
591 variAnswer[i]=variable[i];
592 if(variable[i]=='\0'){
593 SubScripts[0]=-1;
594 break;
595 }
596 }
597}
598
599int GetTypeFromSimpleName(char *variable){
600 extern char DefIntVari[26],DefSngVari[26],DefStrVari[26],divNum,dsvNum,dStrvNum;
601 int i;
602 char name[VN_SIZE];
603
604 //構造体メンバの場合を考慮
605 for(i=lstrlen(variable);i>0;i--){
606 if(variable[i]=='.'){
607 i++;
608 break;
609 }
610 }
611
612 for(;;i++){
613 if(variable[i]=='('||variable[i]=='\0'){
614 name[i]=0;
615 break;
616 }
617 name[i]=variable[i];
618 }
619 //変数名から選択
620 i--;
621 if(name[i]=='#') return DEF_DOUBLE;
622 if(name[i]=='!') return DEF_SINGLE;
623 if(name[i]=='%') return DEF_INTEGER;
624 return DEF_DOUBLE;
625}
626
627
628bool GetMemberType( const CClass &objClass, const char *lpszMember, Type &resultType, BOOL bPrivateAccess, bool isErrorEnabled){
629 extern int cp;
630 int i;
631
632 //クラス、配列の構成要素を解析する
633 char VarName[VN_SIZE]; //変数名
634 char array[VN_SIZE]; //第1次配列
635 char lpPtrOffset[VN_SIZE]; //第2次配列
636 char NestMember[VN_SIZE]; //入れ子メンバ
637 CClass::RefType refType = CClass::Non;
638 lstrcpy(VarName,lpszMember);
639 if(!GetVarFormatString(VarName,array,lpPtrOffset,NestMember,refType)) return false;
640
641 for(i=0;i<objClass.iMemberNum;i++){
642 if(lstrcmp(objClass.ppobj_Member[i]->name,VarName)==0) break;
643 }
644 if(i==objClass.iMemberNum){
645 if(isErrorEnabled) SetError(103,VarName,cp);
646 return false;
647 }
648
649 //アクセシビリティをチェック
650 if( &objClass == pobj_CompilingClass ){
651 //同一クラスオブジェクトの場合はプライベートアクセスを容認する
652 if(objClass.ppobj_Member[i]->dwAccess==ACCESS_NON){
653 if(isErrorEnabled) SetError(107,VarName,cp);
654 return false;
655 }
656 }
657 else{
658 if((bPrivateAccess==0&&objClass.ppobj_Member[i]->dwAccess==ACCESS_PRIVATE)||
659 objClass.ppobj_Member[i]->dwAccess==ACCESS_NON){
660 if(isErrorEnabled) SetError(107,VarName,cp);
661 return false;
662 }
663 else if(bPrivateAccess==0&&objClass.ppobj_Member[i]->dwAccess==ACCESS_PROTECTED){
664 if(isErrorEnabled) SetError(108,VarName,cp);
665 return false;
666 }
667 }
668
669 resultType = *objClass.ppobj_Member[i];
670
671 //ポインタ変数の場合
672 if( resultType.IsPointer() ){
673 if(objClass.ppobj_Member[i]->SubScripts[0]==-1){
674 lstrcpy(lpPtrOffset,array);
675 array[0]=0;
676 }
677 }
678 else{
679 if(lpPtrOffset[0]){
680 if(isErrorEnabled) SetError(16,lpszMember,cp);
681 return false;
682 }
683 }
684
685 if( refType != CClass::Non ){
686 //入れ子構造の場合
687
688 return GetMemberType( objClass.ppobj_Member[i]->GetClass(),
689 NestMember,
690 resultType,
691 0,
692 isErrorEnabled);
693 }
694
695 if(array[0]==0&&objClass.ppobj_Member[i]->SubScripts[0]!=-1){
696 resultType.SetBasicType( resultType.GetBasicType() | FLAG_PTR );
697 return true;
698 }
699
700 if(lpPtrOffset[0]){
701 if( resultType.PtrLevel() ){
702 resultType.PtrLevelDown();
703 }
704 else{
705 //エラー
706 if(isErrorEnabled) SetError(1,NULL,cp);
707 return false;
708 }
709 }
710
711 return true;
712}
713bool GetVarType( const char *nameBuffer, Type &resultType, bool isErrorEnabled){
714 int i;
715 char variable[VN_SIZE],member[VN_SIZE],VarName[VN_SIZE],array[VN_SIZE],lpPtrOffset[VN_SIZE];
716
717 if(nameBuffer[0]=='.'){
718 GetWithName(variable);
719 lstrcat(variable,nameBuffer);
720 }
721 else lstrcpy(variable,nameBuffer);
722
723
724 CClass::RefType refType;
725 if( FormatUseProcReturnObject( variable, VarName, array, refType, member ) ){
726 // 戻り値オブジェクトのメンバを直接参照しているとき
727 //例: func().member
728
729 void *pProc;
730 int idProc=GetProc(VarName,(void **)&pProc);
731
732 if(idProc){
733 Type type;
734 if( !CallProc( idProc, pProc, VarName, array,type, false) ){
735 return false;
736 }
737
738 return GetMemberType( type.GetClass() ,member,resultType,1,isErrorEnabled);
739 }
740 }
741
742
743
744 lstrcpy(VarName,variable);
745 GetVarFormatString(VarName,array,lpPtrOffset,member,refType);
746
747 const Variable *pVar = NULL;
748 const int *pSubScripts;
749
750 if( UserProc::IsLocalAreaCompiling() ){
751 /////////////////
752 // ローカル変数
753 /////////////////
754
755 pVar = UserProc::CompilingUserProc().localVars.BackSearch( VarName );
756 if( pVar ){
757 goto ok;
758 }
759 }
760
761 if(pobj_CompilingClass){
762 ///////////////////////
763 // クラスメンバの参照
764 ///////////////////////
765
766 if(lstrcmpi(variable,"This")==0){
767 //Thisオブジェクト
768 resultType.SetType( DEF_OBJECT, pobj_CompilingClass );
769 return true;
770 }
771
772 if(_memicmp(variable,"This.",5)==0){
773 //Thisオブジェクトのメンバを参照するとき
774 SlideString(variable+5,-5);
775 lstrcpy(VarName,variable);
776 }
777 else{
778 //クラス内メンバを参照するとき(通常)
779
780 for(i=0;i<pobj_CompilingClass->iMemberNum;i++){
781 if(lstrcmp(VarName,pobj_CompilingClass->ppobj_Member[i]->name)==0) break;
782 }
783 if(i==pobj_CompilingClass->iMemberNum) goto NonClassMember;
784 }
785
786 return GetMemberType(*pobj_CompilingClass,variable,resultType,1,isErrorEnabled);
787 }
788
789NonClassMember:
790
791 //////////////////////////
792 // 静的ローカル変数
793 // ※"Static.Object.Method.Variable"
794 //////////////////////////
795
796 char temporary[VN_SIZE];
797 if( UserProc::IsLocalAreaCompiling() ){
798 GetNowStaticVarFullName(VarName,temporary);
799
800 pVar = globalVars.Find( temporary );
801 if( pVar ){
802 goto ok;
803 }
804 }
805
806
807 //////////////////////////
808 // クラスの静的メンバ
809 //////////////////////////
810
811 if(member[0]){
812 lstrcpy(temporary,member);
813 char tempMember[VN_SIZE];
814 char tempArray[VN_SIZE];
815 {
816 CClass::RefType refType;
817 GetVarFormatString(temporary,tempArray,lpPtrOffset,tempMember,refType);
818 }
819
820 char temp2[VN_SIZE];
821 sprintf(temp2,"%s.%s",VarName,temporary);
822
823 pVar = globalVars.Find( temp2 );
824 if( pVar ){
825 lstrcpy(member,tempMember);
826 lstrcpy(array,tempArray);
827 goto ok;
828 }
829 }
830
831 if(pobj_CompilingClass){
832 //自身のクラスから静的メンバを参照する場合
833 char temp2[VN_SIZE];
834 sprintf(temp2,"%s.%s",pobj_CompilingClass->name,VarName);
835
836 pVar = globalVars.Find( temp2 );
837 if( pVar ){
838 goto ok;
839 }
840 }
841
842
843 ////////////////////
844 // グローバル変数
845 ////////////////////
846
847 pVar = globalVars.BackSearch( VarName );
848 if( pVar ){
849 goto ok;
850 }
851
852 //変数として見つからなかったとき
853 if(isErrorEnabled) SetError(3,variable,cp);
854 return false;
855
856ok:
857
858 //ポインタ変数の場合
859 if( pVar->IsPointer() ){
860 if( !pVar->IsArray() ){
861 lstrcpy(lpPtrOffset,array);
862 array[0]=0;
863 }
864 }
865 else{
866 if(lpPtrOffset[0]){
867 if(isErrorEnabled) SetError(16,variable,cp);
868 return false;
869 }
870 }
871
872 resultType = (*pVar);
873 pSubScripts=pVar->GetSubScriptsPtr();
874
875
876 if(member[0]){
877 if( NATURAL_TYPE( resultType.GetBasicType() )==DEF_OBJECT
878 || NATURAL_TYPE( resultType.GetBasicType() )==DEF_STRUCT){
879 return GetMemberType(resultType.GetClass(),member,resultType,0,isErrorEnabled);
880 }
881 }
882
883 if(array[0]==0&&pSubScripts[0]!=-1){
884 //配列の先頭ポインタを示す場合
885 resultType.SetBasicType( resultType.GetBasicType() | FLAG_PTR );
886 }
887
888 if(lpPtrOffset[0]){
889 if( resultType.PtrLevel() ){
890 resultType.PtrLevelDown();
891 }
892 else{
893 //エラー
894 if(isErrorEnabled) SetError(1,NULL,cp);
895 return false;
896 }
897 }
898
899 return true;
900}
901
902bool GetVarOffsetReadOnly(const char *NameBuffer,RELATIVE_VAR *pRelativeVar,Type &resultType,int *pss ){
903 //読み取り専用で変数へアクセス
904 return GetVarOffset(
905 true, //エラー表示有効
906 false, //書き込みアクセスは無し
907 NameBuffer,
908 pRelativeVar,
909 resultType,
910 pss);
911}
912bool GetVarOffsetReadWrite(const char *NameBuffer,RELATIVE_VAR *pRelativeVar,Type &resultType,int *pss ){
913 //読み書き両用で変数へアクセス
914 return GetVarOffset(
915 true, //エラー表示有効
916 true, //書き込みアクセス
917 NameBuffer,
918 pRelativeVar,
919 resultType,
920 pss);
921}
922
923
924
925bool GetDimentionFormat( const char *buffer,
926 char *VarName,
927 int *SubScripts,
928 Type &type,
929 char *InitBuf,
930 char *ConstractParameter ){
931 int i,i2,i3,IsStr;
932 char variable[VN_SIZE],temporary[8192];
933
934 for(i=0;;i++){
935 if((buffer[i]==1&&buffer[i+1]==ESC_AS)||
936 buffer[i]=='='||
937 buffer[i]=='\0'){
938 variable[i]=0;
939 break;
940 }
941 variable[i]=buffer[i];
942 }
943
944 if(buffer[i]=='='){
945 ////////////////////////////////////
946 // 初期化データが指定されいるとき
947 ////////////////////////////////////
948
949 for(i++,i2=0,IsStr=0;;i++,i2++){
950 if(buffer[i]=='\"') IsStr^=1;
951 if(buffer[i]=='('&&IsStr==0){
952 i3=GetStringInPare(InitBuf+i2,buffer+i);
953 i+=i3-1;
954 i2+=i3-1;
955 continue;
956 }
957 if(buffer[i]=='['&&IsStr==0){
958 i3=GetStringInBracket(InitBuf+i2,buffer+i);
959 i+=i3-1;
960 i2+=i3-1;
961 continue;
962 }
963 if((buffer[i]==1&&buffer[i+1]==ESC_AS)||
964 (buffer[i]==','&&IsStr==0)||
965 buffer[i]=='\0'){
966 InitBuf[i2]=0;
967 break;
968 }
969 InitBuf[i2]=buffer[i];
970 }
971 }
972 else{
973 //初期化データなし
974 InitBuf[0]=0;
975 }
976
977 ConstractParameter[0]=0;
978 if(buffer[i]==1&&buffer[i+1]==ESC_AS){
979 /////////////////////////////
980 // "As ~" による型指定あり
981 /////////////////////////////
982
983 for(i+=2,i2=0;;i++,i2++){
984 if(buffer[i]==','||buffer[i]=='('||buffer[i]=='\0'){
985 temporary[i2]=0;
986 break;
987 }
988 temporary[i2]=buffer[i];
989 }
990 if( !Type::StringToType( temporary, type ) ){
991 SetError(3,temporary,cp);
992 type.SetBasicType( DEF_LONG );
993 }
994
995 if( type.IsProcPtr() ){
996 if(temporary[0]=='*'&&
997 temporary[1]==1&&
998 (temporary[2]==ESC_FUNCTION||temporary[2]==ESC_SUB)){
999 if(buffer[i]!='('){
1000 SetError(10,temporary,cp);
1001 return false;
1002 }
1003 i3=GetStringInPare(temporary+3,buffer+i);
1004 i+=i3;
1005 i2+=i3;
1006
1007 if(temporary[2]==ESC_FUNCTION&&buffer[i]==1&&buffer[i+1]==ESC_AS){
1008 temporary[i2++]=buffer[i++];
1009 temporary[i2++]=buffer[i++];
1010 for(;;i++,i2++){
1011 if(!IsVariableChar(buffer[i])){
1012 temporary[i2]=0;
1013 break;
1014 }
1015 temporary[i2]=buffer[i];
1016 }
1017 }
1018 }
1019 else{
1020 //TypeDefをする前のベース型を取得
1021 GetOriginalTypeName(temporary);
1022 }
1023
1024 if(temporary[3]!='('){
1025 SetError(10,temporary,cp);
1026 return false;
1027 }
1028
1029 //関数ポインタ
1030 type.SetIndex( AddProcPtrInfo(temporary+3,temporary[2], cp) );
1031 }
1032
1033 if(buffer[i]=='('){
1034 //コンストラクタに渡すパラメータを取得
1035 i2=GetStringInPare(ConstractParameter,buffer+i);
1036 i+=i2;
1037 RemoveStringPare(ConstractParameter);
1038
1039 if( !type.IsObject() ){
1040 SetError(112,variable,cp);
1041 return false;
1042 }
1043 }
1044 }
1045 else{
1046 /////////////////
1047 // As指定なし
1048 /////////////////
1049
1050 if( InitBuf[0] == '\0' ){
1051 //As指定も、初期値指定もない場合
1052 type.SetBasicType( GetTypeFromSimpleName(variable) );
1053
1054 i2=lstrlen(variable)-1;
1055 if(i2>=0){
1056 if(!(variable[i2]=='#'||variable[i2]=='!'||variable[i2]=='%'||variable[i2]=='$'))
1057 SetError(-103,variable,cp);
1058 }
1059 }
1060 else{
1061 //初期値の型を判別して自動的に型情報を付加する
1062 if( !NumOpe_GetType( InitBuf, GetStringTypeInfo(), type ) ){
1063 // エラーの場合
1064 return false;
1065 }
1066 }
1067
1068 }
1069
1070 if( InitBuf[0] != '\0' && ConstractParameter[0] != '\0' ){
1071 //初期値とコンストラクタパラメータが同時に呼び出されているとき
1072 SetError(132, NULL, cp);
1073 }
1074
1075 GetArrange(variable,VarName,SubScripts);
1076 return true;
1077}
1078
1079BOOL GetNowStaticVarFullName(char *VarName,char *FullName){
1080 if( UserProc::IsGlobalAreaCompiling() ){
1081 // グローバル領域をコンパイル中のとき
1082 return 0;
1083 }
1084
1085 UserProc &proc = UserProc::CompilingUserProc();
1086
1087 //Static識別
1088 lstrcpy(FullName,"Static%");
1089
1090 //クラス名
1091 if(pobj_CompilingClass){
1092 lstrcat(FullName,pobj_CompilingClass->name);
1093 lstrcat(FullName,"%");
1094 }
1095
1096 //関数(またはメソッド)名
1097 lstrcat(FullName,proc.GetName().c_str());
1098 lstrcat(FullName,"%");
1099
1100 //ID
1101 char temp[255];
1102 sprintf(temp,"%x",proc.id);
1103 lstrcat(FullName,temp);
1104 lstrcat(FullName,"%");
1105
1106 //変数名
1107 lstrcat(FullName,VarName);
1108
1109 return 1;
1110}
1111
1112
1113void AddGlobalVariable(bool isRef, const char *name,int *SubScripts, const Type &type,char *InitBuf,char *ConstractParameter,DWORD dwFlag){
1114 /////////////////////////
1115 // グローバル変数を追加
1116 /////////////////////////
1117 extern int MaxGlobalVarNum;
1118 extern int AllInitGlobalVarSize;
1119 extern int AllGlobalVarSize;
1120
1121 if( globalVars.DuplicateCheck( name ) ){
1122 //2重定義のエラー
1123 SetError(15,name,cp);
1124 return;
1125 }
1126
1127 bool isConst = ( dwFlag & DIMFLAG_CONST ) ? true:false;
1128
1129 Variable *pVar = new Variable( name, type, isConst, isRef );
1130
1131 if( SubScripts[0] != -1 ){
1132 //配列あり
1133 pVar->SetArray( SubScripts );
1134 }
1135
1136 //コンストラクタ用パラメータ
1137 pVar->paramStrForConstructor = ConstractParameter;
1138
1139 //レキシカルスコープ
1140 pVar->ScopeLevel=obj_LexScopes.GetNowLevel();
1141 pVar->ScopeStartAddress=obj_LexScopes.GetStartAddress();
1142 pVar->bLiving=TRUE;
1143
1144 //エラー用
1145 pVar->source_code_address=cp;
1146
1147 // 変数を追加
1148 globalVars.push_back( pVar );
1149
1150 //アラインメントを考慮
1151 int alignment = 0;
1152 if( pVar->IsStruct() ){
1153 alignment = pVar->GetClass().iAlign;
1154 }
1155
1156 if(InitBuf[0]||dwFlag==DIMFLAG_INITDEBUGVAR){
1157 //初期バッファがあるとき
1158
1159 if( alignment ){
1160 if( AllInitGlobalVarSize % alignment ){
1161 AllInitGlobalVarSize += alignment - (AllInitGlobalVarSize % alignment);
1162 }
1163 }
1164
1165 pVar->offset=AllInitGlobalVarSize;
1166 AllInitGlobalVarSize += pVar->GetMemorySize();
1167 }
1168 else{
1169 //初期バッファがないとき
1170
1171 if( alignment ){
1172 if( AllGlobalVarSize % alignment ){
1173 AllGlobalVarSize += alignment - (AllGlobalVarSize % alignment);
1174 }
1175 }
1176
1177 pVar->offset=AllGlobalVarSize | 0x80000000;
1178 AllGlobalVarSize += pVar->GetMemorySize();
1179 }
1180
1181 if(InitBuf[0]){
1182 int result = 0;
1183 if( !pVar->IsObject() ){
1184 //初期バッファにデータをセット
1185 extern BYTE *initGlobalBuf;
1186 initGlobalBuf=(BYTE *)HeapReAlloc(hHeap,
1187 HEAP_ZERO_MEMORY,
1188 initGlobalBuf,
1189 AllInitGlobalVarSize);
1190
1191 result = SetInitGlobalData(pVar->offset,
1192 *pVar,
1193 pVar->GetSubScriptsPtr(),
1194 InitBuf);
1195 }
1196
1197 if(!result){
1198 //動的な式だった場合は代入演算を行う
1199
1200 //初期代入時のみ、書き込みアクセスを許可する
1201 if( isConst ){
1202 pVar->ConstOff();
1203 }
1204
1205 //代入
1206 char temporary[8192];
1207 sprintf(temporary,"%s=%s",name,InitBuf);
1208 OpcodeCalc(temporary);
1209
1210 //アクセス制限を元に戻す
1211 if( isConst ){
1212 pVar->ConstOn();
1213 }
1214 }
1215 }
1216
1217
1218 if( type.IsObject() ){
1219 //デストラクタの利用フラグをオンにする
1220 CMethod *method = type.GetClass().GetDestructorMethod();
1221 if( method ){
1222 method->pUserProc->Using();
1223 }
1224 }
1225}
1226
1227void dim(char *Parameter,DWORD dwFlags){
1228 extern HANDLE hHeap;
1229 int i2;
1230 char VarName[VN_SIZE];
1231
1232 //参照型かどうか
1233 bool isRef = false;
1234
1235 i2 = 0;
1236
1237 if( Parameter[i2] == 1 && Parameter[i2+1] == ESC_BYREF ){
1238 //参照型
1239 isRef = true;
1240 Parameter += 2;
1241 }
1242
1243 if(dwFlags & DIMFLAG_CONST){
1244
1245 //////////////////////////////////
1246 // 定数変数の場合を考慮
1247 //////////////////////////////////
1248 for(;;i2++){
1249 if(Parameter[i2] == '=' ||
1250 Parameter[i2] == 1 && Parameter[i2] == ESC_AS ||
1251 Parameter[i2] =='('){
1252 VarName[i2] = 0;
1253 break;
1254 }
1255 VarName[i2] = Parameter[i2];
1256 }
1257
1258 //定数と2重定義されていないる場合は抜け出す
1259 if(CDBConst::obj.GetType(VarName)){
1260 return;
1261 }
1262
1263 //定数マクロとして定義されている場合は抜け出す
1264 if(GetConstHash(VarName)){
1265 return;
1266 }
1267 }
1268
1269
1270 //構文を解析
1271 int SubScripts[MAX_ARRAYDIM];
1272 Type type;
1273 char InitBuf[8192];
1274 char ConstractParameter[VN_SIZE];
1275 if(!GetDimentionFormat(Parameter, VarName,SubScripts,type,InitBuf,ConstractParameter))
1276 return;
1277
1278
1279 //定数と2重定義されていないかを調べる
1280 if(CDBConst::obj.GetType(VarName)){
1281 SetError(15,VarName,cp);
1282 return;
1283 }
1284
1285 //定数マクロとして定義されている場合
1286 if(GetConstHash(VarName)){
1287 SetError(15,VarName,cp);
1288 return;
1289 }
1290
1291 if(dwFlags&DIMFLAG_STATIC){
1292 if( UserProc::IsGlobalAreaCompiling() ){
1293 SetError(60,NULL,cp);
1294 return;
1295 }
1296
1297 /////////////////////
1298 // Static変数
1299 // ※"Static.Object.Method.Variable"
1300 /////////////////////
1301
1302 char temporary[VN_SIZE];
1303 GetNowStaticVarFullName(VarName,temporary);
1304
1305 dim( isRef,temporary,SubScripts,type,InitBuf,ConstractParameter,dwFlags );
1306
1307 /*
1308 Note: 静的変数のコンストラクタ呼び出しは
1309 _System_InitStaticLocalVariables関数内で一括して行う
1310 */
1311 }
1312 else{
1313 dim( isRef,VarName,SubScripts,type,InitBuf,ConstractParameter,dwFlags );
1314 }
1315}
1316void OpcodeDim(char *Parameter,DWORD dwFlags){
1317 int i,i2,i3,IsStr=0;
1318 char temporary[8192];
1319
1320 for(i=0,i2=0;;i++,i2++){
1321 if(Parameter[i]=='\"') IsStr^=1;
1322 if(Parameter[i]=='('&&IsStr==0){
1323 i3=GetStringInPare(temporary+i2,Parameter+i);
1324 i+=i3-1;
1325 i2+=i3-1;
1326 continue;
1327 }
1328 if(Parameter[i]=='['&&IsStr==0){
1329 i3=GetStringInBracket(temporary+i2,Parameter+i);
1330 i+=i3-1;
1331 i2+=i3-1;
1332 continue;
1333 }
1334 if((Parameter[i]==','&&IsStr==0)||
1335 Parameter[i]=='\0'){
1336 temporary[i2]=0;
1337
1338 dim(temporary,dwFlags);
1339
1340 if(Parameter[i]=='\0') break;
1341 i2=-1;
1342 continue;
1343 }
1344 temporary[i2]=Parameter[i];
1345 }
1346}
Note: See TracBrowser for help on using the repository browser.