SymGetType(...,TI_GET_LENGTH,...) requires a 64 bit parameter, not a
[wine] / programs / winedbg / expr.c
1 /*
2  * File expr.c - expression handling for Wine internal debugger.
3  *
4  * Copyright (C) 1997, Eric Youngdale.
5  *
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.
10  *
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.
15  *
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
19  */
20
21 #include "config.h"
22
23 #include <stdlib.h>
24 #include <string.h>
25 #include <stdarg.h>
26
27 #include "debugger.h"
28 #include "expr.h"
29 #include "wine/debug.h"
30
31 WINE_DEFAULT_DEBUG_CHANNEL(winedbg);
32
33 struct expr
34 {
35     unsigned int        type;
36     union
37     {
38         struct
39         {
40             int                 value;
41         } s_const;
42
43         struct
44         {
45             unsigned int        value;
46         } u_const;
47
48         struct
49         {
50             const char*         str;
51         } string;
52
53         struct
54         {
55             const char*         name;
56         } symbol;
57
58         struct
59         {
60             const char*         name;
61         } intvar;
62
63         struct
64         {
65             int                 unop_type;
66             struct expr*        exp1;
67             long int            result;
68         } unop;
69
70         struct
71         {
72             int                 binop_type;
73             struct expr*        exp1;
74             struct expr*        exp2;
75             long int            result;
76         } binop;
77
78         struct
79         {
80             struct type_expr_t  cast_to;
81             struct expr*        expr;
82         } cast;
83
84         struct
85         {
86             struct expr*        exp1;
87             const char*         element_name;
88             long int            result;
89         } structure;
90
91         struct
92         {
93             const char*         funcname;
94             int                 nargs;
95             struct expr*        arg[5];
96             long int            result;
97         } call;
98
99     } un;
100 };
101
102 #define EXPR_TYPE_S_CONST       0
103 #define EXPR_TYPE_U_CONST       1
104 #define EXPR_TYPE_SYMBOL        2
105 #define EXPR_TYPE_INTVAR        3
106 #define EXPR_TYPE_BINOP         4
107 #define EXPR_TYPE_UNOP          5
108 #define EXPR_TYPE_STRUCT        6
109 #define EXPR_TYPE_PSTRUCT       7
110 #define EXPR_TYPE_CALL          8
111 #define EXPR_TYPE_STRING        9
112 #define EXPR_TYPE_CAST          10
113
114 static char expr_list[4096];
115 static unsigned int next_expr_free = 0;
116
117 static struct expr* expr_alloc(void)
118 {
119     struct expr*        rtn;
120
121     rtn = (struct expr*)&expr_list[next_expr_free];
122
123     next_expr_free += sizeof(struct expr);
124     assert(next_expr_free < sizeof(expr_list));
125
126     return rtn;
127 }
128
129 void expr_free_all(void)
130 {
131     next_expr_free = 0;
132 }
133
134 struct expr* expr_alloc_typecast(struct type_expr_t* tet, struct expr* exp)
135 {
136     struct expr*        ex;
137
138     ex = expr_alloc();
139
140     ex->type            = EXPR_TYPE_CAST;
141     ex->un.cast.cast_to = *tet;
142     ex->un.cast.expr    = exp;
143     return ex;
144 }
145
146 struct expr* expr_alloc_internal_var(const char* name)
147 {
148     struct expr* ex;
149
150     ex = expr_alloc();
151
152     ex->type           = EXPR_TYPE_INTVAR;
153     ex->un.intvar.name = name;
154     return ex;
155 }
156
157 struct expr* expr_alloc_symbol(const char* name)
158 {
159     struct expr* ex;
160
161     ex = expr_alloc();
162
163     ex->type           = EXPR_TYPE_SYMBOL;
164     ex->un.symbol.name = name;
165     return ex;
166 }
167
168 struct expr* expr_alloc_sconstant(int value)
169 {
170     struct expr*        ex;
171
172     ex = expr_alloc();
173
174     ex->type             = EXPR_TYPE_S_CONST;
175     ex->un.s_const.value = value;
176     return ex;
177 }
178
179 struct expr* expr_alloc_uconstant(unsigned int value)
180 {
181     struct expr*        ex;
182
183     ex = expr_alloc();
184
185     ex->type             = EXPR_TYPE_U_CONST;
186     ex->un.u_const.value = value;
187     return ex;
188 }
189
190 struct expr* expr_alloc_string(const char* str)
191 {
192     struct expr*        ex;
193
194     ex = expr_alloc();
195
196     ex->type          = EXPR_TYPE_STRING;
197     ex->un.string.str = str;
198     return ex;
199 }
200
201 struct expr* expr_alloc_binary_op(int op_type, struct expr* exp1, struct expr* exp2)
202 {
203     struct expr*        ex;
204
205     ex = expr_alloc();
206
207     ex->type                = EXPR_TYPE_BINOP;
208     ex->un.binop.binop_type = op_type;
209     ex->un.binop.exp1       = exp1;
210     ex->un.binop.exp2       = exp2;
211     return ex;
212 }
213
214 struct expr* expr_alloc_unary_op(int op_type, struct expr* exp1)
215 {
216     struct expr*        ex;
217
218     ex = expr_alloc();
219
220     ex->type              = EXPR_TYPE_UNOP;
221     ex->un.unop.unop_type = op_type;
222     ex->un.unop.exp1      = exp1;
223     return ex;
224 }
225
226 struct expr* expr_alloc_struct(struct expr* exp, const char* element)
227 {
228     struct expr*        ex;
229
230     ex = expr_alloc();
231
232     ex->type                      = EXPR_TYPE_STRUCT;
233     ex->un.structure.exp1         = exp;
234     ex->un.structure.element_name = element;
235     return ex;
236 }
237
238 struct expr* expr_alloc_pstruct(struct expr* exp, const char* element)
239 {
240     struct expr*        ex;
241
242     ex = expr_alloc();
243
244     ex->type                      = EXPR_TYPE_PSTRUCT;
245     ex->un.structure.exp1         = exp;
246     ex->un.structure.element_name = element;
247     return ex;
248 }
249
250 struct expr* expr_alloc_func_call(const char* funcname, int nargs, ...)
251 {
252     struct expr*        ex;
253     va_list             ap;
254     int                 i;
255
256     ex = expr_alloc();
257
258     ex->type             = EXPR_TYPE_CALL;
259     ex->un.call.funcname = funcname;
260     ex->un.call.nargs    = nargs;
261
262     va_start(ap, nargs);
263     for (i = 0; i < nargs; i++)
264     {
265         ex->un.call.arg[i] = va_arg(ap, struct expr*);
266     }
267     va_end(ap);
268     return ex;
269 }
270
271 /******************************************************************
272  *              expr_eval
273  *
274  */
275 struct dbg_lvalue expr_eval(struct expr* exp)
276 {
277     struct dbg_lvalue                   rtn;
278     int                                 i;
279     struct dbg_lvalue                   exp1;
280     struct dbg_lvalue                   exp2;
281     unsigned int                        cexp[5];
282     DWORD64                             scale1, scale2, scale3;
283     struct dbg_type                     type1, type2;
284     DWORD                               tag;
285     const struct dbg_internal_var*      div;
286
287     rtn.cookie       = 0;
288     rtn.type.id      = dbg_itype_none;
289     rtn.type.module  = 0;
290     rtn.addr.Mode    = AddrModeFlat;
291     rtn.addr.Offset  = 0;
292     rtn.addr.Segment = 0;
293
294     switch (exp->type)
295     {
296     case EXPR_TYPE_CAST:
297         /* this is really brute force, we simply change the type... without 
298          * checking if this is right or not
299          */
300         rtn = expr_eval(exp->un.cast.expr);
301         switch (exp->un.cast.cast_to.type)
302         {
303         case type_expr_type_id:
304             if (exp->un.cast.cast_to.u.type.id == dbg_itype_none)
305             {
306                 dbg_printf("Can't cast to unknown type\n");
307                 RaiseException(DEBUG_STATUS_BAD_TYPE, 0, 0, NULL);
308             }
309             rtn.type = exp->un.cast.cast_to.u.type;
310             break;
311         case type_expr_udt_class:
312         case type_expr_udt_struct:
313         case type_expr_udt_union:
314             rtn.type = types_find_type(rtn.type.module, exp->un.cast.cast_to.u.name,
315                                        SymTagUDT);
316             if (rtn.type.id == dbg_itype_none)
317             {
318                 dbg_printf("Can't cast to UDT %s\n", exp->un.cast.cast_to.u.name);
319                 RaiseException(DEBUG_STATUS_BAD_TYPE, 0, 0, NULL);
320             }
321             break;
322         case type_expr_enumeration:
323             rtn.type = types_find_type(rtn.type.module, exp->un.cast.cast_to.u.name,
324                                        SymTagEnum);
325             if (rtn.type.id == dbg_itype_none)
326             {
327                 dbg_printf("Can't cast to enumeration %s\n", exp->un.cast.cast_to.u.name);
328                 RaiseException(DEBUG_STATUS_BAD_TYPE, 0, 0, NULL);
329             }
330             break;
331         default:
332             dbg_printf("Unsupported cast type %u\n", exp->un.cast.cast_to.type);
333             RaiseException(DEBUG_STATUS_BAD_TYPE, 0, 0, NULL);
334         }
335         for (i = 0; i < exp->un.cast.cast_to.deref_count; i++)
336         {
337             rtn.type = types_find_pointer(&rtn.type);
338             if (rtn.type.id == dbg_itype_none)
339             {
340                 dbg_printf("Cannot find pointer type\n");
341                 RaiseException(DEBUG_STATUS_BAD_TYPE, 0, 0, NULL);
342             }
343         }
344         break;
345     case EXPR_TYPE_STRING:
346         rtn.cookie      = DLV_HOST;
347         rtn.type.id     = dbg_itype_astring;
348         rtn.type.module = 0;
349         rtn.addr.Offset = (unsigned int)&exp->un.string.str;
350         break;
351     case EXPR_TYPE_U_CONST:
352         rtn.cookie      = DLV_HOST;
353         rtn.type.id     = dbg_itype_unsigned_int;
354         rtn.type.module = 0;
355         rtn.addr.Offset = (unsigned int)&exp->un.u_const.value;
356         break;
357     case EXPR_TYPE_S_CONST:
358         rtn.cookie      = DLV_HOST;
359         rtn.type.id     = dbg_itype_signed_int;
360         rtn.type.module = 0;
361         rtn.addr.Offset = (unsigned int)&exp->un.s_const.value;
362         break;
363     case EXPR_TYPE_SYMBOL:
364         switch (symbol_get_lvalue(exp->un.symbol.name, -1, &rtn, FALSE))
365         {
366         case sglv_found:
367             break;
368         case sglv_unknown:
369             RaiseException(DEBUG_STATUS_NO_SYMBOL, 0, 0, NULL);
370             /* should never be here */
371         case sglv_aborted:
372             RaiseException(DEBUG_STATUS_ABORT, 0, 0, NULL);
373             /* should never be here */
374         }
375         break;
376     case EXPR_TYPE_PSTRUCT:
377         exp1 = expr_eval(exp->un.structure.exp1);
378         if (exp1.type.id == dbg_itype_none || !types_deref(&exp1, &rtn) ||
379             rtn.type.id == dbg_itype_none)
380             RaiseException(DEBUG_STATUS_BAD_TYPE, 0, 0, NULL);
381         if (!types_udt_find_element(&rtn, exp->un.structure.element_name,
382                                     &exp->un.structure.result))
383         {
384             dbg_printf("%s\n", exp->un.structure.element_name);
385             RaiseException(DEBUG_STATUS_NO_FIELD, 0, 0, NULL);
386         }
387         break;
388     case EXPR_TYPE_STRUCT:
389         exp1 = expr_eval(exp->un.structure.exp1);
390         if (exp1.type.id == dbg_itype_none) RaiseException(DEBUG_STATUS_BAD_TYPE, 0, 0, NULL);
391         rtn = exp1;
392         if (!types_udt_find_element(&rtn, exp->un.structure.element_name,
393                                     &exp->un.structure.result))
394         {
395             dbg_printf("%s\n", exp->un.structure.element_name);
396             RaiseException(DEBUG_STATUS_NO_FIELD, 0, 0, NULL);
397         }
398         break;
399     case EXPR_TYPE_CALL:
400         /*
401          * First, evaluate all of the arguments.  If any of them are not
402          * evaluable, then bail.
403          */
404         for (i = 0; i < exp->un.call.nargs; i++)
405         {
406             exp1 = expr_eval(exp->un.call.arg[i]);
407             if (exp1.type.id == dbg_itype_none)
408                 RaiseException(DEBUG_STATUS_BAD_TYPE, 0, 0, NULL);
409             cexp[i] = types_extract_as_integer(&exp1);
410         }
411
412         /*
413          * Now look up the address of the function itself.
414          */
415         switch (symbol_get_lvalue(exp->un.call.funcname, -1, &rtn, FALSE))
416         {
417         case sglv_found:
418             break;
419         case sglv_unknown:
420             RaiseException(DEBUG_STATUS_NO_SYMBOL, 0, 0, NULL);
421             /* should never be here */
422         case sglv_aborted:
423             RaiseException(DEBUG_STATUS_ABORT, 0, 0, NULL);
424             /* should never be here */
425         }
426
427 #if 0
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)
431          */
432         int             (*fptr)();
433
434         fptr = (int (*)()) rtn.addr.off;
435         switch (exp->un.call.nargs)
436         {
437         case 0:
438             exp->un.call.result = (*fptr)();
439             break;
440         case 1:
441             exp->un.call.result = (*fptr)(cexp[0]);
442             break;
443         case 2:
444             exp->un.call.result = (*fptr)(cexp[0], cexp[1]);
445             break;
446         case 3:
447             exp->un.call.result = (*fptr)(cexp[0], cexp[1], cexp[2]);
448             break;
449         case 4:
450             exp->un.call.result = (*fptr)(cexp[0], cexp[1], cexp[2], cexp[3]);
451             break;
452         case 5:
453             exp->un.call.result = (*fptr)(cexp[0], cexp[1], cexp[2], cexp[3], cexp[4]);
454             break;
455         }
456 #else
457         dbg_printf("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...
460          */
461         exp->un.call.result = 0;
462 #endif
463         rtn.cookie = DLV_HOST;
464         /* get function signature type */
465         types_get_info(&rtn.type, TI_GET_TYPE, &rtn.type);
466         /* and now, return type */
467         types_get_info(&rtn.type, TI_GET_TYPE, &rtn.type);
468         rtn.addr.Offset = (unsigned int)&exp->un.call.result;
469         break;
470     case EXPR_TYPE_INTVAR:
471         rtn.cookie = DLV_HOST;
472         if (!(div = dbg_get_internal_var(exp->un.intvar.name)))
473             RaiseException(DEBUG_STATUS_NO_SYMBOL, 0, 0, NULL);
474         rtn.type.id     = div->typeid;
475         rtn.type.module = 0;
476         rtn.addr.Offset = (unsigned int)div->pval;
477         break;
478     case EXPR_TYPE_BINOP:
479         rtn.cookie = DLV_HOST;
480         exp1 = expr_eval(exp->un.binop.exp1);
481         exp2 = expr_eval(exp->un.binop.exp2);
482         if (exp1.type.id == dbg_itype_none || exp2.type.id == dbg_itype_none)
483             RaiseException(DEBUG_STATUS_BAD_TYPE, 0, 0, NULL);
484         rtn.type.id = dbg_itype_signed_int;
485         rtn.type.module = 0;
486         rtn.addr.Offset = (unsigned int)&exp->un.binop.result;
487         switch (exp->un.binop.binop_type)
488         {
489         case EXP_OP_ADD:
490             if (!types_get_info(&exp1.type, TI_GET_SYMTAG, &tag) ||
491                 tag != SymTagPointerType ||
492                 !types_get_info(&exp1.type, TI_GET_TYPE, &type1))
493                 type1.id = dbg_itype_none;
494             if (!types_get_info(&exp2.type, TI_GET_SYMTAG, &tag) ||
495                 tag != SymTagPointerType ||
496                 !types_get_info(&exp2.type, TI_GET_TYPE, &type2))
497                 type2.id = dbg_itype_none;
498             scale1 = 1;
499             scale2 = 1;
500             if (type1.id != dbg_itype_none && type2.id != dbg_itype_none)
501                 RaiseException(DEBUG_STATUS_BAD_TYPE, 0, 0, NULL);
502             if (type1.id != dbg_itype_none)
503             {
504                 types_get_info(&type1, TI_GET_LENGTH, &scale2);
505                 rtn.type = exp1.type;
506             }
507             else if (type2.id != dbg_itype_none)
508             {
509                 types_get_info(&type2, TI_GET_LENGTH, &scale1);
510                 rtn.type = exp2.type;
511             }
512             exp->un.binop.result = types_extract_as_integer(&exp1) * (DWORD)scale1 +
513                 (DWORD)scale2 * types_extract_as_integer(&exp2);
514             break;
515         case EXP_OP_SUB:
516             if (!types_get_info(&exp1.type, TI_GET_SYMTAG, &tag) ||
517                 tag != SymTagPointerType ||
518                 !types_get_info(&exp1.type, TI_GET_TYPE, &type1))
519                 type1.id = dbg_itype_none;
520             if (!types_get_info(&exp2.type, TI_GET_SYMTAG, &tag) ||
521                 tag != SymTagPointerType ||
522                 !types_get_info(&exp2.type, TI_GET_TYPE, &type2))
523                 type2.id = dbg_itype_none;
524             scale1 = 1;
525             scale2 = 1;
526             scale3 = 1;
527             if (type1.id != dbg_itype_none && type2.id != dbg_itype_none)
528             {
529                 WINE_FIXME("This may fail (if module base address are wrongly calculated)\n");
530                 if (memcmp(&type1, &type2, sizeof(struct dbg_type)))
531                     RaiseException(DEBUG_STATUS_BAD_TYPE, 0, 0, NULL);
532                 types_get_info(&type1, TI_GET_LENGTH, &scale3);
533             }
534             else if (type1.id != dbg_itype_none)
535             {
536                 types_get_info(&type1, TI_GET_LENGTH, &scale2);
537                 rtn.type = exp1.type;
538             }
539             else if (type2.id != dbg_itype_none)
540             {
541                 types_get_info(&type2, TI_GET_LENGTH, &scale1);
542                 rtn.type = exp2.type;
543             }
544             exp->un.binop.result = (types_extract_as_integer(&exp1) * (DWORD)scale1 - 
545                                     types_extract_as_integer(&exp2) * (DWORD)scale2) / (DWORD)scale3;
546             break;
547         case EXP_OP_SEG:
548             rtn.type.id = dbg_itype_none;
549             rtn.type.module = 0;
550             rtn.addr.Mode = AddrMode1632;
551             rtn.addr.Segment = types_extract_as_integer(&exp1);
552             rtn.addr.Offset = types_extract_as_integer(&exp2);
553             break;
554         case EXP_OP_LOR:
555             exp->un.binop.result = (types_extract_as_integer(&exp1) || types_extract_as_integer(&exp2));
556             break;
557         case EXP_OP_LAND:
558             exp->un.binop.result = (types_extract_as_integer(&exp1) && types_extract_as_integer(&exp2));
559             break;
560         case EXP_OP_OR:
561             exp->un.binop.result = (types_extract_as_integer(&exp1) | types_extract_as_integer(&exp2));
562             break;
563         case EXP_OP_AND:
564             exp->un.binop.result = (types_extract_as_integer(&exp1) & types_extract_as_integer(&exp2));
565             break;
566         case EXP_OP_XOR:
567             exp->un.binop.result = (types_extract_as_integer(&exp1) ^ types_extract_as_integer(&exp2));
568             break;
569         case EXP_OP_EQ:
570             exp->un.binop.result = (types_extract_as_integer(&exp1) == types_extract_as_integer(&exp2));
571             break;
572         case EXP_OP_GT:
573             exp->un.binop.result = (types_extract_as_integer(&exp1) > types_extract_as_integer(&exp2));
574             break;
575         case EXP_OP_LT:
576             exp->un.binop.result = (types_extract_as_integer(&exp1) < types_extract_as_integer(&exp2));
577             break;
578         case EXP_OP_GE:
579             exp->un.binop.result = (types_extract_as_integer(&exp1) >= types_extract_as_integer(&exp2));
580             break;
581         case EXP_OP_LE:
582             exp->un.binop.result = (types_extract_as_integer(&exp1) <= types_extract_as_integer(&exp2));
583             break;
584         case EXP_OP_NE:
585             exp->un.binop.result = (types_extract_as_integer(&exp1) != types_extract_as_integer(&exp2));
586             break;
587         case EXP_OP_SHL:
588             exp->un.binop.result = ((unsigned long)types_extract_as_integer(&exp1) << types_extract_as_integer(&exp2));
589             break;
590         case EXP_OP_SHR:
591             exp->un.binop.result = ((unsigned long)types_extract_as_integer(&exp1) >> types_extract_as_integer(&exp2));
592             break;
593         case EXP_OP_MUL:
594             exp->un.binop.result = (types_extract_as_integer(&exp1) * types_extract_as_integer(&exp2));
595             break;
596         case EXP_OP_DIV:
597             if (types_extract_as_integer(&exp2) == 0) RaiseException(DEBUG_STATUS_DIV_BY_ZERO, 0, 0, NULL);
598             exp->un.binop.result = (types_extract_as_integer(&exp1) / types_extract_as_integer(&exp2));
599             break;
600         case EXP_OP_REM:
601             if (types_extract_as_integer(&exp2) == 0) RaiseException(DEBUG_STATUS_DIV_BY_ZERO, 0, 0, NULL);
602             exp->un.binop.result = (types_extract_as_integer(&exp1) % types_extract_as_integer(&exp2));
603             break;
604         case EXP_OP_ARR:
605             if (!types_array_index(&exp1, types_extract_as_integer(&exp2), &rtn))
606                 RaiseException(DEBUG_STATUS_CANT_DEREF, 0, 0, NULL);
607             break;
608         default: RaiseException(DEBUG_STATUS_INTERNAL_ERROR, 0, 0, NULL);
609         }
610         break;
611     case EXPR_TYPE_UNOP:
612         rtn.cookie = DLV_HOST;
613         exp1 = expr_eval(exp->un.unop.exp1);
614         if (exp1.type.id == dbg_itype_none) RaiseException(DEBUG_STATUS_BAD_TYPE, 0, 0, NULL);
615         rtn.addr.Offset = (unsigned int)&exp->un.unop.result;
616         rtn.type.id     = dbg_itype_signed_int;
617         rtn.type.module = 0;
618         switch (exp->un.unop.unop_type)
619         {
620         case EXP_OP_NEG:
621             exp->un.unop.result = -types_extract_as_integer(&exp1);
622             break;
623         case EXP_OP_NOT:
624             exp->un.unop.result = !types_extract_as_integer(&exp1);
625             break;
626         case EXP_OP_LNOT:
627             exp->un.unop.result = ~types_extract_as_integer(&exp1);
628             break;
629         case EXP_OP_DEREF:
630             if (!types_deref(&exp1, &rtn))
631                 RaiseException(DEBUG_STATUS_BAD_TYPE, 0, 0, NULL);
632             break;
633         case EXP_OP_FORCE_DEREF:
634             rtn = exp1;
635             if (exp1.cookie == DLV_TARGET)
636                 dbg_read_memory(memory_to_linear_addr(&exp1.addr), &rtn.addr.Offset, sizeof(rtn.addr.Offset));
637             break;
638         case EXP_OP_ADDR:
639             /* only do it on linear addresses */
640             if (exp1.addr.Mode != AddrModeFlat)
641                 RaiseException(DEBUG_STATUS_CANT_DEREF, 0, 0, NULL);
642             exp->un.unop.result = (unsigned int)memory_to_linear_addr(&exp1.addr);
643             rtn.type = types_find_pointer(&exp1.type);
644             if (rtn.type.id == dbg_itype_none)
645                 RaiseException(DEBUG_STATUS_CANT_DEREF, 0, 0, NULL);
646             break;
647         default: RaiseException(DEBUG_STATUS_INTERNAL_ERROR, 0, 0, NULL);
648         }
649         break;
650     default:
651         WINE_FIXME("Unexpected expression (%d).\n", exp->type);
652         RaiseException(DEBUG_STATUS_INTERNAL_ERROR, 0, 0, NULL);
653         break;
654     }
655
656     return rtn;
657 }
658
659 int expr_print(const struct expr* exp)
660 {
661     int                 i;
662     struct dbg_type     type;
663
664     switch (exp->type)
665     {
666     case EXPR_TYPE_CAST:
667         WINE_FIXME("No longer supported (missing module base)\n");
668         dbg_printf("((");
669         switch (exp->un.cast.cast_to.type)
670         {
671         case type_expr_type_id:
672             type.module = 0;
673             type.id = exp->un.cast.cast_to.type;
674             types_print_type(&type, FALSE); break;
675         case type_expr_udt_class:
676             dbg_printf("class %s", exp->un.cast.cast_to.u.name); break;
677         case type_expr_udt_struct:
678             dbg_printf("struct %s", exp->un.cast.cast_to.u.name); break;
679         case type_expr_udt_union:
680             dbg_printf("union %s", exp->un.cast.cast_to.u.name); break;
681         case type_expr_enumeration:
682             dbg_printf("enum %s", exp->un.cast.cast_to.u.name); break;
683         }
684         for (i = 0; i < exp->un.cast.cast_to.deref_count; i++)
685             dbg_printf("*");
686         dbg_printf(")");
687         expr_print(exp->un.cast.expr);
688         dbg_printf(")");
689         break;
690     case EXPR_TYPE_INTVAR:
691         dbg_printf("$%s", exp->un.intvar.name);
692         break;
693     case EXPR_TYPE_U_CONST:
694         dbg_printf("%u", exp->un.u_const.value);
695         break;
696     case EXPR_TYPE_S_CONST:
697         dbg_printf("%d", exp->un.s_const.value);
698         break;
699     case EXPR_TYPE_STRING:
700         dbg_printf("\"%s\"", exp->un.string.str);
701         break;
702     case EXPR_TYPE_SYMBOL:
703         dbg_printf("%s" , exp->un.symbol.name);
704         break;
705     case EXPR_TYPE_PSTRUCT:
706         expr_print(exp->un.structure.exp1);
707         dbg_printf("->%s", exp->un.structure.element_name);
708         break;
709     case EXPR_TYPE_STRUCT:
710         expr_print(exp->un.structure.exp1);
711         dbg_printf(".%s", exp->un.structure.element_name);
712         break;
713     case EXPR_TYPE_CALL:
714         dbg_printf("%s(",exp->un.call.funcname);
715         for (i = 0; i < exp->un.call.nargs; i++)
716         {
717             expr_print(exp->un.call.arg[i]);
718             if (i != exp->un.call.nargs - 1) dbg_printf(", ");
719         }
720         dbg_printf(")");
721         break;
722     case EXPR_TYPE_BINOP:
723         dbg_printf("(");
724         expr_print(exp->un.binop.exp1);
725         switch (exp->un.binop.binop_type)
726         {
727         case EXP_OP_ADD:        dbg_printf(" + ");    break;
728         case EXP_OP_SUB:        dbg_printf(" - ");    break;
729         case EXP_OP_SEG:        dbg_printf(":");      break;
730         case EXP_OP_LOR:        dbg_printf(" || ");   break;
731         case EXP_OP_LAND:       dbg_printf(" && ");   break;
732         case EXP_OP_OR:         dbg_printf(" | ");    break;
733         case EXP_OP_AND:        dbg_printf(" & ");    break;
734         case EXP_OP_XOR:        dbg_printf(" ^ ");    break;
735         case EXP_OP_EQ:         dbg_printf(" == ");   break;
736         case EXP_OP_GT:         dbg_printf(" > ");    break;
737         case EXP_OP_LT:         dbg_printf(" < ");    break;
738         case EXP_OP_GE:         dbg_printf(" >= ");   break;
739         case EXP_OP_LE:         dbg_printf(" <= ");   break;
740         case EXP_OP_NE:         dbg_printf(" != ");   break;
741         case EXP_OP_SHL:        dbg_printf(" << ");   break;
742         case EXP_OP_SHR:        dbg_printf(" >> ");   break;
743         case EXP_OP_MUL:        dbg_printf(" * ");    break;
744         case EXP_OP_DIV:        dbg_printf(" / ");    break;
745         case EXP_OP_REM:        dbg_printf(" %% ");   break;
746         case EXP_OP_ARR:        dbg_printf("[");      break;
747         default:                                      break;
748         }
749         expr_print(exp->un.binop.exp2);
750         if (exp->un.binop.binop_type == EXP_OP_ARR) dbg_printf("]");
751         dbg_printf(")");
752         break;
753     case EXPR_TYPE_UNOP:
754         switch (exp->un.unop.unop_type)
755         {
756         case EXP_OP_NEG:        dbg_printf("-");      break;
757         case EXP_OP_NOT:        dbg_printf("!");      break;
758         case EXP_OP_LNOT:       dbg_printf("~");      break;
759         case EXP_OP_DEREF:      dbg_printf("*");      break;
760         case EXP_OP_ADDR:       dbg_printf("&");      break;
761         }
762         expr_print(exp->un.unop.exp1);
763         break;
764     default:
765         WINE_FIXME("Unexpected expression (%u).\n", exp->type);
766         RaiseException(DEBUG_STATUS_INTERNAL_ERROR, 0, 0, NULL);
767         break;
768     }
769
770     return TRUE;
771 }
772
773 struct expr* expr_clone(const struct expr* exp, BOOL *local_binding)
774 {
775     int                 i;
776     struct expr*        rtn;
777
778     rtn = HeapAlloc(GetProcessHeap(), 0, sizeof(struct expr));
779
780     /*
781      * First copy the contents of the expression itself.
782      */
783     *rtn = *exp;
784
785     switch (exp->type)
786     {
787     case EXPR_TYPE_CAST:
788         rtn->un.cast.expr = expr_clone(exp->un.cast.expr, local_binding);
789         break;
790     case EXPR_TYPE_INTVAR:
791         rtn->un.intvar.name = strcpy(HeapAlloc(GetProcessHeap(), 0, strlen(exp->un.intvar.name) + 1), exp->un.intvar.name);
792         break;
793     case EXPR_TYPE_U_CONST:
794     case EXPR_TYPE_S_CONST:
795         break;
796     case EXPR_TYPE_STRING:
797         rtn->un.string.str = strcpy(HeapAlloc(GetProcessHeap(), 0, strlen(exp->un.string.str) + 1), exp->un.string.str);
798         break;
799     case EXPR_TYPE_SYMBOL:
800         rtn->un.symbol.name = strcpy(HeapAlloc(GetProcessHeap(), 0, strlen(exp->un.symbol.name) + 1), exp->un.symbol.name);
801         if (local_binding && symbol_is_local(exp->un.symbol.name))
802             *local_binding = TRUE;
803         break;
804     case EXPR_TYPE_PSTRUCT:
805     case EXPR_TYPE_STRUCT:
806         rtn->un.structure.exp1 = expr_clone(exp->un.structure.exp1, local_binding);
807         rtn->un.structure.element_name = strcpy(HeapAlloc(GetProcessHeap(), 0, strlen(exp->un.structure.element_name) + 1), exp->un.structure.element_name);
808         break;
809     case EXPR_TYPE_CALL:
810         for (i = 0; i < exp->un.call.nargs; i++)
811         {
812             rtn->un.call.arg[i] = expr_clone(exp->un.call.arg[i], local_binding);
813         }
814         rtn->un.call.funcname = strcpy(HeapAlloc(GetProcessHeap(), 0, strlen(exp->un.call.funcname) + 1), exp->un.call.funcname);
815         break;
816     case EXPR_TYPE_BINOP:
817         rtn->un.binop.exp1 = expr_clone(exp->un.binop.exp1, local_binding);
818         rtn->un.binop.exp2 = expr_clone(exp->un.binop.exp2, local_binding);
819         break;
820     case EXPR_TYPE_UNOP:
821         rtn->un.unop.exp1 = expr_clone(exp->un.unop.exp1, local_binding);
822         break;
823     default:
824         WINE_FIXME("Unexpected expression (%u).\n", exp->type);
825         RaiseException(DEBUG_STATUS_INTERNAL_ERROR, 0, 0, NULL);
826         break;
827     }
828
829     return rtn;
830 }
831
832
833 /*
834  * Recursively go through an expression tree and free all memory associated
835  * with it.
836  */
837 int expr_free(struct expr* exp)
838 {
839     int i;
840
841     switch (exp->type)
842     {
843     case EXPR_TYPE_CAST:
844         expr_free(exp->un.cast.expr);
845         break;
846     case EXPR_TYPE_INTVAR:
847         HeapFree(GetProcessHeap(), 0, (char*)exp->un.intvar.name);
848         break;
849     case EXPR_TYPE_U_CONST:
850     case EXPR_TYPE_S_CONST:
851         break;
852     case EXPR_TYPE_STRING:
853         HeapFree(GetProcessHeap(), 0, (char*)exp->un.string.str);
854         break;
855     case EXPR_TYPE_SYMBOL:
856         HeapFree(GetProcessHeap(), 0, (char*)exp->un.symbol.name);
857         break;
858     case EXPR_TYPE_PSTRUCT:
859     case EXPR_TYPE_STRUCT:
860         expr_free(exp->un.structure.exp1);
861         HeapFree(GetProcessHeap(), 0, (char*)exp->un.structure.element_name);
862         break;
863     case EXPR_TYPE_CALL:
864         for (i = 0; i < exp->un.call.nargs; i++)
865         {
866             expr_free(exp->un.call.arg[i]);
867         }
868         HeapFree(GetProcessHeap(), 0, (char*)exp->un.call.funcname);
869         break;
870     case EXPR_TYPE_BINOP:
871         expr_free(exp->un.binop.exp1);
872         expr_free(exp->un.binop.exp2);
873         break;
874     case EXPR_TYPE_UNOP:
875         expr_free(exp->un.unop.exp1);
876         break;
877     default:
878         WINE_FIXME("Unexpected expression (%u).\n", exp->type);
879         RaiseException(DEBUG_STATUS_INTERNAL_ERROR, 0, 0, NULL);
880         break;
881     }
882
883     HeapFree(GetProcessHeap(), 0, exp);
884     return TRUE;
885 }