精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

通過Handle理解V8的代碼設計(基于V0.1.5)

開發 前端
Handle在V8里是一個非常重要的概念,本文從早期的源碼分析Handle的原理,在分析的過程中我們還可以看到V8在代碼設計上的一些細節。

[[402071]]

本文轉載自微信公眾號「編程雜技」,作者theanarkh。轉載本文請聯系編程雜技公眾號。

前言:Handle在V8里是一個非常重要的概念,本文從早期的源碼分析Handle的原理,在分析的過程中我們還可以看到V8在代碼設計上的一些細節。

假設我們有以下代碼

  1. HandleScope scope; 
  2. Local<String> hello = String::New(參數); 

這個看起來很簡單的過程,其實在V8的內部實現起來比較復雜。

HandleScope

我們從創建一個HandleScope對象開始分析。HandleScope是負責管理多個Handle的對象,主要是為了方便管理Handle的分配和釋放。

  1. class HandleScope { 
  2.  public
  3.   HandleScope() : previous_(current_), is_closed_(false) { 
  4.     current_.extensions = 0; 
  5.   } 
  6.  
  7.   static void** CreateHandle(void* value); 
  8.  
  9.  private: 
  10.  
  11.   class Data { 
  12.    public
  13.     // 分配了一塊內存后,又額外分配的塊數 
  14.     int extensions; 
  15.     // 下一個可用的位置 
  16.     void** next
  17.     // 達到limit執行的地址后說明當前內存塊用完了 
  18.     void** limit; 
  19.     inline void Initialize() { 
  20.       extensions = -1; 
  21.       next = limit = NULL
  22.     } 
  23.   }; 
  24.   // 當前的HandleScope 
  25.   static Data current_; 
  26.   // 上一個HandleScope 
  27.   const Data previous_; 
  28. }; 
  29.  
  30. HandleScope::Data HandleScope::current_ = { -1, NULLNULL }; 

通過HandleScope的構造函數我們知道每次定義一個HandleScope對象的時候,previous就會指向前一個HandleScope的數據(但是current_除了第一次創建HandleScope的時候更新了(見CreateHandle),后續似乎沒有更新?后續詳細看一下),從HandleScope的定義中我們知道他的布局如下。

