2016-12-11 15 views
0

私は継続をキャプチャして、それを数回再開できるようにしています。そのようなそれぞれの呼び出しは他と独立しています。Rhinoで継続を複数回再開することはできますか?

たとえば、次のコードでは、私は出力をもたらすためにrun方法でcontext.resumeContinuationへの2つの呼び出しをしたいと思います:1 1、というよりも1 2の電流出力を。

私が理解する限り、結果として得られる出力の理由は、常に同じscopeオブジェクトを使用することです。このオブジェクトは、最初の継続によって修正されてから2番目のものに変更されます。だから、私はコピー元scopeと各継続を再開すべきであると思われますが、タイプScriptableにはcloneメソッド(または同等のもの)を持っていない、とシリアライズ/デシリアライゼーションのを使用して、それをコピーすることはどちらか助けていません。

P.S.私はRhinoバージョン1.7R5を使用しています。

Example.java

import org.mozilla.javascript.*; 
import java.io.IOException; 
import java.nio.file.Files; 
import java.nio.file.Paths; 

public class Example { 
    public void run() throws IOException { 
     Context context = Context.enter(); 
     context.setOptimizationLevel(-2); // Use interpreter mode. 
     Scriptable scope = context.initStandardObjects(); 
     scope.put("javaProxy", scope, Context.javaToJS(this, scope)); 

     Object capturedContinuation = null; 
     try { 
      String scriptSource = 
       new String(Files.readAllBytes(Paths.get("example.js"))); 

      String scriptName = "example"; 
      int startLine = 1; 
      Object securityDomain = null; 
      Script script = 
       context.compileString(scriptSource, scriptName, startLine, securityDomain); 
      context.executeScriptWithContinuations(script, scope); 
     } catch (ContinuationPending continuationPending) { 
      capturedContinuation = continuationPending.getContinuation(); 
     } 

     Object result = ""; 

     context.resumeContinuation(capturedContinuation, scope, result); 
     context.resumeContinuation(capturedContinuation, scope, result); 

     Context.exit(); 
    } 

    public void captureContinuation() { 
     Context context = Context.enter(); 
     ContinuationPending continuationPending = 
      context.captureContinuation(); 
     Context.exit(); 
     throw continuationPending; 
    } 

    public void print(int i) { 
     System.out.print(i + " "); 
    } 

    public static void main(String[] args) throws IOException { 
     new Example().run(); 
    } 
} 

example.js:、

代わりのscopeオブジェクトをコピーする:

var i = 1; 
javaProxy.captureContinuation(); 
javaProxy.print(i); 
i = i + 1; 

答えて

0

だから私は働いて解決策を考え出しました私はcapturedContinuationオブジェクトをコピーしていたはずなので、0を2回コールするは次のようになります。

context.resumeContinuation(deepCopy(capturedContinuation), scope, result); 
context.resumeContinuation(deepCopy(capturedContinuation), scope, result); 

This questiondeepCopy方法の可能imeplementationsを提供しています。

RhinoのNativeContinuationタイプのインスタンス(上記のコードではcapturedContinuationの動的タイプ)は非常に大きいようです(バイト配列にシリアル化すると〜15KBまで)ので、時間/メモリ消費の影響は、アプリケーションで深くコピーするときに考慮する必要があります。

関連する問題