Changeset 34 in dev for BasicCompiler32/Compile_Statement.cpp
- Timestamp:
- Jan 14, 2007, 6:11:23 AM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
BasicCompiler32/Compile_Statement.cpp
r31 r34 299 299 300 300 //レキシカルスコープをレベルアップ 301 obj_LexScopes. LevelUp(obp);301 obj_LexScopes.Start( obp, SCOPE_TYPE_IF ); 302 302 303 303 i2=CompileBuffer(ESC_ENDIF,0); 304 304 305 305 //レキシカルスコープをレベルダウン 306 obj_LexScopes. LevelDown();306 obj_LexScopes.End(); 307 307 308 308 … … 325 325 326 326 //レキシカルスコープをレベルアップ 327 obj_LexScopes. LevelUp(obp);327 obj_LexScopes.Start( obp, SCOPE_TYPE_IF ); 328 328 329 329 CompileBuffer(ESC_ENDIF,0); 330 330 331 331 //レキシカルスコープをレベルダウン 332 obj_LexScopes. LevelDown();332 obj_LexScopes.End(); 333 333 334 334 … … 402 402 } 403 403 void OpcodeWhile(char *Parameter){ 404 extern DWORD *pExitWhileSchedule;405 extern int ExitWhileScheduleNum;406 404 extern HANDLE hHeap; 407 405 int i2,i3,type; 408 DWORD *lpdwTemp;409 int TempNum;410 406 411 407 //Continueアドレスのバックアップとセット … … 550 546 } 551 547 552 //ExitWhileスケジュールの準備553 lpdwTemp=pExitWhileSchedule;554 TempNum=ExitWhileScheduleNum;555 pExitWhileSchedule=(DWORD *)HeapAlloc(hHeap,0,1);556 ExitWhileScheduleNum=0;557 558 548 //レキシカルスコープをレベルアップ 559 obj_LexScopes. LevelUp(obp);549 obj_LexScopes.Start( obp, SCOPE_TYPE_WHILE ); 560 550 561 551 //While内をコンパイル 562 552 CompileBuffer(0,COM_WEND); 563 553 564 CallDestrouctorsOfScope();554 obj_LexScopes.CallDestructorsOfScopeEnd(); 565 555 566 556 //jmp ... … … 569 559 obp+=sizeof(long); 570 560 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 561 //レキシカルスコープをレベルダウン 580 obj_LexScopes. LevelDown();562 obj_LexScopes.End(); 581 563 582 564 *((long *)(OpBuffer+je_schedule-sizeof(long)))=obp-je_schedule; //jeジャンプ先のオフセット値 … … 585 567 dwContinueAddress=dwTempContinue; 586 568 } 587 void 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 } 569 606 570 char szNextVariable[VN_SIZE]; 607 571 void OpcodeFor(char *Parameter){ 608 extern DWORD *pExitForSchedule;609 extern int ExitForScheduleNum;610 572 extern HANDLE hHeap; 611 DWORD *lpdwTemp;612 int TempNum;613 573 int i,i2,i3; 614 574 char temporary[VN_SIZE],variable[VN_SIZE],JudgeNum[VN_SIZE],StepNum[VN_SIZE]; … … 717 677 obp+=sizeof(long); 718 678 719 //ExitForスケジュールの準備720 lpdwTemp=pExitForSchedule;721 TempNum=ExitForScheduleNum;722 pExitForSchedule=(DWORD *)HeapAlloc(hHeap,0,1);723 ExitForScheduleNum=0;724 725 679 //レキシカルスコープをレベルアップ 726 obj_LexScopes. LevelUp(obp);680 obj_LexScopes.Start( obp, SCOPE_TYPE_FOR ); 727 681 728 682 //For内をコンパイル 729 683 CompileBuffer(0,COM_NEXT); 730 684 731 CallDestrouctorsOfScope();685 obj_LexScopes.CallDestructorsOfScopeEnd(); 732 686 733 687 if(szNextVariable[0]){ … … 742 696 obp+=sizeof(long); 743 697 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 698 //レキシカルスコープをレベルダウン 753 obj_LexScopes. LevelDown();699 obj_LexScopes.End(); 754 700 755 701 *((long *)(OpBuffer+je_schedule))=obp-(je_schedule+sizeof(long)); //jeジャンプ先のオフセット値 … … 758 704 dwContinueAddress=dwTempContinue; 759 705 } 760 void 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 706 780 707 void OpcodeDo(char *Parameter){ 781 extern DWORD *pExitDoSchedule;782 extern int ExitDoScheduleNum;783 708 extern HANDLE hHeap; 784 709 int i,i2,i3,i4,type; 785 DWORD *lpdwTemp;786 int TempNum;787 710 788 711 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 712 796 713 //Continueアドレスのバックアップとセット … … 801 718 802 719 //レキシカルスコープをレベルアップ 803 obj_LexScopes. LevelUp(obp);720 obj_LexScopes.Start( obp, SCOPE_TYPE_DO ); 804 721 805 722 //Do内をコンパイル 806 723 CompileBuffer(0,COM_LOOP); 807 724 808 CallDestrouctorsOfScope();725 obj_LexScopes.CallDestructorsOfScopeEnd(); 809 726 810 727 extern char *basbuf; … … 1007 924 obp+=sizeof(long); 1008 925 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 926 //レキシカルスコープをレベルダウン 1018 obj_LexScopes. LevelDown();927 obj_LexScopes.End(); 1019 928 1020 929 *((long *)(OpBuffer+je_schedule))=obp-(je_schedule+sizeof(long)); //jmpジャンプ先のオフセット値 … … 1023 932 //Continueアドレスを復元 1024 933 dwContinueAddress=dwTempContinue; 1025 }1026 void 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 934 } 1045 935 void OpcodeContinue(void){ … … 1068 958 return; 1069 959 } 960 961 //未解放のローカルオブジェクトのデストラクタを呼び出す 962 obj_LexScopes.CallDestructorsOfReturn(); 1070 963 1071 964 //jmp ...(End Sub/Function) … … 1354 1247 1355 1248 //レキシカルスコープをレベルアップ 1356 obj_LexScopes. LevelUp(obp);1249 obj_LexScopes.Start( obp, SCOPE_TYPE_SELECT ); 1357 1250 1358 1251 //Select Case内をコンパイル … … 1371 1264 1372 1265 //レキシカルスコープをレベルダウン 1373 obj_LexScopes. LevelDown();1266 obj_LexScopes.End(); 1374 1267 1375 1268 pCaseSchedule=temp_pCaseSchedule;
Note:
See TracChangeset
for help on using the changeset viewer.