void ValidateStack() { int?stack = null; foreach (Op op in Children) { if (op.Def.controlFlow == "RETURN") { // stack should be 1 if return type != void if (stack > 1) { op.Errors.Add($"Stack depth is {stack} on RETURN"); } stack = null; continue; } if (!stack.HasValue) { stack = 0; } ValidateOp(op, stack.Value); stack = Op.DataPopPush(op.Def, stack.Value); switch (op.Def.controlFlow) { case "NEXT": case "CALL": case "META": case "BREAK": // Debugger breakpoint break; case "BRANCH": ValidateBranch(op, stack.Value); stack = null; break; case "COND_BRANCH": ValidateBranch(op, stack.Value); break; case "THROW": throw new NotImplementedException(); case "RETURN": stack = null; break; default: throw new InvalidOperationException(op.Def.controlFlow); } if (op.Def.controlFlow != "NEXT") { throw new NotImplementedException(op.Def.controlFlow); } } }