[haiku-commits] r42388 - haiku/trunk/src/apps/debugger/value/value_nodes

  • From: anevilyak@xxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Thu, 7 Jul 2011 23:51:50 +0200 (CEST)

Author: anevilyak
Date: 2011-07-07 23:51:50 +0200 (Thu, 07 Jul 2011)
New Revision: 42388
Changeset: https://dev.haiku-os.org/changeset/42388

Modified:
   haiku/trunk/src/apps/debugger/value/value_nodes/BMessageValueNode.cpp
   haiku/trunk/src/apps/debugger/value/value_nodes/BMessageValueNode.h
Log:
Detect if the message node is contained in a BMessage field child. If so,
handle the message in flat format. This gets messages embedded inside other
messages working.



Modified: haiku/trunk/src/apps/debugger/value/value_nodes/BMessageValueNode.cpp
===================================================================
--- haiku/trunk/src/apps/debugger/value/value_nodes/BMessageValueNode.cpp       
2011-07-07 10:17:15 UTC (rev 42387)
+++ haiku/trunk/src/apps/debugger/value/value_nodes/BMessageValueNode.cpp       
2011-07-07 21:51:50 UTC (rev 42388)
@@ -66,9 +66,22 @@
                ValueLocation* parentLocation = fParent->Location();
                ValueLocation* location;
                CompoundType* type = 
dynamic_cast<CompoundType*>(fParent->GetType());
+               status_t error = B_OK;
+               if (fParent->fIsFlatMessage) {
+                       location = new ValueLocation();
+                       if (location == NULL)
+                               return B_NO_MEMORY;
 
-               status_t error = type->ResolveDataMemberLocation(fMember,
-                       *parentLocation, location);
+                       ValuePieceLocation piece;
+                       piece.SetToMemory(parentLocation->PieceAt(0).address
+                               + sizeof(uint32));
+                       piece.SetSize(sizeof(uint32));
+                       location->AddPiece(piece);
+               } else {
+                       error = type->ResolveDataMemberLocation(fMember,
+                               *parentLocation, location);
+               }
+
                if (error != B_OK)
                        return error;
 
@@ -95,7 +108,8 @@
        fLoader(NULL),
        fHeader(NULL),
        fFields(NULL),
-       fData(NULL)
+       fData(NULL),
+       fIsFlatMessage(false)
 {
        fType->AcquireReference();
 }
