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

Reply via email to