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 testScriptWithNestedContinuations() { Context cx = Context.enter(); try { cx.setOptimizationLevel(-1); // must use interpreter mode Script script = cx.compileString("myObject.g( myObject.f(1) ) + 2;", "test source", 1, null); cx.executeScriptWithContinuations(script, globalScope); fail("Should throw ContinuationPending"); } catch (ContinuationPending pending) { try { Object applicationState = pending.getApplicationState(); assertEquals(new Integer(1), applicationState); int saved = (Integer) applicationState; cx.resumeContinuation(pending.getContinuation(), globalScope, saved + 1); fail("Should throw another ContinuationPending"); } catch (ContinuationPending pending2) { Object applicationState2 = pending2.getApplicationState(); assertEquals(new Integer(4), applicationState2); int saved2 = (Integer) applicationState2; Object result2 = cx.resumeContinuation(pending2.getContinuation(), globalScope, saved2 + 2); assertEquals(8, ((Number)result2).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(); } }
@Test public void test() { String source = "var state = '';"; source += "function A(){state += 'A'}"; source += "function B(){state += 'B'}"; source += "function C(){state += 'C'}"; source += "try { A(); continuation(); B() } finally { C() }"; source += "state"; String[] functions = new String[] { "continuation" }; scope.defineFunctionProperties(functions, Bug685403Test.class, ScriptableObject.DONTENUM); Object state = null; Script script = cx.compileString(source, "", 1, null); try { cx.executeScriptWithContinuations(script, scope); fail("expected ContinuationPending exception"); } catch (ContinuationPending pending) { state = cx.resumeContinuation(pending.getContinuation(), scope, ""); } assertEquals("ABC", state); }
private void continueExecuting(Sleeping script) { try { curScript = new Executing(script.script, true); context.resumeContinuation(script.continuation, script.script.getScope(), null); curScript = new Executing(script.script, false); BasicScript bsc = script.script; if (bsc.hasOnExit()) bsc.getOnExit().call(context, bsc.getScope(), bsc.getScope(), new Object[0]); } catch(ContinuationPending p) { } catch(Exception e) { scriptCrash(script.script, e); } finally { curScript = null; } }
private void startExecuting(BasicScript script) { try { curScript = new Executing(script, true); context.callFunctionWithContinuations(script.getMain(), script.getScope(), new Object[0]); curScript = new Executing(script, false); if (script.hasOnExit()) script.getOnExit().call(context, script.getScope(), script.getScope(), new Object[0]); } catch(ContinuationPending p) { } catch(Exception e) { scriptCrash(script, e); } finally { curScript = null; } }
public int f(int a) { Context cx = Context.enter(); try { ContinuationPending pending = cx.captureContinuation(); pending.setApplicationState(a); throw pending; } finally { Context.exit(); } }
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 testScriptWithMultipleContinuations() { Context cx = Context.enter(); try { cx.setOptimizationLevel(-1); // must use interpreter mode Script script = cx.compileString( "myObject.f(3) + myObject.g(3) + 2;", "test source", 1, null); cx.executeScriptWithContinuations(script, globalScope); fail("Should throw ContinuationPending"); } catch (ContinuationPending pending) { try { Object applicationState = pending.getApplicationState(); assertEquals(new Integer(3), applicationState); int saved = (Integer) applicationState; cx.resumeContinuation(pending.getContinuation(), globalScope, saved + 1); fail("Should throw another ContinuationPending"); } catch (ContinuationPending pending2) { Object applicationState2 = pending2.getApplicationState(); assertEquals(new Integer(6), applicationState2); int saved2 = (Integer) applicationState2; Object result2 = cx.resumeContinuation(pending2.getContinuation(), globalScope, saved2 + 1); assertEquals(13, ((Number)result2).intValue()); } } finally { Context.exit(); } }
public String h() { Context cx = Context.enter(); try { ContinuationPending pending = cx.captureContinuation(); pending.setApplicationState("2*3"); throw pending; } 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) { var k = myObject.f(a); var t = []; return k; }", "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(); ScriptableOutputStream sos = new ScriptableOutputStream(baos, globalScope); sos.writeObject(globalScope); sos.writeObject(pending.getContinuation()); sos.close(); baos.close(); byte[] serializedData = baos.toByteArray(); // deserialize ByteArrayInputStream bais = new ByteArrayInputStream(serializedData); ScriptableInputStream sis = new ScriptableInputStream(bais, globalScope); globalScope = (Scriptable) sis.readObject(); Object continuation = sis.readObject(); sis.close(); bais.close(); Object result = cx.resumeContinuation(continuation, globalScope, 8); assertEquals(8, ((Number)result).intValue()); } finally { Context.exit(); } }