diff --git a/src/apps/bin/strace/TypeHandler.cpp b/src/apps/bin/strace/TypeHandler.cpp index 396f1e7221..6720c7899d 100644 --- a/src/apps/bin/strace/TypeHandler.cpp +++ b/src/apps/bin/strace/TypeHandler.cpp @@ -6,6 +6,81 @@ #include "MemoryReader.h" #include "TypeHandler.h" + +// TypeHandlerImpl +template +class TypeHandlerImpl : public TypeHandler { +public: + virtual string GetParameterValue(const void *address, bool getContents, + MemoryReader &reader); + + virtual string GetReturnValue(uint64 value, bool getContents, + MemoryReader &reader); +}; + + +// #pragma mark - + +// get_number_value +template +static inline +string +get_number_value(const void *address, const char *format) +{ + if (sizeof(align_t) > sizeof(value_t)) + return get_number_value(value_t(*(align_t*)address), format); + else + return get_number_value(*(value_t*)address, format); +} + +// get_number_value +template +static inline +string +get_number_value(value_t value, const char *format) +{ + char buffer[32]; + sprintf(buffer, format, value); + return buffer; +} + +// get_pointer_value +static inline +string +get_pointer_value(const void *address) +{ + char buffer[32]; + sprintf(buffer, "%p", *(void **)address); + return buffer; +} + +// get_pointer_value +static inline +string +get_pointer_value(uint64 value) +{ + char buffer[32]; + sprintf(buffer, "%p", (void*)value); + return buffer; +} + +// create_pointer_type_handler +TypeHandler * +create_pointer_type_handler() +{ + return new TypeHandlerImpl(); +} + +// create_string_type_handler +TypeHandler * +create_string_type_handler() +{ + return new TypeHandlerImpl(); +} + + +// #pragma mark - + // complete specializations // void @@ -25,6 +100,13 @@ TypeHandlerImpl::GetReturnValue(uint64 value, bool getContents, return ""; } +template<> +TypeHandler * +TypeHandlerFactory::Create() +{ + return new TypeHandlerImpl(); +} + // bool template<> string @@ -42,6 +124,13 @@ TypeHandlerImpl::GetReturnValue(uint64 value, bool getContents, return (value ? "true" : "false"); } +template<> +TypeHandler * +TypeHandlerFactory::Create() +{ + return new TypeHandlerImpl(); +} + // char template<> string @@ -59,6 +148,13 @@ TypeHandlerImpl::GetReturnValue(uint64 value, bool getContents, return get_number_value(value, "0x%x"); } +template<> +TypeHandler * +TypeHandlerFactory::Create() +{ + return new TypeHandlerImpl(); +} + // short template<> string @@ -76,6 +172,14 @@ TypeHandlerImpl::GetReturnValue(uint64 value, bool getContents, return get_number_value(value, "0x%x"); } +template<> +TypeHandler * +TypeHandlerFactory::Create() +{ + return new TypeHandlerImpl(); +} + + // unsigned short template<> string @@ -93,6 +197,13 @@ TypeHandlerImpl::GetReturnValue(uint64 value, bool getContents, return get_number_value(value, "0x%x"); } +template<> +TypeHandler * +TypeHandlerFactory::Create() +{ + return new TypeHandlerImpl(); +} + // int template<> string @@ -110,6 +221,13 @@ TypeHandlerImpl::GetReturnValue(uint64 value, bool getContents, return get_number_value(value, "0x%x"); } +template<> +TypeHandler * +TypeHandlerFactory::Create() +{ + return new TypeHandlerImpl(); +} + // unsigned int template<> string @@ -127,6 +245,13 @@ TypeHandlerImpl::GetReturnValue(uint64 value, bool getContents, return get_number_value(value, "0x%x"); } +template<> +TypeHandler * +TypeHandlerFactory::Create() +{ + return new TypeHandlerImpl(); +} + // long template<> string @@ -144,6 +269,13 @@ TypeHandlerImpl::GetReturnValue(uint64 value, bool getContents, return get_number_value(value, "0x%lx"); } +template<> +TypeHandler * +TypeHandlerFactory::Create() +{ + return new TypeHandlerImpl(); +} + // unsigned long template<> string @@ -161,6 +293,13 @@ TypeHandlerImpl::GetReturnValue(uint64 value, bool getContents, return get_number_value(value, "0x%lx"); } +template<> +TypeHandler * +TypeHandlerFactory::Create() +{ + return new TypeHandlerImpl(); +} + // long long template<> string @@ -178,6 +317,13 @@ TypeHandlerImpl::GetReturnValue(uint64 value, bool getContents, return get_number_value(value, "0x%llx"); } +template<> +TypeHandler * +TypeHandlerFactory::Create() +{ + return new TypeHandlerImpl(); +} + // unsigned long template<> string @@ -195,6 +341,13 @@ TypeHandlerImpl::GetReturnValue(uint64 value, return get_number_value(value, "0x%llx"); } +template<> +TypeHandler * +TypeHandlerFactory::Create() +{ + return new TypeHandlerImpl(); +} + // read_string static string @@ -224,6 +377,22 @@ read_string(MemoryReader &reader, void *data) return get_pointer_value(&data) + " (" + strerror(error) + ")"; } +// const void* +template<> +string +TypeHandlerImpl::GetParameterValue(const void *address, + bool getContents, MemoryReader &reader) +{ + return get_pointer_value(address); +} + +template<> +string +TypeHandlerImpl::GetReturnValue(uint64 value, bool getContents, + MemoryReader &reader) +{ + return get_pointer_value(value); +} // const char* template<> @@ -249,3 +418,4 @@ TypeHandlerImpl::GetReturnValue(uint64 value, return get_pointer_value(&data); } + diff --git a/src/apps/bin/strace/TypeHandler.h b/src/apps/bin/strace/TypeHandler.h index 5d98fefecc..fb0825e1bb 100644 --- a/src/apps/bin/strace/TypeHandler.h +++ b/src/apps/bin/strace/TypeHandler.h @@ -27,98 +27,34 @@ public: MemoryReader &reader) = 0; }; -// TypeHandlerImpl +// templatized TypeHandler factory class +// (I tried a simple function first, but then the compiler complains for +// the partial instantiation. Not sure, if I'm missing something or this is +// a compiler bug). template -class TypeHandlerImpl : public TypeHandler { -public: - virtual string GetParameterValue(const void *address, bool getContents, - MemoryReader &reader); - - virtual string GetReturnValue(uint64 value, bool getContents, - MemoryReader &reader); +struct TypeHandlerFactory { + static TypeHandler *Create(); }; +extern TypeHandler *create_pointer_type_handler(); +extern TypeHandler *create_string_type_handler(); -// TypeHandlerImpl -template -class TypeHandlerImpl : public TypeHandler { -public: - virtual string GetParameterValue(const void *address, bool getContents, - MemoryReader &reader); - - virtual string GetReturnValue(uint64 value, bool getContents, - MemoryReader &reader); +// specialization for "const char*" +template<> +struct TypeHandlerFactory { + static inline TypeHandler *Create() + { + return create_string_type_handler(); + } }; -//// TypeHandlerImpl -//template<> -//class TypeHandlerImpl : public TypeHandler { -//public: -// virtual string GetParameterValue(const void *address, bool getContents, -// MemoryReader &reader); -// -// virtual string GetReturnValue(uint64 value, bool getContents, -// MemoryReader &reader); -//}; - -// get_number_value -template -static inline -string -get_number_value(const void *address, const char *format) -{ - if (sizeof(align_t) > sizeof(value_t)) - return get_number_value(value_t(*(align_t*)address), format); - else - return get_number_value(*(value_t*)address, format); -} - -// get_number_value -template -static inline -string -get_number_value(value_t value, const char *format) -{ - char buffer[32]; - sprintf(buffer, format, value); - return buffer; -} - -// get_pointer_value -static inline -string -get_pointer_value(const void *address) -{ - char buffer[32]; - sprintf(buffer, "%p", *(void **)address); - return buffer; -} - -// get_pointer_value -static inline -string -get_pointer_value(uint64 value) -{ - char buffer[32]; - sprintf(buffer, "%p", (void*)value); - return buffer; -} - -// generic pointer +// partial specialization for generic pointers template -string -TypeHandlerImpl::GetParameterValue(const void *address, bool getContents, - MemoryReader &reader) -{ - return get_pointer_value(address); -} - -template -string -TypeHandlerImpl::GetReturnValue(uint64 value, bool getContents, - MemoryReader &reader) -{ - return get_pointer_value(value); -} +struct TypeHandlerFactory { + static inline TypeHandler *Create() + { + return create_pointer_type_handler(); + } +}; #endif // STRACE_TYPE_HANDLER_H