1. 程式人生 > >webkit中的javascript(1)---javascript函式呼叫在webkit中的實現

webkit中的javascript(1)---javascript函式呼叫在webkit中的實現

javascript函式呼叫如何實現的?

#########################################################################################

by zevolo

JS 的object有三種,Javascript的內部物件,browser的物件,html dom的物件。js object有很多屬性和方法,webkit支援絕大多數,只有極少沒有支援,並且擴充了額外的屬性和方法。
其中Javascript的內部物件在Source/JavascriptCore/runtime中實現。對於一種物件,一般有三個物件和其他的輔助物件來實現,如Number,有object, prototype, 和constructor,其中prototype的父類是object(這部分程式碼還不是很一致,object的名字不一樣,如NumberObject,DateInstance,JSArray等,但都是這種結構,也許webkit以後會調整)
物件的屬性在constructor中定義,而方法在prototype中定義
Browser和html的物件在DeriveSources/WebCore中定義,一般也有prototype和constructor(有的沒有)

在DeriveSources的javascript物件,webkit通過idl生成具體的js的物件bindings,如js的Window物件通過Window.idl生成JSDOMWindow來實現,
其中JSDOMWindowTableValues定義了屬性,JSDOMWindowPrototypeTableValues定義了方法

#########################################################################################
javascript的window::setInterval的內部實現
呼叫序列圖如下:
javascript的setInterval
-->jsDOMWindowPrototypeFunctionSetInterval
-->JSDOMWindow::setInterval
-->DOMWindow::setInterval
-->DOMTimer::install(context, action, timeout, false);
#########################################################################################


WebCore的timer實現
最基本有幾個類,
    --TimerBase
    --ThreadTimers
        包含TimerBase的heap堆和SharedTimer的指標
    --SharedTimer

--TimerBase有一些子類,如-->SuspendableTimer-->DOMTimer, Timer等
    setNextFireTime() timer開始的時候,都要呼叫這個函式,這裡把具體的timer更新或者插入到ThreadTimers的堆中
    fired() 純虛擬函式
--ThreadTimers
    updateSharedTimer() start timer
    sharedTimerFired() fired函式,設定為內部的SharedTimer的callback函式
--SharedTimer
    實現依賴具體的平臺,如mac, gtk, qt等
    有兩個具體的實現MainThreadSharedTimer和WorkerSharedTimer