webkit中的javascript(1)---javascript函式呼叫在webkit中的實現
阿新 • • 發佈:2019-01-31
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