diff --git a/src/bin/debug/strace/TypeHandler.cpp b/src/bin/debug/strace/TypeHandler.cpp index 03d53ced34..525137fc20 100644 --- a/src/bin/debug/strace/TypeHandler.cpp +++ b/src/bin/debug/strace/TypeHandler.cpp @@ -17,6 +17,7 @@ #include "MemoryReader.h" #include "Syscall.h" + template static inline value_t get_value(const void *address) @@ -27,25 +28,28 @@ get_value(const void *address) return *(value_t*)address; } + // #pragma mark - -// create_pointer_type_handler + +// const void * TypeHandler * create_pointer_type_handler() { return new TypeHandlerImpl(); } -// create_string_type_handler + +// const char * TypeHandler * create_string_type_handler() { return new TypeHandlerImpl(); } -// #pragma mark - -// complete specializations +// #pragma mark - complete specializations + // void template<> @@ -55,6 +59,7 @@ TypeHandlerImpl::GetParameterValue(Context &, Parameter *, const void *) return "void"; } + template<> string TypeHandlerImpl::GetReturnValue(Context &, uint64 value) @@ -62,6 +67,7 @@ TypeHandlerImpl::GetReturnValue(Context &, uint64 value) return ""; } + template<> TypeHandler * TypeHandlerFactory::Create() @@ -69,6 +75,7 @@ TypeHandlerFactory::Create() return new TypeHandlerImpl(); } + // bool template<> string @@ -92,14 +99,16 @@ TypeHandlerFactory::Create() return new TypeHandlerImpl(); } + // status_t +template class StatusTypeHandler : public TypeHandler { public: StatusTypeHandler() {} string GetParameterValue(Context &context, Parameter *, const void *address) { - return RenderValue(context, get_value(address)); + return RenderValue(context, get_value(address)); } string GetReturnValue(Context &context, uint64 value) @@ -111,7 +120,7 @@ private: string RenderValue(Context &context, uint64 value) const { string rendered = context.FormatUnsigned(value); - if (value <= UINT32_MAX && (status_t)value <= 0) { + if (value <= UINT32_MAX && (T)value <= 0) { rendered += " "; rendered += strerror(value); } @@ -122,7 +131,13 @@ private: TypeHandler * create_status_t_type_handler() { - return new StatusTypeHandler; + return new StatusTypeHandler; +} + +TypeHandler * +create_ssize_t_type_handler() +{ + return new StatusTypeHandler; } @@ -179,8 +194,10 @@ TypeHandlerImpl::GetReturnValue(Context &context, uint64 value) return read_string(context, (void *)value); } + // #pragma mark - enums, flags, enum_flags + EnumTypeHandler::EnumTypeHandler(const EnumMap &m) : fMap(m) {} string diff --git a/src/bin/debug/strace/TypeHandler.h b/src/bin/debug/strace/TypeHandler.h index bcf6016d44..5e77f4de4a 100644 --- a/src/bin/debug/strace/TypeHandler.h +++ b/src/bin/debug/strace/TypeHandler.h @@ -108,6 +108,7 @@ struct TypeHandlerFactory { extern TypeHandler *create_pointer_type_handler(); extern TypeHandler *create_string_type_handler(); extern TypeHandler *create_status_t_type_handler(); +extern TypeHandler *create_ssize_t_type_handler(); // specialization for "const char*" template<> diff --git a/src/bin/debug/strace/strace.cpp b/src/bin/debug/strace/strace.cpp index cf4fed58de..cd2fc26150 100644 --- a/src/bin/debug/strace/strace.cpp +++ b/src/bin/debug/strace/strace.cpp @@ -243,10 +243,10 @@ patch_syscalls() // patch return type handlers const string returnTypeName = syscall->ReturnType()->TypeName(); - if (returnTypeName == "status_t" || returnTypeName == "ssize_t" - || returnTypeName == "int") { + if (returnTypeName == "status_t" || returnTypeName == "int") syscall->ReturnType()->SetHandler(create_status_t_type_handler()); - } + else if (returnTypeName == "ssize_t") + syscall->ReturnType()->SetHandler(create_ssize_t_type_handler()); } patch_area();