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)); }