Ignore:
Timestamp:
Aug 5, 2008, 12:26:17 AM (16 years ago)
Author:
イグトランス (egtra)
Message:

ForeachがIDisposableを実装したIEnumerator<T>を取り扱うように変更(x86のみ)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/ab5.0/abdev/compiler_x86/Compile_Statement.cpp

    r676 r712  
    618618    char temporary[VN_SIZE],variable[VN_SIZE],collectionVar[VN_SIZE];
    619619    bool isError = false;
    620 
    621     //レキシカルスコープをレベルアップ
    622     compiler.codeGenerator.lexicalScopes.Start( compiler.codeGenerator.GetNativeCodeSize(), LexicalScope::SCOPE_TYPE_FOR );
     620    std::string elementTypeName;
    623621
    624622    //第1パラメータを取得
     
    635633    lstrcpy( collectionVar, Parameter + i );
    636634
    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
    638645    {
    639646        Type collectionType;
     
    643650            goto ErrorStep;
    644651        }
     652        elementTypeName = collectionType.GetActualGenericType(0).GetClass().GetFullName();
     653    }
     654
     655    if( !GetVarType( variable, resultType, false ) )
     656    {
    645657
    646658        // 未定義の場合は自動的に定義する
    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() );
    648660        OpcodeDim(temporary,DIMFLAG_INITDEBUGVAR);
    649661    }
    650 
    651     // Resetメソッドを呼び出す
    652     sprintf( temporary, "%s.Reset()", collectionVar );
    653     Compile( temporary );
    654662
    655663    //Continueアドレスのバックアップとセット
     
    657665
    658666    // MoveNextメソッドを呼び出す
    659     sprintf( temporary, "%s.MoveNext()", collectionVar );
    660     NumOpe(temporary,Type(),Type());
     667    NumOpe("_System_ForeachEnumerator.MoveNext()",Type(),Type());
    661668
    662669    //pop eax
     
    674681    {
    675682        // 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() );
    677684        Compile( temporary );
    678685    }
     
    700707    //jeジャンプ先のオフセット値
    701708    compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule );
     709
     710    //Disposeを呼んでTryスコープを終える
     711    Exception::FinallyCommand();
     712    Compile( "_System_ForeachEnumerator.Dispose()" );
     713    Exception::EndTryCommand();
    702714
    703715    //Continueアドレスを復元
Note: See TracChangeset for help on using the changeset viewer.