Exemple #1
0
        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);
            }
        }
Exemple #2
0
        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);
        }
Exemple #3
0
        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);
 }