Module: wine Branch: refs/heads/master Commit: 34db4856ae0431dd0c6e14ee6e35729271070052 URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=34db4856ae0431dd0c6e14ee...
Author: Eric Pouech eric.pouech@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);