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 if (!exp
->un
.cast
.cast
)
326 DEBUG_Printf(DBG_CHN_MESG
, "Can't cast to unknown type\n");
327 RaiseException(DEBUG_STATUS_BAD_TYPE
, 0, 0, NULL
);
329 rtn
= DEBUG_EvalExpr(exp
->un
.cast
.expr
);
330 rtn
.type
= exp
->un
.cast
.cast
;
332 case EXPR_TYPE_STRING
:
333 rtn
.type
= DEBUG_GetBasicType(DT_BASIC_STRING
);
334 rtn
.cookie
= DV_HOST
;
335 rtn
.addr
.off
= (unsigned int) &exp
->un
.string
.str
;
338 case EXPR_TYPE_CONST
:
339 rtn
.type
= DEBUG_GetBasicType(DT_BASIC_CONST_INT
);
340 rtn
.cookie
= DV_HOST
;
341 rtn
.addr
.off
= (unsigned int) &exp
->un
.constant
.value
;
344 case EXPR_TYPE_US_CONST
:
345 rtn
.type
= DEBUG_GetBasicType(DT_BASIC_USHORTINT
);
346 rtn
.cookie
= DV_HOST
;
347 rtn
.addr
.off
= (unsigned int) &exp
->un
.u_const
.value
;
350 case EXPR_TYPE_SYMBOL
:
351 switch (DEBUG_GetSymbolValue(exp
->un
.symbol
.name
, -1, &rtn
, FALSE
))
356 RaiseException(DEBUG_STATUS_NO_SYMBOL
, 0, 0, NULL
);
357 /* should never be here */
359 RaiseException(DEBUG_STATUS_ABORT
, 0, 0, NULL
);
360 /* should never be here */
363 case EXPR_TYPE_PSTRUCT
:
364 exp1
= DEBUG_EvalExpr(exp
->un
.structure
.exp1
);
365 if( exp1
.type
== NULL
)
367 RaiseException(DEBUG_STATUS_BAD_TYPE
, 0, 0, NULL
);
369 rtn
.cookie
= DV_TARGET
;
370 rtn
.addr
.off
= DEBUG_TypeDerefPointer(&exp1
, &rtn
.type
);
371 if( rtn
.type
== NULL
)
373 RaiseException(DEBUG_STATUS_BAD_TYPE
, 0, 0, NULL
);
375 if (!DEBUG_FindStructElement(&rtn
, exp
->un
.structure
.element_name
,
376 &exp
->un
.structure
.result
))
378 DEBUG_Printf(DBG_CHN_MESG
, "%s\n", exp
->un
.structure
.element_name
);
379 RaiseException(DEBUG_STATUS_NO_FIELD
, 0, 0, NULL
);
383 case EXPR_TYPE_STRUCT
:
384 exp1
= DEBUG_EvalExpr(exp
->un
.structure
.exp1
);
385 if( exp1
.type
== NULL
)
387 RaiseException(DEBUG_STATUS_BAD_TYPE
, 0, 0, NULL
);
390 if (!DEBUG_FindStructElement(&rtn
, exp
->un
.structure
.element_name
,
391 &exp
->un
.structure
.result
))
393 DEBUG_Printf(DBG_CHN_MESG
, "%s\n", exp
->un
.structure
.element_name
);
394 RaiseException(DEBUG_STATUS_NO_FIELD
, 0, 0, NULL
);
399 * First, evaluate all of the arguments. If any of them are not
400 * evaluable, then bail.
402 for(i
=0; i
< exp
->un
.call
.nargs
; i
++)
404 exp1
= DEBUG_EvalExpr(exp
->un
.call
.arg
[i
]);
405 if( exp1
.type
== NULL
)
409 cexp
[i
] = DEBUG_GetExprValue(&exp1
, NULL
);
413 * Now look up the address of the function itself.
415 switch (DEBUG_GetSymbolValue(exp
->un
.call
.funcname
, -1, &rtn
, FALSE
))
420 RaiseException(DEBUG_STATUS_NO_SYMBOL
, 0, 0, NULL
);
421 /* should never be here */
423 RaiseException(DEBUG_STATUS_ABORT
, 0, 0, NULL
);
424 /* should never be here */
428 /* FIXME: NEWDBG NIY */
429 /* Anyway, I wonder how this could work depending on the calling order of
430 * the function (cdecl vs pascal for example)
434 fptr
= (int (*)()) rtn
.addr
.off
;
435 switch(exp
->un
.call
.nargs
)
438 exp
->un
.call
.result
= (*fptr
)();
441 exp
->un
.call
.result
= (*fptr
)(cexp
[0]);
444 exp
->un
.call
.result
= (*fptr
)(cexp
[0], cexp
[1]);
447 exp
->un
.call
.result
= (*fptr
)(cexp
[0], cexp
[1], cexp
[2]);
450 exp
->un
.call
.result
= (*fptr
)(cexp
[0], cexp
[1], cexp
[2], cexp
[3]);
453 exp
->un
.call
.result
= (*fptr
)(cexp
[0], cexp
[1], cexp
[2], cexp
[3], cexp
[4]);
457 DEBUG_Printf(DBG_CHN_MESG
, "Function call no longer implemented\n");
458 /* would need to set up a call to this function, and then restore the current
459 * context afterwards...
461 exp
->un
.call
.result
= 0;
463 rtn
.type
= DEBUG_GetBasicType(DT_BASIC_INT
);
464 rtn
.cookie
= DV_HOST
;
465 rtn
.addr
.off
= (unsigned int) &exp
->un
.call
.result
;
468 case EXPR_TYPE_INTVAR
:
471 DBG_INTVAR
* div
= DEBUG_GetIntVar(exp
->un
.intvar
.name
);
473 if (!div
) RaiseException(DEBUG_STATUS_NO_SYMBOL
, 0, 0, NULL
);
474 rtn
.cookie
= DV_HOST
;
475 rtn
.type
= div
->type
;
476 rtn
.addr
.off
= (unsigned int)div
->pval
;
477 /* EPP FIXME rtn.addr.seg = ?? */
480 case EXPR_TYPE_BINOP
:
481 exp1
= DEBUG_EvalExpr(exp
->un
.binop
.exp1
);
482 exp2
= DEBUG_EvalExpr(exp
->un
.binop
.exp2
);
483 rtn
.cookie
= DV_HOST
;
484 if( exp1
.type
== NULL
|| exp2
.type
== NULL
)
486 RaiseException(DEBUG_STATUS_BAD_TYPE
, 0, 0, NULL
);
488 if( exp1
.type
== DEBUG_GetBasicType(DT_BASIC_CONST_INT
) &&
489 exp2
.type
== DEBUG_GetBasicType(DT_BASIC_CONST_INT
) )
491 rtn
.type
= exp1
.type
;
495 rtn
.type
= DEBUG_GetBasicType(DT_BASIC_INT
);
498 rtn
.addr
.off
= (unsigned int) &exp
->un
.binop
.result
;
499 switch(exp
->un
.binop
.binop_type
)
502 type1
= DEBUG_GetPointerType(exp1
.type
);
503 type2
= DEBUG_GetPointerType(exp2
.type
);
506 if( type1
!= NULL
&& type2
!= NULL
)
508 RaiseException(DEBUG_STATUS_BAD_TYPE
, 0, 0, NULL
);
510 else if( type1
!= NULL
)
512 scale2
= DEBUG_GetObjectSize(type1
);
513 rtn
.type
= exp1
.type
;
515 else if( type2
!= NULL
)
517 scale1
= DEBUG_GetObjectSize(type2
);
518 rtn
.type
= exp2
.type
;
520 exp
->un
.binop
.result
= (VAL(exp1
) * scale1
+ scale2
* VAL(exp2
));
523 type1
= DEBUG_GetPointerType(exp1
.type
);
524 type2
= DEBUG_GetPointerType(exp2
.type
);
528 if( type1
!= NULL
&& type2
!= NULL
)
532 RaiseException(DEBUG_STATUS_BAD_TYPE
, 0, 0, NULL
);
534 scale3
= DEBUG_GetObjectSize(type1
);
536 else if( type1
!= NULL
)
538 scale2
= DEBUG_GetObjectSize(type1
);
539 rtn
.type
= exp1
.type
;
542 else if( type2
!= NULL
)
544 scale1
= DEBUG_GetObjectSize(type2
);
545 rtn
.type
= exp2
.type
;
547 exp
->un
.binop
.result
= (VAL(exp1
) - VAL(exp2
)) / scale3
;
550 rtn
.cookie
= DV_TARGET
;
552 rtn
.addr
.seg
= VAL(exp1
);
553 rtn
.addr
.off
= VAL(exp2
);
556 exp
->un
.binop
.result
= (VAL(exp1
) || VAL(exp2
));
559 exp
->un
.binop
.result
= (VAL(exp1
) && VAL(exp2
));
562 exp
->un
.binop
.result
= (VAL(exp1
) | VAL(exp2
));
565 exp
->un
.binop
.result
= (VAL(exp1
) & VAL(exp2
));
568 exp
->un
.binop
.result
= (VAL(exp1
) ^ VAL(exp2
));
571 exp
->un
.binop
.result
= (VAL(exp1
) == VAL(exp2
));
574 exp
->un
.binop
.result
= (VAL(exp1
) > VAL(exp2
));
577 exp
->un
.binop
.result
= (VAL(exp1
) < VAL(exp2
));
580 exp
->un
.binop
.result
= (VAL(exp1
) >= VAL(exp2
));
583 exp
->un
.binop
.result
= (VAL(exp1
) <= VAL(exp2
));
586 exp
->un
.binop
.result
= (VAL(exp1
) != VAL(exp2
));
589 exp
->un
.binop
.result
= ((unsigned) VAL(exp1
) << VAL(exp2
));
592 exp
->un
.binop
.result
= ((unsigned) VAL(exp1
) >> VAL(exp2
));
595 exp
->un
.binop
.result
= (VAL(exp1
) * VAL(exp2
));
600 RaiseException(DEBUG_STATUS_DIV_BY_ZERO
, 0, 0, NULL
);
602 exp
->un
.binop
.result
= (VAL(exp1
) / VAL(exp2
));
607 RaiseException(DEBUG_STATUS_DIV_BY_ZERO
, 0, 0, NULL
);
609 exp
->un
.binop
.result
= (VAL(exp1
) % VAL(exp2
));
612 DEBUG_ArrayIndex(&exp1
, &rtn
, VAL(exp2
));
615 RaiseException(DEBUG_STATUS_INTERNAL_ERROR
, 0, 0, NULL
);
620 exp1
= DEBUG_EvalExpr(exp
->un
.unop
.exp1
);
621 rtn
.cookie
= DV_HOST
;
622 if( exp1
.type
== NULL
)
624 RaiseException(DEBUG_STATUS_BAD_TYPE
, 0, 0, NULL
);
627 rtn
.addr
.off
= (unsigned int) &exp
->un
.unop
.result
;
628 if( exp1
.type
== DEBUG_GetBasicType(DT_BASIC_CONST_INT
) )
630 rtn
.type
= exp1
.type
;
634 rtn
.type
= DEBUG_GetBasicType(DT_BASIC_INT
);
636 switch(exp
->un
.unop
.unop_type
)
639 exp
->un
.unop
.result
= -VAL(exp1
);
642 exp
->un
.unop
.result
= !VAL(exp1
);
645 exp
->un
.unop
.result
= ~VAL(exp1
);
648 /* FIXME: this is currently buggy.
649 * there is no way to tell were the deref:ed value is...
651 * x is a pointer to struct s, x being on the stack
652 * => exp1 is target, result is target
653 * x is a pointer to struct s, x being optimized into a reg
654 * => exp1 is host, result is target
655 * x is a pointer to internal variable x
656 * => exp1 is host, result is host
657 * so we force DV_TARGET, because dereferencing pointers to
658 * internal variables is very unlikely. a correct fix would be
661 rtn
.cookie
= DV_TARGET
;
662 rtn
.addr
.off
= (unsigned int) DEBUG_TypeDerefPointer(&exp1
, &rtn
.type
);
665 RaiseException(DEBUG_STATUS_BAD_TYPE
, 0, 0, NULL
);
668 case EXP_OP_FORCE_DEREF
:
669 rtn
.cookie
= exp1
.cookie
;
670 rtn
.addr
.seg
= exp1
.addr
.seg
;
671 if (exp1
.cookie
== DV_TARGET
)
672 DEBUG_READ_MEM((void*)exp1
.addr
.off
, &rtn
.addr
.off
, sizeof(rtn
.addr
.off
));
674 memcpy(&rtn
.addr
.off
, (void*)exp1
.addr
.off
, sizeof(rtn
.addr
.off
));
677 /* FIXME: even for a 16 bit entity ? */
678 rtn
.type
= DEBUG_FindOrMakePointerType(exp1
.type
);
679 exp
->un
.unop
.result
= exp1
.addr
.off
;
682 RaiseException(DEBUG_STATUS_INTERNAL_ERROR
, 0, 0, NULL
);
686 DEBUG_Printf(DBG_CHN_MESG
,"Unexpected expression (%d).\n", exp
->type
);
687 RaiseException(DEBUG_STATUS_INTERNAL_ERROR
, 0, 0, NULL
);
691 assert(rtn
.cookie
== DV_TARGET
|| rtn
.cookie
== DV_HOST
);
698 DEBUG_DisplayExpr(const struct expr
* exp
)
705 DEBUG_Printf(DBG_CHN_MESG
, "((");
706 DEBUG_PrintTypeCast(exp
->un
.cast
.cast
);
707 DEBUG_Printf(DBG_CHN_MESG
, ")");
708 DEBUG_DisplayExpr(exp
->un
.cast
.expr
);
709 DEBUG_Printf(DBG_CHN_MESG
, ")");
711 case EXPR_TYPE_INTVAR
:
712 DEBUG_Printf(DBG_CHN_MESG
, "$%s", exp
->un
.intvar
.name
);
714 case EXPR_TYPE_US_CONST
:
715 DEBUG_Printf(DBG_CHN_MESG
, "%ud", exp
->un
.u_const
.value
);
717 case EXPR_TYPE_CONST
:
718 DEBUG_Printf(DBG_CHN_MESG
, "%d", exp
->un
.u_const
.value
);
720 case EXPR_TYPE_STRING
:
721 DEBUG_Printf(DBG_CHN_MESG
, "\"%s\"", exp
->un
.string
.str
);
723 case EXPR_TYPE_SYMBOL
:
724 DEBUG_Printf(DBG_CHN_MESG
, "%s" , exp
->un
.symbol
.name
);
726 case EXPR_TYPE_PSTRUCT
:
727 DEBUG_DisplayExpr(exp
->un
.structure
.exp1
);
728 DEBUG_Printf(DBG_CHN_MESG
, "->%s", exp
->un
.structure
.element_name
);
730 case EXPR_TYPE_STRUCT
:
731 DEBUG_DisplayExpr(exp
->un
.structure
.exp1
);
732 DEBUG_Printf(DBG_CHN_MESG
, ".%s", exp
->un
.structure
.element_name
);
735 DEBUG_Printf(DBG_CHN_MESG
, "%s(",exp
->un
.call
.funcname
);
736 for(i
=0; i
< exp
->un
.call
.nargs
; i
++)
738 DEBUG_DisplayExpr(exp
->un
.call
.arg
[i
]);
739 if( i
!= exp
->un
.call
.nargs
- 1 )
741 DEBUG_Printf(DBG_CHN_MESG
, ", ");
744 DEBUG_Printf(DBG_CHN_MESG
, ")");
746 case EXPR_TYPE_BINOP
:
747 DEBUG_Printf(DBG_CHN_MESG
, "( ");
748 DEBUG_DisplayExpr(exp
->un
.binop
.exp1
);
749 switch(exp
->un
.binop
.binop_type
)
752 DEBUG_Printf(DBG_CHN_MESG
, " + ");
755 DEBUG_Printf(DBG_CHN_MESG
, " - ");
758 DEBUG_Printf(DBG_CHN_MESG
, ":");
761 DEBUG_Printf(DBG_CHN_MESG
, " || ");
764 DEBUG_Printf(DBG_CHN_MESG
, " && ");
767 DEBUG_Printf(DBG_CHN_MESG
, " | ");
770 DEBUG_Printf(DBG_CHN_MESG
, " & ");
773 DEBUG_Printf(DBG_CHN_MESG
, " ^ ");
776 DEBUG_Printf(DBG_CHN_MESG
, " == ");
779 DEBUG_Printf(DBG_CHN_MESG
, " > ");
782 DEBUG_Printf(DBG_CHN_MESG
, " < ");
785 DEBUG_Printf(DBG_CHN_MESG
, " >= ");
788 DEBUG_Printf(DBG_CHN_MESG
, " <= ");
791 DEBUG_Printf(DBG_CHN_MESG
, " != ");
794 DEBUG_Printf(DBG_CHN_MESG
, " << ");
797 DEBUG_Printf(DBG_CHN_MESG
, " >> ");
800 DEBUG_Printf(DBG_CHN_MESG
, " * ");
803 DEBUG_Printf(DBG_CHN_MESG
, " / ");
806 DEBUG_Printf(DBG_CHN_MESG
, " %% ");
809 DEBUG_Printf(DBG_CHN_MESG
, "[");
814 DEBUG_DisplayExpr(exp
->un
.binop
.exp2
);
815 if( exp
->un
.binop
.binop_type
== EXP_OP_ARR
)
817 DEBUG_Printf(DBG_CHN_MESG
, "]");
819 DEBUG_Printf(DBG_CHN_MESG
, " )");
822 switch(exp
->un
.unop
.unop_type
)
825 DEBUG_Printf(DBG_CHN_MESG
, "-");
828 DEBUG_Printf(DBG_CHN_MESG
, "!");
831 DEBUG_Printf(DBG_CHN_MESG
, "~");
834 DEBUG_Printf(DBG_CHN_MESG
, "*");
837 DEBUG_Printf(DBG_CHN_MESG
, "&");
840 DEBUG_DisplayExpr(exp
->un
.unop
.exp1
);
843 DEBUG_Printf(DBG_CHN_MESG
,"Unexpected expression.\n");
844 RaiseException(DEBUG_STATUS_INTERNAL_ERROR
, 0, 0, NULL
);
852 DEBUG_CloneExpr(const struct expr
* exp
)
857 rtn
= (struct expr
*) DBG_alloc(sizeof(struct expr
));
860 * First copy the contents of the expression itself.
868 rtn
->un
.cast
.expr
= DEBUG_CloneExpr(exp
->un
.cast
.expr
);
870 case EXPR_TYPE_INTVAR
:
871 rtn
->un
.intvar
.name
= DBG_strdup(exp
->un
.intvar
.name
);
873 case EXPR_TYPE_US_CONST
:
874 case EXPR_TYPE_CONST
:
876 case EXPR_TYPE_STRING
:
877 rtn
->un
.string
.str
= DBG_strdup(exp
->un
.string
.str
);
879 case EXPR_TYPE_SYMBOL
:
880 rtn
->un
.symbol
.name
= DBG_strdup(exp
->un
.symbol
.name
);
882 case EXPR_TYPE_PSTRUCT
:
883 case EXPR_TYPE_STRUCT
:
884 rtn
->un
.structure
.exp1
= DEBUG_CloneExpr(exp
->un
.structure
.exp1
);
885 rtn
->un
.structure
.element_name
= DBG_strdup(exp
->un
.structure
.element_name
);
888 for(i
=0; i
< exp
->un
.call
.nargs
; i
++)
890 rtn
->un
.call
.arg
[i
] = DEBUG_CloneExpr(exp
->un
.call
.arg
[i
]);
892 rtn
->un
.call
.funcname
= DBG_strdup(exp
->un
.call
.funcname
);
894 case EXPR_TYPE_BINOP
:
895 rtn
->un
.binop
.exp1
= DEBUG_CloneExpr(exp
->un
.binop
.exp1
);
896 rtn
->un
.binop
.exp2
= DEBUG_CloneExpr(exp
->un
.binop
.exp2
);
899 rtn
->un
.unop
.exp1
= DEBUG_CloneExpr(exp
->un
.unop
.exp1
);
902 DEBUG_Printf(DBG_CHN_MESG
,"Unexpected expression.\n");
903 RaiseException(DEBUG_STATUS_INTERNAL_ERROR
, 0, 0, NULL
);
912 * Recursively go through an expression tree and free all memory associated
916 DEBUG_FreeExpr(struct expr
* exp
)
923 DEBUG_FreeExpr(exp
->un
.cast
.expr
);
925 case EXPR_TYPE_INTVAR
:
926 DBG_free((char *) exp
->un
.intvar
.name
);
928 case EXPR_TYPE_US_CONST
:
929 case EXPR_TYPE_CONST
:
931 case EXPR_TYPE_STRING
:
932 DBG_free((char *) exp
->un
.string
.str
);
934 case EXPR_TYPE_SYMBOL
:
935 DBG_free((char *) exp
->un
.symbol
.name
);
937 case EXPR_TYPE_PSTRUCT
:
938 case EXPR_TYPE_STRUCT
:
939 DEBUG_FreeExpr(exp
->un
.structure
.exp1
);
940 DBG_free((char *) exp
->un
.structure
.element_name
);
943 for(i
=0; i
< exp
->un
.call
.nargs
; i
++)
945 DEBUG_FreeExpr(exp
->un
.call
.arg
[i
]);
947 DBG_free((char *) exp
->un
.call
.funcname
);
949 case EXPR_TYPE_BINOP
:
950 DEBUG_FreeExpr(exp
->un
.binop
.exp1
);
951 DEBUG_FreeExpr(exp
->un
.binop
.exp2
);
954 DEBUG_FreeExpr(exp
->un
.unop
.exp1
);
957 DEBUG_Printf(DBG_CHN_MESG
,"Unexpected expression.\n");
958 RaiseException(DEBUG_STATUS_INTERNAL_ERROR
, 0, 0, NULL
);