Ignore:
Timestamp:
Nov 23, 2007, 1:44:13 PM (16 years ago)
Author:
dai_9181
Message:

Foreachステートメントを実装中…

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/abdev/BasicCompiler32/Compile_Statement.cpp

    r370 r372  
    568568    //レキシカルスコープをレベルアップ
    569569    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
     595void 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
     632ErrorStep:
     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 );
    570644
    571645    //For内をコンパイル
Note: See TracChangeset for help on using the changeset viewer.