Avoid SIGSTOP/SIGCONT race when ptrace is disabled.
[wine/wine-kai.git] / debugger / expr.c
blob877a1db596307422d324e0cb193f684c82672f3a
1 /*
2 * File expr.c - expression handling for Wine internal debugger.
4 * Copyright (C) 1997, Eric Youngdale.
6 */
8 #include "config.h"
9 #include <stdlib.h>
10 #include <stdio.h>
11 #include <string.h>
12 #include <assert.h>
13 #include "winbase.h"
14 #include "wine/winbase16.h"
15 #include "task.h"
16 #include "debugger.h"
17 #include "expr.h"
19 #include <stdarg.h>
21 struct expr
23 unsigned int perm;
24 unsigned int type:31;
25 union
27 struct
29 int value;
30 } constant;
32 struct
34 const char * str;
35 } string;
37 struct
39 unsigned int value;
40 } u_const;
42 struct
44 const char * name;
45 } symbol;
47 struct
49 enum debug_regs reg;
50 int result;
51 } rgister;
53 struct
55 int unop_type;
56 struct expr * exp1;
57 int result;
58 } unop;
60 struct
62 int binop_type;
63 int result;
64 struct expr * exp1;
65 struct expr * exp2;
66 } binop;
68 struct
70 struct datatype * cast;
71 struct expr * expr;
72 } cast;
74 struct
76 struct expr * exp1;
77 const char * element_name;
78 int result;
79 } structure;
81 struct
83 struct expr * base;
84 struct expr * index;
85 } array;
87 struct
89 const char * funcname;
90 int nargs;
91 int result;
92 struct expr * arg[5];
93 } call;
95 } un;
98 #define EXPR_TYPE_CONST 0
99 #define EXPR_TYPE_US_CONST 1
100 #define EXPR_TYPE_SYMBOL 2
101 #define EXPR_TYPE_REGISTER 3
102 #define EXPR_TYPE_BINOP 4
103 #define EXPR_TYPE_UNOP 5
104 #define EXPR_TYPE_STRUCT 6
105 #define EXPR_TYPE_PSTRUCT 7
106 #define EXPR_TYPE_ARRAY 8
107 #define EXPR_TYPE_CALL 9
108 #define EXPR_TYPE_STRING 10
109 #define EXPR_TYPE_CAST 11
111 static char expr_list[4096];
112 static int next_expr_free = 0;
115 * This is how we turn an expression address into the actual value.
116 * This works well in the 32 bit domain - not sure at all about the
117 * 16 bit world.
119 #define VAL(_exp) DEBUG_GetExprValue(&_exp, NULL)
121 static
122 struct expr *
123 DEBUG_GetFreeExpr()
125 struct expr * rtn;
127 rtn = (struct expr *) &expr_list[next_expr_free];
129 next_expr_free += sizeof(struct expr);
130 assert(next_expr_free < sizeof(expr_list));
132 return rtn;
135 void
136 DEBUG_FreeExprMem()
138 next_expr_free = 0;
141 struct expr *
142 DEBUG_TypeCastExpr(struct datatype * dt, struct expr * exp)
144 struct expr * ex;
146 ex = DEBUG_GetFreeExpr();
148 ex->type = EXPR_TYPE_CAST;
149 ex->un.cast.cast = dt;
150 ex->un.cast.expr = exp;
151 return ex;
154 struct expr *
155 DEBUG_RegisterExpr(enum debug_regs regno)
157 struct expr * ex;
159 ex = DEBUG_GetFreeExpr();
161 ex->type = EXPR_TYPE_REGISTER;
162 ex->un.rgister.reg = regno;
163 return ex;
166 struct expr *
167 DEBUG_SymbolExpr(const char * name)
169 struct expr * ex;
171 ex = DEBUG_GetFreeExpr();
173 ex->type = EXPR_TYPE_SYMBOL;
174 ex->un.symbol.name = name;
175 return ex;
178 struct expr *
179 DEBUG_ConstExpr(int value)
181 struct expr * ex;
183 ex = DEBUG_GetFreeExpr();
185 ex->type = EXPR_TYPE_CONST;
186 ex->un.constant.value = value;
187 return ex;
190 struct expr *
191 DEBUG_StringExpr(const char * str)
193 struct expr * ex;
194 char * pnt;
195 ex = DEBUG_GetFreeExpr();
197 ex->type = EXPR_TYPE_STRING;
198 ex->un.string.str = str+1;
199 pnt = strrchr(ex->un.string.str, '"');
200 if( pnt != NULL )
202 *pnt = '\0';
204 return ex;
207 struct expr *
208 DEBUG_USConstExpr(unsigned int value)
210 struct expr * ex;
212 ex = DEBUG_GetFreeExpr();
214 ex->type = EXPR_TYPE_CONST;
215 ex->un.u_const.value = value;
216 return ex;
219 struct expr *
220 DEBUG_BinopExpr(int operator_type, struct expr * exp1, struct expr * exp2)
222 struct expr * ex;
224 ex = DEBUG_GetFreeExpr();
226 ex->type = EXPR_TYPE_BINOP;
227 ex->un.binop.binop_type = operator_type;
228 ex->un.binop.exp1 = exp1;
229 ex->un.binop.exp2 = exp2;
230 return ex;
233 struct expr *
234 DEBUG_UnopExpr(int operator_type, struct expr * exp1)
236 struct expr * ex;
238 ex = DEBUG_GetFreeExpr();
240 ex->type = EXPR_TYPE_UNOP;
241 ex->un.unop.unop_type = operator_type;
242 ex->un.unop.exp1 = exp1;
243 return ex;
246 struct expr *
247 DEBUG_StructExpr(struct expr * exp, const char * element)
249 struct expr * ex;
251 ex = DEBUG_GetFreeExpr();
253 ex->type = EXPR_TYPE_STRUCT;
254 ex->un.structure.exp1 = exp;
255 ex->un.structure.element_name = element;
256 return ex;
259 struct expr *
260 DEBUG_StructPExpr(struct expr * exp, const char * element)
262 struct expr * ex;
264 ex = DEBUG_GetFreeExpr();
266 ex->type = EXPR_TYPE_PSTRUCT;
267 ex->un.structure.exp1 = exp;
268 ex->un.structure.element_name = element;
269 return ex;
272 struct expr *
273 DEBUG_CallExpr(const char * funcname, int nargs, ...)
275 struct expr * ex;
276 va_list ap;
277 int i;
279 ex = DEBUG_GetFreeExpr();
281 ex->type = EXPR_TYPE_CALL;
282 ex->un.call.funcname = funcname;
283 ex->un.call.nargs = nargs;
285 va_start(ap, nargs);
286 for(i=0; i < nargs; i++)
288 ex->un.call.arg[i] = va_arg(ap, struct expr *);
290 va_end(ap);
291 return ex;
294 DBG_ADDR
295 DEBUG_EvalExpr(struct expr * exp)
297 DBG_ADDR rtn;
298 int i;
299 DBG_ADDR exp1;
300 DBG_ADDR exp2;
301 unsigned int cexp[5];
302 int scale1;
303 int scale2;
304 int scale3;
305 struct datatype * type1;
306 struct datatype * type2;
308 rtn.type = NULL;
309 rtn.off = NULL;
310 rtn.seg = NULL;
312 switch(exp->type)
314 case EXPR_TYPE_CAST:
315 rtn = DEBUG_EvalExpr(exp->un.cast.expr);
316 rtn.type = exp->un.cast.cast;
317 break;
318 case EXPR_TYPE_STRING:
319 rtn.type = DEBUG_TypeString;
320 rtn.off = (unsigned int) &exp->un.string.str;
321 rtn.seg = 0;
322 break;
323 case EXPR_TYPE_CONST:
324 rtn.type = DEBUG_TypeIntConst;
325 rtn.off = (unsigned int) &exp->un.constant.value;
326 rtn.seg = 0;
327 break;
328 case EXPR_TYPE_US_CONST:
329 rtn.type = DEBUG_TypeUSInt;
330 rtn.off = (unsigned int) &exp->un.u_const.value;
331 rtn.seg = 0;
332 break;
333 case EXPR_TYPE_SYMBOL:
334 if( !DEBUG_GetSymbolValue(exp->un.symbol.name, -1, &rtn, FALSE) )
336 RaiseException(DEBUG_STATUS_NO_SYMBOL, 0, 0, NULL);
338 break;
339 case EXPR_TYPE_PSTRUCT:
340 exp1 = DEBUG_EvalExpr(exp->un.structure.exp1);
341 if( exp1.type == NULL )
343 break;
345 rtn.off = DEBUG_TypeDerefPointer(&exp1, &type1);
346 if( type1 == NULL )
348 break;
350 rtn.type = type1;
351 DEBUG_FindStructElement(&rtn, exp->un.structure.element_name,
352 &exp->un.structure.result);
353 break;
354 case EXPR_TYPE_STRUCT:
355 exp1 = DEBUG_EvalExpr(exp->un.structure.exp1);
356 if( exp1.type == NULL )
358 break;
360 rtn = exp1;
361 DEBUG_FindStructElement(&rtn, exp->un.structure.element_name,
362 &exp->un.structure.result);
363 break;
364 case EXPR_TYPE_CALL:
366 * First, evaluate all of the arguments. If any of them are not
367 * evaluable, then bail.
369 for(i=0; i < exp->un.call.nargs; i++)
371 exp1 = DEBUG_EvalExpr(exp->un.call.arg[i]);
372 if( exp1.type == NULL )
374 return rtn;
376 cexp[i] = DEBUG_GetExprValue(&exp1, NULL);
380 * Now look up the address of the function itself.
382 if( !DEBUG_GetSymbolValue(exp->un.call.funcname, -1, &rtn, FALSE ) )
384 fprintf(stderr, "Failed to find symbol\n");
385 break;
388 #if 0
389 /* FIXME: NEWDBG NIY */
390 /* Anyway, I wonder how this could work depending on the calling order of
391 * the function (cdecl vs pascal for example)
393 int (*fptr)();
395 fptr = (int (*)()) rtn.off;
396 switch(exp->un.call.nargs)
398 case 0:
399 exp->un.call.result = (*fptr)();
400 break;
401 case 1:
402 exp->un.call.result = (*fptr)(cexp[0]);
403 break;
404 case 2:
405 exp->un.call.result = (*fptr)(cexp[0], cexp[1]);
406 break;
407 case 3:
408 exp->un.call.result = (*fptr)(cexp[0], cexp[1], cexp[2]);
409 break;
410 case 4:
411 exp->un.call.result = (*fptr)(cexp[0], cexp[1], cexp[2], cexp[3]);
412 break;
413 case 5:
414 exp->un.call.result = (*fptr)(cexp[0], cexp[1], cexp[2], cexp[3], cexp[4]);
415 break;
417 #else
418 fprintf(stderr, "Function call no longer implemented\n");
419 /* would need to set up a call to this function, and then restore the current
420 * context afterwards...
422 exp->un.call.result = 0;
423 #endif
424 rtn.type = DEBUG_TypeInt;
425 rtn.off = (unsigned int) &exp->un.call.result;
427 break;
428 case EXPR_TYPE_REGISTER:
429 rtn.type = DEBUG_TypeIntConst;
430 exp->un.rgister.result = DEBUG_GetRegister(exp->un.rgister.reg);
431 rtn.off = (unsigned int) &exp->un.rgister.result;
432 #ifdef __i386__
433 if( exp->un.rgister.reg == REG_EIP )
434 rtn.seg = DEBUG_context.SegCs;
435 else
436 rtn.seg = DEBUG_context.SegDs;
437 #endif
438 DEBUG_FixAddress( &rtn, 0 );
439 break;
440 case EXPR_TYPE_BINOP:
441 exp1 = DEBUG_EvalExpr(exp->un.binop.exp1);
442 exp2 = DEBUG_EvalExpr(exp->un.binop.exp2);
443 if( exp1.type == NULL || exp2.type == NULL )
445 break;
447 if( exp1.type == DEBUG_TypeIntConst && exp2.type == DEBUG_TypeIntConst )
449 rtn.type = exp1.type;
451 else
453 rtn.type = DEBUG_TypeInt;
455 rtn.off = (unsigned int) &exp->un.binop.result;
456 switch(exp->un.binop.binop_type)
458 case EXP_OP_ADD:
459 type1 = DEBUG_GetPointerType(exp1.type);
460 type2 = DEBUG_GetPointerType(exp2.type);
461 scale1 = 1;
462 scale2 = 1;
463 if( type1 != NULL && type2 != NULL )
465 break;
467 else if( type1 != NULL )
469 scale2 = DEBUG_GetObjectSize(type1);
470 rtn.type = exp1.type;
472 else if( type2 != NULL )
474 scale1 = DEBUG_GetObjectSize(type2);
475 rtn.type = exp2.type;
477 rtn.seg = 0;
478 exp->un.binop.result = (VAL(exp1) * scale1 + scale2 * VAL(exp2));
479 break;
480 case EXP_OP_SUB:
481 type1 = DEBUG_GetPointerType(exp1.type);
482 type2 = DEBUG_GetPointerType(exp2.type);
483 scale1 = 1;
484 scale2 = 1;
485 scale3 = 1;
486 if( type1 != NULL && type2 != NULL )
488 if( type1 != type2 )
490 break;
492 scale3 = DEBUG_GetObjectSize(type1);
494 else if( type1 != NULL )
496 scale2 = DEBUG_GetObjectSize(type1);
497 rtn.type = exp1.type;
500 else if( type2 != NULL )
502 scale1 = DEBUG_GetObjectSize(type2);
503 rtn.type = exp2.type;
505 rtn.seg = 0;
506 exp->un.binop.result = (VAL(exp1) - VAL(exp2)) / scale3;
507 break;
508 case EXP_OP_SEG:
509 rtn.seg = VAL(exp1);
510 exp->un.binop.result = VAL(exp2);
511 #ifdef __i386__
512 DEBUG_FixSegment(&rtn);
513 #endif
514 break;
515 case EXP_OP_LOR:
516 rtn.seg = 0;
517 exp->un.binop.result = (VAL(exp1) || VAL(exp2));
518 break;
519 case EXP_OP_LAND:
520 rtn.seg = 0;
521 exp->un.binop.result = (VAL(exp1) && VAL(exp2));
522 break;
523 case EXP_OP_OR:
524 rtn.seg = 0;
525 exp->un.binop.result = (VAL(exp1) | VAL(exp2));
526 break;
527 case EXP_OP_AND:
528 rtn.seg = 0;
529 exp->un.binop.result = (VAL(exp1) & VAL(exp2));
530 break;
531 case EXP_OP_XOR:
532 rtn.seg = 0;
533 exp->un.binop.result = (VAL(exp1) ^ VAL(exp2));
534 break;
535 case EXP_OP_EQ:
536 rtn.seg = 0;
537 exp->un.binop.result = (VAL(exp1) == VAL(exp2));
538 break;
539 case EXP_OP_GT:
540 rtn.seg = 0;
541 exp->un.binop.result = (VAL(exp1) > VAL(exp2));
542 break;
543 case EXP_OP_LT:
544 rtn.seg = 0;
545 exp->un.binop.result = (VAL(exp1) < VAL(exp2));
546 break;
547 case EXP_OP_GE:
548 rtn.seg = 0;
549 exp->un.binop.result = (VAL(exp1) >= VAL(exp2));
550 break;
551 case EXP_OP_LE:
552 rtn.seg = 0;
553 exp->un.binop.result = (VAL(exp1) <= VAL(exp2));
554 break;
555 case EXP_OP_NE:
556 rtn.seg = 0;
557 exp->un.binop.result = (VAL(exp1) != VAL(exp2));
558 break;
559 case EXP_OP_SHL:
560 rtn.seg = 0;
561 exp->un.binop.result = ((unsigned) VAL(exp1) << VAL(exp2));
562 break;
563 case EXP_OP_SHR:
564 rtn.seg = 0;
565 exp->un.binop.result = ((unsigned) VAL(exp1) >> VAL(exp2));
566 break;
567 case EXP_OP_MUL:
568 rtn.seg = 0;
569 exp->un.binop.result = (VAL(exp1) * VAL(exp2));
570 break;
571 case EXP_OP_DIV:
572 if( VAL(exp2) != 0 )
574 rtn.seg = 0;
575 exp->un.binop.result = (VAL(exp1) / VAL(exp2));
577 else
579 rtn.seg = 0;
580 rtn.type = NULL;
581 rtn.off = 0;
583 break;
584 case EXP_OP_REM:
585 if( VAL(exp2) != 0 )
587 rtn.seg = 0;
588 exp->un.binop.result = (VAL(exp1) % VAL(exp2));
590 else
592 rtn.seg = 0;
593 rtn.type = NULL;
594 rtn.off = 0;
596 break;
597 case EXP_OP_ARR:
598 DEBUG_ArrayIndex(&exp1, &rtn, VAL(exp2));
599 break;
600 default:
601 break;
603 break;
604 case EXPR_TYPE_UNOP:
605 exp1 = DEBUG_EvalExpr(exp->un.unop.exp1);
606 if( exp1.type == NULL )
608 break;
610 rtn.off = (unsigned int) &exp->un.unop.result;
611 if( exp1.type == DEBUG_TypeIntConst )
613 rtn.type = exp1.type;
615 else
617 rtn.type = DEBUG_TypeInt;
619 switch(exp->un.unop.unop_type)
621 case EXP_OP_NEG:
622 rtn.seg = 0;
623 exp->un.unop.result = -VAL(exp1);
624 break;
625 case EXP_OP_NOT:
626 rtn.seg = 0;
627 exp->un.unop.result = !VAL(exp1);
628 break;
629 case EXP_OP_LNOT:
630 rtn.seg = 0;
631 exp->un.unop.result = ~VAL(exp1);
632 break;
633 case EXP_OP_DEREF:
634 rtn.seg = 0;
635 rtn.off = (unsigned int) DEBUG_TypeDerefPointer(&exp1, &rtn.type);
636 break;
637 case EXP_OP_FORCE_DEREF:
638 rtn.seg = exp1.seg;
639 rtn.off = DEBUG_READ_MEM((void*)exp1.off, &rtn.off, sizeof(rtn.off));
640 break;
641 case EXP_OP_ADDR:
642 rtn.seg = 0;
643 rtn.type = DEBUG_FindOrMakePointerType(exp1.type);
644 exp->un.unop.result = exp1.off;
645 break;
647 break;
648 default:
649 fprintf(stderr,"Unexpected expression.\n");
650 DEBUG_Exit(123);
651 break;
654 return rtn;
659 DEBUG_DisplayExpr(struct expr * exp)
661 int i;
664 switch(exp->type)
666 case EXPR_TYPE_CAST:
667 fprintf(stderr, "((");
668 DEBUG_PrintTypeCast(exp->un.cast.cast);
669 fprintf(stderr, ")");
670 DEBUG_DisplayExpr(exp->un.cast.expr);
671 fprintf(stderr, ")");
672 break;
673 case EXPR_TYPE_REGISTER:
674 DEBUG_PrintRegister(exp->un.rgister.reg);
675 break;
676 case EXPR_TYPE_US_CONST:
677 fprintf(stderr, "%ud", exp->un.u_const.value);
678 break;
679 case EXPR_TYPE_CONST:
680 fprintf(stderr, "%d", exp->un.u_const.value);
681 break;
682 case EXPR_TYPE_STRING:
683 fprintf(stderr, "\"%s\"", exp->un.string.str);
684 break;
685 case EXPR_TYPE_SYMBOL:
686 fprintf(stderr, "%s" , exp->un.symbol.name);
687 break;
688 case EXPR_TYPE_PSTRUCT:
689 DEBUG_DisplayExpr(exp->un.structure.exp1);
690 fprintf(stderr, "->%s", exp->un.structure.element_name);
691 break;
692 case EXPR_TYPE_STRUCT:
693 DEBUG_DisplayExpr(exp->un.structure.exp1);
694 fprintf(stderr, ".%s", exp->un.structure.element_name);
695 break;
696 case EXPR_TYPE_CALL:
697 fprintf(stderr, "%s(",exp->un.call.funcname);
698 for(i=0; i < exp->un.call.nargs; i++)
700 DEBUG_DisplayExpr(exp->un.call.arg[i]);
701 if( i != exp->un.call.nargs - 1 )
703 fprintf(stderr, ", ");
706 fprintf(stderr, ")");
707 break;
708 case EXPR_TYPE_BINOP:
709 fprintf(stderr, "( ");
710 DEBUG_DisplayExpr(exp->un.binop.exp1);
711 switch(exp->un.binop.binop_type)
713 case EXP_OP_ADD:
714 fprintf(stderr, " + ");
715 break;
716 case EXP_OP_SUB:
717 fprintf(stderr, " - ");
718 break;
719 case EXP_OP_SEG:
720 fprintf(stderr, ":");
721 break;
722 case EXP_OP_LOR:
723 fprintf(stderr, " || ");
724 break;
725 case EXP_OP_LAND:
726 fprintf(stderr, " && ");
727 break;
728 case EXP_OP_OR:
729 fprintf(stderr, " | ");
730 break;
731 case EXP_OP_AND:
732 fprintf(stderr, " & ");
733 break;
734 case EXP_OP_XOR:
735 fprintf(stderr, " ^ ");
736 break;
737 case EXP_OP_EQ:
738 fprintf(stderr, " == ");
739 break;
740 case EXP_OP_GT:
741 fprintf(stderr, " > ");
742 break;
743 case EXP_OP_LT:
744 fprintf(stderr, " < ");
745 break;
746 case EXP_OP_GE:
747 fprintf(stderr, " >= ");
748 break;
749 case EXP_OP_LE:
750 fprintf(stderr, " <= ");
751 break;
752 case EXP_OP_NE:
753 fprintf(stderr, " != ");
754 break;
755 case EXP_OP_SHL:
756 fprintf(stderr, " << ");
757 break;
758 case EXP_OP_SHR:
759 fprintf(stderr, " >> ");
760 break;
761 case EXP_OP_MUL:
762 fprintf(stderr, " * ");
763 break;
764 case EXP_OP_DIV:
765 fprintf(stderr, " / ");
766 break;
767 case EXP_OP_REM:
768 fprintf(stderr, " %% ");
769 break;
770 case EXP_OP_ARR:
771 fprintf(stderr, "[");
772 break;
773 default:
774 break;
776 DEBUG_DisplayExpr(exp->un.binop.exp2);
777 if( exp->un.binop.binop_type == EXP_OP_ARR )
779 fprintf(stderr, "]");
781 fprintf(stderr, " )");
782 break;
783 case EXPR_TYPE_UNOP:
784 switch(exp->un.unop.unop_type)
786 case EXP_OP_NEG:
787 fprintf(stderr, "-");
788 break;
789 case EXP_OP_NOT:
790 fprintf(stderr, "!");
791 break;
792 case EXP_OP_LNOT:
793 fprintf(stderr, "~");
794 break;
795 case EXP_OP_DEREF:
796 fprintf(stderr, "*");
797 break;
798 case EXP_OP_ADDR:
799 fprintf(stderr, "&");
800 break;
802 DEBUG_DisplayExpr(exp->un.unop.exp1);
803 break;
804 default:
805 fprintf(stderr,"Unexpected expression.\n");
806 DEBUG_Exit(123);
807 break;
810 return TRUE;
813 struct expr *
814 DEBUG_CloneExpr(struct expr * exp)
816 int i;
817 struct expr * rtn;
819 rtn = (struct expr *) DBG_alloc(sizeof(struct expr));
822 * First copy the contents of the expression itself.
824 *rtn = *exp;
827 switch(exp->type)
829 case EXPR_TYPE_CAST:
830 rtn->un.cast.expr = DEBUG_CloneExpr(exp->un.cast.expr);
831 break;
832 case EXPR_TYPE_REGISTER:
833 case EXPR_TYPE_US_CONST:
834 case EXPR_TYPE_CONST:
835 break;
836 case EXPR_TYPE_STRING:
837 rtn->un.string.str = DBG_strdup(exp->un.string.str);
838 break;
839 case EXPR_TYPE_SYMBOL:
840 rtn->un.symbol.name = DBG_strdup(exp->un.symbol.name);
841 break;
842 case EXPR_TYPE_PSTRUCT:
843 case EXPR_TYPE_STRUCT:
844 rtn->un.structure.exp1 = DEBUG_CloneExpr(exp->un.structure.exp1);
845 rtn->un.structure.element_name = DBG_strdup(exp->un.structure.element_name);
846 break;
847 case EXPR_TYPE_CALL:
848 for(i=0; i < exp->un.call.nargs; i++)
850 rtn->un.call.arg[i] = DEBUG_CloneExpr(exp->un.call.arg[i]);
852 rtn->un.call.funcname = DBG_strdup(exp->un.call.funcname);
853 break;
854 case EXPR_TYPE_BINOP:
855 rtn->un.binop.exp1 = DEBUG_CloneExpr(exp->un.binop.exp1);
856 rtn->un.binop.exp2 = DEBUG_CloneExpr(exp->un.binop.exp2);
857 break;
858 case EXPR_TYPE_UNOP:
859 rtn->un.unop.exp1 = DEBUG_CloneExpr(exp->un.unop.exp1);
860 break;
861 default:
862 fprintf(stderr,"Unexpected expression.\n");
863 DEBUG_Exit(123);
864 break;
867 return rtn;
872 * Recursively go through an expression tree and free all memory associated
873 * with it.
876 DEBUG_FreeExpr(struct expr * exp)
878 int i;
880 switch(exp->type)
882 case EXPR_TYPE_CAST:
883 DEBUG_FreeExpr(exp->un.cast.expr);
884 break;
885 case EXPR_TYPE_REGISTER:
886 case EXPR_TYPE_US_CONST:
887 case EXPR_TYPE_CONST:
888 break;
889 case EXPR_TYPE_STRING:
890 DBG_free((char *) exp->un.string.str);
891 break;
892 case EXPR_TYPE_SYMBOL:
893 DBG_free((char *) exp->un.symbol.name);
894 break;
895 case EXPR_TYPE_PSTRUCT:
896 case EXPR_TYPE_STRUCT:
897 DEBUG_FreeExpr(exp->un.structure.exp1);
898 DBG_free((char *) exp->un.structure.element_name);
899 break;
900 case EXPR_TYPE_CALL:
901 for(i=0; i < exp->un.call.nargs; i++)
903 DEBUG_FreeExpr(exp->un.call.arg[i]);
905 DBG_free((char *) exp->un.call.funcname);
906 break;
907 case EXPR_TYPE_BINOP:
908 DEBUG_FreeExpr(exp->un.binop.exp1);
909 DEBUG_FreeExpr(exp->un.binop.exp2);
910 break;
911 case EXPR_TYPE_UNOP:
912 DEBUG_FreeExpr(exp->un.unop.exp1);
913 break;
914 default:
915 fprintf(stderr,"Unexpected expression.\n");
916 DEBUG_Exit(123);
917 break;
920 DBG_free(exp);
921 return TRUE;