Changeset 716 in dev for trunk/ab5.0
- Timestamp:
- Aug 8, 2008, 12:11:01 AM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/ab5.0/abdev/compiler_x64/Compile_Statement.cpp
r676 r716 481 481 char temporary[VN_SIZE],variable[VN_SIZE],collectionVar[VN_SIZE]; 482 482 bool isError = false; 483 484 //レキシカルスコープをレベルアップ 485 compiler.codeGenerator.lexicalScopes.Start( compiler.codeGenerator.GetNativeCodeSize(), LexicalScope::SCOPE_TYPE_FOR ); 483 std::string elementTypeName; 486 484 487 485 //第1パラメータを取得 … … 498 496 lstrcpy( collectionVar, Parameter + i ); 499 497 500 if( !GetVarType( variable, resultType, false ) ) 498 499 Exception::TryCommand(); //Finallyで_System_ForeachEnumerator.Disposeするため 500 501 //Enumeratorの取得 502 sprintf(temporary,"_System_ForeachEnumerator=%s.GetEnumerator()", collectionVar ); 503 OpcodeDim(temporary,DIMFLAG_INITDEBUGVAR); 504 505 //レキシカルスコープをレベルアップ 506 compiler.codeGenerator.lexicalScopes.Start( compiler.codeGenerator.GetNativeCodeSize(), LexicalScope::SCOPE_TYPE_FOR ); 507 501 508 { 502 509 Type collectionType; … … 506 513 goto ErrorStep; 507 514 } 515 elementTypeName = collectionType.GetActualGenericType(0).GetClass().GetFullName(); 516 } 517 518 if( !GetVarType( variable, resultType, false ) ) 519 { 508 520 509 521 // 未定義の場合は自動的に定義する 510 sprintf(temporary,"%s=Nothing%c%c%s", variable, 1, ESC_AS, collectionType.GetActualGenericType(0).GetClass().GetFullName().c_str() );522 sprintf(temporary,"%s=Nothing%c%c%s", variable, 1, ESC_AS, elementTypeName.c_str() ); 511 523 OpcodeDim(temporary,DIMFLAG_INITDEBUGVAR); 512 524 } 513 514 // Resetメソッドを呼び出す515 sprintf( temporary, "%s.Reset()", collectionVar );516 Compile( temporary );517 525 518 526 //Continueアドレスのバックアップとセット … … 520 528 521 529 // MoveNextメソッドを呼び出す 522 sprintf( temporary, "%s.MoveNext()", collectionVar );523 530 int reg = REG_RAX; 524 NumOpe( ®,temporary,Type(),resultType);531 NumOpe( ®, "_System_ForeachEnumerator.MoveNext()", Type(), resultType ); 525 532 526 533 //cmp rax,0 … … 535 542 { 536 543 // Currentプロパティから現在の値を取得 537 sprintf( temporary, "%s= %s.Current", variable, collectionVar);544 sprintf( temporary, "%s=_System_ForeachEnumerator.Current%c%c%s", variable, 1, ESC_AS, elementTypeName.c_str() ); 538 545 Compile( temporary ); 539 546 } … … 561 568 //jeジャンプ先のオフセット値 562 569 compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule ); 570 571 //Disposeを呼んでTryスコープを終える 572 Exception::FinallyCommand(); 573 Compile( "_System_ForeachEnumerator.Dispose()" ); 574 Exception::EndTryCommand(); 563 575 564 576 //Continueアドレスを復元
Note:
See TracChangeset
for help on using the changeset viewer.