Changeset 372 in dev
- Timestamp:
- Nov 23, 2007, 1:44:13 PM (17 years ago)
- Location:
- trunk/abdev
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abdev/BasicCompiler32/Compile_Statement.cpp
r370 r372 568 568 //レキシカルスコープをレベルアップ 569 569 compiler.codeGenerator.lexicalScopes.Start( compiler.codeGenerator.GetNativeCodeSize(), LexicalScope::SCOPE_TYPE_FOR ); 570 571 //For内をコンパイル 572 CompileBuffer(0,COM_NEXT); 573 574 compiler.codeGenerator.lexicalScopes.CallDestructorsOfScopeEnd(); 575 576 if(szNextVariable[0]){ 577 if(lstrcmp(szNextVariable,variable)!=0){ 578 SetError(55,szNextVariable,cp); 579 } 580 } 581 582 //jmp ... 583 compiler.codeGenerator.op_jmp_continue(); 584 585 //レキシカルスコープをレベルダウン 586 compiler.codeGenerator.lexicalScopes.End(); 587 588 //jeジャンプ先のオフセット値 589 compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule ); 590 591 //Continueアドレスを復元 592 compiler.codeGenerator.ContinueAreaEnd(); 593 } 594 595 void OpcodeForeach( const char *Parameter ) 596 { 597 Type resultType; 598 int i; 599 char temporary[VN_SIZE],variable[VN_SIZE],collectionVar[VN_SIZE]; 600 bool isError = false; 601 602 //第1パラメータを取得 603 i=GetOneParameter(Parameter,0,temporary); 604 if(!Parameter[i]){ 605 SetError(12,"Foreach",cp); 606 isError = true; 607 goto ErrorStep; 608 } 609 610 lstrcpy( variable, temporary ); 611 612 //第2パラメータを取得(in~) 613 i=GetOneParameter(Parameter,i,collectionVar); 614 615 // Resetメソッドを呼び出す 616 sprintf( temporary, "%s.Reset()", collectionVar ); 617 Compile( temporary ); 618 619 //Continueアドレスのバックアップとセット 620 compiler.codeGenerator.ContinueAreaBegin(); 621 622 // MoveNextメソッドを呼び出す 623 sprintf( temporary, "%s.MoveNext()", collectionVar ); 624 NumOpe(temporary,Type(),Type()); 625 626 //pop eax 627 compiler.codeGenerator.op_pop(REG_EAX); 628 629 //cmp eax,0 630 compiler.codeGenerator.op_cmp_value( sizeof(long), REG_EAX, 0 ); 631 632 ErrorStep: 633 634 //je ... 635 const PertialSchedule *pTempPertialSchedule = compiler.codeGenerator.op_je( 0, sizeof(long), true ); 636 637 //レキシカルスコープをレベルアップ 638 compiler.codeGenerator.lexicalScopes.Start( compiler.codeGenerator.GetNativeCodeSize(), LexicalScope::SCOPE_TYPE_FOR ); 639 640 // Currentプロパティから現在の値を取得 641 // TODO: 型指定が未完成 642 sprintf( temporary, "%s=%s.Current As String", variable, collectionVar ); 643 Compile( temporary ); 570 644 571 645 //For内をコンパイル -
trunk/abdev/BasicCompiler32/Opcode.h
r364 r372 41 41 42 42 //Compile.cpp 43 void Compile( const char *source ); 43 44 void ChangeOpcode(char *Command); 44 45 void GetGlobalDataForDll(void); … … 230 231 void OpcodeWhile(char *Parameter); 231 232 void OpcodeFor(char *Parameter); 233 void OpcodeForeach( const char *Parameter ); 232 234 void OpcodeDo(char *Parameter); 233 235 void OpcodeContinue(void); -
trunk/abdev/BasicCompiler32/commandvalue.h
r364 r372 14 14 #define COM_WHILE 0x1036 15 15 #define COM_WEND 0x1037 16 #define COM_FOREACH 0x1038 16 17 17 18 //データ操作 -
trunk/abdev/BasicCompiler64/CommandValue.h
r64 r372 14 14 #define COM_WHILE 0x1036 15 15 #define COM_WEND 0x1037 16 #define COM_FOREACH 0x1038 16 17 17 18 //データ操作 -
trunk/abdev/BasicCompiler64/Compile_Statement.cpp
r370 r372 445 445 //レキシカルスコープをレベルアップ 446 446 compiler.codeGenerator.lexicalScopes.Start( compiler.codeGenerator.GetNativeCodeSize(), LexicalScope::SCOPE_TYPE_FOR ); 447 448 //For内をコンパイル 449 CompileBuffer(0,COM_NEXT); 450 451 compiler.codeGenerator.lexicalScopes.CallDestructorsOfScopeEnd(); 452 453 if(szNextVariable[0]){ 454 if(lstrcmp(szNextVariable,variable)!=0){ 455 SetError(55,szNextVariable,cp); 456 } 457 } 458 459 //jmp ... 460 compiler.codeGenerator.op_jmp_continue(); 461 462 //レキシカルスコープをレベルダウン 463 compiler.codeGenerator.lexicalScopes.End(); 464 465 //jeジャンプ先のオフセット値 466 compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule ); 467 468 //Continueアドレスを復元 469 compiler.codeGenerator.ContinueAreaEnd(); 470 } 471 472 void OpcodeForeach( const char *Parameter ) 473 { 474 Type resultType; 475 int i; 476 char temporary[VN_SIZE],variable[VN_SIZE],collectionVar[VN_SIZE]; 477 bool isError = false; 478 479 //第1パラメータを取得 480 i=GetOneParameter(Parameter,0,temporary); 481 if(!Parameter[i]){ 482 SetError(12,"Foreach",cp); 483 isError = true; 484 goto ErrorStep; 485 } 486 487 lstrcpy( variable, temporary ); 488 489 //第2パラメータを取得(in~) 490 i=GetOneParameter(Parameter,i,collectionVar); 491 492 // Resetメソッドを呼び出す 493 sprintf( temporary, "%s.Reset()", collectionVar ); 494 Compile( temporary ); 495 496 //Continueアドレスのバックアップとセット 497 compiler.codeGenerator.ContinueAreaBegin(); 498 499 // MoveNextメソッドを呼び出す 500 sprintf( temporary, "%s.MoveNext()", collectionVar ); 501 int reg = REG_RAX; 502 NumOpe(®,temporary,Type(),resultType); 503 504 //cmp rax,0 505 compiler.codeGenerator.op_cmp_value(resultType.GetSize(),REG_RAX,0); 506 507 ErrorStep: 508 509 //je ... 510 const PertialSchedule *pTempPertialSchedule = compiler.codeGenerator.op_je( 0, sizeof(long), true ); 511 512 //レキシカルスコープをレベルアップ 513 compiler.codeGenerator.lexicalScopes.Start( compiler.codeGenerator.GetNativeCodeSize(), LexicalScope::SCOPE_TYPE_FOR ); 514 515 // Currentプロパティから現在の値を取得 516 // TODO: 型指定が未完成 517 sprintf( temporary, "%s=%s.Current As String", variable, collectionVar ); 518 Compile( temporary ); 447 519 448 520 //For内をコンパイル -
trunk/abdev/BasicCompiler64/Opcode.h
r364 r372 169 169 170 170 //Compile.cpp 171 void Compile( const char *source ); 171 172 void ChangeOpcode(char *Command); 172 173 void GetGlobalDataForDll(void); … … 345 346 void OpcodeWhile(char *Parameter); 346 347 void OpcodeFor(char *Parameter); 348 void OpcodeForeach(const char *Parameter); 347 349 void OpcodeDo(char *Parameter); 348 350 void OpcodeContinue(void); -
trunk/abdev/BasicCompiler_Common/Compile.cpp
r359 r372 139 139 } 140 140 141 void Compile( const char *source ) 142 { 143 char *temporary = (char *)malloc( lstrlen( source ) + 8192 ); 144 lstrcpy( temporary, source ); 145 int backCp = cp; 146 MakeMiddleCode( temporary ); 147 ChangeOpcode( temporary ); 148 cp = backCp; 149 free( temporary ); 150 } 151 141 152 void ChangeOpcode(char *Command){ 142 153 extern HANDLE hHeap; … … 337 348 case COM_FOR: 338 349 OpcodeFor(Command+2); 350 break; 351 case COM_FOREACH: 352 OpcodeForeach(Command+2); 339 353 break; 340 354 case COM_DO: -
trunk/abdev/BasicCompiler_Common/Intermediate_Step2.cpp
r361 r372 451 451 ComNum=COM_FOR; 452 452 } 453 else if(lstrcmpi(com,"Foreach")==0){ 454 KillSpaces(Command+i,pam); 455 ComNum=COM_FOREACH; 456 } 453 457 else if(lstrcmpi(com,"Next")==0){ 454 458 KillSpaces(Command+i,pam);
Note:
See TracChangeset
for help on using the changeset viewer.