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

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

File:
1 edited

Legend:

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

    r370 r372  
    445445    //レキシカルスコープをレベルアップ
    446446    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
     472void 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(&reg,temporary,Type(),resultType);
     503
     504    //cmp rax,0
     505    compiler.codeGenerator.op_cmp_value(resultType.GetSize(),REG_RAX,0);
     506
     507ErrorStep:
     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 );
    447519
    448520    //For内をコンパイル
Note: See TracChangeset for help on using the changeset viewer.