りんけーじ - 日記 - 2009/08/08 00:51 [Javascriptを遊ぶ]



< 2009年8月 >
2627282930311
2345678
9101112131415
16171819202122
23242526272829
303112345
前の日記: 2009/05/20 20:23 [textareaの不思議]
次の日記: 2009/08/11 15:21 [Javascriptをもっと遊ぶ]

CやらJavaやらに飽きてきたので、PHPやらRubyやらに手を出してみたけど…どうもしっくりこない。

どうでもいい話ですが、PHPでデータベースを使うのに、みんなsprintfしてるのはなんでなんだろう…。わざわざmysql_real_escape_ごにょごにょしてないで、プレースホルダを使ったほうが安全だと思うんだけどなぁ…。

どこの言語も面白くないのでJavascriptに手を染めてみることにしました。有名な prototype.js なんかを読んでると、何が書いてあるのかサッパリだったりして素敵です。

というわけで、実行環境を手に入れる。今回はSpidermonkeyを使用。

% fetch http://ftp.mozilla.org/pub/mozilla.org/js/js-1.8.0-rc1.tar.gz
% tar -zxf js-1.60.tar.gz
% cd js/src
% cp config/Linux_All.mk FreeBSD7.1-RELEASE-p6.mk
% gmake -f Makefile.ref

これで、FreeBSD7.1-RELEASE-p6_DBG.OBJ/jsが出来上がる。

基本のJavascript APIじゃ面白いことができなさそうな気がしたので、Nativeな関数を呼ばせてみる。実験として、今回はtrueを返す関数hello()を定義してみる。

MINE.c。動けばいい。そう、動けばいいんです。

// #include の嵐
const char js_hello_str[] = "hello";
static JSBool js_hello(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
*rval = BOOLEAN_TO_JSVAL(1); return JS_TRUE; } JSObject *js_InitMyClass(JSContext *cx, JSObject *obj) { printf("*** Hello, now initialising\n"); if(!JS_DefineFunction(cx, obj, "hello", js_hello, 0, 0)) return NULL; printf("*** ready!\n"); return (JSObject *)1; // NULLじゃなければいいや。 }

jsapi.cで初期関数を呼ばせる。

// #include の嵐の後辺り
extern const char js_hello_str[];
JSObject *js_InitMyClass(JSContext *cx, JSObject *obj);
// 1430行くらい
static JSStdName standard_class_names[] = {
  {js_InitMyClass, LAZY_ATOM(hello), NULL},

jsatom.hにJSAtomを追加。

// 144行くらい
struct JSAtomState {
  // (中略)
  struct {
    JSAtom *helloAtom;
    // (略)
  } lazy;
};

仕上げにMakefile.refのJS_CFILESにMINE.cを追加して終わり。

% cat test.js
print(hello());
% ./FreeBSD7.1-RELEASE-p6_DBG.OBJ/js test.js
print("Hello, Javascript!\n");
*** Hello, now initialising
*** ready!
true

ちゃんとtrueが出た。満足。

コメント(0) トラックバック(0)

コメントフォーム

(必須)

<Trackback URI> http://linkage.white-void.net/cgi/tb.cgi/diary/2009080801