2017-07-31 14 views
0

Jintを使用してJSコードを解析し、関数を呼び出します。私はマルチスレッド環境を使用しているので、私はこの問題に対する応答として示されているプログラム解析手法を使用しています。https://github.com/sebastienros/jint/issues/384解析されたJintプログラムで関数を呼び出す

だから私はJint.Parser.Ast.Programインスタンスです。 IFunctionDeclarationを繰り返して自分の機能を見つけることができます。しかし、私は唯一の全体Programを実行する方法を発見し

Dim parser As New Jint.Parser.JavaScriptParser 
Dim program As Jint.Parser.Ast.Program = parser.Parse(code) 

For Each func As Jint.Parser.IFunctionDeclaration In program.FunctionDeclarations 
    If func.Id.Name = myFunctionName Then 
     ' How to call the function? 
    End If 
Next 

...実際に関数を呼び出す方法がわかりません。関数を実際にエンジンで定義するために、私はそれを行わなければならないと仮定します。しかし、それでも私のスクリプトで特定の関数を呼び出すことはできますか?

+0

私はあなたがこれをやりたい理由を理解していません。スクリプト内で関数が定義されていれば、その関数を呼び出すだけですか?なぜこれを行うためにパーサが必要なのですか?定義されている場合はそれを呼び出すことができます。これは最適化ですか? – Tewr

答えて

0

プログラムが実行されたら、同じメソッドを使用して関数を実行してください。例はC#

var parser = new Jint.Parser.JavaScriptParser(); 
// _parserCache is a static ConcurrentDictionary<string, Jint.Parser.Ast.Program> 
var program = _parserCache.GetOrAdd(scriptName, key => parser.Parse(code)); 

foreach (var func in program.FunctionDeclarations) 
{ 
    if (func.Id.Name == myFunctionName) 
    { 
     var exec = new Engine(); 
     // The entire program is executed, to define the function 
     exec.Execute(program); 
     // now you can call your function 
     exec.Execute($"{myFunctionName}()"); 
    } 
} 
+0

これは基本的に私が思いついたものです。私は 'exec.Invoke(myFunctionName、params)'を使って引数を渡します。私はプログラムを実行せずに関数を呼び出す方法があるのだろうかと思っていたが、 –

関連する問題