public GraphBlock BuildIf(JToken node, GraphBlock current) { var id = current.Id; current.AddNode(node); var body = CreateBlockAfter(current, $"{id}:if_body"); body = Build(node["body"], body); if (node["orelse"].Count() == 0) { var array = (JArray)node["orelse"]; array.Add(JToken.Parse("{ \"_Name\": \"Pass\" }")); } var orelse = CreateBlockAfter(current, $"{id}:if_orelse"); orelse = Build(node["orelse"], orelse); var exit = new GraphBlock($"{id}:if_exit"); body.ConnectTo(exit); orelse.ConnectTo(exit); return(exit); }
public GraphBlock BuildCall(JToken node, GraphBlock current) { current.AddNode(node); foreach (var e in _exceptionHandlers.Last()) { current.ConnectTo(e); } return(CreateBlockAfter(current, "next_to_call")); }
public GraphBlock BuildRaise(JToken node, GraphBlock current) { current.AddNode(node); foreach (var e in _exceptionHandlers.Last()) { current.ConnectTo(e); } current.Exited = true; return(current); }
private GraphBlock Build(JToken nodes, GraphBlock current) { foreach (var n in nodes) { if (n.Type != JTokenType.Object) { throw new ArgumentException("Attempt to add non-object node"); } var name = ObjectNameOf(n); switch (name) { case "For": current = BuildFor(n, current); break; case "While": current = BuildWhile(n, current); break; case "If": current = BuildIf(n, current); break; case "Raise": current = BuildRaise(n, current); break; case "Try": current = BuildTry(n, current); break; case "Break": current = BuildBreak(n, current); break; case "Continue": current = BuildContinue(n, current); break; case "Call": current = BuildCall(n, current); break; default: current.AddNode(n); break; } if (current.Exited) { break; } } return(current); }
public GraphBlock BuildContinue(JToken node, GraphBlock current) { current.AddNode(node); Exit(_loopEntries.Last()); return(null); }
public GraphBlock BuildBreak(JToken node, GraphBlock current) { current.AddNode(node); Exit(_loopExits.Last()); return(null); }