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