public void withReturningRestart(String name, IokeObject context, RunnableWithControlFlow code) throws ControlFlow { IokeObject rr = IokeObject.as(((Message) IokeObject.data(mimic)).sendTo(mimic, context, restart), context); IokeObject.setCell(rr, "name", getSymbol(name), context); IokeObject.setCell(rr, "argumentNames", newList(new ArrayList<Object>()), context); List<RestartInfo> rrs = new ArrayList<RestartInfo>(); BindIndex index = getBindIndex(); rrs.add(0, new RestartInfo(name, rr, rrs, index, null)); index = index.nextCol(); registerRestarts(rrs); try { code.run(); } catch (ControlFlow.Restart e) { RestartInfo ri = null; if ((ri = e.getRestart()).token == rrs) { return; } else { throw e; } } finally { unregisterRestarts(rrs); } }
public Object withRestartReturningArguments( RunnableWithControlFlow code, IokeObject context, Restart.JavaRestart... restarts) throws ControlFlow { List<RestartInfo> rrs = new ArrayList<RestartInfo>(); BindIndex index = getBindIndex(); for (Restart.JavaRestart rjr : restarts) { IokeObject rr = IokeObject.as( ((Message) IokeObject.data(mimic)).sendTo(mimic, context, restart), context); IokeObject.setCell(rr, "name", getSymbol(rjr.getName()), context); List<Object> args = new ArrayList<Object>(); for (String argName : rjr.getArgumentNames()) { args.add(getSymbol(argName)); } IokeObject.setCell(rr, "name", getSymbol(rjr.getName()), context); IokeObject.setCell(rr, "argumentNames", newList(args), context); String report = rjr.report(); if (report != null) { IokeObject.setCell( rr, "report", evaluateString("fn(r, \"" + report + "\")", message, ground), context); } rrs.add(0, new RestartInfo(rjr.getName(), rr, rrs, index, rjr)); index = index.nextCol(); } registerRestarts(rrs); try { code.run(); return new ArrayList<Object>(); } catch (ControlFlow.Restart e) { RestartInfo ri = null; if ((ri = e.getRestart()).token == rrs) { Restart.JavaRestart currentRjr = (Restart.JavaRestart) ri.data; IokeObject result = currentRjr.invoke(context, e.getArguments()); return result; } else { throw e; } } finally { unregisterRestarts(rrs); } }