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.

Reply via email to