我最近正在研究V8的源代码。 Isolate
类有2个定义,一个在v8::Isolate
中定义,另一个在v8::internal::Isolate
中定义。似乎v8::Isolate
使用了v8::internal::Isolate
,但我无法理解这两个定义之间的关系/
我试图研究https://github.com/v8/v8/blob/master/include/v8.h#L7391中的v8::Isolate
和https://github.com/v8/v8/blob/master/src/execution/isolate.h#L452中的v8::internal::Isolate
的类定义
但无法弄清楚。
更具体地说,在v8::Isolate::New
(https://github.com/v8/v8/blob/master/src/api/api.cc#L7903)中,它返回类型为v8::Isolate
的C ++对象。
Isolate* Isolate::New(const Isolate::CreateParams& params) {
Isolate* isolate = Allocate();
Initialize(isolate, params);
return isolate;
}
但是在内部Allocate
函数中,它返回类型为v8::internal::Isolate
的对象,并重新解释广播到v8::Isolate
Isolate* Isolate::Allocate() {
return reinterpret_cast<Isolate*>(i::Isolate::New());
}
如何从v8::Isolate
投射类v8::internal::Isolate
的对象?
任何熟悉V8的人都能给我一些指导吗?
答案 0 :(得分:1)
对于库来说,这是一种不常见的技术:v8::internal::Isolate
是实现,但是其详细信息完全封装在库中,并且对公共API隐藏。 v8::Isolate
只是一个不透明的引用。观察它没有字段。嵌入程序对内存中的外观一无所知(或者它是否完全具有内存表示形式-就他们而言,可能类似于内核的文件描述符)。当然,这种封装的原因是为了分开关注点,并使组件彼此独立:该库可以更改类的内部定义,而不必担心嵌入程序(即,它们不可能依赖于内部状态) ,因此可以确保它们不会被更改破坏;它们甚至不必重新编译,因为当内部类布局更改时,公共API [和ABI]不会更改。
请考虑以下简化示例,说明该原理:
/* public API */
class BlackBox {
public:
static BlackBox* Create();
void DoSomething();
}
void StandaloneFunction(BlackBox* box);
/* internal implementation */
class TheRealThing {
public:
TheRealThing(int value) : value_(value) {}
private:
int value_;
}
BlackBox* BlackBox::Create() {
TheRealThing* real = new TheRealThing(42);
return reinterpret_cast<BlackBox*>(real);
}
void BlackBox::DoSomething() {
TheRealThing* real = reinterpret_cast<TheRealThing*>(this);
printf("Hello %d\n", real->value_);
}
void StandaloneFunction(BlackBox* box) {
TheRealThing* real = reinterpret_cast<TheRealThing*>(box);
printf("Good bye %d\n", real->value_);
}