Changeset 34 in dev
- Timestamp:
- Jan 14, 2007, 6:11:23 AM (18 years ago)
- Files:
-
- 1 added
- 2 deleted
- 18 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); -
BasicCompiler64/BasicCompiler.vcproj
r26 r34 1482 1482 </File> 1483 1483 <File 1484 RelativePath="..\BasicCompiler_Common\schedule.h" 1484 RelativePath="..\BasicCompiler_Common\PESchedule.h" 1485 > 1486 </File> 1487 <File 1488 RelativePath="..\BasicCompiler_Common\Schedule.cpp" 1489 > 1490 </File> 1491 <File 1492 RelativePath="..\BasicCompiler_Common\Schedule.h" 1485 1493 > 1486 1494 </File> -
BasicCompiler64/Compile_ProcOp.cpp
r31 r34 109 109 bCompilingGlobal=1; 110 110 111 CallDestrouctorsOfScope();111 obj_LexScopes.CallDestructorsOfScopeEnd(); 112 112 113 113 bCompilingGlobal=bBackCompilingGlobal; … … 700 700 } 701 701 702 //プロシージャ抜け出しスケジュール(Exit Sub/Function)703 for(i3=0;i3<ExitSubScheduleNum;i3++){704 *((long *)(OpBuffer+pExitSubSchedule[i3]))=obp-(pExitSubSchedule[i3]+sizeof(long));705 }706 HeapDefaultFree(pExitSubSchedule);707 708 if(bDebugCompile&&bDebugSupportProc==0){709 //call _DebugSys_EndProc710 extern SUBINFO *pSub_DebugSys_EndProc;711 op_call(pSub_DebugSys_EndProc);712 }713 714 702 //ラベル用のメモリを解放 715 703 for(i3=0;i3<MaxLabelNum;i3++){ … … 744 732 745 733 //ローカルオブジェクト(レキシカルスコープレベル=0)の解放処理 746 CallDestrouctorsOfScope(); 734 obj_LexScopes.CallDestructorsOfScopeEnd(); 735 736 //プロシージャ抜け出しスケジュール(Exit Sub/Function) 737 for(i3=0;i3<ExitSubScheduleNum;i3++){ 738 *((long *)(OpBuffer+pExitSubSchedule[i3]))=obp-(pExitSubSchedule[i3]+sizeof(long)); 739 } 740 HeapDefaultFree(pExitSubSchedule); 741 742 if(bDebugCompile&&bDebugSupportProc==0){ 743 //call _DebugSys_EndProc 744 extern SUBINFO *pSub_DebugSys_EndProc; 745 op_call(pSub_DebugSys_EndProc); 746 } 747 747 748 748 if(psi->ReturnType!=-1){ -
BasicCompiler64/Compile_Statement.cpp
r31 r34 191 191 192 192 //レキシカルスコープをレベルアップ 193 obj_LexScopes. LevelUp(obp);193 obj_LexScopes.Start( obp, SCOPE_TYPE_IF ); 194 194 195 195 i2=CompileBuffer(ESC_ENDIF,0); 196 196 197 197 //レキシカルスコープをレベルダウン 198 obj_LexScopes. LevelDown();198 obj_LexScopes.End(); 199 199 200 200 … … 215 215 216 216 //レキシカルスコープをレベルアップ 217 obj_LexScopes. LevelUp(obp);217 obj_LexScopes.Start( obp, SCOPE_TYPE_IF ); 218 218 219 219 CompileBuffer(ESC_ENDIF,0); 220 220 221 221 //レキシカルスコープをレベルダウン 222 obj_LexScopes. LevelDown();222 obj_LexScopes.End(); 223 223 224 224 … … 292 292 } 293 293 void OpcodeWhile(char *Parameter){ 294 extern DWORD *pExitWhileSchedule;295 extern int ExitWhileScheduleNum;296 294 extern HANDLE hHeap; 297 295 int i2; 298 DWORD *lpdwTemp;299 int TempNum;300 296 301 297 //Continueアドレスのバックアップとセット … … 321 317 pobj_TempSchedule->lock(&je_schedule); 322 318 323 //ExitWhileスケジュールの準備324 lpdwTemp=pExitWhileSchedule;325 TempNum=ExitWhileScheduleNum;326 pExitWhileSchedule=(DWORD *)HeapAlloc(hHeap,0,1);327 ExitWhileScheduleNum=0;328 329 319 //レキシカルスコープをレベルアップ 330 obj_LexScopes. LevelUp(obp);320 obj_LexScopes.Start( obp, SCOPE_TYPE_WHILE ); 331 321 332 322 //While内をコンパイル 333 323 CompileBuffer(0,COM_WEND); 334 324 335 CallDestrouctorsOfScope();325 obj_LexScopes.CallDestructorsOfScopeEnd(); 336 326 337 327 //jmp ... … … 342 332 pobj_TempSchedule->unlock(); 343 333 344 //ExitWhileスケジュール345 for(i2=0;i2<ExitWhileScheduleNum;i2++){346 *((long *)(OpBuffer+pExitWhileSchedule[i2]))=obp-(pExitWhileSchedule[i2]+sizeof(long));347 }348 HeapDefaultFree(pExitWhileSchedule);349 pExitWhileSchedule=lpdwTemp;350 ExitWhileScheduleNum=TempNum;351 352 334 //レキシカルスコープをレベルダウン 353 obj_LexScopes. LevelDown();335 obj_LexScopes.End(); 354 336 355 337 *((long *)(OpBuffer+je_schedule-sizeof(long)))=obp-je_schedule; //jeジャンプ先のオフセット値 … … 359 341 dwContinueAddress=dwTempContinue; 360 342 } 361 void OpcodeExitWhile(void){ 362 extern DWORD *pExitWhileSchedule; 363 extern int ExitWhileScheduleNum; 364 extern HANDLE hHeap; 365 366 if(!pExitWhileSchedule){ 367 SetError(12,"Exit While",cp); 368 return; 369 } 370 371 //jmp ...(Wend addr) 372 OpBuffer[obp++]=(char)0xE9; 373 374 pExitWhileSchedule=(DWORD *)HeapReAlloc(hHeap,0,pExitWhileSchedule,(ExitWhileScheduleNum+1)*sizeof(DWORD)); 375 pExitWhileSchedule[ExitWhileScheduleNum]=obp; 376 ExitWhileScheduleNum++; 377 378 obp+=sizeof(long); 379 } 343 380 344 char szNextVariable[VN_SIZE]; 381 345 void OpcodeFor(char *Parameter){ 382 extern DWORD *pExitForSchedule;383 extern int ExitForScheduleNum;384 346 extern HANDLE hHeap; 385 DWORD *lpdwTemp;386 int TempNum;387 347 int i,i2,i3; 388 348 char temporary[VN_SIZE],variable[VN_SIZE],JudgeNum[VN_SIZE],StepNum[VN_SIZE]; 349 bool isError = false; 389 350 390 351 //第1パラメータを取得 … … 392 353 if(!Parameter[i]){ 393 354 SetError(12,"For",cp); 355 isError = true; 394 356 goto ErrorStep; 395 357 } … … 405 367 if(temporary[i2]=='\0'){ 406 368 SetError(12,"For",cp); 369 isError = true; 407 370 goto ErrorStep; 408 371 } … … 488 451 pobj_TempSchedule->lock(&je_schedule); 489 452 490 //ExitForスケジュールの準備491 lpdwTemp=pExitForSchedule;492 TempNum=ExitForScheduleNum;493 pExitForSchedule=(DWORD *)HeapAlloc(hHeap,0,1);494 ExitForScheduleNum=0;495 496 453 //レキシカルスコープをレベルアップ 497 obj_LexScopes. LevelUp(obp);454 obj_LexScopes.Start( obp, SCOPE_TYPE_FOR ); 498 455 499 456 //For内をコンパイル 500 457 CompileBuffer(0,COM_NEXT); 501 458 502 CallDestrouctorsOfScope();459 obj_LexScopes.CallDestructorsOfScopeEnd(); 503 460 504 461 if(szNextVariable[0]){ … … 512 469 *((long *)(OpBuffer+obp))=dwContinueAddress-(obp+sizeof(long)); 513 470 obp+=sizeof(long); 514 pobj_TempSchedule->unlock(); 515 pobj_TempSchedule->unlock(); 516 517 //ExitForスケジュール 518 for(i=0;i<ExitForScheduleNum;i++){ 519 *((long *)(OpBuffer+pExitForSchedule[i]))=obp-(pExitForSchedule[i]+sizeof(long)); 520 } 521 HeapDefaultFree(pExitForSchedule); 522 pExitForSchedule=lpdwTemp; 523 ExitForScheduleNum=TempNum; 471 if( isError == false ){ 472 pobj_TempSchedule->unlock(); 473 pobj_TempSchedule->unlock(); 474 } 524 475 525 476 //レキシカルスコープをレベルダウン 526 obj_LexScopes. LevelDown();477 obj_LexScopes.End(); 527 478 528 479 *((long *)(OpBuffer+je_schedule))=obp-(je_schedule+sizeof(long)); //jeジャンプ先のオフセット値 … … 532 483 dwContinueAddress=dwTempContinue; 533 484 } 534 void OpcodeExitFor(void){535 extern DWORD *pExitForSchedule;536 extern int ExitForScheduleNum;537 extern HANDLE hHeap;538 539 if(!pExitForSchedule){540 SetError(12,"Exit For",cp);541 return;542 }543 544 //jmp ...(Next addr)545 OpBuffer[obp++]=(char)0xE9;546 547 pExitForSchedule=(DWORD *)HeapReAlloc(hHeap,0,pExitForSchedule,(ExitForScheduleNum+1)*sizeof(DWORD));548 pExitForSchedule[ExitForScheduleNum]=obp;549 ExitForScheduleNum++;550 551 obp+=sizeof(long);552 }553 485 554 486 void OpcodeDo(char *Parameter){ 555 extern DWORD *pExitDoSchedule;556 extern int ExitDoScheduleNum;557 487 extern HANDLE hHeap; 558 488 int i,i2,i3; 559 DWORD *lpdwTemp;560 int TempNum;561 489 562 490 if(Parameter[0]) SetError(10,"Do",cp); 563 564 //ExitDoスケジュールの準備565 lpdwTemp=pExitDoSchedule;566 TempNum=ExitDoScheduleNum;567 pExitDoSchedule=(DWORD *)HeapAlloc(hHeap,0,1);568 ExitDoScheduleNum=0;569 491 570 492 //Continueアドレスのバックアップとセット … … 577 499 578 500 //レキシカルスコープをレベルアップ 579 obj_LexScopes. LevelUp(obp);501 obj_LexScopes.Start( obp, SCOPE_TYPE_DO ); 580 502 581 503 //Do内をコンパイル 582 504 CompileBuffer(0,COM_LOOP); 583 505 584 CallDestrouctorsOfScope();506 obj_LexScopes.CallDestructorsOfScopeEnd(); 585 507 586 508 extern char *basbuf; … … 637 559 pobj_TempSchedule->lock(&je_schedule); 638 560 639 //ExitDoスケジュール640 for(i=0;i<ExitDoScheduleNum;i++){641 *((long *)(OpBuffer+pExitDoSchedule[i]))=obp-(pExitDoSchedule[i]+sizeof(long));642 }643 HeapDefaultFree(pExitDoSchedule);644 pExitDoSchedule=lpdwTemp;645 ExitDoScheduleNum=TempNum;646 647 561 //レキシカルスコープをレベルダウン 648 obj_LexScopes. LevelDown();562 obj_LexScopes.End(); 649 563 650 564 *((long *)(OpBuffer+je_schedule))=obp-(je_schedule+sizeof(long)); //jmpジャンプ先のオフセット値 … … 653 567 //Continueアドレスを復元 654 568 dwContinueAddress=dwTempContinue; 655 }656 void OpcodeExitDo(void){657 extern HANDLE hHeap;658 extern DWORD *pExitDoSchedule;659 extern int ExitDoScheduleNum;660 661 if(!pExitDoSchedule){662 SetError(12,"Exit Do",cp);663 return;664 }665 666 //jmp ...(Loop addr)667 OpBuffer[obp++]=(char)0xE9;668 669 pExitDoSchedule=(DWORD *)HeapReAlloc(hHeap,0,pExitDoSchedule,(ExitDoScheduleNum+1)*sizeof(DWORD));670 pExitDoSchedule[ExitDoScheduleNum]=obp;671 ExitDoScheduleNum++;672 673 obp+=sizeof(long);674 569 } 675 570 void OpcodeContinue(void){ … … 698 593 return; 699 594 } 595 596 //未解放のローカルオブジェクトのデストラクタを呼び出す 597 obj_LexScopes.CallDestructorsOfReturn(); 700 598 701 599 //jmp ...(End Sub/Function) … … 938 836 939 837 //レキシカルスコープをレベルアップ 940 obj_LexScopes. LevelUp(obp);838 obj_LexScopes.Start( obp, SCOPE_TYPE_SELECT ); 941 839 942 840 //Select Case内をコンパイル … … 955 853 956 854 //レキシカルスコープをレベルダウン 957 obj_LexScopes. LevelDown();855 obj_LexScopes.End(); 958 856 959 857 pCaseSchedule=temp_pCaseSchedule; … … 1051 949 extern BOOL bCompilingGlobal; 1052 950 if(bCompilingGlobal){ 1053 //Gosub~Returnとして扱う 1054 1055 //mov rax,qword ptr[rsp+offset] ※スタックフレームを利用 1056 pobj_sf->push(REG_NON); 1057 pobj_sf->ref(REG_RAX); 1058 pobj_sf->pop(REG_NON); 1059 1060 //jmp rax 1061 OpBuffer[obp++]=(char)0xFF; 1062 OpBuffer[obp++]=(char)0xE0; 951 SetError(62,NULL,cp); 1063 952 } 1064 953 else{ -
BasicCompiler64/Compile_Var.cpp
r28 r34 408 408 409 409 for(i=MaxLocalVarNum-1;i>=0;i--){ //レキシカルスコープを考慮してバックサーチ 410 if(LocalVar[i].bLiving){ 411 if(lstrcmp(VarName,LocalVar[i].name)==0) break; 410 if( LocalVar[i].bLiving //現在のスコープで有効なもの 411 && LocalVar[i].ScopeLevel <= obj_LexScopes.GetNowLevel() //現在のスコープレベルを超さないもの(Returnによる解放処理中を考慮) 412 ){ 413 if(lstrcmp(VarName,LocalVar[i].name)==0) break; 412 414 } 413 415 } … … 564 566 565 567 for(i=MaxGlobalVarNum-1;i>=0;i--){ //レキシカルスコープを考慮してバックサーチ 566 if(GlobalVar[i].bLiving){ 567 if(lstrcmp(VarName,GlobalVar[i].name)==0) break; 568 if( GlobalVar[i].bLiving //現在のスコープで有効なもの 569 && GlobalVar[i].ScopeLevel <= obj_LexScopes.GetNowLevel() //現在のスコープレベルを超さないもの(Returnによる解放処理中を考慮) 570 ){ 571 if(lstrcmp(VarName,GlobalVar[i].name)==0) break; 568 572 } 569 573 } -
BasicCompiler64/Opcode.h
r31 r34 411 411 void OpcodeGoto(char *Parameter); 412 412 void OpcodeWhile(char *Parameter); 413 void OpcodeExitWhile(void);414 413 void OpcodeFor(char *Parameter); 415 void OpcodeExitFor(void);416 414 void OpcodeDo(char *Parameter); 417 void OpcodeExitDo(void);418 415 void OpcodeContinue(void); 419 416 void OpcodeExitSub(void); -
BasicCompiler_Common/Compile.cpp
r26 r34 14 14 LABEL *pLabelNames; 15 15 int MaxLabelNum; 16 17 //ループごとのスケジュール18 DWORD *pExitWhileSchedule; //ExitWhileスケジュール19 int ExitWhileScheduleNum;20 DWORD *pExitForSchedule; //ExitForスケジュール21 int ExitForScheduleNum;22 DWORD *pExitDoSchedule; //ExitDoスケジュール23 int ExitDoScheduleNum;24 16 25 17 //Continueアドレス … … 176 168 break; 177 169 case ESC_EXITWHILE: 178 OpcodeExitWhile();170 obj_LexScopes.ExitWhile(); 179 171 break; 180 172 case ESC_EXITFOR: 181 OpcodeExitFor();173 obj_LexScopes.ExitFor(); 182 174 break; 183 175 case ESC_EXITDO: 184 OpcodeExitDo();176 obj_LexScopes.ExitDo(); 185 177 break; 186 178 case ESC_CONTINUE: -
BasicCompiler_Common/LexicalScoping.cpp
r5 r34 9 9 CLexicalScopes obj_LexScopes; 10 10 11 12 CScope::CScope( int level, int addr, SCOPE_TYPE TypeOfStatement ){ 13 this->level = level; 14 this->StartAddress = addr; 15 this->TypeOfStatement = TypeOfStatement; 16 17 pBreakSchedule = (DWORD *)malloc( 1 ); 18 nBreakSchedule = 0; 19 } 20 CScope::~CScope(){ 21 free( pBreakSchedule ); 22 } 23 24 int CScope::GetStartAddress(){ 25 return StartAddress; 26 } 27 SCOPE_TYPE CScope::GetTypeOfStatement(){ 28 return TypeOfStatement; 29 } 30 31 void CScope::Break(){ 32 //未解放のローカルオブジェクトを解放する 33 obj_LexScopes.CallDestructorsOfReturn( level ); 34 35 //jmp ...(Next addr) 36 OpBuffer[obp++]=(char)0xE9; 37 38 pBreakSchedule=(DWORD *)realloc( pBreakSchedule, ( nBreakSchedule + 1 ) * sizeof(DWORD) ); 39 pBreakSchedule[nBreakSchedule]=obp; 40 nBreakSchedule++; 41 42 obp+=sizeof(long); 43 } 44 void CScope::RunScheduleOfBreak(){ 45 for(int i=0;i<nBreakSchedule;i++){ 46 *((long *)(OpBuffer+pBreakSchedule[i]))=obp-(pBreakSchedule[i]+sizeof(long)); 47 } 48 } 49 50 51 CScope *CLexicalScopes::SearchScope( SCOPE_TYPE TypeOfStatement ){ 52 for( int i = level; i>=0; i-- ){ 53 if( ppScopes[i]->GetTypeOfStatement() == TypeOfStatement ){ 54 return ppScopes[i]; 55 } 56 } 57 return NULL; 58 } 59 11 60 CLexicalScopes::CLexicalScopes(){ 61 ppScopes = (CScope **)malloc( 1 ); 12 62 level=0; 13 63 } 14 64 CLexicalScopes::~CLexicalScopes(){ 65 free( ppScopes ); 15 66 } 16 67 void CLexicalScopes::Init(int addr){ 17 level=0; 18 StartAddresses[level]=addr; 19 } 20 void CLexicalScopes::LevelUp(int addr){ 68 // TODO: エラーチェック 69 70 level = -1; 71 Start( addr, SCOPE_TYPE_BASE ); 72 } 73 void CLexicalScopes::Start( int addr, SCOPE_TYPE TypeOfStatement ){ 21 74 level++; 22 StartAddresses[level]=addr; 23 } 24 void CLexicalScopes::LevelDown(void){ 25 //デストラクタを呼ぶ 26 CallDestrouctorsOfScope(); 27 28 //スコープレベルを下げる 29 level--; 30 if(level<0){ 75 ppScopes = (CScope **)realloc( ppScopes, ( level + 1 ) * sizeof( CScope * ) ); 76 ppScopes[level] = new CScope( level, addr, TypeOfStatement ); 77 } 78 void CLexicalScopes::End(){ 79 if( level <= 0 ){ 31 80 SetError(300,NULL,cp); 32 81 return; 33 82 } 83 84 //デストラクタを呼ぶ 85 CallDestructorsOfScopeEnd(); 34 86 35 87 extern BOOL bCompilingGlobal; … … 51 103 } 52 104 105 //使用済みローカル変数の生存チェックを外す 53 106 for(int i=0;i<num;i++){ 54 if(pVar[i].bLiving&&pVar[i].ScopeLevel==level +1){107 if(pVar[i].bLiving&&pVar[i].ScopeLevel==level){ 55 108 pVar[i].bLiving=0; 56 109 extern int obp; … … 58 111 } 59 112 } 60 } 61 62 int CLexicalScopes::GetNowLevel(void){ 113 114 115 //スコープ抜け出しスケジュール 116 ppScopes[level]->RunScheduleOfBreak(); 117 118 119 //スコープレベルを下げる 120 delete ppScopes[level]; 121 level--; 122 } 123 124 void CLexicalScopes::ExitFor(){ 125 CScope *pScope = SearchScope( SCOPE_TYPE_FOR ); 126 if( !pScope ){ 127 SetError(12,"Exit For",cp); 128 return; 129 } 130 131 pScope->Break(); 132 } 133 void CLexicalScopes::ExitWhile(){ 134 CScope *pScope = SearchScope( SCOPE_TYPE_WHILE ); 135 if( !pScope ){ 136 SetError(12,"Exit While",cp); 137 return; 138 } 139 140 pScope->Break(); 141 } 142 void CLexicalScopes::ExitDo(){ 143 CScope *pScope = SearchScope( SCOPE_TYPE_DO ); 144 if( !pScope ){ 145 SetError(12,"Exit Do",cp); 146 return; 147 } 148 149 pScope->Break(); 150 } 151 152 int CLexicalScopes::GetNowLevel(){ 63 153 return level; 64 154 } 65 int CLexicalScopes::GetStartAddress(void){ 66 return StartAddresses[level]; 67 } 155 void CLexicalScopes::SetNowLevel( int level ){ 156 this->level = level; 157 } 158 int CLexicalScopes::GetStartAddress(){ 159 return ppScopes[level]->GetStartAddress(); 160 } 161 162 163 // スコープ終了時のデストラクタ呼び出し 164 void CLexicalScopes::CallDestructorsOfScopeEnd(){ 165 extern BOOL bCompilingGlobal; 166 VARIABLE *pVar; 167 int num; 168 if(bCompilingGlobal){ 169 //グローバルオブジェクトの解放処理 170 extern VARIABLE *GlobalVar; 171 extern int MaxGlobalVarNum; 172 pVar=GlobalVar; 173 num=MaxGlobalVarNum; 174 } 175 else{ 176 //ローカルオブジェクトの解放処理 177 extern VARIABLE *LocalVar; 178 extern int MaxLocalVarNum; 179 pVar=LocalVar; 180 num=MaxLocalVarNum; 181 } 182 183 184 int i3,i4,i5; 185 int indexSystemGC=-1; 186 for( i3 = num - 1; i3 >= 0; i3-- ){ //確保したのと逆順序で解放するため、バックサーチにする 187 188 if( bCompilingGlobal && GetNowLevel() == 0 ){ 189 if(lstrcmp(pVar[i3].name,"_System_GC")==0){ 190 indexSystemGC=i3; 191 continue; 192 } 193 } 194 195 //同一レベルのレキシカルスコープのみを検知 196 if(!pVar[i3].bLiving) continue; 197 if( pVar[i3].ScopeLevel != GetNowLevel() ) continue; 198 199 if(pVar[i3].type==DEF_OBJECT&&pVar[i3].fRef&OBJECT_PARAMETER){ 200 //実態オブジェクトのパラメータを持つとき 201 202 //デストラクタを呼び出す 203 i5=pVar[i3].u.pobj_c->DestructorMemberSubIndex; 204 if(i5!=-1) 205 Opcode_CallProc("",pVar[i3].u.pobj_c->ppobj_Method[i5]->psi,0,pVar[i3].name,DEF_OBJECT); 206 207 //メモリを解放する 208 209 #ifdef _AMD64_ 210 //x64ビットコード 211 212 //mov rcx,qword ptr[rsp+offset] 213 op_mov_RM(sizeof(_int64),REG_RCX,REG_RSP, 214 -pVar[i3].offset, 215 MOD_BASE_DISP32); 216 obp-=sizeof(long); 217 AddLocalVarAddrSchedule(); 218 obp+=sizeof(long); 219 #else 220 //x86コード 221 222 //mov ecx,dword ptr[ebp+offset] 223 op_mov_RM(sizeof(long),REG_ECX,REG_EBP,-pVar[i3].offset,MOD_BASE_DISP32); 224 obp-=sizeof(long); 225 AddLocalVarAddrSchedule(); 226 obp+=sizeof(long); 227 228 //push ecx 229 op_push(REG_ECX); 230 #endif 231 232 //call free 233 extern SUBINFO *pSub_free; 234 op_call(pSub_free); 235 236 237 if(bCompilingGlobal){ 238 //ここには来ないハズ 239 SetError(300,NULL,cp); 240 } 241 } 242 else if(pVar[i3].type==DEF_OBJECT&&pVar[i3].fRef==0){ 243 //デストラクタの呼び出し 244 i5=pVar[i3].u.pobj_c->DestructorMemberSubIndex; 245 if(i5!=-1){ 246 int ss[MAX_ARRAYDIM]; 247 memset(ss,0,MAX_ARRAYDIM*sizeof(int)); 248 if(pVar[i3].SubScripts[0]!=-1){ 249 while(1){ 250 for(i4=0;;i4++){ 251 if(pVar[i3].SubScripts[i4]==-1) break; 252 253 if(ss[i4]>pVar[i3].SubScripts[i4]){ 254 ss[i4]=0; 255 ss[i4+1]++; 256 } 257 else break; 258 } 259 if(pVar[i3].SubScripts[i4]==-1) break; 260 char temporary[VN_SIZE]; 261 sprintf(temporary,"%s[%d",pVar[i3].name,ss[0]); 262 for(i4=1;;i4++){ 263 if(pVar[i3].SubScripts[i4]==-1) break; 264 265 sprintf(temporary+lstrlen(temporary),",%d",ss[i4]); 266 } 267 lstrcat(temporary,"]"); 268 Opcode_CallProc("",pVar[i3].u.pobj_c->ppobj_Method[i5]->psi,0,temporary,DEF_OBJECT); 269 270 ss[0]++; 271 272 273 //ネイティブコードバッファの再確保 274 extern int obp_AllocSize; 275 if(obp_AllocSize<obp+8192){ 276 obp_AllocSize+=8192; 277 OpBuffer=(char *)HeapReAlloc(hHeap,0,OpBuffer,obp_AllocSize); //matea 278 } 279 } 280 } 281 else{ 282 Opcode_CallProc("",pVar[i3].u.pobj_c->ppobj_Method[i5]->psi,0,pVar[i3].name,DEF_OBJECT); 283 } 284 } 285 } 286 } 287 288 if(indexSystemGC!=-1){ 289 //_System_GCオブジェクトのデストラクタの呼び出し処理 290 i3=pVar[indexSystemGC].u.pobj_c->DestructorMemberSubIndex; 291 if(i3!=-1){ 292 Opcode_CallProc("",pVar[indexSystemGC].u.pobj_c->ppobj_Method[i3]->psi,0,pVar[indexSystemGC].name,DEF_OBJECT); 293 } 294 } 295 } 296 297 // Returnステートメントで発行されるデストラクタを生成 298 void CLexicalScopes::CallDestructorsOfReturn( int BaseLevel ){ 299 //現在のスコープレベルを退避 300 int backupScopeLevel = GetNowLevel(); 301 302 for( int i = GetNowLevel(); i >= BaseLevel; i-- ){ 303 SetNowLevel( i ); 304 305 CallDestructorsOfScopeEnd(); 306 } 307 308 //現在のスコープレベルを復元 309 SetNowLevel( backupScopeLevel ); 310 } -
BasicCompiler_Common/LexicalScoping.h
r4 r34 1 1 2 2 3 enum SCOPE_TYPE{ 4 //ベース 5 SCOPE_TYPE_BASE, 6 7 //分岐 8 SCOPE_TYPE_IF, 9 10 //ループ 11 SCOPE_TYPE_DO, 12 SCOPE_TYPE_FOR, 13 SCOPE_TYPE_WHILE, 14 15 //ケース分け 16 SCOPE_TYPE_SELECT, 17 }; 18 19 class CScope{ 20 int level; 21 int StartAddress; 22 SCOPE_TYPE TypeOfStatement; 23 24 DWORD *pBreakSchedule; 25 int nBreakSchedule; 26 27 public: 28 CScope( int level, int addr, SCOPE_TYPE TypeOfStatement ); 29 ~CScope(); 30 31 int GetStartAddress(); 32 SCOPE_TYPE GetTypeOfStatement(); 33 34 void Break(); 35 void RunScheduleOfBreak(); 36 }; 37 3 38 class CLexicalScopes{ 39 CScope **ppScopes; 4 40 int level; 5 int StartAddresses[1024]; 41 42 CScope *SearchScope( SCOPE_TYPE TypeOfStatement ); 43 6 44 public: 7 45 CLexicalScopes(); 8 46 ~CLexicalScopes(); 9 47 48 //初期化(関数コンパイルの開始時に呼び出される) 10 49 void Init(int addr); 11 50 12 void LevelUp(int addr); 13 void LevelDown(void); 51 // スコープを開始 52 void Start( int addr, SCOPE_TYPE TypeOfStatement ); 53 54 //スコープを終了 55 void End(); 56 57 //スコープ抜け出しステートメント 58 void Break(); 59 void ExitFor(); 60 void ExitWhile(); 61 void ExitDo(); 14 62 15 63 int GetNowLevel(void); 64 void SetNowLevel( int level ); 16 65 int GetStartAddress(void); 66 67 //スコープ終了時のデストラクタ呼び出し 68 void CallDestructorsOfScopeEnd(); 69 70 //Returnステートメント用のデストラクタ呼び出し 71 void CallDestructorsOfReturn( int BaseLevel = 0 ); 17 72 18 73 private: -
BasicCompiler_Common/Object.cpp
r31 r34 183 183 } 184 184 } 185 186 187 void CallDestrouctorsOfScope(void){188 extern BOOL bCompilingGlobal;189 VARIABLE *pVar;190 int num;191 if(bCompilingGlobal){192 //グローバルオブジェクトの解放処理193 extern VARIABLE *GlobalVar;194 extern int MaxGlobalVarNum;195 pVar=GlobalVar;196 num=MaxGlobalVarNum;197 }198 else{199 //ローカルオブジェクトの解放処理200 extern VARIABLE *LocalVar;201 extern int MaxLocalVarNum;202 pVar=LocalVar;203 num=MaxLocalVarNum;204 }205 206 207 int i3,i4,i5;208 int indexSystemGC=-1;209 for(i3=0;i3<num;i3++){210 211 if(bCompilingGlobal&&obj_LexScopes.GetNowLevel()==0){212 if(lstrcmp(pVar[i3].name,"_System_GC")==0){213 indexSystemGC=i3;214 continue;215 }216 }217 218 //同一レベルのレキシカルスコープのみを検知219 if(!pVar[i3].bLiving) continue;220 if(pVar[i3].ScopeLevel!=obj_LexScopes.GetNowLevel()) continue;221 222 if(pVar[i3].type==DEF_OBJECT&&pVar[i3].fRef&OBJECT_PARAMETER){223 //実態オブジェクトのパラメータを持つとき224 225 //デストラクタを呼び出す226 i5=pVar[i3].u.pobj_c->DestructorMemberSubIndex;227 if(i5!=-1)228 Opcode_CallProc("",pVar[i3].u.pobj_c->ppobj_Method[i5]->psi,0,pVar[i3].name,DEF_OBJECT);229 230 //メモリを解放する231 232 #ifdef _AMD64_233 //x64ビットコード234 235 //mov rcx,qword ptr[rsp+offset]236 op_mov_RM(sizeof(_int64),REG_RCX,REG_RSP,237 -pVar[i3].offset,238 MOD_BASE_DISP32);239 obp-=sizeof(long);240 AddLocalVarAddrSchedule();241 obp+=sizeof(long);242 #else243 //x86コード244 245 //mov ecx,dword ptr[ebp+offset]246 op_mov_RM(sizeof(long),REG_ECX,REG_EBP,-pVar[i3].offset,MOD_BASE_DISP32);247 obp-=sizeof(long);248 AddLocalVarAddrSchedule();249 obp+=sizeof(long);250 251 //push ecx252 op_push(REG_ECX);253 #endif254 255 //call free256 extern SUBINFO *pSub_free;257 op_call(pSub_free);258 259 260 if(bCompilingGlobal){261 //ここには来ないハズ262 SetError(300,NULL,cp);263 }264 }265 else if(pVar[i3].type==DEF_OBJECT&&pVar[i3].fRef==0){266 //デストラクタの呼び出し267 i5=pVar[i3].u.pobj_c->DestructorMemberSubIndex;268 if(i5!=-1){269 int ss[MAX_ARRAYDIM];270 memset(ss,0,MAX_ARRAYDIM*sizeof(int));271 if(pVar[i3].SubScripts[0]!=-1){272 while(1){273 for(i4=0;;i4++){274 if(pVar[i3].SubScripts[i4]==-1) break;275 276 if(ss[i4]>pVar[i3].SubScripts[i4]){277 ss[i4]=0;278 ss[i4+1]++;279 }280 else break;281 }282 if(pVar[i3].SubScripts[i4]==-1) break;283 char temporary[VN_SIZE];284 sprintf(temporary,"%s[%d",pVar[i3].name,ss[0]);285 for(i4=1;;i4++){286 if(pVar[i3].SubScripts[i4]==-1) break;287 288 sprintf(temporary+lstrlen(temporary),",%d",ss[i4]);289 }290 lstrcat(temporary,"]");291 Opcode_CallProc("",pVar[i3].u.pobj_c->ppobj_Method[i5]->psi,0,temporary,DEF_OBJECT);292 293 ss[0]++;294 295 296 //ネイティブコードバッファの再確保297 extern int obp_AllocSize;298 if(obp_AllocSize<obp+8192){299 obp_AllocSize+=8192;300 OpBuffer=(char *)HeapReAlloc(hHeap,0,OpBuffer,obp_AllocSize); //matea301 }302 }303 }304 else{305 Opcode_CallProc("",pVar[i3].u.pobj_c->ppobj_Method[i5]->psi,0,pVar[i3].name,DEF_OBJECT);306 }307 }308 }309 }310 311 if(indexSystemGC!=-1){312 //_System_GCオブジェクトのデストラクタの呼び出し処理313 i3=pVar[indexSystemGC].u.pobj_c->DestructorMemberSubIndex;314 if(i3!=-1){315 Opcode_CallProc("",pVar[indexSystemGC].u.pobj_c->ppobj_Method[i3]->psi,0,pVar[indexSystemGC].name,DEF_OBJECT);316 }317 }318 }319 -
BasicCompiler_Common/PESchedule.cpp
r5 r34 265 265 } 266 266 void CTempSchedule::unlock(){ 267 if( num <= 0 ){ 268 //エラー 269 SetError(300,NULL,cp); 270 } 267 271 num--; 268 272 } -
BasicCompiler_Common/Variable.cpp
r29 r34 648 648 649 649 for(i=MaxLocalVarNum-1;i>=0;i--){ //レキシカルスコープを考慮してバックサーチ 650 if(LocalVar[i].bLiving){ 651 if(lstrcmp(VarName,LocalVar[i].name)==0) break; 650 if( LocalVar[i].bLiving //現在のスコープで有効なもの 651 && LocalVar[i].ScopeLevel <= obj_LexScopes.GetNowLevel() //現在のスコープレベルを超さないもの(Returnによる解放処理中を考慮) 652 ){ 653 if(lstrcmp(VarName,LocalVar[i].name)==0) break; 652 654 } 653 655 } … … 766 768 767 769 for(i=MaxGlobalVarNum-1;i>=0;i--){ //レキシカルスコープを考慮してバックサーチ 768 if(GlobalVar[i].bLiving){ 769 if(lstrcmp(VarName,GlobalVar[i].name)==0) break; 770 if( GlobalVar[i].bLiving //現在のスコープで有効なもの 771 && GlobalVar[i].ScopeLevel <= obj_LexScopes.GetNowLevel() //現在のスコープレベルを超さないもの(Returnによる解放処理中を考慮) 772 ){ 773 if(lstrcmp(VarName,GlobalVar[i].name)==0) break; 770 774 } 771 775 } -
BasicCompiler_Common/common.h
r31 r34 385 385 386 386 387 #include "../BasicCompiler_Common/ schedule.h"387 #include "../BasicCompiler_Common/PESchedule.h" 388 388 #include "../BasicCompiler_Common/DebugSection.h" 389 389 #include "../BasicCompiler_Common/LexicalScoping.h" … … 423 423 void AddClassName(char *Parameter,int NowLine); 424 424 void CallConstractor(char *VarName,int *SubScripts,TYPEINFO &TypeInfo,char *Parameter); 425 void CallDestrouctorsOfScope(void);426 425 427 426 //Overload.sbp -
BasicCompiler_Common/error.cpp
r28 r34 143 143 if(num==60) lstrcpy(msg,"Staticステートメントはグローバル領域では使用できません。"); 144 144 if(num==61) sprintf(msg,"\"%s\" は定数です。書き込みアクセスはできません。",KeyWord); 145 if(num==62) sprintf(msg,"グローバル領域でのReturnは禁止されています。",KeyWord); 145 146 146 147
Note:
See TracChangeset
for help on using the changeset viewer.