Eric Pouech : winedbg: Implement proper assignements of floating point numbers.
Alexandre Julliard
julliard at winehq.org
Fri Dec 10 15:07:51 CST 2021
Module: wine
Branch: master
Commit: 05c5a12f87eec74dc64e728d7e60861b5517c033
URL: https://source.winehq.org/git/wine.git/?a=commit;h=05c5a12f87eec74dc64e728d7e60861b5517c033
Author: Eric Pouech <eric.pouech at gmail.com>
Date: Wed Dec 8 14:44:44 2021 +0100
winedbg: Implement proper assignements of floating point numbers.
Signed-off-by: Eric Pouech <eric.pouech at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
programs/winedbg/debugger.h | 2 ++
programs/winedbg/memory.c | 17 +++++++++++++++++
programs/winedbg/types.c | 17 ++++++++++++++++-
3 files changed, 35 insertions(+), 1 deletion(-)
diff --git a/programs/winedbg/debugger.h b/programs/winedbg/debugger.h
index 578240c6453..b676bc8d955 100644
--- a/programs/winedbg/debugger.h
+++ b/programs/winedbg/debugger.h
@@ -397,6 +397,7 @@ extern BOOL memory_fetch_integer(const struct dbg_lvalue* lvalue, un
BOOL is_signed, dbg_lgint_t* ret);
extern BOOL memory_store_integer(const struct dbg_lvalue* lvalue, dbg_lgint_t val);
extern BOOL memory_fetch_float(const struct dbg_lvalue* lvalue, double *ret);
+extern BOOL memory_store_float(const struct dbg_lvalue* lvalue, double *ret);
extern void memory_examine(const struct dbg_lvalue *lvalue, int count, char format);
extern void* memory_to_linear_addr(const ADDRESS64* address);
extern BOOL memory_get_current_pc(ADDRESS64* address);
@@ -497,6 +498,7 @@ extern struct dbg_type types_find_pointer(const struct dbg_type* type);
extern struct dbg_type types_find_type(DWORD64 linear, const char* name, enum SymTagEnum tag);
extern BOOL types_compare(const struct dbg_type, const struct dbg_type, BOOL* equal);
extern BOOL types_is_integral_type(const struct dbg_lvalue*);
+extern BOOL types_is_float_type(const struct dbg_lvalue*);
/* winedbg.c */
extern void dbg_outputW(const WCHAR* buffer, int len);
diff --git a/programs/winedbg/memory.c b/programs/winedbg/memory.c
index eed9bf6c049..5e01bef5607 100644
--- a/programs/winedbg/memory.c
+++ b/programs/winedbg/memory.c
@@ -354,6 +354,23 @@ BOOL memory_fetch_float(const struct dbg_lvalue* lvalue, double *ret)
return TRUE;
}
+BOOL memory_store_float(const struct dbg_lvalue* lvalue, double *ret)
+{
+ DWORD64 size;
+ if (!types_get_info(&lvalue->type, TI_GET_LENGTH, &size)) return FALSE;
+ /* FIXME: this assumes that debuggee and debugger use the same
+ * representation for reals
+ */
+ if (size > sizeof(*ret)) return FALSE;
+ if (size == sizeof(float))
+ {
+ float f = *ret;
+ return memory_write_value(lvalue, size, &f);
+ }
+ if (size != sizeof(double)) return FALSE;
+ return memory_write_value(lvalue, size, ret);
+}
+
BOOL memory_get_string(struct dbg_process* pcs, void* addr, BOOL in_debuggee,
BOOL unicode, char* buffer, int size)
{
diff --git a/programs/winedbg/types.c b/programs/winedbg/types.c
index 48f985f7e16..1383f025430 100644
--- a/programs/winedbg/types.c
+++ b/programs/winedbg/types.c
@@ -168,6 +168,12 @@ BOOL types_store_value(struct dbg_lvalue* lvalue_to, const struct dbg_lvalue* lv
if (!types_compare(lvalue_to->type, lvalue_from->type, &equal)) return FALSE;
if (equal)
return memory_transfer_value(lvalue_to, lvalue_from);
+ if (types_is_float_type(lvalue_from) && types_is_float_type(lvalue_to))
+ {
+ double d;
+ return memory_fetch_float(lvalue_from, &d) &&
+ memory_store_float(lvalue_to, &d);
+ }
}
if (types_is_integral_type(lvalue_from) && types_is_integral_type(lvalue_to))
{
@@ -175,7 +181,6 @@ BOOL types_store_value(struct dbg_lvalue* lvalue_to, const struct dbg_lvalue* lv
dbg_lgint_t val = types_extract_as_integer(lvalue_from);
return memory_store_integer(lvalue_to, val);
}
- /* FIXME: should support floats as well */
dbg_printf("Cannot assign (different types)\n"); return FALSE;
return FALSE;
}
@@ -1075,3 +1080,13 @@ BOOL types_is_integral_type(const struct dbg_lvalue* lv)
!types_get_info(&type, TI_GET_BASETYPE, &bt)) return FALSE;
return is_basetype_integer(bt);
}
+
+BOOL types_is_float_type(const struct dbg_lvalue* lv)
+{
+ struct dbg_type type = lv->type;
+ DWORD tag, bt;
+ if (lv->bitlen) return FALSE;
+ if (!types_get_real_type(&type, &tag) ||
+ !types_get_info(&type, TI_GET_BASETYPE, &bt)) return FALSE;
+ return bt == btFloat;
+}
More information about the wine-cvs
mailing list