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 [email protected]
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
-~----------~----~----~----~------~----~------~--~---