[code小心得]JavaScriptCore


大家好  小弟又來嘴砲了  我把最近稍為有看一下的東西做整理(謎之音:你最近都在打Game巴,之前 初音F 2nd 現在在玩 第三次機器人大戰Z 時獄篇)

JavaScript & JavaScriptCore 相關簡介

JavaScriptCore? Framework
The JavaScriptCore? Framework allows you to evaluate JavaScript programs from within a C-based program. It also lets you insert custom objects to the JavaScript environment. 請參考見 WebKit_JavaScriptCore_Ref.pdf 裡面敘述到相關主要在使用的API


Mozilla的 JavaScriptCore



以下有些內容主要都參考  轉自 http://blog.csdn.net/horkychen

 http://zh.wikipedia.org/zh-tw/SpiderMonkey 最早的JavaScript引擎 敘述介紹


 http://blog.csdn.net/bertzhang/article/details/6759055 浅谈WebKit之JavaScriptCore/V8篇




移动Web应用程序开发 高性能JavaScript篇 (一) JavaScript 性能瓶颈


關於JavaScript的一個基礎特性介紹.

移动Web应用程序开发 高性能JavaScript篇 (二) JavaScript 性能分析工具

一些可以用來Debug的工具或是profiler
移动Web应用程序开发 高性能JavaScript篇 (三) JavaScript 加载解析和部署


移动Web应用程序开发 高性能JavaScript篇 (四) JavaScript数据访问和DOM编程



PS: webkit的所有 member 都是在 private 上,沒有public。另外要access member的data 就要先new 才行,在 interpreter 資料夾內狠才看到這類做法,因為要存取runtime 資料夾內的codeblocak等內容。

JSGlobalObject====>getProgramCodeBlock:
藉由 privateExecute(負責做call 初始化會將抓取相關的值處理完return)去 call,Evalcall=>在轉去CodeCache資料抓取做編譯。

並且將檢查Stack 是否有異常。
callFrame =0xb0648100registerFile =0xb3c68fccargv =0xb0648120argc =2registerOffset =12
FILE=interpreter/Interpreter.cpp LINE=391 function=callEval
eval=0xb2c1c700callFrame=0xb0648100callFrame->uncheckedR(codeBlock->thisRegister()).jsValue().toThisObject(callFrame)=0xb2c94128callFrame->registers() - registerFile->start() + registerOffset=556scopeChain=0xb2233328
除了有用ASSERT做DEBUG用途之外,也有重新define opcode做debug flag用
DEFINE_OPCODE(其define的opcode巨集設定在Opcode.h內)


網頁傳進來是Unicode 在Lexer & parser 之前要先轉成ASCII Code.
    inline bool Lexer::isWhiteSpace(int ch)
    {
        return isASCII(ch) ? (ch == ' ' || ch == '\t' || ch == 0xB || ch == 0xC) : (WTF::Unicode::isSeparatorSpace(ch) || ch == 0xFEFF);
    }

    inline bool Lexer::isLineTerminator(int ch)
    {
        return ch == '\r' || ch == '\n' || (ch & ~1) == 0x2028;
    }

    inline unsigned char Lexer::convertHex(int c1, int c2)
    {
        return (toASCIIHexValue(c1) << 4) | toASCIIHexValue(c2);
    }

    inline UChar Lexer::convertUnicode(int c1, int c2, int c3, int c4)
    {
        return (convertHex(c1, c2) << 8) | convertHex(c3, c4);
    }

題外話 目前感覺 JavaScriptCore 有用到的裝置變少很多,因為以同樣的JavaScript engine 來看的話 V8 比他強大好多(Android 裡面就是用那個喔),例如在GC的處理能力方面。

不過說實在話,光是JavaScriptCore 就有很多地方看得不是很懂,半知半解。
和QML  Qt 5.2的環境一直搞不定  出現Qapplication  not found ,luncher編譯不出來,ubuntu環境似乎被我搞爛了。乖乖用虛擬機  重新佈署環境 當練習看看了  囧

以上 感謝收看  下台一鞠躬

留言