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();
    }
  }