@@ -125,6 +139,9 @@
 BMessageValueNode::ResolvedLocationAndValue(ValueLoader* valueLoader,
        ValueLocation*& _location, Value*& _value)
 {
+       fIsFlatMessage = dynamic_cast<BMessageFieldNodeChild*>(NodeChild())
+               != NULL;
+
        // get the location
        ValueLocation* location = NodeChild()->Location();
        if (location == NULL)
@@ -155,77 +172,83 @@
 
        CompoundType* baseType = dynamic_cast<CompoundType*>(fType);
 
-       for (int32 i = 0; i < baseType->CountDataMembers(); i++) {
-               DataMember* member = baseType->DataMemberAt(i);
-               if (strcmp(member->Name(), "fHeader") == 0) {
-                       error = baseType->ResolveDataMemberLocation(member,
-                               *location, memberLocation);
-                       if (error != B_OK) {
-                               
TRACE_LOCALS("BMessageValueNode::ResolvedLocationAndValue(): "
-                                       "failed to resolve location of header 
member: %s\n",
-                                       strerror(error));
-                               delete memberLocation;
-                               return error;
-                       }
+       if (fIsFlatMessage) {
+               headerAddress.SetTo(location->PieceAt(0).address);
+               fieldAddress.SetTo(headerAddress.ToUInt64()
+                       + sizeof(BMessage::message_header));
+       } else {
+               for (int32 i = 0; i < baseType->CountDataMembers(); i++) {
+                       DataMember* member = baseType->DataMemberAt(i);
+                       if (strcmp(member->Name(), "fHeader") == 0) {
+                               error = 
baseType->ResolveDataMemberLocation(member,
+                                       *location, memberLocation);
+                               if (error != B_OK) {
+                                       TRACE_LOCALS(
+                                               
"BMessageValueNode::ResolvedLocationAndValue(): "
+                                               "failed to resolve location of 
header member: %s\n",
+                                               strerror(error));
+                                       delete memberLocation;
+                                       return error;
+                               }
 
-                       error = valueLoader->LoadValue(memberLocation, 
valueType,
-                               false, headerAddress);
-                       delete memberLocation;
-                       if (error != B_OK)
-                               return error;
-               } else if (strcmp(member->Name(), "what") == 0) {
-                       error = baseType->ResolveDataMemberLocation(member,
-                               *location, memberLocation);
-                       if (error != B_OK) {
-                               
TRACE_LOCALS("BMessageValueNode::ResolvedLocationAndValue(): "
-                                       "failed to resolve location of header 
member: %s\n",
-                                               strerror(error));
+                               error = valueLoader->LoadValue(memberLocation, 
valueType,
+                                       false, headerAddress);
                                delete memberLocation;
-                               return error;
-                       }
-                       error = valueLoader->LoadValue(memberLocation, 
valueType,
-                               false, what);
-                       delete memberLocation;
-                       if (error != B_OK)
-                               return error;
-               } else if (strcmp(member->Name(), "fFields") == 0) {
-                       error = baseType->ResolveDataMemberLocation(member,
-                               *location, memberLocation);
-                       if (error != B_OK) {
-                               
TRACE_LOCALS("BMessageValueNode::ResolvedLocationAndValue(): "
-                                       "failed to resolve location of field 
member: %s\n",
-                                               strerror(error));
+                               if (error != B_OK)
+                                       return error;
+                       } else if (strcmp(member->Name(), "what") == 0) {
+                               error = 
baseType->ResolveDataMemberLocation(member,
+                                       *location, memberLocation);
+                               if (error != B_OK) {
+                                       TRACE_LOCALS(
+                                               
"BMessageValueNode::ResolvedLocationAndValue(): "
+                                               "failed to resolve location of 
header member: %s\n",
+                                                       strerror(error));
+                                       delete memberLocation;
+                                       return error;
+                               }
+                               error = valueLoader->LoadValue(memberLocation, 
valueType,
+                                       false, what);
                                delete memberLocation;
-                               return error;
-                       }
-                       error = valueLoader->LoadValue(memberLocation, 
valueType,
-                               false, fieldAddress);
-                       delete memberLocation;
-                       if (error != B_OK)
-                               return error;
-               } else if (strcmp(member->Name(), "fData") == 0) {
-                       error = baseType->ResolveDataMemberLocation(member,
-                               *location, memberLocation);
-                       if (error != B_OK) {
-                               
TRACE_LOCALS("BMessageValueNode::ResolvedLocationAndValue(): "
-                                       "failed to resolve location of data 
member: %s\n",
-                                               strerror(error));
+                               if (error != B_OK)
+                                       return error;
+                       } else if (strcmp(member->Name(), "fFields") == 0) {
+                               error = 
baseType->ResolveDataMemberLocation(member,
+                                       *location, memberLocation);
+                               if (error != B_OK) {
+                                       TRACE_LOCALS(
+                                               
"BMessageValueNode::ResolvedLocationAndValue(): "
+                                               "failed to resolve location of 
field member: %s\n",
+                                                       strerror(error));
+                                       delete memberLocation;
+                                       return error;
+                               }
+                               error = valueLoader->LoadValue(memberLocation, 
valueType,
+                                       false, fieldAddress);
                                delete memberLocation;
-                               return error;
+                               if (error != B_OK)
+                                       return error;
+                       } else if (strcmp(member->Name(), "fData") == 0) {
+                               error = 
baseType->ResolveDataMemberLocation(member,
+                                       *location, memberLocation);
+                               if (error != B_OK) {
+                                       TRACE_LOCALS(
+                                               
"BMessageValueNode::ResolvedLocationAndValue(): "
+                                               "failed to resolve location of 
data member: %s\n",
+                                                       strerror(error));
+                                       delete memberLocation;
+                                       return error;
+                               }
+                               error = valueLoader->LoadValue(memberLocation, 
valueType,
+                                       false, fDataLocation);
+                               delete memberLocation;
+                               if (error != B_OK)
+                                       return error;
                        }
-                       error = valueLoader->LoadValue(memberLocation, 
valueType,
-                               false, fDataLocation);
-                       delete memberLocation;
-                       if (error != B_OK)
-                               return error;
+                       memberLocation = NULL;
                }
-               memberLocation = NULL;
        }
 
-       TRACE_LOCALS("BMessage: what: 0x%" B_PRIx32 ", result: %ld\n",
-               what.ToUInt32(), error);
-
-
        fHeader = new(std::nothrow) BMessage::message_header();
        if (fHeader == NULL)
                return B_NO_MEMORY;
@@ -235,10 +258,20 @@
                headerAddress.ToUInt64(), error);
        if (error != B_OK)
                return error;
-       fHeader->what = what.ToUInt32();
 
+       if (fIsFlatMessage)
+               what.SetTo(fHeader->what);
+       else
+               fHeader->what = what.ToUInt32();
+
+       TRACE_LOCALS("BMessage: what: 0x%" B_PRIx32 ", result: %ld\n",
+               what.ToUInt32(), error);
+
        size_t fieldsSize = fHeader->field_count * sizeof(
                BMessage::field_header);
+       if (fIsFlatMessage)
+               fDataLocation.SetTo(fieldAddress.ToUInt64() + fieldsSize);
+
        size_t totalSize = sizeof(BMessage::message_header) + fieldsSize + 
fHeader->data_size;
        uint8* messageBuffer = new(std::nothrow) uint8[totalSize];
        if (messageBuffer == NULL)
@@ -296,32 +329,22 @@
                return B_OK;
 
        DataMember* member = NULL;
-       Type* whatType = NULL;
-
        CompoundType* messageType = dynamic_cast<CompoundType*>(fType);
-       if (messageType == NULL || messageType->CountDataMembers() == 0) {
-               if (fContainer != NULL)
-                       fContainer->NotifyValueNodeChildrenCreated(this);
-
-               return B_OK;
-       }
-
        for (int32 i = 0; i < messageType->CountDataMembers(); i++) {
                member = messageType->DataMemberAt(i);
                if (strcmp(member->Name(), "what") == 0) {
-                       whatType = member->GetType();
+                       ValueNodeChild* whatNode
+                               = new(std::nothrow) BMessageWhatNodeChild(this, 
member,
+                                       member->GetType());
+                       if (whatNode == NULL)
+                               return B_NO_MEMORY;
+
+                       whatNode->SetContainer(fContainer);
+                       fChildren.AddItem(whatNode);
                        break;
                }
        }
 
-       ValueNodeChild* whatNode
-               = new(std::nothrow) BMessageWhatNodeChild(this, member, 
whatType);
-       if (whatNode == NULL)
-               return B_NO_MEMORY;
-
-       whatNode->SetContainer(fContainer);
-       fChildren.AddItem(whatNode);
-
        char* name;
        type_code type;
        int32 count;

Modified: haiku/trunk/src/apps/debugger/value/value_nodes/BMessageValueNode.h
===================================================================
--- haiku/trunk/src/apps/debugger/value/value_nodes/BMessageValueNode.h 
2011-07-07 10:17:15 UTC (rev 42387)
+++ haiku/trunk/src/apps/debugger/value/value_nodes/BMessageValueNode.h 
2011-07-07 21:51:50 UTC (rev 42388)
@@ -36,6 +36,7 @@
        virtual ValueNodeChild*                 ChildAt(int32 index) const;
 
 private:
+
                        status_t                                
_GetTypeForTypeCode(type_code type,
                                                                                
Type*& _type);
                        status_t                                
_FindField(const char* name,
@@ -53,6 +54,7 @@
                        // for GCC2
                        friend class BMessageFieldNode;
                        friend class BMessageFieldNodeChild;
+                       friend class BMessageWhatNodeChild;
 
                        typedef BObjectList<ValueNodeChild> ChildNodeList;
 
@@ -66,6 +68,7 @@
                        BMessage::field_header* fFields;
                        uint8*                                  fData;
                        BMessage                                fMessage;
+                       bool                                    fIsFlatMessage;
 };
 
 


Other related posts:

  • » [haiku-commits] r42388 - haiku/trunk/src/apps/debugger/value/value_nodes - anevilyak