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
[email protected]
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 [email protected].
For more options, visit https://groups.google.com/d/optout.