Re: [protobuf] Re: Dynamic Message and google::protobuf::Message incompatibility

2013-01-20 Thread Feng Xiao
On Sat, Jan 19, 2013 at 2:13 AM, m  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.



[protobuf] Re: Dynamic Message and google::protobuf::Message incompatibility

2013-01-18 Thread m
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).


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.



[protobuf] Re: Dynamic Message and google::protobuf::Message incompatibility

2013-01-17 Thread Feng Xiao
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/-/sC2xjV3x8F0J.
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.



[protobuf] Re: Dynamic Message and google::protobuf::Message incompatibility

2013-01-17 Thread m
Sorry, there's a typo on that last line.  It should be:

gpb::TextFormat::ParseFromString( "blah: \"some string\" bleh: 3", message 
);




On Thursday, January 17, 2013 11: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/-/IBJoFdPF1xoJ.
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.



[protobuf] Re: Dynamic Message and google::protobuf::Message incompatibility

2013-01-17 Thread m
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/-/-Q3WjR4djmsJ.
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.



[protobuf] Re: Dynamic Message and google::protobuf::Message incompatibility

2013-01-16 Thread Feng Xiao


On Thursday, January 17, 2013 8:15:53 AM 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()):
>
CopyFrom() should be able to copy a DynamicMessage to a generated message 
if they share the same descriptor.
Can you post the whole generated method where the segfault happens?
 

>
> 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/-/bhtIMTO3PhUJ.
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.