On Dec 2, 10:49 pm, Kenton Varda <[EMAIL PROTECTED]> wrote: > C++ compatibility matters because eventually we want to be able to generate > Python code which just wraps C++ code for efficiency. C++ isn't garbage > collected, so append() can't easily be implemented in this case without > having ownership problems. Slice assignment has the same problem. > Also note that even pure-python protocol buffers have a sort of "ownership" > issue: Sub-messages all contain pointers back to their parents, so that > when a sub-message is modified, the parent's cached size can be marked > dirty. (Also, singular sub-messages have to inform their parents when the > first field within them is set, but that doesn't apply here.)
While you're on this topic, I ran into this ownership issue while implementing the Perl/XS wrapper around the generated C++ code. I think it is the same issue that would face the author of a Python or Ruby C++ extension of the generated C++. I ended up having to new() a copy of every message that I transferred from C++ to Perl or vice versa. So, for example, a statement like $team->member($i)->set_first_name('Dave'); won't have the same effect as (C++) team.mutable_member(i)->set_first_name("Dave"); because $team->member($i) will generate a copy of the underlying C++ object, so that it can be managed by Perl's reference counting without any concern as to whether or not the underlying C++ object has been deleted because the containing message went out of scope. Anyway, I thought it might be possible to allow for shared ownership of a message object if there were a reference counted variant of RepeatedPtrField<T> (something like RepeatedSharedPtrField<T> or whatever), which would provide incref() and decref() methods such that Perl and C++ could use the same underlying C++ objects in the generated code. This would really help the performance of the Perl/XS code if all of that copy construction could be avoided somehow. The C++ code generator would need an option that would instruct it to generate RepeatedSharedPtrField<T> members (and incref and decref calls, where appropriate) for repeated messages (instead of using the default RepeatedPtrField<T>). What do you think? Is something like this possible, even though it would require a change to protobuf? It is an issue for all {Python, Perl, Ruby, ...}/C++ extension wrappers for Protocol Buffers. -dave --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Protocol Buffers" group. To post to this group, send email to protobuf@googlegroups.com To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/protobuf?hl=en -~----------~----~----~----~------~----~------~--~---