http://d.hatena.ne.jp/amachang/20080610/1213099780 の続きです。
どうせなら
JavaScriptCore も自分でビルドしようぜ!ってことで
JavaScriptCore のソースを持ってくる
$ svn co http://svn.webkit.org/repository/webkit/trunk/JavaScriptCore/ A JavaScriptCore/os-win32 A JavaScriptCore/os-win32/stdint.h A JavaScriptCore/os-win32/stdbool.h A JavaScriptCore/profiler A JavaScriptCore/profiler/Profile.cpp A JavaScriptCore/profiler/Profiler.cpp A JavaScriptCore/profiler/Profile.h A JavaScriptCore/profiler/ProfileNode.cpp A JavaScriptCore/profiler/Profiler.h A JavaScriptCore/profiler/ProfileNode.h A JavaScriptCore/JavaScriptCorePrefix.h A JavaScriptCore/GNUmakefile.am A JavaScriptCore/AUTHORS A JavaScriptCore/kjs : 約 5 分くらいかかる : $
ビルド
xcodebuild というコマンドラインツールがちょー便利
Xcode の GUI でやらなくてもいい!
$ cd JavaScriptCore
$ xcodebuild -list
Information about project "JavaScriptCore":
Targets:
All (Active)
JavaScriptCore
Derived Sources
minidom
testapi
testkjs
Build Configurations:
Debug
Release
Production (Active)
If no build configuration is specified "Production" is used.
$ xcodebuild -target JavaScriptCore -configuration Debug
:
ダーっと処理が進む
:
すっごい CPU 負荷かかる(2 分くらい)
:
** BUILD SUCCEEDED **
$
さっきのエントリーの hoge.c にこっちの JavaScriptCore を使ってみる
「-F」で -framework で探索するディレクトリを指定できるみたい。
$ cd .. $ gcc hoge.c -FJavaScriptCore/build/Debug -framework JavaScriptCore $
a.out を実行
えいや!
$ ./a.out "print('hoge')"
ASSERTION FAILED: startingLineNumber > 0
(/Users/amachang/Desktop/JavaScriptCore/kjs/Parser.cpp:66 void KJS::Parser::parse(KJS::ExecState*, const KJS::UString&, int, WTF::PassRefPtr<KJS::SourceProvider>, int*, int*, KJS::UString*))
Segmentation fault
$ あうあう><セグフォでたよ><
ASSERT 出てる kjs/Parser.cpp 66 行目を見てみる
// ココ!
ASSERT(startingLineNumber > 0);
if (startingLineNumber <= 0)
startingLineNumber = 1;
startingLineNumber。。。
ぴこーん!(電球 )
そういえば hoge.c で JSEvaluateScript するとき。。。
JSEvaluateScript(
ctx,
jstrSource,
NULL,
NULL,
0, // ←こいつだ!
NULL);
0 行目から開始ってしてたのがダメみたい><
1 行目から数えるのか!
JSEvaluateScript(
ctx,
jstrSource,
NULL,
NULL,
1, // ←直してみた
NULL);
もっかいコンパイル
$ gcc hoge.c -FJavaScriptCore/build/Debug -framework JavaScriptCore $
ドキドキ
$ ./a.out "print('hoge')"
hoge
$ おおおおお!うごいた!
デバッガで追えるかな?
「-g -O0」でコンパイル
$ gcc -g -O0 hoge.c -FJavaScriptCore/build/Debug -framework JavaScriptCore $
$ gdb a.out
(gdb) b main
Breakpoint 1 at 0x1e5f: file hoge.c, line 13.
(gdb) r "print('hoge')"
Starting program: /Users/amachang/Desktop/a.out "print('hoge')"
Reading symbols for shared libraries +++......................... done
Reading symbols for shared libraries . done
Breakpoint 1, main (argc=2, argv=0xbffff974) at hoge.c:13
13 if (argc == 1) exit(0);
(gdb) n
17 JSGlobalContextRef ctx = JSGlobalContextCreate(NULL);
(gdb) s
JSGlobalContextCreate (globalObjectClass=0x0) at /Users/amachang/Desktop/JavaScriptCore/API/JSContextRef.cpp:42
42 initializeThreading();
(gdb) n
Current language: auto; currently c++
44 JSLock lock;
(gdb)
46 if (!globalObjectClass) {
(gdb)
47 JSGlobalObject* globalObject = new JSGlobalObject;
(gdb)
48 return JSGlobalContextRetain(toGlobalRef(globalObject->globalExec()));
(gdb)
58 }
(gdb)
main (argc=2, argv=0xbffff974) at hoge.c:20
20 JSObjectRef jobjGlobal = JSContextGetGlobalObject(ctx);
(gdb)
Current language: auto; currently c
24 JSStringRef jstrPrint = JSStringCreateWithUTF8CString("print");
(gdb) おおおお!なんか JavaScriptCore の中のコードが読めて楽しい!
という訳で
id:hyoshiok さんのプログラミングキャンプでの講義「コードリーディング」にご期待ください(嘘)
というのは冗談です><
でも、 JavaScript の中のソースコードをこうやってちょっとずつ読んでみるのは楽しいです。
ドラクエとかで、初めて洞窟に入ったときのあの感覚ですね。