On Sat, Jan 19, 2013 at 2:13 AM, m <mike....@gmail.com> wrote:

> The furthest I followed it was looking down into the implementation of
> CopyFrom() which calls MergeFrom().  Inside of MergeFrom() there's a spot
> where it calls something like "dynamic_cast_if_available" which returns
> NULL (failing to dynamic_cast).

Returning NULL shouldn't cause a segment fault. The generated code should
be able to handle this NULL case properly.


>
>
> On Thursday, January 17, 2013 10:20:13 PM UTC-8, Feng Xiao wrote:
>>
>> Glad that you found what works for you. What baffles me is why CopyFrom()
>> segfaults when given a DynamicMessage.  DynamicMessage can't be cast to
>> Foo, but foo.CopyFrom() gets to be working with it. Did you find why it
>> segfaults?
>>
>> On Friday, January 18, 2013 3:31:48 AM UTC+8, m wrote:
>>>
>>> Thanks for your reply.
>>>
>>> My application links against all the stub proto sources of the types I
>>> will be creating.  What I've found works is if I use the default(?)
>>> descriptor pool (google::protobuf::**DescriptorPool::generated_**pool())
>>> and the default message factory (google::protobuf::**
>>> MessageFactory::generated_**factory()).  Given the type name and the
>>> content, I have a simple function that more or less does this:
>>>
>>> const gpb::Descriptor* descriptor = gpb::DescriptorPool::**
>>> generated_pool()->**FindMessageTypeByName( "my.package.Foo" );
>>>
>>>
>>>
>>> gpb::MessageFactory* factory = gpb::MessageFactory::**
>>> generated_factory();
>>>
>>>
>>>
>>>
>>> const gpb::Message* prototype = factory->GetPrototype( descriptor );
>>>
>>>
>>>
>>>
>>> gpb::Message* message = prototype->New();
>>>
>>>
>>>
>>> gpb::Message* m = gpb::TextFormat::**ParseFromString( "blah: \"some
>>> string\" bleh: 3", message );
>>>
>>>
>>>
>>>
>>>
>>> On Wednesday, January 16, 2013 4:15:53 PM UTC-8, m wrote:
>>>>
>>>> Hi All,
>>>>
>>>> I'm seeing an incompatibility between a dynamically generated
>>>> google::protobuf::Message (DynamicMessage?) created with a
>>>> google::protobuf::**DynamicMessageFactory and a normal
>>>> google::protobuf::Message.
>>>>
>>>> What I'm running up against ultimately comes down to this: I can't
>>>> dynamic_cast a DynamicMessage to a known derived type of
>>>> google::protobuf::Message.  For example, let's say my proto file has the
>>>> following message:
>>>>
>>>> package my.package;
>>>>
>>>> messsage Foo
>>>> {
>>>>   string blah = 1;
>>>>   uint32 bleh = 2;
>>>> }
>>>>
>>>>
>>>> and I successfully create a my::package::Foo with some code along the
>>>> lines of:
>>>>
>>>> const google::protobuf::Descriptor* descriptor = 
>>>> myImporter.pool()->**FindMessageTypeByName(
>>>> "my.package.Foo" );
>>>>
>>>> google::protobuf::Message* message = 
>>>> myDynamicMessageFactory.**GetPrototype(
>>>> descriptor )->New();
>>>>
>>>>
>>>> after populating message successfully with other commands not shown
>>>> here, I try to do something like:
>>>>
>>>> my::package::Foo foo;
>>>> foo.CopyFrom( *message );
>>>>
>>>>
>>>> and I get a segfault in CopyFrom() because ultimately the following
>>>> doesn't work (the pointer pFoo ends up being NULL down inside
>>>> CopyFrom()/MergeFrom()):
>>>>
>>>> my::package::Foo* pFoo = dynamic_cast< my::package::Foo* >( message );
>>>>
>>>>
>>>> It appears as though the derived type of message is not actually
>>>> my::package::Foo, but instead google::protobuf::**DynamicMessage (or
>>>> something like that), so naturally the dynamic_cast fails.  I was sure to
>>>> observe the output of message->DebugString() and message->GetTypeName()
>>>> which returned all the appropriate information.
>>>>
>>>> Is there any way to get a real my::package::Foo object from a dynamic
>>>> one?
>>>>
>>>>
>>>>  --
> You received this message because you are subscribed to the Google Groups
> "Protocol Buffers" group.
> To view this discussion on the web visit
> https://groups.google.com/d/msg/protobuf/-/iGRNOvXkgtEJ.
>
> To post to this group, send email to protobuf@googlegroups.com.
> To unsubscribe from this group, send email to
> protobuf+unsubscr...@googlegroups.com.
> For more options, visit this group at
> http://groups.google.com/group/protobuf?hl=en.
>

-- 
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 
protobuf+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/protobuf?hl=en.

Reply via email to