上一篇其實想講初始化的第二步,可是內容比較無聊,因此換了一個話題,談了談v8的命名空間和宏,稍微輕鬆一下。
在這裏仍是接着說說初始化過程,畢竟寫博客的初衷是對本身努力的記錄,不是爲了吸粉,這篇沒圖,對代碼自己沒有興趣的能夠跳過了。
再多說幾句,講一下我怎麼看的源碼吧。源碼的一些方法涉及不少類和文件,因此我都會統一標註在弄到一個文件裏,這樣後期覆盤能夠比較方便,就像圖中這樣。
文件名錶明源碼的方法、類別、邏輯等等,就像vue的源碼也被分割爲diff、virtual-dom、parse等等模塊同樣。不過v8可不會給你搞這些,因此就須要本身去整理了。內容裏,每個方法、類構造的跳轉都會進行標記,前面貼代碼也能看到,就是1-一、1-2這些,後期考慮有沒有別的更好方法。
就像上面這樣,基本上每個小點也會進行註釋,畢竟C++平時工做不會用上,語法什麼的容易忘。並且C++的類型是真的很隨意,處處都是using、typedef,有可能這只是一個整數類型,可是爲了語義化類型搞得跟類同樣,比較典型的就是win的DWORD,實際上就是unsigned long,第一次見還覺得是個多複雜的結構體,標註以後會視覺上的複雜性會減小不少。
目前先用這個來整理思路和學習,感受還不錯。最近是由於比較閒因此才寫的多,若是比較繁忙,碎片時間看源碼就會凸顯一個很嚴重的問題,就是思路斷檔。以前嘗試分析v8對JS代碼的compile的時候就發現了,其過程十分的長,第一天看了一半,次日忘了一部分後就接不上了。後面就暫時放棄過於繁瑣的部分,而且開始尋找一個好方法能夠整理源碼。
開始貼代碼環節,上一篇說過第二步的嵌入,實際上只是命名空間的轉移,也就是將生成的platform賦值到另外一個namespace中。
v8::Platform* V8::platform_ = nullptr;
void V8::InitializePlatform(v8::Platform* platform) {
CHECK(!platform_);
CHECK(platform);
platform_ = platform;
v8::base::SetPrintStackTrace(platform_->GetStackTracePrinter());
v8::tracing::TracingCategoryObserver::SetUp();
}複製代碼
如上所示,v8::Platform的命名空間下聲明瞭一個platform類型的變量,這裏只是簡單的進行賦值。但確定不單單這麼一點,後面還有兩步內容,分別是設置調用棧打印方法和調用棧追蹤類的初始化。
第一個設置也是很簡單的命名空間轉移,函數已經在默認Platform上定義好了,以下。
// v8::platform
// 預約義
void PrintStackTrace() {
v8::base::debug::StackTrace trace;
trace.Print();
// Avoid dumping duplicate stack trace on abort signal.
v8::base::debug::DisableSignalStackDump();
}
Platform::StackTracePrinter DefaultPlatform::GetStackTracePrinter() {
return PrintStackTrace;
}
// v8::base
void (*g_print_stack_trace)() = nullptr;
void SetPrintStackTrace(void (*print_stack_trace)()) {
g_print_stack_trace = print_stack_trace;
}複製代碼
這個方法後面專門來說,初始化時候只是賦值,並無調用。
// v8::tracing
TracingCategoryObserver* TracingCategoryObserver::instance_ = nullptr;
void TracingCategoryObserver::SetUp() {
// 生成一個新的Observer 這個類構造函數沒什麼特殊
TracingCategoryObserver::instance_ = new TracingCategoryObserver();
// v8::platform::tracing
i::V8::GetCurrentPlatform()->GetTracingController()->AddTraceStateObserver(TracingCategoryObserver::instance_);
}
void TracingController::AddTraceStateObserver(v8::TracingController::TraceStateObserver* observer) {
{
base::MutexGuard lock(mutex_.get());
// TracingController的屬性std::unordered_set<v8::TracingController::TraceStateObserver*> observers_;
// insert是unordered_set的插入方法
observers_.insert(observer);
if (!recording_.load(std::memory_order_acquire)) return;
}// Fire the observer if recording is already in progress.
observer->OnTraceEnabled();
}複製代碼
在前面的platform屬性介紹裏講過,除了線程相關,還有兩個工具類,一個就是這裏的TracingController。這裏生成了一個調用棧的觀察者對象,並將其加入類的一個無序SET屬性中。
最後一步是根據默認參數來啓動Observer對不一樣狀態runtime的追蹤,全是宏,太麻煩了,有興趣的本身去研究吧。