隔离实例内存初始化

image.png

v8::Isolate对v8::internal::Isolate的代理。当我们调用v8::Isolate的实例方法的时候实际是去调用8::internal::Isolate。那为何v8要了一大圈去处理呢。我想大概是为了兼容性考虑吧。我们知道v8作为一个javaScript运行时。需要不停的迭代开发。这样难免会破坏式升级。如果实现代理。当需要修改的时候只修改v8::internal::Isolate的实例方法,保持外部接口的不变,这样嵌入式应用只需重新执行编译即刻,不需要去修改接口。下面代码时v8实现代理的模式原理。

  1. namespace v9{
  2. namespace internal{
  3. class Isolate{
  4. private:
  5. const char* name = "name";
  6. public:
  7. static Isolate* New() {
  8. return new Isolate();
  9. };
  10. const char* getName() {
  11. return name;
  12. }
  13. };
  14. }
  15. class Isolate{
  16. public:
  17. static Isolate* New() {
  18. return reinterpret_cast<Isolate*>(internal::Isolate::New());
  19. };
  20. const char* getName() {
  21. internal::Isolate* isolate = reinterpret_cast<internal::Isolate*>(this);
  22. return isolate->getName();
  23. }
  24. ~Isolate(){
  25. internal::Isolate* isolate = reinterpret_cast<internal::Isolate*>(this);
  26. delete isolate;
  27. }
  28. };
  29. }
  30. TEST(isoate_test, proxy) {
  31. v9::Isolate *isolate = v9::Isolate::New();
  32. EXPECT_STREQ(isolate->getName(), "name");
  33. }

下面开始我们从隔离实例的初始化开始说起,结合源代码看一下隔离实例的初始化。
image.png