Changeset 372 in dev for trunk/abdev/BasicCompiler64/Compile_Statement.cpp
- Timestamp:
- Nov 23, 2007, 1:44:13 PM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/abdev/BasicCompiler64/Compile_Statement.cpp
r370 r372 445 445 //レキシカルスコープをレベルアップ 446 446 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 472 void 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(®,temporary,Type(),resultType); 503 504 //cmp rax,0 505 compiler.codeGenerator.op_cmp_value(resultType.GetSize(),REG_RAX,0); 506 507 ErrorStep: 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 ); 447 519 448 520 //For内をコンパイル
Note:
See TracChangeset
for help on using the changeset viewer.