接著我們看HandleScope的CreateHandle方法。

  1. void** v8::HandleScope::CreateHandle(void* value) { 
  2.   // 獲取下一個可用的地址 
  3.   void** result = current_.next
  4.   // 到達limit的地址了或者為空(初始化的時候)則獲取新的內存 
  5.   if (result == current_.limit) { 
  6.     // Block是二維數組,每個元素指向一個可以存儲數據的數組。非空說明可能有可用的內存空間 
  7.     if (!thread_local.Blocks()->is_empty()) { 
  8.       // 拿到list中最后一個元素,得到一個數組首地址,然后再獲取他的limit地址,即末地址 
  9.       void** limit = &thread_local.Blocks()->last()[i::kHandleBlockSize]; 
  10.       if (current_.limit != limit) { 
  11.         current_.limit = limit; 
  12.         // v8里少了這一句,看起來是需要修改result的值的 
  13.         // result = limit - i::kHandleBlockSize;  
  14.       } 
  15.     } 
  16.   } 
  17.   // 下一個可用的地址 
  18.   current_.next = result + 1; 
  19.   *result = value; 
  20.   return result; 

我們看到CreateHandle會首先獲取一片內存,然后把入參value的值保存到該內存中。

String::New

了解了HandleScope后,我們繼續分析String::New。

  1. Local<String> v8::String::New(const char* data, int length) { 
  2.   i::Handle<i::String> result = 
  3.       i::Factory::NewStringFromUtf8(i::Vector<const char>(data, length)); 
  4.   return Utils::ToLocal(result); 

我們接著看NewStringFromUtf8。

  1. Handle<String> Factory::NewStringFromUtf8(Vector<const char> string,PretenureFlag pretenure) { 
  2.   CALL_HEAP_FUNCTION(Heap::AllocateStringFromUtf8(string,  
  3.                     pretenure),  
  4.                     String); 

我們先看一下AllocateStringFromUtf8的實現,然后再看CALL_HEAP_FUNCTION。

  1. Object* Heap::AllocateStringFromUtf8(Vector<const char> string,PretenureFlag pretenure) { 
  2.   return AllocateStringFromAscii(string, pretenure); 
  3.  
  4. Object* Heap::AllocateStringFromAscii(Vector<const char> string,PretenureFlag pretenure) { 
  5.   // 從堆中分配一塊內存 
  6.   Object* result = AllocateRawAsciiString(string.length(), pretenure); 
  7.   // 設置堆對象的內容 
  8.   AsciiString* string_result = AsciiString::cast(result); 
  9.   for (int i = 0; i < string.length(); i++) { 
  10.     string_result->AsciiStringSet(i, string[i]); 
  11.   } 
  12.   return result; 

我們看到AllocateStringFromUtf8最后返回了一個堆內存地址。接著我們看下CALL_HEAP_FUNCTION這個宏。

  1. #define CALL_HEAP_FUNCTION(FUNCTION_CALL, TYPE)         
  2.   do {                  
  3.     Object* __object__ = FUNCTION_CALL;                                       
  4.     return Handle<TYPE>(TYPE::cast(__object__));    
  5.   } while (false

CALL_HEAP_FUNCTION的作用是把函數FUNCTION_CALL執行的結果轉成Handle對象。我們知道FUNCTION_CALL函數返回的結果是一個堆內存指針。接下來我們看看是如何轉成Handle的。這個Handle不是我們在代碼里使用的Handle。而是V8內部使用的Handle(代碼在handles.h),我們看看實現。

  1. template<class T> 
  2. class Handle { 
  3.  public
  4.   explicit Handle(T* obj); 
  5.  private: 
  6.   T** location_; 
  7. }; 
  8.  
  9. template<class T> 
  10. Handle<T>::Handle(T* obj) { 
  11.   location_ = reinterpret_cast<T**>(HandleScope::CreateHandle(obj)); 

我們看到Handle內部使用的是T**二級指針,而我們剛才拿到堆內存地址是一級指針,自然不能直接賦值,而是通過CreateHandle又處理了一下。HandleScope::CreateHandle我們剛才已經分析過了。執行CreateHandle后布局如下。

所以NewStringFromUtf8最后返回了一個Handle對象(里面維護了一個二級指針location_),接著V8調用Utils::ToLocal把他轉成外部使用的Handle。接著賦值給Handle hello。這里的Handle是外部使用的Handle。

  1. Local<v8::String> Utils::ToLocal(v8::internal::Handle<v8::internal::String> obj) {  
  2.     return Local<String>(reinterpret_cast<String*>(obj.location()));  

首先通過obj.location()拿到一個二級指針。然后轉成一個String *指針。接著構造一個Local對象。ToLocal是V8代碼的分水嶺,我們看看Local的定義。

  1. template <class T> class Local : public Handle<T> { 
  2.  public
  3.   template <class S> inline Local(S* that) : Handle<T>(that) { } 
  4. }; 

直接調用Handle類的函數

  1. template <class T> class Handle { 
  2.   explicit Handle(T* val) : val_(val) { } 
  3.   private: 
  4.     T* val_; 

這時候的結構圖如下

  1. template <class T> class Handle { 
  2.   explicit Handle(T* val) : val_(val) { } 
  3.   private: 
  4.     T* val_; 

所以最后通過ToLocal返回一個外部Handle對象給用戶。當執行

  1. Local <String> xxx = Local對象 

時就會調用Local的拷貝函數。

  1. template <class S>  
  2.       inline Local(Local<S> that) 
  3.       // *that即取得他底層對象的地址 
  4.       : Handle<T>(reinterpret_cast<T*>(*that)) {} 

我們首先看一下that。Handle類重載了運算符。

  1. template <class T> 
  2. T* Handle<T>::operator*() { 
  3.   return val_; 

所以reinterpret_cast(that)拿到了Handle底層指針的值并轉成String 類型。接著執行

  1. explicit Handle(T* val) : val_(val) { } 

整個過程下來,其實就是把被復制對象的底層指針復制過來。=

通過Handle訪問一個函數

當我們使用Handle hello這個對象的方法時是怎樣的,比如hello->Length()。Handle重載了->運算符。

  1. template <class T> 
  2. T* Handle<T>::operator->() { 
  3.   return val_; 

我們看到執行hello->Length()的時候首先會拿到一個String *。然后調用Length方法。其實就是調用String對象(在v8.h中定義)的Length方法。我們看看Length方法的實現。

  1. int String::Length() { 
  2.   return Utils::OpenHandle(this)->length(); 

首先通過傳入this調用OpenHandle拿到內部Handle。從前面的架構圖中我們知道this(即val_和location_指向的值)本質上是一個String **,即二級指針。

  1. v8: :internal: :Handle < v8: :internal: :String >  
  2. Utils: :OpenHandle(v8: :String * that) { 
  3.     return v8: :internal: :Handle < v8: :internal: :String > (reinterpret_cast < v8: :internal: :String * *>(that)); 

OpenHandle就是首先把外部的表示轉成一個二級指針。然后再構造一個內部Handle。在內部Handle里保存了這個二級指針。接著訪問這個Handle對象的length方法。而Handle重載了->運算符。

  1. INLINE(T* operator ->() const)  { return operator*(); } 
  2.  
  3. template <class T>inline T* Handle<T>::operator*() const { 
  4.   return *location_; 

我們看到->的操作最終會被解引用一次變成String *,然后訪問函數length,也就是訪問String對象的length函數。

后記:從上面的分析中我們不僅看到了Handle的實現原理,也看到了V8代碼的一些設計細節,V8在內部實現了一類對象,然后把內部對象轉成外部使用的類型后返回給用戶,當用戶使用該返回的對象時,V8又會轉成內部的對象再操作這個對象。核心的數據結構是兩個Handle族的類。因為他們是維護了真實對象的句柄。其他的一些類,比如String,同樣分為外部和內部類,內部類是實現了String的細節,而外部類只是一個殼子,他負責給用戶暴露API,而不負責實現細節,但用戶操作這些類時,V8會會轉成內部類再進行操作。外部類的定義在v8.h中,這是我們使用V8時需要了解的最好文檔。內部類的實現根據版本不同而不同,比如早期版本都是在object.h里實現的,而實現內外部對象轉換的方法在api.c中定義。

 

責任編輯:武曉燕 來源: 編程雜技
相關推薦

2022-09-16 08:32:25

JavaC++語言

2023-06-05 16:38:51

JavaScript編程語言V8

2014-11-26 09:51:24

GithubGoogleV8

2022-10-24 09:11:05

TypeScriptV8

2021-10-22 21:39:11

InspectorV8 JS

2025-09-08 01:55:00

2023-10-10 10:23:50

JavaScriptV8

2010-07-20 16:35:52

V8JavaScript瀏覽器

2020-09-27 07:32:18

V8

2022-08-19 06:40:02

V8GC

2010-08-31 11:42:03

DB2MDC

2022-04-29 08:00:51

V8垃圾回收

2023-02-28 07:56:07

V8內存管理

2011-10-19 13:47:57

ibmdwRationalWAS

2016-10-18 15:18:48

JEECMS V*javaCMS系統

2021-08-29 18:34:44

編譯V8C++

2022-04-29 08:05:06

內存堆外GC

2022-05-06 23:03:48

V8CPUProfiler

2021-09-05 17:46:21

云計算No.jsio_uringJS

2020-08-31 08:11:01

V8 8.5Promise前端
點贊
收藏

51CTO技術棧公眾號

欧美激情一区二区在线| 国产日韩欧美一区二区三区在线观看 | 国产成人精品一区二区在线| 国产人妻一区二区| 欧美a视频在线| 一卡二卡三卡日韩欧美| 久久国产精品 国产精品| 国产精品传媒在线观看| 欧美久久一级| 亚洲天堂免费视频| 丰满少妇中文字幕| 欧美电影免费观看网站| 亚洲色图视频免费播放| 久久久精品国产一区二区三区| 国产精品露脸视频| 在线成人欧美| 久久影视电视剧免费网站| 国产夫妻性爱视频| 9999精品| 在线影院国内精品| 国产二区视频在线| 黄色网在线看| 国产亚洲欧美日韩日本| 成人欧美一区二区| 中文字幕日韩国产| 亚洲免费中文| 欧美激情视频在线免费观看 欧美视频免费一 | 日产精品一线二线三线芒果| 亚洲精品成人电影| 久久av老司机精品网站导航| **欧美日韩vr在线| 欧美精品xxxxx| 久久国产亚洲精品| 亚洲欧美精品一区| 男男做爰猛烈叫床爽爽小说| 精品中文字幕一区二区三区| 欧美专区日韩专区| 国产免费成人在线| 三级中文字幕在线观看| 亚洲电影激情视频网站| 热这里只有精品| av国产在线观看| 久久精品夜色噜噜亚洲aⅴ| 国产久一道中文一区| av片免费播放| 精品伊人久久久久7777人| 国产精品福利网| 天码人妻一区二区三区在线看| 欧美日韩国产在线一区| 欧美成人h版在线观看| 午夜精品久久久久99蜜桃最新版| 欧美日韩中文字幕一区二区三区| 国产丝袜一区二区| 日韩中文字幕电影| 亚洲色图丝袜| 亚洲人成伊人成综合网久久久| 波多野结衣一二三区| 国产精品美女在线观看直播| 精品国产一区a| 国产视频精品视频| 国产精品网站在线看| 精品日产卡一卡二卡麻豆| 日本美女视频网站| 大奶一区二区三区| 日韩国产高清视频在线| 久久亚洲AV成人无码国产野外| 欧美丝袜美腿| 亚洲欧美激情视频| 男人的天堂官网| 色喇叭免费久久综合| 日韩最新免费不卡| 欧美成人精品一区二区免费看片| 欧美日韩hd| 97碰碰碰免费色视频| 天天综合网久久综合网| 日韩av电影免费观看高清完整版| 国产啪精品视频| 国产又粗又长又大视频| 国产成人8x视频一区二区| 国产乱码精品一区二区三区日韩精品| 人妻无码一区二区三区久久99| 白白色 亚洲乱淫| 欧洲亚洲一区二区| 精品国产99久久久久久| 亚洲v日本v欧美v久久精品| 国产精品无码av在线播放| 亚洲a∨精品一区二区三区导航| 欧美日本在线一区| avtt中文字幕| 夜夜春成人影院| 日韩一区二区三区国产| 国产真实乱人偷精品视频| 久久国产精品久久久久久电车| 国产精品一区专区欧美日韩| 国产a级免费视频| 91丨porny丨国产入口| 亚洲精品一区二区三区四区五区| 国内外激情在线| 欧美视频专区一二在线观看| 在线观看日本一区二区| caoporn成人| 伊人伊成久久人综合网小说| 精品欧美一区二区久久久久| 午夜在线精品偷拍| 亚洲精品日韩激情在线电影| 午夜视频在线播放| 亚洲欧美偷拍另类a∨色屁股| 成人免费在线小视频| 在线免费观看亚洲| 亚洲免费一在线| 日本青青草视频| 日韩电影一区二区三区| 国产一区免费| 搞黄网站在线观看| 在线观看欧美日本| 国产精品第七页| 欧美在线三级| 国产专区欧美专区| 欧美男男激情freegay| 亚洲午夜日本在线观看| 久久久久久久久久一区| 欧美交换配乱吟粗大25p| 国产又大又黄的视频| 91免费看片在线观看| 一区二区在线观看网站| 国产欧美一区二区三区精品酒店| 日韩美女视频在线| 2014亚洲天堂| 日本在线不卡视频一二三区| 精品乱码一区| 成人高潮aa毛片免费| 欧美日韩国产另类不卡| 亚洲精品国产熟女久久久| 日韩视频精品在线观看| 电影午夜精品一区二区三区| 欧美成年黄网站色视频| 欧美午夜免费电影| 中文字幕第20页| 国产一区二区三区的电影| 粉嫩av四季av绯色av第一区| caopeng在线| 欧美一区二区网站| www色aa色aawww| 精品一区二区三区在线观看国产| 日韩三级电影| 国精产品一区一区三区四川| 亚洲人成在线观看网站高清| 欧美黄色一级大片| 久久久99精品久久| 黄色三级视频片| 神马电影久久| 国产精品免费电影| 91欧美在线视频| 欧美日韩国产高清一区二区 | 视频成人永久免费视频| 麻豆乱码国产一区二区三区 | 欧美精品一区二区三区蜜桃视频| 国产一区二区三区在线视频观看| 精品一区二区国语对白| 最新国产精品久久| 久久亚洲精精品中文字幕| 美女久久久久久久久久久| 国产成人精品a视频| 一区二区免费视频| 无码人妻精品一区二区三| 亚洲大胆视频| 欧美日韩精品久久| 成人免费毛片嘿嘿连载视频…| 中国人与牲禽动交精品| 97人妻人人澡人人爽人人精品 | 国产一级免费av| 成年人国产精品| 黄色片久久久久| 欧美日韩亚洲在线观看| 91九色国产社区在线观看| 日本三级在线观看网站| 日韩成人av网址| 成年人晚上看的视频| 中文字幕在线免费不卡| 欧美一级大片免费看| 亚洲国产一区二区三区高清| 六月婷婷久久| 四虎精品永久免费| 午夜精品三级视频福利| 国产三级视频在线看| 欧美一区二区福利视频| 国产成人亚洲欧洲在线| 国产日本亚洲高清| 亚洲精品在线网址| 免费日韩av| 国产精品h视频| 久久精品论坛| 国产日韩精品一区二区| 99爱在线观看| 日韩三级影视基地| 黄色av一区二区三区| 欧洲一区在线观看| 国精品无码一区二区三区| 337p粉嫩大胆噜噜噜噜噜91av| 黄色一级片免费的| 国产亚洲欧洲| 精品嫩模一区二区三区| 久久99国内| 97av影视网在线观看| 成人网ww555视频免费看| 欧美精品xxx| 午夜激情在线观看| 精品视频在线播放| www.久久成人| 欧美日韩精品一区二区天天拍小说| 国产精品suv一区二区| 国产精品久久久久一区二区三区 | 国产午夜精品一区二区三区视频| 手机在线观看日韩av| 日韩精品一级中文字幕精品视频免费观看| 久久最新免费视频| 欧美一二区在线观看| 国产综合18久久久久久| 久久伦理中文字幕| 国产一区二区香蕉| 欧美片第一页| 88国产精品欧美一区二区三区| 黄色网址视频在线观看| 中文字幕精品一区久久久久| 性感美女一级片| 精品粉嫩超白一线天av| 一区二区三区免费观看视频| 色偷偷久久一区二区三区| 久久精品女人毛片国产| 亚洲蜜桃精久久久久久久| 国产日韩精品中文字无码| 久久午夜羞羞影院免费观看| 亚洲熟女一区二区三区| 国产精品亚洲人在线观看| 日韩一区二区三区久久| 日韩不卡在线观看日韩不卡视频| 日本三级免费观看| 在线综合视频| 久久精品国产精品亚洲色婷婷| 黑丝一区二区三区| 日韩精品一区在线视频| 激情久久久久久久| 久久精品国产sm调教网站演员| 狠狠久久婷婷| 草b视频在线观看| 亚洲一级一区| 91免费黄视频| 一本色道88久久加勒比精品| 国产精品无码人妻一区二区在线| 黑人一区二区三区四区五区| 日韩a级黄色片| 亚洲无线视频| 男人天堂av片| 亚洲一区一卡| 99久久激情视频| 日韩va亚洲va欧美va久久| 日韩福利视频在线| 麻豆91精品视频| 亚洲高清视频免费| 成人一级视频在线观看| 日本黄色录像片| 2024国产精品| 夫妇交换中文字幕| 亚洲品质自拍视频| 久青草视频在线观看| 婷婷丁香久久五月婷婷| 精产国品一区二区| 欧美精品成人一区二区三区四区| 99国产在线播放| 精品91自产拍在线观看一区| 日本在线一二三| 综合136福利视频在线| 国产视频中文字幕在线观看| 欧美日韩不卡合集视频| av在线播放资源| 国产z一区二区三区| 国产在视频一区二区三区吞精| 91精品中国老女人| 欧美巨大xxxx| 婷婷久久五月天| 黄色综合网站| 在线观看av日韩| 国产成人免费视频| 亚洲做受高潮无遮挡| 国产精品成人网| 国产无遮挡又黄又爽| 色国产综合视频| a天堂视频在线| 日韩精品999| 日本福利专区在线观看| 久久青草福利网站| 成人亚洲网站| 国产综合动作在线观看| 日韩免费av| 免费av手机在线观看| 久久精品国产99国产| 好吊色视频一区二区三区| 中文字幕在线一区二区三区| 日韩特黄一级片| 69精品人人人人| 九色在线观看| 欧美人在线观看| 素人啪啪色综合| 久久99九九| 欧美激情性爽国产精品17p| 久久婷婷国产精品| 丁香天五香天堂综合| 特级西西人体高清大胆| 亚洲成人免费看| 99精品久久久久久中文字幕| 亚洲片在线观看| 国产高清在线a视频大全| 国产精品丝袜久久久久久不卡| 国产精品丝袜在线播放| 最新av在线免费观看| 日韩精品91亚洲二区在线观看 | 久久久久久久av麻豆果冻| 欧美成人手机视频| 欧美高清性hdvideosex| 狠狠狠综合7777久夜色撩人| 欧美精品第一页在线播放| 伊人国产精品| 性刺激综合网| 天堂va蜜桃一区二区三区| 黄色国产在线视频| 亚洲精品视频一区| 国产乱叫456在线| 色久欧美在线视频观看| 影视一区二区三区| 免费精品视频一区二区三区| 亚洲欧洲一区| 无码国产精品久久一区免费| 国产精品第一页第二页第三页| 337p粉嫩色噜噜噜大肥臀| 国产丝袜一区二区三区| 亚洲天堂导航| 麻豆精品传媒视频| 性欧美videos另类喷潮| 一区二区三区免费在线观看视频| 亚洲成年人网站在线观看| 亚洲乱码国产乱码精品精软件| 久久亚洲精品网站| 亚洲精品第一| 一区中文字幕在线观看| 狠狠色丁香婷婷综合| 免费三级在线观看| 正在播放亚洲一区| 怡红院红怡院欧美aⅴ怡春院| 91在线无精精品一区二区| 我不卡神马影院| 国产乱叫456| 亚洲三级理论片| 99精品视频免费看| 九九视频直播综合网| 超碰97久久| 国产男女免费视频| 久久亚洲一区二区三区明星换脸| 99热国产在线观看| 亚洲色图校园春色| 欧美成人aaa| 中日韩在线视频| 国产乱码精品一品二品| 538任你躁在线精品视频网站| 日韩女优制服丝袜电影| 成人影音在线| 久久av一区二区三区亚洲| 久热精品视频| 日本美女黄色一级片| 精品剧情v国产在线观看在线| 136福利第一导航国产在线| 欧美国产一二三区| 日韩精品一区第一页| 91久久国产综合| 亚洲第一精品自拍| 综合在线影院| 九九久久九九久久| 99久久精品一区二区| 中文字幕一区二区人妻视频| 久久精品一本久久99精品| 亚洲精选av| 日韩亚洲在线视频| 亚洲免费观看视频| 亚洲欧洲视频在线观看| 国产精品视频99| 伊人久久久大香线蕉综合直播| mm131丰满少妇人体欣赏图| 欧美精品免费视频| 多野结衣av一区| 午夜视频久久久| 成人听书哪个软件好| 波多野结衣一二区| 欧美日本中文字幕| 国产乱码精品一区二区亚洲| 欧美一级小视频| 天天影视色香欲综合网老头| 日本精品在线| 久久综合色一本| 国产资源精品在线观看| 日本视频在线观看免费| 超碰91人人草人人干|