sm4.c
最終更新:2009/11/18
001: /* sm4.c
002: * SpiderMonkey を C プログラムから使う例
003: * スクリプトファイルで定義した関数を C プログラムの中で使用する。
004: * ・コマンドライン引数で JavaScript のファイル名を指定する。
005: * ファイルの中で定義した関数 foo にコマンドライン引数で指定した値を
006: * 引数として適用する。
007: * ・foo は整数値を引数としてとり、整数値を返す関数とする。
008: * int foo(int)
009: * ・実行例
010: * % sm4 foo.js 6
011: * のように実行した場合は、foo.js 内で定義した関数 foo に引数 6 を適用する。
012: */
013:
014: #define USAGE "Usage: sm4 <script_file_of_foo> <arg_of_foo>"
015:
016: #define FUNC_NAME "foo"
017:
018: #include <stdio.h>
019: #include <stdlib.h>
020: #include <string.h>
021: #include "myjs.h"
022:
023: int main(int ac, char **av)
024: {
025: int error_flag = 0;
026:
027: JSContext *jsctx = NULL;
028:
029: char *filename = NULL;
030: int foo_arg = 0;
031:
032: if (ac < 3) {
033: fprintf(stderr, "%s\n", USAGE);
034: error_flag = 1;
035: goto _FINALLY_;
036: }
037: filename = av[1];
038: foo_arg = atoi(av[2]);
039:
040: /* 初期化 */
041:
042: /* プロセス単位でランタイムを生成 */
043: if (!my_js_rt_init()) {
044: error_flag = 1;
045: goto _FINALLY_;
046: }
047:
048: /* スレッド単位でコンテクスト生成 */
049: jsctx = my_js_ctx_init();
050: if (!jsctx) {
051: error_flag = 1;
052: goto _FINALLY_;
053: }
054:
055: /* スクリプトの実行 */
056:
057: {
058: JSScript *js_script = NULL;
059: jsval rval;
060: if(!my_js_execute_script(jsctx, filename, &js_script, &rval)) {
061: fprintf(stderr, "ERROR: execute_script ");
062: error_flag = 1;
063: goto _FINALLY_;
064: }
065: if (js_script) {
066: //JS_MaybeGC(jsctx);
067: JS_DestroyScript(jsctx, js_script); /* このスクリプトは再利用しない */
068: }
069: }
070:
071: /* 関数 foo の実行 */
072: {
073: int ret = 0;
074: int args[1];
075: args[0] = foo_arg;
076: if (! my_js_call_function_IA_I(jsctx, FUNC_NAME, 1, args, &ret)) {
077: fprintf(stderr, "ERROR: call_function ");
078: error_flag = 1;
079: goto _FINALLY_;
080: }
081: printf("%s(%d)=%d\n", FUNC_NAME, args[0], ret);
082: }
083:
084: _FINALLY_:
085:
086: /* JSContext と JSRuntime リソースの解放 */
087: if (jsctx) {
088: my_js_ctx_clear(jsctx);
089: jsctx = NULL;
090: }
091:
092: my_js_rt_clear();
093:
094: if (error_flag) {
095: fprintf(stderr, "failed.\n");
096: return 1;
097: }
098:
099: return 0;
100: } /* End of main */
![]() | KAKU PROJECT (2009) |