void CfrTil_DoWhileDoCombinator ( ) { block testBlock = ( block ) Dsp [ - 1 ], doBlock2 = ( block ) TOS, doBlock1 = ( block ) Dsp [ - 2 ] ; byte * start ; _DataStack_DropN ( 3 ) ; if ( CompileMode ) { CfrTil_BeginCombinator ( 3 ) ; _Context_->Compiler0->ContinuePoint = Here ; start = Here ; _Compile_Block ( ( byte* ) doBlock1, 2, 0 ) ; _Compile_Block ( ( byte* ) testBlock, 1, 1 ) ; _Compile_Block ( ( byte* ) doBlock2, 0, 0 ) ; _Compile_JumpToAddress ( start ) ; // runtime _Context_->Compiler0->BreakPoint = Here ; CfrTil_CalculateAndSetPreviousJmpOffset_ToHere ( ) ; CfrTil_EndCombinator ( 3, 1 ) ; } else { do { _Block_Eval ( doBlock1 ) ; _Block_Eval ( testBlock ) ; if ( ! _DataStack_Pop ( ) ) break ; _Block_Eval ( doBlock2 ) ; } while ( 1 ) ; } }
int32 CfrTil_DoWhileCombinator ( ) { block testBlock = ( block ) TOS, doBlock = ( block ) Dsp [ - 1 ] ; _DataStack_DropN ( 2 ) ; if ( CompileMode ) { CfrTil_BeginCombinator ( 2 ) ; byte * start = Here ; _Context_->Compiler0->ContinuePoint = Here ; _Compile_Block ( ( byte* ) doBlock, 1, 0 ) ; //_Compile_Block ( ( byte* ) testBlock, 0, 1 ) ; if ( ! _Compile_Block ( ( byte* ) testBlock, 0, 1 ) ) { SetHere ( start ) ; return 0 ; } _Compile_JumpToAddress ( start ) ; _Context_->Compiler0->BreakPoint = Here ; CfrTil_CalculateAndSetPreviousJmpOffset_ToHere ( ) ; CfrTil_EndCombinator ( 2, 1 ) ; } else { do { _Block_Eval ( doBlock ) ; _Block_Eval ( testBlock ) ; if ( ! _DataStack_Pop ( ) ) break ; } while ( 1 ) ; } return 1 ; }
void _Compile_JmpCall_Using_RStack ( byte * jmpToAddr ) { // push rstack here + 5 so RET can jmp back _Compile_MoveImm_To_Reg ( EAX, &Rsp, CELL ) ; // the lvalue of Rsp Compile_ADDI ( MEM, EAX, 0, CELL, BYTE ) ; // add 4 to Rsp Compile_ADDI ( REG, EAX, 0, CELL, BYTE ) ; // //_Compile_Move_Reg_To_Reg ( int32 dstReg, int32 srcReg ) ; _Compile_MoveImm_To_Reg ( ECX, Here + x, CELL ) ; // x : number of bytes to the first byte after the jmp instruction _Compile_Move_Reg_To_Rm ( EAX, 0, ECX ) ; _Compile_JumpToAddress ( byte * jmpToAddr ) ; }
void CfrTil_LoopCombinator ( ) { block loopBlock = ( block ) TOS ; _DataStack_DropN ( 1 ) ; if ( CompileMode ) { CfrTil_BeginCombinator ( 1 ) ; byte * start = Here ; _Context_->Compiler0->ContinuePoint = start ; _Compile_Block ( ( byte* ) loopBlock, 0, 0 ) ; _Compile_JumpToAddress ( start ) ; // runtime _Context_->Compiler0->BreakPoint = Here ; CfrTil_EndCombinator ( 1, 1 ) ; } else while ( 1 ) _Block_Eval ( loopBlock ) ; }
void CfrTil_ForCombinator ( ) { block doBlock = ( block ) TOS, doPostBlock = ( block ) Dsp [ - 1 ], testBlock = ( block ) Dsp [ - 2 ], doPreBlock = ( block ) Dsp [ - 3 ] ; _DataStack_DropN ( 4 ) ; if ( CompileMode ) { CfrTil_BeginCombinator ( 4 ) ; _Compile_Block ( ( byte* ) doPreBlock, 3, 0 ) ; byte * start = Here ; _Compile_Block ( ( byte* ) testBlock, 2, 1 ) ; _Context_->Compiler0->ContinuePoint = Here ; _Compile_Block ( ( byte* ) doBlock, 0, 0 ) ; _Compile_Block ( ( byte* ) doPostBlock, 1, 0 ) ; _Compile_JumpToAddress ( start ) ; // runtime _Context_->Compiler0->BreakPoint = Here ; CfrTil_CalculateAndSetPreviousJmpOffset_ToHere ( ) ; CfrTil_EndCombinator ( 4, 1 ) ; } else { _Block_Eval ( doPreBlock ) ; do { _Block_Eval ( testBlock ) ; if ( ! _DataStack_Pop ( ) ) break ; _Context_->Compiler0->ContinuePoint = Here ; _Block_Eval ( doBlock ) ; _Block_Eval ( doPostBlock ) ; _Context_->Compiler0->BreakPoint = Here ; } while ( 1 ) ; } }
void CfrTil_NLoopCombinator ( ) { int32 count = Dsp [ - 1 ] ; block loopBlock = ( block ) TOS ; _DataStack_DropN ( 2 ) ; #if 0 if ( CompileMode ) { CfrTil_BeginCombinator ( 1 ) ; byte * start = Here ; _Context_->Compiler0->ContinuePoint = start ; _Compile_Block ( ( byte* ) loopBlock ) ; _Compile_JumpToAddress ( start ) ; // runtime _Context_->Compiler0->BreakPoint = Here ; CfrTil_EndCombinator ( 1 ) ; } #endif while ( count -- ) _Block_Eval ( loopBlock ) ; }