/ / v8 persistent setWeak обратно повикване не се получава - c ++, v8

v8 persistent setWeak обратно извикване не се получава - c ++, v8

Използвайки библиотеката на Google v8 C ++, опитах сесъздаване на v8 :: UniquePersistent копие на купчината, което съдържа вътрешен указател към някаква памет, която е била разпределена в C ++ и наречена SetWeak () на Устойчивия, за да определи обратно повикване, което би направило необходимото почистване чрез дезактивиране на паметта, показалецът в "Устойчив" се отнася до това, когато тази дръжка вече не се нуждае от javascript двигателя. Въпреки че създаването на персистиращата изглежда работи, установявам, че функцията ми за обратно извикване никога не се извиква.

Тук съм напълно затънал. Някакви идеи какво да правя грешно?

Отговори:

0 за отговор № 1

Обратното повикване се извиква само когато обектът е събран. Опитайте този пример:

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...
}