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.