source: dev/BasicCompiler32/Compile_Statement.cpp@ 31

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

_System_LocalThis(見えないThisポインタパラメータ)を通常のパラメータ保有領域ではなく、リアルパラメータ保有領域に移動した。
メソッドとグローバル関数のオーバーロードに対応(DLL関数オーバーロードには未対応)。

File size: 42.3 KB
Line 
1#include "../BasicCompiler_Common/common.h"
2#include "Opcode.h"
3
4void OpcodeOthers(char *Command){
5 int i,i2;
6 char buffer[8192];
7 SUBINFO *psi;
8
9 for(i=0;;i++){
10 if(Command[i]=='['){
11 i2=GetStringInBracket(buffer+i,Command+i);
12 i+=i2-1;
13 continue;
14 }
15 if(Command[i]==1&&Command[i+1]==ESC_PSMEM){
16 buffer[i]=Command[i];
17 i++;
18 buffer[i]=Command[i];
19 continue;
20 }
21 if(!IsVariableChar(Command[i])){
22 buffer[i]=0;
23 break;
24 }
25 buffer[i]=Command[i];
26 }
27
28 if(!(
29 IsVariableTopChar(buffer[0])||
30 buffer[0]=='.'||
31 (buffer[0]==1&&buffer[1]==ESC_PSMEM)
32 )){
33 SetError(1,NULL,cp);
34 return;
35 }
36
37
38 if(Command[i]=='\0'){
39 //////////////////////////////
40 // パラメータ無しのマクロ検索
41 //////////////////////////////
42
43 psi=GetSubHash(Command);
44
45 //GetSubHash内でエラー提示が行われた場合
46 if(psi==(SUBINFO *)-1) return;
47
48 if(psi==0){
49 char temporary[VN_SIZE];
50 lstrcpy(temporary,Command);
51
52 CharUpper(temporary);
53 psi=GetSubHash(temporary);
54
55 //GetSubHash内でエラー提示が行われた場合
56 if(psi==(SUBINFO *)-1) return;
57 }
58
59 if(psi){
60 if(psi->dwType!=SUBTYPE_MACRO) SetError(10,Command,cp);
61
62 Opcode_CallProc("",psi,0,"",0);
63
64 return;
65 }
66 }
67 else if(IsNumCalcMark(Command,i)){
68 //代入演算
69 OpcodeCalc(Command);
70 return;
71 }
72
73
74 int idProc;
75 void *pInfo;
76 idProc=GetProc(buffer,&pInfo);
77
78 int i4;
79 char temp2[VN_SIZE];
80 if(idProc){
81 if(Command[i]!='('){
82 SetError(10,buffer,cp);
83 return;
84 }
85 i4=GetStringInPare_RemovePare(temp2,Command+i+1);
86
87 //閉じカッコ")"に続く文字がNULLでないときはエラーにする
88 if(Command[i+1+i4+1]!='\0') SetError(42,NULL,cp);
89
90 ////////////////
91 // 呼び出し
92 ////////////////
93
94 LONG_PTR lp;
95 i2=CallProc(idProc,pInfo,buffer,temp2,&lp);
96
97
98 /////////////////////
99 // 戻り値の処理
100 /////////////////////
101
102 if(i2==DEF_DOUBLE||i2==DEF_SINGLE){
103 //fstp st(0)
104 OpBuffer[obp++]=(char)0xDD;
105 OpBuffer[obp++]=(char)0xD8;
106 }
107 if(i2==DEF_OBJECT){
108 CClass *pobj_Class;
109 pobj_Class=(CClass *)lp;
110 if(pobj_Class->DestructorMemberSubIndex!=-1){
111 //デストラクタの呼び出し
112
113 //push eax
114 op_push(REG_EAX);
115
116 //push eax
117 op_push(REG_EAX);
118
119 //call destructor
120 int i5;
121 i5=pobj_Class->DestructorMemberSubIndex;
122 op_call(pobj_Class->ppobj_Method[i5]->psi);
123 }
124 else{
125 //push eax
126 op_push(REG_EAX);
127 }
128
129 //call free
130 extern SUBINFO *pSub_free;
131 op_call(pSub_free);
132 }
133 return;
134 }
135
136
137 //////////////////////////
138 // その他は代入演算を行う
139 //////////////////////////
140 OpcodeCalc(Command);
141}
142
143void OpcodeIf(char *Parameter){
144 int i,i2,i3,i4,type;
145
146 for(i=0;;i++){
147 if(Parameter[i]=='\0'){
148 SetError(21,NULL,cp);
149 return;
150 }
151 if(Parameter[i]==1&&Parameter[i+1]==ESC_THEN){
152 Parameter[i]=0;
153 break;
154 }
155 }
156
157 type=NumOpe(Parameter,0,0,0);
158
159 if(type==-1){
160 //NumOpe内でエラー
161 i3=-1; //ダミー
162 }
163 else if(type==DEF_DOUBLE){
164 //fld qword ptr[esp]
165 op_fld_ptr_esp(DEF_DOUBLE);
166
167 //push 0
168 op_push_value(0);
169
170 //fild dword ptr[esp]
171 op_fld_ptr_esp(DEF_LONG);
172
173 //add esp,sizeof(double)+sizeof(long)
174 op_add_esp(sizeof(double)+sizeof(long));
175
176 //fcompp
177 OpBuffer[obp++]=(char)0xDE;
178 OpBuffer[obp++]=(char)0xD9;
179
180 //fnstsw ax
181 OpBuffer[obp++]=(char)0xDF;
182 OpBuffer[obp++]=(char)0xE0;
183
184 //test ah,40
185 OpBuffer[obp++]=(char)0xF6;
186 OpBuffer[obp++]=(char)0xC4;
187 OpBuffer[obp++]=(char)0x40;
188
189 //jne (endif、または else まで)
190 OpBuffer[obp++]=(char)0x0F;
191 OpBuffer[obp++]=(char)0x85;
192 obp+=sizeof(long);
193
194 //jneの番地
195 i3=obp;
196 }
197 else if(type==DEF_SINGLE){
198 //fld dword ptr[esp]
199 op_fld_ptr_esp(DEF_SINGLE);
200
201 //push 0
202 op_push_value(0);
203
204 //fild dword ptr[esp]
205 op_fld_ptr_esp(DEF_LONG);
206
207 //add esp,sizeof(float)+sizeof(long)
208 op_add_esp(sizeof(float)+sizeof(long));
209
210 //fcompp
211 OpBuffer[obp++]=(char)0xDE;
212 OpBuffer[obp++]=(char)0xD9;
213
214 //fnstsw ax
215 OpBuffer[obp++]=(char)0xDF;
216 OpBuffer[obp++]=(char)0xE0;
217
218 //test ah,40
219 OpBuffer[obp++]=(char)0xF6;
220 OpBuffer[obp++]=(char)0xC4;
221 OpBuffer[obp++]=(char)0x40;
222
223 //jne (endif、または else まで)
224 OpBuffer[obp++]=(char)0x0F;
225 OpBuffer[obp++]=(char)0x85;
226 obp+=sizeof(long);
227
228 //jneの番地
229 i3=obp;
230 }
231 else if(type==DEF_INT64||type==DEF_QWORD){
232 //64ビット型
233
234 //pop eax
235 op_pop(REG_EAX);
236
237 //pop ebx
238 op_pop(REG_EBX);
239
240 //cmp eax,0
241 OpBuffer[obp++]=(char)0x83;
242 OpBuffer[obp++]=(char)0xF8;
243 OpBuffer[obp++]=(char)0x00;
244
245 //jne
246 OpBuffer[obp++]=(char)0x0F;
247 OpBuffer[obp++]=(char)0x85;
248 obp+=sizeof(long);
249 i3=obp;
250
251
252 //cmp ebx,0
253 OpBuffer[obp++]=(char)0x83;
254 OpBuffer[obp++]=(char)0xFB;
255 OpBuffer[obp++]=(char)0x00;
256
257 //jne
258 OpBuffer[obp++]=(char)0x0F;
259 OpBuffer[obp++]=(char)0x85;
260 obp+=sizeof(long);
261 i4=obp;
262
263
264
265 //jmp (endif、または else までジャンプ)
266 OpBuffer[obp++]=(char)0xE9;
267 obp+=sizeof(long);
268
269 *((long *)(OpBuffer+i3-sizeof(long)))=obp-i3;
270 *((long *)(OpBuffer+i4-sizeof(long)))=obp-i4;
271
272 //jmpの番地
273 i3=obp;
274 }
275 else{
276 //32ビット型
277
278 //pop eax
279 op_pop(REG_EAX);
280
281 //cmp eax,0
282 OpBuffer[obp++]=(char)0x83;
283 OpBuffer[obp++]=(char)0xF8;
284 OpBuffer[obp++]=(char)0x00;
285
286 //je (endif、または else まで条件ジャンプ)
287 OpBuffer[obp++]=(char)0x0F;
288 OpBuffer[obp++]=(char)0x84;
289 obp+=sizeof(long);
290
291 //jeの番地
292 i3=obp;
293 }
294
295
296 /////////////////////////
297 // If内をコード化
298 /////////////////////////
299
300 //レキシカルスコープをレベルアップ
301 obj_LexScopes.LevelUp(obp);
302
303 i2=CompileBuffer(ESC_ENDIF,0);
304
305 //レキシカルスコープをレベルダウン
306 obj_LexScopes.LevelDown();
307
308
309 if(i3==-1) return;
310
311 extern char *basbuf;
312 if(i2==ESC_ELSE){
313 //jmp (endifまで)
314 OpBuffer[obp++]=(char)0xE9;
315 obp+=sizeof(long);
316
317 *((long *)(OpBuffer+i3-sizeof(long)))=obp-i3; //ifからelseへのジャンプ先のオフセット値
318
319 i3=obp;
320
321
322 /////////////////////////
323 // Else内をコード化
324 /////////////////////////
325
326 //レキシカルスコープをレベルアップ
327 obj_LexScopes.LevelUp(obp);
328
329 CompileBuffer(ESC_ENDIF,0);
330
331 //レキシカルスコープをレベルダウン
332 obj_LexScopes.LevelDown();
333
334
335 *((long *)(OpBuffer+i3-sizeof(long)))=obp-i3; //jmpジャンプ先のオフセット値
336 }
337 else{
338 *((long *)(OpBuffer+i3-sizeof(long)))=obp-i3; //jeジャンプ先のオフセット値
339 }
340}
341
342int GetLabelAddress(char *LabelName,int LineNum){
343 extern int MaxLabelNum;
344 extern LABEL *pLabelNames;
345 int i;
346
347 if(LabelName){
348 for(i=0;i<MaxLabelNum;i++){
349 if(pLabelNames[i].pName){
350 if(lstrcmp(LabelName,pLabelNames[i].pName)==0) return pLabelNames[i].address;
351 }
352 }
353 }
354 else{
355 for(i=0;i<MaxLabelNum;i++){
356 if(pLabelNames[i].pName==0){
357 if(LineNum==pLabelNames[i].line) return pLabelNames[i].address;
358 }
359 }
360 }
361 return -1;
362}
363void OpcodeGoto(char *Parameter){
364 extern HANDLE hHeap;
365 extern GOTOLABELSCHEDULE *pGotoLabelSchedule;
366 extern int GotoLabelScheduleNum;
367 int i,LineNum;
368
369 if(Parameter[0]=='*'){
370 i=GetLabelAddress(Parameter+1,0);
371
372 //jmp ...
373 OpBuffer[obp++]=(char)0xE9;
374 if(i==-1){
375 pGotoLabelSchedule=(GOTOLABELSCHEDULE *)HeapReAlloc(hHeap,0,pGotoLabelSchedule,(GotoLabelScheduleNum+1)*sizeof(GOTOLABELSCHEDULE));
376 pGotoLabelSchedule[GotoLabelScheduleNum].pName=(char *)HeapAlloc(hHeap,0,lstrlen(Parameter+1)+1);
377 lstrcpy(pGotoLabelSchedule[GotoLabelScheduleNum].pName,Parameter+1);
378 pGotoLabelSchedule[GotoLabelScheduleNum].pos=obp;
379 pGotoLabelSchedule[GotoLabelScheduleNum].now_cp=cp;
380 GotoLabelScheduleNum++;
381 }
382 *((long *)(OpBuffer+obp))=i-(obp+sizeof(long));
383 obp+=sizeof(long);
384 }
385 else{
386 LineNum=atoi(Parameter);
387 i=GetLabelAddress(0,LineNum);
388
389 //jmp ...
390 OpBuffer[obp++]=(char)0xE9;
391 if(i==-1){
392 pGotoLabelSchedule=(GOTOLABELSCHEDULE *)HeapReAlloc(hHeap,0,pGotoLabelSchedule,(GotoLabelScheduleNum+1)*sizeof(GOTOLABELSCHEDULE));
393 pGotoLabelSchedule[GotoLabelScheduleNum].pName=0;
394 pGotoLabelSchedule[GotoLabelScheduleNum].line=LineNum;
395 pGotoLabelSchedule[GotoLabelScheduleNum].pos=obp;
396 pGotoLabelSchedule[GotoLabelScheduleNum].now_cp=cp;
397 GotoLabelScheduleNum++;
398 }
399 *((long *)(OpBuffer+obp))=i-(obp+sizeof(long));
400 obp+=sizeof(long);
401 }
402}
403void OpcodeWhile(char *Parameter){
404 extern DWORD *pExitWhileSchedule;
405 extern int ExitWhileScheduleNum;
406 extern HANDLE hHeap;
407 int i2,i3,type;
408 DWORD *lpdwTemp;
409 int TempNum;
410
411 //Continueアドレスのバックアップとセット
412 extern DWORD dwContinueAddress;
413 DWORD dwTempContinue;
414 dwTempContinue=dwContinueAddress;
415 dwContinueAddress=obp;
416
417 if(!Parameter[0]) SetError(10,"While",cp);
418 type=NumOpe(Parameter,0,0,0);
419
420 int je_schedule;
421 if(type==DEF_DOUBLE){
422 //fld qword ptr[esp]
423 op_fld_ptr_esp(DEF_DOUBLE);
424
425 //push 0
426 op_push_value(0);
427
428 //fild dword ptr[esp]
429 op_fld_ptr_esp(DEF_LONG);
430
431 //add esp,sizeof(double)+sizeof(long)
432 op_add_esp(sizeof(double)+sizeof(long));
433
434 //fcompp
435 OpBuffer[obp++]=(char)0xDE;
436 OpBuffer[obp++]=(char)0xD9;
437
438 //fnstsw ax
439 OpBuffer[obp++]=(char)0xDF;
440 OpBuffer[obp++]=(char)0xE0;
441
442 //test ah,40
443 OpBuffer[obp++]=(char)0xF6;
444 OpBuffer[obp++]=(char)0xC4;
445 OpBuffer[obp++]=(char)0x40;
446
447 //jne (Wend まで)
448 OpBuffer[obp++]=(char)0x0F;
449 OpBuffer[obp++]=(char)0x85;
450 obp+=sizeof(long);
451
452 //jeの番地
453 je_schedule=obp;
454 }
455 else if(type==DEF_SINGLE){
456 //fld dword ptr[esp]
457 op_fld_ptr_esp(DEF_SINGLE);
458
459 //push 0
460 op_push_value(0);
461
462 //fild dword ptr[esp]
463 op_fld_ptr_esp(DEF_LONG);
464
465 //add esp,sizeof(float)+sizeof(long)
466 op_add_esp(sizeof(float)+sizeof(long));
467
468 //fcompp
469 OpBuffer[obp++]=(char)0xDE;
470 OpBuffer[obp++]=(char)0xD9;
471
472 //fnstsw ax
473 OpBuffer[obp++]=(char)0xDF;
474 OpBuffer[obp++]=(char)0xE0;
475
476 //test ah,40
477 OpBuffer[obp++]=(char)0xF6;
478 OpBuffer[obp++]=(char)0xC4;
479 OpBuffer[obp++]=(char)0x40;
480
481 //jne (Wend まで)
482 OpBuffer[obp++]=(char)0x0F;
483 OpBuffer[obp++]=(char)0x85;
484 obp+=sizeof(long);
485
486 //jeの番地
487 je_schedule=obp;
488 }
489 else if(type==DEF_INT64||type==DEF_QWORD){
490 //64ビット型
491
492 //pop eax
493 op_pop(REG_EAX);
494
495 //pop ebx
496 op_pop(REG_EBX);
497
498 //cmp eax,0
499 OpBuffer[obp++]=(char)0x83;
500 OpBuffer[obp++]=(char)0xF8;
501 OpBuffer[obp++]=(char)0x00;
502
503 //jne
504 OpBuffer[obp++]=(char)0x0F;
505 OpBuffer[obp++]=(char)0x85;
506 obp+=sizeof(long);
507 i2=obp;
508
509
510 //cmp ebx,0
511 OpBuffer[obp++]=(char)0x83;
512 OpBuffer[obp++]=(char)0xFB;
513 OpBuffer[obp++]=(char)0x00;
514
515 //jne
516 OpBuffer[obp++]=(char)0x0F;
517 OpBuffer[obp++]=(char)0x85;
518 obp+=sizeof(long);
519 i3=obp;
520
521
522 //jmp (endif、または else までジャンプ)
523 OpBuffer[obp++]=(char)0xE9;
524 obp+=sizeof(long);
525
526 *((long *)(OpBuffer+i2-sizeof(long)))=obp-i2;
527 *((long *)(OpBuffer+i3-sizeof(long)))=obp-i3;
528
529 //jmpの番地
530 je_schedule=obp;
531 }
532 else{
533 //その他整数型
534
535 //pop eax
536 op_pop(REG_EAX);
537
538 //cmp eax,0
539 OpBuffer[obp++]=(char)0x83;
540 OpBuffer[obp++]=(char)0xF8;
541 OpBuffer[obp++]=(char)0x00;
542
543 //je (Wend まで)
544 OpBuffer[obp++]=(char)0x0F;
545 OpBuffer[obp++]=(char)0x84;
546 obp+=sizeof(long);
547
548 //実行中の番地
549 je_schedule=obp;
550 }
551
552 //ExitWhileスケジュールの準備
553 lpdwTemp=pExitWhileSchedule;
554 TempNum=ExitWhileScheduleNum;
555 pExitWhileSchedule=(DWORD *)HeapAlloc(hHeap,0,1);
556 ExitWhileScheduleNum=0;
557
558 //レキシカルスコープをレベルアップ
559 obj_LexScopes.LevelUp(obp);
560
561 //While内をコンパイル
562 CompileBuffer(0,COM_WEND);
563
564 CallDestrouctorsOfScope();
565
566 //jmp ...
567 OpBuffer[obp++]=(char)0xE9;
568 *((long *)(OpBuffer+obp))=dwContinueAddress-(obp+sizeof(long));
569 obp+=sizeof(long);
570
571 //ExitWhileスケジュール
572 for(i2=0;i2<ExitWhileScheduleNum;i2++){
573 *((long *)(OpBuffer+pExitWhileSchedule[i2]))=obp-(pExitWhileSchedule[i2]+sizeof(long));
574 }
575 HeapDefaultFree(pExitWhileSchedule);
576 pExitWhileSchedule=lpdwTemp;
577 ExitWhileScheduleNum=TempNum;
578
579 //レキシカルスコープをレベルダウン
580 obj_LexScopes.LevelDown();
581
582 *((long *)(OpBuffer+je_schedule-sizeof(long)))=obp-je_schedule; //jeジャンプ先のオフセット値
583
584 //Continueアドレスを復元
585 dwContinueAddress=dwTempContinue;
586}
587void OpcodeExitWhile(void){
588 extern DWORD *pExitWhileSchedule;
589 extern int ExitWhileScheduleNum;
590 extern HANDLE hHeap;
591
592 if(!pExitWhileSchedule){
593 SetError(12,"Exit While",cp);
594 return;
595 }
596
597 //jmp ...(Wend addr)
598 OpBuffer[obp++]=(char)0xE9;
599
600 pExitWhileSchedule=(DWORD *)HeapReAlloc(hHeap,0,pExitWhileSchedule,(ExitWhileScheduleNum+1)*sizeof(DWORD));
601 pExitWhileSchedule[ExitWhileScheduleNum]=obp;
602 ExitWhileScheduleNum++;
603
604 obp+=sizeof(long);
605}
606char szNextVariable[VN_SIZE];
607void OpcodeFor(char *Parameter){
608 extern DWORD *pExitForSchedule;
609 extern int ExitForScheduleNum;
610 extern HANDLE hHeap;
611 DWORD *lpdwTemp;
612 int TempNum;
613 int i,i2,i3;
614 char temporary[VN_SIZE],variable[VN_SIZE],JudgeNum[VN_SIZE],StepNum[VN_SIZE];
615
616 //第1パラメータを取得
617 i=GetOneParameter(Parameter,0,temporary);
618 if(!Parameter[i]){
619 SetError(12,"For",cp);
620 goto ErrorStep;
621 }
622
623 for(i2=0;;i2++){
624 if(temporary[i2]=='='){
625 variable[i2]=0;
626
627 //カウンタ初期化
628 OpcodeCalc(temporary);
629 break;
630 }
631 if(temporary[i2]=='\0'){
632 SetError(12,"For",cp);
633 goto ErrorStep;
634 }
635 variable[i2]=temporary[i2];
636 }
637
638 //jmp ...
639 OpBuffer[obp++]=(char)0xE9;
640 i2=obp;
641 obp+=sizeof(long);
642
643 //Continueアドレスのバックアップとセット
644 extern DWORD dwContinueAddress;
645 DWORD dwTempContinue;
646 dwTempContinue=dwContinueAddress;
647 dwContinueAddress=obp;
648
649 //第2パラメータを取得(to~)
650 i=GetOneParameter(Parameter,i,JudgeNum);
651
652 //第3パラメータを取得(step~)
653 if(Parameter[i]){
654 i=GetOneParameter(Parameter,i,StepNum);
655 if(Parameter[i]) SetError(12,"For",cp);
656 }
657 else lstrcpy(StepNum,"1");
658
659 //カウンタを増加させる
660 sprintf(temporary,"%s=(%s)+(%s)",variable,variable,StepNum);
661 OpcodeCalc(temporary);
662
663 *((long *)(OpBuffer+i2))=obp-(i2+sizeof(long));
664
665 //増加か減少かを区別する
666 sprintf(temporary,"(%s)>=0",StepNum);
667 NumOpe(temporary,0,0,0);
668
669 //pop eax
670 op_pop(REG_EAX);
671
672 //cmp eax,0
673 OpBuffer[obp++]=(char)0x83;
674 OpBuffer[obp++]=(char)0xF8;
675 OpBuffer[obp++]=(char)0x00;
676
677 //je [カウンタ減少の場合の判定]
678 OpBuffer[obp++]=(char)0x0F;
679 OpBuffer[obp++]=(char)0x84;
680 i2=obp;
681 obp+=sizeof(long);
682
683 //判定(カウンタ増加の場合)
684 sprintf(temporary,"%s<=(%s)",variable,JudgeNum);
685 NumOpe(temporary,0,0,0);
686
687 //pop eax
688 op_pop(REG_EAX);
689
690 //jmp [カウンタ減少の場合の判定を飛び越す]
691 OpBuffer[obp++]=(char)0xE9;
692 i3=obp;
693 obp+=sizeof(long);
694
695 *((long *)(OpBuffer+i2))=obp-(i2+sizeof(long)); //jeジャンプ先のオフセット値
696
697 //判定(カウンタ減少の場合)
698 sprintf(temporary,"%s>=(%s)",variable,JudgeNum);
699 NumOpe(temporary,0,0,0);
700
701 //pop eax
702 op_pop(REG_EAX);
703
704 *((long *)(OpBuffer+i3))=obp-(i3+sizeof(long)); //jmpジャンプ先のオフセット値
705
706 //cmp eax,0
707 OpBuffer[obp++]=(char)0x83;
708 OpBuffer[obp++]=(char)0xF8;
709 OpBuffer[obp++]=(char)0x00;
710
711ErrorStep:
712
713 //je ...
714 OpBuffer[obp++]=(char)0x0F;
715 OpBuffer[obp++]=(char)0x84;
716 int je_schedule=obp;
717 obp+=sizeof(long);
718
719 //ExitForスケジュールの準備
720 lpdwTemp=pExitForSchedule;
721 TempNum=ExitForScheduleNum;
722 pExitForSchedule=(DWORD *)HeapAlloc(hHeap,0,1);
723 ExitForScheduleNum=0;
724
725 //レキシカルスコープをレベルアップ
726 obj_LexScopes.LevelUp(obp);
727
728 //For内をコンパイル
729 CompileBuffer(0,COM_NEXT);
730
731 CallDestrouctorsOfScope();
732
733 if(szNextVariable[0]){
734 if(lstrcmp(szNextVariable,variable)!=0){
735 SetError(55,szNextVariable,cp);
736 }
737 }
738
739 //jmp ...
740 OpBuffer[obp++]=(char)0xE9;
741 *((long *)(OpBuffer+obp))=dwContinueAddress-(obp+sizeof(long));
742 obp+=sizeof(long);
743
744 //ExitForスケジュール
745 for(i=0;i<ExitForScheduleNum;i++){
746 *((long *)(OpBuffer+pExitForSchedule[i]))=obp-(pExitForSchedule[i]+sizeof(long));
747 }
748 HeapDefaultFree(pExitForSchedule);
749 pExitForSchedule=lpdwTemp;
750 ExitForScheduleNum=TempNum;
751
752 //レキシカルスコープをレベルダウン
753 obj_LexScopes.LevelDown();
754
755 *((long *)(OpBuffer+je_schedule))=obp-(je_schedule+sizeof(long)); //jeジャンプ先のオフセット値
756
757 //Continueアドレスを復元
758 dwContinueAddress=dwTempContinue;
759}
760void OpcodeExitFor(void){
761 extern DWORD *pExitForSchedule;
762 extern int ExitForScheduleNum;
763 extern HANDLE hHeap;
764
765 if(!pExitForSchedule){
766 SetError(12,"Exit For",cp);
767 return;
768 }
769
770 //jmp ...(Next addr)
771 OpBuffer[obp++]=(char)0xE9;
772
773 pExitForSchedule=(DWORD *)HeapReAlloc(hHeap,0,pExitForSchedule,(ExitForScheduleNum+1)*sizeof(DWORD));
774 pExitForSchedule[ExitForScheduleNum]=obp;
775 ExitForScheduleNum++;
776
777 obp+=sizeof(long);
778}
779
780void OpcodeDo(char *Parameter){
781 extern DWORD *pExitDoSchedule;
782 extern int ExitDoScheduleNum;
783 extern HANDLE hHeap;
784 int i,i2,i3,i4,type;
785 DWORD *lpdwTemp;
786 int TempNum;
787
788 if(Parameter[0]) SetError(10,"Do",cp);
789
790 //ExitDoスケジュールの準備
791 lpdwTemp=pExitDoSchedule;
792 TempNum=ExitDoScheduleNum;
793 pExitDoSchedule=(DWORD *)HeapAlloc(hHeap,0,1);
794 ExitDoScheduleNum=0;
795
796 //Continueアドレスのバックアップとセット
797 extern DWORD dwContinueAddress;
798 DWORD dwTempContinue;
799 dwTempContinue=dwContinueAddress;
800 dwContinueAddress=obp;
801
802 //レキシカルスコープをレベルアップ
803 obj_LexScopes.LevelUp(obp);
804
805 //Do内をコンパイル
806 CompileBuffer(0,COM_LOOP);
807
808 CallDestrouctorsOfScope();
809
810 extern char *basbuf;
811 char temporary[VN_SIZE];
812 for(i=cp-1;;i--){
813 if(IsCommandDelimitation(basbuf[i])){
814 i+=3;
815 if(!(basbuf[i]=='0'||basbuf[i]=='1')){
816 //無条件ループ
817 break;
818 }
819 i3=i;
820
821 for(i+=2,i2=0;;i++,i2++){
822 if(IsCommandDelimitation(basbuf[i])){
823 temporary[i2]=0;
824 break;
825 }
826 temporary[i2]=basbuf[i];
827 }
828
829 type=NumOpe(temporary,0,0,0);
830
831 if(type==DEF_DOUBLE){
832 //fld qword ptr[esp]
833 op_fld_ptr_esp(DEF_DOUBLE);
834
835 //push 0
836 op_push_value(0);
837
838 //fild dword ptr[esp]
839 op_fld_ptr_esp(DEF_LONG);
840
841 //add esp,sizeof(double)+sizeof(long)
842 op_add_esp(sizeof(double)+sizeof(long));
843
844 //fcompp
845 OpBuffer[obp++]=(char)0xDE;
846 OpBuffer[obp++]=(char)0xD9;
847
848 //fnstsw ax
849 OpBuffer[obp++]=(char)0xDF;
850 OpBuffer[obp++]=(char)0xE0;
851
852 //test ah,40
853 OpBuffer[obp++]=(char)0xF6;
854 OpBuffer[obp++]=(char)0xC4;
855 OpBuffer[obp++]=(char)0x40;
856
857 if(basbuf[i3]=='0'){
858 //While
859
860 //jne 5(ループ終了)
861 OpBuffer[obp++]=(char)0x75;
862 OpBuffer[obp++]=(char)0x05;
863 }
864 else if(basbuf[i3]=='1'){
865 //Until
866
867 //je 5(ループ終了)
868 OpBuffer[obp++]=(char)0x74;
869 OpBuffer[obp++]=(char)0x05;
870 }
871 }
872 else if(type==DEF_SINGLE){
873 //fld dword ptr[esp]
874 op_fld_ptr_esp(DEF_SINGLE);
875
876 //push 0
877 op_push_value(0);
878
879 //fild dword ptr[esp]
880 op_fld_ptr_esp(DEF_LONG);
881
882 //add esp,sizeof(float)+sizeof(long)
883 op_add_esp(sizeof(float)+sizeof(long));
884
885 //fcompp
886 OpBuffer[obp++]=(char)0xDE;
887 OpBuffer[obp++]=(char)0xD9;
888
889 //fnstsw ax
890 OpBuffer[obp++]=(char)0xDF;
891 OpBuffer[obp++]=(char)0xE0;
892
893 //test ah,40
894 OpBuffer[obp++]=(char)0xF6;
895 OpBuffer[obp++]=(char)0xC4;
896 OpBuffer[obp++]=(char)0x40;
897
898 if(basbuf[i3]=='0'){
899 //While
900
901 //jne 5(ループ終了)
902 OpBuffer[obp++]=(char)0x75;
903 OpBuffer[obp++]=(char)0x05;
904 }
905 else if(basbuf[i3]=='1'){
906 //Until
907
908 //je 5(ループ終了)
909 OpBuffer[obp++]=(char)0x74;
910 OpBuffer[obp++]=(char)0x05;
911 }
912 }
913 else if(type==DEF_INT64||type==DEF_QWORD){
914 //64ビット型
915
916 //pop eax
917 op_pop(REG_EAX);
918
919 //pop ebx
920 op_pop(REG_EBX);
921
922 //cmp eax,0
923 OpBuffer[obp++]=(char)0x83;
924 OpBuffer[obp++]=(char)0xF8;
925 OpBuffer[obp++]=(char)0x00;
926
927 //jne
928 OpBuffer[obp++]=(char)0x0F;
929 OpBuffer[obp++]=(char)0x85;
930 obp+=sizeof(long);
931 i2=obp;
932
933
934 //cmp ebx,0
935 OpBuffer[obp++]=(char)0x83;
936 OpBuffer[obp++]=(char)0xFB;
937 OpBuffer[obp++]=(char)0x00;
938
939 //jne
940 OpBuffer[obp++]=(char)0x0F;
941 OpBuffer[obp++]=(char)0x85;
942 obp+=sizeof(long);
943 i4=obp;
944
945
946 if(basbuf[i3]=='0'){
947 //While
948
949 //jmp 5(ループ終了)
950 OpBuffer[obp++]=(char)0xEB;
951 OpBuffer[obp++]=(char)0x05;
952
953 *((long *)(OpBuffer+i2-sizeof(long)))=obp-i2;
954 *((long *)(OpBuffer+i4-sizeof(long)))=obp-i4;
955 }
956 else if(basbuf[i3]=='1'){
957 //Until
958
959 //jmp 2(ループを続ける)
960 OpBuffer[obp++]=(char)0xEB;
961 OpBuffer[obp++]=(char)0x02;
962
963 *((long *)(OpBuffer+i2-sizeof(long)))=obp-i2;
964 *((long *)(OpBuffer+i4-sizeof(long)))=obp-i4;
965
966 //jmp 5(ループ終了)
967 OpBuffer[obp++]=(char)0xEB;
968 OpBuffer[obp++]=(char)0x05;
969 }
970 }
971 else{
972 //pop eax
973 op_pop(REG_EAX);
974
975 //cmp eax,0
976 OpBuffer[obp++]=(char)0x83;
977 OpBuffer[obp++]=(char)0xF8;
978 OpBuffer[obp++]=(char)0x00;
979
980 if(basbuf[i3]=='0'){
981 //While
982
983 //je 5(ループ終了)
984 OpBuffer[obp++]=(char)0x74;
985 OpBuffer[obp++]=(char)0x05;
986 }
987 else if(basbuf[i3]=='1'){
988 //Until
989
990 //jne 5(ループ終了)
991 OpBuffer[obp++]=(char)0x75;
992 OpBuffer[obp++]=(char)0x05;
993 }
994 }
995 break;
996 }
997 }
998
999 //jmp ...
1000 OpBuffer[obp++]=(char)0xE9;
1001 *((long *)(OpBuffer+obp))=dwContinueAddress-(obp+sizeof(long));
1002 obp+=sizeof(long);
1003
1004 //jmp ...
1005 OpBuffer[obp++]=(char)0xE9;
1006 int je_schedule=obp;
1007 obp+=sizeof(long);
1008
1009 //ExitDoスケジュール
1010 for(i=0;i<ExitDoScheduleNum;i++){
1011 *((long *)(OpBuffer+pExitDoSchedule[i]))=obp-(pExitDoSchedule[i]+sizeof(long));
1012 }
1013 HeapDefaultFree(pExitDoSchedule);
1014 pExitDoSchedule=lpdwTemp;
1015 ExitDoScheduleNum=TempNum;
1016
1017 //レキシカルスコープをレベルダウン
1018 obj_LexScopes.LevelDown();
1019
1020 *((long *)(OpBuffer+je_schedule))=obp-(je_schedule+sizeof(long)); //jmpジャンプ先のオフセット値
1021
1022
1023 //Continueアドレスを復元
1024 dwContinueAddress=dwTempContinue;
1025}
1026void OpcodeExitDo(void){
1027 extern HANDLE hHeap;
1028 extern DWORD *pExitDoSchedule;
1029 extern int ExitDoScheduleNum;
1030
1031 if(!pExitDoSchedule){
1032 SetError(12,"Exit Do",cp);
1033 return;
1034 }
1035
1036 //jmp ...(Loop addr)
1037 OpBuffer[obp++]=(char)0xE9;
1038
1039 pExitDoSchedule=(DWORD *)HeapReAlloc(hHeap,0,pExitDoSchedule,(ExitDoScheduleNum+1)*sizeof(DWORD));
1040 pExitDoSchedule[ExitDoScheduleNum]=obp;
1041 ExitDoScheduleNum++;
1042
1043 obp+=sizeof(long);
1044}
1045void OpcodeContinue(void){
1046 extern DWORD dwContinueAddress;
1047
1048 if(dwContinueAddress==-1){
1049 SetError(12,"Continue",cp);
1050 return;
1051 }
1052
1053 //jmp ...(Continue addr)
1054 OpBuffer[obp++]=(char)0xE9;
1055
1056 *((long *)(OpBuffer+obp))=dwContinueAddress-(obp+sizeof(long));
1057 obp+=sizeof(long);
1058}
1059
1060void OpcodeExitSub(void){
1061 extern DWORD *pExitSubSchedule;
1062 extern int ExitSubScheduleNum;
1063 extern HANDLE hHeap;
1064
1065 extern BOOL bCompilingGlobal;
1066 if(bCompilingGlobal){
1067 SetError(12,"Exit Sub/Function",cp);
1068 return;
1069 }
1070
1071 //jmp ...(End Sub/Function)
1072 OpBuffer[obp++]=(char)0xE9;
1073
1074 pExitSubSchedule=(DWORD *)HeapReAlloc(hHeap,0,pExitSubSchedule,(ExitSubScheduleNum+1)*sizeof(DWORD));
1075 pExitSubSchedule[ExitSubScheduleNum]=obp;
1076 ExitSubScheduleNum++;
1077
1078 obp+=sizeof(long);
1079}
1080
1081void AddCaseSchedule(void){
1082 extern DWORD *pCaseSchedule;
1083 extern int CaseScheduleNum;
1084 extern HANDLE hHeap;
1085
1086 pCaseSchedule=(DWORD *)HeapReAlloc(hHeap,0,pCaseSchedule,(CaseScheduleNum+1)*sizeof(DWORD));
1087 pCaseSchedule[CaseScheduleNum]=obp;
1088 CaseScheduleNum++;
1089}
1090
1091int CaseTypeSize;
1092void OpcodeSelect(char *Parameter){
1093 extern DWORD *pCaseSchedule;
1094 extern int CaseScheduleNum;
1095 extern int NowCaseSchedule;
1096 extern int CaseTypeSize;
1097 extern HANDLE hHeap;
1098 extern char *basbuf;
1099 int i,i2,i3,sw,type1,type2,NowCaseCp;
1100 char temporary[VN_SIZE];
1101
1102 DWORD *temp_pCaseSchedule;
1103 int temp_CaseScheduleNum;
1104 int temp_NowCaseSchedule;
1105 int temp_CaseTypeSize;
1106
1107 temp_pCaseSchedule=pCaseSchedule;
1108 temp_CaseScheduleNum=CaseScheduleNum;
1109 temp_NowCaseSchedule=NowCaseSchedule;
1110 temp_CaseTypeSize=CaseTypeSize;
1111 pCaseSchedule=(DWORD *)HeapAlloc(hHeap,0,1);
1112 CaseScheduleNum=0;
1113 NowCaseSchedule=0;
1114
1115 LONG_PTR lpIndex;
1116 type1=NumOpe(Parameter,0,0,&lpIndex);
1117 if(type1==DEF_INTEGER||
1118 type1==DEF_WORD||
1119 type1==DEF_CHAR||
1120 type1==DEF_BYTE) CaseTypeSize=sizeof(long);
1121 else{
1122 CaseTypeSize=GetTypeSize(type1,lpIndex);
1123 if(type1==DEF_OBJECT) CaseTypeSize=PTR_SIZE;
1124 }
1125
1126 for(i=cp,sw=0;;i++){
1127 if(basbuf[i]=='\0'){
1128 HeapDefaultFree(pCaseSchedule);
1129 pCaseSchedule=temp_pCaseSchedule;
1130 CaseScheduleNum=temp_CaseScheduleNum;
1131 NowCaseSchedule=temp_NowCaseSchedule;
1132 CaseTypeSize=temp_CaseTypeSize;
1133 SetError(22,"Select",cp);
1134 return;
1135 }
1136 if(basbuf[i]==1&&basbuf[i+1]==ESC_SELECTCASE){
1137 for(i2=0;;i++){
1138 if(basbuf[i]==1&&basbuf[i+1]==ESC_SELECTCASE) i2++;
1139 if(basbuf[i]==1&&basbuf[i+1]==ESC_ENDSELECT){
1140 i2--;
1141 if(i2==0) break;
1142 }
1143 }
1144 continue;
1145 }
1146 if(basbuf[i]==1&&basbuf[i+1]==ESC_ENDSELECT){
1147 if(sw==0){
1148 //add esp,CaseTypeSize
1149 op_add_esp(CaseTypeSize);
1150 }
1151 break;
1152 }
1153 if(basbuf[i]==1&&basbuf[i+1]==ESC_CASE){
1154 NowCaseCp=i;
1155
1156 i++;
1157 while(1){
1158 for(i++,i2=0;;i++,i2++){
1159 if(basbuf[i]=='\"'){
1160 i3=GetStringInQuotation(temporary+i2,basbuf+i);
1161 i+=i3-1;
1162 i2+=i3-1;
1163 continue;
1164 }
1165 if(basbuf[i]=='('){
1166 i3=GetStringInPare(temporary+i2,basbuf+i);
1167 i+=i3-1;
1168 i2+=i3-1;
1169 continue;
1170 }
1171 if(basbuf[i]=='['){
1172 i3=GetStringInBracket(temporary+i2,basbuf+i);
1173 i+=i3-1;
1174 i2+=i3-1;
1175 continue;
1176 }
1177
1178 if(IsCommandDelimitation(basbuf[i])){
1179 temporary[i2]=0;
1180 break;
1181 }
1182 if(basbuf[i]==','){
1183 temporary[i2]=0;
1184 break;
1185 }
1186
1187 temporary[i2]=basbuf[i];
1188 }
1189
1190 //エラー用
1191 i2=cp;
1192 cp=NowCaseCp;
1193
1194 LONG_PTR lpIndex2;
1195 type2=NumOpe(temporary,type1,lpIndex,&lpIndex2);
1196
1197 cp=i2;
1198
1199 if(type1==DEF_OBJECT){
1200 CClass *pobj_c;
1201 pobj_c=(CClass *)lpIndex;
1202
1203 SUBINFO **ppsi;
1204 int num;
1205 ppsi=pobj_c->GetOperatorSubInfo(CALC_EQUAL,num);
1206 if(num==0){
1207 HeapDefaultFree(ppsi);
1208
1209 return;
1210 }
1211
1212 PARAMETER_INFO *ppi = (PARAMETER_INFO *)HeapAlloc(hHeap,0,sizeof(PARAMETER_INFO)*3);
1213 int iParmNum=0;
1214 ppi[iParmNum].bArray=0;
1215 ppi[iParmNum].bByVal=0;
1216 ppi[iParmNum].name=0;
1217 ppi[iParmNum].type=type2;
1218 ppi[iParmNum].u.index=lpIndex2;
1219 ppi[iParmNum].SubScripts[0]=-1;
1220 iParmNum++;
1221
1222 //オーバーロードを解決
1223 SUBINFO *psi;
1224 psi=OverloadSolution("==",ppsi,num,ppi,iParmNum,NULL);
1225 HeapDefaultFree(ppsi);
1226 HeapDefaultFree(ppi);
1227
1228 if(!psi){
1229 //エラー
1230 return;
1231 }
1232
1233
1234 //pop edx
1235 op_pop(REG_EDX);
1236
1237 //mov ecx,dword ptr[esp]
1238 op_mov_RM(sizeof(long),REG_ECX,REG_ESP,0,MOD_BASE);
1239
1240 //push edx
1241 op_push(REG_EDX);
1242
1243 //push ecx
1244 op_push(REG_ECX);
1245
1246 //call operator_proc ※ ==演算子
1247 op_call(psi);
1248
1249 //test eax,eax
1250 op_test(REG_EAX,REG_EAX);
1251
1252 //jne ...
1253 OpBuffer[obp++]=(char)0x0F;
1254 OpBuffer[obp++]=(char)0x85;
1255 AddCaseSchedule();
1256 obp+=sizeof(long);
1257 }
1258 else if(type1==DEF_DOUBLE){
1259 ChangeTypeToDouble(type2);
1260
1261 //fld qword ptr[esp]
1262 op_fld_ptr_esp(DEF_DOUBLE);
1263
1264 //add esp,CaseTypeSize
1265 op_add_esp(CaseTypeSize);
1266
1267 //fld qword ptr[esp]
1268 op_fld_ptr_esp(DEF_DOUBLE);
1269
1270 //fcompp
1271 OpBuffer[obp++]=(char)0xDE;
1272 OpBuffer[obp++]=(char)0xD9;
1273
1274 //fnstsw ax
1275 OpBuffer[obp++]=(char)0xDF;
1276 OpBuffer[obp++]=(char)0xE0;
1277
1278 //test ah,40
1279 OpBuffer[obp++]=(char)0xF6;
1280 OpBuffer[obp++]=(char)0xC4;
1281 OpBuffer[obp++]=(char)0x40;
1282
1283 //jne ...
1284 OpBuffer[obp++]=(char)0x0F;
1285 OpBuffer[obp++]=(char)0x85;
1286 AddCaseSchedule();
1287 obp+=sizeof(long);
1288 }
1289 else if(type1==DEF_SINGLE){
1290 ChangeTypeToSingle(type2);
1291
1292 //fld dword ptr[esp]
1293 op_fld_ptr_esp(DEF_SINGLE);
1294
1295 //add esp,CaseTypeSize
1296 op_add_esp(CaseTypeSize);
1297
1298 //fld dword ptr[esp]
1299 op_fld_ptr_esp(DEF_SINGLE);
1300
1301 //fcompp
1302 OpBuffer[obp++]=(char)0xDE;
1303 OpBuffer[obp++]=(char)0xD9;
1304
1305 //fnstsw ax
1306 OpBuffer[obp++]=(char)0xDF;
1307 OpBuffer[obp++]=(char)0xE0;
1308
1309 //test ah,40
1310 OpBuffer[obp++]=(char)0xF6;
1311 OpBuffer[obp++]=(char)0xC4;
1312 OpBuffer[obp++]=(char)0x40;
1313
1314 //jne ...
1315 OpBuffer[obp++]=(char)0x0F;
1316 OpBuffer[obp++]=(char)0x85;
1317 AddCaseSchedule();
1318 obp+=sizeof(long);
1319 }
1320 else{
1321 //その他整数型
1322
1323 //pop ebx
1324 op_pop(REG_EBX);
1325
1326 //mov eax,dword ptr[esp]
1327 OpBuffer[obp++]=(char)0x8B;
1328 OpBuffer[obp++]=(char)0x04;
1329 OpBuffer[obp++]=(char)0x24;
1330
1331 //cmp eax,ebx
1332 OpBuffer[obp++]=(char)0x3B;
1333 OpBuffer[obp++]=(char)0xC3;
1334
1335 //je ...
1336 OpBuffer[obp++]=(char)0x0F;
1337 OpBuffer[obp++]=(char)0x84;
1338 AddCaseSchedule();
1339 obp+=sizeof(long);
1340 }
1341
1342 if(basbuf[i]!=',') break;
1343 }
1344 }
1345 if(basbuf[i]==1&&basbuf[i+1]==ESC_CASEELSE){
1346 sw=1;
1347
1348 //jmp ...
1349 OpBuffer[obp++]=(char)0xE9;
1350 AddCaseSchedule();
1351 obp+=sizeof(long);
1352 }
1353 }
1354
1355 //レキシカルスコープをレベルアップ
1356 obj_LexScopes.LevelUp(obp);
1357
1358 //Select Case内をコンパイル
1359 CompileBuffer(ESC_ENDSELECT,0);
1360
1361 //jmp EndSelect
1362 OpBuffer[obp++]=(char)0xE9;
1363 AddCaseSchedule();
1364 obp+=sizeof(long);
1365
1366 //最終スケジュール
1367 for(i=NowCaseSchedule;i<CaseScheduleNum;i++){
1368 *(long *)(OpBuffer+pCaseSchedule[i])=obp-(pCaseSchedule[i]+sizeof(long));
1369 }
1370 HeapDefaultFree(pCaseSchedule);
1371
1372 //レキシカルスコープをレベルダウン
1373 obj_LexScopes.LevelDown();
1374
1375 pCaseSchedule=temp_pCaseSchedule;
1376 CaseScheduleNum=temp_CaseScheduleNum;
1377 NowCaseSchedule=temp_NowCaseSchedule;
1378 CaseTypeSize=temp_CaseTypeSize;
1379}
1380void OpcodeCase(char *Parameter){
1381 extern DWORD *pCaseSchedule;
1382 extern int NowCaseSchedule;
1383 extern int CaseTypeSize;
1384 int i;
1385
1386 if(!pCaseSchedule){
1387 SetError(30,"Case",cp);
1388 return;
1389 }
1390
1391 //jmp EndSelect
1392 OpBuffer[obp++]=(char)0xE9;
1393 AddCaseSchedule();
1394 obp+=sizeof(long);
1395
1396 i=0;
1397 while(1){
1398 //Caseスケジュール
1399 *(long *)(OpBuffer+pCaseSchedule[NowCaseSchedule])=obp-(pCaseSchedule[NowCaseSchedule]+sizeof(long));
1400 NowCaseSchedule++;
1401
1402 i=JumpOneParameter(Parameter,i);
1403 if(Parameter[i]=='\0') break;
1404 }
1405
1406 //add esp,CaseTypeSize
1407 op_add_esp(CaseTypeSize);
1408}
1409
1410void OpcodeGosub(char *Parameter){
1411 extern HANDLE hHeap;
1412 extern GOTOLABELSCHEDULE *pGotoLabelSchedule;
1413 extern int GotoLabelScheduleNum;
1414 int i,LineNum;
1415
1416 if(Parameter[0]=='*'){
1417 i=GetLabelAddress(Parameter+1,0);
1418
1419 //call ...
1420 OpBuffer[obp++]=(char)0xE8;
1421 if(i==-1){
1422 pGotoLabelSchedule=(GOTOLABELSCHEDULE *)HeapReAlloc(hHeap,0,pGotoLabelSchedule,(GotoLabelScheduleNum+1)*sizeof(GOTOLABELSCHEDULE));
1423 pGotoLabelSchedule[GotoLabelScheduleNum].pName=(char *)HeapAlloc(hHeap,0,lstrlen(Parameter+1)+1);
1424 lstrcpy(pGotoLabelSchedule[GotoLabelScheduleNum].pName,Parameter+1);
1425 pGotoLabelSchedule[GotoLabelScheduleNum].pos=obp;
1426 pGotoLabelSchedule[GotoLabelScheduleNum].now_cp=cp;
1427 GotoLabelScheduleNum++;
1428 }
1429 *((long *)(OpBuffer+obp))=i-(obp+sizeof(long));
1430 obp+=sizeof(long);
1431 }
1432 else{
1433 LineNum=atoi(Parameter);
1434 i=GetLabelAddress(0,LineNum);
1435
1436 //call ...
1437 OpBuffer[obp++]=(char)0xE8;
1438 if(i==-1){
1439 pGotoLabelSchedule=(GOTOLABELSCHEDULE *)HeapReAlloc(hHeap,0,pGotoLabelSchedule,(GotoLabelScheduleNum+1)*sizeof(GOTOLABELSCHEDULE));
1440 pGotoLabelSchedule[GotoLabelScheduleNum].pName=0;
1441 pGotoLabelSchedule[GotoLabelScheduleNum].line=LineNum;
1442 pGotoLabelSchedule[GotoLabelScheduleNum].pos=obp;
1443 pGotoLabelSchedule[GotoLabelScheduleNum].now_cp=cp;
1444 GotoLabelScheduleNum++;
1445 }
1446 *((long *)(OpBuffer+obp))=i-(obp+sizeof(long));
1447 obp+=sizeof(long);
1448 }
1449}
1450void OpcodeReturn(char *Parameter){
1451 extern BOOL bCompilingGlobal;
1452 if(bCompilingGlobal){
1453 //Gosub~Returnとして扱う
1454
1455 //ret
1456 OpBuffer[obp++]=(char)0xC3;
1457 }
1458 else{
1459 //戻り値をセット
1460 if(Parameter[0]){
1461 extern SUBINFO *pCompilingSubInfo;
1462 char *temp;
1463 if(pCompilingSubInfo->name[0]==1&&pCompilingSubInfo->name[1]==ESC_OPERATOR)
1464 temp="_System_ReturnValue";
1465 else temp=pCompilingSubInfo->name;
1466
1467 char temporary[VN_SIZE];
1468 sprintf(temporary,"%s=%s",temp,Parameter);
1469 OpcodeCalc(temporary);
1470 }
1471
1472 //プロシージャを抜け出す(C言語のreturnと同様の処理を行う)
1473 OpcodeExitSub();
1474 }
1475}
1476
1477void Opcode_Input(char *Parameter){
1478 extern int cp;
1479 int i2,i3,i4,i5,type;
1480 BOOL bFile;
1481 char temporary[VN_SIZE],temp2[VN_SIZE],buffer[VN_SIZE];
1482
1483 KillStringSpaces(Parameter);
1484
1485 if(Parameter[0]=='#'){
1486 bFile=1;
1487 for(i2=0,i3=1;;i2++,i3++){
1488 buffer[i2]=Parameter[i3];
1489 if(Parameter[i3]==','||Parameter[i3]=='\0') break;
1490 }
1491 buffer[i2+1]=0;
1492 i2=i3+1;
1493 }
1494 else{
1495 bFile=0;
1496 i2=0;
1497 buffer[0]=0;
1498
1499 //表示用文字列パラメータをセット
1500 if(Parameter[0]=='\"'){
1501 buffer[0]='\"';
1502 for(i2=1;;i2++){
1503 if(Parameter[i2]=='\"'){
1504 buffer[i2]=0;
1505 break;
1506 }
1507 buffer[i2]=Parameter[i2];
1508 }
1509 if(Parameter[i2+1]==';') lstrcpy(buffer+i2,"? \"");
1510 else if(Parameter[i2+1]==',') lstrcpy(buffer+i2,"\"");
1511 else SetError(10,"Input",cp);
1512 i2+=2;
1513 }
1514 else if((Parameter[0]=='e'||Parameter[0]=='E')&&
1515 (Parameter[1]=='x'||Parameter[1]=='X')&&
1516 Parameter[2]=='\"'){
1517 memcpy(buffer,Parameter,3);
1518 for(i2=3;;i2++){
1519 if(Parameter[i2]=='\"'){
1520 buffer[i2]=0;
1521 break;
1522 }
1523 buffer[i2]=Parameter[i2];
1524 }
1525 if(Parameter[i2+1]==';') lstrcpy(buffer+i2,"? \"");
1526 else if(Parameter[i2+1]==',') lstrcpy(buffer+i2,"\"");
1527 else SetError(10,"Input",cp);
1528 i2+=2;
1529 }
1530 else{
1531 lstrcpy(buffer,"\"? \"");
1532 i2=0;
1533 }
1534 }
1535
1536 //変数ポインタ、変数のタイプをセット
1537 i4=0;
1538 while(1){
1539 for(i3=0;;i2++,i3++){
1540 if(Parameter[i2]=='('){
1541 i5=GetStringInPare(temporary+i3,Parameter+i2);
1542 i2+=i5-1;
1543 i3+=i5-1;
1544 }
1545 if(Parameter[i2]=='['){
1546 i5=GetStringInBracket(temporary+i3,Parameter+i2);
1547 i2+=i5-1;
1548 i3+=i5-1;
1549 }
1550 if(Parameter[i2]==','){
1551 temporary[i3]=0;
1552 i2++;
1553 break;
1554 }
1555 temporary[i3]=Parameter[i2];
1556 if(Parameter[i2]=='\0') break;
1557 }
1558 if(temporary[0]=='\0'){
1559 SetError(10,"Input",cp);
1560 return;
1561 }
1562
1563 LONG_PTR lpIndex;
1564 type = GetVarType(temporary,&lpIndex,1);
1565
1566 sprintf(temp2,"_System_InputDataPtr[%d]=VarPtr(%s)",i4,temporary);
1567 OpcodeCalc(temp2);
1568
1569 if(type==DEF_LONG) type=DEF_DWORD;
1570 else if(type==DEF_INTEGER) type=DEF_WORD;
1571 else if(type==DEF_OBJECT){
1572 CClass *pobj_Class=(CClass *)lpIndex;
1573 if(lstrcmp(pobj_Class->name,"String")==0) type=DEF_STRING;
1574 }
1575 sprintf(temp2,"_System_InputDataType[%d]=%d",i4,type);
1576 OpcodeCalc(temp2);
1577
1578 i4++;
1579 if(Parameter[i2]=='\0') break;
1580 }
1581 sprintf(temp2,"_System_InputDataPtr[%d]=0",i4);
1582 OpcodeCalc(temp2);
1583
1584 SUBINFO *psi;
1585 if(bFile) psi=GetSubHash("INPUT_FromFile");
1586 else psi=GetSubHash("INPUT_FromPrompt");
1587 if(!psi){
1588 SetError(3,"Input",cp);
1589 return;
1590 }
1591 Opcode_CallProc(buffer,psi,0,"",0);
1592}
1593void Opcode_PrintUsing(char *Parameter,char *buffer,BOOL bFile){
1594 extern int cp;
1595 int i2,i3,i4,i5;
1596 char temporary[VN_SIZE],temp2[8192];
1597 BOOL bReturnLine;
1598
1599 i2=lstrlen(Parameter);
1600 if(Parameter[i2-1]==';'){
1601 bReturnLine=0;
1602 Parameter[i2-1]=0;
1603 }
1604 else bReturnLine=1;
1605
1606 i3=lstrlen(buffer);
1607 for(i2=0;;i2++,i3++){
1608 if(Parameter[i2]==';'){
1609 buffer[i3]=0;
1610 break;
1611 }
1612 buffer[i3]=Parameter[i2];
1613 if(Parameter[i2]=='\0') break;
1614 }
1615 if(Parameter[i2]==';') i2++;
1616
1617 if(bReturnLine) lstrcat(buffer,"+Ex\"\\r\\n\"");
1618
1619 //データポインタ、データのタイプをセット
1620 i4=0;
1621 while(1){
1622 for(i3=0;;i2++,i3++){
1623 if(Parameter[i2]=='\"'){
1624 temporary[i3]=Parameter[i2];
1625 for(i2++,i3++;;i2++,i3++){
1626 temporary[i3]=Parameter[i2];
1627 if(Parameter[i2]=='\"') break;
1628 }
1629 continue;
1630 }
1631 if(Parameter[i2]=='('){
1632 i5=GetStringInPare(temporary+i3,Parameter+i2);
1633 i2+=i5-1;
1634 i3+=i5-1;
1635 continue;
1636 }
1637 if(Parameter[i2]=='['){
1638 i5=GetStringInBracket(temporary+i3,Parameter+i2);
1639 i2+=i5-1;
1640 i3+=i5-1;
1641 continue;
1642 }
1643 if(Parameter[i2]==','){
1644 temporary[i3]=0;
1645 i2++;
1646 break;
1647 }
1648 temporary[i3]=Parameter[i2];
1649 if(Parameter[i2]=='\0') break;
1650 }
1651 if(temporary[0]=='\0'){
1652 SetError(10,"Print",cp);
1653 return;
1654 }
1655
1656 int iResult;
1657 iResult=IsStrCalculation(temporary);
1658
1659 if(iResult==1){
1660 //文字列
1661 sprintf(temp2,"_System_UsingStrData[%d]=%s",i4,temporary);
1662 OpcodeCalc(temp2);
1663
1664 sprintf(temp2,"_System_UsingDataType[%d]=%d",i4,DEF_STRING);
1665 OpcodeCalc(temp2);
1666 }
1667 else if(iResult==0){
1668 //数値
1669 sprintf(temp2,"_System_UsingDblData[%d]=%s",i4,temporary);
1670 OpcodeCalc(temp2);
1671
1672 sprintf(temp2,"_System_UsingDataType[%d]=%d",i4,DEF_DOUBLE);
1673 OpcodeCalc(temp2);
1674 }
1675 //else if(iResult==-1) エラー
1676
1677 i4++;
1678 if(Parameter[i2]=='\0') break;
1679 }
1680 sprintf(temp2,"_System_UsingDataType[%d]=-1",i4);
1681 OpcodeCalc(temp2);
1682
1683 SUBINFO *psi;
1684 if(bFile) psi=GetSubHash("PRINTUSING_ToFile");
1685 else psi=GetSubHash("PRINTUSING_ToPrompt");
1686 if(!psi){
1687 SetError(3,"Print",cp);
1688 return;
1689 }
1690 Opcode_CallProc(buffer,psi,0,"",0);
1691}
1692void Opcode_Print(char *Parameter,BOOL bWrite){
1693 int i2,i3,i4,sw;
1694 char temporary[VN_SIZE],buffer[VN_SIZE];
1695 BOOL bFile;
1696
1697 KillStringSpaces(Parameter);
1698
1699 if(Parameter[0]=='#'){
1700 bFile=1;
1701 for(i2=0,i3=1;;i2++,i3++){
1702 buffer[i2]=Parameter[i3];
1703 if(Parameter[i3]==','||Parameter[i3]=='\0') break;
1704 }
1705 buffer[i2+1]=0;
1706 if(Parameter[i3]==',') i3++;
1707 i2=i3;
1708 }
1709 else{
1710 bFile=0;
1711 i2=0;
1712 buffer[0]=0;
1713 }
1714 if(Parameter[i2]==1&&Parameter[i2+1]==ESC_USING){
1715 Opcode_PrintUsing(Parameter+i2+2,buffer,bFile);
1716 return;
1717 }
1718
1719 lstrcat(buffer,"_System_DummyStr+");
1720
1721 sw=1;
1722 while(1){
1723 for(i3=0;;i2++,i3++){
1724 if(Parameter[i2]=='\"'){
1725 temporary[i3]=Parameter[i2];
1726 for(i2++,i3++;;i2++,i3++){
1727 temporary[i3]=Parameter[i2];
1728 if(Parameter[i2]=='\"') break;
1729 }
1730 continue;
1731 }
1732 if(Parameter[i2]=='('){
1733 i4=GetStringInPare(temporary+i3,Parameter+i2);
1734 i2+=i4-1;
1735 i3+=i4-1;
1736 continue;
1737 }
1738 if(Parameter[i2]=='['){
1739 i4=GetStringInBracket(temporary+i3,Parameter+i2);
1740 i2+=i4-1;
1741 i3+=i4-1;
1742 continue;
1743 }
1744 if(Parameter[i2]==','||Parameter[i2]==';'){
1745 temporary[i3]=0;
1746 break;
1747 }
1748 temporary[i3]=Parameter[i2];
1749 if(Parameter[i2]=='\0') break;
1750 }
1751
1752 if(temporary[0]=='\0') lstrcat(buffer,"\"\"");
1753 else{
1754 int iResult;
1755 iResult=IsStrCalculation(temporary);
1756 if(iResult==-1){
1757 //エラー
1758 lstrcat(buffer,"\"\"");
1759 }
1760 else if(iResult){
1761 //文字列
1762 lstrcat(buffer,temporary);
1763 }
1764 else{
1765 //数値
1766 sprintf(buffer+lstrlen(buffer),"Str$(%s)",temporary);
1767 }
1768 }
1769
1770 if(Parameter[i2]==','){
1771 if(bWrite) lstrcat(buffer,"+\",\"+");
1772 else lstrcat(buffer,"+\"\t\"+");
1773 }
1774 else if(Parameter[i2]==';'){
1775 if(Parameter[i2+1]=='\0'){
1776 sw=0;
1777 break;
1778 }
1779 if(bWrite) lstrcat(buffer,"+\",\"+");
1780 else lstrcat(buffer,"+\" \"+");
1781 }
1782 else if(Parameter[i2]=='\0') break;
1783
1784 i2++;
1785 }
1786
1787 if(sw) lstrcat(buffer,"+Ex\"\\r\\n\"");
1788
1789 SUBINFO *psi;
1790 if(bFile) psi=GetSubHash("PRINT_ToFile");
1791 else psi=GetSubHash("PRINT_ToPrompt");
1792 if(!psi){
1793 SetError(3,"Print",cp);
1794 return;
1795 }
1796 Opcode_CallProc(buffer,psi,0,"",0);
1797}
1798
1799
1800
1801
1802////////////
1803// ポインタ
1804
1805void OpcodeCallPtr(char *Parameter){
1806 extern HANDLE hHeap;
1807 int i,i2,i3,num,types[255];
1808 BOOL bCdecl;
1809 char szFuncPtr[VN_SIZE],temporary[VN_SIZE],*Parms[255];
1810
1811 //関数ポインタを取得
1812 i=GetOneParameter(Parameter,0,szFuncPtr);
1813
1814 if(lstrcmpi(szFuncPtr,"cdecl")==0){
1815 //cdeclが指定された場合は、第2パラメータを関数ポインタとして扱う
1816 bCdecl=1;
1817
1818 i=GetOneParameter(Parameter,i,szFuncPtr);
1819 }
1820 else bCdecl=0;
1821
1822 if(Parameter[0]=='\0'){
1823 SetError(10,"CallPtr",cp);
1824 }
1825
1826 num=0;
1827 while(Parameter[i]){
1828 i=GetOneParameter(Parameter,i,temporary);
1829
1830 types[num]=DEF_LONG;
1831
1832 for(i2=0;;i2++){
1833 if(temporary[i2]=='\0') break;
1834 if(temporary[i2]==1&&temporary[i2+1]==ESC_AS){
1835 LONG_PTR lp;
1836 types[num]=GetTypeFixed(temporary+i2+2,&lp);
1837
1838 if(types[num]==DEF_OBJECT){
1839 SetError(11,temporary+i2+2,cp);
1840 }
1841
1842 temporary[i2]=0;
1843 break;
1844 }
1845 }
1846
1847 Parms[num]=(char *)HeapAlloc(hHeap,0,lstrlen(temporary)+1);
1848 lstrcpy(Parms[num],temporary);
1849
1850 num++;
1851 }
1852
1853 int ParmSize=0;
1854
1855 for(i=num-1;i>=0;i--){
1856 //スタックへプッシュ
1857 i3=NumOpe(Parms[i],0,0,0);
1858
1859 switch(types[i]){
1860 case DEF_INT64:
1861 case DEF_QWORD:
1862 ChangeTypeToInt64(i3);
1863 break;
1864 case DEF_SINGLE:
1865 ChangeTypeToSingle(i3);
1866 break;
1867 case DEF_DOUBLE:
1868 ChangeTypeToDouble(i3);
1869 break;
1870
1871 default:
1872 ChangeTypeToLong(i3);
1873 break;
1874 }
1875
1876 ParmSize+=GetTypeSize(types[i],0);
1877
1878 HeapDefaultFree(Parms[i]);
1879 }
1880
1881 i3=NumOpe(szFuncPtr,0,0,0);
1882 ChangeTypeToLong(i3);
1883
1884 //pop eax
1885 op_pop(REG_EAX);
1886
1887 //call eax
1888 OpBuffer[obp++]=(char)0xFF;
1889 OpBuffer[obp++]=(char)0xD0;
1890
1891 if(bCdecl){
1892 //スタックを戻す
1893
1894 //add esp,ParmSize
1895 op_add_esp(ParmSize);
1896 }
1897}
1898
1899void OpcodeSetPtrData(char *Parameter,int type){
1900 int i,i2;
1901 char temporary[VN_SIZE];
1902
1903 if(Parameter[0]=='('){
1904 i=JumpStringInPare(Parameter,1);
1905 if(Parameter[i+1]=='\0'){
1906 for(i=0;;i++){
1907 Parameter[i]=Parameter[i+1];
1908 if(Parameter[i]=='\0') break;
1909 }
1910 Parameter[i-1]=0;
1911 }
1912 }
1913
1914 //第1パラメータを取得
1915 i=GetOneParameter(Parameter,0,temporary);
1916 if(!Parameter[i]){
1917 SetError(1,NULL,cp);
1918 return;
1919 }
1920
1921 i2=NumOpe(temporary,0,0,0);
1922 ChangeTypeToLong(i2);
1923
1924 //第2パラメータを取得
1925 i=GetOneParameter(Parameter,i,temporary);
1926 if(Parameter[i]){
1927 SetError(1,NULL,cp);
1928 return;
1929 }
1930
1931 i2=NumOpe(temporary,0,0,0);
1932 if(type==DEF_DOUBLE){
1933 ChangeTypeToDouble_ToFpuReg(i2);
1934
1935 //pop eax
1936 op_pop(REG_EAX);
1937
1938 //fstp qword ptr[eax]
1939 OpBuffer[obp++]=(char)0xDD;
1940 OpBuffer[obp++]=(char)0x18;
1941 }
1942 else if(type==DEF_SINGLE){
1943 ChangeTypeToSingle(i2);
1944
1945 //pop ebx
1946 op_pop(REG_EBX);
1947
1948 //pop eax
1949 op_pop(REG_EAX);
1950
1951 //mov dword ptr[eax],ebx
1952 OpBuffer[obp++]=(char)0x89;
1953 OpBuffer[obp++]=(char)0x18;
1954 }
1955 else if(type==DEF_QWORD){
1956 ChangeTypeToInt64(i2);
1957
1958 //pop ecx
1959 op_pop(REG_ECX);
1960
1961 //pop ebx
1962 op_pop(REG_EBX);
1963
1964 //pop eax
1965 op_pop(REG_EAX);
1966
1967 //mov dword ptr[eax],ecx
1968 OpBuffer[obp++]=(char)0x89;
1969 OpBuffer[obp++]=(char)0x08;
1970
1971 //mov dword ptr[eax+sizeof(long)],ebx
1972 OpBuffer[obp++]=(char)0x89;
1973 OpBuffer[obp++]=(char)0x58;
1974 OpBuffer[obp++]=(char)0x04;
1975 }
1976 else if(type==DEF_DWORD){
1977 ChangeTypeToLong(i2);
1978
1979 //pop ebx
1980 op_pop(REG_EBX);
1981
1982 //pop eax
1983 op_pop(REG_EAX);
1984
1985 //mov dword ptr[eax],ebx
1986 OpBuffer[obp++]=(char)0x89;
1987 OpBuffer[obp++]=(char)0x18;
1988 }
1989 else if(type==DEF_WORD){
1990 ChangeTypeToLong(i2);
1991
1992 //pop ebx
1993 op_pop(REG_EBX);
1994
1995 //pop eax
1996 op_pop(REG_EAX);
1997
1998 //mov word ptr[eax],bx
1999 OpBuffer[obp++]=(char)0x66;
2000 OpBuffer[obp++]=(char)0x89;
2001 OpBuffer[obp++]=(char)0x18;
2002 }
2003 else if(type==DEF_BYTE){
2004 ChangeTypeToLong(i2);
2005
2006 //pop ebx
2007 op_pop(REG_EBX);
2008
2009 //pop eax
2010 op_pop(REG_EAX);
2011
2012 //mov byte ptr[eax],bl
2013 OpBuffer[obp++]=(char)0x88;
2014 OpBuffer[obp++]=(char)0x18;
2015 }
2016}
Note: See TracBrowser for help on using the repository browser.