public override void Emit(CodeGen cg) { Label eol = cg.DefineLabel(); Label breakTarget = cg.DefineLabel(); Label continueTarget = cg.DefineLabel(); cg.EmitPosition(start, header); list.Emit(cg); cg.EmitCall(typeof(Ops), "GetEnumerator"); Slot iter; if (cg.IsGenerator()) { iter = cg.Names.GetTempSlot("iter", typeof(IEnumerator)); } else { iter = cg.GetLocalTmp(typeof(IEnumerator)); } iter.EmitSet(cg); cg.MarkLabel(continueTarget); iter.EmitGet(cg); cg.EmitCall(typeof(IEnumerator), "MoveNext"); cg.Emit(OpCodes.Brfalse, eol); cg.PushTargets(breakTarget, continueTarget); iter.EmitGet(cg); cg.EmitCall(typeof(IEnumerator).GetProperty("Current").GetGetMethod()); lhs.EmitSet(cg); body.Emit(cg); cg.Emit(OpCodes.Br, continueTarget); cg.PopTargets(); cg.MarkLabel(eol); if (elseStmt != null) { elseStmt.Emit(cg); } cg.MarkLabel(breakTarget); if (cg.IsGenerator()) { //!!! need to free my temp } else { cg.FreeLocalTmp(iter); } }
public override void Emit(CodeGen cg) { cg.EmitPosition(start, end); // if lhs is a complex expression (eg foo[x] or foo.bar) // then it's EmitSet needs to do the right thing. lhs.Emit(cg); rhs.Emit(cg); op.EmitInPlace(cg); lhs.EmitSet(cg); }
private void EmitTupleParams(CodeGen cg) { for (int i = 0; i < parameters.Length; i++) { Expr p = parameters[i]; if (p is NameExpr) { continue; } //!!! not too clean cg.Names[EncodeTupleParamName(p as TupleExpr)].EmitGet(cg); p.EmitSet(cg); } }
public override void EmitSet(CodeGen cg) { expr.EmitSet(cg); }