@Override public Object[] getAsArray() { return buffer.getAsArray(); }
@Override public void resume(ExecutionContext context, Object suspendedState) throws ResolvedControlThrowable { // success: prepend true ReturnBuffer rbuf = context.getReturnBuffer(); ArrayList<Object> result = new ArrayList<>(); result.add(Boolean.TRUE); result.addAll(Arrays.asList(rbuf.getAsArray())); rbuf.setToContentsOf(result); }
@Override public void resume(ExecutionContext context, Object suspendedState) throws ResolvedControlThrowable { ReturnBuffer rbuf = context.getReturnBuffer(); ArrayList<Object> result = new ArrayList<>(); result.add(Boolean.TRUE); result.addAll(Arrays.asList(rbuf.getAsArray())); rbuf.setToContentsOf(result); }
private static void prependTrue(ExecutionContext context) { ReturnBuffer rbuf = context.getReturnBuffer(); ArrayList<Object> result = new ArrayList<>(); result.add(Boolean.TRUE); result.addAll(Arrays.asList(rbuf.getAsArray())); rbuf.setToContentsOf(result); }
@Override public void resume(ExecutionContext context, Object target) throws ResolvedControlThrowable { try { Dispatch.call(context, target, context.getReturnBuffer().getAsArray()); } catch (UnresolvedControlThrowable ct) { throw ct.resolve(); } }
public void coroutineReturn() { assert (coroutineStack != null); if (coroutineStack.cdr == null) { // this was the main coroutine if (error == null) { Object[] values = getReturnBuffer().getAsArray(); result = new ResumeResult(false, values, null, null); } else { result = new ResumeResult(false, null, error, null); } } else { // an implicit yield Coroutine top = coroutineStack.car; Coroutine prev = coroutineStack.cdr.car; boolean yielded = false; try { callStack = Coroutine._return(prev, top); yielded = true; } catch (IllegalCoroutineStateException ex) { error = ex; } if (yielded) { coroutineStack = coroutineStack.cdr; } } }
/** * Evaluates tail calls stored in the return buffer associated with the execution * context {@code context}. * <b>This method throws a {@link ResolvedControlThrowable}</b>: * this method is expected to have resolved non-local control changes up to the point * of its invocation. * * @param context execution context, must not be {@code null} * * @throws ResolvedControlThrowable if a tail call initiates a non-local control change * @throws NullPointerException if {@code context} is {@code null} * @throws IllegalOperationAttemptException if a tail call of a non-callable value * is attempted */ @SuppressWarnings("unused") static void evaluateTailCalls(ExecutionContext context) throws ResolvedControlThrowable { ReturnBuffer r = context.getReturnBuffer(); while (r.isCall()) { Object target = r.getCallTarget(); switch (r.size()) { case 0: mt_invoke(context, target); break; case 1: mt_invoke(context, target, r.get0()); break; case 2: mt_invoke(context, target, r.get0(), r.get1()); break; case 3: mt_invoke(context, target, r.get0(), r.get1(), r.get2()); break; case 4: mt_invoke(context, target, r.get0(), r.get1(), r.get2(), r.get3()); break; case 5: mt_invoke(context, target, r.get0(), r.get1(), r.get2(), r.get3(), r.get4()); break; default: mt_invoke(context, target, r.getAsArray()); break; } } }