/ / v8 perzistentná sada Slabé spätné volanie nie je volané - c ++, v8

v8 trvalé setWeak spätné volanie nedostáva volanie - c + +, v8

Pomocou knižnice v8 jazyka C ++ spoločnosti Google som to skúsilvytvorenie inštancie v8 :: UniquePersistent na halde, ktorá obsahuje interný ukazovateľ na časť pamäte, ktorá bola pridelená v C ++, a nazvanú SetWeak () v skupine Persistent na určenie spätného volania, ktoré by vykonalo potrebné vyčistenie uvoľnením pamäte, že interná ukazovateľ v Perzistentné odkazuje na prípady, keď tento javový modul už javascriptový stroj nepotrebuje. Aj keď sa zdá, že vytvorenie Perzistenta funguje, zisťujem, že moja funkcia spätného volania sa nikdy nevyvolá.

Som tu úplne na dne. Máte nejaké nápady, čo by som mohol robiť zle?

odpovede:

0 pre odpoveď č. 1

Spätné volanie sa vyvolá iba vtedy, keď je objekt zbavený odpadu. Vyskúšajte tento príklad:

void callback(v8::WeakCallbackData<v8::Object, int> data)
{
Local<Object> val = data.GetValue();
int* ptr = retinterpret_cast<int*>(val->GetAlignedPointerFromINternalField(0));
delete ptr;
fprintf(stdout, "Deleted internal object!n");
}

void main()
{
using namespace v8;

// Enable garbage collection
const char* flags = "--expose_gc";
v8::V8::SetFlagsFromStrings(flags, strlen(flags));

Isolate isolate = Isolate::New();
isolate->Enter();
HandleScope scope(isolate);
Eternal<v8::Context> context;
Local<ObjectTemplate> ctx_template  ObjectTemplate::New(isolate);
context.Set(isolate, Context::New(isolate, nullptr, ctx_template);

Local<ObjectTemplate> obj_template = ObjectTemplate::New(isolate);
obj_template->SetInternalFieldCount(1);
Local<Object> obj = Local<Object>(isolate, obj_template->NewInstance());
obj->SetAlignedPointerInInternalField(0, new int);
UniquePersistent<Object> persistent(isolate, obj);
persistent->SetWeak(nullptr, callback);

//...do something with persistent

persistent.Reset();

isolate->RequestGarbageCollectionForTesting(v8::Isolate::kFullGarbageCollection);
// You should see output from the callback
// i need to add more words to pass edit word num check...
}