> > I assume you're storing references to the objects as Persistent?
Nope. You've got the whole code up there. So if I understand correctly: - the objects I need to keep track of the lifecycle should be made Persistent ; - all the other values can be set as Local ; - I should set the weak callback using MakeWeak ; - callback will be called when such object is GCed and I can free my C/C++ memory then. Is that correct ? 2017-11-15 19:50 GMT+01:00 J Decker <d3c...@gmail.com>: > I assume you're storing references to the objects as Persistent? All you > need to do then is call SetWeak() https://v8docs. > nodesource.com/node-0.10/d2/d78/classv8_1_1_persistent.html > void MakeWeak (void *parameters, WeakReferenceCallback callback) > > the callback is called when the object is GC'd. > > > On Wed, Nov 15, 2017 at 8:37 AM, Jean-Marc Le Roux < > jeanmarc.ler...@aerys.in> wrote: > >> So I've found a solution to make things lazy: I set an accessor instead >> of decoding/setting the actual value. >> >> void >> getter(Local<Name> property, const PropertyCallbackInfo<Value>& info) >> { >> Isolate* isolate = info.GetIsolate(); >> >> const bson_t* document = reinterpret_cast<bson_t*>( >> info.This() >> ->Get(String::NewFromUtf8(isolate, "__bson_document_ptr")) >> ->ToInt32()->Value() >> ); >> >> char key[255]; >> property->ToString(isolate)->WriteUtf8(key, 255); >> >> bson_iter_t iter; >> bson_iter_init(&iter, document); >> // FIXME: index the property so we don't have to find it >> bson_iter_find(&iter, key); >> >> // FIXME: replace the accessor with the deserialized value >> >> info.GetReturnValue().Set(iterator_to_value(isolate, &iter)); >> } >> >> Local<Value> >> fill_object(Isolate* isolate, Local<Object>& obj, const bson_t* document) >> { >> obj->Set( >> String::NewFromUtf8(isolate, "__bson_document_ptr"), >> Int32::New(isolate, reinterpret_cast<intptr_t>(document)) >> ); >> >> bson_iter_t iter; >> if (bson_iter_init(&iter, document)) >> { >> while (bson_iter_next(&iter)) >> { >> const char* key = bson_iter_key(&iter); >> >> if (!obj->Has(String::NewFromUtf8(isolate, >> key))) >> { >> obj->SetAccessor( >> isolate->GetCurrentContext(), >> String::NewFromUtf8(isolate, key), >> &getter >> ); >> } >> } >> } >> } >> >> The secret sauce is to : >> >> - keep the original data (the bson_t) allocated >> - store the corresponding pointer in a v8::Object >> >> But now I have a memory leak because those pointers will never be freed. >> How can I know when the Object will be disposed by the GC? >> >> Thanks, >> >> -- >> -- >> v8-users mailing list >> v8-users@googlegroups.com >> http://groups.google.com/group/v8-users >> --- >> You received this message because you are subscribed to the Google Groups >> "v8-users" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to v8-users+unsubscr...@googlegroups.com. >> For more options, visit https://groups.google.com/d/optout. >> > > -- > -- > v8-users mailing list > v8-users@googlegroups.com > http://groups.google.com/group/v8-users > --- > You received this message because you are subscribed to a topic in the > Google Groups "v8-users" group. > To unsubscribe from this topic, visit https://groups.google.com/d/ > topic/v8-users/aVeevQcHJ2c/unsubscribe. > To unsubscribe from this group and all its topics, send an email to > v8-users+unsubscr...@googlegroups.com. > For more options, visit https://groups.google.com/d/optout. > -- *Jean-Marc Le Roux* Founder and CEO of Aerys (http://aerys.in) Blog: http://blogs.aerys.in/jeanmarc-leroux Cell: (+33)6 20 56 45 78 Phone: (+33)9 72 40 17 58 -- -- v8-users mailing list v8-users@googlegroups.com http://groups.google.com/group/v8-users --- You received this message because you are subscribed to the Google Groups "v8-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to v8-users+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.