Eric Pouech : dbghelp: Implement all SymGetLineNext* functions using internal_line_t.

Alexandre Julliard julliard at winehq.org
Tue Sep 7 16:25:21 CDT 2021


Module: wine
Branch: master
Commit: 8557fd5b347b8b573b7b3ed640b31206c3e18ee1
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=8557fd5b347b8b573b7b3ed640b31206c3e18ee1

Author: Eric Pouech <eric.pouech at gmail.com>
Date:   Tue Sep  7 09:26:49 2021 +0200

dbghelp: Implement all SymGetLineNext* functions using internal_line_t.

Signed-off-by: Eric Pouech <eric.pouech at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/dbghelp/dbghelp.spec |  2 +-
 dlls/dbghelp/symbol.c     | 69 +++++++++++++++++++++++++++++++----------------
 2 files changed, 47 insertions(+), 24 deletions(-)

diff --git a/dlls/dbghelp/dbghelp.spec b/dlls/dbghelp/dbghelp.spec
index 73455c547e8..1d95c7a21ff 100644
--- a/dlls/dbghelp/dbghelp.spec
+++ b/dlls/dbghelp/dbghelp.spec
@@ -92,7 +92,7 @@
 @ stdcall SymGetLineFromNameW64(long wstr wstr long ptr ptr)
 @ stdcall SymGetLineNext(long ptr)
 @ stdcall SymGetLineNext64(long ptr)
-@ stub SymGetLineNextW64
+@ stdcall SymGetLineNextW64(long ptr)
 @ stdcall SymGetLinePrev(long ptr)
 @ stdcall SymGetLinePrev64(long ptr)
 @ stub SymGetLinePrevW64
diff --git a/dlls/dbghelp/symbol.c b/dlls/dbghelp/symbol.c
index d79b32a0b5a..25bb21edeaa 100644
--- a/dlls/dbghelp/symbol.c
+++ b/dlls/dbghelp/symbol.c
@@ -1861,24 +1861,35 @@ BOOL WINAPI SymGetLinePrev(HANDLE hProcess, PIMAGEHLP_LINE Line)
     return TRUE;
 }
 
-static BOOL symt_get_func_line_next(const struct module* module, PIMAGEHLP_LINE64 line)
+static BOOL symt_get_func_line_next(HANDLE hProcess, struct internal_line_t* intl, void* key, DWORD64 addr)
 {
+    struct module_pair  pair;
     struct line_info*   li;
+    struct line_info*   srcli;
+
+    if (key == NULL) return FALSE;
+    pair.pcs = process_find_by_handle(hProcess);
+    if (!pair.pcs) return FALSE;
+    pair.requested = module_find_by_addr(pair.pcs, addr, DMT_UNKNOWN);
+    if (!module_get_debug(&pair)) return FALSE;
 
-    if (line->Key == 0) return FALSE;
-    li = line->Key;
+    /* search current source file */
+    for (srcli = key; !srcli->is_source_file; srcli--);
+
+    li = key;
     while (!li->is_last)
     {
         li++;
         if (!li->is_source_file)
         {
-            line->LineNumber = li->line_number;
-            line->Address    = li->u.pc_offset;
-            line->Key        = li;
-            return TRUE;
+            intl->line_number = li->line_number;
+            intl->address     = li->u.pc_offset;
+            intl->key         = li;
+            return internal_line_set_nameA(pair.pcs, intl, (char*)source_get(pair.effective, srcli->u.source_file), FALSE);
         }
-        line->FileName = (char*)source_get(module, li->u.source_file);
+        srcli = li;
     }
+    SetLastError(ERROR_NO_MORE_ITEMS); /* FIXME */
     return FALSE;
 }
 
@@ -1888,19 +1899,14 @@ static BOOL symt_get_func_line_next(const struct module* module, PIMAGEHLP_LINE6
  */
 BOOL WINAPI SymGetLineNext64(HANDLE hProcess, PIMAGEHLP_LINE64 Line)
 {
-    struct module_pair  pair;
+    struct internal_line_t intl;
 
     TRACE("(%p %p)\n", hProcess, Line);
 
     if (Line->SizeOfStruct < sizeof(*Line)) return FALSE;
-    pair.pcs = process_find_by_handle(hProcess);
-    if (!pair.pcs) return FALSE;
-    pair.requested = module_find_by_addr(pair.pcs, Line->Address, DMT_UNKNOWN);
-    if (!module_get_debug(&pair)) return FALSE;
-
-    if (symt_get_func_line_next(pair.effective, Line)) return TRUE;
-    SetLastError(ERROR_NO_MORE_ITEMS); /* FIXME */
-    return FALSE;
+    init_internal_line(&intl, FALSE);
+    if (!symt_get_func_line_next(hProcess, &intl, Line->Key, Line->Address)) return FALSE;
+    return internal_line_copy_toA64(&intl, Line);
 }
 
 /******************************************************************
@@ -1909,13 +1915,30 @@ BOOL WINAPI SymGetLineNext64(HANDLE hProcess, PIMAGEHLP_LINE64 Line)
  */
 BOOL WINAPI SymGetLineNext(HANDLE hProcess, PIMAGEHLP_LINE Line)
 {
-    IMAGEHLP_LINE64     line64;
+    struct internal_line_t intl;
 
-    line64.SizeOfStruct = sizeof(line64);
-    copy_line_64_from_32(&line64, Line);
-    if (!SymGetLineNext64(hProcess, &line64)) return FALSE;
-    copy_line_32_from_64(Line, &line64);
-    return TRUE;
+    TRACE("(%p %p)\n", hProcess, Line);
+
+    if (Line->SizeOfStruct < sizeof(*Line)) return FALSE;
+    init_internal_line(&intl, FALSE);
+    if (!symt_get_func_line_next(hProcess, &intl, Line->Key, Line->Address)) return FALSE;
+    return internal_line_copy_toA32(&intl, Line);
+}
+
+/******************************************************************
+ *		SymGetLineNextW64 (DBGHELP.@)
+ *
+ */
+BOOL WINAPI SymGetLineNextW64(HANDLE hProcess, PIMAGEHLP_LINEW64 Line)
+{
+    struct internal_line_t intl;
+
+    TRACE("(%p %p)\n", hProcess, Line);
+
+    if (Line->SizeOfStruct < sizeof(*Line)) return FALSE;
+    init_internal_line(&intl, TRUE);
+    if (!symt_get_func_line_next(hProcess, &intl, Line->Key, Line->Address)) return FALSE;
+    return internal_line_copy_toW64(&intl, Line);
 }
 
 /***********************************************************************




More information about the wine-cvs mailing list