update
[linguofeng.github.com.git] / _posts / 2013-04-18-SpiderMonkey.textile
blobbe578eb85ea7efd2a3b3951bafc73967402c5d27
1 ---
2 layout: post
3 title: SpiderMonkey是mozilla开发的js引擎
4 description: SpiderMonkey HelloWorld
5 categories: [archive]
6 tags: [SpiderMonkey, js]
7 ---
9 <section>
10     <p>1. 安装</p>
11 <pre>
12 $ brew install SpiderMonkey
13 </pre>
14     <p>2. Hello World</p>
15 <pre class="prettyprint">
16 #include "jsapi.h"
18 static JSClass global_class = {
19     "global", JSCLASS_GLOBAL_FLAGS,
20     JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_StrictPropertyStub,
21     JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, JS_FinalizeStub,
22     JSCLASS_NO_OPTIONAL_MEMBERS
25 void reportError(JSContext *cx, const char *message, JSErrorReport *report)
27     fprintf(stderr, "%s:%u:%s\n",
28             report->filename ? report->filename : "<no filename=\"filename\">",
29             (unsigned int) report->lineno,
30             message);
33 int main(int argc, const char *argv[])
35     JSRuntime *rt;
36     JSContext *cx;
37     JSObject  *global;
39     // 创建新的运行时
40     rt = JS_NewRuntime(8 * 1024 * 1024);
41     if (rt == NULL)
42         return 1;
44     // 创建新的上下文并与运行时绑定
45     cx = JS_NewContext(rt, 8192);
46     if (cx == NULL)
47         return 1;
49     JS_SetOptions(cx, JSOPTION_VAROBJFIX | JSOPTION_JIT | JSOPTION_METHODJIT);
50     JS_SetVersion(cx, JSVERSION_LATEST);
51     JS_SetErrorReporter(cx, reportError);
53     global = JS_NewCompartmentAndGlobalObject(cx, &global_class, NULL);
54     if (global == NULL)
55         return 1;
57     // 实例化内置全局对象
58     if (!JS_InitStandardClasses(cx, global))
59         return 1;
61     const char *script = "'Hello ' + 'World!'";
62     jsval rval;
63     JSString *str;
64     JSBool ok;
65     const char *filename = "noname";
66     uintN lineno = 0;
68     ok = JS_EvaluateScript(cx, global, script, strlen(script),
69             filename, lineno, &rval);
70     if (!rval | rval == JS_FALSE)
71         return 1;
73     str = JS_ValueToString(cx, rval);
74     printf("%s\n", JS_EncodeString(cx, str));
77     JS_DestroyContext(cx);
78     JS_DestroyRuntime(rt);
79     JS_ShutDown();
80     return 0;
82 </pre>
83     <p>3. 编译与执行</p>
84 <pre>
85 $ g++ -o bin/HelloJS -I/usr/local/include/js -lmozjs185 src/HelloJS.cpp
86 $ ./bin/HelloJS
87 </pre>
88     <p>4. 看来以后有时间还是要学习javascript</p>
89 </section>