Changeset 372 in dev for trunk/abdev/BasicCompiler32/Compile_Statement.cpp
- Timestamp:
- Nov 23, 2007, 1:44:13 PM (17 years ago)
- File:
-
- 1 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内をコンパイル
Note:
See TracChangeset
for help on using the changeset viewer.