public AST <Node> EmitZingSideEffects(AST <Node> stmt) { Debug.Assert(sideEffectsStack.Count > 0); var sideEffects = sideEffectsStack.Pop(); if (sideEffects.Count > 0) { sideEffects.Add(stmt); return(PToZing.MkZingSeq(sideEffects)); } else { return(stmt); } }
public AST <Node> EmitLabelPrelude() { var prelude = new List <AST <Node> >(); var tmpVar = GetTmpVar(Factory.Instance.MkCnst("StackFrame"), "retTo"); prelude.Add(PToZing.MkZingAssign(tmpVar, PToZing.MkZingCall(MkZingDot("entryCtxt", "PopReturnTo")))); prelude.Add(PToZing.MkZingAssign(MkZingIdentifier("locals"), MkZingDot(tmpVar, "locals"))); prelude.Add(PToZing.MkZingIfThen(PToZing.MkZingEq(MkZingDot(tmpVar, "pc"), Factory.Instance.MkCnst(0)), MkZingGoto("start"))); foreach (var l in labels.Keys) { prelude.Add(PToZing.MkZingIfThen(PToZing.MkZingEq(MkZingDot(tmpVar, "pc"), Factory.Instance.MkCnst(labels[l])), MkZingGoto(l))); } prelude.Add(MkZingAssert(ZingData.Cnst_False, "Internal error")); return(PToZing.MkZingSeq(prelude)); }