public int g(int a) { Context cx = Context.enter(); try { ContinuationPending pending = cx.captureContinuation(); pending.setApplicationState(2 * a); throw pending; } finally { Context.exit(); } }
public void testScriptWithContinuations() { Context cx = Context.enter(); try { cx.setOptimizationLevel(-1); // must use interpreter mode Script script = cx.compileString("myObject.f(3) + 1;", "test source", 1, null); cx.executeScriptWithContinuations(script, globalScope); fail("Should throw ContinuationPending"); } catch (ContinuationPending pending) { Object applicationState = pending.getApplicationState(); assertEquals(new Integer(3), applicationState); int saved = (Integer) applicationState; Object result = cx.resumeContinuation(pending.getContinuation(), globalScope, saved + 1); assertEquals(5, ((Number) result).intValue()); } finally { Context.exit(); } }
public void testFunctionWithContinuations() { Context cx = Context.enter(); try { cx.setOptimizationLevel(-1); // must use interpreter mode cx.evaluateString( globalScope, "function f(a) { return myObject.f(a); }", "function test source", 1, null); Function f = (Function) globalScope.get("f", globalScope); Object[] args = {7}; cx.callFunctionWithContinuations(f, globalScope, args); fail("Should throw ContinuationPending"); } catch (ContinuationPending pending) { Object applicationState = pending.getApplicationState(); assertEquals(7, ((Number) applicationState).intValue()); int saved = (Integer) applicationState; Object result = cx.resumeContinuation(pending.getContinuation(), globalScope, saved + 1); assertEquals(8, ((Number) result).intValue()); } finally { Context.exit(); } }
public void testSerializationWithContinuations() throws IOException, ClassNotFoundException { Context cx = Context.enter(); try { cx.setOptimizationLevel(-1); // must use interpreter mode cx.evaluateString( globalScope, "function f(a) { return myObject.f(a); }", "function test source", 1, null); Function f = (Function) globalScope.get("f", globalScope); Object[] args = {7}; cx.callFunctionWithContinuations(f, globalScope, args); fail("Should throw ContinuationPending"); } catch (ContinuationPending pending) { // serialize ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos); oos.writeObject(globalScope); oos.writeObject(pending.getContinuation()); oos.close(); baos.close(); byte[] serializedData = baos.toByteArray(); // deserialize ByteArrayInputStream bais = new ByteArrayInputStream(serializedData); ObjectInputStream ois = new ObjectInputStream(bais); globalScope = (Scriptable) ois.readObject(); Object continuation = ois.readObject(); ois.close(); bais.close(); Object result = cx.resumeContinuation( continuation, globalScope, 8); // / XXX: 8 shoudl be applicationstate + 1 assertEquals(8, ((Number) result).intValue()); } finally { Context.exit(); } }