From eb756d42646616e06724acfb9816b26546117e4c Mon Sep 17 00:00:00 2001 From: Rene Gollent Date: Thu, 9 Dec 2010 04:28:10 +0000 Subject: [PATCH] Modify the CString type/value handlers to accept character arrays as well as character pointers. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@39785 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../type_handlers/CStringTypeHandler.cpp | 49 +++++++++++-------- .../value/value_nodes/CStringValueNode.cpp | 11 +++-- .../value/value_nodes/CStringValueNode.h | 4 +- 3 files changed, 39 insertions(+), 25 deletions(-) diff --git a/src/apps/debugger/value/type_handlers/CStringTypeHandler.cpp b/src/apps/debugger/value/type_handlers/CStringTypeHandler.cpp index 1e957a6e0c..8236ade75e 100644 --- a/src/apps/debugger/value/type_handlers/CStringTypeHandler.cpp +++ b/src/apps/debugger/value/type_handlers/CStringTypeHandler.cpp @@ -23,28 +23,39 @@ float CStringTypeHandler::SupportsType(Type* type) { AddressType* addressType = dynamic_cast(type); + ArrayType* arrayType = dynamic_cast(type); + PrimitiveType* baseType = NULL; + ModifiedType* modifiedType = NULL; if (addressType != NULL && addressType->AddressKind() - == DERIVED_TYPE_POINTER) { - PrimitiveType* baseType = dynamic_cast( - addressType->BaseType()); - - if (baseType == NULL) { - ModifiedType* modifiedType = dynamic_cast( - addressType->BaseType()); - if (modifiedType == NULL) - return 0.0f; - + == DERIVED_TYPE_POINTER) { baseType = dynamic_cast( - modifiedType->ResolveRawType(false)); - if (baseType == NULL) - return 0.0f; + addressType->BaseType()); + if (baseType == NULL) { + modifiedType = dynamic_cast( + addressType->BaseType()); + } + } else if (arrayType != NULL) { + baseType = dynamic_cast( + arrayType->BaseType()); + if (baseType == NULL) { + modifiedType = dynamic_cast( + arrayType->BaseType()); } - - if (baseType->TypeConstant() == B_UINT8_TYPE - || baseType->TypeConstant() == B_INT8_TYPE) - return 0.8f; } + if (baseType == NULL && modifiedType == NULL) + return 0.0f; + else if (modifiedType != NULL) { + baseType = dynamic_cast( + modifiedType->ResolveRawType(false)); + if (baseType == NULL) + return 0.0f; + } + + if (baseType->TypeConstant() == B_UINT8_TYPE + || baseType->TypeConstant() == B_INT8_TYPE) + return 0.8f; + return 0.0f; } @@ -56,10 +67,8 @@ CStringTypeHandler::CreateValueNode(ValueNodeChild* nodeChild, Type* type, if (SupportsType(type) == 0.0f) return B_BAD_VALUE; - AddressType* supportedType = dynamic_cast(type); - ValueNode* node = new(std::nothrow) CStringValueNode(nodeChild, - supportedType); + type); if (node == NULL) return B_NO_MEMORY; diff --git a/src/apps/debugger/value/value_nodes/CStringValueNode.cpp b/src/apps/debugger/value/value_nodes/CStringValueNode.cpp index 48746d5ba1..5c779bafc7 100644 --- a/src/apps/debugger/value/value_nodes/CStringValueNode.cpp +++ b/src/apps/debugger/value/value_nodes/CStringValueNode.cpp @@ -21,7 +21,7 @@ CStringValueNode::CStringValueNode(ValueNodeChild* nodeChild, - AddressType* type) + Type* type) : ChildlessValueNode(nodeChild), fType(type) @@ -68,8 +68,13 @@ CStringValueNode::ResolvedLocationAndValue(ValueLoader* valueLoader, BVariant addressData; BString valueData; - status_t error = valueLoader->LoadValue(location, valueType, false, - addressData); + status_t error = B_OK; + if (dynamic_cast(fType) != NULL) { + error = valueLoader->LoadValue(location, valueType, false, + addressData); + } else + addressData.SetTo(location->PieceAt(0).address); + if (error != B_OK) return error; diff --git a/src/apps/debugger/value/value_nodes/CStringValueNode.h b/src/apps/debugger/value/value_nodes/CStringValueNode.h index 93203ed62f..e996685ecd 100644 --- a/src/apps/debugger/value/value_nodes/CStringValueNode.h +++ b/src/apps/debugger/value/value_nodes/CStringValueNode.h @@ -15,7 +15,7 @@ class AddressType; class CStringValueNode : public ChildlessValueNode { public: CStringValueNode(ValueNodeChild* nodeChild, - AddressType* type); + Type* type); virtual ~CStringValueNode(); virtual Type* GetType() const; @@ -26,7 +26,7 @@ public: Value*& _value); private: - AddressType* fType; + Type* fType; }; #endif // CSTRING_VALUE_NODE_H