[PATCH 2/2] Fixed the print_basic command when dealing with long long values

Eric Pouech eric.pouech at orange.fr
Fri May 23 13:05:01 CDT 2008


#13342

A+
---

 programs/winedbg/debugger.h |    2 +-
 programs/winedbg/memory.c   |   12 +++++++++---
 programs/winedbg/types.c    |    8 +++++---
 3 files changed, 15 insertions(+), 7 deletions(-)


diff --git a/programs/winedbg/debugger.h b/programs/winedbg/debugger.h
index d11e291..3fb650d 100644
--- a/programs/winedbg/debugger.h
+++ b/programs/winedbg/debugger.h
@@ -417,7 +417,7 @@ extern void             print_value(const struct dbg_lvalue* addr, char format,
 extern int              types_print_type(const struct dbg_type*, BOOL details);
 extern int              print_types(void);
 extern long int         types_extract_as_integer(const struct dbg_lvalue*);
-extern LONGLONG         types_extract_as_longlong(const struct dbg_lvalue*);
+extern LONGLONG         types_extract_as_longlong(const struct dbg_lvalue*, unsigned* psize);
 extern void             types_extract_as_address(const struct dbg_lvalue*, ADDRESS64*);
 extern BOOL             types_deref(const struct dbg_lvalue* value, struct dbg_lvalue* result);
 extern BOOL             types_udt_find_element(struct dbg_lvalue* value, const char* name, long int* tmpbuf);
diff --git a/programs/winedbg/memory.c b/programs/winedbg/memory.c
index 70ca4ca..9744737 100644
--- a/programs/winedbg/memory.c
+++ b/programs/winedbg/memory.c
@@ -474,14 +474,20 @@ void print_basic(const struct dbg_lvalue* lvalue, char format)
 
     if (format != 0)
     {
-        LONGLONG res = types_extract_as_longlong(lvalue);
+        unsigned size;
+        LONGLONG res = types_extract_as_longlong(lvalue, &size);
+        DWORD hi;
         WCHAR wch;
 
         /* FIXME: this implies i386 byte ordering */
         switch (format)
         {
         case 'x':
-            dbg_printf("0x%x", (DWORD)(ULONG64)res);
+            hi = (ULONG64)res >> 32;
+            if (size == 8 && hi)
+                dbg_printf("0x%x%08x", hi, (DWORD)(ULONG64)res);
+            else
+                dbg_printf("0x%x", (DWORD)(ULONG64)res);
             return;
 
         case 'd':
@@ -509,7 +515,7 @@ void print_basic(const struct dbg_lvalue* lvalue, char format)
     }
     if (lvalue->type.id == dbg_itype_segptr)
     {
-        dbg_print_longlong(types_extract_as_longlong(lvalue), TRUE);
+        dbg_print_longlong(types_extract_as_longlong(lvalue, NULL), TRUE);
         dbg_printf("\n");
     }
     else print_typed_basic(lvalue);
diff --git a/programs/winedbg/types.c b/programs/winedbg/types.c
index a5700fb..fd13dac 100644
--- a/programs/winedbg/types.c
+++ b/programs/winedbg/types.c
@@ -53,7 +53,7 @@ BOOL types_get_real_type(struct dbg_type* type, DWORD* tag)
  * Given a lvalue, try to get an integral (or pointer/address) value
  * out of it
  */
-LONGLONG types_extract_as_longlong(const struct dbg_lvalue* lvalue)
+LONGLONG types_extract_as_longlong(const struct dbg_lvalue* lvalue, unsigned* psize)
 {
     LONGLONG            rtn;
     DWORD               tag, bt;
@@ -68,6 +68,7 @@ LONGLONG types_extract_as_longlong(const struct dbg_lvalue* lvalue)
         return (long int)memory_to_linear_addr(&lvalue->addr);
     }
 
+    if (psize) *psize = 0;
     switch (tag)
     {
     case SymTagBaseType:
@@ -96,6 +97,7 @@ LONGLONG types_extract_as_longlong(const struct dbg_lvalue* lvalue)
         case btFloat:
             RaiseException(DEBUG_STATUS_NOT_AN_INTEGER, 0, 0, NULL);
         }
+        if (psize) *psize = (unsigned)size;
         break;
     case SymTagPointerType:
         if (!be_cpu->fetch_integer(lvalue, sizeof(void*), FALSE, &rtn))
@@ -131,7 +133,7 @@ LONGLONG types_extract_as_longlong(const struct dbg_lvalue* lvalue)
  */
 long int types_extract_as_integer(const struct dbg_lvalue* lvalue)
 {
-    return types_extract_as_longlong(lvalue);
+    return types_extract_as_longlong(lvalue, NULL);
 }
 
 /******************************************************************
@@ -148,7 +150,7 @@ void types_extract_as_address(const struct dbg_lvalue* lvalue, ADDRESS64* addr)
     else
     {
         addr->Mode = AddrModeFlat;
-        addr->Offset = types_extract_as_longlong( lvalue );
+        addr->Offset = types_extract_as_longlong(lvalue, NULL);
     }
 }
 





More information about the wine-patches mailing list