Как создать v8 :: ObjectTemplate со свойством массива? - PullRequest
0 голосов
/ 21 октября 2019

Я пытаюсь создать ObjectTemplate, который содержит свойство, которое является массивом ObjectTemplate. Моя цель состоит в том, чтобы использовать этот ObjectTemplate для создания v8 :: Context, который будет иметь свойство, которое является массивом объектов.

v8::Local<v8::ObjectTemplate> t = v8::ObjectTemplate::New(isolate);
v8::Local<v8::Array> a = v8::Array::New(isolate, 3);
v8::Local<v8::ObjectTemplate> i0 = v8::ObjectTemplate::New(isolate);
i0->Set(isolate, "a", v8::String::NewFromUtf8(isolate, "hello"));
i0->Set(isolate, "b", v8::String::NewFromUtf8(isolate, "goodbye"));
a->Set(0, i0); // <== This is where compile error occurs

Не удается скомпилировать это сообщение об ошибке:

error C2440: '=': cannot convert from 'v8::ObjectTemplate *' to 'v8::Value *volatile '

В качестве обходного пути я попробовал это, но полученный объект не является массивом!

v8::Local<v8::ObjectTemplate> t = v8::ObjectTemplate::New(isolate);
v8::Local<v8::ObjectTemplate> i0 = v8::ObjectTemplate::New(isolate);
i0->Set(isolate, "a", v8::String::NewFromUtf8(isolate, "hello"));
i0->Set(isolate, "b", v8::String::NewFromUtf8(isolate, "goodbye"));
t->Set(isolate, "0", i0);

v8::Local<v8::Object> o;
if (t->NewInstance(context).ToLocal(&o))
{
  v8::Local<v8::Value> x = o->Get(0);
  if (x->IsArray())
  {
    std::cout << "It is an array" << std::endl;
  }
  else
  {
    std::cout << "It is not an array" << std::endl;
  }
}

Любая помощь будет принята.

1 Ответ

0 голосов
/ 21 октября 2019

Думайте о «ObjectTemplate» как о «чертеже». Для a->Set(0, i0); необходимо, чтобы i0 был действительным объектом, а не планом / шаблоном. Если вы замените:

v8::Local<v8::ObjectTemplate> i0 = v8::ObjectTemplate::New(isolate);
i0->Set(isolate, "a", v8::String::NewFromUtf8(isolate, "hello"));
i0->Set(isolate, "b", v8::String::NewFromUtf8(isolate, "goodbye"));

на:

v8::Local<v8::Object> i0 = v8::Object::New(isolate);
i0->Set(context, v8::String::NewFromUtf8(isolate, "a"), 
        v8::String::NewFromUtf8(isolate, "hello"));
i0->Set(context, v8::String::NewFromUtf8(isolate, "b"),
        v8::String::NewFromUtf8(isolate, "goodbye"));

, где context - v8::Local<v8::Context>, то это должно заставить ваш код работать.

(Сторонапримечание: строка a->Set(0, i0); не будет работать с более новыми версиями V8, потому что эта конкретная перегрузка Set устарела и удалена. Сейчас требуется context.)

...