Rhino Code Reading #0x02
Rhinoのコードリーディング 0x02回目です。
アリエル社内で上映された「死者の盆踊り/エドワード・D・ウッド Jr.」を見て、
心、打ち砕かれるのにも負けず、頑張って行きたいと思います。
さて、前回のエントリではRhinoのソースコードのCVS上から取得しましたが、
このままではまだ依存するライブラリが足りないため、エラーが出ているのでこれを解決しましょう。
以下のコマンドRhinoのルートフォルダで実行してください。
ant compile-all
コマンドが正常に実行されると、ネットから取得したjarファイルがlibフォルダに追加されますので、
それらをクラスパスに追加してください。
プロキシを経由して取得したい場合は以下の一行編集して、bulid.xmlのpropertiesのtargetに追加します。
<setproxy proxyhost="proxy.host.name" proxyport="1234" />
また「ant dev-javadoc」を実行することでコードリーディングをする時に便利な開発者向けのjavadocが生成することができます。
その他の主なant tagetの説明は「ant help」を参照してください。
折角コンパイルまで行なったので、簡単なコード書いて実行させてみましょう。
import org.mozilla.javascript.Context;
import org.mozilla.javascript.Scriptable;
public class EvalString {
public static void main(String args[])
{
// (1) Contextの作成
Context cx = Context.enter();
try {
// (2) グローバルスコープオブジェクトの取得
Scriptable scope = cx.initStandardObjects();
// (3) JavaScriptのコード文字列をevaluate(評価)する
Object result = cx.evaluateString(scope, "1 + 1", "<cmd>", 1, null);
// (4) 実行結果を標準出力に書きこむ
System.out.println(Context.toString(result));
} finally {
// (5) Contextの後始末。
Context.exit();
}
}
}
上記のコードを実行すると標準出力に2と出力されます。
コードの解説をしていきます。
(1)はContextとよばれるスクリプトの実行環境などを保持するクラスを作成します。
Contextはthread単位で作成されます。
(2)はContextからグローバルスコープを表すオブジェクトを取得する関数です。
JavaScriptではスコープもオブジェクトの一つとして扱い、
ScriptableはJavaScriptにおけるオブジェクトを表わすクラスが実装しなければならないインターフェイスです。
以下はScriptableを実装したクラスの一覧です。
BaseFunction, Delegator, FunctionObject, IdFunctionObject, IdScriptableObject, ImporterTopLevel, NativeArray,
NativeCall, NativeContinuation, NativeFunction, NativeGenerator, NativeIterator, NativeJavaArray, NativeJavaClass,
NativeJavaConstructor, NativeJavaMethod, NativeJavaObject, NativeJavaPackage, NativeJavaTopPackage, NativeObject,
NativeRegExp, NativeWith, ScriptableObject, Synchronizer, XMLObject
(3)は文字列をevaluate(評価)してその結果を返しています。
evaluateStringメソッドのパラメータは以下の通りです。
- 第1引数:評価を行なうスコープ
- 第2引数:評価するJavaScriptのソースコードの文字列
- 第3引数:ソースの名前
- 第4引数:開始行番号
- 第5引数:セキュリティドメイン
- 戻り値:評価結果(Object型)
第3引数と第4引数は実際にJavaScriptとしての処理に使われるのではなく、デバッグやエラーメッセージの作成などの用途で使われます。
第5引数のセキユリティドメインはRhinoのセキュリティ関連の説明に上げられていましたが、まだよくわかっていないので詳しくは別のエントリで書くことにします。
すぐに知りたい方は Rhino Overview - MDC などを参考にして私に教えてあげると良いと思います。
また、メソッドの戻り値の型がObject型なのは、返す値が以下のいずれかによるためです。
- java.lang.Boolean
- java.lang.String
- java.lang.Number
- org.mozilla.javascript.Scriptable
- null
- Context.getUndefinedValue()
- Scriptable.NOT_FOUND
(4)は実行結果を文字列に変換して標準出力に書きこみます。
(5)はContextの後始末です。
Context.enter()は複数回実行できますが、実行した回数だけContext.exit()を実行する必要があるようです。
というわけで簡単にでしたがソースコードの解説は終了です。
次回はその時の進行にもよりますが、今後のコードリーディングをするにあたっての戦略的な話や、
もしくはRhinoの主要クラスやパッケージ構成の話が出来たら楽しそうだなと考えています。
- Category(s)
- rhino
- The URL to Trackback this entry is:
- http://dev.ariel-networks.com/Members/iwanaga/rhino-code-reading02/tbping