V8将指针抽象为Handle模板类对象,Handle模板类对指针进行了简单的封装,
Handle分为两类:local和persistent ,Local handles 通常是本地的,短暂的,由HandleScopes类进行管理,不需要显示的释放。
persistent用于跨多个独立的存储对象操作,需要显示的释放。
HandleScopes类管理local handle。声明一个HandleScopes,则后续所有新建的local handle都由此HandleScopes管理,当HandleScopes生命消亡
的时候,由HandleScopes管理得local handle也就消亡了。
可以看到Local的new的实现,就是通过HandleScope::CreateHandle创建的
template <class T>
Local<T> Local<T>::New(Handle<T> that) {
if (that.IsEmpty()) return Local<T>();
internal::Object** p = reinterpret_cast<internal::Object**>(*that);
return Local<T>(reinterpret_cast<T*>(HandleScope::CreateHandle(*p)));
}
在已有一个HandleScopes1的时候再创建一个HandleScopes2,则新建的HandleScopes2管理后续新建的local handle,当HandleScopes2
生命周期结束时,HandleScopes1则管理
HandleScope::HandleScope() : is_closed_(false) {
API_ENTRY_CHECK("HandleScope::HandleScope");
i::HandleScope::Enter(&previous_); //保存前一个HandleScope
}
HandleScope::~HandleScope() {
if (!is_closed_) {
i::HandleScope::Leave(&previous_); //恢复前一个HandleScope为当前HandleScope
}
}
posted on 2015-12-13 23:24
merlinfang 阅读(587)
评论(0) 编辑 收藏 引用 所属分类:
v8