隔离实例内存初始化
v8::Isolate对v8::internal::Isolate的代理。当我们调用v8::Isolate的实例方法的时候实际是去调用8::internal::Isolate。那为何v8要了一大圈去处理呢。我想大概是为了兼容性考虑吧。我们知道v8作为一个javaScript运行时。需要不停的迭代开发。这样难免会破坏式升级。如果实现代理。当需要修改的时候只修改v8::internal::Isolate的实例方法,保持外部接口的不变,这样嵌入式应用只需重新执行编译即刻,不需要去修改接口。下面代码时v8实现代理的模式原理。
namespace v9{
namespace internal{
class Isolate{
private:
const char* name = "name";
public:
static Isolate* New() {
return new Isolate();
};
const char* getName() {
return name;
}
};
}
class Isolate{
public:
static Isolate* New() {
return reinterpret_cast<Isolate*>(internal::Isolate::New());
};
const char* getName() {
internal::Isolate* isolate = reinterpret_cast<internal::Isolate*>(this);
return isolate->getName();
}
~Isolate(){
internal::Isolate* isolate = reinterpret_cast<internal::Isolate*>(this);
delete isolate;
}
};
}
TEST(isoate_test, proxy) {
v9::Isolate *isolate = v9::Isolate::New();
EXPECT_STREQ(isolate->getName(), "name");
}
下面开始我们从隔离实例的初始化开始说起,结合源代码看一下隔离实例的初始化。
晚