2 * File expr.c - expression handling for Wine internal debugger.
4 * Copyright (C) 1997, Eric Youngdale.
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
25 #include "wine/winbase16.h"
79 struct datatype
* cast
;
86 const char * element_name
;
98 const char * funcname
;
101 struct expr
* arg
[5];
107 #define EXPR_TYPE_CONST 0
108 #define EXPR_TYPE_US_CONST 1
109 #define EXPR_TYPE_SYMBOL 2
110 #define EXPR_TYPE_INTVAR 3
111 #define EXPR_TYPE_BINOP 4
112 #define EXPR_TYPE_UNOP 5
113 #define EXPR_TYPE_STRUCT 6
114 #define EXPR_TYPE_PSTRUCT 7
115 #define EXPR_TYPE_ARRAY 8
116 #define EXPR_TYPE_CALL 9
117 #define EXPR_TYPE_STRING 10
118 #define EXPR_TYPE_CAST 11
120 static char expr_list
[4096];
121 static unsigned int next_expr_free
= 0;
124 * This is how we turn an expression address into the actual value.
125 * This works well in the 32 bit domain - not sure at all about the
128 #define VAL(_exp) DEBUG_GetExprValue(&_exp, NULL)
132 DEBUG_GetFreeExpr(void)
136 rtn
= (struct expr
*) &expr_list
[next_expr_free
];
138 next_expr_free
+= sizeof(struct expr
);
139 assert(next_expr_free
< sizeof(expr_list
));
145 DEBUG_FreeExprMem(void)
151 DEBUG_TypeCastExpr(struct datatype
* dt
, struct expr
* exp
)
155 ex
= DEBUG_GetFreeExpr();
157 ex
->type
= EXPR_TYPE_CAST
;
158 ex
->un
.cast
.cast
= dt
;
159 ex
->un
.cast
.expr
= exp
;
164 DEBUG_IntVarExpr(const char* name
)
168 ex
= DEBUG_GetFreeExpr();
170 ex
->type
= EXPR_TYPE_INTVAR
;
171 ex
->un
.intvar
.name
= name
;
176 DEBUG_SymbolExpr(const char * name
)
180 ex
= DEBUG_GetFreeExpr();
182 ex
->type
= EXPR_TYPE_SYMBOL
;
183 ex
->un
.symbol
.name
= name
;
188 DEBUG_ConstExpr(int value
)
192 ex
= DEBUG_GetFreeExpr();
194 ex
->type
= EXPR_TYPE_CONST
;
195 ex
->un
.constant
.value
= value
;
200 DEBUG_StringExpr(const char * str
)
204 ex
= DEBUG_GetFreeExpr();
206 ex
->type
= EXPR_TYPE_STRING
;
207 ex
->un
.string
.str
= str
+1;
208 pnt
= strrchr(ex
->un
.string
.str
, '"');
217 DEBUG_USConstExpr(unsigned int value
)
221 ex
= DEBUG_GetFreeExpr();
223 ex
->type
= EXPR_TYPE_CONST
;
224 ex
->un
.u_const
.value
= value
;
229 DEBUG_BinopExpr(int operator_type
, struct expr
* exp1
, struct expr
* exp2
)
233 ex
= DEBUG_GetFreeExpr();
235 ex
->type
= EXPR_TYPE_BINOP
;
236 ex
->un
.binop
.binop_type
= operator_type
;
237 ex
->un
.binop
.exp1
= exp1
;
238 ex
->un
.binop
.exp2
= exp2
;
243 DEBUG_UnopExpr(int operator_type
, struct expr
* exp1
)
247 ex
= DEBUG_GetFreeExpr();
249 ex
->type
= EXPR_TYPE_UNOP
;
250 ex
->un
.unop
.unop_type
= operator_type
;
251 ex
->un
.unop
.exp1
= exp1
;
256 DEBUG_StructExpr(struct expr
* exp
, const char * element
)
260 ex
= DEBUG_GetFreeExpr();
262 ex
->type
= EXPR_TYPE_STRUCT
;
263 ex
->un
.structure
.exp1
= exp
;
264 ex
->un
.structure
.element_name
= element
;
269 DEBUG_StructPExpr(struct expr
* exp
, const char * element
)
273 ex
= DEBUG_GetFreeExpr();
275 ex
->type
= EXPR_TYPE_PSTRUCT
;
276 ex
->un
.structure
.exp1
= exp
;
277 ex
->un
.structure
.element_name
= element
;
282 DEBUG_CallExpr(const char * funcname
, int nargs
, ...)
288 ex
= DEBUG_GetFreeExpr();
290 ex
->type
= EXPR_TYPE_CALL
;
291 ex
->un
.call
.funcname
= funcname
;
292 ex
->un
.call
.nargs
= nargs
;
295 for(i
=0; i
< nargs
; i
++)
297 ex
->un
.call
.arg
[i
] = va_arg(ap
, struct expr
*);
303 DBG_VALUE
DEBUG_EvalExpr(struct expr
* exp
)
309 unsigned int cexp
[5];
313 struct datatype
* type1
;
314 struct datatype
* type2
;
317 rtn
.cookie
= DV_INVALID
;
324 rtn
= DEBUG_EvalExpr(exp
->un
.cast
.expr
);
325 rtn
.type
= exp
->un
.cast
.cast
;
328 DEBUG_Printf(DBG_CHN_MESG
, "Can't cast to unknown type\n");
329 RaiseException(DEBUG_STATUS_BAD_TYPE
, 0, 0, NULL
);
331 if (DEBUG_GetType(rtn
.type
) == DT_POINTER
)
332 rtn
.cookie
= DV_TARGET
;
334 case EXPR_TYPE_STRING
:
335 rtn
.type
= DEBUG_GetBasicType(DT_BASIC_STRING
);
336 rtn
.cookie
= DV_HOST
;
337 rtn
.addr
.off
= (unsigned int) &exp
->un
.string
.str
;
340 case EXPR_TYPE_CONST
:
341 rtn
.type
= DEBUG_GetBasicType(DT_BASIC_CONST_INT
);
342 rtn
.cookie
= DV_HOST
;
343 rtn
.addr
.off
= (unsigned int) &exp
->un
.constant
.value
;
346 case EXPR_TYPE_US_CONST
:
347 rtn
.type
= DEBUG_GetBasicType(DT_BASIC_USHORTINT
);
348 rtn
.cookie
= DV_HOST
;
349 rtn
.addr
.off
= (unsigned int) &exp
->un
.u_const
.value
;
352 case EXPR_TYPE_SYMBOL
:
353 if( !DEBUG_GetSymbolValue(exp
->un
.symbol
.name
, -1, &rtn
, FALSE
) )
355 DEBUG_Printf(DBG_CHN_MESG
, "%s\n", exp
->un
.symbol
.name
);
356 RaiseException(DEBUG_STATUS_NO_SYMBOL
, 0, 0, NULL
);
359 case EXPR_TYPE_PSTRUCT
:
360 exp1
= DEBUG_EvalExpr(exp
->un
.structure
.exp1
);
361 if( exp1
.type
== NULL
)
363 RaiseException(DEBUG_STATUS_BAD_TYPE
, 0, 0, NULL
);
365 rtn
.cookie
= DV_TARGET
;
366 rtn
.addr
.off
= DEBUG_TypeDerefPointer(&exp1
, &rtn
.type
);
367 if( rtn
.type
== NULL
)
369 RaiseException(DEBUG_STATUS_BAD_TYPE
, 0, 0, NULL
);
371 if (!DEBUG_FindStructElement(&rtn
, exp
->un
.structure
.element_name
,
372 &exp
->un
.structure
.result
))
374 DEBUG_Printf(DBG_CHN_MESG
, "%s\n", exp
->un
.structure
.element_name
);
375 RaiseException(DEBUG_STATUS_NO_FIELD
, 0, 0, NULL
);
379 case EXPR_TYPE_STRUCT
:
380 exp1
= DEBUG_EvalExpr(exp
->un
.structure
.exp1
);
381 if( exp1
.type
== NULL
)
383 RaiseException(DEBUG_STATUS_BAD_TYPE
, 0, 0, NULL
);
386 if (!DEBUG_FindStructElement(&rtn
, exp
->un
.structure
.element_name
,
387 &exp
->un
.structure
.result
))
389 DEBUG_Printf(DBG_CHN_MESG
, "%s\n", exp
->un
.structure
.element_name
);
390 RaiseException(DEBUG_STATUS_NO_FIELD
, 0, 0, NULL
);
395 * First, evaluate all of the arguments. If any of them are not
396 * evaluable, then bail.
398 for(i
=0; i
< exp
->un
.call
.nargs
; i
++)
400 exp1
= DEBUG_EvalExpr(exp
->un
.call
.arg
[i
]);
401 if( exp1
.type
== NULL
)
405 cexp
[i
] = DEBUG_GetExprValue(&exp1
, NULL
);
409 * Now look up the address of the function itself.
411 if( !DEBUG_GetSymbolValue(exp
->un
.call
.funcname
, -1, &rtn
, FALSE
) )
413 RaiseException(DEBUG_STATUS_NO_SYMBOL
, 0, 0, NULL
);
417 /* FIXME: NEWDBG NIY */
418 /* Anyway, I wonder how this could work depending on the calling order of
419 * the function (cdecl vs pascal for example)
423 fptr
= (int (*)()) rtn
.addr
.off
;
424 switch(exp
->un
.call
.nargs
)
427 exp
->un
.call
.result
= (*fptr
)();
430 exp
->un
.call
.result
= (*fptr
)(cexp
[0]);
433 exp
->un
.call
.result
= (*fptr
)(cexp
[0], cexp
[1]);
436 exp
->un
.call
.result
= (*fptr
)(cexp
[0], cexp
[1], cexp
[2]);
439 exp
->un
.call
.result
= (*fptr
)(cexp
[0], cexp
[1], cexp
[2], cexp
[3]);
442 exp
->un
.call
.result
= (*fptr
)(cexp
[0], cexp
[1], cexp
[2], cexp
[3], cexp
[4]);
446 DEBUG_Printf(DBG_CHN_MESG
, "Function call no longer implemented\n");
447 /* would need to set up a call to this function, and then restore the current
448 * context afterwards...
450 exp
->un
.call
.result
= 0;
452 rtn
.type
= DEBUG_GetBasicType(DT_BASIC_INT
);
453 rtn
.cookie
= DV_HOST
;
454 rtn
.addr
.off
= (unsigned int) &exp
->un
.call
.result
;
457 case EXPR_TYPE_INTVAR
:
460 DBG_INTVAR
* div
= DEBUG_GetIntVar(exp
->un
.intvar
.name
);
462 if (!div
) RaiseException(DEBUG_STATUS_NO_SYMBOL
, 0, 0, NULL
);
463 rtn
.cookie
= DV_HOST
;
464 rtn
.type
= div
->type
;
465 rtn
.addr
.off
= (unsigned int)div
->pval
;
466 /* EPP FIXME rtn.addr.seg = ?? */
469 case EXPR_TYPE_BINOP
:
470 exp1
= DEBUG_EvalExpr(exp
->un
.binop
.exp1
);
471 exp2
= DEBUG_EvalExpr(exp
->un
.binop
.exp2
);
472 rtn
.cookie
= DV_HOST
;
473 if( exp1
.type
== NULL
|| exp2
.type
== NULL
)
475 RaiseException(DEBUG_STATUS_BAD_TYPE
, 0, 0, NULL
);
477 if( exp1
.type
== DEBUG_GetBasicType(DT_BASIC_CONST_INT
) &&
478 exp2
.type
== DEBUG_GetBasicType(DT_BASIC_CONST_INT
) )
480 rtn
.type
= exp1
.type
;
484 rtn
.type
= DEBUG_GetBasicType(DT_BASIC_INT
);
487 rtn
.addr
.off
= (unsigned int) &exp
->un
.binop
.result
;
488 switch(exp
->un
.binop
.binop_type
)
491 type1
= DEBUG_GetPointerType(exp1
.type
);
492 type2
= DEBUG_GetPointerType(exp2
.type
);
495 if( type1
!= NULL
&& type2
!= NULL
)
497 RaiseException(DEBUG_STATUS_BAD_TYPE
, 0, 0, NULL
);
499 else if( type1
!= NULL
)
501 scale2
= DEBUG_GetObjectSize(type1
);
502 rtn
.type
= exp1
.type
;
504 else if( type2
!= NULL
)
506 scale1
= DEBUG_GetObjectSize(type2
);
507 rtn
.type
= exp2
.type
;
509 exp
->un
.binop
.result
= (VAL(exp1
) * scale1
+ scale2
* VAL(exp2
));
512 type1
= DEBUG_GetPointerType(exp1
.type
);
513 type2
= DEBUG_GetPointerType(exp2
.type
);
517 if( type1
!= NULL
&& type2
!= NULL
)
521 RaiseException(DEBUG_STATUS_BAD_TYPE
, 0, 0, NULL
);
523 scale3
= DEBUG_GetObjectSize(type1
);
525 else if( type1
!= NULL
)
527 scale2
= DEBUG_GetObjectSize(type1
);
528 rtn
.type
= exp1
.type
;
531 else if( type2
!= NULL
)
533 scale1
= DEBUG_GetObjectSize(type2
);
534 rtn
.type
= exp2
.type
;
536 exp
->un
.binop
.result
= (VAL(exp1
) - VAL(exp2
)) / scale3
;
539 rtn
.cookie
= DV_TARGET
;
541 rtn
.addr
.seg
= VAL(exp1
);
542 rtn
.addr
.off
= VAL(exp2
);
545 exp
->un
.binop
.result
= (VAL(exp1
) || VAL(exp2
));
548 exp
->un
.binop
.result
= (VAL(exp1
) && VAL(exp2
));
551 exp
->un
.binop
.result
= (VAL(exp1
) | VAL(exp2
));
554 exp
->un
.binop
.result
= (VAL(exp1
) & VAL(exp2
));
557 exp
->un
.binop
.result
= (VAL(exp1
) ^ VAL(exp2
));
560 exp
->un
.binop
.result
= (VAL(exp1
) == VAL(exp2
));
563 exp
->un
.binop
.result
= (VAL(exp1
) > VAL(exp2
));
566 exp
->un
.binop
.result
= (VAL(exp1
) < VAL(exp2
));
569 exp
->un
.binop
.result
= (VAL(exp1
) >= VAL(exp2
));
572 exp
->un
.binop
.result
= (VAL(exp1
) <= VAL(exp2
));
575 exp
->un
.binop
.result
= (VAL(exp1
) != VAL(exp2
));
578 exp
->un
.binop
.result
= ((unsigned) VAL(exp1
) << VAL(exp2
));
581 exp
->un
.binop
.result
= ((unsigned) VAL(exp1
) >> VAL(exp2
));
584 exp
->un
.binop
.result
= (VAL(exp1
) * VAL(exp2
));
589 RaiseException(DEBUG_STATUS_DIV_BY_ZERO
, 0, 0, NULL
);
591 exp
->un
.binop
.result
= (VAL(exp1
) / VAL(exp2
));
596 RaiseException(DEBUG_STATUS_DIV_BY_ZERO
, 0, 0, NULL
);
598 exp
->un
.binop
.result
= (VAL(exp1
) % VAL(exp2
));
601 DEBUG_ArrayIndex(&exp1
, &rtn
, VAL(exp2
));
604 RaiseException(DEBUG_STATUS_INTERNAL_ERROR
, 0, 0, NULL
);
609 exp1
= DEBUG_EvalExpr(exp
->un
.unop
.exp1
);
610 rtn
.cookie
= DV_HOST
;
611 if( exp1
.type
== NULL
)
613 RaiseException(DEBUG_STATUS_BAD_TYPE
, 0, 0, NULL
);
616 rtn
.addr
.off
= (unsigned int) &exp
->un
.unop
.result
;
617 if( exp1
.type
== DEBUG_GetBasicType(DT_BASIC_CONST_INT
) )
619 rtn
.type
= exp1
.type
;
623 rtn
.type
= DEBUG_GetBasicType(DT_BASIC_INT
);
625 switch(exp
->un
.unop
.unop_type
)
628 exp
->un
.unop
.result
= -VAL(exp1
);
631 exp
->un
.unop
.result
= !VAL(exp1
);
634 exp
->un
.unop
.result
= ~VAL(exp1
);
637 /* FIXME: this is currently buggy.
638 * there is no way to tell were the deref:ed value is...
640 * x is a pointer to struct s, x being on the stack
641 * => exp1 is target, result is target
642 * x is a pointer to struct s, x being optimized into a reg
643 * => exp1 is host, result is target
644 * x is a pointer to internal variable x
645 * => exp1 is host, result is host
646 * so we force DV_TARGET, because dereferencing pointers to
647 * internal variables is very unlikely. a correct fix would be
650 rtn
.cookie
= DV_TARGET
;
651 rtn
.addr
.off
= (unsigned int) DEBUG_TypeDerefPointer(&exp1
, &rtn
.type
);
654 RaiseException(DEBUG_STATUS_BAD_TYPE
, 0, 0, NULL
);
657 case EXP_OP_FORCE_DEREF
:
658 rtn
.cookie
= exp1
.cookie
;
659 rtn
.addr
.seg
= exp1
.addr
.seg
;
660 if (exp1
.cookie
== DV_TARGET
)
661 DEBUG_READ_MEM((void*)exp1
.addr
.off
, &rtn
.addr
.off
, sizeof(rtn
.addr
.off
));
663 memcpy(&rtn
.addr
.off
, (void*)exp1
.addr
.off
, sizeof(rtn
.addr
.off
));
666 /* FIXME: even for a 16 bit entity ? */
667 rtn
.type
= DEBUG_FindOrMakePointerType(exp1
.type
);
668 exp
->un
.unop
.result
= exp1
.addr
.off
;
671 RaiseException(DEBUG_STATUS_INTERNAL_ERROR
, 0, 0, NULL
);
675 DEBUG_Printf(DBG_CHN_MESG
,"Unexpected expression (%d).\n", exp
->type
);
676 RaiseException(DEBUG_STATUS_INTERNAL_ERROR
, 0, 0, NULL
);
680 assert(rtn
.cookie
== DV_TARGET
|| rtn
.cookie
== DV_HOST
);
687 DEBUG_DisplayExpr(const struct expr
* exp
)
694 DEBUG_Printf(DBG_CHN_MESG
, "((");
695 DEBUG_PrintTypeCast(exp
->un
.cast
.cast
);
696 DEBUG_Printf(DBG_CHN_MESG
, ")");
697 DEBUG_DisplayExpr(exp
->un
.cast
.expr
);
698 DEBUG_Printf(DBG_CHN_MESG
, ")");
700 case EXPR_TYPE_INTVAR
:
701 DEBUG_Printf(DBG_CHN_MESG
, "$%s", exp
->un
.intvar
.name
);
703 case EXPR_TYPE_US_CONST
:
704 DEBUG_Printf(DBG_CHN_MESG
, "%ud", exp
->un
.u_const
.value
);
706 case EXPR_TYPE_CONST
:
707 DEBUG_Printf(DBG_CHN_MESG
, "%d", exp
->un
.u_const
.value
);
709 case EXPR_TYPE_STRING
:
710 DEBUG_Printf(DBG_CHN_MESG
, "\"%s\"", exp
->un
.string
.str
);
712 case EXPR_TYPE_SYMBOL
:
713 DEBUG_Printf(DBG_CHN_MESG
, "%s" , exp
->un
.symbol
.name
);
715 case EXPR_TYPE_PSTRUCT
:
716 DEBUG_DisplayExpr(exp
->un
.structure
.exp1
);
717 DEBUG_Printf(DBG_CHN_MESG
, "->%s", exp
->un
.structure
.element_name
);
719 case EXPR_TYPE_STRUCT
:
720 DEBUG_DisplayExpr(exp
->un
.structure
.exp1
);
721 DEBUG_Printf(DBG_CHN_MESG
, ".%s", exp
->un
.structure
.element_name
);
724 DEBUG_Printf(DBG_CHN_MESG
, "%s(",exp
->un
.call
.funcname
);
725 for(i
=0; i
< exp
->un
.call
.nargs
; i
++)
727 DEBUG_DisplayExpr(exp
->un
.call
.arg
[i
]);
728 if( i
!= exp
->un
.call
.nargs
- 1 )
730 DEBUG_Printf(DBG_CHN_MESG
, ", ");
733 DEBUG_Printf(DBG_CHN_MESG
, ")");
735 case EXPR_TYPE_BINOP
:
736 DEBUG_Printf(DBG_CHN_MESG
, "( ");
737 DEBUG_DisplayExpr(exp
->un
.binop
.exp1
);
738 switch(exp
->un
.binop
.binop_type
)
741 DEBUG_Printf(DBG_CHN_MESG
, " + ");
744 DEBUG_Printf(DBG_CHN_MESG
, " - ");
747 DEBUG_Printf(DBG_CHN_MESG
, ":");
750 DEBUG_Printf(DBG_CHN_MESG
, " || ");
753 DEBUG_Printf(DBG_CHN_MESG
, " && ");
756 DEBUG_Printf(DBG_CHN_MESG
, " | ");
759 DEBUG_Printf(DBG_CHN_MESG
, " & ");
762 DEBUG_Printf(DBG_CHN_MESG
, " ^ ");
765 DEBUG_Printf(DBG_CHN_MESG
, " == ");
768 DEBUG_Printf(DBG_CHN_MESG
, " > ");
771 DEBUG_Printf(DBG_CHN_MESG
, " < ");
774 DEBUG_Printf(DBG_CHN_MESG
, " >= ");
777 DEBUG_Printf(DBG_CHN_MESG
, " <= ");
780 DEBUG_Printf(DBG_CHN_MESG
, " != ");
783 DEBUG_Printf(DBG_CHN_MESG
, " << ");
786 DEBUG_Printf(DBG_CHN_MESG
, " >> ");
789 DEBUG_Printf(DBG_CHN_MESG
, " * ");
792 DEBUG_Printf(DBG_CHN_MESG
, " / ");
795 DEBUG_Printf(DBG_CHN_MESG
, " %% ");
798 DEBUG_Printf(DBG_CHN_MESG
, "[");
803 DEBUG_DisplayExpr(exp
->un
.binop
.exp2
);
804 if( exp
->un
.binop
.binop_type
== EXP_OP_ARR
)
806 DEBUG_Printf(DBG_CHN_MESG
, "]");
808 DEBUG_Printf(DBG_CHN_MESG
, " )");
811 switch(exp
->un
.unop
.unop_type
)
814 DEBUG_Printf(DBG_CHN_MESG
, "-");
817 DEBUG_Printf(DBG_CHN_MESG
, "!");
820 DEBUG_Printf(DBG_CHN_MESG
, "~");
823 DEBUG_Printf(DBG_CHN_MESG
, "*");
826 DEBUG_Printf(DBG_CHN_MESG
, "&");
829 DEBUG_DisplayExpr(exp
->un
.unop
.exp1
);
832 DEBUG_Printf(DBG_CHN_MESG
,"Unexpected expression.\n");
833 RaiseException(DEBUG_STATUS_INTERNAL_ERROR
, 0, 0, NULL
);
841 DEBUG_CloneExpr(const struct expr
* exp
)
846 rtn
= (struct expr
*) DBG_alloc(sizeof(struct expr
));
849 * First copy the contents of the expression itself.
857 rtn
->un
.cast
.expr
= DEBUG_CloneExpr(exp
->un
.cast
.expr
);
859 case EXPR_TYPE_INTVAR
:
860 rtn
->un
.intvar
.name
= DBG_strdup(exp
->un
.intvar
.name
);
862 case EXPR_TYPE_US_CONST
:
863 case EXPR_TYPE_CONST
:
865 case EXPR_TYPE_STRING
:
866 rtn
->un
.string
.str
= DBG_strdup(exp
->un
.string
.str
);
868 case EXPR_TYPE_SYMBOL
:
869 rtn
->un
.symbol
.name
= DBG_strdup(exp
->un
.symbol
.name
);
871 case EXPR_TYPE_PSTRUCT
:
872 case EXPR_TYPE_STRUCT
:
873 rtn
->un
.structure
.exp1
= DEBUG_CloneExpr(exp
->un
.structure
.exp1
);
874 rtn
->un
.structure
.element_name
= DBG_strdup(exp
->un
.structure
.element_name
);
877 for(i
=0; i
< exp
->un
.call
.nargs
; i
++)
879 rtn
->un
.call
.arg
[i
] = DEBUG_CloneExpr(exp
->un
.call
.arg
[i
]);
881 rtn
->un
.call
.funcname
= DBG_strdup(exp
->un
.call
.funcname
);
883 case EXPR_TYPE_BINOP
:
884 rtn
->un
.binop
.exp1
= DEBUG_CloneExpr(exp
->un
.binop
.exp1
);
885 rtn
->un
.binop
.exp2
= DEBUG_CloneExpr(exp
->un
.binop
.exp2
);
888 rtn
->un
.unop
.exp1
= DEBUG_CloneExpr(exp
->un
.unop
.exp1
);
891 DEBUG_Printf(DBG_CHN_MESG
,"Unexpected expression.\n");
892 RaiseException(DEBUG_STATUS_INTERNAL_ERROR
, 0, 0, NULL
);
901 * Recursively go through an expression tree and free all memory associated
905 DEBUG_FreeExpr(struct expr
* exp
)
912 DEBUG_FreeExpr(exp
->un
.cast
.expr
);
914 case EXPR_TYPE_INTVAR
:
915 DBG_free((char *) exp
->un
.intvar
.name
);
917 case EXPR_TYPE_US_CONST
:
918 case EXPR_TYPE_CONST
:
920 case EXPR_TYPE_STRING
:
921 DBG_free((char *) exp
->un
.string
.str
);
923 case EXPR_TYPE_SYMBOL
:
924 DBG_free((char *) exp
->un
.symbol
.name
);
926 case EXPR_TYPE_PSTRUCT
:
927 case EXPR_TYPE_STRUCT
:
928 DEBUG_FreeExpr(exp
->un
.structure
.exp1
);
929 DBG_free((char *) exp
->un
.structure
.element_name
);
932 for(i
=0; i
< exp
->un
.call
.nargs
; i
++)
934 DEBUG_FreeExpr(exp
->un
.call
.arg
[i
]);
936 DBG_free((char *) exp
->un
.call
.funcname
);
938 case EXPR_TYPE_BINOP
:
939 DEBUG_FreeExpr(exp
->un
.binop
.exp1
);
940 DEBUG_FreeExpr(exp
->un
.binop
.exp2
);
943 DEBUG_FreeExpr(exp
->un
.unop
.exp1
);
946 DEBUG_Printf(DBG_CHN_MESG
,"Unexpected expression.\n");
947 RaiseException(DEBUG_STATUS_INTERNAL_ERROR
, 0, 0, NULL
);