隔离实例内存初始化
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");}
下面开始我们从隔离实例的初始化开始说起,结合源代码看一下隔离实例的初始化。
晚

