internal override void Walk(EmitContext ec) { if (ec.Emitting) { Label skip_label = ec.DefineLabel(); nd1st.Walk(ec); ec.EmitDup(); LocalBuilder first = ec.EmitStoreTemp(); ec.EmitBranchIfTrue(skip_label); nd2nd.Walk(ec); ec.EmitDup(); LocalBuilder second = ec.EmitStoreTemp(); ec.EmitBranchIfTrue(skip_label); ec.EmitLoadTemp(second); ec.EmitStoreTemp(first); ec.MarkLabel(skip_label); ec.EmitLoadTemp(first); } else { nd1st.Walk(ec); nd2nd.Walk(ec); } }
internal override void Walk(EmitContext ec) { if (ec.Resolving) { cond.Walk(ec); body.Walk(ec); } if (ec.Emitting) { Label end_label = ec.DefineLabel(); Label start_label = ec.DefineLabel(); ec.MarkLabel(start_label); cond.Walk(ec); if (this is RNUntil) { ec.EmitBranchIfTrue(end_label); } else { ec.EmitBranchIfFalse(end_label); } body.Walk(ec); // TODO return value in local ec.EmitDiscard(); ec.EmitBranch(start_label); ec.MarkLabel(end_label); ec.EmitNull(); } }
internal override void Walk(EmitContext ec) { if(ec.Resolving) { cond.Walk(ec); body.Walk(ec); } if(ec.Emitting) { Label end_label = ec.DefineLabel(); Label start_label = ec.DefineLabel(); ec.MarkLabel(start_label); cond.Walk(ec); if(this is RNUntil) ec.EmitBranchIfTrue(end_label); else ec.EmitBranchIfFalse(end_label); body.Walk(ec); // TODO return value in local ec.EmitDiscard(); ec.EmitBranch(start_label); ec.MarkLabel(end_label); ec.EmitNull(); } }
internal override void Walk(EmitContext ec) { if(ec.Emitting) { Label skip_label = ec.DefineLabel(); nd1st.Walk(ec); ec.EmitDup(); LocalBuilder first = ec.EmitStoreTemp(); ec.EmitBranchIfTrue(skip_label); nd2nd.Walk(ec); ec.EmitDup(); LocalBuilder second = ec.EmitStoreTemp(); ec.EmitBranchIfTrue(skip_label); ec.EmitLoadTemp(second); ec.EmitStoreTemp(first); ec.MarkLabel(skip_label); ec.EmitLoadTemp(first); } else { nd1st.Walk(ec); nd2nd.Walk(ec); } }