- Timestamp:
- Aug 5, 2008, 12:26:17 AM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/ab5.0/abdev/compiler_x86/Compile_Statement.cpp
r676 r712 618 618 char temporary[VN_SIZE],variable[VN_SIZE],collectionVar[VN_SIZE]; 619 619 bool isError = false; 620 621 //レキシカルスコープをレベルアップ 622 compiler.codeGenerator.lexicalScopes.Start( compiler.codeGenerator.GetNativeCodeSize(), LexicalScope::SCOPE_TYPE_FOR ); 620 std::string elementTypeName; 623 621 624 622 //第1パラメータを取得 … … 635 633 lstrcpy( collectionVar, Parameter + i ); 636 634 637 if( !GetVarType( variable, resultType, false ) ) 635 636 Exception::TryCommand(); //Finallyで_System_ForeachEnumerator.Disposeするため 637 638 //Enumeratorの取得 639 sprintf(temporary,"_System_ForeachEnumerator=%s.GetEnumerator()", collectionVar ); 640 OpcodeDim(temporary,DIMFLAG_INITDEBUGVAR); 641 642 //レキシカルスコープをレベルアップ 643 compiler.codeGenerator.lexicalScopes.Start( compiler.codeGenerator.GetNativeCodeSize(), LexicalScope::SCOPE_TYPE_FOR ); 644 638 645 { 639 646 Type collectionType; … … 643 650 goto ErrorStep; 644 651 } 652 elementTypeName = collectionType.GetActualGenericType(0).GetClass().GetFullName(); 653 } 654 655 if( !GetVarType( variable, resultType, false ) ) 656 { 645 657 646 658 // 未定義の場合は自動的に定義する 647 sprintf(temporary,"%s=Nothing%c%c%s", variable, 1, ESC_AS, collectionType.GetActualGenericType(0).GetClass().GetFullName().c_str() );659 sprintf(temporary,"%s=Nothing%c%c%s", variable, 1, ESC_AS, elementTypeName.c_str() ); 648 660 OpcodeDim(temporary,DIMFLAG_INITDEBUGVAR); 649 661 } 650 651 // Resetメソッドを呼び出す652 sprintf( temporary, "%s.Reset()", collectionVar );653 Compile( temporary );654 662 655 663 //Continueアドレスのバックアップとセット … … 657 665 658 666 // MoveNextメソッドを呼び出す 659 sprintf( temporary, "%s.MoveNext()", collectionVar ); 660 NumOpe(temporary,Type(),Type()); 667 NumOpe("_System_ForeachEnumerator.MoveNext()",Type(),Type()); 661 668 662 669 //pop eax … … 674 681 { 675 682 // Currentプロパティから現在の値を取得 676 sprintf( temporary, "%s= %s.Current", variable, collectionVar);683 sprintf( temporary, "%s=_System_ForeachEnumerator.Current%c%c%s", variable, 1, ESC_AS, elementTypeName.c_str() ); 677 684 Compile( temporary ); 678 685 } … … 700 707 //jeジャンプ先のオフセット値 701 708 compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule ); 709 710 //Disposeを呼んでTryスコープを終える 711 Exception::FinallyCommand(); 712 Compile( "_System_ForeachEnumerator.Dispose()" ); 713 Exception::EndTryCommand(); 702 714 703 715 //Continueアドレスを復元
Note:
See TracChangeset
for help on using the changeset viewer.