Eric Pouech : dbghelp,winedbg: SYMBOL_INFO fix.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Dec 5 08:54:10 CST 2005


Module: wine
Branch: refs/heads/master
Commit: 34db4856ae0431dd0c6e14ee6e35729271070052
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=34db4856ae0431dd0c6e14ee6e35729271070052

Author: Eric Pouech <eric.pouech at wanadoo.fr>
Date:   Mon Dec  5 12:00:54 2005 +0100

dbghelp,winedbg: SYMBOL_INFO fix.
- native dbghelp returns in SYMBOL_INFO.TypeIndex the index of the
   type of the symbol (we were returning the symbol index instead)
- fixed winedbg accordingly

---

 dlls/dbghelp/symbol.c     |    5 +++--
 dlls/dbghelp/type.c       |    1 +
 programs/winedbg/expr.c   |    6 ++----
 programs/winedbg/symbol.c |   13 +++++--------
 4 files changed, 11 insertions(+), 14 deletions(-)

diff --git a/dlls/dbghelp/symbol.c b/dlls/dbghelp/symbol.c
index 0dfa606..c47c04c 100644
--- a/dlls/dbghelp/symbol.c
+++ b/dlls/dbghelp/symbol.c
@@ -443,8 +443,9 @@ static void symt_fill_sym_info(const str
     const char* name;
     DWORD64 size;
 
-    sym_info->TypeIndex = (DWORD)sym;
-    sym_info->info = 0; /* TBD */
+    if (!symt_get_info(sym, TI_GET_TYPE, &sym_info->TypeIndex))
+        sym_info->TypeIndex = 0;
+    sym_info->info = (DWORD)sym;
     symt_get_info(sym, TI_GET_LENGTH, &size);
     sym_info->Size = (DWORD)size;
     sym_info->ModBase = module->module.BaseOfImage;
diff --git a/dlls/dbghelp/type.c b/dlls/dbghelp/type.c
index 7617be8..fba6942 100644
--- a/dlls/dbghelp/type.c
+++ b/dlls/dbghelp/type.c
@@ -718,6 +718,7 @@ BOOL symt_get_info(const struct symt* ty
         default:
             FIXME("Unsupported sym-tag %s for get-type\n", 
                   symt_get_tag_str(type->tag));
+        case SymTagPublicSymbol:
         case SymTagThunk:
             return FALSE;
         }
diff --git a/programs/winedbg/expr.c b/programs/winedbg/expr.c
index 848eb91..5eb4d49 100644
--- a/programs/winedbg/expr.c
+++ b/programs/winedbg/expr.c
@@ -461,10 +461,8 @@ struct dbg_lvalue expr_eval(struct expr*
         exp->un.call.result = 0;
 #endif
         rtn.cookie = DLV_HOST;
-        /* get function signature type */
-        types_get_info(&rtn.type, TI_GET_TYPE, &rtn.type);
-        /* and now, return type */
-        types_get_info(&rtn.type, TI_GET_TYPE, &rtn.type);
+        /* get return type from function signature tupe */
+        types_get_info(&rtn.type, TI_GET_TYPE, &rtn.type.id);
         rtn.addr.Offset = (unsigned int)&exp->un.call.result;
         break;
     case EXPR_TYPE_INTVAR:
diff --git a/programs/winedbg/symbol.c b/programs/winedbg/symbol.c
index 61ef3dc..f7dcfce 100644
--- a/programs/winedbg/symbol.c
+++ b/programs/winedbg/symbol.c
@@ -40,6 +40,7 @@ static BOOL symbol_get_debug_start(DWORD
     int                         i;
     struct dbg_type             type;
 
+    if (!typeid) return FALSE; /* native dbghelp not always fills the info field */
     type.module = mod_base;
     type.id = typeid;
 
@@ -134,7 +135,7 @@ static BOOL CALLBACK sgv_cb(SYMBOL_INFO*
         if (sgv->lineno == -1)
         {
             if (!sgv->bp_disp || 
-                !symbol_get_debug_start(sym->ModBase, sym->TypeIndex, &addr))
+                !symbol_get_debug_start(sym->ModBase, sym->info, &addr))
                 addr = sym->Address;
         }
         else
@@ -185,9 +186,7 @@ static BOOL CALLBACK sgv_cb(SYMBOL_INFO*
     sgv->syms[insp].lvalue.addr.Mode   = AddrModeFlat;
     sgv->syms[insp].lvalue.addr.Offset = addr;
     sgv->syms[insp].lvalue.type.module = sym->ModBase;
-    sgv->syms[insp].lvalue.type.id = sym->TypeIndex;
-    types_get_info(&sgv->syms[insp].lvalue.type, TI_GET_TYPE, 
-                   &sgv->syms[insp].lvalue.type.id);
+    sgv->syms[insp].lvalue.type.id     = sym->TypeIndex;
     sgv->syms[insp].flags              = sym->Flags;
     sgv->num++;
   
@@ -463,7 +462,7 @@ enum dbg_line_status symbol_get_function
     if (!SymGetLineFromAddr(dbg_curr_process->handle, lin, &disp, &il))
         return dbg_no_line_info;
 
-    if (symbol_get_debug_start(sym->ModBase, sym->TypeIndex, &start) && lin < start)
+    if (symbol_get_debug_start(sym->ModBase, sym->info, &start) && lin < start)
         return dbg_not_on_a_line_number;
     if (!sym->Size) sym->Size = 0x100000;
     if (il.FileName && il.FileName[0] && disp < sym->Size)
@@ -545,7 +544,6 @@ static BOOL CALLBACK info_locals_cb(SYMB
     dbg_printf("\t");
     type.module = sym->ModBase;
     type.id = sym->TypeIndex;
-    types_get_info(&type, TI_GET_TYPE, &type.id);
     types_print_type(&type, FALSE);
 
     if (sym->Flags & SYMFLAG_PARAMETER) explain = "parameter";
@@ -624,8 +622,7 @@ static BOOL CALLBACK symbols_info_cb(SYM
     type.id = sym->TypeIndex;
     type.module = sym->ModBase;
 
-    if (sym->TypeIndex != dbg_itype_none && sym->TypeIndex != 0 &&
-        types_get_info(&type, TI_GET_TYPE, &type.id))
+    if (sym->TypeIndex != dbg_itype_none && sym->TypeIndex != 0)
     {
         dbg_printf(" ");
         types_print_type(&type, FALSE);




More information about the wine-cvs mailing list