V8 c ++和JS:如何在上下文之间共享对象

时间:2019-03-07 11:33:42

标签: v8

我正在寻找一种方法/解决方案,用于将声明到上下文(即上下文A)中的js对象共享到另一个上下文(即上下文B)中。两者在同一个隔离区中。 详细地: 我正在使用v8 c ++包装器将c ++类(即cppClass)变为js代码。因此,我可以直接将cppClass.myfunction()或cppClass.myProperty调用到js代码中。

我只有一个隔离区,还有一个用于加载和运行复杂的js文件(由许多js文件和声明的许多对象/函数组成)的主要上下文。

此外,我还有其他正在运行其他简单JS代码的上下文。所有上下文都在同一隔离中。

假设在contextA中声明并使用了一个AObject,它具有类似AObject.foo = 10的属性。我想知道是否可以访问ContextB中的AObject并读取/更改AObject.foo属性,例如:

    // JS code in ContextA
    var AObject=new cppClass();
    AOBject.foo=10;
    ...

// JS code in ContextB
    var newvalue=AObject.foo +1; //or something like myWrapMethod.AObject.foo+1;
    Console.Log(" The new value is : " + newvalue );
    // The new value is : 11

我可以从ContextB访问AObject(即调用其函数或设置其属性/属性)吗? 预先谢谢你

安德里亚

2 个答案:

答案 0 :(得分:1)

我的问题的可能答案可能是以下方法。在c ++中,假设具有以下代码:

   Handle<Context> contextA=myIsolate::GetCurrentContext();
    ... some code
    Handle<Context> contextB=GetMyBContext();
    ... some code

    contextA->Enter(); // change the context to A Context

    auto global_obj = contextA->Global();
    v8::Local<v8::Value> desiredValue = global_obj->Get(String::NewFromUtf8(myIsolate,"AObject"));
    contextA->Exit(); // change the context to B Context
    // Now  AObject can be used also in the context B (another script js)
   myIsolate->GetCurrentContext()->Global()->Set(v8::String::NewFromUtf8(myIsolate, "AObject"), desiredValue ->ToObject());

然后,在js文件(与B上下文相关)中,我可以将AObject与AContext中使用的值相同。

希望有用。 此致。

安德里亚

答案 1 :(得分:0)

您应该将两个上下文安全性令牌设置为相同。 然后,您可以从上下文中获取对象Ref,并从另一个对象中存储/使用它。

从v8.h头文件中获取:

  /**
   * Sets the security token for the context.  To access an object in
   * another context, the security tokens must match.
   */
  void SetSecurityToken(Local<Value> token);