v8学习笔记(二) Handle和HandleScope机制
1.Handle結構
? (1)API Handle(v8::handle):含有一個T*對象指針,(實際上是相應內部對象指針的指針)
? (2)內部Handle(v8::internal::handle):T**內部對象指針的指針
2.相互轉換:
? (1)API Handle->內部Handle
???????? v8::internal::Handle<v8::internal::To> Utils::OpenHandle(const v8::From* that)
???????? {
??? ?????????? Return v8::internal::Handle<v8::internal::To>(
?????????????????????????????????????????????? ?? reinterpret_cast<v8::internal::To**>(const_cast<v8::From*>(that))
??????????????????????????????????????????????????????????????????????????????????????????????????????????????? );
??????? }
???????? 將API Handle中的API對象指針強制轉化為內部對象指針的指針,創建內部Handle并返回
?
v8::internal::Handle<v8::internal::Object2> Utils::OpenHandle(* v8::Handle<v8::Object1>);??
??
? (2)內部Handle->API Handle
???????? Local<v8::To> Utils::ToLocal(v8::internal::Handle<v8::internal::From> obj)
???????? {
??? ?????????? ASSERT(obj.is_null() || !obj->IsTheHole());????????????????????????????
??? ?????????? return Local<To>(reinterpret_cast<To*>(obj.location()));???????????????
? ???? }???????
???????? 將內部Handle中的內部對象指針的指針強制轉化為API Handle中API對象指針,創建API Handle并返回
?
Local<v8::Object1> Utils::ToLocal(v8::internal::Handle<v8::internal::Object2>);?
?
3.API Handle
???????? (1)Local Handle(局部句柄)
???????? (2)Persistent Handle(持久句柄)
???????? Local Handle對應的內部對象指針會被放入HandleScope類中的Static HandleScopeData中,在HandleScope銷毀的時候會恢復覆蓋(清空)HandleScopeData,使得內部對象成為垃圾,被回收。而Persistent Handle對應的內部對象指針不放入Static HandleScopeData,內部對象指針的指針直接保存在Persistent Handle中,由用戶自己銷毀內部對象、釋放內存。
4.API Handle的使用
??函數調用:
???????? (1)重載API Handle的->操作符,返回 API對象指針(內部對象指針的指針)
?????????????????? inline T* operator->() const { return val_; }
???????? (2)OpenHandle轉換為內部句柄
???????? (3)重載內部Handle的->或者*操作符,返回內部對象指針
???????? (4)開始調用
?
?
(三)v8 HandleScope機制
1.概述
???????? HandleScope其實就是一個HandleScopeData的備份。
???????? HandleScopeData:內部對象指針的數組
2.HandleScope結構
???????? (1)內部HandleScope
???????? static v8::ImplementationUtilities::HandleScopeData current_;當前HandleScopeData
? ?????? const v8::ImplementationUtilities::HandleScopeData previous_;備份
???????? (2)API HandleScope
?????????????????? HandleScopeData previous_;備份
?
???????? API HandleScope和內部HandleScope共用static HandleScopeData;
3.運行過程
???????? 創建API HandleScope時,備份當前static HandleScopeData到API HandleScope中的previous_。 之后創建的對象的指針放入static HandleScopeData中,當銷毀(析構)API HandleScope時,恢復static HandleScopeData為之前的備份。清空了期間創建的對象的指針,由垃圾回收器回收對象。
???????? 內部HandleScope同理.
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的v8学习笔记(二) Handle和HandleScope机制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: v8学习笔记(一) 调用层次
- 下一篇: v8学习笔记(三) 运行时环境