精品欧美一区二区三区在线观看 _久久久久国色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精品视频大全| 欧美久久一二区| 青青草成人网| 国产精品人人爽| 亚洲第一伊人| 中文字幕精品在线| 欧美xxxx黑人| 国模视频一区| 亚洲制服丝袜一区| 欧美视频小说| 性生活视频软件| 日韩成人dvd| 国语自产精品视频在线看抢先版图片 | 国产福利免费在线观看| 狠狠久久亚洲欧美| 欧洲亚洲妇女av| 欧美久久久久久久久久久久| 精品国内自产拍在线观看视频| 日韩午夜激情视频| 最近免费中文字幕中文高清百度| 91最新在线视频| 亚洲精品小区久久久久久| 欧美日韩高清一区二区不卡| 欧美爱爱视频免费看| 毛片在线视频| 久久久久久久网| 国产日韩欧美二区| 99国产在线播放| 青青草91视频| 青青草99啪国产免费| 国产一级在线免费观看| 99久久精品费精品国产| 亚洲欧美激情精品一区二区| 亚洲av无码一区东京热久久| 成人黄色理论片| 欧美性猛交一区二区三区精品| 啊啊啊一区二区| 亚洲丝袜一区| 国产精品久久久久久久久果冻传媒| 欧美视频1区| 色在线免费视频| 不卡电影免费在线播放一区| 成人欧美一区二区三区黑人免费| 国产手机精品视频| 麻豆freexxxx性91精品| 国产精品久久久久久婷婷天堂| 97免费在线观看视频| 尹人成人综合网| 欧美激情按摩在线| 妺妺窝人体色www婷婷| 欧美日韩免费观看一区=区三区| 久久精品视频网站| 国产喷水在线观看| 香蕉综合视频| 美女福利精品视频| 欧美国产在线看| 欧美精品导航| 欧美精品videofree1080p| 黄色一级免费视频| 伊人久久久大香线蕉综合直播 | 色多多在线观看| 精品免费在线视频| 97xxxxx| 亚洲综合电影| 日韩欧美国产免费播放| 国产综合免费视频| 国产69精品久久久久按摩| 欧美日韩一区二区三区不卡| 久久久久国产一区| 95精品视频| 欧美岛国在线观看| 男男一级淫片免费播放| 色婷婷狠狠五月综合天色拍| 亚洲女人初尝黑人巨大| 国产视频123区| 97国产精品| 欧美劲爆第一页| 成人免费毛片视频| 精品亚洲porn| 国产精品区一区| 黄色网址在线播放| 亚洲日本成人在线观看| 成年人网站国产| 视频在线日韩| 日韩片之四级片| 少妇特黄一区二区三区| 日韩电影二区| 久久久久中文字幕2018| www.中文字幕在线观看| 免费在线观看不卡| 国产91色在线|亚洲| 日本啊v在线| 亚洲视频综合在线| 91精品91久久久中77777老牛 | 国产精品亚洲一区| 欧美白人做受xxxx视频| 亚洲天堂免费看| 青草青青在线视频| 国产成人精品一区二三区在线观看| 9191国产精品| 无码人妻精品一区二区三应用大全| 久久中文亚洲字幕| 91av免费观看91av精品在线| 91久久国语露脸精品国产高跟| 成人福利视频在线看| 日韩精品欧美专区| 成人在线高清免费| 欧美精品在欧美一区二区少妇| 污污免费在线观看| 国产二区精品| 日韩免费观看视频| 亚洲乱熟女一区二区| 国产精品女人毛片| 欧美a在线视频| 69精品国产久热在线观看| 亚洲最新av在线| 欧美a∨亚洲欧美亚洲| 国产美女在线观看一区| 日本一区二区三区免费看| 91福利在线免费| 91精品婷婷国产综合久久性色| 在线不卡av电影| 在线日韩av| 147欧美人体大胆444| 午夜激情视频在线| 欧美性猛交xxxx黑人猛交| 国产精品99久久久精品无码| 久久国产中文字幕| 国产精品video| 日本视频在线观看一区二区三区| 亚洲自拍偷拍麻豆| 中文字幕人妻无码系列第三区| 日韩综合网站| 国产拍精品一二三| 在线免费av网站| 欧美色男人天堂| 天天躁夜夜躁狠狠是什么心态| 在线亚洲自拍| 精品视频一区二区三区四区| 日本高清成人vr专区| 欧美一激情一区二区三区| 成人一级黄色大片| 精品一区二区三区久久久| 日韩在线电影一区| 澳门av一区二区三区| 亚洲欧洲一区二区三区久久| 久久夜色精品国产噜噜亚洲av| 伊人久久大香线蕉av超碰演员| 91亚洲精品一区二区| 精品黄色免费中文电影在线播放 | 亚洲黄色a v| 成人高清电影网站| 国产精品白嫩美女在线观看| 国产视频第一页在线观看| 日本精品一级二级| 你懂得视频在线观看| 免费黄网站欧美| 亚洲三级一区| 美女久久精品| 久久久最新网址| 全色精品综合影院| 一本大道久久精品懂色aⅴ| 欧洲女同同性吃奶| 免费成人在线视频观看| 中文字幕久久一区| 2023国产精华国产精品| 亚洲 日韩 国产第一| 黄色在线免费观看大全| 欧美三级电影网站| 中文字幕av免费在线观看| 粉嫩13p一区二区三区| 香港三级韩国三级日本三级| 久久av网址| 国产欧美日韩91| 欧美人动性xxxxz0oz| 亚洲精品aⅴ中文字幕乱码| 69亚洲精品久久久蜜桃小说| 国产精品久久久久国产精品日日| 自拍一级黄色片| 亚洲一区观看| 中文字幕久久综合| 欧美人体视频| 国产精品一区久久久| 曰本三级在线| 亚洲欧美在线一区| 97人人爽人人爽人人爽 | 日本黄色中文字幕| 亚洲人一二三区| www.免费av| 久久99精品久久久久久国产越南| 日本免费a视频| 红桃视频在线观看一区二区| 亚洲自拍小视频免费观看| 狠狠操一区二区三区| 色妞色视频一区二区三区四区| 亚洲精品久久久久久无码色欲四季| 色综合久久66| 精品无码av在线| 中文在线一区二区| 中文字幕精品久久久| 久久国内精品自在自线400部| www.国产在线播放| 久久在线播放| 免费国产在线精品一区二区三区| 国产美女视频一区二区| 国产成人精品免高潮费视频| 男男gaygays亚洲| 色哟哟亚洲精品一区二区| 深夜福利视频网站| 欧美一区午夜精品| 亚洲中文无码av在线| 午夜精品久久一牛影视| 日韩三级在线观看视频| 久久久不卡网国产精品二区| 欧美丰满熟妇bbb久久久| 美女在线一区二区| 天天摸天天碰天天添| 极品日韩av| 成人免费看片视频在线观看| 欧美日韩性在线观看| 精品国产乱码久久久久久88av | 免费一区二区三区在在线视频| 伊人久久大香线蕉av超碰| 91精品国产综合久久香蕉最新版 | 在线heyzo| 日韩在线视频导航| 成人在线观看黄色| 亚洲免费精彩视频| 午夜影院免费体验区| 欧美成人bangbros| 国内精品偷拍视频| 欧美一区二区在线免费观看| 一级黄色大毛片| 欧美伊人精品成人久久综合97| 亚洲GV成人无码久久精品 | 亚洲熟女乱色一区二区三区久久久| 欧美性xxxx极品hd满灌| 亚洲视频免费播放| 亚洲丶国产丶欧美一区二区三区| 久久精品视频免费在线观看| 日韩美女精品在线| 夫妻性生活毛片| 亚洲色图欧美在线| 国产精品 欧美激情| 亚洲欧美日韩系列| 永久免费看片直接| 综合久久久久综合| 91 在线视频| 亚洲免费在线观看视频| 欧美性猛交xxxxx少妇| 亚洲精品高清在线| 国产一二三四在线| 欧美日韩国产精品专区| 天天干天天干天天| 色婷婷久久久综合中文字幕 | 亚洲人做受高潮| 亚洲欧洲精品成人久久奇米网| fc2ppv在线播放| 亚洲激情av在线| 国产福利拍拍拍| 色呦呦一区二区三区| 成人黄色三级视频| 69堂成人精品免费视频| 国产sm主人调教女m视频| 精品国产亚洲一区二区三区在线观看| 人人妻人人澡人人爽人人欧美一区| 亚洲精品720p| 91精彩视频在线播放| 久热爱精品视频线路一| av成人 com a| 国产成人精品视| 亚洲精品一区av| 国产精品美女诱惑| 精品久久久久久久| 中文字幕免费高| 亚洲精品在线二区| 91激情视频在线| 国产成人免费高清| 草草影院第一页| 国产精品久久久久久久久动漫| 久久国产免费观看| 日韩欧美中文在线| 99热这里只有精品在线| 日韩不卡中文字幕| 九义人在线观看完整免费版电视剧| 97国产精品免费视频| 成人精品动漫| 国产日韩欧美亚洲一区| 精品日韩毛片| 国产一线二线三线女| 日日夜夜一区二区| 91九色蝌蚪porny| 国产精品无遮挡| 日本亚洲色大成网站www久久| 欧美性受极品xxxx喷水| 好吊视频一二三区| 色哟哟入口国产精品| 欧亚av在线| 91视频婷婷| 成人情趣视频网站| www.好吊操| 精品制服美女久久| 91成年人网站| 亚洲r级在线视频| 国产精品视频在线观看免费| 日韩成人在线网站| a毛片在线播放| 国产精品一久久香蕉国产线看观看| 第一区第二区在线| 中文字幕一区二区三区有限公司 | 57pao成人永久免费视频| 伊人久久大香伊蕉在人线观看热v 伊人久久大香线蕉综合影院首页 伊人久久大香 | 国产亚洲福利社区| 国产精品久久久久9999赢消| 波多野结衣50连登视频| 东方aⅴ免费观看久久av| 国产精品夜夜夜爽阿娇| 在线亚洲+欧美+日本专区| 色香蕉在线视频| 欧美伦理91i| vam成人资源在线观看| 日韩亚洲不卡在线| 久久精品一区二区三区中文字幕| 折磨小男生性器羞耻的故事| 自拍av一区二区三区| 亚洲综合一区中| 国产一区二区三区视频在线观看 | 欧美福利电影在线观看| 不卡的在线视频| 国产精品免费人成网站| 91久久国产综合久久91| 亚洲欧洲黄色网| 我爱我色成人网| 欧美日韩国产高清视频| a91a精品视频在线观看| 日本黄色录像片| 精品国产成人av| 婷婷开心激情网| 91精品国产精品| 日韩精品导航| 国产91在线视频观看| 久久久久九九视频| 91视频久久久| 在线视频精品一| 成人交换视频| 三级网在线观看| 国产麻豆成人精品| 免费网站看av| 亚洲国产精品va在线看黑人 | 国产一区二区精品久久| 亚洲一级生活片| 日韩欧美第一区| 岛国毛片av在线| 精品一区日韩成人| 久久国产精品毛片| 亚洲女优在线观看| 欧美三区在线观看| 国产原厂视频在线观看| 91gao视频| 精品动漫一区| 亚洲午夜久久久久久久久红桃| 日韩欧美成人区| jzzjzzjzz亚洲成熟少妇| 国产日韩在线视频| 欧美日韩三级| 久久亚洲AV成人无码国产野外 | 欧美片一区二区三区| 成人av婷婷| 成人在线观看黄| 国产精品久99| 亚洲精品无码久久久| 91精品国产精品| 久久亚洲国产| 女人扒开双腿让男人捅 | 国产精品久久久久影院亚瑟| 国产毛片毛片毛片毛片| 97色在线观看| 大色综合视频网站在线播放| 日本成人在线免费观看| 狠狠久久亚洲欧美专区| 在线视频1区2区| 国产精品毛片一区视频| 日本中文字幕一区| 久久久久久久国产精品毛片| 日韩精品在线第一页| 亚洲男女网站| 日韩欧美亚洲天堂| 国产精品福利影院| 天天干天天爽天天操| 国产精品日日摸夜夜添夜夜av| 欧美日本亚洲韩国国产| 成人午夜福利一区二区| 日韩精品在线一区二区| 日韩欧美看国产| 少妇一晚三次一区二区三区| 久久久国产精华| 亚洲乱码在线观看| 国产欧美日韩中文字幕| 亚洲一区亚洲| 久久无码精品丰满人妻|