- Enhanced internal variables framework (including read/save to
registry and typing)
- Finalized use of Windows' Console I/O interface (instead of Unix std
streams)
- Now handling registers as internal variables (they are no longer
seen as a specific type)
diff --git a/debugger/expr.c b/debugger/expr.c
index 76f4f79..a083fb3 100644
--- a/debugger/expr.c
+++ b/debugger/expr.c
@@ -7,7 +7,6 @@
#include "config.h"
#include <stdlib.h>
-#include <stdio.h>
#include <string.h>
#include "winbase.h"
#include "wine/winbase16.h"
@@ -45,9 +44,8 @@
struct
{
- enum debug_regs reg;
- int result;
- } rgister;
+ const char * name;
+ } intvar;
struct
{
@@ -97,7 +95,7 @@
#define EXPR_TYPE_CONST 0
#define EXPR_TYPE_US_CONST 1
#define EXPR_TYPE_SYMBOL 2
-#define EXPR_TYPE_REGISTER 3
+#define EXPR_TYPE_INTVAR 3
#define EXPR_TYPE_BINOP 4
#define EXPR_TYPE_UNOP 5
#define EXPR_TYPE_STRUCT 6
@@ -151,14 +149,14 @@
}
struct expr *
-DEBUG_RegisterExpr(enum debug_regs regno)
+DEBUG_IntVarExpr(const char* name)
{
struct expr * ex;
ex = DEBUG_GetFreeExpr();
- ex->type = EXPR_TYPE_REGISTER;
- ex->un.rgister.reg = regno;
+ ex->type = EXPR_TYPE_INTVAR;
+ ex->un.intvar.name = name;
return ex;
}
@@ -429,18 +427,17 @@
rtn.addr.off = (unsigned int) &exp->un.call.result;
break;
- case EXPR_TYPE_REGISTER:
- rtn.type = DEBUG_TypeIntConst;
- rtn.cookie = DV_HOST;
- exp->un.rgister.result = DEBUG_GetRegister(exp->un.rgister.reg);
- rtn.addr.off = (unsigned int) &exp->un.rgister.result;
-#ifdef __i386__
- if( exp->un.rgister.reg == REG_EIP )
- rtn.addr.seg = DEBUG_context.SegCs;
- else
- rtn.addr.seg = DEBUG_context.SegDs;
-#endif
- DEBUG_FixAddress( &rtn.addr, 0 );
+ case EXPR_TYPE_INTVAR:
+ {
+
+ DBG_INTVAR* div = DEBUG_GetIntVar(exp->un.intvar.name);
+
+ if (!div) RaiseException(DEBUG_STATUS_NO_SYMBOL, 0, 0, NULL);
+ rtn.cookie = DV_HOST;
+ rtn.type = div->type;
+ rtn.addr.off = (unsigned int)div->pval;
+ /* EPP FIXME rtn.addr.seg = ?? */
+ }
break;
case EXPR_TYPE_BINOP:
exp1 = DEBUG_EvalExpr(exp->un.binop.exp1);
@@ -662,8 +659,8 @@
DEBUG_DisplayExpr(exp->un.cast.expr);
DEBUG_Printf(DBG_CHN_MESG, ")");
break;
- case EXPR_TYPE_REGISTER:
- DEBUG_PrintRegister(exp->un.rgister.reg);
+ case EXPR_TYPE_INTVAR:
+ DEBUG_Printf(DBG_CHN_MESG, "$%s", exp->un.intvar.name);
break;
case EXPR_TYPE_US_CONST:
DEBUG_Printf(DBG_CHN_MESG, "%ud", exp->un.u_const.value);
@@ -821,7 +818,9 @@
case EXPR_TYPE_CAST:
rtn->un.cast.expr = DEBUG_CloneExpr(exp->un.cast.expr);
break;
- case EXPR_TYPE_REGISTER:
+ case EXPR_TYPE_INTVAR:
+ rtn->un.intvar.name = DBG_strdup(exp->un.intvar.name);
+ break;
case EXPR_TYPE_US_CONST:
case EXPR_TYPE_CONST:
break;
@@ -874,7 +873,9 @@
case EXPR_TYPE_CAST:
DEBUG_FreeExpr(exp->un.cast.expr);
break;
- case EXPR_TYPE_REGISTER:
+ case EXPR_TYPE_INTVAR:
+ DBG_free((char *) exp->un.intvar.name);
+ break;
case EXPR_TYPE_US_CONST:
case EXPR_TYPE_CONST:
break;