blob: 29262ef7ced81fc82da78a96fe23c394b4577b39 [file] [log] [blame]
Alexandre Julliardc6c09441997-01-12 18:32:19 +00001/*
2 * File expr.c - expression handling for Wine internal debugger.
3 *
4 * Copyright (C) 1997, Eric Youngdale.
5 *
6 */
7
Marcus Meissnerb0d52b01999-02-28 19:59:00 +00008#include "config.h"
Alexandre Julliardc6c09441997-01-12 18:32:19 +00009#include <stdlib.h>
Alexandre Julliardc6c09441997-01-12 18:32:19 +000010#include <string.h>
Marcus Meissner88354d91999-10-24 20:44:38 +000011#include "winbase.h"
Marcus Meissner317af321999-02-17 13:51:06 +000012#include "wine/winbase16.h"
Ove Kaaven69df3711998-10-11 12:27:04 +000013#include "task.h"
Alexandre Julliardc6c09441997-01-12 18:32:19 +000014#include "debugger.h"
Alexandre Julliardc6c09441997-01-12 18:32:19 +000015#include "expr.h"
16
17#include <stdarg.h>
18
19struct expr
20{
21 unsigned int perm;
22 unsigned int type:31;
23 union
24 {
25 struct
26 {
27 int value;
28 } constant;
29
30 struct
31 {
32 const char * str;
33 } string;
34
35 struct
36 {
37 unsigned int value;
38 } u_const;
39
40 struct
41 {
42 const char * name;
43 } symbol;
44
45 struct
46 {
Eric Pouech04c16b82000-04-30 12:21:15 +000047 const char * name;
48 } intvar;
Alexandre Julliardc6c09441997-01-12 18:32:19 +000049
50 struct
51 {
52 int unop_type;
53 struct expr * exp1;
54 int result;
55 } unop;
56
57 struct
58 {
59 int binop_type;
60 int result;
61 struct expr * exp1;
62 struct expr * exp2;
63 } binop;
64
65 struct
66 {
Alexandre Julliard01d63461997-01-20 19:43:45 +000067 struct datatype * cast;
68 struct expr * expr;
69 } cast;
70
71 struct
72 {
Alexandre Julliardc6c09441997-01-12 18:32:19 +000073 struct expr * exp1;
74 const char * element_name;
75 int result;
76 } structure;
77
78 struct
79 {
80 struct expr * base;
81 struct expr * index;
82 } array;
83
84 struct
85 {
86 const char * funcname;
87 int nargs;
88 int result;
89 struct expr * arg[5];
90 } call;
91
92 } un;
93};
94
95#define EXPR_TYPE_CONST 0
96#define EXPR_TYPE_US_CONST 1
97#define EXPR_TYPE_SYMBOL 2
Eric Pouech04c16b82000-04-30 12:21:15 +000098#define EXPR_TYPE_INTVAR 3
Alexandre Julliardc6c09441997-01-12 18:32:19 +000099#define EXPR_TYPE_BINOP 4
100#define EXPR_TYPE_UNOP 5
101#define EXPR_TYPE_STRUCT 6
102#define EXPR_TYPE_PSTRUCT 7
103#define EXPR_TYPE_ARRAY 8
104#define EXPR_TYPE_CALL 9
105#define EXPR_TYPE_STRING 10
Alexandre Julliard01d63461997-01-20 19:43:45 +0000106#define EXPR_TYPE_CAST 11
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000107
108static char expr_list[4096];
109static int next_expr_free = 0;
110
111/*
112 * This is how we turn an expression address into the actual value.
113 * This works well in the 32 bit domain - not sure at all about the
114 * 16 bit world.
115 */
116#define VAL(_exp) DEBUG_GetExprValue(&_exp, NULL)
117
118static
119struct expr *
Eric Pouechd33bcb62000-03-15 19:57:20 +0000120DEBUG_GetFreeExpr(void)
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000121{
122 struct expr * rtn;
123
124 rtn = (struct expr *) &expr_list[next_expr_free];
125
126 next_expr_free += sizeof(struct expr);
Eric Pouech3b50d211999-05-24 08:14:30 +0000127 assert(next_expr_free < sizeof(expr_list));
128
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000129 return rtn;
130}
131
132void
Eric Pouechd33bcb62000-03-15 19:57:20 +0000133DEBUG_FreeExprMem(void)
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000134{
135 next_expr_free = 0;
136}
137
Alexandre Julliard01d63461997-01-20 19:43:45 +0000138struct expr *
139DEBUG_TypeCastExpr(struct datatype * dt, struct expr * exp)
140{
141 struct expr * ex;
142
143 ex = DEBUG_GetFreeExpr();
144
145 ex->type = EXPR_TYPE_CAST;
146 ex->un.cast.cast = dt;
147 ex->un.cast.expr = exp;
148 return ex;
149}
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000150
151struct expr *
Eric Pouech04c16b82000-04-30 12:21:15 +0000152DEBUG_IntVarExpr(const char* name)
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000153{
154 struct expr * ex;
155
156 ex = DEBUG_GetFreeExpr();
157
Eric Pouech04c16b82000-04-30 12:21:15 +0000158 ex->type = EXPR_TYPE_INTVAR;
159 ex->un.intvar.name = name;
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000160 return ex;
161}
162
163struct expr *
164DEBUG_SymbolExpr(const char * name)
165{
166 struct expr * ex;
167
168 ex = DEBUG_GetFreeExpr();
169
170 ex->type = EXPR_TYPE_SYMBOL;
171 ex->un.symbol.name = name;
172 return ex;
173}
174
175struct expr *
176DEBUG_ConstExpr(int value)
177{
178 struct expr * ex;
179
180 ex = DEBUG_GetFreeExpr();
181
182 ex->type = EXPR_TYPE_CONST;
183 ex->un.constant.value = value;
184 return ex;
185}
186
187struct expr *
188DEBUG_StringExpr(const char * str)
189{
190 struct expr * ex;
191 char * pnt;
192 ex = DEBUG_GetFreeExpr();
193
194 ex->type = EXPR_TYPE_STRING;
195 ex->un.string.str = str+1;
196 pnt = strrchr(ex->un.string.str, '"');
197 if( pnt != NULL )
198 {
199 *pnt = '\0';
200 }
201 return ex;
202}
203
204struct expr *
205DEBUG_USConstExpr(unsigned int value)
206{
207 struct expr * ex;
208
209 ex = DEBUG_GetFreeExpr();
210
211 ex->type = EXPR_TYPE_CONST;
212 ex->un.u_const.value = value;
213 return ex;
214}
215
216struct expr *
217DEBUG_BinopExpr(int operator_type, struct expr * exp1, struct expr * exp2)
218{
219 struct expr * ex;
220
221 ex = DEBUG_GetFreeExpr();
222
223 ex->type = EXPR_TYPE_BINOP;
224 ex->un.binop.binop_type = operator_type;
225 ex->un.binop.exp1 = exp1;
226 ex->un.binop.exp2 = exp2;
227 return ex;
228}
229
230struct expr *
231DEBUG_UnopExpr(int operator_type, struct expr * exp1)
232{
233 struct expr * ex;
234
235 ex = DEBUG_GetFreeExpr();
236
237 ex->type = EXPR_TYPE_UNOP;
238 ex->un.unop.unop_type = operator_type;
239 ex->un.unop.exp1 = exp1;
240 return ex;
241}
242
243struct expr *
244DEBUG_StructExpr(struct expr * exp, const char * element)
245{
246 struct expr * ex;
247
248 ex = DEBUG_GetFreeExpr();
249
250 ex->type = EXPR_TYPE_STRUCT;
251 ex->un.structure.exp1 = exp;
252 ex->un.structure.element_name = element;
253 return ex;
254}
255
256struct expr *
257DEBUG_StructPExpr(struct expr * exp, const char * element)
258{
259 struct expr * ex;
260
261 ex = DEBUG_GetFreeExpr();
262
263 ex->type = EXPR_TYPE_PSTRUCT;
264 ex->un.structure.exp1 = exp;
265 ex->un.structure.element_name = element;
266 return ex;
267}
268
269struct expr *
270DEBUG_CallExpr(const char * funcname, int nargs, ...)
271{
272 struct expr * ex;
273 va_list ap;
274 int i;
275
276 ex = DEBUG_GetFreeExpr();
277
278 ex->type = EXPR_TYPE_CALL;
279 ex->un.call.funcname = funcname;
280 ex->un.call.nargs = nargs;
281
282 va_start(ap, nargs);
283 for(i=0; i < nargs; i++)
284 {
285 ex->un.call.arg[i] = va_arg(ap, struct expr *);
286 }
287 va_end(ap);
288 return ex;
289}
290
Eric Pouechd33bcb62000-03-15 19:57:20 +0000291DBG_VALUE DEBUG_EvalExpr(struct expr * exp)
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000292{
Eric Pouechd33bcb62000-03-15 19:57:20 +0000293 DBG_VALUE rtn;
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000294 int i;
Eric Pouechd33bcb62000-03-15 19:57:20 +0000295 DBG_VALUE exp1;
296 DBG_VALUE exp2;
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000297 unsigned int cexp[5];
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000298 int scale1;
299 int scale2;
300 int scale3;
301 struct datatype * type1;
302 struct datatype * type2;
303
304 rtn.type = NULL;
Peter Hunnisett856aefa2000-07-08 12:45:44 +0000305 rtn.cookie = DV_INVALID;
Eric Pouechd33bcb62000-03-15 19:57:20 +0000306 rtn.addr.off = 0;
307 rtn.addr.seg = 0;
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000308
309 switch(exp->type)
310 {
Alexandre Julliard01d63461997-01-20 19:43:45 +0000311 case EXPR_TYPE_CAST:
312 rtn = DEBUG_EvalExpr(exp->un.cast.expr);
313 rtn.type = exp->un.cast.cast;
Eric Pouechd33bcb62000-03-15 19:57:20 +0000314 if (DEBUG_GetType(rtn.type) == DT_POINTER)
315 rtn.cookie = DV_TARGET;
Alexandre Julliard01d63461997-01-20 19:43:45 +0000316 break;
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000317 case EXPR_TYPE_STRING:
318 rtn.type = DEBUG_TypeString;
Eric Pouechd33bcb62000-03-15 19:57:20 +0000319 rtn.cookie = DV_HOST;
320 rtn.addr.off = (unsigned int) &exp->un.string.str;
321 rtn.addr.seg = 0;
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000322 break;
323 case EXPR_TYPE_CONST:
324 rtn.type = DEBUG_TypeIntConst;
Eric Pouechd33bcb62000-03-15 19:57:20 +0000325 rtn.cookie = DV_HOST;
326 rtn.addr.off = (unsigned int) &exp->un.constant.value;
327 rtn.addr.seg = 0;
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000328 break;
329 case EXPR_TYPE_US_CONST:
330 rtn.type = DEBUG_TypeUSInt;
Eric Pouechd33bcb62000-03-15 19:57:20 +0000331 rtn.cookie = DV_HOST;
332 rtn.addr.off = (unsigned int) &exp->un.u_const.value;
333 rtn.addr.seg = 0;
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000334 break;
335 case EXPR_TYPE_SYMBOL:
Eric Pouech527eea92000-03-08 16:44:54 +0000336 if( !DEBUG_GetSymbolValue(exp->un.symbol.name, -1, &rtn, FALSE) )
337 {
Eric Pouech527eea92000-03-08 16:44:54 +0000338 RaiseException(DEBUG_STATUS_NO_SYMBOL, 0, 0, NULL);
Eric Pouech527eea92000-03-08 16:44:54 +0000339 }
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000340 break;
341 case EXPR_TYPE_PSTRUCT:
342 exp1 = DEBUG_EvalExpr(exp->un.structure.exp1);
343 if( exp1.type == NULL )
344 {
Eric Pouechd33bcb62000-03-15 19:57:20 +0000345 RaiseException(DEBUG_STATUS_BAD_TYPE, 0, 0, NULL);
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000346 }
Eric Pouechd33bcb62000-03-15 19:57:20 +0000347 rtn.cookie = DV_TARGET;
348 rtn.addr.off = DEBUG_TypeDerefPointer(&exp1, &type1);
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000349 if( type1 == NULL )
350 {
Eric Pouechd33bcb62000-03-15 19:57:20 +0000351 RaiseException(DEBUG_STATUS_BAD_TYPE, 0, 0, NULL);
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000352 }
353 rtn.type = type1;
354 DEBUG_FindStructElement(&rtn, exp->un.structure.element_name,
355 &exp->un.structure.result);
356 break;
357 case EXPR_TYPE_STRUCT:
358 exp1 = DEBUG_EvalExpr(exp->un.structure.exp1);
359 if( exp1.type == NULL )
360 {
Eric Pouechd33bcb62000-03-15 19:57:20 +0000361 RaiseException(DEBUG_STATUS_BAD_TYPE, 0, 0, NULL);
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000362 }
363 rtn = exp1;
364 DEBUG_FindStructElement(&rtn, exp->un.structure.element_name,
365 &exp->un.structure.result);
366 break;
367 case EXPR_TYPE_CALL:
368 /*
369 * First, evaluate all of the arguments. If any of them are not
370 * evaluable, then bail.
371 */
372 for(i=0; i < exp->un.call.nargs; i++)
373 {
374 exp1 = DEBUG_EvalExpr(exp->un.call.arg[i]);
375 if( exp1.type == NULL )
376 {
377 return rtn;
378 }
379 cexp[i] = DEBUG_GetExprValue(&exp1, NULL);
380 }
381
382 /*
383 * Now look up the address of the function itself.
384 */
385 if( !DEBUG_GetSymbolValue(exp->un.call.funcname, -1, &rtn, FALSE ) )
386 {
Eric Pouechd33bcb62000-03-15 19:57:20 +0000387 RaiseException(DEBUG_STATUS_NO_SYMBOL, 0, 0, NULL);
Eric Pouech3b50d211999-05-24 08:14:30 +0000388 }
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000389
Eric Pouech527eea92000-03-08 16:44:54 +0000390#if 0
391 /* FIXME: NEWDBG NIY */
392 /* Anyway, I wonder how this could work depending on the calling order of
393 * the function (cdecl vs pascal for example)
394 */
395 int (*fptr)();
396
Eric Pouechd33bcb62000-03-15 19:57:20 +0000397 fptr = (int (*)()) rtn.addr.off;
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000398 switch(exp->un.call.nargs)
399 {
400 case 0:
401 exp->un.call.result = (*fptr)();
402 break;
403 case 1:
404 exp->un.call.result = (*fptr)(cexp[0]);
405 break;
406 case 2:
407 exp->un.call.result = (*fptr)(cexp[0], cexp[1]);
408 break;
409 case 3:
410 exp->un.call.result = (*fptr)(cexp[0], cexp[1], cexp[2]);
411 break;
412 case 4:
413 exp->un.call.result = (*fptr)(cexp[0], cexp[1], cexp[2], cexp[3]);
414 break;
415 case 5:
416 exp->un.call.result = (*fptr)(cexp[0], cexp[1], cexp[2], cexp[3], cexp[4]);
417 break;
418 }
Eric Pouech527eea92000-03-08 16:44:54 +0000419#else
Eric Poueche5efa0c2000-04-13 19:31:58 +0000420 DEBUG_Printf(DBG_CHN_MESG, "Function call no longer implemented\n");
Eric Pouech527eea92000-03-08 16:44:54 +0000421 /* would need to set up a call to this function, and then restore the current
422 * context afterwards...
423 */
424 exp->un.call.result = 0;
425#endif
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000426 rtn.type = DEBUG_TypeInt;
Eric Pouechd33bcb62000-03-15 19:57:20 +0000427 rtn.cookie = DV_HOST;
428 rtn.addr.off = (unsigned int) &exp->un.call.result;
Eric Pouech527eea92000-03-08 16:44:54 +0000429
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000430 break;
Eric Pouech04c16b82000-04-30 12:21:15 +0000431 case EXPR_TYPE_INTVAR:
432 {
433
434 DBG_INTVAR* div = DEBUG_GetIntVar(exp->un.intvar.name);
435
436 if (!div) RaiseException(DEBUG_STATUS_NO_SYMBOL, 0, 0, NULL);
437 rtn.cookie = DV_HOST;
438 rtn.type = div->type;
439 rtn.addr.off = (unsigned int)div->pval;
440 /* EPP FIXME rtn.addr.seg = ?? */
441 }
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000442 break;
443 case EXPR_TYPE_BINOP:
444 exp1 = DEBUG_EvalExpr(exp->un.binop.exp1);
445 exp2 = DEBUG_EvalExpr(exp->un.binop.exp2);
Eric Pouechd33bcb62000-03-15 19:57:20 +0000446 rtn.cookie = DV_HOST;
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000447 if( exp1.type == NULL || exp2.type == NULL )
448 {
Eric Pouechd33bcb62000-03-15 19:57:20 +0000449 RaiseException(DEBUG_STATUS_BAD_TYPE, 0, 0, NULL);
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000450 }
451 if( exp1.type == DEBUG_TypeIntConst && exp2.type == DEBUG_TypeIntConst )
452 {
453 rtn.type = exp1.type;
454 }
455 else
456 {
457 rtn.type = DEBUG_TypeInt;
458 }
Eric Pouechd33bcb62000-03-15 19:57:20 +0000459 rtn.addr.seg = 0;
460 rtn.addr.off = (unsigned int) &exp->un.binop.result;
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000461 switch(exp->un.binop.binop_type)
462 {
463 case EXP_OP_ADD:
464 type1 = DEBUG_GetPointerType(exp1.type);
465 type2 = DEBUG_GetPointerType(exp2.type);
466 scale1 = 1;
467 scale2 = 1;
468 if( type1 != NULL && type2 != NULL )
469 {
Eric Pouechd33bcb62000-03-15 19:57:20 +0000470 RaiseException(DEBUG_STATUS_BAD_TYPE, 0, 0, NULL);
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000471 }
472 else if( type1 != NULL )
473 {
474 scale2 = DEBUG_GetObjectSize(type1);
475 rtn.type = exp1.type;
476 }
477 else if( type2 != NULL )
478 {
479 scale1 = DEBUG_GetObjectSize(type2);
480 rtn.type = exp2.type;
481 }
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000482 exp->un.binop.result = (VAL(exp1) * scale1 + scale2 * VAL(exp2));
483 break;
484 case EXP_OP_SUB:
485 type1 = DEBUG_GetPointerType(exp1.type);
486 type2 = DEBUG_GetPointerType(exp2.type);
487 scale1 = 1;
488 scale2 = 1;
489 scale3 = 1;
490 if( type1 != NULL && type2 != NULL )
491 {
492 if( type1 != type2 )
493 {
Eric Pouechd33bcb62000-03-15 19:57:20 +0000494 RaiseException(DEBUG_STATUS_BAD_TYPE, 0, 0, NULL);
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000495 }
496 scale3 = DEBUG_GetObjectSize(type1);
497 }
498 else if( type1 != NULL )
499 {
500 scale2 = DEBUG_GetObjectSize(type1);
501 rtn.type = exp1.type;
502 }
503
504 else if( type2 != NULL )
505 {
506 scale1 = DEBUG_GetObjectSize(type2);
507 rtn.type = exp2.type;
508 }
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000509 exp->un.binop.result = (VAL(exp1) - VAL(exp2)) / scale3;
510 break;
511 case EXP_OP_SEG:
Eric Pouechd33bcb62000-03-15 19:57:20 +0000512 rtn.cookie = DV_TARGET;
Eric Pouech71189b52000-07-25 12:51:56 +0000513 rtn.type = NULL;
Eric Pouechd33bcb62000-03-15 19:57:20 +0000514 rtn.addr.seg = VAL(exp1);
Eric Pouech71189b52000-07-25 12:51:56 +0000515 rtn.addr.off = VAL(exp2);
Ulrich Weigandb3ec4b91999-11-13 20:58:45 +0000516#ifdef __i386__
Eric Pouechd33bcb62000-03-15 19:57:20 +0000517 DEBUG_FixSegment(&rtn.addr);
Ulrich Weigandb3ec4b91999-11-13 20:58:45 +0000518#endif
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000519 break;
520 case EXP_OP_LOR:
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000521 exp->un.binop.result = (VAL(exp1) || VAL(exp2));
522 break;
523 case EXP_OP_LAND:
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000524 exp->un.binop.result = (VAL(exp1) && VAL(exp2));
525 break;
526 case EXP_OP_OR:
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000527 exp->un.binop.result = (VAL(exp1) | VAL(exp2));
528 break;
529 case EXP_OP_AND:
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000530 exp->un.binop.result = (VAL(exp1) & VAL(exp2));
531 break;
532 case EXP_OP_XOR:
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000533 exp->un.binop.result = (VAL(exp1) ^ VAL(exp2));
534 break;
535 case EXP_OP_EQ:
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000536 exp->un.binop.result = (VAL(exp1) == VAL(exp2));
537 break;
538 case EXP_OP_GT:
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000539 exp->un.binop.result = (VAL(exp1) > VAL(exp2));
540 break;
541 case EXP_OP_LT:
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000542 exp->un.binop.result = (VAL(exp1) < VAL(exp2));
543 break;
544 case EXP_OP_GE:
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000545 exp->un.binop.result = (VAL(exp1) >= VAL(exp2));
546 break;
547 case EXP_OP_LE:
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000548 exp->un.binop.result = (VAL(exp1) <= VAL(exp2));
549 break;
550 case EXP_OP_NE:
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000551 exp->un.binop.result = (VAL(exp1) != VAL(exp2));
552 break;
553 case EXP_OP_SHL:
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000554 exp->un.binop.result = ((unsigned) VAL(exp1) << VAL(exp2));
555 break;
556 case EXP_OP_SHR:
Alexandre Julliard17216f51997-10-12 16:30:17 +0000557 exp->un.binop.result = ((unsigned) VAL(exp1) >> VAL(exp2));
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000558 break;
559 case EXP_OP_MUL:
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000560 exp->un.binop.result = (VAL(exp1) * VAL(exp2));
561 break;
562 case EXP_OP_DIV:
Eric Pouechd33bcb62000-03-15 19:57:20 +0000563 if( VAL(exp2) == 0 )
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000564 {
Eric Pouechd33bcb62000-03-15 19:57:20 +0000565 RaiseException(DEBUG_STATUS_DIV_BY_ZERO, 0, 0, NULL);
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000566 }
Eric Pouechd33bcb62000-03-15 19:57:20 +0000567 exp->un.binop.result = (VAL(exp1) / VAL(exp2));
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000568 break;
569 case EXP_OP_REM:
Eric Pouechd33bcb62000-03-15 19:57:20 +0000570 if( VAL(exp2) == 0 )
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000571 {
Eric Pouechd33bcb62000-03-15 19:57:20 +0000572 RaiseException(DEBUG_STATUS_DIV_BY_ZERO, 0, 0, NULL);
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000573 }
Eric Pouechd33bcb62000-03-15 19:57:20 +0000574 exp->un.binop.result = (VAL(exp1) % VAL(exp2));
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000575 break;
576 case EXP_OP_ARR:
577 DEBUG_ArrayIndex(&exp1, &rtn, VAL(exp2));
578 break;
579 default:
Eric Pouechd33bcb62000-03-15 19:57:20 +0000580 RaiseException(DEBUG_STATUS_INTERNAL_ERROR, 0, 0, NULL);
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000581 break;
582 }
583 break;
584 case EXPR_TYPE_UNOP:
585 exp1 = DEBUG_EvalExpr(exp->un.unop.exp1);
Eric Pouechd33bcb62000-03-15 19:57:20 +0000586 rtn.cookie = DV_HOST;
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000587 if( exp1.type == NULL )
588 {
Eric Pouechd33bcb62000-03-15 19:57:20 +0000589 RaiseException(DEBUG_STATUS_BAD_TYPE, 0, 0, NULL);
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000590 }
Eric Pouechd33bcb62000-03-15 19:57:20 +0000591 rtn.addr.seg = 0;
592 rtn.addr.off = (unsigned int) &exp->un.unop.result;
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000593 if( exp1.type == DEBUG_TypeIntConst )
594 {
595 rtn.type = exp1.type;
596 }
597 else
598 {
599 rtn.type = DEBUG_TypeInt;
600 }
Eric Pouech3b50d211999-05-24 08:14:30 +0000601 switch(exp->un.unop.unop_type)
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000602 {
603 case EXP_OP_NEG:
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000604 exp->un.unop.result = -VAL(exp1);
605 break;
606 case EXP_OP_NOT:
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000607 exp->un.unop.result = !VAL(exp1);
608 break;
609 case EXP_OP_LNOT:
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000610 exp->un.unop.result = ~VAL(exp1);
611 break;
612 case EXP_OP_DEREF:
Eric Pouechd33bcb62000-03-15 19:57:20 +0000613 rtn.cookie = exp1.cookie;
614 rtn.addr.off = (unsigned int) DEBUG_TypeDerefPointer(&exp1, &rtn.type);
615 if (!rtn.type)
616 {
617 RaiseException(DEBUG_STATUS_BAD_TYPE, 0, 0, NULL);
618 }
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000619 break;
620 case EXP_OP_FORCE_DEREF:
Eric Pouechd33bcb62000-03-15 19:57:20 +0000621 rtn.cookie = exp1.cookie;
622 rtn.addr.seg = exp1.addr.seg;
623 if (exp1.cookie == DV_TARGET)
624 DEBUG_READ_MEM((void*)exp1.addr.off, &rtn.addr.off, sizeof(rtn.addr.off));
625 else
626 memcpy(&rtn.addr.off, (void*)exp1.addr.off, sizeof(rtn.addr.off));
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000627 break;
628 case EXP_OP_ADDR:
Eric Pouechd33bcb62000-03-15 19:57:20 +0000629 /* FIXME: even for a 16 bit entity ? */
630 rtn.cookie = DV_TARGET;
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000631 rtn.type = DEBUG_FindOrMakePointerType(exp1.type);
Eric Pouechd33bcb62000-03-15 19:57:20 +0000632 exp->un.unop.result = exp1.addr.off;
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000633 break;
Eric Pouechd33bcb62000-03-15 19:57:20 +0000634 default:
635 RaiseException(DEBUG_STATUS_INTERNAL_ERROR, 0, 0, NULL);
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000636 }
637 break;
638 default:
Eric Poueche5efa0c2000-04-13 19:31:58 +0000639 DEBUG_Printf(DBG_CHN_MESG,"Unexpected expression (%d).\n", exp->type);
Eric Pouechd33bcb62000-03-15 19:57:20 +0000640 RaiseException(DEBUG_STATUS_INTERNAL_ERROR, 0, 0, NULL);
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000641 break;
642 }
643
Eric Pouechd33bcb62000-03-15 19:57:20 +0000644 assert(rtn.cookie == DV_TARGET || rtn.cookie == DV_HOST);
645
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000646 return rtn;
647}
648
649
650int
Eric Pouechd33bcb62000-03-15 19:57:20 +0000651DEBUG_DisplayExpr(const struct expr * exp)
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000652{
653 int i;
654
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000655 switch(exp->type)
656 {
Alexandre Julliard01d63461997-01-20 19:43:45 +0000657 case EXPR_TYPE_CAST:
Eric Poueche5efa0c2000-04-13 19:31:58 +0000658 DEBUG_Printf(DBG_CHN_MESG, "((");
Alexandre Julliard01d63461997-01-20 19:43:45 +0000659 DEBUG_PrintTypeCast(exp->un.cast.cast);
Eric Poueche5efa0c2000-04-13 19:31:58 +0000660 DEBUG_Printf(DBG_CHN_MESG, ")");
Alexandre Julliard01d63461997-01-20 19:43:45 +0000661 DEBUG_DisplayExpr(exp->un.cast.expr);
Eric Poueche5efa0c2000-04-13 19:31:58 +0000662 DEBUG_Printf(DBG_CHN_MESG, ")");
Alexandre Julliard01d63461997-01-20 19:43:45 +0000663 break;
Eric Pouech04c16b82000-04-30 12:21:15 +0000664 case EXPR_TYPE_INTVAR:
665 DEBUG_Printf(DBG_CHN_MESG, "$%s", exp->un.intvar.name);
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000666 break;
667 case EXPR_TYPE_US_CONST:
Eric Poueche5efa0c2000-04-13 19:31:58 +0000668 DEBUG_Printf(DBG_CHN_MESG, "%ud", exp->un.u_const.value);
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000669 break;
670 case EXPR_TYPE_CONST:
Eric Poueche5efa0c2000-04-13 19:31:58 +0000671 DEBUG_Printf(DBG_CHN_MESG, "%d", exp->un.u_const.value);
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000672 break;
673 case EXPR_TYPE_STRING:
Eric Poueche5efa0c2000-04-13 19:31:58 +0000674 DEBUG_Printf(DBG_CHN_MESG, "\"%s\"", exp->un.string.str);
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000675 break;
676 case EXPR_TYPE_SYMBOL:
Eric Poueche5efa0c2000-04-13 19:31:58 +0000677 DEBUG_Printf(DBG_CHN_MESG, "%s" , exp->un.symbol.name);
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000678 break;
679 case EXPR_TYPE_PSTRUCT:
680 DEBUG_DisplayExpr(exp->un.structure.exp1);
Eric Poueche5efa0c2000-04-13 19:31:58 +0000681 DEBUG_Printf(DBG_CHN_MESG, "->%s", exp->un.structure.element_name);
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000682 break;
683 case EXPR_TYPE_STRUCT:
684 DEBUG_DisplayExpr(exp->un.structure.exp1);
Eric Poueche5efa0c2000-04-13 19:31:58 +0000685 DEBUG_Printf(DBG_CHN_MESG, ".%s", exp->un.structure.element_name);
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000686 break;
687 case EXPR_TYPE_CALL:
Eric Poueche5efa0c2000-04-13 19:31:58 +0000688 DEBUG_Printf(DBG_CHN_MESG, "%s(",exp->un.call.funcname);
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000689 for(i=0; i < exp->un.call.nargs; i++)
690 {
691 DEBUG_DisplayExpr(exp->un.call.arg[i]);
692 if( i != exp->un.call.nargs - 1 )
693 {
Eric Poueche5efa0c2000-04-13 19:31:58 +0000694 DEBUG_Printf(DBG_CHN_MESG, ", ");
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000695 }
696 }
Eric Poueche5efa0c2000-04-13 19:31:58 +0000697 DEBUG_Printf(DBG_CHN_MESG, ")");
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000698 break;
699 case EXPR_TYPE_BINOP:
Eric Poueche5efa0c2000-04-13 19:31:58 +0000700 DEBUG_Printf(DBG_CHN_MESG, "( ");
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000701 DEBUG_DisplayExpr(exp->un.binop.exp1);
702 switch(exp->un.binop.binop_type)
703 {
704 case EXP_OP_ADD:
Eric Poueche5efa0c2000-04-13 19:31:58 +0000705 DEBUG_Printf(DBG_CHN_MESG, " + ");
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000706 break;
707 case EXP_OP_SUB:
Eric Poueche5efa0c2000-04-13 19:31:58 +0000708 DEBUG_Printf(DBG_CHN_MESG, " - ");
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000709 break;
710 case EXP_OP_SEG:
Eric Poueche5efa0c2000-04-13 19:31:58 +0000711 DEBUG_Printf(DBG_CHN_MESG, ":");
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000712 break;
713 case EXP_OP_LOR:
Eric Poueche5efa0c2000-04-13 19:31:58 +0000714 DEBUG_Printf(DBG_CHN_MESG, " || ");
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000715 break;
716 case EXP_OP_LAND:
Eric Poueche5efa0c2000-04-13 19:31:58 +0000717 DEBUG_Printf(DBG_CHN_MESG, " && ");
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000718 break;
719 case EXP_OP_OR:
Eric Poueche5efa0c2000-04-13 19:31:58 +0000720 DEBUG_Printf(DBG_CHN_MESG, " | ");
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000721 break;
722 case EXP_OP_AND:
Eric Poueche5efa0c2000-04-13 19:31:58 +0000723 DEBUG_Printf(DBG_CHN_MESG, " & ");
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000724 break;
725 case EXP_OP_XOR:
Eric Poueche5efa0c2000-04-13 19:31:58 +0000726 DEBUG_Printf(DBG_CHN_MESG, " ^ ");
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000727 break;
728 case EXP_OP_EQ:
Eric Poueche5efa0c2000-04-13 19:31:58 +0000729 DEBUG_Printf(DBG_CHN_MESG, " == ");
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000730 break;
731 case EXP_OP_GT:
Eric Poueche5efa0c2000-04-13 19:31:58 +0000732 DEBUG_Printf(DBG_CHN_MESG, " > ");
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000733 break;
734 case EXP_OP_LT:
Eric Poueche5efa0c2000-04-13 19:31:58 +0000735 DEBUG_Printf(DBG_CHN_MESG, " < ");
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000736 break;
737 case EXP_OP_GE:
Eric Poueche5efa0c2000-04-13 19:31:58 +0000738 DEBUG_Printf(DBG_CHN_MESG, " >= ");
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000739 break;
740 case EXP_OP_LE:
Eric Poueche5efa0c2000-04-13 19:31:58 +0000741 DEBUG_Printf(DBG_CHN_MESG, " <= ");
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000742 break;
743 case EXP_OP_NE:
Eric Poueche5efa0c2000-04-13 19:31:58 +0000744 DEBUG_Printf(DBG_CHN_MESG, " != ");
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000745 break;
746 case EXP_OP_SHL:
Eric Poueche5efa0c2000-04-13 19:31:58 +0000747 DEBUG_Printf(DBG_CHN_MESG, " << ");
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000748 break;
749 case EXP_OP_SHR:
Eric Poueche5efa0c2000-04-13 19:31:58 +0000750 DEBUG_Printf(DBG_CHN_MESG, " >> ");
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000751 break;
752 case EXP_OP_MUL:
Eric Poueche5efa0c2000-04-13 19:31:58 +0000753 DEBUG_Printf(DBG_CHN_MESG, " * ");
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000754 break;
755 case EXP_OP_DIV:
Eric Poueche5efa0c2000-04-13 19:31:58 +0000756 DEBUG_Printf(DBG_CHN_MESG, " / ");
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000757 break;
758 case EXP_OP_REM:
Eric Poueche5efa0c2000-04-13 19:31:58 +0000759 DEBUG_Printf(DBG_CHN_MESG, " %% ");
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000760 break;
761 case EXP_OP_ARR:
Eric Poueche5efa0c2000-04-13 19:31:58 +0000762 DEBUG_Printf(DBG_CHN_MESG, "[");
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000763 break;
764 default:
765 break;
766 }
767 DEBUG_DisplayExpr(exp->un.binop.exp2);
768 if( exp->un.binop.binop_type == EXP_OP_ARR )
769 {
Eric Poueche5efa0c2000-04-13 19:31:58 +0000770 DEBUG_Printf(DBG_CHN_MESG, "]");
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000771 }
Eric Poueche5efa0c2000-04-13 19:31:58 +0000772 DEBUG_Printf(DBG_CHN_MESG, " )");
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000773 break;
774 case EXPR_TYPE_UNOP:
Eric Pouech3b50d211999-05-24 08:14:30 +0000775 switch(exp->un.unop.unop_type)
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000776 {
777 case EXP_OP_NEG:
Eric Poueche5efa0c2000-04-13 19:31:58 +0000778 DEBUG_Printf(DBG_CHN_MESG, "-");
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000779 break;
780 case EXP_OP_NOT:
Eric Poueche5efa0c2000-04-13 19:31:58 +0000781 DEBUG_Printf(DBG_CHN_MESG, "!");
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000782 break;
783 case EXP_OP_LNOT:
Eric Poueche5efa0c2000-04-13 19:31:58 +0000784 DEBUG_Printf(DBG_CHN_MESG, "~");
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000785 break;
786 case EXP_OP_DEREF:
Eric Poueche5efa0c2000-04-13 19:31:58 +0000787 DEBUG_Printf(DBG_CHN_MESG, "*");
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000788 break;
789 case EXP_OP_ADDR:
Eric Poueche5efa0c2000-04-13 19:31:58 +0000790 DEBUG_Printf(DBG_CHN_MESG, "&");
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000791 break;
792 }
793 DEBUG_DisplayExpr(exp->un.unop.exp1);
794 break;
795 default:
Eric Poueche5efa0c2000-04-13 19:31:58 +0000796 DEBUG_Printf(DBG_CHN_MESG,"Unexpected expression.\n");
Eric Pouechd33bcb62000-03-15 19:57:20 +0000797 RaiseException(DEBUG_STATUS_INTERNAL_ERROR, 0, 0, NULL);
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000798 break;
799 }
800
801 return TRUE;
802}
803
804struct expr *
Eric Pouechd33bcb62000-03-15 19:57:20 +0000805DEBUG_CloneExpr(const struct expr * exp)
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000806{
807 int i;
808 struct expr * rtn;
809
Ove Kaavendda17c61999-04-25 12:24:42 +0000810 rtn = (struct expr *) DBG_alloc(sizeof(struct expr));
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000811
812 /*
813 * First copy the contents of the expression itself.
814 */
815 *rtn = *exp;
816
817
818 switch(exp->type)
819 {
Alexandre Julliard01d63461997-01-20 19:43:45 +0000820 case EXPR_TYPE_CAST:
821 rtn->un.cast.expr = DEBUG_CloneExpr(exp->un.cast.expr);
822 break;
Eric Pouech04c16b82000-04-30 12:21:15 +0000823 case EXPR_TYPE_INTVAR:
824 rtn->un.intvar.name = DBG_strdup(exp->un.intvar.name);
825 break;
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000826 case EXPR_TYPE_US_CONST:
827 case EXPR_TYPE_CONST:
828 break;
829 case EXPR_TYPE_STRING:
Ove Kaavendda17c61999-04-25 12:24:42 +0000830 rtn->un.string.str = DBG_strdup(exp->un.string.str);
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000831 break;
832 case EXPR_TYPE_SYMBOL:
Ove Kaavendda17c61999-04-25 12:24:42 +0000833 rtn->un.symbol.name = DBG_strdup(exp->un.symbol.name);
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000834 break;
835 case EXPR_TYPE_PSTRUCT:
836 case EXPR_TYPE_STRUCT:
837 rtn->un.structure.exp1 = DEBUG_CloneExpr(exp->un.structure.exp1);
Ove Kaavendda17c61999-04-25 12:24:42 +0000838 rtn->un.structure.element_name = DBG_strdup(exp->un.structure.element_name);
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000839 break;
840 case EXPR_TYPE_CALL:
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000841 for(i=0; i < exp->un.call.nargs; i++)
842 {
843 rtn->un.call.arg[i] = DEBUG_CloneExpr(exp->un.call.arg[i]);
844 }
Ove Kaavendda17c61999-04-25 12:24:42 +0000845 rtn->un.call.funcname = DBG_strdup(exp->un.call.funcname);
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000846 break;
847 case EXPR_TYPE_BINOP:
848 rtn->un.binop.exp1 = DEBUG_CloneExpr(exp->un.binop.exp1);
849 rtn->un.binop.exp2 = DEBUG_CloneExpr(exp->un.binop.exp2);
850 break;
851 case EXPR_TYPE_UNOP:
852 rtn->un.unop.exp1 = DEBUG_CloneExpr(exp->un.unop.exp1);
853 break;
854 default:
Eric Poueche5efa0c2000-04-13 19:31:58 +0000855 DEBUG_Printf(DBG_CHN_MESG,"Unexpected expression.\n");
Eric Pouechd33bcb62000-03-15 19:57:20 +0000856 RaiseException(DEBUG_STATUS_INTERNAL_ERROR, 0, 0, NULL);
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000857 break;
858 }
859
860 return rtn;
861}
862
863
864/*
865 * Recursively go through an expression tree and free all memory associated
866 * with it.
867 */
868int
869DEBUG_FreeExpr(struct expr * exp)
870{
871 int i;
872
873 switch(exp->type)
874 {
Alexandre Julliard01d63461997-01-20 19:43:45 +0000875 case EXPR_TYPE_CAST:
876 DEBUG_FreeExpr(exp->un.cast.expr);
877 break;
Eric Pouech04c16b82000-04-30 12:21:15 +0000878 case EXPR_TYPE_INTVAR:
879 DBG_free((char *) exp->un.intvar.name);
880 break;
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000881 case EXPR_TYPE_US_CONST:
882 case EXPR_TYPE_CONST:
883 break;
884 case EXPR_TYPE_STRING:
Ove Kaavendda17c61999-04-25 12:24:42 +0000885 DBG_free((char *) exp->un.string.str);
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000886 break;
887 case EXPR_TYPE_SYMBOL:
Ove Kaavendda17c61999-04-25 12:24:42 +0000888 DBG_free((char *) exp->un.symbol.name);
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000889 break;
890 case EXPR_TYPE_PSTRUCT:
891 case EXPR_TYPE_STRUCT:
892 DEBUG_FreeExpr(exp->un.structure.exp1);
Ove Kaavendda17c61999-04-25 12:24:42 +0000893 DBG_free((char *) exp->un.structure.element_name);
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000894 break;
895 case EXPR_TYPE_CALL:
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000896 for(i=0; i < exp->un.call.nargs; i++)
897 {
898 DEBUG_FreeExpr(exp->un.call.arg[i]);
899 }
Ove Kaavendda17c61999-04-25 12:24:42 +0000900 DBG_free((char *) exp->un.call.funcname);
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000901 break;
902 case EXPR_TYPE_BINOP:
903 DEBUG_FreeExpr(exp->un.binop.exp1);
904 DEBUG_FreeExpr(exp->un.binop.exp2);
905 break;
906 case EXPR_TYPE_UNOP:
907 DEBUG_FreeExpr(exp->un.unop.exp1);
908 break;
909 default:
Eric Poueche5efa0c2000-04-13 19:31:58 +0000910 DEBUG_Printf(DBG_CHN_MESG,"Unexpected expression.\n");
Eric Pouechd33bcb62000-03-15 19:57:20 +0000911 RaiseException(DEBUG_STATUS_INTERNAL_ERROR, 0, 0, NULL);
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000912 break;
913 }
914
Ove Kaavendda17c61999-04-25 12:24:42 +0000915 DBG_free(exp);
Alexandre Julliardc6c09441997-01-12 18:32:19 +0000916 return TRUE;
917}