Changeset 34 in dev for BasicCompiler32
- Timestamp:
- Jan 14, 2007, 6:11:23 AM (18 years ago)
- Location:
- BasicCompiler32
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
BasicCompiler32/BasicCompiler.vcproj
r28 r34 1168 1168 </File> 1169 1169 <File 1170 RelativePath="..\BasicCompiler_Common\ schedule.h"1170 RelativePath="..\BasicCompiler_Common\PESchedule.h" 1171 1171 > 1172 1172 </File> -
BasicCompiler32/Compile_ProcOp.cpp
r31 r34 88 88 bCompilingGlobal=1; 89 89 90 CallDestrouctorsOfScope();90 obj_LexScopes.CallDestructorsOfScopeEnd(); 91 91 92 92 bCompilingGlobal=bBackCompilingGlobal; … … 658 658 } 659 659 660 //プロシージャ抜け出しスケジュール(Exit Sub/Function)661 for(i3=0;i3<ExitSubScheduleNum;i3++){662 *((long *)(OpBuffer+pExitSubSchedule[i3]))=obp-(pExitSubSchedule[i3]+sizeof(long));663 }664 HeapDefaultFree(pExitSubSchedule);665 666 if(bDebugCompile&&bDebugSupportProc==0){667 *((long *)(OpBuffer+EspOffsetSchedule))=AllLocalVarSize-BaseOffset;668 669 //call _DebugSys_EndProc670 extern SUBINFO *pSub_DebugSys_EndProc;671 op_call(pSub_DebugSys_EndProc);672 }673 674 660 //ラベル用のメモリを解放 675 661 for(i3=0;i3<MaxLabelNum;i3++){ … … 707 693 708 694 //ローカルオブジェクトの解放処理 709 CallDestrouctorsOfScope(); 695 obj_LexScopes.CallDestructorsOfScopeEnd(); 696 697 //プロシージャ抜け出しスケジュール(Exit Sub/Function) 698 for(i3=0;i3<ExitSubScheduleNum;i3++){ 699 *((long *)(OpBuffer+pExitSubSchedule[i3]))=obp-(pExitSubSchedule[i3]+sizeof(long)); 700 } 701 HeapDefaultFree(pExitSubSchedule); 702 703 if(bDebugCompile&&bDebugSupportProc==0){ 704 *((long *)(OpBuffer+EspOffsetSchedule))=AllLocalVarSize-BaseOffset; 705 706 //call _DebugSys_EndProc 707 extern SUBINFO *pSub_DebugSys_EndProc; 708 op_call(pSub_DebugSys_EndProc); 709 } 710 710 711 711 if(psi->ReturnType!=-1){ -
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; -
BasicCompiler32/Compile_Var.cpp
r28 r34 381 381 382 382 for(i=MaxLocalVarNum-1;i>=0;i--){ //レキシカルスコープを考慮してバックサーチ 383 if(LocalVar[i].bLiving){ 384 if(lstrcmp(VarName,LocalVar[i].name)==0) break; 383 if( LocalVar[i].bLiving //現在のスコープで有効なもの 384 && LocalVar[i].ScopeLevel <= obj_LexScopes.GetNowLevel() //現在のスコープレベルを超さないもの(Returnによる解放処理中を考慮) 385 ){ 386 if(lstrcmp(VarName,LocalVar[i].name)==0) break; 385 387 } 386 388 } … … 540 542 541 543 for(i=MaxGlobalVarNum-1;i>=0;i--){ //レキシカルスコープを考慮してバックサーチ 542 if(GlobalVar[i].bLiving){ 543 if(lstrcmp(VarName,GlobalVar[i].name)==0) break; 544 if( GlobalVar[i].bLiving //現在のスコープで有効なもの 545 && GlobalVar[i].ScopeLevel <= obj_LexScopes.GetNowLevel() //現在のスコープレベルを超さないもの(Returnによる解放処理中を考慮) 546 ){ 547 if(lstrcmp(VarName,GlobalVar[i].name)==0) break; 544 548 } 545 549 } -
BasicCompiler32/Opcode.h
r31 r34 247 247 void OpcodeGoto(char *Parameter); 248 248 void OpcodeWhile(char *Parameter); 249 void OpcodeExitWhile(void);250 249 void OpcodeFor(char *Parameter); 251 void OpcodeExitFor(void);252 250 void OpcodeDo(char *Parameter); 253 void OpcodeExitDo(void);254 251 void OpcodeContinue(void); 255 252 void OpcodeExitSub(void);
Note:
See TracChangeset
for help on using the changeset viewer.