1ebd5bdec187dcbc872619d8018ae125244ab95e
[sdk] / compiler / bootstrap / libec / bootstrap / pass15.c
1 /* Code generated from eC source file: pass15.ec */
2 #if defined(_WIN32)
3 #define __runtimePlatform 1
4 #elif defined(__APPLE__)
5 #define __runtimePlatform 3
6 #else
7 #define __runtimePlatform 2
8 #endif
9 #if defined(__GNUC__)
10 typedef long long int64;
11 typedef unsigned long long uint64;
12 #ifndef _WIN32
13 #define __declspec(x)
14 #endif
15 #elif defined(__TINYC__)
16 #include <stdarg.h>
17 #define __builtin_va_list va_list
18 #define __builtin_va_start va_start
19 #define __builtin_va_end va_end
20 #ifdef _WIN32
21 #define strcasecmp stricmp
22 #define strncasecmp strnicmp
23 #define __declspec(x) __attribute__((x))
24 #else
25 #define __declspec(x)
26 #endif
27 typedef long long int64;
28 typedef unsigned long long uint64;
29 #else
30 typedef __int64 int64;
31 typedef unsigned __int64 uint64;
32 #endif
33 #ifdef __BIG_ENDIAN__
34 #define __ENDIAN_PAD(x) (8 - (x))
35 #else
36 #define __ENDIAN_PAD(x) 0
37 #endif
38 #if defined(_WIN32)
39 #   if defined(__GNUC__) || defined(__TINYC__)
40 #      define ecere_stdcall __attribute__((__stdcall__))
41 #      define ecere_gcc_struct __attribute__((gcc_struct))
42 #   else
43 #      define ecere_stdcall __stdcall
44 #      define ecere_gcc_struct
45 #   endif
46 #else
47 #   define ecere_stdcall
48 #   define ecere_gcc_struct
49 #endif
50 #include <stdint.h>
51 #include <sys/types.h>
52 enum yytokentype
53 {
54 IDENTIFIER = 258, CONSTANT = 259, STRING_LITERAL = 260, SIZEOF = 261, PTR_OP = 262, INC_OP = 263, DEC_OP = 264, LEFT_OP = 265, RIGHT_OP = 266, LE_OP = 267, GE_OP = 268, EQ_OP = 269, NE_OP = 270, AND_OP = 271, OR_OP = 272, MUL_ASSIGN = 273, DIV_ASSIGN = 274, MOD_ASSIGN = 275, ADD_ASSIGN = 276, SUB_ASSIGN = 277, LEFT_ASSIGN = 278, RIGHT_ASSIGN = 279, AND_ASSIGN = 280, XOR_ASSIGN = 281, OR_ASSIGN = 282, TYPE_NAME = 283, TYPEDEF = 284, EXTERN = 285, STATIC = 286, AUTO = 287, REGISTER = 288, CHAR = 289, SHORT = 290, INT = 291, UINT = 292, INT64 = 293, LONG = 294, SIGNED = 295, UNSIGNED = 296, FLOAT = 297, DOUBLE = 298, CONST = 299, VOLATILE = 300, VOID = 301, VALIST = 302, STRUCT = 303, UNION = 304, ENUM = 305, ELLIPSIS = 306, CASE = 307, DEFAULT = 308, IF = 309, SWITCH = 310, WHILE = 311, DO = 312, FOR = 313, GOTO = 314, CONTINUE = 315, BREAK = 316, RETURN = 317, IFX = 318, ELSE = 319, CLASS = 320, THISCLASS = 321, CLASS_NAME = 322, PROPERTY = 323, SETPROP = 324, GETPROP = 325, NEWOP = 326, RENEW = 327, DELETE = 328, EXT_DECL = 329, EXT_STORAGE = 330, IMPORT = 331, DEFINE = 332, VIRTUAL = 333, ATTRIB = 334, PUBLIC = 335, PRIVATE = 336, TYPED_OBJECT = 337, ANY_OBJECT = 338, _INCREF = 339, EXTENSION = 340, ASM = 341, TYPEOF = 342, WATCH = 343, STOPWATCHING = 344, FIREWATCHERS = 345, WATCHABLE = 346, CLASS_DESIGNER = 347, CLASS_NO_EXPANSION = 348, CLASS_FIXED = 349, ISPROPSET = 350, CLASS_DEFAULT_PROPERTY = 351, PROPERTY_CATEGORY = 352, CLASS_DATA = 353, CLASS_PROPERTY = 354, SUBCLASS = 355, NAMESPACE = 356, NEW0OP = 357, RENEW0 = 358, VAARG = 359, DBTABLE = 360, DBFIELD = 361, DBINDEX = 362, DATABASE_OPEN = 363, ALIGNOF = 364, ATTRIB_DEP = 365, __ATTRIB = 366, BOOL = 367, _BOOL = 368, _COMPLEX = 369, _IMAGINARY = 370, RESTRICT = 371, THREAD = 372, WIDE_STRING_LITERAL = 373, BUILTIN_OFFSETOF = 374
55 };
56
57 extern int returnCode;
58
59 extern unsigned int yydebug;
60
61 extern unsigned int echoOn;
62
63 void resetScanner();
64
65 int propWatcherID;
66
67 int expression_yyparse();
68
69 static char * thisNameSpace;
70
71 unsigned int thisClassParams = 1;
72
73 unsigned int internalValueCounter;
74
75 extern unsigned int outputLineNumbers;
76
77 extern struct __ecereNameSpace__ecere__com__Property * __ecereProp_float_isInf;
78
79 extern struct __ecereNameSpace__ecere__com__Property * __ecereProp_float_signBit;
80
81 extern struct __ecereNameSpace__ecere__com__Property * __ecereProp_float_isNan;
82
83 extern struct __ecereNameSpace__ecere__com__Property * __ecereProp_double_isInf;
84
85 extern struct __ecereNameSpace__ecere__com__Property * __ecereProp_double_signBit;
86
87 extern struct __ecereNameSpace__ecere__com__Property * __ecereProp_double_isNan;
88
89 extern int targetBits;
90
91 extern unsigned int inCompiler;
92
93 extern unsigned int inPreCompiler;
94
95 extern unsigned int inDebugger;
96
97 extern struct __ecereNameSpace__ecere__com__Property * __ecereProp___ecereNameSpace__ecere__sys__BinaryTree_first;
98
99 extern struct __ecereNameSpace__ecere__com__Property * __ecereProp___ecereNameSpace__ecere__sys__BTNode_next;
100
101 int UnescapeString(char * d, char * s, int len)
102 {
103 int j = 0, k = 0;
104 char ch;
105
106 while(j < len && (ch = s[j]))
107 {
108 switch(ch)
109 {
110 case '\\':
111 switch((ch = s[++j]))
112 {
113 case 'n':
114 d[k] = '\n';
115 break;
116 case 't':
117 d[k] = '\t';
118 break;
119 case 'a':
120 d[k] = '\a';
121 break;
122 case 'b':
123 d[k] = '\b';
124 break;
125 case 'f':
126 d[k] = '\f';
127 break;
128 case 'r':
129 d[k] = '\r';
130 break;
131 case 'v':
132 d[k] = '\v';
133 break;
134 case '\\':
135 d[k] = '\\';
136 break;
137 case '\"':
138 d[k] = '\"';
139 break;
140 case '\'':
141 d[k] = '\'';
142 break;
143 default:
144 d[k] = '\\';
145 d[k] = ch;
146 }
147 break;
148 default:
149 d[k] = ch;
150 }
151 j++, k++;
152 }
153 d[k] = '\0';
154 return k;
155 }
156
157 char * OffsetEscapedString(char * s, int len, int offset)
158 {
159 char ch;
160 int j = 0, k = 0;
161
162 while(j < len && k < offset && (ch = s[j]))
163 {
164 if(ch == '\\')
165 ++j;
166 j++, k++;
167 }
168 return (k == offset) ? s + j : (((void *)0));
169 }
170
171 extern int __ecereVMethodID_class_OnGetString;
172
173 extern struct __ecereNameSpace__ecere__com__Property * __ecereProp_Type_isPointerType;
174
175 extern unsigned int parseError;
176
177 static int definedExpStackPos;
178
179 static void * definedExpStack[512];
180
181 extern const char *  sourceFile;
182
183 extern struct __ecereNameSpace__ecere__com__Property * __ecereProp_Type_specConst;
184
185 unsigned int reachedPass15;
186
187 extern unsigned int memoryGuard;
188
189 struct __ecereNameSpace__ecere__sys__OldList
190 {
191 void *  first;
192 void *  last;
193 int count;
194 unsigned int offset;
195 unsigned int circ;
196 } ecere_gcc_struct;
197
198 struct __ecereNameSpace__ecere__com__DataValue
199 {
200 union
201 {
202 char c;
203 unsigned char uc;
204 short s;
205 unsigned short us;
206 int i;
207 unsigned int ui;
208 void *  p;
209 float f;
210 double d;
211 long long i64;
212 uint64 ui64;
213 } ecere_gcc_struct __anon1;
214 } ecere_gcc_struct;
215
216 struct __ecereNameSpace__ecere__com__SerialBuffer
217 {
218 unsigned char *  _buffer;
219 unsigned int count;
220 unsigned int _size;
221 unsigned int pos;
222 } ecere_gcc_struct;
223
224 extern void *  __ecereNameSpace__ecere__com__eSystem_New(unsigned int size);
225
226 extern void *  __ecereNameSpace__ecere__com__eSystem_New0(unsigned int size);
227
228 extern void *  __ecereNameSpace__ecere__com__eSystem_Renew(void *  memory, unsigned int size);
229
230 extern void *  __ecereNameSpace__ecere__com__eSystem_Renew0(void *  memory, unsigned int size);
231
232 extern void __ecereNameSpace__ecere__com__eSystem_Delete(void *  memory);
233
234 struct Pointer;
235
236 struct Attrib;
237
238 struct Attribute;
239
240 struct TemplateArgument;
241
242 struct DBTableEntry;
243
244 struct DBIndexItem;
245
246 struct DBTableDef;
247
248 struct CodePosition
249 {
250 int line;
251 int charPos;
252 int pos;
253 int included;
254 } ecere_gcc_struct;
255
256 extern size_t strlen(const char * );
257
258 extern int strcmp(const char * , const char * );
259
260 extern int sprintf(char * , const char * , ...);
261
262 extern char *  strcat(char * , const char * );
263
264 extern char *  __ecereNameSpace__ecere__sys__CopyString(const char *  string);
265
266 extern int isprint(int c);
267
268 extern char *  strcpy(char * , const char * );
269
270 extern void Compiler_Error(const char *  format, ...);
271
272 extern const char *  __ecereNameSpace__ecere__GetTranslatedString(const char * name, const char *  string, const char *  stringAndContext);
273
274 struct __ecereNameSpace__ecere__com__LinkList
275 {
276 void * first;
277 void * last;
278 int count;
279 } ecere_gcc_struct;
280
281 extern char *  strchr(const char * , int);
282
283 extern void FullClassNameCat(char *  output, const char *  className, unsigned int includeTemplateParams);
284
285 extern void *  memcpy(void * , const void * , size_t size);
286
287 extern void __ecereNameSpace__ecere__sys__ChangeCh(char *  string, char ch1, char ch2);
288
289 extern void Compiler_Warning(const char *  format, ...);
290
291 extern unsigned long strtoul(const char *  nptr, char * *  endptr, int base);
292
293 extern long long strtoll(const char *  nptr, char * *  endptr, int base);
294
295 extern uint64 strtoull(const char *  nptr, char * *  endptr, int base);
296
297 extern int strtol(const char * , char * * , int base);
298
299 extern long long __ecereNameSpace__ecere__com___strtoi64(const char *  string, const char * *  endString, int base);
300
301 extern uint64 __ecereNameSpace__ecere__com___strtoui64(const char *  string, const char * *  endString, int base);
302
303 extern double strtod(const char * , char * * );
304
305 extern int strncmp(const char * , const char * , size_t n);
306
307 extern char *  __ecereNameSpace__ecere__sys__RSearchString(const char *  buffer, const char *  subStr, int maxLen, unsigned int matchCase, unsigned int matchWord);
308
309 extern char *  QMkString(const char *  source);
310
311 extern char *  strncpy(char * , const char * , size_t n);
312
313 extern int printf(const char * , ...);
314
315 extern char *  strstr(const char * , const char * );
316
317 extern unsigned int __ecereNameSpace__ecere__sys__UTF8GetChar(const char *  string, int *  numBytes);
318
319 extern unsigned int (* __ecereProp_float_Get_isInf)(float this);
320
321 extern int (* __ecereProp_float_Get_signBit)(float this);
322
323 extern unsigned int (* __ecereProp_float_Get_isNan)(float this);
324
325 extern unsigned int (* __ecereProp_double_Get_isInf)(double this);
326
327 extern int (* __ecereProp_double_Get_signBit)(double this);
328
329 extern unsigned int (* __ecereProp_double_Get_isNan)(double this);
330
331 extern float (* __ecereMethod_float_inf)(void);
332
333 extern float (* __ecereMethod_float_nan)(void);
334
335 extern double (* __ecereMethod_double_inf)(void);
336
337 extern double (* __ecereMethod_double_nan)(void);
338
339 int __ecereVMethodID_class_OnGetString;
340
341 void SetYydebug(unsigned int b)
342 {
343 yydebug = b;
344 }
345
346 unsigned int GetParseError()
347 {
348 return parseError;
349 }
350
351 extern struct __ecereNameSpace__ecere__sys__OldList * ast;
352
353 extern struct __ecereNameSpace__ecere__sys__OldList *  MkList(void);
354
355 extern struct __ecereNameSpace__ecere__sys__OldList *  MkListOne(void *  item);
356
357 extern void ListAdd(struct __ecereNameSpace__ecere__sys__OldList * list, void *  item);
358
359 extern void FreeList(struct __ecereNameSpace__ecere__sys__OldList * list, void (*  FreeFunction)(void * ));
360
361 struct __ecereNameSpace__ecere__com__EnumClassData
362 {
363 struct __ecereNameSpace__ecere__sys__OldList values;
364 long long largest;
365 } ecere_gcc_struct;
366
367 extern struct __ecereNameSpace__ecere__sys__OldList *  CopyList(struct __ecereNameSpace__ecere__sys__OldList *  source, void *  (*  CopyFunction)(void * ));
368
369 void __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(struct __ecereNameSpace__ecere__sys__OldList * this, void *  item);
370
371 unsigned int __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert(struct __ecereNameSpace__ecere__sys__OldList * this, void *  prevItem, void *  item);
372
373 void __ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove(struct __ecereNameSpace__ecere__sys__OldList * this, void *  item);
374
375 void __ecereMethod___ecereNameSpace__ecere__sys__OldList_Free(struct __ecereNameSpace__ecere__sys__OldList * this, void (*  freeFn)(void * ));
376
377 void __ecereMethod___ecereNameSpace__ecere__sys__OldList_Clear(struct __ecereNameSpace__ecere__sys__OldList * this);
378
379 extern struct Pointer * MkPointer(struct __ecereNameSpace__ecere__sys__OldList * qualifiers, struct Pointer * pointer);
380
381 extern struct Attrib * MkAttrib(int type, struct __ecereNameSpace__ecere__sys__OldList *  attribs);
382
383 struct Location
384 {
385 struct CodePosition start;
386 struct CodePosition end;
387 } ecere_gcc_struct;
388
389 void ReadString(char * output, char * string)
390 {
391 int len = strlen(string);
392 int c, d = 0;
393 unsigned int quoted = 0, escaped = 0;
394
395 for(c = 0; c < len; c++)
396 {
397 char ch = string[c];
398
399 if(escaped)
400 {
401 switch(ch)
402 {
403 case 'n':
404 output[d] = '\n';
405 break;
406 case 't':
407 output[d] = '\t';
408 break;
409 case 'a':
410 output[d] = '\a';
411 break;
412 case 'b':
413 output[d] = '\b';
414 break;
415 case 'f':
416 output[d] = '\f';
417 break;
418 case 'r':
419 output[d] = '\r';
420 break;
421 case 'v':
422 output[d] = '\v';
423 break;
424 case '\\':
425 output[d] = '\\';
426 break;
427 case '\"':
428 output[d] = '\"';
429 break;
430 case '\'':
431 output[d] = '\'';
432 break;
433 default:
434 output[d] = ch;
435 }
436 d++;
437 escaped = 0;
438 }
439 else
440 {
441 if(ch == '\"')
442 quoted ^= 1;
443 else if(quoted)
444 {
445 if(ch == '\\')
446 escaped = 1;
447 else
448 output[d++] = ch;
449 }
450 }
451 }
452 output[d] = '\0';
453 }
454
455 char * PrintInt(long long result)
456 {
457 char temp[100];
458
459 if(result > (((int)0x7fffffff)))
460 sprintf(temp, ((__runtimePlatform == 1) ? "0x%I64X" : "0x%llX"), result);
461 else
462 sprintf(temp, ((__runtimePlatform == 1) ? "%I64d" : "%lld"), result);
463 if(result > (((int)0x7fffffff)) || result < (((int)0x80000000)))
464 strcat(temp, "LL");
465 return __ecereNameSpace__ecere__sys__CopyString(temp);
466 }
467
468 char * PrintUInt(uint64 result)
469 {
470 char temp[100];
471
472 if(result > (0xffffffff))
473 sprintf(temp, ((__runtimePlatform == 1) ? "0x%I64XLL" : "0x%llXLL"), result);
474 else if(result > (((int)0x7fffffff)))
475 sprintf(temp, ((__runtimePlatform == 1) ? "0x%I64X" : "0x%llX"), result);
476 else
477 sprintf(temp, ((__runtimePlatform == 1) ? "%I64d" : "%lld"), result);
478 return __ecereNameSpace__ecere__sys__CopyString(temp);
479 }
480
481 char * PrintInt64(long long result)
482 {
483 char temp[100];
484
485 if(result > (((int)0x7fffffff)) || result < (((int)0x80000000)))
486 sprintf(temp, ((__runtimePlatform == 1) ? "%I64dLL" : "%lldLL"), result);
487 else
488 sprintf(temp, ((__runtimePlatform == 1) ? "%I64d" : "%lld"), result);
489 return __ecereNameSpace__ecere__sys__CopyString(temp);
490 }
491
492 char * PrintUInt64(uint64 result)
493 {
494 char temp[100];
495
496 if(result > (0xffffffff))
497 sprintf(temp, ((__runtimePlatform == 1) ? "0x%I64XLL" : "0x%llXLL"), result);
498 else if(result > (((int)0x7fffffff)))
499 sprintf(temp, ((__runtimePlatform == 1) ? "0x%I64X" : "0x%llX"), result);
500 else
501 sprintf(temp, ((__runtimePlatform == 1) ? "%I64d" : "%lld"), result);
502 return __ecereNameSpace__ecere__sys__CopyString(temp);
503 }
504
505 char * PrintHexUInt(uint64 result)
506 {
507 char temp[100];
508
509 if(result > (0xffffffff))
510 sprintf(temp, ((__runtimePlatform == 1) ? "0x%I64X" : "0x%llX"), result);
511 else
512 sprintf(temp, ((__runtimePlatform == 1) ? "0x%I64X" : "0x%llX"), result);
513 if(result > (0xffffffff))
514 strcat(temp, "LL");
515 return __ecereNameSpace__ecere__sys__CopyString(temp);
516 }
517
518 char * PrintHexUInt64(uint64 result)
519 {
520 char temp[100];
521
522 if(result > (0xffffffff))
523 sprintf(temp, ((__runtimePlatform == 1) ? "0x%I64XLL" : "0x%llXLL"), result);
524 else
525 sprintf(temp, ((__runtimePlatform == 1) ? "0x%I64X" : "0x%llX"), result);
526 return __ecereNameSpace__ecere__sys__CopyString(temp);
527 }
528
529 char * PrintShort(short result)
530 {
531 char temp[100];
532
533 sprintf(temp, "%d", (unsigned short)result);
534 return __ecereNameSpace__ecere__sys__CopyString(temp);
535 }
536
537 char * PrintUShort(unsigned short result)
538 {
539 char temp[100];
540
541 if(result > 32767)
542 sprintf(temp, "0x%X", (int)result);
543 else
544 sprintf(temp, "%d", (int)result);
545 return __ecereNameSpace__ecere__sys__CopyString(temp);
546 }
547
548 char * PrintUChar(unsigned char result)
549 {
550 char temp[100];
551
552 sprintf(temp, "0x%X", result);
553 return __ecereNameSpace__ecere__sys__CopyString(temp);
554 }
555
556 char * PrintChar(char result)
557 {
558 char temp[100];
559
560 if(result > 0 && isprint(result))
561 sprintf(temp, "'%c'", result);
562 else if(result < 0)
563 sprintf(temp, "%d", (int)result);
564 else
565 sprintf(temp, "0x%X", (unsigned char)result);
566 return __ecereNameSpace__ecere__sys__CopyString(temp);
567 }
568
569 char * PrintFloat(float result)
570 {
571 char temp[350];
572
573 if(__ecereProp_float_Get_isInf(result))
574 {
575 if(__ecereProp_float_Get_signBit(result))
576 strcpy(temp, "-inf");
577 else
578 strcpy(temp, "inf");
579 }
580 else if(__ecereProp_float_Get_isNan(result))
581 {
582 if(__ecereProp_float_Get_signBit(result))
583 strcpy(temp, "-nan");
584 else
585 strcpy(temp, "nan");
586 }
587 else
588 sprintf(temp, "%.16ff", result);
589 return __ecereNameSpace__ecere__sys__CopyString(temp);
590 }
591
592 char * PrintDouble(double result)
593 {
594 char temp[350];
595
596 if(__ecereProp_double_Get_isInf(result))
597 {
598 if(__ecereProp_double_Get_signBit(result))
599 strcpy(temp, "-inf");
600 else
601 strcpy(temp, "inf");
602 }
603 else if(__ecereProp_double_Get_isNan(result))
604 {
605 if(__ecereProp_double_Get_signBit(result))
606 strcpy(temp, "-nan");
607 else
608 strcpy(temp, "nan");
609 }
610 else
611 sprintf(temp, "%.16f", result);
612 return __ecereNameSpace__ecere__sys__CopyString(temp);
613 }
614
615 extern struct Location yylloc;
616
617 struct ExtDecl
618 {
619 struct Location loc;
620 int type;
621 union
622 {
623 char * s;
624 struct Attrib * attr;
625 } ecere_gcc_struct __anon1;
626 } ecere_gcc_struct;
627
628 extern struct ExtDecl * MkExtDeclAttrib(struct Attrib * attr);
629
630 struct Expression;
631
632 extern struct Expression * parsedExpression;
633
634 extern struct Expression * QMkExpId(const char *  id);
635
636 extern struct Expression * MkExpOp(struct Expression * exp1, int op, struct Expression * exp2);
637
638 void ComputeExpression(struct Expression * exp);
639
640 extern struct Expression * MkExpConstant(const char *  string);
641
642 extern struct Attribute * MkAttribute(char * attr, struct Expression * exp);
643
644 extern void FreeExpression(struct Expression * exp);
645
646 extern void FreeExpContents(struct Expression * exp);
647
648 extern struct Expression * GetNonBracketsExp(struct Expression * exp);
649
650 extern struct Expression * CopyExpression(struct Expression * exp);
651
652 extern struct Expression * MkExpBrackets(struct __ecereNameSpace__ecere__sys__OldList * expressions);
653
654 extern struct Expression * MkExpCall(struct Expression * expression, struct __ecereNameSpace__ecere__sys__OldList * arguments);
655
656 extern struct Expression * MkExpCondition(struct Expression * cond, struct __ecereNameSpace__ecere__sys__OldList * expressions, struct Expression * elseExp);
657
658 extern struct Expression * MoveExpContents(struct Expression * exp);
659
660 extern struct Expression * QBrackets(struct Expression * exp);
661
662 extern struct Expression * QMkExpCond(struct Expression * cond, struct Expression * exp, struct Expression * elseExp);
663
664 struct Statement;
665
666 static struct Statement * curCompound;
667
668 extern struct Statement * MkCompoundStmt(struct __ecereNameSpace__ecere__sys__OldList * declarations, struct __ecereNameSpace__ecere__sys__OldList * statements);
669
670 extern struct Statement * MkExpressionStmt(struct __ecereNameSpace__ecere__sys__OldList * expressions);
671
672 extern struct Statement * MkIfStmt(struct __ecereNameSpace__ecere__sys__OldList * exp, struct Statement * statement, struct Statement * elseStmt);
673
674 extern struct Statement * MkForStmt(struct Statement * init, struct Statement * check, struct __ecereNameSpace__ecere__sys__OldList * inc, struct Statement * statement);
675
676 extern struct Statement * MkWhileStmt(struct __ecereNameSpace__ecere__sys__OldList * exp, struct Statement * statement);
677
678 extern struct Statement * MkFireWatchersStmt(struct Expression * object, struct __ecereNameSpace__ecere__sys__OldList * watches);
679
680 struct External;
681
682 struct External * curExternal, * afterExternal;
683
684 extern void FreeExternal(struct External * external);
685
686 struct Type;
687
688 static struct Type * curSwitchType;
689
690 extern struct Type * ProcessTypeString(const char *  string, unsigned int staticMethod);
691
692 extern void FreeType(struct Type * type);
693
694 extern struct Type * MkClassType(const char *  name);
695
696 extern void CopyTypeInto(struct Type * type, struct Type * src);
697
698 struct __ecereNameSpace__ecere__com__Class;
699
700 struct __ecereNameSpace__ecere__com__Instance
701 {
702 void * *  _vTbl;
703 struct __ecereNameSpace__ecere__com__Class * _class;
704 int _refCount;
705 } ecere_gcc_struct;
706
707 extern long long __ecereNameSpace__ecere__com__eClass_GetProperty(struct __ecereNameSpace__ecere__com__Class * _class, const char *  name);
708
709 extern void __ecereNameSpace__ecere__com__eClass_SetProperty(struct __ecereNameSpace__ecere__com__Class * _class, const char *  name, long long value);
710
711 static struct __ecereNameSpace__ecere__com__Class * currentClass;
712
713 struct __ecereNameSpace__ecere__com__Class * thisClass;
714
715 struct __ecereNameSpace__ecere__com__Class * containerClass;
716
717 extern unsigned int __ecereNameSpace__ecere__com__eClass_IsDerived(struct __ecereNameSpace__ecere__com__Class * _class, struct __ecereNameSpace__ecere__com__Class * from);
718
719 extern struct Expression * GetTemplateArgExpByName(const char *  paramName, struct __ecereNameSpace__ecere__com__Class * curClass, int tplType);
720
721 extern void *  __ecereNameSpace__ecere__com__eInstance_New(struct __ecereNameSpace__ecere__com__Class * _class);
722
723 extern void __ecereNameSpace__ecere__com__eInstance_SetMethod(struct __ecereNameSpace__ecere__com__Instance * instance, const char *  name, void *  function);
724
725 extern void __ecereNameSpace__ecere__com__eInstance_IncRef(struct __ecereNameSpace__ecere__com__Instance * instance);
726
727 extern void OutputExpression(struct Expression * exp, struct __ecereNameSpace__ecere__com__Instance * f);
728
729 extern struct __ecereNameSpace__ecere__com__Instance * fileInput;
730
731 int __ecereVMethodID___ecereNameSpace__ecere__sys__File_Seek;
732
733 int __ecereVMethodID___ecereNameSpace__ecere__sys__File_Read;
734
735 extern void __ecereNameSpace__ecere__com__eInstance_DecRef(struct __ecereNameSpace__ecere__com__Instance * instance);
736
737 int __ecereVMethodID___ecereNameSpace__ecere__sys__File_Write;
738
739 void SetThisClass(struct __ecereNameSpace__ecere__com__Class * c)
740 {
741 thisClass = c;
742 }
743
744 struct __ecereNameSpace__ecere__com__Class * GetThisClass()
745 {
746 return thisClass;
747 }
748
749 struct Context;
750
751 extern struct Context * curContext;
752
753 extern struct Context * topContext;
754
755 extern struct Context * PushContext(void);
756
757 extern void PopContext(struct Context * ctx);
758
759 extern void FreeContext(struct Context * context);
760
761 extern struct Context * globalContext;
762
763 struct ModuleImport;
764
765 extern struct ModuleImport * mainModule;
766
767 struct ModuleImport
768 {
769 struct ModuleImport * prev;
770 struct ModuleImport * next;
771 char *  name;
772 struct __ecereNameSpace__ecere__sys__OldList classes;
773 struct __ecereNameSpace__ecere__sys__OldList functions;
774 int importType;
775 int importAccess;
776 } ecere_gcc_struct;
777
778 struct __ecereNameSpace__ecere__com__NameSpace;
779
780 extern struct __ecereNameSpace__ecere__com__NameSpace *  globalData;
781
782 struct FunctionDefinition;
783
784 static struct FunctionDefinition * curFunction;
785
786 struct __ecereNameSpace__ecere__sys__BTNode;
787
788 struct __ecereNameSpace__ecere__sys__BTNode
789 {
790 uintptr_t key;
791 struct __ecereNameSpace__ecere__sys__BTNode * parent;
792 struct __ecereNameSpace__ecere__sys__BTNode * left;
793 struct __ecereNameSpace__ecere__sys__BTNode * right;
794 int depth;
795 } ecere_gcc_struct;
796
797 struct __ecereNameSpace__ecere__sys__BTNode * __ecereProp___ecereNameSpace__ecere__sys__BTNode_Get_next(struct __ecereNameSpace__ecere__sys__BTNode * this);
798
799 struct __ecereNameSpace__ecere__com__Property;
800
801 struct __ecereNameSpace__ecere__com__Property
802 {
803 struct __ecereNameSpace__ecere__com__Property * prev;
804 struct __ecereNameSpace__ecere__com__Property * next;
805 const char *  name;
806 unsigned int isProperty;
807 int memberAccess;
808 int id;
809 struct __ecereNameSpace__ecere__com__Class * _class;
810 const char *  dataTypeString;
811 struct __ecereNameSpace__ecere__com__Class * dataTypeClass;
812 struct Type * dataType;
813 void (*  Set)(void * , int);
814 int (*  Get)(void * );
815 unsigned int (*  IsSet)(void * );
816 void *  data;
817 void *  symbol;
818 int vid;
819 unsigned int conversion;
820 unsigned int watcherOffset;
821 const char *  category;
822 unsigned int compiled;
823 unsigned int selfWatchable;
824 unsigned int isWatchable;
825 } ecere_gcc_struct;
826
827 extern void __ecereNameSpace__ecere__com__eInstance_FireSelfWatchers(struct __ecereNameSpace__ecere__com__Instance * instance, struct __ecereNameSpace__ecere__com__Property * _property);
828
829 extern void __ecereNameSpace__ecere__com__eInstance_StopWatching(struct __ecereNameSpace__ecere__com__Instance * instance, struct __ecereNameSpace__ecere__com__Property * _property, struct __ecereNameSpace__ecere__com__Instance * object);
830
831 extern void __ecereNameSpace__ecere__com__eInstance_Watch(void *  instance, struct __ecereNameSpace__ecere__com__Property * _property, void *  object, void (*  callback)(void * , void * ));
832
833 extern void __ecereNameSpace__ecere__com__eInstance_FireWatchers(struct __ecereNameSpace__ecere__com__Instance * instance, struct __ecereNameSpace__ecere__com__Property * _property);
834
835 struct Identifier;
836
837 extern void FreeIdentifier(struct Identifier * id);
838
839 extern struct Identifier * MkIdentifier(const char *  string);
840
841 extern struct Expression * MkExpIdentifier(struct Identifier * id);
842
843 extern struct Expression * MkExpMember(struct Expression * expression, struct Identifier * member);
844
845 extern struct Identifier * CopyIdentifier(struct Identifier * id);
846
847 extern struct Expression * MkExpPointer(struct Expression * expression, struct Identifier * member);
848
849 struct __ecereNameSpace__ecere__sys__OldLink;
850
851 struct __ecereNameSpace__ecere__sys__OldLink
852 {
853 struct __ecereNameSpace__ecere__sys__OldLink * prev;
854 struct __ecereNameSpace__ecere__sys__OldLink * next;
855 void *  data;
856 } ecere_gcc_struct;
857
858 struct Declaration;
859
860 extern struct External * MkExternalDeclaration(struct Declaration * declaration);
861
862 extern struct Declaration * MkDeclaration(struct __ecereNameSpace__ecere__sys__OldList * specifiers, struct __ecereNameSpace__ecere__sys__OldList * initDeclarators);
863
864 struct Specifier;
865
866 extern struct Declaration * MkStructDeclaration(struct __ecereNameSpace__ecere__sys__OldList * specifiers, struct __ecereNameSpace__ecere__sys__OldList * declarators, struct Specifier * extStorage);
867
868 extern struct Specifier * MkStructOrUnion(int type, struct Identifier * id, struct __ecereNameSpace__ecere__sys__OldList * definitions);
869
870 extern struct Specifier * MkSpecifier(int specifier);
871
872 extern struct Specifier * MkSpecifierName(const char *  name);
873
874 extern struct Specifier * MkSpecifierExtended(struct ExtDecl * extDecl);
875
876 extern void FreeSpecifier(struct Specifier * spec);
877
878 extern struct Specifier * MkEnum(struct Identifier * id, struct __ecereNameSpace__ecere__sys__OldList * list);
879
880 struct Statement
881 {
882 struct Statement * prev;
883 struct Statement * next;
884 struct Location loc;
885 int type;
886 union
887 {
888 struct __ecereNameSpace__ecere__sys__OldList *  expressions;
889 struct
890 {
891 struct Identifier * id;
892 struct Statement * stmt;
893 } ecere_gcc_struct labeled;
894 struct
895 {
896 struct Expression * exp;
897 struct Statement * stmt;
898 } ecere_gcc_struct caseStmt;
899 struct
900 {
901 struct __ecereNameSpace__ecere__sys__OldList * declarations;
902 struct __ecereNameSpace__ecere__sys__OldList * statements;
903 struct Context * context;
904 unsigned int isSwitch;
905 } ecere_gcc_struct compound;
906 struct
907 {
908 struct __ecereNameSpace__ecere__sys__OldList * exp;
909 struct Statement * stmt;
910 struct Statement * elseStmt;
911 } ecere_gcc_struct ifStmt;
912 struct
913 {
914 struct __ecereNameSpace__ecere__sys__OldList * exp;
915 struct Statement * stmt;
916 } ecere_gcc_struct switchStmt;
917 struct
918 {
919 struct __ecereNameSpace__ecere__sys__OldList * exp;
920 struct Statement * stmt;
921 } ecere_gcc_struct whileStmt;
922 struct
923 {
924 struct __ecereNameSpace__ecere__sys__OldList * exp;
925 struct Statement * stmt;
926 } ecere_gcc_struct doWhile;
927 struct
928 {
929 struct Statement * init;
930 struct Statement * check;
931 struct __ecereNameSpace__ecere__sys__OldList * increment;
932 struct Statement * stmt;
933 } ecere_gcc_struct forStmt;
934 struct
935 {
936 struct Identifier * id;
937 } ecere_gcc_struct gotoStmt;
938 struct
939 {
940 struct Specifier * spec;
941 char * statements;
942 struct __ecereNameSpace__ecere__sys__OldList * inputFields;
943 struct __ecereNameSpace__ecere__sys__OldList * outputFields;
944 struct __ecereNameSpace__ecere__sys__OldList * clobberedFields;
945 } ecere_gcc_struct asmStmt;
946 struct
947 {
948 struct Expression * watcher;
949 struct Expression * object;
950 struct __ecereNameSpace__ecere__sys__OldList * watches;
951 } ecere_gcc_struct _watch;
952 struct
953 {
954 struct Identifier * id;
955 struct __ecereNameSpace__ecere__sys__OldList * exp;
956 struct __ecereNameSpace__ecere__sys__OldList * filter;
957 struct Statement * stmt;
958 } ecere_gcc_struct forEachStmt;
959 struct Declaration * decl;
960 } ecere_gcc_struct __anon1;
961 } ecere_gcc_struct;
962
963 extern struct Specifier * CopySpecifier(struct Specifier * spec);
964
965 extern struct Expression * MkExpClassSize(struct Specifier * _class);
966
967 struct Symbol;
968
969 struct Identifier
970 {
971 struct Identifier * prev;
972 struct Identifier * next;
973 struct Location loc;
974 struct Symbol * classSym;
975 struct Specifier * _class;
976 char *  string;
977 struct Identifier * badID;
978 } ecere_gcc_struct;
979
980 extern struct Symbol * FindStruct(struct Context * ctx, const char *  name);
981
982 extern struct Symbol * FindClass(const char *  name);
983
984 extern void DeclareClass(struct External * neededFor, struct Symbol * classSym, const char *  className);
985
986 extern struct Symbol * FindType(struct Context * ctx, const char *  name);
987
988 extern void FreeSymbol(struct Symbol * symbol);
989
990 struct ClassDef;
991
992 extern struct ClassDef * MkClassDefDeclaration(struct Declaration * decl);
993
994 extern void FreeClassDef(struct ClassDef * def);
995
996 struct Declarator;
997
998 extern struct Type * ProcessType(struct __ecereNameSpace__ecere__sys__OldList * specs, struct Declarator * decl);
999
1000 struct TemplateDatatype
1001 {
1002 struct __ecereNameSpace__ecere__sys__OldList *  specifiers;
1003 struct Declarator * decl;
1004 } ecere_gcc_struct;
1005
1006 extern struct Declarator * SpecDeclFromString(const char *  string, struct __ecereNameSpace__ecere__sys__OldList *  specs, struct Declarator * baseDecl);
1007
1008 extern struct Declarator * MkDeclaratorPointer(struct Pointer * pointer, struct Declarator * declarator);
1009
1010 extern struct Declarator * MkDeclaratorIdentifier(struct Identifier * id);
1011
1012 extern struct Declarator * MkStructDeclarator(struct Declarator * declarator, struct Expression * exp);
1013
1014 extern struct Declarator * MkDeclaratorArray(struct Declarator * declarator, struct Expression * exp);
1015
1016 struct Declarator
1017 {
1018 struct Declarator * prev;
1019 struct Declarator * next;
1020 struct Location loc;
1021 int type;
1022 struct Symbol * symbol;
1023 struct Declarator * declarator;
1024 union
1025 {
1026 struct Identifier * identifier;
1027 struct
1028 {
1029 struct Expression * exp;
1030 struct Expression * posExp;
1031 struct Attrib * attrib;
1032 } ecere_gcc_struct structDecl;
1033 struct
1034 {
1035 struct Expression * exp;
1036 struct Specifier * enumClass;
1037 } ecere_gcc_struct array;
1038 struct
1039 {
1040 struct __ecereNameSpace__ecere__sys__OldList * parameters;
1041 } ecere_gcc_struct function;
1042 struct
1043 {
1044 struct Pointer * pointer;
1045 } ecere_gcc_struct pointer;
1046 struct
1047 {
1048 struct ExtDecl * extended;
1049 } ecere_gcc_struct extended;
1050 } ecere_gcc_struct __anon1;
1051 } ecere_gcc_struct;
1052
1053 extern struct Identifier * GetDeclId(struct Declarator * decl);
1054
1055 extern struct Declarator * MkDeclaratorBrackets(struct Declarator * declarator);
1056
1057 extern struct Declarator * PlugDeclarator(struct Declarator * decl, struct Declarator * baseDecl);
1058
1059 extern struct Declarator * MkDeclaratorFunction(struct Declarator * declarator, struct __ecereNameSpace__ecere__sys__OldList * parameters);
1060
1061 extern void FreeDeclarator(struct Declarator * decl);
1062
1063 extern struct Declarator * GetFuncDecl(struct Declarator * decl);
1064
1065 extern struct Expression * MkExpClass(struct __ecereNameSpace__ecere__sys__OldList *  specifiers, struct Declarator * decl);
1066
1067 extern struct Declarator * CopyDeclarator(struct Declarator * declarator);
1068
1069 struct FunctionDefinition
1070 {
1071 struct FunctionDefinition * prev;
1072 struct FunctionDefinition * next;
1073 struct Location loc;
1074 struct __ecereNameSpace__ecere__sys__OldList *  specifiers;
1075 struct Declarator * declarator;
1076 struct __ecereNameSpace__ecere__sys__OldList *  declarations;
1077 struct Statement * body;
1078 struct __ecereNameSpace__ecere__com__Class * _class;
1079 struct __ecereNameSpace__ecere__sys__OldList attached;
1080 int declMode;
1081 struct Type * type;
1082 struct Symbol * propSet;
1083 int tempCount;
1084 unsigned int propertyNoThis;
1085 } ecere_gcc_struct;
1086
1087 extern struct Declarator * QMkPtrDecl(const char *  id);
1088
1089 struct ClassFunction;
1090
1091 struct ClassFunction
1092 {
1093 struct ClassFunction * prev;
1094 struct ClassFunction * next;
1095 struct Location loc;
1096 struct __ecereNameSpace__ecere__sys__OldList *  specifiers;
1097 struct Declarator * declarator;
1098 struct __ecereNameSpace__ecere__sys__OldList *  declarations;
1099 struct Statement * body;
1100 struct __ecereNameSpace__ecere__com__Class * _class;
1101 struct __ecereNameSpace__ecere__sys__OldList attached;
1102 int declMode;
1103 struct Type * type;
1104 struct Symbol * propSet;
1105 unsigned int isVirtual;
1106 unsigned int isConstructor;
1107 unsigned int isDestructor;
1108 unsigned int dontMangle;
1109 int id;
1110 int idCode;
1111 } ecere_gcc_struct;
1112
1113 extern struct External * ProcessClassFunction(struct __ecereNameSpace__ecere__com__Class * owningClass, struct ClassFunction * func, struct __ecereNameSpace__ecere__sys__OldList * defs, struct External * after, unsigned int makeStatic);
1114
1115 extern void FreeClassFunction(struct ClassFunction * func);
1116
1117 extern struct ClassFunction * MkClassFunction(struct __ecereNameSpace__ecere__sys__OldList * specifiers, struct Specifier * _class, struct Declarator * decl, struct __ecereNameSpace__ecere__sys__OldList * declList);
1118
1119 extern void ProcessClassFunctionBody(struct ClassFunction * func, struct Statement * body);
1120
1121 struct TypeName;
1122
1123 extern struct Expression * MkExpCast(struct TypeName * typeName, struct Expression * expression);
1124
1125 extern struct TypeName * MkTypeName(struct __ecereNameSpace__ecere__sys__OldList * qualifiers, struct Declarator * declarator);
1126
1127 struct TypeName
1128 {
1129 struct TypeName * prev;
1130 struct TypeName * next;
1131 struct Location loc;
1132 struct __ecereNameSpace__ecere__sys__OldList *  qualifiers;
1133 struct Declarator * declarator;
1134 int classObjectType;
1135 struct Expression * bitCount;
1136 } ecere_gcc_struct;
1137
1138 extern void FreeTypeName(struct TypeName * typeName);
1139
1140 extern struct TypeName * QMkClass(const char *  spec, struct Declarator * decl);
1141
1142 extern struct Expression * MkExpTypeSize(struct TypeName * typeName);
1143
1144 extern unsigned int IsVoidPtrCast(struct TypeName * typeName);
1145
1146 extern struct TypeName * QMkType(const char *  spec, struct Declarator * decl);
1147
1148 struct __ecereNameSpace__ecere__com__BTNamedLink;
1149
1150 struct __ecereNameSpace__ecere__com__BTNamedLink
1151 {
1152 const char *  name;
1153 struct __ecereNameSpace__ecere__com__BTNamedLink * parent;
1154 struct __ecereNameSpace__ecere__com__BTNamedLink * left;
1155 struct __ecereNameSpace__ecere__com__BTNamedLink * right;
1156 int depth;
1157 void *  data;
1158 } ecere_gcc_struct;
1159
1160 struct __ecereNameSpace__ecere__sys__NamedLink64;
1161
1162 struct __ecereNameSpace__ecere__sys__NamedLink64
1163 {
1164 struct __ecereNameSpace__ecere__sys__NamedLink64 * prev;
1165 struct __ecereNameSpace__ecere__sys__NamedLink64 * next;
1166 char *  name;
1167 long long data;
1168 } ecere_gcc_struct;
1169
1170 struct Instantiation;
1171
1172 struct Declaration
1173 {
1174 struct Declaration * prev;
1175 struct Declaration * next;
1176 struct Location loc;
1177 int type;
1178 union
1179 {
1180 struct
1181 {
1182 struct __ecereNameSpace__ecere__sys__OldList *  specifiers;
1183 struct __ecereNameSpace__ecere__sys__OldList *  declarators;
1184 } ecere_gcc_struct __anon1;
1185 struct Instantiation * inst;
1186 struct
1187 {
1188 struct Identifier * id;
1189 struct Expression * exp;
1190 } ecere_gcc_struct __anon2;
1191 } ecere_gcc_struct __anon1;
1192 struct Specifier * extStorage;
1193 struct Symbol * symbol;
1194 int declMode;
1195 } ecere_gcc_struct;
1196
1197 struct Instantiation
1198 {
1199 struct Instantiation * prev;
1200 struct Instantiation * next;
1201 struct Location loc;
1202 struct Specifier * _class;
1203 struct Expression * exp;
1204 struct __ecereNameSpace__ecere__sys__OldList *  members;
1205 struct Symbol * symbol;
1206 unsigned int fullSet;
1207 unsigned int isConstant;
1208 unsigned char *  data;
1209 struct Location nameLoc;
1210 struct Location insideLoc;
1211 unsigned int built;
1212 } ecere_gcc_struct;
1213
1214 extern void FreeInstance(struct Instantiation * inst);
1215
1216 extern struct Declaration * MkDeclarationInst(struct Instantiation * inst);
1217
1218 extern struct Instantiation * MkInstantiationNamed(struct __ecereNameSpace__ecere__sys__OldList * specs, struct Expression * exp, struct __ecereNameSpace__ecere__sys__OldList * members);
1219
1220 struct InitDeclarator;
1221
1222 extern void FreeInitDeclarator(struct InitDeclarator * decl);
1223
1224 struct PropertyWatch;
1225
1226 struct PropertyWatch
1227 {
1228 struct PropertyWatch * prev;
1229 struct PropertyWatch * next;
1230 struct Location loc;
1231 struct Statement * compound;
1232 struct __ecereNameSpace__ecere__sys__OldList *  properties;
1233 unsigned int deleteWatch;
1234 } ecere_gcc_struct;
1235
1236 extern void FreePropertyWatch(struct PropertyWatch * watcher);
1237
1238 struct PropertyImport;
1239
1240 struct PropertyImport
1241 {
1242 struct PropertyImport * prev;
1243 struct PropertyImport * next;
1244 char *  name;
1245 unsigned int isVirtual;
1246 unsigned int hasSet;
1247 unsigned int hasGet;
1248 } ecere_gcc_struct;
1249
1250 struct MethodImport;
1251
1252 struct MethodImport
1253 {
1254 struct MethodImport * prev;
1255 struct MethodImport * next;
1256 char *  name;
1257 unsigned int isVirtual;
1258 } ecere_gcc_struct;
1259
1260 struct FunctionImport;
1261
1262 struct FunctionImport
1263 {
1264 struct FunctionImport * prev;
1265 struct FunctionImport * next;
1266 char *  name;
1267 } ecere_gcc_struct;
1268
1269 struct ClassImport;
1270
1271 struct ClassImport
1272 {
1273 struct ClassImport * prev;
1274 struct ClassImport * next;
1275 char *  name;
1276 struct __ecereNameSpace__ecere__sys__OldList methods;
1277 struct __ecereNameSpace__ecere__sys__OldList properties;
1278 unsigned int itself;
1279 int isRemote;
1280 } ecere_gcc_struct;
1281
1282 struct Initializer;
1283
1284 struct Expression
1285 {
1286 struct Expression * prev;
1287 struct Expression * next;
1288 struct Location loc;
1289 int type;
1290 union
1291 {
1292 struct
1293 {
1294 char *  constant;
1295 struct Identifier * identifier;
1296 } ecere_gcc_struct __anon1;
1297 struct Statement * compound;
1298 struct Instantiation * instance;
1299 struct
1300 {
1301 char *  string;
1302 unsigned int intlString;
1303 unsigned int wideString;
1304 } ecere_gcc_struct __anon2;
1305 struct __ecereNameSpace__ecere__sys__OldList *  list;
1306 struct
1307 {
1308 struct __ecereNameSpace__ecere__sys__OldList * specifiers;
1309 struct Declarator * decl;
1310 } ecere_gcc_struct _classExp;
1311 struct
1312 {
1313 struct Identifier * id;
1314 } ecere_gcc_struct classData;
1315 struct
1316 {
1317 struct Expression * exp;
1318 struct __ecereNameSpace__ecere__sys__OldList * arguments;
1319 struct Location argLoc;
1320 } ecere_gcc_struct call;
1321 struct
1322 {
1323 struct Expression * exp;
1324 struct __ecereNameSpace__ecere__sys__OldList * index;
1325 } ecere_gcc_struct index;
1326 struct
1327 {
1328 struct Expression * exp;
1329 struct Identifier * member;
1330 int memberType;
1331 unsigned int thisPtr;
1332 } ecere_gcc_struct member;
1333 struct
1334 {
1335 int op;
1336 struct Expression * exp1;
1337 struct Expression * exp2;
1338 } ecere_gcc_struct op;
1339 struct TypeName * typeName;
1340 struct Specifier * _class;
1341 struct
1342 {
1343 struct TypeName * typeName;
1344 struct Expression * exp;
1345 } ecere_gcc_struct cast;
1346 struct
1347 {
1348 struct Expression * cond;
1349 struct __ecereNameSpace__ecere__sys__OldList * exp;
1350 struct Expression * elseExp;
1351 } ecere_gcc_struct cond;
1352 struct
1353 {
1354 struct TypeName * typeName;
1355 struct Expression * size;
1356 } ecere_gcc_struct _new;
1357 struct
1358 {
1359 struct TypeName * typeName;
1360 struct Expression * size;
1361 struct Expression * exp;
1362 } ecere_gcc_struct _renew;
1363 struct
1364 {
1365 char * table;
1366 struct Identifier * id;
1367 } ecere_gcc_struct db;
1368 struct
1369 {
1370 struct Expression * ds;
1371 struct Expression * name;
1372 } ecere_gcc_struct dbopen;
1373 struct
1374 {
1375 struct TypeName * typeName;
1376 struct Initializer * initializer;
1377 } ecere_gcc_struct initializer;
1378 struct
1379 {
1380 struct Expression * exp;
1381 struct TypeName * typeName;
1382 } ecere_gcc_struct vaArg;
1383 struct
1384 {
1385 struct TypeName * typeName;
1386 struct Identifier * id;
1387 } ecere_gcc_struct offset;
1388 } ecere_gcc_struct __anon1;
1389 unsigned int debugValue;
1390 struct __ecereNameSpace__ecere__com__DataValue val;
1391 uint64 address;
1392 unsigned int hasAddress;
1393 struct Type * expType;
1394 struct Type * destType;
1395 unsigned int usage;
1396 int tempCount;
1397 unsigned int byReference;
1398 unsigned int isConstant;
1399 unsigned int addedThis;
1400 unsigned int needCast;
1401 unsigned int thisPtr;
1402 unsigned int opDestType;
1403 unsigned int usedInComparison;
1404 unsigned int ambiguousUnits;
1405 unsigned int parentOpDestType;
1406 unsigned int needTemplateCast;
1407 } ecere_gcc_struct;
1408
1409 extern struct InitDeclarator * MkInitDeclarator(struct Declarator * declarator, struct Initializer * initializer);
1410
1411 struct Initializer
1412 {
1413 struct Initializer * prev;
1414 struct Initializer * next;
1415 struct Location loc;
1416 int type;
1417 union
1418 {
1419 struct Expression * exp;
1420 struct __ecereNameSpace__ecere__sys__OldList *  list;
1421 } ecere_gcc_struct __anon1;
1422 unsigned int isConstant;
1423 struct Identifier * id;
1424 } ecere_gcc_struct;
1425
1426 extern struct Initializer * MkInitializerAssignment(struct Expression * exp);
1427
1428 extern struct Expression * MkExpExtensionInitializer(struct TypeName * typeName, struct Initializer * initializer);
1429
1430 extern struct Initializer * MkInitializerList(struct __ecereNameSpace__ecere__sys__OldList * list);
1431
1432 struct InitDeclarator
1433 {
1434 struct InitDeclarator * prev;
1435 struct InitDeclarator * next;
1436 struct Location loc;
1437 struct Declarator * declarator;
1438 struct Initializer * initializer;
1439 } ecere_gcc_struct;
1440
1441 void ApplyLocation(struct Expression * exp, struct Location * loc)
1442 {
1443 exp->loc = *loc;
1444 switch(exp->type)
1445 {
1446 case 4:
1447 if(exp->__anon1.op.exp1)
1448 ApplyLocation(exp->__anon1.op.exp1, loc);
1449 if(exp->__anon1.op.exp2)
1450 ApplyLocation(exp->__anon1.op.exp2, loc);
1451 break;
1452 case 5:
1453 if(exp->__anon1.list)
1454 {
1455 struct Expression * e;
1456
1457 for(e = (*exp->__anon1.list).first; e; e = e->next)
1458 ApplyLocation(e, loc);
1459 }
1460 break;
1461 case 6:
1462 if(exp->__anon1.index.index)
1463 {
1464 struct Expression * e;
1465
1466 for(e = (*exp->__anon1.index.index).first; e; e = e->next)
1467 ApplyLocation(e, loc);
1468 }
1469 if(exp->__anon1.index.exp)
1470 ApplyLocation(exp->__anon1.index.exp, loc);
1471 break;
1472 case 7:
1473 if(exp->__anon1.call.arguments)
1474 {
1475 struct Expression * arg;
1476
1477 for(arg = (*exp->__anon1.call.arguments).first; arg; arg = arg->next)
1478 ApplyLocation(arg, loc);
1479 }
1480 if(exp->__anon1.call.exp)
1481 ApplyLocation(exp->__anon1.call.exp, loc);
1482 break;
1483 case 8:
1484 case 9:
1485 if(exp->__anon1.member.exp)
1486 ApplyLocation(exp->__anon1.member.exp, loc);
1487 break;
1488 case 11:
1489 if(exp->__anon1.cast.exp)
1490 ApplyLocation(exp->__anon1.cast.exp, loc);
1491 break;
1492 case 12:
1493 if(exp->__anon1.cond.exp)
1494 {
1495 struct Expression * e;
1496
1497 for(e = (*exp->__anon1.cond.exp).first; e; e = e->next)
1498 ApplyLocation(e, loc);
1499 }
1500 if(exp->__anon1.cond.cond)
1501 ApplyLocation(exp->__anon1.cond.cond, loc);
1502 if(exp->__anon1.cond.elseExp)
1503 ApplyLocation(exp->__anon1.cond.elseExp, loc);
1504 break;
1505 case 34:
1506 if(exp->__anon1.vaArg.exp)
1507 ApplyLocation(exp->__anon1.vaArg.exp, loc);
1508 break;
1509 default:
1510 break;
1511 }
1512 }
1513
1514 void __ecereMethod_Expression_Clear();
1515
1516 struct MembersInit;
1517
1518 struct MembersInit
1519 {
1520 struct MembersInit * prev;
1521 struct MembersInit * next;
1522 struct Location loc;
1523 int type;
1524 union
1525 {
1526 struct __ecereNameSpace__ecere__sys__OldList *  dataMembers;
1527 struct ClassFunction * function;
1528 } ecere_gcc_struct __anon1;
1529 } ecere_gcc_struct;
1530
1531 extern struct MembersInit * MkMembersInitList(struct __ecereNameSpace__ecere__sys__OldList * dataMembers);
1532
1533 struct Operand;
1534
1535 struct OpTable
1536 {
1537 unsigned int (*  Add)(struct Expression *, struct Operand *, struct Operand *);
1538 unsigned int (*  Sub)(struct Expression *, struct Operand *, struct Operand *);
1539 unsigned int (*  Mul)(struct Expression *, struct Operand *, struct Operand *);
1540 unsigned int (*  Div)(struct Expression *, struct Operand *, struct Operand *);
1541 unsigned int (*  Mod)(struct Expression *, struct Operand *, struct Operand *);
1542 unsigned int (*  Neg)(struct Expression *, struct Operand *);
1543 unsigned int (*  Inc)(struct Expression *, struct Operand *);
1544 unsigned int (*  Dec)(struct Expression *, struct Operand *);
1545 unsigned int (*  Asign)(struct Expression *, struct Operand *, struct Operand *);
1546 unsigned int (*  AddAsign)(struct Expression *, struct Operand *, struct Operand *);
1547 unsigned int (*  SubAsign)(struct Expression *, struct Operand *, struct Operand *);
1548 unsigned int (*  MulAsign)(struct Expression *, struct Operand *, struct Operand *);
1549 unsigned int (*  DivAsign)(struct Expression *, struct Operand *, struct Operand *);
1550 unsigned int (*  ModAsign)(struct Expression *, struct Operand *, struct Operand *);
1551 unsigned int (*  BitAnd)(struct Expression *, struct Operand *, struct Operand *);
1552 unsigned int (*  BitOr)(struct Expression *, struct Operand *, struct Operand *);
1553 unsigned int (*  BitXor)(struct Expression *, struct Operand *, struct Operand *);
1554 unsigned int (*  LShift)(struct Expression *, struct Operand *, struct Operand *);
1555 unsigned int (*  RShift)(struct Expression *, struct Operand *, struct Operand *);
1556 unsigned int (*  BitNot)(struct Expression *, struct Operand *);
1557 unsigned int (*  AndAsign)(struct Expression *, struct Operand *, struct Operand *);
1558 unsigned int (*  OrAsign)(struct Expression *, struct Operand *, struct Operand *);
1559 unsigned int (*  XorAsign)(struct Expression *, struct Operand *, struct Operand *);
1560 unsigned int (*  LShiftAsign)(struct Expression *, struct Operand *, struct Operand *);
1561 unsigned int (*  RShiftAsign)(struct Expression *, struct Operand *, struct Operand *);
1562 unsigned int (*  Not)(struct Expression *, struct Operand *);
1563 unsigned int (*  Equ)(struct Expression *, struct Operand *, struct Operand *);
1564 unsigned int (*  Nqu)(struct Expression *, struct Operand *, struct Operand *);
1565 unsigned int (*  And)(struct Expression *, struct Operand *, struct Operand *);
1566 unsigned int (*  Or)(struct Expression *, struct Operand *, struct Operand *);
1567 unsigned int (*  Grt)(struct Expression *, struct Operand *, struct Operand *);
1568 unsigned int (*  Sma)(struct Expression *, struct Operand *, struct Operand *);
1569 unsigned int (*  GrtEqu)(struct Expression *, struct Operand *, struct Operand *);
1570 unsigned int (*  SmaEqu)(struct Expression *, struct Operand *, struct Operand *);
1571 unsigned int (*  Cond)(struct Expression *, struct Operand *, struct Operand *, struct Operand *);
1572 } ecere_gcc_struct;
1573
1574 struct Operand
1575 {
1576 int kind;
1577 struct Type * type;
1578 unsigned int ptrSize;
1579 union
1580 {
1581 char c;
1582 unsigned char uc;
1583 short s;
1584 unsigned short us;
1585 int i;
1586 unsigned int ui;
1587 float f;
1588 double d;
1589 long long i64;
1590 uint64 ui64;
1591 } ecere_gcc_struct __anon1;
1592 struct OpTable ops;
1593 } ecere_gcc_struct;
1594
1595 struct External *  _DeclareStruct(struct External *  neededBy, const char *  name, unsigned int skipNoHead, unsigned int needDereference, unsigned int fwdDecl);
1596
1597 struct External * DeclareStruct(struct External * neededBy, const char * name, unsigned int skipNoHead, unsigned int needDereference)
1598 {
1599 return _DeclareStruct(neededBy, name, skipNoHead, needDereference, 0);
1600 }
1601
1602 static void _DeclareType(struct External *  neededFor, struct Type *  type, unsigned int needDereference, unsigned int forFunctionDef, unsigned int fwdDecl);
1603
1604 void DeclareType(struct External * neededFor, struct Type * type, unsigned int needDereference, unsigned int forFunctionDef)
1605 {
1606 _DeclareType(neededFor, type, needDereference, forFunctionDef, 0);
1607 }
1608
1609 void DeclareTypeForwardDeclare(struct External * neededFor, struct Type * type, unsigned int needDereference, unsigned int forFunctionDef)
1610 {
1611 _DeclareType(neededFor, type, needDereference, forFunctionDef, 1);
1612 }
1613
1614 static void _PrintType(struct Type *  type, char *  string, unsigned int printName, unsigned int fullName, unsigned int printConst);
1615
1616 void PrintType(struct Type * type, char * string, unsigned int printName, unsigned int fullName)
1617 {
1618 _PrintType(type, string, printName, fullName, 1);
1619 }
1620
1621 void PrintTypeNoConst(struct Type * type, char * string, unsigned int printName, unsigned int fullName)
1622 {
1623 _PrintType(type, string, printName, fullName, 0);
1624 }
1625
1626 struct __ecereNameSpace__ecere__com__Method;
1627
1628 struct __ecereNameSpace__ecere__com__Method
1629 {
1630 const char *  name;
1631 struct __ecereNameSpace__ecere__com__Method * parent;
1632 struct __ecereNameSpace__ecere__com__Method * left;
1633 struct __ecereNameSpace__ecere__com__Method * right;
1634 int depth;
1635 int (*  function)();
1636 int vid;
1637 int type;
1638 struct __ecereNameSpace__ecere__com__Class * _class;
1639 void *  symbol;
1640 const char *  dataTypeString;
1641 struct Type * dataType;
1642 int memberAccess;
1643 } ecere_gcc_struct;
1644
1645 struct Symbol
1646 {
1647 char *  string;
1648 struct Symbol * parent;
1649 struct Symbol * left;
1650 struct Symbol * right;
1651 int depth;
1652 struct Type * type;
1653 union
1654 {
1655 struct __ecereNameSpace__ecere__com__Method * method;
1656 struct __ecereNameSpace__ecere__com__Property * _property;
1657 struct __ecereNameSpace__ecere__com__Class * registered;
1658 } ecere_gcc_struct __anon1;
1659 unsigned int notYetDeclared;
1660 union
1661 {
1662 struct
1663 {
1664 struct External * pointerExternal;
1665 struct External * structExternal;
1666 } ecere_gcc_struct __anon1;
1667 struct
1668 {
1669 struct External * externalGet;
1670 struct External * externalSet;
1671 struct External * externalPtr;
1672 struct External * externalIsSet;
1673 } ecere_gcc_struct __anon2;
1674 struct
1675 {
1676 struct External * methodExternal;
1677 struct External * methodCodeExternal;
1678 } ecere_gcc_struct __anon3;
1679 } ecere_gcc_struct __anon2;
1680 unsigned int imported;
1681 unsigned int declaredStructSym;
1682 struct __ecereNameSpace__ecere__com__Class * _class;
1683 unsigned int declaredStruct;
1684 unsigned int needConstructor;
1685 unsigned int needDestructor;
1686 char *  constructorName;
1687 char *  structName;
1688 char *  className;
1689 char *  destructorName;
1690 struct ModuleImport * module;
1691 struct ClassImport * _import;
1692 struct Location nameLoc;
1693 unsigned int isParam;
1694 unsigned int isRemote;
1695 unsigned int isStruct;
1696 unsigned int fireWatchersDone;
1697 int declaring;
1698 unsigned int classData;
1699 unsigned int isStatic;
1700 char *  shortName;
1701 struct __ecereNameSpace__ecere__sys__OldList *  templateParams;
1702 struct __ecereNameSpace__ecere__sys__OldList templatedClasses;
1703 struct Context * ctx;
1704 int isIterator;
1705 struct Expression * propCategory;
1706 unsigned int mustRegister;
1707 } ecere_gcc_struct;
1708
1709 struct __ecereNameSpace__ecere__com__ClassProperty;
1710
1711 extern struct __ecereNameSpace__ecere__com__ClassProperty * __ecereNameSpace__ecere__com__eClass_FindClassProperty(struct __ecereNameSpace__ecere__com__Class * _class, const char *  name);
1712
1713 struct __ecereNameSpace__ecere__com__ClassProperty
1714 {
1715 const char *  name;
1716 struct __ecereNameSpace__ecere__com__ClassProperty * parent;
1717 struct __ecereNameSpace__ecere__com__ClassProperty * left;
1718 struct __ecereNameSpace__ecere__com__ClassProperty * right;
1719 int depth;
1720 void (*  Set)(struct __ecereNameSpace__ecere__com__Class *, long long);
1721 long long (*  Get)(struct __ecereNameSpace__ecere__com__Class *);
1722 const char *  dataTypeString;
1723 struct Type * dataType;
1724 unsigned int constant;
1725 } ecere_gcc_struct;
1726
1727 struct __ecereNameSpace__ecere__com__BitMember;
1728
1729 struct __ecereNameSpace__ecere__com__BitMember
1730 {
1731 struct __ecereNameSpace__ecere__com__BitMember * prev;
1732 struct __ecereNameSpace__ecere__com__BitMember * next;
1733 const char *  name;
1734 unsigned int isProperty;
1735 int memberAccess;
1736 int id;
1737 struct __ecereNameSpace__ecere__com__Class * _class;
1738 const char *  dataTypeString;
1739 struct __ecereNameSpace__ecere__com__Class * dataTypeClass;
1740 struct Type * dataType;
1741 int type;
1742 int size;
1743 int pos;
1744 uint64 mask;
1745 } ecere_gcc_struct;
1746
1747 struct __ecereNameSpace__ecere__com__DataMember;
1748
1749 struct __ecereNameSpace__ecere__com__ClassTemplateArgument
1750 {
1751 union
1752 {
1753 struct
1754 {
1755 const char *  dataTypeString;
1756 struct __ecereNameSpace__ecere__com__Class * dataTypeClass;
1757 } ecere_gcc_struct __anon1;
1758 struct __ecereNameSpace__ecere__com__DataValue expression;
1759 struct
1760 {
1761 const char *  memberString;
1762 union
1763 {
1764 struct __ecereNameSpace__ecere__com__DataMember * member;
1765 struct __ecereNameSpace__ecere__com__Property * prop;
1766 struct __ecereNameSpace__ecere__com__Method * method;
1767 } ecere_gcc_struct __anon1;
1768 } ecere_gcc_struct __anon2;
1769 } ecere_gcc_struct __anon1;
1770 } ecere_gcc_struct;
1771
1772 extern void __ecereNameSpace__ecere__com__eClass_FindNextMember(struct __ecereNameSpace__ecere__com__Class * _class, struct __ecereNameSpace__ecere__com__Class **  curClass, struct __ecereNameSpace__ecere__com__DataMember **  curMember, struct __ecereNameSpace__ecere__com__DataMember **  subMemberStack, int *  subMemberStackPos);
1773
1774 extern struct __ecereNameSpace__ecere__com__DataMember * __ecereNameSpace__ecere__com__eClass_AddDataMember(struct __ecereNameSpace__ecere__com__Class * _class, const char *  name, const char *  type, unsigned int size, unsigned int alignment, int declMode);
1775
1776 struct TemplateParameter;
1777
1778 struct TemplateParameter
1779 {
1780 struct TemplateParameter * prev;
1781 struct TemplateParameter * next;
1782 struct Location loc;
1783 int type;
1784 struct Identifier * identifier;
1785 union
1786 {
1787 struct TemplateDatatype * dataType;
1788 int memberType;
1789 } ecere_gcc_struct __anon1;
1790 struct TemplateArgument * defaultArgument;
1791 const char *  dataTypeString;
1792 struct Type * baseType;
1793 } ecere_gcc_struct;
1794
1795 struct Type
1796 {
1797 struct Type * prev;
1798 struct Type * next;
1799 int refCount;
1800 union
1801 {
1802 struct Symbol * _class;
1803 struct
1804 {
1805 struct __ecereNameSpace__ecere__sys__OldList members;
1806 char *  enumName;
1807 } ecere_gcc_struct __anon1;
1808 struct
1809 {
1810 struct Type * returnType;
1811 struct __ecereNameSpace__ecere__sys__OldList params;
1812 struct Symbol * thisClass;
1813 unsigned int staticMethod;
1814 struct TemplateParameter * thisClassTemplate;
1815 } ecere_gcc_struct __anon2;
1816 struct
1817 {
1818 struct __ecereNameSpace__ecere__com__Method * method;
1819 struct __ecereNameSpace__ecere__com__Class * methodClass;
1820 struct __ecereNameSpace__ecere__com__Class * usedClass;
1821 } ecere_gcc_struct __anon3;
1822 struct
1823 {
1824 struct Type * arrayType;
1825 int arraySize;
1826 struct Expression * arraySizeExp;
1827 unsigned int freeExp;
1828 struct Symbol * enumClass;
1829 } ecere_gcc_struct __anon4;
1830 struct Type * type;
1831 struct TemplateParameter * templateParameter;
1832 } ecere_gcc_struct __anon1;
1833 int kind;
1834 unsigned int size;
1835 char *  name;
1836 char *  typeName;
1837 struct __ecereNameSpace__ecere__com__Class * thisClassFrom;
1838 int promotedFrom;
1839 int classObjectType;
1840 int alignment;
1841 unsigned int offset;
1842 int bitFieldCount;
1843 int count;
1844 int bitMemberSize;
1845 unsigned int isSigned : 1;
1846 unsigned int constant : 1;
1847 unsigned int truth : 1;
1848 unsigned int byReference : 1;
1849 unsigned int extraParam : 1;
1850 unsigned int directClassAccess : 1;
1851 unsigned int computing : 1;
1852 unsigned int keepCast : 1;
1853 unsigned int passAsTemplate : 1;
1854 unsigned int dllExport : 1;
1855 unsigned int attrStdcall : 1;
1856 unsigned int declaredWithStruct : 1;
1857 unsigned int typedByReference : 1;
1858 unsigned int casted : 1;
1859 unsigned int pointerAlignment : 1;
1860 unsigned int isLong : 1;
1861 unsigned int signedBeforePromotion : 1;
1862 } ecere_gcc_struct;
1863
1864 struct Specifier
1865 {
1866 struct Specifier * prev;
1867 struct Specifier * next;
1868 struct Location loc;
1869 int type;
1870 union
1871 {
1872 int specifier;
1873 struct
1874 {
1875 struct ExtDecl * extDecl;
1876 char *  name;
1877 struct Symbol * symbol;
1878 struct __ecereNameSpace__ecere__sys__OldList *  templateArgs;
1879 struct Specifier * nsSpec;
1880 } ecere_gcc_struct __anon1;
1881 struct
1882 {
1883 struct Identifier * id;
1884 struct __ecereNameSpace__ecere__sys__OldList *  list;
1885 struct __ecereNameSpace__ecere__sys__OldList *  baseSpecs;
1886 struct __ecereNameSpace__ecere__sys__OldList *  definitions;
1887 unsigned int addNameSpace;
1888 struct Context * ctx;
1889 struct ExtDecl * extDeclStruct;
1890 } ecere_gcc_struct __anon2;
1891 struct Expression * expression;
1892 struct Specifier * _class;
1893 struct TemplateParameter * templateParameter;
1894 } ecere_gcc_struct __anon1;
1895 } ecere_gcc_struct;
1896
1897 extern struct Expression * GetTemplateArgExp(struct TemplateParameter * param, struct __ecereNameSpace__ecere__com__Class * curClass, unsigned int pointer);
1898
1899 struct TemplatedType
1900 {
1901 uintptr_t key;
1902 struct __ecereNameSpace__ecere__sys__BTNode * parent;
1903 struct __ecereNameSpace__ecere__sys__BTNode * left;
1904 struct __ecereNameSpace__ecere__sys__BTNode * right;
1905 int depth;
1906 struct TemplateParameter * param;
1907 } ecere_gcc_struct;
1908
1909 struct Type * ProcessTemplateParameterType(struct TemplateParameter * param)
1910 {
1911 if(param && param->type == 0 && (param->__anon1.dataType || param->dataTypeString))
1912 {
1913 if(!param->baseType)
1914 {
1915 if(param->dataTypeString)
1916 param->baseType = ProcessTypeString(param->dataTypeString, 0);
1917 else
1918 param->baseType = ProcessType(param->__anon1.dataType->specifiers, param->__anon1.dataType->decl);
1919 }
1920 return param->baseType;
1921 }
1922 return (((void *)0));
1923 }
1924
1925 unsigned int NeedCast(struct Type * type1, struct Type * type2)
1926 {
1927 if(!type1 || !type2 || type1->keepCast || type2->keepCast)
1928 return 1;
1929 if(type1->kind == 20 && type2->kind == 4 && type2->passAsTemplate == 0)
1930 {
1931 return 0;
1932 }
1933 if(type1->kind == type2->kind && type1->isLong == type2->isLong)
1934 {
1935 switch(type1->kind)
1936 {
1937 case 24:
1938 case 1:
1939 case 2:
1940 case 3:
1941 case 4:
1942 case 22:
1943 case 23:
1944 if(type1->passAsTemplate && !type2->passAsTemplate)
1945 return 1;
1946 return type1->isSigned != type2->isSigned;
1947 case 8:
1948 return type1->__anon1._class != type2->__anon1._class;
1949 case 13:
1950 return (type1->__anon1.type && type2->__anon1.type && type1->__anon1.type->constant != type2->__anon1.type->constant) || NeedCast(type1->__anon1.type, type2->__anon1.type);
1951 default:
1952 return 1;
1953 }
1954 }
1955 return 1;
1956 }
1957
1958 unsigned int GetOpInt(struct Operand * op2, int * value2)
1959 {
1960 if(op2->kind == 3 && op2->type->isSigned)
1961 *value2 = op2->__anon1.i;
1962 else if(op2->kind == 3)
1963 *value2 = (int)op2->__anon1.ui;
1964 else if(op2->kind == 4 && op2->type->isSigned)
1965 *value2 = (int)op2->__anon1.i64;
1966 else if(op2->kind == 4)
1967 *value2 = (int)op2->__anon1.ui64;
1968 else if(op2->kind == 23 && op2->type->isSigned)
1969 *value2 = (int)op2->__anon1.i64;
1970 else if(op2->kind == 23)
1971 *value2 = (int)op2->__anon1.ui64;
1972 else if(op2->kind == 22 && op2->type->isSigned)
1973 *value2 = (int)op2->__anon1.i64;
1974 else if(op2->kind == 22)
1975 *value2 = (int)op2->__anon1.ui64;
1976 else if(op2->kind == 2 && op2->type->isSigned)
1977 *value2 = (int)op2->__anon1.s;
1978 else if(op2->kind == 2)
1979 *value2 = (int)op2->__anon1.us;
1980 else if(op2->kind == 1 && op2->type->isSigned)
1981 *value2 = (int)op2->__anon1.c;
1982 else if(op2->kind == 24 || op2->kind == 1)
1983 *value2 = (int)op2->__anon1.uc;
1984 else if(op2->kind == 6)
1985 *value2 = (int)op2->__anon1.f;
1986 else if(op2->kind == 7)
1987 *value2 = (int)op2->__anon1.d;
1988 else if(op2->kind == 13)
1989 *value2 = (int)op2->__anon1.ui64;
1990 else
1991 return 0;
1992 return 1;
1993 }
1994
1995 unsigned int GetOpUInt(struct Operand * op2, unsigned int * value2)
1996 {
1997 if(op2->kind == 3 && op2->type->isSigned)
1998 *value2 = (unsigned int)op2->__anon1.i;
1999 else if(op2->kind == 3)
2000 *value2 = op2->__anon1.ui;
2001 else if(op2->kind == 4 && op2->type->isSigned)
2002 *value2 = (unsigned int)op2->__anon1.i64;
2003 else if(op2->kind == 4)
2004 *value2 = (unsigned int)op2->__anon1.ui64;
2005 else if(op2->kind == 23 && op2->type->isSigned)
2006 *value2 = (unsigned int)op2->__anon1.i64;
2007 else if(op2->kind == 23)
2008 *value2 = (unsigned int)op2->__anon1.ui64;
2009 else if(op2->kind == 22 && op2->type->isSigned)
2010 *value2 = (unsigned int)op2->__anon1.i64;
2011 else if(op2->kind == 22)
2012 *value2 = (unsigned int)op2->__anon1.ui64;
2013 else if(op2->kind == 2 && op2->type->isSigned)
2014 *value2 = (unsigned int)op2->__anon1.s;
2015 else if(op2->kind == 2)
2016 *value2 = (unsigned int)op2->__anon1.us;
2017 else if(op2->kind == 1 && op2->type->isSigned)
2018 *value2 = (unsigned int)op2->__anon1.c;
2019 else if(op2->kind == 24 || op2->kind == 1)
2020 *value2 = (unsigned int)op2->__anon1.uc;
2021 else if(op2->kind == 6)
2022 *value2 = (unsigned int)op2->__anon1.f;
2023 else if(op2->kind == 7)
2024 *value2 = (unsigned int)op2->__anon1.d;
2025 else if(op2->kind == 13)
2026 *value2 = (unsigned int)op2->__anon1.ui64;
2027 else
2028 return 0;
2029 return 1;
2030 }
2031
2032 unsigned int GetOpInt64(struct Operand * op2, long long * value2)
2033 {
2034 if(op2->kind == 3 && op2->type->isSigned)
2035 *value2 = (long long)op2->__anon1.i;
2036 else if(op2->kind == 3)
2037 *value2 = (long long)op2->__anon1.ui;
2038 else if(op2->kind == 4 && op2->type->isSigned)
2039 *value2 = op2->__anon1.i64;
2040 else if(op2->kind == 4)
2041 *value2 = (long long)op2->__anon1.ui64;
2042 else if(op2->kind == 23 && op2->type->isSigned)
2043 *value2 = op2->__anon1.i64;
2044 else if(op2->kind == 23)
2045 *value2 = (long long)op2->__anon1.ui64;
2046 else if(op2->kind == 22 && op2->type->isSigned)
2047 *value2 = op2->__anon1.i64;
2048 else if(op2->kind == 22)
2049 *value2 = (long long)op2->__anon1.ui64;
2050 else if(op2->kind == 2 && op2->type->isSigned)
2051 *value2 = (long long)op2->__anon1.s;
2052 else if(op2->kind == 2)
2053 *value2 = (long long)op2->__anon1.us;
2054 else if(op2->kind == 1 && op2->type->isSigned)
2055 *value2 = (long long)op2->__anon1.c;
2056 else if(op2->kind == 24 || op2->kind == 1)
2057 *value2 = (long long)op2->__anon1.uc;
2058 else if(op2->kind == 6)
2059 *value2 = (long long)op2->__anon1.f;
2060 else if(op2->kind == 7)
2061 *value2 = (long long)op2->__anon1.d;
2062 else if(op2->kind == 13)
2063 *value2 = (long long)op2->__anon1.ui64;
2064 else
2065 return 0;
2066 return 1;
2067 }
2068
2069 unsigned int GetOpUInt64(struct Operand * op2, uint64 * value2)
2070 {
2071 if(op2->kind == 3 && op2->type->isSigned)
2072 *value2 = (uint64)op2->__anon1.i;
2073 else if(op2->kind == 3)
2074 *value2 = (uint64)op2->__anon1.ui;
2075 else if(op2->kind == 4 && op2->type->isSigned)
2076 *value2 = (uint64)op2->__anon1.i64;
2077 else if(op2->kind == 4)
2078 *value2 = op2->__anon1.ui64;
2079 else if(op2->kind == 23 && op2->type->isSigned)
2080 *value2 = (uint64)op2->__anon1.i64;
2081 else if(op2->kind == 23)
2082 *value2 = op2->__anon1.ui64;
2083 else if(op2->kind == 22 && op2->type->isSigned)
2084 *value2 = (uint64)op2->__anon1.i64;
2085 else if(op2->kind == 22)
2086 *value2 = op2->__anon1.ui64;
2087 else if(op2->kind == 2 && op2->type->isSigned)
2088 *value2 = (uint64)op2->__anon1.s;
2089 else if(op2->kind == 2)
2090 *value2 = (uint64)op2->__anon1.us;
2091 else if(op2->kind == 1 && op2->type->isSigned)
2092 *value2 = (uint64)op2->__anon1.c;
2093 else if(op2->kind == 24 || op2->kind == 1)
2094 *value2 = (uint64)op2->__anon1.uc;
2095 else if(op2->kind == 6)
2096 *value2 = (uint64)op2->__anon1.f;
2097 else if(op2->kind == 7)
2098 *value2 = (uint64)op2->__anon1.d;
2099 else if(op2->kind == 13)
2100 *value2 = op2->__anon1.ui64;
2101 else
2102 return 0;
2103 return 1;
2104 }
2105
2106 unsigned int GetOpIntPtr(struct Operand * op2, intptr_t * value2)
2107 {
2108 if(op2->kind == 3 && op2->type->isSigned)
2109 *value2 = (intptr_t)op2->__anon1.i;
2110 else if(op2->kind == 3)
2111 *value2 = (intptr_t)op2->__anon1.ui;
2112 else if(op2->kind == 4 && op2->type->isSigned)
2113 *value2 = (intptr_t)op2->__anon1.i64;
2114 else if(op2->kind == 4)
2115 *value2 = (intptr_t)op2->__anon1.ui64;
2116 else if(op2->kind == 23 && op2->type->isSigned)
2117 *value2 = (intptr_t)op2->__anon1.i64;
2118 else if(op2->kind == 23)
2119 *value2 = (intptr_t)op2->__anon1.ui64;
2120 else if(op2->kind == 22 && op2->type->isSigned)
2121 *value2 = (intptr_t)op2->__anon1.i64;
2122 else if(op2->kind == 22)
2123 *value2 = (intptr_t)op2->__anon1.ui64;
2124 else if(op2->kind == 2 && op2->type->isSigned)
2125 *value2 = (intptr_t)op2->__anon1.s;
2126 else if(op2->kind == 2)
2127 *value2 = (intptr_t)op2->__anon1.us;
2128 else if(op2->kind == 1 && op2->type->isSigned)
2129 *value2 = (intptr_t)op2->__anon1.c;
2130 else if(op2->kind == 24 || op2->kind == 1)
2131 *value2 = (intptr_t)op2->__anon1.uc;
2132 else if(op2->kind == 6)
2133 *value2 = (intptr_t)op2->__anon1.f;
2134 else if(op2->kind == 7)
2135 *value2 = (intptr_t)op2->__anon1.d;
2136 else if(op2->kind == 13)
2137 *value2 = (intptr_t)op2->__anon1.ui64;
2138 else
2139 return 0;
2140 return 1;
2141 }
2142
2143 unsigned int GetOpUIntPtr(struct Operand * op2, uintptr_t * value2)
2144 {
2145 if(op2->kind == 3 && op2->type->isSigned)
2146 *value2 = (uintptr_t)op2->__anon1.i;
2147 else if(op2->kind == 3)
2148 *value2 = (uintptr_t)op2->__anon1.ui;
2149 else if(op2->kind == 4 && op2->type->isSigned)
2150 *value2 = (uintptr_t)op2->__anon1.i64;
2151 else if(op2->kind == 4)
2152 *value2 = (uintptr_t)op2->__anon1.ui64;
2153 else if(op2->kind == 23 && op2->type->isSigned)
2154 *value2 = (uintptr_t)op2->__anon1.i64;
2155 else if(op2->kind == 23)
2156 *value2 = (uintptr_t)op2->__anon1.ui64;
2157 else if(op2->kind == 22 && op2->type->isSigned)
2158 *value2 = (uintptr_t)op2->__anon1.i64;
2159 else if(op2->kind == 22)
2160 *value2 = (uintptr_t)op2->__anon1.ui64;
2161 else if(op2->kind == 2 && op2->type->isSigned)
2162 *value2 = (uintptr_t)op2->__anon1.s;
2163 else if(op2->kind == 2)
2164 *value2 = (uintptr_t)op2->__anon1.us;
2165 else if(op2->kind == 1 && op2->type->isSigned)
2166 *value2 = (uintptr_t)op2->__anon1.c;
2167 else if(op2->kind == 24 || op2->kind == 1)
2168 *value2 = (uintptr_t)op2->__anon1.uc;
2169 else if(op2->kind == 6)
2170 *value2 = (uintptr_t)op2->__anon1.f;
2171 else if(op2->kind == 7)
2172 *value2 = (uintptr_t)op2->__anon1.d;
2173 else if(op2->kind == 13)
2174 *value2 = (uintptr_t)op2->__anon1.ui64;
2175 else
2176 return 0;
2177 return 1;
2178 }
2179
2180 unsigned int GetOpIntSize(struct Operand * op2, ssize_t * value2)
2181 {
2182 if(op2->kind == 3 && op2->type->isSigned)
2183 *value2 = (ssize_t)op2->__anon1.i;
2184 else if(op2->kind == 3)
2185 *value2 = (ssize_t)op2->__anon1.ui;
2186 else if(op2->kind == 4 && op2->type->isSigned)
2187 *value2 = (ssize_t)op2->__anon1.i64;
2188 else if(op2->kind == 4)
2189 *value2 = (ssize_t)op2->__anon1.ui64;
2190 else if(op2->kind == 23 && op2->type->isSigned)
2191 *value2 = (ssize_t)op2->__anon1.i64;
2192 else if(op2->kind == 23)
2193 *value2 = (ssize_t)op2->__anon1.ui64;
2194 else if(op2->kind == 22 && op2->type->isSigned)
2195 *value2 = (ssize_t)op2->__anon1.i64;
2196 else if(op2->kind == 22)
2197 *value2 = (ssize_t)op2->__anon1.ui64;
2198 else if(op2->kind == 2 && op2->type->isSigned)
2199 *value2 = (ssize_t)op2->__anon1.s;
2200 else if(op2->kind == 2)
2201 *value2 = (ssize_t)op2->__anon1.us;
2202 else if(op2->kind == 1 && op2->type->isSigned)
2203 *value2 = (ssize_t)op2->__anon1.c;
2204 else if(op2->kind == 24 || op2->kind == 1)
2205 *value2 = (ssize_t)op2->__anon1.uc;
2206 else if(op2->kind == 6)
2207 *value2 = (ssize_t)op2->__anon1.f;
2208 else if(op2->kind == 7)
2209 *value2 = (ssize_t)op2->__anon1.d;
2210 else if(op2->kind == 13)
2211 *value2 = (ssize_t)op2->__anon1.ui64;
2212 else
2213 return 0;
2214 return 1;
2215 }
2216
2217 unsigned int GetOpUIntSize(struct Operand * op2, size_t * value2)
2218 {
2219 if(op2->kind == 3 && op2->type->isSigned)
2220 *value2 = (size_t)op2->__anon1.i;
2221 else if(op2->kind == 3)
2222 *value2 = (size_t)op2->__anon1.ui;
2223 else if(op2->kind == 4 && op2->type->isSigned)
2224 *value2 = (size_t)op2->__anon1.i64;
2225 else if(op2->kind == 4)
2226 *value2 = (size_t)op2->__anon1.ui64;
2227 else if(op2->kind == 23 && op2->type->isSigned)
2228 *value2 = (size_t)op2->__anon1.i64;
2229 else if(op2->kind == 23)
2230 *value2 = (size_t)op2->__anon1.ui64;
2231 else if(op2->kind == 22 && op2->type->isSigned)
2232 *value2 = (size_t)op2->__anon1.i64;
2233 else if(op2->kind == 22)
2234 *value2 = (size_t)op2->__anon1.ui64;
2235 else if(op2->kind == 2 && op2->type->isSigned)
2236 *value2 = (size_t)op2->__anon1.s;
2237 else if(op2->kind == 2)
2238 *value2 = (size_t)op2->__anon1.us;
2239 else if(op2->kind == 1 && op2->type->isSigned)
2240 *value2 = (size_t)op2->__anon1.c;
2241 else if(op2->kind == 24 || op2->kind == 1)
2242 *value2 = (size_t)op2->__anon1.uc;
2243 else if(op2->kind == 6)
2244 *value2 = (size_t)op2->__anon1.f;
2245 else if(op2->kind == 7)
2246 *value2 = (size_t)op2->__anon1.d;
2247 else if(op2->kind == 13)
2248 *value2 = (size_t)op2->__anon1.ui64;
2249 else
2250 return 0;
2251 return 1;
2252 }
2253
2254 unsigned int GetOpShort(struct Operand * op2, short * value2)
2255 {
2256 if(op2->kind == 3 && op2->type->isSigned)
2257 *value2 = (short)op2->__anon1.i;
2258 else if(op2->kind == 3)
2259 *value2 = (short)op2->__anon1.ui;
2260 else if(op2->kind == 4 && op2->type->isSigned)
2261 *value2 = (short)op2->__anon1.i64;
2262 else if(op2->kind == 4)
2263 *value2 = (short)op2->__anon1.ui64;
2264 else if(op2->kind == 23 && op2->type->isSigned)
2265 *value2 = (short)op2->__anon1.i64;
2266 else if(op2->kind == 23)
2267 *value2 = (short)op2->__anon1.ui64;
2268 else if(op2->kind == 22 && op2->type->isSigned)
2269 *value2 = (short)op2->__anon1.i64;
2270 else if(op2->kind == 22)
2271 *value2 = (short)op2->__anon1.ui64;
2272 else if(op2->kind == 2 && op2->type->isSigned)
2273 *value2 = op2->__anon1.s;
2274 else if(op2->kind == 2)
2275 *value2 = (short)op2->__anon1.us;
2276 else if(op2->kind == 1 && op2->type->isSigned)
2277 *value2 = (short)op2->__anon1.c;
2278 else if(op2->kind == 24 || op2->kind == 1)
2279 *value2 = (short)op2->__anon1.uc;
2280 else if(op2->kind == 6)
2281 *value2 = (short)op2->__anon1.f;
2282 else if(op2->kind == 7)
2283 *value2 = (short)op2->__anon1.d;
2284 else if(op2->kind == 13)
2285 *value2 = (short)op2->__anon1.ui64;
2286 else
2287 return 0;
2288 return 1;
2289 }
2290
2291 unsigned int GetOpUShort(struct Operand * op2, unsigned short * value2)
2292 {
2293 if(op2->kind == 3 && op2->type->isSigned)
2294 *value2 = (unsigned short)op2->__anon1.i;
2295 else if(op2->kind == 3)
2296 *value2 = (unsigned short)op2->__anon1.ui;
2297 else if(op2->kind == 4 && op2->type->isSigned)
2298 *value2 = (unsigned short)op2->__anon1.i64;
2299 else if(op2->kind == 4)
2300 *value2 = (unsigned short)op2->__anon1.ui64;
2301 else if(op2->kind == 23 && op2->type->isSigned)
2302 *value2 = (unsigned short)op2->__anon1.i64;
2303 else if(op2->kind == 23)
2304 *value2 = (unsigned short)op2->__anon1.ui64;
2305 else if(op2->kind == 22 && op2->type->isSigned)
2306 *value2 = (unsigned short)op2->__anon1.i64;
2307 else if(op2->kind == 22)
2308 *value2 = (unsigned short)op2->__anon1.ui64;
2309 else if(op2->kind == 2 && op2->type->isSigned)
2310 *value2 = (unsigned short)op2->__anon1.s;
2311 else if(op2->kind == 2)
2312 *value2 = op2->__anon1.us;
2313 else if(op2->kind == 1 && op2->type->isSigned)
2314 *value2 = (unsigned short)op2->__anon1.c;
2315 else if(op2->kind == 24 || op2->kind == 1)
2316 *value2 = (unsigned short)op2->__anon1.uc;
2317 else if(op2->kind == 6)
2318 *value2 = (unsigned short)op2->__anon1.f;
2319 else if(op2->kind == 7)
2320 *value2 = (unsigned short)op2->__anon1.d;
2321 else if(op2->kind == 13)
2322 *value2 = (unsigned short)op2->__anon1.ui64;
2323 else
2324 return 0;
2325 return 1;
2326 }
2327
2328 unsigned int GetOpChar(struct Operand * op2, char * value2)
2329 {
2330 if(op2->kind == 3 && op2->type->isSigned)
2331 *value2 = (char)op2->__anon1.i;
2332 else if(op2->kind == 3)
2333 *value2 = (char)op2->__anon1.ui;
2334 else if(op2->kind == 4 && op2->type->isSigned)
2335 *value2 = (char)op2->__anon1.i64;
2336 else if(op2->kind == 4)
2337 *value2 = (char)op2->__anon1.ui64;
2338 else if(op2->kind == 23 && op2->type->isSigned)
2339 *value2 = (char)op2->__anon1.i64;
2340 else if(op2->kind == 23)
2341 *value2 = (char)op2->__anon1.ui64;
2342 else if(op2->kind == 22 && op2->type->isSigned)
2343 *value2 = (char)op2->__anon1.i64;
2344 else if(op2->kind == 22)
2345 *value2 = (char)op2->__anon1.ui64;
2346 else if(op2->kind == 2 && op2->type->isSigned)
2347 *value2 = (char)op2->__anon1.s;
2348 else if(op2->kind == 2)
2349 *value2 = (char)op2->__anon1.us;
2350 else if(op2->kind == 1 && op2->type->isSigned)
2351 *value2 = op2->__anon1.c;
2352 else if(op2->kind == 24 || op2->kind == 1)
2353 *value2 = (char)op2->__anon1.uc;
2354 else if(op2->kind == 6)
2355 *value2 = (char)op2->__anon1.f;
2356 else if(op2->kind == 7)
2357 *value2 = (char)op2->__anon1.d;
2358 else if(op2->kind == 13)
2359 *value2 = (char)op2->__anon1.ui64;
2360 else
2361 return 0;
2362 return 1;
2363 }
2364
2365 unsigned int GetOpUChar(struct Operand * op2, unsigned char * value2)
2366 {
2367 if(op2->kind == 3 && op2->type->isSigned)
2368 *value2 = (unsigned char)op2->__anon1.i;
2369 else if(op2->kind == 3)
2370 *value2 = (unsigned char)op2->__anon1.ui;
2371 else if(op2->kind == 4 && op2->type->isSigned)
2372 *value2 = (unsigned char)op2->__anon1.i64;
2373 else if(op2->kind == 4)
2374 *value2 = (unsigned char)op2->__anon1.ui64;
2375 else if(op2->kind == 23 && op2->type->isSigned)
2376 *value2 = (unsigned char)op2->__anon1.i64;
2377 else if(op2->kind == 23)
2378 *value2 = (unsigned char)op2->__anon1.ui64;
2379 else if(op2->kind == 22 && op2->type->isSigned)
2380 *value2 = (unsigned char)op2->__anon1.i64;
2381 else if(op2->kind == 22)
2382 *value2 = (unsigned char)op2->__anon1.ui64;
2383 else if(op2->kind == 2 && op2->type->isSigned)
2384 *value2 = (unsigned char)op2->__anon1.s;
2385 else if(op2->kind == 2)
2386 *value2 = (unsigned char)op2->__anon1.us;
2387 else if(op2->kind == 1 && op2->type->isSigned)
2388 *value2 = (unsigned char)op2->__anon1.c;
2389 else if(op2->kind == 24 || op2->kind == 1)
2390 *value2 = op2->__anon1.uc;
2391 else if(op2->kind == 6)
2392 *value2 = (unsigned char)op2->__anon1.f;
2393 else if(op2->kind == 7)
2394 *value2 = (unsigned char)op2->__anon1.d;
2395 else if(op2->kind == 13)
2396 *value2 = (unsigned char)op2->__anon1.ui64;
2397 else
2398 return 0;
2399 return 1;
2400 }
2401
2402 unsigned int GetOpFloat(struct Operand * op2, float * value2)
2403 {
2404 if(op2->kind == 3 && op2->type->isSigned)
2405 *value2 = (float)(float)op2->__anon1.i;
2406 else if(op2->kind == 3)
2407 *value2 = (float)(float)op2->__anon1.ui;
2408 else if(op2->kind == 4 && op2->type->isSigned)
2409 *value2 = (float)(float)op2->__anon1.i64;
2410 else if(op2->kind == 4)
2411 *value2 = (float)(float)op2->__anon1.ui64;
2412 else if(op2->kind == 23 && op2->type->isSigned)
2413 *value2 = (float)(float)op2->__anon1.i64;
2414 else if(op2->kind == 23)
2415 *value2 = (float)(float)op2->__anon1.ui64;
2416 else if(op2->kind == 22 && op2->type->isSigned)
2417 *value2 = (float)(float)op2->__anon1.i64;
2418 else if(op2->kind == 22)
2419 *value2 = (float)(float)op2->__anon1.ui64;
2420 else if(op2->kind == 2 && op2->type->isSigned)
2421 *value2 = (float)(float)op2->__anon1.s;
2422 else if(op2->kind == 2)
2423 *value2 = (float)(float)op2->__anon1.us;
2424 else if(op2->kind == 1 && op2->type->isSigned)
2425 *value2 = (float)(float)op2->__anon1.c;
2426 else if(op2->kind == 24 || op2->kind == 1)
2427 *value2 = (float)(float)op2->__anon1.uc;
2428 else if(op2->kind == 6)
2429 *value2 = (float)op2->__anon1.f;
2430 else if(op2->kind == 7)
2431 *value2 = (float)op2->__anon1.d;
2432 else if(op2->kind == 13)
2433 *value2 = (float)(float)op2->__anon1.ui64;
2434 else
2435 return 0;
2436 return 1;
2437 }
2438
2439 unsigned int GetOpDouble(struct Operand * op2, double * value2)
2440 {
2441 if(op2->kind == 3 && op2->type->isSigned)
2442 *value2 = (double)(double)op2->__anon1.i;
2443 else if(op2->kind == 3)
2444 *value2 = (double)(double)op2->__anon1.ui;
2445 else if(op2->kind == 4 && op2->type->isSigned)
2446 *value2 = (double)(double)op2->__anon1.i64;
2447 else if(op2->kind == 4)
2448 *value2 = (double)(double)op2->__anon1.ui64;
2449 else if(op2->kind == 23 && op2->type->isSigned)
2450 *value2 = (double)(double)op2->__anon1.i64;
2451 else if(op2->kind == 23)
2452 *value2 = (double)(double)op2->__anon1.ui64;
2453 else if(op2->kind == 22 && op2->type->isSigned)
2454 *value2 = (double)(double)op2->__anon1.i64;
2455 else if(op2->kind == 22)
2456 *value2 = (double)(double)op2->__anon1.ui64;
2457 else if(op2->kind == 2 && op2->type->isSigned)
2458 *value2 = (double)(double)op2->__anon1.s;
2459 else if(op2->kind == 2)
2460 *value2 = (double)(double)op2->__anon1.us;
2461 else if(op2->kind == 1 && op2->type->isSigned)
2462 *value2 = (double)(double)op2->__anon1.c;
2463 else if(op2->kind == 24 || op2->kind == 1)
2464 *value2 = (double)(double)op2->__anon1.uc;
2465 else if(op2->kind == 6)
2466 *value2 = (double)op2->__anon1.f;
2467 else if(op2->kind == 7)
2468 *value2 = (double)op2->__anon1.d;
2469 else if(op2->kind == 13)
2470 *value2 = (double)(double)op2->__anon1.ui64;
2471 else
2472 return 0;
2473 return 1;
2474 }
2475
2476 static unsigned int IntAdd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2477 {
2478 int value2 = op2->__anon1.i;
2479
2480 exp->type = 2;
2481 exp->__anon1.__anon2.string = PrintInt((op1->__anon1.i + value2));
2482 if(!exp->expType)
2483 {
2484 exp->expType = op1->type;
2485 if(op1->type)
2486 op1->type->refCount++;
2487 }
2488 return 1;
2489 }
2490
2491 static unsigned int UIntAdd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2492 {
2493 unsigned int value2 = op2->__anon1.ui;
2494
2495 exp->type = 2;
2496 exp->__anon1.__anon2.string = PrintUInt((op1->__anon1.ui + value2));
2497 if(!exp->expType)
2498 {
2499 exp->expType = op1->type;
2500 if(op1->type)
2501 op1->type->refCount++;
2502 }
2503 return 1;
2504 }
2505
2506 static unsigned int Int64Add(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2507 {
2508 long long value2 = op2->__anon1.i64;
2509
2510 exp->type = 2;
2511 exp->__anon1.__anon2.string = PrintInt64((op1->__anon1.i64 + value2));
2512 if(!exp->expType)
2513 {
2514 exp->expType = op1->type;
2515 if(op1->type)
2516 op1->type->refCount++;
2517 }
2518 return 1;
2519 }
2520
2521 static unsigned int UInt64Add(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2522 {
2523 uint64 value2 = op2->__anon1.ui64;
2524
2525 exp->type = 2;
2526 exp->__anon1.__anon2.string = PrintUInt64((op1->__anon1.ui64 + value2));
2527 if(!exp->expType)
2528 {
2529 exp->expType = op1->type;
2530 if(op1->type)
2531 op1->type->refCount++;
2532 }
2533 return 1;
2534 }
2535
2536 static unsigned int ShortAdd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2537 {
2538 short value2 = op2->__anon1.s;
2539
2540 exp->type = 2;
2541 exp->__anon1.__anon2.string = PrintShort((short)(op1->__anon1.s + value2));
2542 if(!exp->expType)
2543 {
2544 exp->expType = op1->type;
2545 if(op1->type)
2546 op1->type->refCount++;
2547 }
2548 return 1;
2549 }
2550
2551 static unsigned int UShortAdd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2552 {
2553 unsigned short value2 = op2->__anon1.us;
2554
2555 exp->type = 2;
2556 exp->__anon1.__anon2.string = PrintUShort((unsigned short)(op1->__anon1.us + value2));
2557 if(!exp->expType)
2558 {
2559 exp->expType = op1->type;
2560 if(op1->type)
2561 op1->type->refCount++;
2562 }
2563 return 1;
2564 }
2565
2566 static unsigned int CharAdd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2567 {
2568 char value2 = op2->__anon1.c;
2569
2570 exp->type = 2;
2571 exp->__anon1.__anon2.string = PrintChar((char)(op1->__anon1.c + value2));
2572 if(!exp->expType)
2573 {
2574 exp->expType = op1->type;
2575 if(op1->type)
2576 op1->type->refCount++;
2577 }
2578 return 1;
2579 }
2580
2581 static unsigned int UCharAdd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2582 {
2583 unsigned char value2 = op2->__anon1.uc;
2584
2585 exp->type = 2;
2586 exp->__anon1.__anon2.string = PrintUChar((unsigned char)(op1->__anon1.uc + value2));
2587 if(!exp->expType)
2588 {
2589 exp->expType = op1->type;
2590 if(op1->type)
2591 op1->type->refCount++;
2592 }
2593 return 1;
2594 }
2595
2596 static unsigned int FloatAdd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2597 {
2598 float value2 = op2->__anon1.f;
2599
2600 exp->type = 2;
2601 exp->__anon1.__anon2.string = PrintFloat((float)(op1->__anon1.f + value2));
2602 if(!exp->expType)
2603 {
2604 exp->expType = op1->type;
2605 if(op1->type)
2606 op1->type->refCount++;
2607 }
2608 return 1;
2609 }
2610
2611 static unsigned int DoubleAdd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2612 {
2613 double value2 = op2->__anon1.d;
2614
2615 exp->type = 2;
2616 exp->__anon1.__anon2.string = PrintDouble((double)(op1->__anon1.d + value2));
2617 if(!exp->expType)
2618 {
2619 exp->expType = op1->type;
2620 if(op1->type)
2621 op1->type->refCount++;
2622 }
2623 return 1;
2624 }
2625
2626 static unsigned int IntSub(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2627 {
2628 int value2 = op2->__anon1.i;
2629
2630 exp->type = 2;
2631 exp->__anon1.__anon2.string = PrintInt((op1->__anon1.i - value2));
2632 if(!exp->expType)
2633 {
2634 exp->expType = op1->type;
2635 if(op1->type)
2636 op1->type->refCount++;
2637 }
2638 return 1;
2639 }
2640
2641 static unsigned int UIntSub(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2642 {
2643 unsigned int value2 = op2->__anon1.ui;
2644
2645 exp->type = 2;
2646 exp->__anon1.__anon2.string = PrintUInt((op1->__anon1.ui - value2));
2647 if(!exp->expType)
2648 {
2649 exp->expType = op1->type;
2650 if(op1->type)
2651 op1->type->refCount++;
2652 }
2653 return 1;
2654 }
2655
2656 static unsigned int Int64Sub(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2657 {
2658 long long value2 = op2->__anon1.i64;
2659
2660 exp->type = 2;
2661 exp->__anon1.__anon2.string = PrintInt64((op1->__anon1.i64 - value2));
2662 if(!exp->expType)
2663 {
2664 exp->expType = op1->type;
2665 if(op1->type)
2666 op1->type->refCount++;
2667 }
2668 return 1;
2669 }
2670
2671 static unsigned int UInt64Sub(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2672 {
2673 uint64 value2 = op2->__anon1.ui64;
2674
2675 exp->type = 2;
2676 exp->__anon1.__anon2.string = PrintUInt64((op1->__anon1.ui64 - value2));
2677 if(!exp->expType)
2678 {
2679 exp->expType = op1->type;
2680 if(op1->type)
2681 op1->type->refCount++;
2682 }
2683 return 1;
2684 }
2685
2686 static unsigned int ShortSub(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2687 {
2688 short value2 = op2->__anon1.s;
2689
2690 exp->type = 2;
2691 exp->__anon1.__anon2.string = PrintShort((short)(op1->__anon1.s - value2));
2692 if(!exp->expType)
2693 {
2694 exp->expType = op1->type;
2695 if(op1->type)
2696 op1->type->refCount++;
2697 }
2698 return 1;
2699 }
2700
2701 static unsigned int UShortSub(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2702 {
2703 unsigned short value2 = op2->__anon1.us;
2704
2705 exp->type = 2;
2706 exp->__anon1.__anon2.string = PrintUShort((unsigned short)(op1->__anon1.us - value2));
2707 if(!exp->expType)
2708 {
2709 exp->expType = op1->type;
2710 if(op1->type)
2711 op1->type->refCount++;
2712 }
2713 return 1;
2714 }
2715
2716 static unsigned int CharSub(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2717 {
2718 char value2 = op2->__anon1.c;
2719
2720 exp->type = 2;
2721 exp->__anon1.__anon2.string = PrintChar((char)(op1->__anon1.c - value2));
2722 if(!exp->expType)
2723 {
2724 exp->expType = op1->type;
2725 if(op1->type)
2726 op1->type->refCount++;
2727 }
2728 return 1;
2729 }
2730
2731 static unsigned int UCharSub(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2732 {
2733 unsigned char value2 = op2->__anon1.uc;
2734
2735 exp->type = 2;
2736 exp->__anon1.__anon2.string = PrintUChar((unsigned char)(op1->__anon1.uc - value2));
2737 if(!exp->expType)
2738 {
2739 exp->expType = op1->type;
2740 if(op1->type)
2741 op1->type->refCount++;
2742 }
2743 return 1;
2744 }
2745
2746 static unsigned int FloatSub(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2747 {
2748 float value2 = op2->__anon1.f;
2749
2750 exp->type = 2;
2751 exp->__anon1.__anon2.string = PrintFloat((float)(op1->__anon1.f - value2));
2752 if(!exp->expType)
2753 {
2754 exp->expType = op1->type;
2755 if(op1->type)
2756 op1->type->refCount++;
2757 }
2758 return 1;
2759 }
2760
2761 static unsigned int DoubleSub(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2762 {
2763 double value2 = op2->__anon1.d;
2764
2765 exp->type = 2;
2766 exp->__anon1.__anon2.string = PrintDouble((double)(op1->__anon1.d - value2));
2767 if(!exp->expType)
2768 {
2769 exp->expType = op1->type;
2770 if(op1->type)
2771 op1->type->refCount++;
2772 }
2773 return 1;
2774 }
2775
2776 static unsigned int IntMul(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2777 {
2778 int value2 = op2->__anon1.i;
2779
2780 exp->type = 2;
2781 exp->__anon1.__anon2.string = PrintInt((op1->__anon1.i * value2));
2782 if(!exp->expType)
2783 {
2784 exp->expType = op1->type;
2785 if(op1->type)
2786 op1->type->refCount++;
2787 }
2788 return 1;
2789 }
2790
2791 static unsigned int UIntMul(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2792 {
2793 unsigned int value2 = op2->__anon1.ui;
2794
2795 exp->type = 2;
2796 exp->__anon1.__anon2.string = PrintUInt((op1->__anon1.ui * value2));
2797 if(!exp->expType)
2798 {
2799 exp->expType = op1->type;
2800 if(op1->type)
2801 op1->type->refCount++;
2802 }
2803 return 1;
2804 }
2805
2806 static unsigned int Int64Mul(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2807 {
2808 long long value2 = op2->__anon1.i64;
2809
2810 exp->type = 2;
2811 exp->__anon1.__anon2.string = PrintInt64((op1->__anon1.i64 * value2));
2812 if(!exp->expType)
2813 {
2814 exp->expType = op1->type;
2815 if(op1->type)
2816 op1->type->refCount++;
2817 }
2818 return 1;
2819 }
2820
2821 static unsigned int UInt64Mul(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2822 {
2823 uint64 value2 = op2->__anon1.ui64;
2824
2825 exp->type = 2;
2826 exp->__anon1.__anon2.string = PrintUInt64((op1->__anon1.ui64 * value2));
2827 if(!exp->expType)
2828 {
2829 exp->expType = op1->type;
2830 if(op1->type)
2831 op1->type->refCount++;
2832 }
2833 return 1;
2834 }
2835
2836 static unsigned int ShortMul(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2837 {
2838 short value2 = op2->__anon1.s;
2839
2840 exp->type = 2;
2841 exp->__anon1.__anon2.string = PrintShort((short)(op1->__anon1.s * value2));
2842 if(!exp->expType)
2843 {
2844 exp->expType = op1->type;
2845 if(op1->type)
2846 op1->type->refCount++;
2847 }
2848 return 1;
2849 }
2850
2851 static unsigned int UShortMul(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2852 {
2853 unsigned short value2 = op2->__anon1.us;
2854
2855 exp->type = 2;
2856 exp->__anon1.__anon2.string = PrintUShort((unsigned short)(op1->__anon1.us * value2));
2857 if(!exp->expType)
2858 {
2859 exp->expType = op1->type;
2860 if(op1->type)
2861 op1->type->refCount++;
2862 }
2863 return 1;
2864 }
2865
2866 static unsigned int CharMul(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2867 {
2868 char value2 = op2->__anon1.c;
2869
2870 exp->type = 2;
2871 exp->__anon1.__anon2.string = PrintChar((char)(op1->__anon1.c * value2));
2872 if(!exp->expType)
2873 {
2874 exp->expType = op1->type;
2875 if(op1->type)
2876 op1->type->refCount++;
2877 }
2878 return 1;
2879 }
2880
2881 static unsigned int UCharMul(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2882 {
2883 unsigned char value2 = op2->__anon1.uc;
2884
2885 exp->type = 2;
2886 exp->__anon1.__anon2.string = PrintUChar((unsigned char)(op1->__anon1.uc * value2));
2887 if(!exp->expType)
2888 {
2889 exp->expType = op1->type;
2890 if(op1->type)
2891 op1->type->refCount++;
2892 }
2893 return 1;
2894 }
2895
2896 static unsigned int FloatMul(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2897 {
2898 float value2 = op2->__anon1.f;
2899
2900 exp->type = 2;
2901 exp->__anon1.__anon2.string = PrintFloat((float)(op1->__anon1.f * value2));
2902 if(!exp->expType)
2903 {
2904 exp->expType = op1->type;
2905 if(op1->type)
2906 op1->type->refCount++;
2907 }
2908 return 1;
2909 }
2910
2911 static unsigned int DoubleMul(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2912 {
2913 double value2 = op2->__anon1.d;
2914
2915 exp->type = 2;
2916 exp->__anon1.__anon2.string = PrintDouble((double)(op1->__anon1.d * value2));
2917 if(!exp->expType)
2918 {
2919 exp->expType = op1->type;
2920 if(op1->type)
2921 op1->type->refCount++;
2922 }
2923 return 1;
2924 }
2925
2926 static unsigned int IntDiv(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2927 {
2928 int value2 = op2->__anon1.i;
2929
2930 exp->type = 2;
2931 exp->__anon1.__anon2.string = PrintInt(value2 ? ((op1->__anon1.i / value2)) : 0);
2932 if(!exp->expType)
2933 {
2934 exp->expType = op1->type;
2935 if(op1->type)
2936 op1->type->refCount++;
2937 }
2938 return 1;
2939 }
2940
2941 static unsigned int UIntDiv(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2942 {
2943 unsigned int value2 = op2->__anon1.ui;
2944
2945 exp->type = 2;
2946 exp->__anon1.__anon2.string = PrintUInt(value2 ? ((op1->__anon1.ui / value2)) : 0);
2947 if(!exp->expType)
2948 {
2949 exp->expType = op1->type;
2950 if(op1->type)
2951 op1->type->refCount++;
2952 }
2953 return 1;
2954 }
2955
2956 static unsigned int Int64Div(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2957 {
2958 long long value2 = op2->__anon1.i64;
2959
2960 exp->type = 2;
2961 exp->__anon1.__anon2.string = PrintInt64(value2 ? ((op1->__anon1.i64 / value2)) : 0);
2962 if(!exp->expType)
2963 {
2964 exp->expType = op1->type;
2965 if(op1->type)
2966 op1->type->refCount++;
2967 }
2968 return 1;
2969 }
2970
2971 static unsigned int UInt64Div(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2972 {
2973 uint64 value2 = op2->__anon1.ui64;
2974
2975 exp->type = 2;
2976 exp->__anon1.__anon2.string = PrintUInt64(value2 ? ((op1->__anon1.ui64 / value2)) : 0);
2977 if(!exp->expType)
2978 {
2979 exp->expType = op1->type;
2980 if(op1->type)
2981 op1->type->refCount++;
2982 }
2983 return 1;
2984 }
2985
2986 static unsigned int ShortDiv(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2987 {
2988 short value2 = op2->__anon1.s;
2989
2990 exp->type = 2;
2991 exp->__anon1.__anon2.string = PrintShort(value2 ? ((short)(op1->__anon1.s / value2)) : 0);
2992 if(!exp->expType)
2993 {
2994 exp->expType = op1->type;
2995 if(op1->type)
2996 op1->type->refCount++;
2997 }
2998 return 1;
2999 }
3000
3001 static unsigned int UShortDiv(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3002 {
3003 unsigned short value2 = op2->__anon1.us;
3004
3005 exp->type = 2;
3006 exp->__anon1.__anon2.string = PrintUShort(value2 ? ((unsigned short)(op1->__anon1.us / value2)) : 0);
3007 if(!exp->expType)
3008 {
3009 exp->expType = op1->type;
3010 if(op1->type)
3011 op1->type->refCount++;
3012 }
3013 return 1;
3014 }
3015
3016 static unsigned int CharDiv(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3017 {
3018 char value2 = op2->__anon1.c;
3019
3020 exp->type = 2;
3021 exp->__anon1.__anon2.string = PrintChar(value2 ? ((char)(op1->__anon1.c / value2)) : 0);
3022 if(!exp->expType)
3023 {
3024 exp->expType = op1->type;
3025 if(op1->type)
3026 op1->type->refCount++;
3027 }
3028 return 1;
3029 }
3030
3031 static unsigned int UCharDiv(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3032 {
3033 unsigned char value2 = op2->__anon1.uc;
3034
3035 exp->type = 2;
3036 exp->__anon1.__anon2.string = PrintUChar(value2 ? ((unsigned char)(op1->__anon1.uc / value2)) : 0);
3037 if(!exp->expType)
3038 {
3039 exp->expType = op1->type;
3040 if(op1->type)
3041 op1->type->refCount++;
3042 }
3043 return 1;
3044 }
3045
3046 static unsigned int FloatDiv(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3047 {
3048 float value2 = op2->__anon1.f;
3049
3050 exp->type = 2;
3051 exp->__anon1.__anon2.string = PrintFloat((float)(op1->__anon1.f / value2));
3052 if(!exp->expType)
3053 {
3054 exp->expType = op1->type;
3055 if(op1->type)
3056 op1->type->refCount++;
3057 }
3058 return 1;
3059 }
3060
3061 static unsigned int DoubleDiv(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3062 {
3063 double value2 = op2->__anon1.d;
3064
3065 exp->type = 2;
3066 exp->__anon1.__anon2.string = PrintDouble((double)(op1->__anon1.d / value2));
3067 if(!exp->expType)
3068 {
3069 exp->expType = op1->type;
3070 if(op1->type)
3071 op1->type->refCount++;
3072 }
3073 return 1;
3074 }
3075
3076 static unsigned int IntMod(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3077 {
3078 int value2 = op2->__anon1.i;
3079
3080 exp->type = 2;
3081 exp->__anon1.__anon2.string = PrintInt(value2 ? ((op1->__anon1.i % value2)) : 0);
3082 if(!exp->expType)
3083 {
3084 exp->expType = op1->type;
3085 if(op1->type)
3086 op1->type->refCount++;
3087 }
3088 return 1;
3089 }
3090
3091 static unsigned int UIntMod(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3092 {
3093 unsigned int value2 = op2->__anon1.ui;
3094
3095 exp->type = 2;
3096 exp->__anon1.__anon2.string = PrintUInt(value2 ? ((op1->__anon1.ui % value2)) : 0);
3097 if(!exp->expType)
3098 {
3099 exp->expType = op1->type;
3100 if(op1->type)
3101 op1->type->refCount++;
3102 }
3103 return 1;
3104 }
3105
3106 static unsigned int Int64Mod(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3107 {
3108 long long value2 = op2->__anon1.i64;
3109
3110 exp->type = 2;
3111 exp->__anon1.__anon2.string = PrintInt64(value2 ? ((op1->__anon1.i64 % value2)) : 0);
3112 if(!exp->expType)
3113 {
3114 exp->expType = op1->type;
3115 if(op1->type)
3116 op1->type->refCount++;
3117 }
3118 return 1;
3119 }
3120
3121 static unsigned int UInt64Mod(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3122 {
3123 uint64 value2 = op2->__anon1.ui64;
3124
3125 exp->type = 2;
3126 exp->__anon1.__anon2.string = PrintUInt64(value2 ? ((op1->__anon1.ui64 % value2)) : 0);
3127 if(!exp->expType)
3128 {
3129 exp->expType = op1->type;
3130 if(op1->type)
3131 op1->type->refCount++;
3132 }
3133 return 1;
3134 }
3135
3136 static unsigned int ShortMod(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3137 {
3138 short value2 = op2->__anon1.s;
3139
3140 exp->type = 2;
3141 exp->__anon1.__anon2.string = PrintShort(value2 ? ((short)(op1->__anon1.s % value2)) : 0);
3142 if(!exp->expType)
3143 {
3144 exp->expType = op1->type;
3145 if(op1->type)
3146 op1->type->refCount++;
3147 }
3148 return 1;
3149 }
3150
3151 static unsigned int UShortMod(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3152 {
3153 unsigned short value2 = op2->__anon1.us;
3154
3155 exp->type = 2;
3156 exp->__anon1.__anon2.string = PrintUShort(value2 ? ((unsigned short)(op1->__anon1.us % value2)) : 0);
3157 if(!exp->expType)
3158 {
3159 exp->expType = op1->type;
3160 if(op1->type)
3161 op1->type->refCount++;
3162 }
3163 return 1;
3164 }
3165
3166 static unsigned int CharMod(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3167 {
3168 char value2 = op2->__anon1.c;
3169
3170 exp->type = 2;
3171 exp->__anon1.__anon2.string = PrintChar(value2 ? ((char)(op1->__anon1.c % value2)) : 0);
3172 if(!exp->expType)
3173 {
3174 exp->expType = op1->type;
3175 if(op1->type)
3176 op1->type->refCount++;
3177 }
3178 return 1;
3179 }
3180
3181 static unsigned int UCharMod(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3182 {
3183 unsigned char value2 = op2->__anon1.uc;
3184
3185 exp->type = 2;
3186 exp->__anon1.__anon2.string = PrintUChar(value2 ? ((unsigned char)(op1->__anon1.uc % value2)) : 0);
3187 if(!exp->expType)
3188 {
3189 exp->expType = op1->type;
3190 if(op1->type)
3191 op1->type->refCount++;
3192 }
3193 return 1;
3194 }
3195
3196 static unsigned int IntNeg(struct Expression * exp, struct Operand * op1)
3197 {
3198 exp->type = 2;
3199 exp->__anon1.__anon2.string = PrintInt((-op1->__anon1.i));
3200 if(!exp->expType)
3201 {
3202 exp->expType = op1->type;
3203 if(op1->type)
3204 op1->type->refCount++;
3205 }
3206 return 1;
3207 }
3208
3209 static unsigned int UIntNeg(struct Expression * exp, struct Operand * op1)
3210 {
3211 exp->type = 2;
3212 exp->__anon1.__anon2.string = PrintUInt((unsigned int)(-op1->__anon1.ui));
3213 if(!exp->expType)
3214 {
3215 exp->expType = op1->type;
3216 if(op1->type)
3217 op1->type->refCount++;
3218 }
3219 return 1;
3220 }
3221
3222 static unsigned int Int64Neg(struct Expression * exp, struct Operand * op1)
3223 {
3224 exp->type = 2;
3225 exp->__anon1.__anon2.string = PrintInt64((-op1->__anon1.i64));
3226 if(!exp->expType)
3227 {
3228 exp->expType = op1->type;
3229 if(op1->type)
3230 op1->type->refCount++;
3231 }
3232 return 1;
3233 }
3234
3235 static unsigned int UInt64Neg(struct Expression * exp, struct Operand * op1)
3236 {
3237 exp->type = 2;
3238 exp->__anon1.__anon2.string = PrintUInt64((uint64)(-op1->__anon1.ui64));
3239 if(!exp->expType)
3240 {
3241 exp->expType = op1->type;
3242 if(op1->type)
3243 op1->type->refCount++;
3244 }
3245 return 1;
3246 }
3247
3248 static unsigned int ShortNeg(struct Expression * exp, struct Operand * op1)
3249 {
3250 exp->type = 2;
3251 exp->__anon1.__anon2.string = PrintShort((-op1->__anon1.s));
3252 if(!exp->expType)
3253 {
3254 exp->expType = op1->type;
3255 if(op1->type)
3256 op1->type->refCount++;
3257 }
3258 return 1;
3259 }
3260
3261 static unsigned int UShortNeg(struct Expression * exp, struct Operand * op1)
3262 {
3263 exp->type = 2;
3264 exp->__anon1.__anon2.string = PrintUShort((unsigned short)(-op1->__anon1.us));
3265 if(!exp->expType)
3266 {
3267 exp->expType = op1->type;
3268 if(op1->type)
3269 op1->type->refCount++;
3270 }
3271 return 1;
3272 }
3273
3274 static unsigned int CharNeg(struct Expression * exp, struct Operand * op1)
3275 {
3276 exp->type = 2;
3277 exp->__anon1.__anon2.string = PrintChar((-op1->__anon1.c));
3278 if(!exp->expType)
3279 {
3280 exp->expType = op1->type;
3281 if(op1->type)
3282 op1->type->refCount++;
3283 }
3284 return 1;
3285 }
3286
3287 static unsigned int UCharNeg(struct Expression * exp, struct Operand * op1)
3288 {
3289 exp->type = 2;
3290 exp->__anon1.__anon2.string = PrintUChar((unsigned char)(-op1->__anon1.uc));
3291 if(!exp->expType)
3292 {
3293 exp->expType = op1->type;
3294 if(op1->type)
3295 op1->type->refCount++;
3296 }
3297 return 1;
3298 }
3299
3300 static unsigned int FloatNeg(struct Expression * exp, struct Operand * op1)
3301 {
3302 exp->type = 2;
3303 exp->__anon1.__anon2.string = PrintFloat((float)(-op1->__anon1.f));
3304 if(!exp->expType)
3305 {
3306 exp->expType = op1->type;
3307 if(op1->type)
3308 op1->type->refCount++;
3309 }
3310 return 1;
3311 }
3312
3313 static unsigned int DoubleNeg(struct Expression * exp, struct Operand * op1)
3314 {
3315 exp->type = 2;
3316 exp->__anon1.__anon2.string = PrintDouble((double)(-op1->__anon1.d));
3317 if(!exp->expType)
3318 {
3319 exp->expType = op1->type;
3320 if(op1->type)
3321 op1->type->refCount++;
3322 }
3323 return 1;
3324 }
3325
3326 static unsigned int IntInc(struct Expression * exp, struct Operand * op1)
3327 {
3328 exp->type = 2;
3329 exp->__anon1.__anon2.string = PrintInt((++op1->__anon1.i));
3330 if(!exp->expType)
3331 {
3332 exp->expType = op1->type;
3333 if(op1->type)
3334 op1->type->refCount++;
3335 }
3336 return 1;
3337 }
3338
3339 static unsigned int UIntInc(struct Expression * exp, struct Operand * op1)
3340 {
3341 exp->type = 2;
3342 exp->__anon1.__anon2.string = PrintUInt((++op1->__anon1.ui));
3343 if(!exp->expType)
3344 {
3345 exp->expType = op1->type;
3346 if(op1->type)
3347 op1->type->refCount++;
3348 }
3349 return 1;
3350 }
3351
3352 static unsigned int Int64Inc(struct Expression * exp, struct Operand * op1)
3353 {
3354 exp->type = 2;
3355 exp->__anon1.__anon2.string = PrintInt64((++op1->__anon1.i64));
3356 if(!exp->expType)
3357 {
3358 exp->expType = op1->type;
3359 if(op1->type)
3360 op1->type->refCount++;
3361 }
3362 return 1;
3363 }
3364
3365 static unsigned int UInt64Inc(struct Expression * exp, struct Operand * op1)
3366 {
3367 exp->type = 2;
3368 exp->__anon1.__anon2.string = PrintUInt64((++op1->__anon1.ui64));
3369 if(!exp->expType)
3370 {
3371 exp->expType = op1->type;
3372 if(op1->type)
3373 op1->type->refCount++;
3374 }
3375 return 1;
3376 }
3377
3378 static unsigned int ShortInc(struct Expression * exp, struct Operand * op1)
3379 {
3380 exp->type = 2;
3381 exp->__anon1.__anon2.string = PrintShort((++op1->__anon1.s));
3382 if(!exp->expType)
3383 {
3384 exp->expType = op1->type;
3385 if(op1->type)
3386 op1->type->refCount++;
3387 }
3388 return 1;
3389 }
3390
3391 static unsigned int UShortInc(struct Expression * exp, struct Operand * op1)
3392 {
3393 exp->type = 2;
3394 exp->__anon1.__anon2.string = PrintUShort((++op1->__anon1.us));
3395 if(!exp->expType)
3396 {
3397 exp->expType = op1->type;
3398 if(op1->type)
3399 op1->type->refCount++;
3400 }
3401 return 1;
3402 }
3403
3404 static unsigned int CharInc(struct Expression * exp, struct Operand * op1)
3405 {
3406 exp->type = 2;
3407 exp->__anon1.__anon2.string = PrintChar((++op1->__anon1.c));
3408 if(!exp->expType)
3409 {
3410 exp->expType = op1->type;
3411 if(op1->type)
3412 op1->type->refCount++;
3413 }
3414 return 1;
3415 }
3416
3417 static unsigned int UCharInc(struct Expression * exp, struct Operand * op1)
3418 {
3419 exp->type = 2;
3420 exp->__anon1.__anon2.string = PrintUChar((++op1->__anon1.uc));
3421 if(!exp->expType)
3422 {
3423 exp->expType = op1->type;
3424 if(op1->type)
3425 op1->type->refCount++;
3426 }
3427 return 1;
3428 }
3429
3430 static unsigned int FloatInc(struct Expression * exp, struct Operand * op1)
3431 {
3432 exp->type = 2;
3433 exp->__anon1.__anon2.string = PrintFloat((float)(++op1->__anon1.f));
3434 if(!exp->expType)
3435 {
3436 exp->expType = op1->type;
3437 if(op1->type)
3438 op1->type->refCount++;
3439 }
3440 return 1;
3441 }
3442
3443 static unsigned int DoubleInc(struct Expression * exp, struct Operand * op1)
3444 {
3445 exp->type = 2;
3446 exp->__anon1.__anon2.string = PrintDouble((double)(++op1->__anon1.d));
3447 if(!exp->expType)
3448 {
3449 exp->expType = op1->type;
3450 if(op1->type)
3451 op1->type->refCount++;
3452 }
3453 return 1;
3454 }
3455
3456 static unsigned int IntDec(struct Expression * exp, struct Operand * op1)
3457 {
3458 exp->type = 2;
3459 exp->__anon1.__anon2.string = PrintInt((--op1->__anon1.i));
3460 if(!exp->expType)
3461 {
3462 exp->expType = op1->type;
3463 if(op1->type)
3464 op1->type->refCount++;
3465 }
3466 return 1;
3467 }
3468
3469 static unsigned int UIntDec(struct Expression * exp, struct Operand * op1)
3470 {
3471 exp->type = 2;
3472 exp->__anon1.__anon2.string = PrintUInt((--op1->__anon1.ui));
3473 if(!exp->expType)
3474 {
3475 exp->expType = op1->type;
3476 if(op1->type)
3477 op1->type->refCount++;
3478 }
3479 return 1;
3480 }
3481
3482 static unsigned int Int64Dec(struct Expression * exp, struct Operand * op1)
3483 {
3484 exp->type = 2;
3485 exp->__anon1.__anon2.string = PrintInt64((--op1->__anon1.i64));
3486 if(!exp->expType)
3487 {
3488 exp->expType = op1->type;
3489 if(op1->type)
3490 op1->type->refCount++;
3491 }
3492 return 1;
3493 }
3494
3495 static unsigned int UInt64Dec(struct Expression * exp, struct Operand * op1)
3496 {
3497 exp->type = 2;
3498 exp->__anon1.__anon2.string = PrintUInt64((--op1->__anon1.ui64));
3499 if(!exp->expType)
3500 {
3501 exp->expType = op1->type;
3502 if(op1->type)
3503 op1->type->refCount++;
3504 }
3505 return 1;
3506 }
3507
3508 static unsigned int ShortDec(struct Expression * exp, struct Operand * op1)
3509 {
3510 exp->type = 2;
3511 exp->__anon1.__anon2.string = PrintShort((--op1->__anon1.s));
3512 if(!exp->expType)
3513 {
3514 exp->expType = op1->type;
3515 if(op1->type)
3516 op1->type->refCount++;
3517 }
3518 return 1;
3519 }
3520
3521 static unsigned int UShortDec(struct Expression * exp, struct Operand * op1)
3522 {
3523 exp->type = 2;
3524 exp->__anon1.__anon2.string = PrintUShort((--op1->__anon1.us));
3525 if(!exp->expType)
3526 {
3527 exp->expType = op1->type;
3528 if(op1->type)
3529 op1->type->refCount++;
3530 }
3531 return 1;
3532 }
3533
3534 static unsigned int CharDec(struct Expression * exp, struct Operand * op1)
3535 {
3536 exp->type = 2;
3537 exp->__anon1.__anon2.string = PrintChar((--op1->__anon1.c));
3538 if(!exp->expType)
3539 {
3540 exp->expType = op1->type;
3541 if(op1->type)
3542 op1->type->refCount++;
3543 }
3544 return 1;
3545 }
3546
3547 static unsigned int UCharDec(struct Expression * exp, struct Operand * op1)
3548 {
3549 exp->type = 2;
3550 exp->__anon1.__anon2.string = PrintUChar((--op1->__anon1.uc));
3551 if(!exp->expType)
3552 {
3553 exp->expType = op1->type;
3554 if(op1->type)
3555 op1->type->refCount++;
3556 }
3557 return 1;
3558 }
3559
3560 static unsigned int FloatDec(struct Expression * exp, struct Operand * op1)
3561 {
3562 exp->type = 2;
3563 exp->__anon1.__anon2.string = PrintFloat((float)(--op1->__anon1.f));
3564 if(!exp->expType)
3565 {
3566 exp->expType = op1->type;
3567 if(op1->type)
3568 op1->type->refCount++;
3569 }
3570 return 1;
3571 }
3572
3573 static unsigned int DoubleDec(struct Expression * exp, struct Operand * op1)
3574 {
3575 exp->type = 2;
3576 exp->__anon1.__anon2.string = PrintDouble((double)(--op1->__anon1.d));
3577 if(!exp->expType)
3578 {
3579 exp->expType = op1->type;
3580 if(op1->type)
3581 op1->type->refCount++;
3582 }
3583 return 1;
3584 }
3585
3586 static unsigned int IntAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3587 {
3588 int value2 = op2->__anon1.i;
3589
3590 exp->type = 2;
3591 exp->__anon1.__anon2.string = PrintInt((op1->__anon1.i = value2));
3592 if(!exp->expType)
3593 {
3594 exp->expType = op1->type;
3595 if(op1->type)
3596 op1->type->refCount++;
3597 }
3598 return 1;
3599 }
3600
3601 static unsigned int UIntAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3602 {
3603 unsigned int value2 = op2->__anon1.ui;
3604
3605 exp->type = 2;
3606 exp->__anon1.__anon2.string = PrintUInt((op1->__anon1.ui = value2));
3607 if(!exp->expType)
3608 {
3609 exp->expType = op1->type;
3610 if(op1->type)
3611 op1->type->refCount++;
3612 }
3613 return 1;
3614 }
3615
3616 static unsigned int Int64Asign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3617 {
3618 long long value2 = op2->__anon1.i64;
3619
3620 exp->type = 2;
3621 exp->__anon1.__anon2.string = PrintInt64((op1->__anon1.i64 = value2));
3622 if(!exp->expType)
3623 {
3624 exp->expType = op1->type;
3625 if(op1->type)
3626 op1->type->refCount++;
3627 }
3628 return 1;
3629 }
3630
3631 static unsigned int UInt64Asign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3632 {
3633 uint64 value2 = op2->__anon1.ui64;
3634
3635 exp->type = 2;
3636 exp->__anon1.__anon2.string = PrintUInt64((op1->__anon1.ui64 = value2));
3637 if(!exp->expType)
3638 {
3639 exp->expType = op1->type;
3640 if(op1->type)
3641 op1->type->refCount++;
3642 }
3643 return 1;
3644 }
3645
3646 static unsigned int ShortAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3647 {
3648 short value2 = op2->__anon1.s;
3649
3650 exp->type = 2;
3651 exp->__anon1.__anon2.string = PrintShort((op1->__anon1.s = value2));
3652 if(!exp->expType)
3653 {
3654 exp->expType = op1->type;
3655 if(op1->type)
3656 op1->type->refCount++;
3657 }
3658 return 1;
3659 }
3660
3661 static unsigned int UShortAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3662 {
3663 unsigned short value2 = op2->__anon1.us;
3664
3665 exp->type = 2;
3666 exp->__anon1.__anon2.string = PrintUShort((op1->__anon1.us = value2));
3667 if(!exp->expType)
3668 {
3669 exp->expType = op1->type;
3670 if(op1->type)
3671 op1->type->refCount++;
3672 }
3673 return 1;
3674 }
3675
3676 static unsigned int CharAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3677 {
3678 char value2 = op2->__anon1.c;
3679
3680 exp->type = 2;
3681 exp->__anon1.__anon2.string = PrintChar((op1->__anon1.c = value2));
3682 if(!exp->expType)
3683 {
3684 exp->expType = op1->type;
3685 if(op1->type)
3686 op1->type->refCount++;
3687 }
3688 return 1;
3689 }
3690
3691 static unsigned int UCharAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3692 {
3693 unsigned char value2 = op2->__anon1.uc;
3694
3695 exp->type = 2;
3696 exp->__anon1.__anon2.string = PrintUChar((op1->__anon1.uc = value2));
3697 if(!exp->expType)
3698 {
3699 exp->expType = op1->type;
3700 if(op1->type)
3701 op1->type->refCount++;
3702 }
3703 return 1;
3704 }
3705
3706 static unsigned int FloatAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3707 {
3708 float value2 = op2->__anon1.f;
3709
3710 exp->type = 2;
3711 exp->__anon1.__anon2.string = PrintFloat((float)(op1->__anon1.f = value2));
3712 if(!exp->expType)
3713 {
3714 exp->expType = op1->type;
3715 if(op1->type)
3716 op1->type->refCount++;
3717 }
3718 return 1;
3719 }
3720
3721 static unsigned int DoubleAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3722 {
3723 double value2 = op2->__anon1.d;
3724
3725 exp->type = 2;
3726 exp->__anon1.__anon2.string = PrintDouble((double)(op1->__anon1.d = value2));
3727 if(!exp->expType)
3728 {
3729 exp->expType = op1->type;
3730 if(op1->type)
3731 op1->type->refCount++;
3732 }
3733 return 1;
3734 }
3735
3736 static unsigned int IntAddAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3737 {
3738 int value2 = op2->__anon1.i;
3739
3740 exp->type = 2;
3741 exp->__anon1.__anon2.string = PrintInt((op1->__anon1.i += value2));
3742 if(!exp->expType)
3743 {
3744 exp->expType = op1->type;
3745 if(op1->type)
3746 op1->type->refCount++;
3747 }
3748 return 1;
3749 }
3750
3751 static unsigned int UIntAddAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3752 {
3753 unsigned int value2 = op2->__anon1.ui;
3754
3755 exp->type = 2;
3756 exp->__anon1.__anon2.string = PrintUInt((op1->__anon1.ui += value2));
3757 if(!exp->expType)
3758 {
3759 exp->expType = op1->type;
3760 if(op1->type)
3761 op1->type->refCount++;
3762 }
3763 return 1;
3764 }
3765
3766 static unsigned int Int64AddAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3767 {
3768 long long value2 = op2->__anon1.i64;
3769
3770 exp->type = 2;
3771 exp->__anon1.__anon2.string = PrintInt64((op1->__anon1.i64 += value2));
3772 if(!exp->expType)
3773 {
3774 exp->expType = op1->type;
3775 if(op1->type)
3776 op1->type->refCount++;
3777 }
3778 return 1;
3779 }
3780
3781 static unsigned int UInt64AddAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3782 {
3783 uint64 value2 = op2->__anon1.ui64;
3784
3785 exp->type = 2;
3786 exp->__anon1.__anon2.string = PrintUInt64((op1->__anon1.ui64 += value2));
3787 if(!exp->expType)
3788 {
3789 exp->expType = op1->type;
3790 if(op1->type)
3791 op1->type->refCount++;
3792 }
3793 return 1;
3794 }
3795
3796 static unsigned int ShortAddAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3797 {
3798 short value2 = op2->__anon1.s;
3799
3800 exp->type = 2;
3801 exp->__anon1.__anon2.string = PrintShort((op1->__anon1.s += value2));
3802 if(!exp->expType)
3803 {
3804 exp->expType = op1->type;
3805 if(op1->type)
3806 op1->type->refCount++;
3807 }
3808 return 1;
3809 }
3810
3811 static unsigned int UShortAddAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3812 {
3813 unsigned short value2 = op2->__anon1.us;
3814
3815 exp->type = 2;
3816 exp->__anon1.__anon2.string = PrintUShort((op1->__anon1.us += value2));
3817 if(!exp->expType)
3818 {
3819 exp->expType = op1->type;
3820 if(op1->type)
3821 op1->type->refCount++;
3822 }
3823 return 1;
3824 }
3825
3826 static unsigned int CharAddAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3827 {
3828 char value2 = op2->__anon1.c;
3829
3830 exp->type = 2;
3831 exp->__anon1.__anon2.string = PrintChar((op1->__anon1.c += value2));
3832 if(!exp->expType)
3833 {
3834 exp->expType = op1->type;
3835 if(op1->type)
3836 op1->type->refCount++;
3837 }
3838 return 1;
3839 }
3840
3841 static unsigned int UCharAddAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3842 {
3843 unsigned char value2 = op2->__anon1.uc;
3844
3845 exp->type = 2;
3846 exp->__anon1.__anon2.string = PrintUChar((op1->__anon1.uc += value2));
3847 if(!exp->expType)
3848 {
3849 exp->expType = op1->type;
3850 if(op1->type)
3851 op1->type->refCount++;
3852 }
3853 return 1;
3854 }
3855
3856 static unsigned int FloatAddAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3857 {
3858 float value2 = op2->__anon1.f;
3859
3860 exp->type = 2;
3861 exp->__anon1.__anon2.string = PrintFloat((float)(op1->__anon1.f += value2));
3862 if(!exp->expType)
3863 {
3864 exp->expType = op1->type;
3865 if(op1->type)
3866 op1->type->refCount++;
3867 }
3868 return 1;
3869 }
3870
3871 static unsigned int DoubleAddAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3872 {
3873 double value2 = op2->__anon1.d;
3874
3875 exp->type = 2;
3876 exp->__anon1.__anon2.string = PrintDouble((double)(op1->__anon1.d += value2));
3877 if(!exp->expType)
3878 {
3879 exp->expType = op1->type;
3880 if(op1->type)
3881 op1->type->refCount++;
3882 }
3883 return 1;
3884 }
3885
3886 static unsigned int IntSubAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3887 {
3888 int value2 = op2->__anon1.i;
3889
3890 exp->type = 2;
3891 exp->__anon1.__anon2.string = PrintInt((op1->__anon1.i -= value2));
3892 if(!exp->expType)
3893 {
3894 exp->expType = op1->type;
3895 if(op1->type)
3896 op1->type->refCount++;
3897 }
3898 return 1;
3899 }
3900
3901 static unsigned int UIntSubAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3902 {
3903 unsigned int value2 = op2->__anon1.ui;
3904
3905 exp->type = 2;
3906 exp->__anon1.__anon2.string = PrintUInt((op1->__anon1.ui -= value2));
3907 if(!exp->expType)
3908 {
3909 exp->expType = op1->type;
3910 if(op1->type)
3911 op1->type->refCount++;
3912 }
3913 return 1;
3914 }
3915
3916 static unsigned int Int64SubAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3917 {
3918 long long value2 = op2->__anon1.i64;
3919
3920 exp->type = 2;
3921 exp->__anon1.__anon2.string = PrintInt64((op1->__anon1.i64 -= value2));
3922 if(!exp->expType)
3923 {
3924 exp->expType = op1->type;
3925 if(op1->type)
3926 op1->type->refCount++;
3927 }
3928 return 1;
3929 }
3930
3931 static unsigned int UInt64SubAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3932 {
3933 uint64 value2 = op2->__anon1.ui64;
3934
3935 exp->type = 2;
3936 exp->__anon1.__anon2.string = PrintUInt64((op1->__anon1.ui64 -= value2));
3937 if(!exp->expType)
3938 {
3939 exp->expType = op1->type;
3940 if(op1->type)
3941 op1->type->refCount++;
3942 }
3943 return 1;
3944 }
3945
3946 static unsigned int ShortSubAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3947 {
3948 short value2 = op2->__anon1.s;
3949
3950 exp->type = 2;
3951 exp->__anon1.__anon2.string = PrintShort((op1->__anon1.s -= value2));
3952 if(!exp->expType)
3953 {
3954 exp->expType = op1->type;
3955 if(op1->type)
3956 op1->type->refCount++;
3957 }
3958 return 1;
3959 }
3960
3961 static unsigned int UShortSubAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3962 {
3963 unsigned short value2 = op2->__anon1.us;
3964
3965 exp->type = 2;
3966 exp->__anon1.__anon2.string = PrintUShort((op1->__anon1.us -= value2));
3967 if(!exp->expType)
3968 {
3969 exp->expType = op1->type;
3970 if(op1->type)
3971 op1->type->refCount++;
3972 }
3973 return 1;
3974 }
3975
3976 static unsigned int CharSubAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3977 {
3978 char value2 = op2->__anon1.c;
3979
3980 exp->type = 2;
3981 exp->__anon1.__anon2.string = PrintChar((op1->__anon1.c -= value2));
3982 if(!exp->expType)
3983 {
3984 exp->expType = op1->type;
3985 if(op1->type)
3986 op1->type->refCount++;
3987 }
3988 return 1;
3989 }
3990
3991 static unsigned int UCharSubAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3992 {
3993 unsigned char value2 = op2->__anon1.uc;
3994
3995 exp->type = 2;
3996 exp->__anon1.__anon2.string = PrintUChar((op1->__anon1.uc -= value2));
3997 if(!exp->expType)
3998 {
3999 exp->expType = op1->type;
4000 if(op1->type)
4001 op1->type->refCount++;
4002 }
4003 return 1;
4004 }
4005
4006 static unsigned int FloatSubAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4007 {
4008 float value2 = op2->__anon1.f;
4009
4010 exp->type = 2;
4011 exp->__anon1.__anon2.string = PrintFloat((float)(op1->__anon1.f -= value2));
4012 if(!exp->expType)
4013 {
4014 exp->expType = op1->type;
4015 if(op1->type)
4016 op1->type->refCount++;
4017 }
4018 return 1;
4019 }
4020
4021 static unsigned int DoubleSubAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4022 {
4023 double value2 = op2->__anon1.d;
4024
4025 exp->type = 2;
4026 exp->__anon1.__anon2.string = PrintDouble((double)(op1->__anon1.d -= value2));
4027 if(!exp->expType)
4028 {
4029 exp->expType = op1->type;
4030 if(op1->type)
4031 op1->type->refCount++;
4032 }
4033 return 1;
4034 }
4035
4036 static unsigned int IntMulAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4037 {
4038 int value2 = op2->__anon1.i;
4039
4040 exp->type = 2;
4041 exp->__anon1.__anon2.string = PrintInt((op1->__anon1.i *= value2));
4042 if(!exp->expType)
4043 {
4044 exp->expType = op1->type;
4045 if(op1->type)
4046 op1->type->refCount++;
4047 }
4048 return 1;
4049 }
4050
4051 static unsigned int UIntMulAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4052 {
4053 unsigned int value2 = op2->__anon1.ui;
4054
4055 exp->type = 2;
4056 exp->__anon1.__anon2.string = PrintUInt((op1->__anon1.ui *= value2));
4057 if(!exp->expType)
4058 {
4059 exp->expType = op1->type;
4060 if(op1->type)
4061 op1->type->refCount++;
4062 }
4063 return 1;
4064 }
4065
4066 static unsigned int Int64MulAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4067 {
4068 long long value2 = op2->__anon1.i64;
4069
4070 exp->type = 2;
4071 exp->__anon1.__anon2.string = PrintInt64((op1->__anon1.i64 *= value2));
4072 if(!exp->expType)
4073 {
4074 exp->expType = op1->type;
4075 if(op1->type)
4076 op1->type->refCount++;
4077 }
4078 return 1;
4079 }
4080
4081 static unsigned int UInt64MulAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4082 {
4083 uint64 value2 = op2->__anon1.ui64;
4084
4085 exp->type = 2;
4086 exp->__anon1.__anon2.string = PrintUInt64((op1->__anon1.ui64 *= value2));
4087 if(!exp->expType)
4088 {
4089 exp->expType = op1->type;
4090 if(op1->type)
4091 op1->type->refCount++;
4092 }
4093 return 1;
4094 }
4095
4096 static unsigned int ShortMulAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4097 {
4098 short value2 = op2->__anon1.s;
4099
4100 exp->type = 2;
4101 exp->__anon1.__anon2.string = PrintShort((op1->__anon1.s *= value2));
4102 if(!exp->expType)
4103 {
4104 exp->expType = op1->type;
4105 if(op1->type)
4106 op1->type->refCount++;
4107 }
4108 return 1;
4109 }
4110
4111 static unsigned int UShortMulAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4112 {
4113 unsigned short value2 = op2->__anon1.us;
4114
4115 exp->type = 2;
4116 exp->__anon1.__anon2.string = PrintUShort((op1->__anon1.us *= value2));
4117 if(!exp->expType)
4118 {
4119 exp->expType = op1->type;
4120 if(op1->type)
4121 op1->type->refCount++;
4122 }
4123 return 1;
4124 }
4125
4126 static unsigned int CharMulAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4127 {
4128 char value2 = op2->__anon1.c;
4129
4130 exp->type = 2;
4131 exp->__anon1.__anon2.string = PrintChar((op1->__anon1.c *= value2));
4132 if(!exp->expType)
4133 {
4134 exp->expType = op1->type;
4135 if(op1->type)
4136 op1->type->refCount++;
4137 }
4138 return 1;
4139 }
4140
4141 static unsigned int UCharMulAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4142 {
4143 unsigned char value2 = op2->__anon1.uc;
4144
4145 exp->type = 2;
4146 exp->__anon1.__anon2.string = PrintUChar((op1->__anon1.uc *= value2));
4147 if(!exp->expType)
4148 {
4149 exp->expType = op1->type;
4150 if(op1->type)
4151 op1->type->refCount++;
4152 }
4153 return 1;
4154 }
4155
4156 static unsigned int FloatMulAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4157 {
4158 float value2 = op2->__anon1.f;
4159
4160 exp->type = 2;
4161 exp->__anon1.__anon2.string = PrintFloat((float)(op1->__anon1.f *= value2));
4162 if(!exp->expType)
4163 {
4164 exp->expType = op1->type;
4165 if(op1->type)
4166 op1->type->refCount++;
4167 }
4168 return 1;
4169 }
4170
4171 static unsigned int DoubleMulAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4172 {
4173 double value2 = op2->__anon1.d;
4174
4175 exp->type = 2;
4176 exp->__anon1.__anon2.string = PrintDouble((double)(op1->__anon1.d *= value2));
4177 if(!exp->expType)
4178 {
4179 exp->expType = op1->type;
4180 if(op1->type)
4181 op1->type->refCount++;
4182 }
4183 return 1;
4184 }
4185
4186 static unsigned int IntDivAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4187 {
4188 int value2 = op2->__anon1.i;
4189
4190 exp->type = 2;
4191 exp->__anon1.__anon2.string = PrintInt(value2 ? ((op1->__anon1.i /= value2)) : 0);
4192 if(!exp->expType)
4193 {
4194 exp->expType = op1->type;
4195 if(op1->type)
4196 op1->type->refCount++;
4197 }
4198 return 1;
4199 }
4200
4201 static unsigned int UIntDivAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4202 {
4203 unsigned int value2 = op2->__anon1.ui;
4204
4205 exp->type = 2;
4206 exp->__anon1.__anon2.string = PrintUInt(value2 ? ((op1->__anon1.ui /= value2)) : 0);
4207 if(!exp->expType)
4208 {
4209 exp->expType = op1->type;
4210 if(op1->type)
4211 op1->type->refCount++;
4212 }
4213 return 1;
4214 }
4215
4216 static unsigned int Int64DivAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4217 {
4218 long long value2 = op2->__anon1.i64;
4219
4220 exp->type = 2;
4221 exp->__anon1.__anon2.string = PrintInt64(value2 ? ((op1->__anon1.i64 /= value2)) : 0);
4222 if(!exp->expType)
4223 {
4224 exp->expType = op1->type;
4225 if(op1->type)
4226 op1->type->refCount++;
4227 }
4228 return 1;
4229 }
4230
4231 static unsigned int UInt64DivAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4232 {
4233 uint64 value2 = op2->__anon1.ui64;
4234
4235 exp->type = 2;
4236 exp->__anon1.__anon2.string = PrintUInt64(value2 ? ((op1->__anon1.ui64 /= value2)) : 0);
4237 if(!exp->expType)
4238 {
4239 exp->expType = op1->type;
4240 if(op1->type)
4241 op1->type->refCount++;
4242 }
4243 return 1;
4244 }
4245
4246 static unsigned int ShortDivAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4247 {
4248 short value2 = op2->__anon1.s;
4249
4250 exp->type = 2;
4251 exp->__anon1.__anon2.string = PrintShort(value2 ? ((op1->__anon1.s /= value2)) : 0);
4252 if(!exp->expType)
4253 {
4254 exp->expType = op1->type;
4255 if(op1->type)
4256 op1->type->refCount++;
4257 }
4258 return 1;
4259 }
4260
4261 static unsigned int UShortDivAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4262 {
4263 unsigned short value2 = op2->__anon1.us;
4264
4265 exp->type = 2;
4266 exp->__anon1.__anon2.string = PrintUShort(value2 ? ((op1->__anon1.us /= value2)) : 0);
4267 if(!exp->expType)
4268 {
4269 exp->expType = op1->type;
4270 if(op1->type)
4271 op1->type->refCount++;
4272 }
4273 return 1;
4274 }
4275
4276 static unsigned int CharDivAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4277 {
4278 char value2 = op2->__anon1.c;
4279
4280 exp->type = 2;
4281 exp->__anon1.__anon2.string = PrintChar(value2 ? ((op1->__anon1.c /= value2)) : 0);
4282 if(!exp->expType)
4283 {
4284 exp->expType = op1->type;
4285 if(op1->type)
4286 op1->type->refCount++;
4287 }
4288 return 1;
4289 }
4290
4291 static unsigned int UCharDivAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4292 {
4293 unsigned char value2 = op2->__anon1.uc;
4294
4295 exp->type = 2;
4296 exp->__anon1.__anon2.string = PrintUChar(value2 ? ((op1->__anon1.uc /= value2)) : 0);
4297 if(!exp->expType)
4298 {
4299 exp->expType = op1->type;
4300 if(op1->type)
4301 op1->type->refCount++;
4302 }
4303 return 1;
4304 }
4305
4306 static unsigned int FloatDivAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4307 {
4308 float value2 = op2->__anon1.f;
4309
4310 exp->type = 2;
4311 exp->__anon1.__anon2.string = PrintFloat((float)(op1->__anon1.f /= value2));
4312 if(!exp->expType)
4313 {
4314 exp->expType = op1->type;
4315 if(op1->type)
4316 op1->type->refCount++;
4317 }
4318 return 1;
4319 }
4320
4321 static unsigned int DoubleDivAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4322 {
4323 double value2 = op2->__anon1.d;
4324
4325 exp->type = 2;
4326 exp->__anon1.__anon2.string = PrintDouble((double)(op1->__anon1.d /= value2));
4327 if(!exp->expType)
4328 {
4329 exp->expType = op1->type;
4330 if(op1->type)
4331 op1->type->refCount++;
4332 }
4333 return 1;
4334 }
4335
4336 static unsigned int IntModAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4337 {
4338 int value2 = op2->__anon1.i;
4339
4340 exp->type = 2;
4341 exp->__anon1.__anon2.string = PrintInt(value2 ? ((op1->__anon1.i %= value2)) : 0);
4342 if(!exp->expType)
4343 {
4344 exp->expType = op1->type;
4345 if(op1->type)
4346 op1->type->refCount++;
4347 }
4348 return 1;
4349 }
4350
4351 static unsigned int UIntModAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4352 {
4353 unsigned int value2 = op2->__anon1.ui;
4354
4355 exp->type = 2;
4356 exp->__anon1.__anon2.string = PrintUInt(value2 ? ((op1->__anon1.ui %= value2)) : 0);
4357 if(!exp->expType)
4358 {
4359 exp->expType = op1->type;
4360 if(op1->type)
4361 op1->type->refCount++;
4362 }
4363 return 1;
4364 }
4365
4366 static unsigned int Int64ModAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4367 {
4368 long long value2 = op2->__anon1.i64;
4369
4370 exp->type = 2;
4371 exp->__anon1.__anon2.string = PrintInt64(value2 ? ((op1->__anon1.i64 %= value2)) : 0);
4372 if(!exp->expType)
4373 {
4374 exp->expType = op1->type;
4375 if(op1->type)
4376 op1->type->refCount++;
4377 }
4378 return 1;
4379 }
4380
4381 static unsigned int UInt64ModAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4382 {
4383 uint64 value2 = op2->__anon1.ui64;
4384
4385 exp->type = 2;
4386 exp->__anon1.__anon2.string = PrintUInt64(value2 ? ((op1->__anon1.ui64 %= value2)) : 0);
4387 if(!exp->expType)
4388 {
4389 exp->expType = op1->type;
4390 if(op1->type)
4391 op1->type->refCount++;
4392 }
4393 return 1;
4394 }
4395
4396 static unsigned int ShortModAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4397 {
4398 short value2 = op2->__anon1.s;
4399
4400 exp->type = 2;
4401 exp->__anon1.__anon2.string = PrintShort(value2 ? ((op1->__anon1.s %= value2)) : 0);
4402 if(!exp->expType)
4403 {
4404 exp->expType = op1->type;
4405 if(op1->type)
4406 op1->type->refCount++;
4407 }
4408 return 1;
4409 }
4410
4411 static unsigned int UShortModAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4412 {
4413 unsigned short value2 = op2->__anon1.us;
4414
4415 exp->type = 2;
4416 exp->__anon1.__anon2.string = PrintUShort(value2 ? ((op1->__anon1.us %= value2)) : 0);
4417 if(!exp->expType)
4418 {
4419 exp->expType = op1->type;
4420 if(op1->type)
4421 op1->type->refCount++;
4422 }
4423 return 1;
4424 }
4425
4426 static unsigned int CharModAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4427 {
4428 char value2 = op2->__anon1.c;
4429
4430 exp->type = 2;
4431 exp->__anon1.__anon2.string = PrintChar(value2 ? ((op1->__anon1.c %= value2)) : 0);
4432 if(!exp->expType)
4433 {
4434 exp->expType = op1->type;
4435 if(op1->type)
4436 op1->type->refCount++;
4437 }
4438 return 1;
4439 }
4440
4441 static unsigned int UCharModAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4442 {
4443 unsigned char value2 = op2->__anon1.uc;
4444
4445 exp->type = 2;
4446 exp->__anon1.__anon2.string = PrintUChar(value2 ? ((op1->__anon1.uc %= value2)) : 0);
4447 if(!exp->expType)
4448 {
4449 exp->expType = op1->type;
4450 if(op1->type)
4451 op1->type->refCount++;
4452 }
4453 return 1;
4454 }
4455
4456 static unsigned int IntBitAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4457 {
4458 int value2 = op2->__anon1.i;
4459
4460 exp->type = 2;
4461 exp->__anon1.__anon2.string = PrintInt((op1->__anon1.i & value2));
4462 if(!exp->expType)
4463 {
4464 exp->expType = op1->type;
4465 if(op1->type)
4466 op1->type->refCount++;
4467 }
4468 return 1;
4469 }
4470
4471 static unsigned int UIntBitAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4472 {
4473 unsigned int value2 = op2->__anon1.ui;
4474
4475 exp->type = 2;
4476 exp->__anon1.__anon2.string = PrintUInt((op1->__anon1.ui & value2));
4477 if(!exp->expType)
4478 {
4479 exp->expType = op1->type;
4480 if(op1->type)
4481 op1->type->refCount++;
4482 }
4483 return 1;
4484 }
4485
4486 static unsigned int Int64BitAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4487 {
4488 long long value2 = op2->__anon1.i64;
4489
4490 exp->type = 2;
4491 exp->__anon1.__anon2.string = PrintInt64((op1->__anon1.i64 & value2));
4492 if(!exp->expType)
4493 {
4494 exp->expType = op1->type;
4495 if(op1->type)
4496 op1->type->refCount++;
4497 }
4498 return 1;
4499 }
4500
4501 static unsigned int UInt64BitAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4502 {
4503 uint64 value2 = op2->__anon1.ui64;
4504
4505 exp->type = 2;
4506 exp->__anon1.__anon2.string = PrintUInt64((op1->__anon1.ui64 & value2));
4507 if(!exp->expType)
4508 {
4509 exp->expType = op1->type;
4510 if(op1->type)
4511 op1->type->refCount++;
4512 }
4513 return 1;
4514 }
4515
4516 static unsigned int ShortBitAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4517 {
4518 short value2 = op2->__anon1.s;
4519
4520 exp->type = 2;
4521 exp->__anon1.__anon2.string = PrintShort((short)(op1->__anon1.s & value2));
4522 if(!exp->expType)
4523 {
4524 exp->expType = op1->type;
4525 if(op1->type)
4526 op1->type->refCount++;
4527 }
4528 return 1;
4529 }
4530
4531 static unsigned int UShortBitAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4532 {
4533 unsigned short value2 = op2->__anon1.us;
4534
4535 exp->type = 2;
4536 exp->__anon1.__anon2.string = PrintUShort((unsigned short)(op1->__anon1.us & value2));
4537 if(!exp->expType)
4538 {
4539 exp->expType = op1->type;
4540 if(op1->type)
4541 op1->type->refCount++;
4542 }
4543 return 1;
4544 }
4545
4546 static unsigned int CharBitAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4547 {
4548 char value2 = op2->__anon1.c;
4549
4550 exp->type = 2;
4551 exp->__anon1.__anon2.string = PrintChar((char)(op1->__anon1.c & value2));
4552 if(!exp->expType)
4553 {
4554 exp->expType = op1->type;
4555 if(op1->type)
4556 op1->type->refCount++;
4557 }
4558 return 1;
4559 }
4560
4561 static unsigned int UCharBitAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4562 {
4563 unsigned char value2 = op2->__anon1.uc;
4564
4565 exp->type = 2;
4566 exp->__anon1.__anon2.string = PrintUChar((unsigned char)(op1->__anon1.uc & value2));
4567 if(!exp->expType)
4568 {
4569 exp->expType = op1->type;
4570 if(op1->type)
4571 op1->type->refCount++;
4572 }
4573 return 1;
4574 }
4575
4576 static unsigned int IntBitOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4577 {
4578 int value2 = op2->__anon1.i;
4579
4580 exp->type = 2;
4581 exp->__anon1.__anon2.string = PrintInt((op1->__anon1.i | value2));
4582 if(!exp->expType)
4583 {
4584 exp->expType = op1->type;
4585 if(op1->type)
4586 op1->type->refCount++;
4587 }
4588 return 1;
4589 }
4590
4591 static unsigned int UIntBitOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4592 {
4593 unsigned int value2 = op2->__anon1.ui;
4594
4595 exp->type = 2;
4596 exp->__anon1.__anon2.string = PrintUInt((op1->__anon1.ui | value2));
4597 if(!exp->expType)
4598 {
4599 exp->expType = op1->type;
4600 if(op1->type)
4601 op1->type->refCount++;
4602 }
4603 return 1;
4604 }
4605
4606 static unsigned int Int64BitOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4607 {
4608 long long value2 = op2->__anon1.i64;
4609
4610 exp->type = 2;
4611 exp->__anon1.__anon2.string = PrintInt64((op1->__anon1.i64 | value2));
4612 if(!exp->expType)
4613 {
4614 exp->expType = op1->type;
4615 if(op1->type)
4616 op1->type->refCount++;
4617 }
4618 return 1;
4619 }
4620
4621 static unsigned int UInt64BitOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4622 {
4623 uint64 value2 = op2->__anon1.ui64;
4624
4625 exp->type = 2;
4626 exp->__anon1.__anon2.string = PrintUInt64((op1->__anon1.ui64 | value2));
4627 if(!exp->expType)
4628 {
4629 exp->expType = op1->type;
4630 if(op1->type)
4631 op1->type->refCount++;
4632 }
4633 return 1;
4634 }
4635
4636 static unsigned int ShortBitOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4637 {
4638 short value2 = op2->__anon1.s;
4639
4640 exp->type = 2;
4641 exp->__anon1.__anon2.string = PrintShort((short)(op1->__anon1.s | value2));
4642 if(!exp->expType)
4643 {
4644 exp->expType = op1->type;
4645 if(op1->type)
4646 op1->type->refCount++;
4647 }
4648 return 1;
4649 }
4650
4651 static unsigned int UShortBitOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4652 {
4653 unsigned short value2 = op2->__anon1.us;
4654
4655 exp->type = 2;
4656 exp->__anon1.__anon2.string = PrintUShort((unsigned short)(op1->__anon1.us | value2));
4657 if(!exp->expType)
4658 {
4659 exp->expType = op1->type;
4660 if(op1->type)
4661 op1->type->refCount++;
4662 }
4663 return 1;
4664 }
4665
4666 static unsigned int CharBitOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4667 {
4668 char value2 = op2->__anon1.c;
4669
4670 exp->type = 2;
4671 exp->__anon1.__anon2.string = PrintChar((char)(op1->__anon1.c | value2));
4672 if(!exp->expType)
4673 {
4674 exp->expType = op1->type;
4675 if(op1->type)
4676 op1->type->refCount++;
4677 }
4678 return 1;
4679 }
4680
4681 static unsigned int UCharBitOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4682 {
4683 unsigned char value2 = op2->__anon1.uc;
4684
4685 exp->type = 2;
4686 exp->__anon1.__anon2.string = PrintUChar((unsigned char)(op1->__anon1.uc | value2));
4687 if(!exp->expType)
4688 {
4689 exp->expType = op1->type;
4690 if(op1->type)
4691 op1->type->refCount++;
4692 }
4693 return 1;
4694 }
4695
4696 static unsigned int IntBitXor(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4697 {
4698 int value2 = op2->__anon1.i;
4699
4700 exp->type = 2;
4701 exp->__anon1.__anon2.string = PrintInt((op1->__anon1.i ^ value2));
4702 if(!exp->expType)
4703 {
4704 exp->expType = op1->type;
4705 if(op1->type)
4706 op1->type->refCount++;
4707 }
4708 return 1;
4709 }
4710
4711 static unsigned int UIntBitXor(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4712 {
4713 unsigned int value2 = op2->__anon1.ui;
4714
4715 exp->type = 2;
4716 exp->__anon1.__anon2.string = PrintUInt((op1->__anon1.ui ^ value2));
4717 if(!exp->expType)
4718 {
4719 exp->expType = op1->type;
4720 if(op1->type)
4721 op1->type->refCount++;
4722 }
4723 return 1;
4724 }
4725
4726 static unsigned int Int64BitXor(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4727 {
4728 long long value2 = op2->__anon1.i64;
4729
4730 exp->type = 2;
4731 exp->__anon1.__anon2.string = PrintInt64((op1->__anon1.i64 ^ value2));
4732 if(!exp->expType)
4733 {
4734 exp->expType = op1->type;
4735 if(op1->type)
4736 op1->type->refCount++;
4737 }
4738 return 1;
4739 }
4740
4741 static unsigned int UInt64BitXor(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4742 {
4743 uint64 value2 = op2->__anon1.ui64;
4744
4745 exp->type = 2;
4746 exp->__anon1.__anon2.string = PrintUInt64((op1->__anon1.ui64 ^ value2));
4747 if(!exp->expType)
4748 {
4749 exp->expType = op1->type;
4750 if(op1->type)
4751 op1->type->refCount++;
4752 }
4753 return 1;
4754 }
4755
4756 static unsigned int ShortBitXor(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4757 {
4758 short value2 = op2->__anon1.s;
4759
4760 exp->type = 2;
4761 exp->__anon1.__anon2.string = PrintShort((short)(op1->__anon1.s ^ value2));
4762 if(!exp->expType)
4763 {
4764 exp->expType = op1->type;
4765 if(op1->type)
4766 op1->type->refCount++;
4767 }
4768 return 1;
4769 }
4770
4771 static unsigned int UShortBitXor(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4772 {
4773 unsigned short value2 = op2->__anon1.us;
4774
4775 exp->type = 2;
4776 exp->__anon1.__anon2.string = PrintUShort((unsigned short)(op1->__anon1.us ^ value2));
4777 if(!exp->expType)
4778 {
4779 exp->expType = op1->type;
4780 if(op1->type)
4781 op1->type->refCount++;
4782 }
4783 return 1;
4784 }
4785
4786 static unsigned int CharBitXor(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4787 {
4788 char value2 = op2->__anon1.c;
4789
4790 exp->type = 2;
4791 exp->__anon1.__anon2.string = PrintChar((char)(op1->__anon1.c ^ value2));
4792 if(!exp->expType)
4793 {
4794 exp->expType = op1->type;
4795 if(op1->type)
4796 op1->type->refCount++;
4797 }
4798 return 1;
4799 }
4800
4801 static unsigned int UCharBitXor(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4802 {
4803 unsigned char value2 = op2->__anon1.uc;
4804
4805 exp->type = 2;
4806 exp->__anon1.__anon2.string = PrintUChar((unsigned char)(op1->__anon1.uc ^ value2));
4807 if(!exp->expType)
4808 {
4809 exp->expType = op1->type;
4810 if(op1->type)
4811 op1->type->refCount++;
4812 }
4813 return 1;
4814 }
4815
4816 static unsigned int IntLShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4817 {
4818 int value2 = op2->__anon1.i;
4819
4820 exp->type = 2;
4821 exp->__anon1.__anon2.string = PrintInt((op1->__anon1.i << value2));
4822 if(!exp->expType)
4823 {
4824 exp->expType = op1->type;
4825 if(op1->type)
4826 op1->type->refCount++;
4827 }
4828 return 1;
4829 }
4830
4831 static unsigned int UIntLShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4832 {
4833 unsigned int value2 = op2->__anon1.ui;
4834
4835 exp->type = 2;
4836 exp->__anon1.__anon2.string = PrintUInt((op1->__anon1.ui << value2));
4837 if(!exp->expType)
4838 {
4839 exp->expType = op1->type;
4840 if(op1->type)
4841 op1->type->refCount++;
4842 }
4843 return 1;
4844 }
4845
4846 static unsigned int Int64LShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4847 {
4848 long long value2 = op2->__anon1.i64;
4849
4850 exp->type = 2;
4851 exp->__anon1.__anon2.string = PrintInt64((op1->__anon1.i64 << value2));
4852 if(!exp->expType)
4853 {
4854 exp->expType = op1->type;
4855 if(op1->type)
4856 op1->type->refCount++;
4857 }
4858 return 1;
4859 }
4860
4861 static unsigned int UInt64LShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4862 {
4863 uint64 value2 = op2->__anon1.ui64;
4864
4865 exp->type = 2;
4866 exp->__anon1.__anon2.string = PrintUInt64((op1->__anon1.ui64 << value2));
4867 if(!exp->expType)
4868 {
4869 exp->expType = op1->type;
4870 if(op1->type)
4871 op1->type->refCount++;
4872 }
4873 return 1;
4874 }
4875
4876 static unsigned int ShortLShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4877 {
4878 short value2 = op2->__anon1.s;
4879
4880 exp->type = 2;
4881 exp->__anon1.__anon2.string = PrintShort((short)(op1->__anon1.s << value2));
4882 if(!exp->expType)
4883 {
4884 exp->expType = op1->type;
4885 if(op1->type)
4886 op1->type->refCount++;
4887 }
4888 return 1;
4889 }
4890
4891 static unsigned int UShortLShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4892 {
4893 unsigned short value2 = op2->__anon1.us;
4894
4895 exp->type = 2;
4896 exp->__anon1.__anon2.string = PrintUShort((unsigned short)(op1->__anon1.us << value2));
4897 if(!exp->expType)
4898 {
4899 exp->expType = op1->type;
4900 if(op1->type)
4901 op1->type->refCount++;
4902 }
4903 return 1;
4904 }
4905
4906 static unsigned int CharLShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4907 {
4908 char value2 = op2->__anon1.c;
4909
4910 exp->type = 2;
4911 exp->__anon1.__anon2.string = PrintChar((char)(op1->__anon1.c << value2));
4912 if(!exp->expType)
4913 {
4914 exp->expType = op1->type;
4915 if(op1->type)
4916 op1->type->refCount++;
4917 }
4918 return 1;
4919 }
4920
4921 static unsigned int UCharLShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4922 {
4923 unsigned char value2 = op2->__anon1.uc;
4924
4925 exp->type = 2;
4926 exp->__anon1.__anon2.string = PrintUChar((unsigned char)(op1->__anon1.uc << value2));
4927 if(!exp->expType)
4928 {
4929 exp->expType = op1->type;
4930 if(op1->type)
4931 op1->type->refCount++;
4932 }
4933 return 1;
4934 }
4935
4936 static unsigned int IntRShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4937 {
4938 int value2 = op2->__anon1.i;
4939
4940 exp->type = 2;
4941 exp->__anon1.__anon2.string = PrintInt((op1->__anon1.i >> value2));
4942 if(!exp->expType)
4943 {
4944 exp->expType = op1->type;
4945 if(op1->type)
4946 op1->type->refCount++;
4947 }
4948 return 1;
4949 }
4950
4951 static unsigned int UIntRShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4952 {
4953 unsigned int value2 = op2->__anon1.ui;
4954
4955 exp->type = 2;
4956 exp->__anon1.__anon2.string = PrintUInt((op1->__anon1.ui >> value2));
4957 if(!exp->expType)
4958 {
4959 exp->expType = op1->type;
4960 if(op1->type)
4961 op1->type->refCount++;
4962 }
4963 return 1;
4964 }
4965
4966 static unsigned int Int64RShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4967 {
4968 long long value2 = op2->__anon1.i64;
4969
4970 exp->type = 2;
4971 exp->__anon1.__anon2.string = PrintInt64((op1->__anon1.i64 >> value2));
4972 if(!exp->expType)
4973 {
4974 exp->expType = op1->type;
4975 if(op1->type)
4976 op1->type->refCount++;
4977 }
4978 return 1;
4979 }
4980
4981 static unsigned int UInt64RShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4982 {
4983 uint64 value2 = op2->__anon1.ui64;
4984
4985 exp->type = 2;
4986 exp->__anon1.__anon2.string = PrintUInt64((op1->__anon1.ui64 >> value2));
4987 if(!exp->expType)
4988 {
4989 exp->expType = op1->type;
4990 if(op1->type)
4991 op1->type->refCount++;
4992 }
4993 return 1;
4994 }
4995
4996 static unsigned int ShortRShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4997 {
4998 short value2 = op2->__anon1.s;
4999
5000 exp->type = 2;
5001 exp->__anon1.__anon2.string = PrintShort((short)(op1->__anon1.s >> value2));
5002 if(!exp->expType)
5003 {
5004 exp->expType = op1->type;
5005 if(op1->type)
5006 op1->type->refCount++;
5007 }
5008 return 1;
5009 }
5010
5011 static unsigned int UShortRShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5012 {
5013 unsigned short value2 = op2->__anon1.us;
5014
5015 exp->type = 2;
5016 exp->__anon1.__anon2.string = PrintUShort((unsigned short)(op1->__anon1.us >> value2));
5017 if(!exp->expType)
5018 {
5019 exp->expType = op1->type;
5020 if(op1->type)
5021 op1->type->refCount++;
5022 }
5023 return 1;
5024 }
5025
5026 static unsigned int CharRShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5027 {
5028 char value2 = op2->__anon1.c;
5029
5030 exp->type = 2;
5031 exp->__anon1.__anon2.string = PrintChar((char)(op1->__anon1.c >> value2));
5032 if(!exp->expType)
5033 {
5034 exp->expType = op1->type;
5035 if(op1->type)
5036 op1->type->refCount++;
5037 }
5038 return 1;
5039 }
5040
5041 static unsigned int UCharRShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5042 {
5043 unsigned char value2 = op2->__anon1.uc;
5044
5045 exp->type = 2;
5046 exp->__anon1.__anon2.string = PrintUChar((unsigned char)(op1->__anon1.uc >> value2));
5047 if(!exp->expType)
5048 {
5049 exp->expType = op1->type;
5050 if(op1->type)
5051 op1->type->refCount++;
5052 }
5053 return 1;
5054 }
5055
5056 static unsigned int IntBitNot(struct Expression * exp, struct Operand * op1)
5057 {
5058 exp->type = 2;
5059 exp->__anon1.__anon2.string = PrintInt((~op1->__anon1.i));
5060 if(!exp->expType)
5061 {
5062 exp->expType = op1->type;
5063 if(op1->type)
5064 op1->type->refCount++;
5065 }
5066 return 1;
5067 }
5068
5069 static unsigned int UIntBitNot(struct Expression * exp, struct Operand * op1)
5070 {
5071 exp->type = 2;
5072 exp->__anon1.__anon2.string = PrintUInt((unsigned int)(~op1->__anon1.ui));
5073 if(!exp->expType)
5074 {
5075 exp->expType = op1->type;
5076 if(op1->type)
5077 op1->type->refCount++;
5078 }
5079 return 1;
5080 }
5081
5082 static unsigned int Int64BitNot(struct Expression * exp, struct Operand * op1)
5083 {
5084 exp->type = 2;
5085 exp->__anon1.__anon2.string = PrintInt64((long long)(~op1->__anon1.i64));
5086 if(!exp->expType)
5087 {
5088 exp->expType = op1->type;
5089 if(op1->type)
5090 op1->type->refCount++;
5091 }
5092 return 1;
5093 }
5094
5095 static unsigned int UInt64BitNot(struct Expression * exp, struct Operand * op1)
5096 {
5097 exp->type = 2;
5098 exp->__anon1.__anon2.string = PrintUInt64((uint64)(~op1->__anon1.ui64));
5099 if(!exp->expType)
5100 {
5101 exp->expType = op1->type;
5102 if(op1->type)
5103 op1->type->refCount++;
5104 }
5105 return 1;
5106 }
5107
5108 static unsigned int ShortBitNot(struct Expression * exp, struct Operand * op1)
5109 {
5110 exp->type = 2;
5111 exp->__anon1.__anon2.string = PrintShort((short)(~op1->__anon1.s));
5112 if(!exp->expType)
5113 {
5114 exp->expType = op1->type;
5115 if(op1->type)
5116 op1->type->refCount++;
5117 }
5118 return 1;
5119 }
5120
5121 static unsigned int UShortBitNot(struct Expression * exp, struct Operand * op1)
5122 {
5123 exp->type = 2;
5124 exp->__anon1.__anon2.string = PrintUShort((unsigned short)(~op1->__anon1.us));
5125 if(!exp->expType)
5126 {
5127 exp->expType = op1->type;
5128 if(op1->type)
5129 op1->type->refCount++;
5130 }
5131 return 1;
5132 }
5133
5134 static unsigned int CharBitNot(struct Expression * exp, struct Operand * op1)
5135 {
5136 exp->type = 2;
5137 exp->__anon1.__anon2.string = PrintChar((char)(~op1->__anon1.c));
5138 if(!exp->expType)
5139 {
5140 exp->expType = op1->type;
5141 if(op1->type)
5142 op1->type->refCount++;
5143 }
5144 return 1;
5145 }
5146
5147 static unsigned int UCharBitNot(struct Expression * exp, struct Operand * op1)
5148 {
5149 exp->type = 2;
5150 exp->__anon1.__anon2.string = PrintUChar((unsigned char)(~op1->__anon1.uc));
5151 if(!exp->expType)
5152 {
5153 exp->expType = op1->type;
5154 if(op1->type)
5155 op1->type->refCount++;
5156 }
5157 return 1;
5158 }
5159
5160 static unsigned int IntAndAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5161 {
5162 int value2 = op2->__anon1.i;
5163
5164 exp->type = 2;
5165 exp->__anon1.__anon2.string = PrintInt((op1->__anon1.i &= value2));
5166 if(!exp->expType)
5167 {
5168 exp->expType = op1->type;
5169 if(op1->type)
5170 op1->type->refCount++;
5171 }
5172 return 1;
5173 }
5174
5175 static unsigned int UIntAndAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5176 {
5177 unsigned int value2 = op2->__anon1.ui;
5178
5179 exp->type = 2;
5180 exp->__anon1.__anon2.string = PrintUInt((op1->__anon1.ui &= value2));
5181 if(!exp->expType)
5182 {
5183 exp->expType = op1->type;
5184 if(op1->type)
5185 op1->type->refCount++;
5186 }
5187 return 1;
5188 }
5189
5190 static unsigned int Int64AndAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5191 {
5192 long long value2 = op2->__anon1.i64;
5193
5194 exp->type = 2;
5195 exp->__anon1.__anon2.string = PrintInt64((op1->__anon1.i64 &= value2));
5196 if(!exp->expType)
5197 {
5198 exp->expType = op1->type;
5199 if(op1->type)
5200 op1->type->refCount++;
5201 }
5202 return 1;
5203 }
5204
5205 static unsigned int UInt64AndAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5206 {
5207 uint64 value2 = op2->__anon1.ui64;
5208
5209 exp->type = 2;
5210 exp->__anon1.__anon2.string = PrintUInt64((op1->__anon1.ui64 &= value2));
5211 if(!exp->expType)
5212 {
5213 exp->expType = op1->type;
5214 if(op1->type)
5215 op1->type->refCount++;
5216 }
5217 return 1;
5218 }
5219
5220 static unsigned int ShortAndAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5221 {
5222 short value2 = op2->__anon1.s;
5223
5224 exp->type = 2;
5225 exp->__anon1.__anon2.string = PrintShort((op1->__anon1.s &= value2));
5226 if(!exp->expType)
5227 {
5228 exp->expType = op1->type;
5229 if(op1->type)
5230 op1->type->refCount++;
5231 }
5232 return 1;
5233 }
5234
5235 static unsigned int UShortAndAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5236 {
5237 unsigned short value2 = op2->__anon1.us;
5238
5239 exp->type = 2;
5240 exp->__anon1.__anon2.string = PrintUShort((op1->__anon1.us &= value2));
5241 if(!exp->expType)
5242 {
5243 exp->expType = op1->type;
5244 if(op1->type)
5245 op1->type->refCount++;
5246 }
5247 return 1;
5248 }
5249
5250 static unsigned int CharAndAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5251 {
5252 char value2 = op2->__anon1.c;
5253
5254 exp->type = 2;
5255 exp->__anon1.__anon2.string = PrintChar((op1->__anon1.c &= value2));
5256 if(!exp->expType)
5257 {
5258 exp->expType = op1->type;
5259 if(op1->type)
5260 op1->type->refCount++;
5261 }
5262 return 1;
5263 }
5264
5265 static unsigned int UCharAndAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5266 {
5267 unsigned char value2 = op2->__anon1.uc;
5268
5269 exp->type = 2;
5270 exp->__anon1.__anon2.string = PrintUChar((op1->__anon1.uc &= value2));
5271 if(!exp->expType)
5272 {
5273 exp->expType = op1->type;
5274 if(op1->type)
5275 op1->type->refCount++;
5276 }
5277 return 1;
5278 }
5279
5280 static unsigned int IntOrAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5281 {
5282 int value2 = op2->__anon1.i;
5283
5284 exp->type = 2;
5285 exp->__anon1.__anon2.string = PrintInt((op1->__anon1.i |= value2));
5286 if(!exp->expType)
5287 {
5288 exp->expType = op1->type;
5289 if(op1->type)
5290 op1->type->refCount++;
5291 }
5292 return 1;
5293 }
5294
5295 static unsigned int UIntOrAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5296 {
5297 unsigned int value2 = op2->__anon1.ui;
5298
5299 exp->type = 2;
5300 exp->__anon1.__anon2.string = PrintUInt((op1->__anon1.ui |= value2));
5301 if(!exp->expType)
5302 {
5303 exp->expType = op1->type;
5304 if(op1->type)
5305 op1->type->refCount++;
5306 }
5307 return 1;
5308 }
5309
5310 static unsigned int Int64OrAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5311 {
5312 long long value2 = op2->__anon1.i64;
5313
5314 exp->type = 2;
5315 exp->__anon1.__anon2.string = PrintInt64((op1->__anon1.i64 |= value2));
5316 if(!exp->expType)
5317 {
5318 exp->expType = op1->type;
5319 if(op1->type)
5320 op1->type->refCount++;
5321 }
5322 return 1;
5323 }
5324
5325 static unsigned int UInt64OrAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5326 {
5327 uint64 value2 = op2->__anon1.ui64;
5328
5329 exp->type = 2;
5330 exp->__anon1.__anon2.string = PrintUInt64((op1->__anon1.ui64 |= value2));
5331 if(!exp->expType)
5332 {
5333 exp->expType = op1->type;
5334 if(op1->type)
5335 op1->type->refCount++;
5336 }
5337 return 1;
5338 }
5339
5340 static unsigned int ShortOrAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5341 {
5342 short value2 = op2->__anon1.s;
5343
5344 exp->type = 2;
5345 exp->__anon1.__anon2.string = PrintShort((op1->__anon1.s |= value2));
5346 if(!exp->expType)
5347 {
5348 exp->expType = op1->type;
5349 if(op1->type)
5350 op1->type->refCount++;
5351 }
5352 return 1;
5353 }
5354
5355 static unsigned int UShortOrAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5356 {
5357 unsigned short value2 = op2->__anon1.us;
5358
5359 exp->type = 2;
5360 exp->__anon1.__anon2.string = PrintUShort((op1->__anon1.us |= value2));
5361 if(!exp->expType)
5362 {
5363 exp->expType = op1->type;
5364 if(op1->type)
5365 op1->type->refCount++;
5366 }
5367 return 1;
5368 }
5369
5370 static unsigned int CharOrAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5371 {
5372 char value2 = op2->__anon1.c;
5373
5374 exp->type = 2;
5375 exp->__anon1.__anon2.string = PrintChar((op1->__anon1.c |= value2));
5376 if(!exp->expType)
5377 {
5378 exp->expType = op1->type;
5379 if(op1->type)
5380 op1->type->refCount++;
5381 }
5382 return 1;
5383 }
5384
5385 static unsigned int UCharOrAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5386 {
5387 unsigned char value2 = op2->__anon1.uc;
5388
5389 exp->type = 2;
5390 exp->__anon1.__anon2.string = PrintUChar((op1->__anon1.uc |= value2));
5391 if(!exp->expType)
5392 {
5393 exp->expType = op1->type;
5394 if(op1->type)
5395 op1->type->refCount++;
5396 }
5397 return 1;
5398 }
5399
5400 static unsigned int IntXorAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5401 {
5402 int value2 = op2->__anon1.i;
5403
5404 exp->type = 2;
5405 exp->__anon1.__anon2.string = PrintInt((op1->__anon1.i ^= value2));
5406 if(!exp->expType)
5407 {
5408 exp->expType = op1->type;
5409 if(op1->type)
5410 op1->type->refCount++;
5411 }
5412 return 1;
5413 }
5414
5415 static unsigned int UIntXorAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5416 {
5417 unsigned int value2 = op2->__anon1.ui;
5418
5419 exp->type = 2;
5420 exp->__anon1.__anon2.string = PrintUInt((op1->__anon1.ui ^= value2));
5421 if(!exp->expType)
5422 {
5423 exp->expType = op1->type;
5424 if(op1->type)
5425 op1->type->refCount++;
5426 }
5427 return 1;
5428 }
5429
5430 static unsigned int Int64XorAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5431 {
5432 long long value2 = op2->__anon1.i64;
5433
5434 exp->type = 2;
5435 exp->__anon1.__anon2.string = PrintInt64((op1->__anon1.i64 ^= value2));
5436 if(!exp->expType)
5437 {
5438 exp->expType = op1->type;
5439 if(op1->type)
5440 op1->type->refCount++;
5441 }
5442 return 1;
5443 }
5444
5445 static unsigned int UInt64XorAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5446 {
5447 uint64 value2 = op2->__anon1.ui64;
5448
5449 exp->type = 2;
5450 exp->__anon1.__anon2.string = PrintUInt64((op1->__anon1.ui64 ^= value2));
5451 if(!exp->expType)
5452 {
5453 exp->expType = op1->type;
5454 if(op1->type)
5455 op1->type->refCount++;
5456 }
5457 return 1;
5458 }
5459
5460 static unsigned int ShortXorAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5461 {
5462 short value2 = op2->__anon1.s;
5463
5464 exp->type = 2;
5465 exp->__anon1.__anon2.string = PrintShort((op1->__anon1.s ^= value2));
5466 if(!exp->expType)
5467 {
5468 exp->expType = op1->type;
5469 if(op1->type)
5470 op1->type->refCount++;
5471 }
5472 return 1;
5473 }
5474
5475 static unsigned int UShortXorAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5476 {
5477 unsigned short value2 = op2->__anon1.us;
5478
5479 exp->type = 2;
5480 exp->__anon1.__anon2.string = PrintUShort((op1->__anon1.us ^= value2));
5481 if(!exp->expType)
5482 {
5483 exp->expType = op1->type;
5484 if(op1->type)
5485 op1->type->refCount++;
5486 }
5487 return 1;
5488 }
5489
5490 static unsigned int CharXorAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5491 {
5492 char value2 = op2->__anon1.c;
5493
5494 exp->type = 2;
5495 exp->__anon1.__anon2.string = PrintChar((op1->__anon1.c ^= value2));
5496 if(!exp->expType)
5497 {
5498 exp->expType = op1->type;
5499 if(op1->type)
5500 op1->type->refCount++;
5501 }
5502 return 1;
5503 }
5504
5505 static unsigned int UCharXorAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5506 {
5507 unsigned char value2 = op2->__anon1.uc;
5508
5509 exp->type = 2;
5510 exp->__anon1.__anon2.string = PrintUChar((op1->__anon1.uc ^= value2));
5511 if(!exp->expType)
5512 {
5513 exp->expType = op1->type;
5514 if(op1->type)
5515 op1->type->refCount++;
5516 }
5517 return 1;
5518 }
5519
5520 static unsigned int IntLShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5521 {
5522 int value2 = op2->__anon1.i;
5523
5524 exp->type = 2;
5525 exp->__anon1.__anon2.string = PrintInt((op1->__anon1.i <<= value2));
5526 if(!exp->expType)
5527 {
5528 exp->expType = op1->type;
5529 if(op1->type)
5530 op1->type->refCount++;
5531 }
5532 return 1;
5533 }
5534
5535 static unsigned int UIntLShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5536 {
5537 unsigned int value2 = op2->__anon1.ui;
5538
5539 exp->type = 2;
5540 exp->__anon1.__anon2.string = PrintUInt((op1->__anon1.ui <<= value2));
5541 if(!exp->expType)
5542 {
5543 exp->expType = op1->type;
5544 if(op1->type)
5545 op1->type->refCount++;
5546 }
5547 return 1;
5548 }
5549
5550 static unsigned int Int64LShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5551 {
5552 long long value2 = op2->__anon1.i64;
5553
5554 exp->type = 2;
5555 exp->__anon1.__anon2.string = PrintInt64((op1->__anon1.i64 <<= value2));
5556 if(!exp->expType)
5557 {
5558 exp->expType = op1->type;
5559 if(op1->type)
5560 op1->type->refCount++;
5561 }
5562 return 1;
5563 }
5564
5565 static unsigned int UInt64LShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5566 {
5567 uint64 value2 = op2->__anon1.ui64;
5568
5569 exp->type = 2;
5570 exp->__anon1.__anon2.string = PrintUInt64((op1->__anon1.ui64 <<= value2));
5571 if(!exp->expType)
5572 {
5573 exp->expType = op1->type;
5574 if(op1->type)
5575 op1->type->refCount++;
5576 }
5577 return 1;
5578 }
5579
5580 static unsigned int ShortLShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5581 {
5582 short value2 = op2->__anon1.s;
5583
5584 exp->type = 2;
5585 exp->__anon1.__anon2.string = PrintShort((op1->__anon1.s <<= value2));
5586 if(!exp->expType)
5587 {
5588 exp->expType = op1->type;
5589 if(op1->type)
5590 op1->type->refCount++;
5591 }
5592 return 1;
5593 }
5594
5595 static unsigned int UShortLShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5596 {
5597 unsigned short value2 = op2->__anon1.us;
5598
5599 exp->type = 2;
5600 exp->__anon1.__anon2.string = PrintUShort((op1->__anon1.us <<= value2));
5601 if(!exp->expType)
5602 {
5603 exp->expType = op1->type;
5604 if(op1->type)
5605 op1->type->refCount++;
5606 }
5607 return 1;
5608 }
5609
5610 static unsigned int CharLShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5611 {
5612 char value2 = op2->__anon1.c;
5613
5614 exp->type = 2;
5615 exp->__anon1.__anon2.string = PrintChar((op1->__anon1.c <<= value2));
5616 if(!exp->expType)
5617 {
5618 exp->expType = op1->type;
5619 if(op1->type)
5620 op1->type->refCount++;
5621 }
5622 return 1;
5623 }
5624
5625 static unsigned int UCharLShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5626 {
5627 unsigned char value2 = op2->__anon1.uc;
5628
5629 exp->type = 2;
5630 exp->__anon1.__anon2.string = PrintUChar((op1->__anon1.uc <<= value2));
5631 if(!exp->expType)
5632 {
5633 exp->expType = op1->type;
5634 if(op1->type)
5635 op1->type->refCount++;
5636 }
5637 return 1;
5638 }
5639
5640 static unsigned int IntRShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5641 {
5642 int value2 = op2->__anon1.i;
5643
5644 exp->type = 2;
5645 exp->__anon1.__anon2.string = PrintInt((op1->__anon1.i >>= value2));
5646 if(!exp->expType)
5647 {
5648 exp->expType = op1->type;
5649 if(op1->type)
5650 op1->type->refCount++;
5651 }
5652 return 1;
5653 }
5654
5655 static unsigned int UIntRShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5656 {
5657 unsigned int value2 = op2->__anon1.ui;
5658
5659 exp->type = 2;
5660 exp->__anon1.__anon2.string = PrintUInt((op1->__anon1.ui >>= value2));
5661 if(!exp->expType)
5662 {
5663 exp->expType = op1->type;
5664 if(op1->type)
5665 op1->type->refCount++;
5666 }
5667 return 1;
5668 }
5669
5670 static unsigned int Int64RShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5671 {
5672 long long value2 = op2->__anon1.i64;
5673
5674 exp->type = 2;
5675 exp->__anon1.__anon2.string = PrintInt64((op1->__anon1.i64 >>= value2));
5676 if(!exp->expType)
5677 {
5678 exp->expType = op1->type;
5679 if(op1->type)
5680 op1->type->refCount++;
5681 }
5682 return 1;
5683 }
5684
5685 static unsigned int UInt64RShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5686 {
5687 uint64 value2 = op2->__anon1.ui64;
5688
5689 exp->type = 2;
5690 exp->__anon1.__anon2.string = PrintUInt64((op1->__anon1.ui64 >>= value2));
5691 if(!exp->expType)
5692 {
5693 exp->expType = op1->type;
5694 if(op1->type)
5695 op1->type->refCount++;
5696 }
5697 return 1;
5698 }
5699
5700 static unsigned int ShortRShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5701 {
5702 short value2 = op2->__anon1.s;
5703
5704 exp->type = 2;
5705 exp->__anon1.__anon2.string = PrintShort((op1->__anon1.s >>= value2));
5706 if(!exp->expType)
5707 {
5708 exp->expType = op1->type;
5709 if(op1->type)
5710 op1->type->refCount++;
5711 }
5712 return 1;
5713 }
5714
5715 static unsigned int UShortRShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5716 {
5717 unsigned short value2 = op2->__anon1.us;
5718
5719 exp->type = 2;
5720 exp->__anon1.__anon2.string = PrintUShort((op1->__anon1.us >>= value2));
5721 if(!exp->expType)
5722 {
5723 exp->expType = op1->type;
5724 if(op1->type)
5725 op1->type->refCount++;
5726 }
5727 return 1;
5728 }
5729
5730 static unsigned int CharRShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5731 {
5732 char value2 = op2->__anon1.c;
5733
5734 exp->type = 2;
5735 exp->__anon1.__anon2.string = PrintChar((op1->__anon1.c >>= value2));
5736 if(!exp->expType)
5737 {
5738 exp->expType = op1->type;
5739 if(op1->type)
5740 op1->type->refCount++;
5741 }
5742 return 1;
5743 }
5744
5745 static unsigned int UCharRShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5746 {
5747 unsigned char value2 = op2->__anon1.uc;
5748
5749 exp->type = 2;
5750 exp->__anon1.__anon2.string = PrintUChar((op1->__anon1.uc >>= value2));
5751 if(!exp->expType)
5752 {
5753 exp->expType = op1->type;
5754 if(op1->type)
5755 op1->type->refCount++;
5756 }
5757 return 1;
5758 }
5759
5760 static unsigned int IntNot(struct Expression * exp, struct Operand * op1)
5761 {
5762 exp->type = 2;
5763 exp->__anon1.__anon2.string = PrintInt((int)(!op1->__anon1.i));
5764 if(!exp->expType)
5765 {
5766 exp->expType = op1->type;
5767 if(op1->type)
5768 op1->type->refCount++;
5769 }
5770 return 1;
5771 }
5772
5773 static unsigned int UIntNot(struct Expression * exp, struct Operand * op1)
5774 {
5775 exp->type = 2;
5776 exp->__anon1.__anon2.string = PrintUInt((unsigned int)(!op1->__anon1.ui));
5777 if(!exp->expType)
5778 {
5779 exp->expType = op1->type;
5780 if(op1->type)
5781 op1->type->refCount++;
5782 }
5783 return 1;
5784 }
5785
5786 static unsigned int Int64Not(struct Expression * exp, struct Operand * op1)
5787 {
5788 exp->type = 2;
5789 exp->__anon1.__anon2.string = PrintInt64((long long)(!op1->__anon1.i64));
5790 if(!exp->expType)
5791 {
5792 exp->expType = op1->type;
5793 if(op1->type)
5794 op1->type->refCount++;
5795 }
5796 return 1;
5797 }
5798
5799 static unsigned int UInt64Not(struct Expression * exp, struct Operand * op1)
5800 {
5801 exp->type = 2;
5802 exp->__anon1.__anon2.string = PrintUInt64((uint64)(!op1->__anon1.ui64));
5803 if(!exp->expType)
5804 {
5805 exp->expType = op1->type;
5806 if(op1->type)
5807 op1->type->refCount++;
5808 }
5809 return 1;
5810 }
5811
5812 static unsigned int ShortNot(struct Expression * exp, struct Operand * op1)
5813 {
5814 exp->type = 2;
5815 exp->__anon1.__anon2.string = PrintShort((short)(!op1->__anon1.s));
5816 if(!exp->expType)
5817 {
5818 exp->expType = op1->type;
5819 if(op1->type)
5820 op1->type->refCount++;
5821 }
5822 return 1;
5823 }
5824
5825 static unsigned int UShortNot(struct Expression * exp, struct Operand * op1)
5826 {
5827 exp->type = 2;
5828 exp->__anon1.__anon2.string = PrintUShort((unsigned short)(!op1->__anon1.us));
5829 if(!exp->expType)
5830 {
5831 exp->expType = op1->type;
5832 if(op1->type)
5833 op1->type->refCount++;
5834 }
5835 return 1;
5836 }
5837
5838 static unsigned int CharNot(struct Expression * exp, struct Operand * op1)
5839 {
5840 exp->type = 2;
5841 exp->__anon1.__anon2.string = PrintChar((char)(!op1->__anon1.c));
5842 if(!exp->expType)
5843 {
5844 exp->expType = op1->type;
5845 if(op1->type)
5846 op1->type->refCount++;
5847 }
5848 return 1;
5849 }
5850
5851 static unsigned int UCharNot(struct Expression * exp, struct Operand * op1)
5852 {
5853 exp->type = 2;
5854 exp->__anon1.__anon2.string = PrintUChar((unsigned char)(!op1->__anon1.uc));
5855 if(!exp->expType)
5856 {
5857 exp->expType = op1->type;
5858 if(op1->type)
5859 op1->type->refCount++;
5860 }
5861 return 1;
5862 }
5863
5864 static unsigned int IntEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5865 {
5866 int value2 = op2->__anon1.i;
5867
5868 exp->type = 2;
5869 exp->__anon1.__anon2.string = PrintInt((int)(op1->__anon1.i == value2));
5870 if(!exp->expType)
5871 {
5872 exp->expType = op1->type;
5873 if(op1->type)
5874 op1->type->refCount++;
5875 }
5876 return 1;
5877 }
5878
5879 static unsigned int UIntEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5880 {
5881 unsigned int value2 = op2->__anon1.ui;
5882
5883 exp->type = 2;
5884 exp->__anon1.__anon2.string = PrintUInt((unsigned int)(op1->__anon1.ui == value2));
5885 if(!exp->expType)
5886 {
5887 exp->expType = op1->type;
5888 if(op1->type)
5889 op1->type->refCount++;
5890 }
5891 return 1;
5892 }
5893
5894 static unsigned int Int64Equ(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5895 {
5896 long long value2 = op2->__anon1.i64;
5897
5898 exp->type = 2;
5899 exp->__anon1.__anon2.string = PrintInt64((long long)(op1->__anon1.i64 == value2));
5900 if(!exp->expType)
5901 {
5902 exp->expType = op1->type;
5903 if(op1->type)
5904 op1->type->refCount++;
5905 }
5906 return 1;
5907 }
5908
5909 static unsigned int UInt64Equ(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5910 {
5911 uint64 value2 = op2->__anon1.ui64;
5912
5913 exp->type = 2;
5914 exp->__anon1.__anon2.string = PrintUInt64((uint64)(op1->__anon1.ui64 == value2));
5915 if(!exp->expType)
5916 {
5917 exp->expType = op1->type;
5918 if(op1->type)
5919 op1->type->refCount++;
5920 }
5921 return 1;
5922 }
5923
5924 static unsigned int ShortEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5925 {
5926 short value2 = op2->__anon1.s;
5927
5928 exp->type = 2;
5929 exp->__anon1.__anon2.string = PrintShort((short)(op1->__anon1.s == value2));
5930 if(!exp->expType)
5931 {
5932 exp->expType = op1->type;
5933 if(op1->type)
5934 op1->type->refCount++;
5935 }
5936 return 1;
5937 }
5938
5939 static unsigned int UShortEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5940 {
5941 unsigned short value2 = op2->__anon1.us;
5942
5943 exp->type = 2;
5944 exp->__anon1.__anon2.string = PrintUShort((unsigned short)(op1->__anon1.us == value2));
5945 if(!exp->expType)
5946 {
5947 exp->expType = op1->type;
5948 if(op1->type)
5949 op1->type->refCount++;
5950 }
5951 return 1;
5952 }
5953
5954 static unsigned int CharEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5955 {
5956 char value2 = op2->__anon1.c;
5957
5958 exp->type = 2;
5959 exp->__anon1.__anon2.string = PrintChar((char)(op1->__anon1.c == value2));
5960 if(!exp->expType)
5961 {
5962 exp->expType = op1->type;
5963 if(op1->type)
5964 op1->type->refCount++;
5965 }
5966 return 1;
5967 }
5968
5969 static unsigned int UCharEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5970 {
5971 unsigned char value2 = op2->__anon1.uc;
5972
5973 exp->type = 2;
5974 exp->__anon1.__anon2.string = PrintUChar((unsigned char)(op1->__anon1.uc == value2));
5975 if(!exp->expType)
5976 {
5977 exp->expType = op1->type;
5978 if(op1->type)
5979 op1->type->refCount++;
5980 }
5981 return 1;
5982 }
5983
5984 static unsigned int FloatEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5985 {
5986 float value2 = op2->__anon1.f;
5987
5988 exp->type = 2;
5989 exp->__anon1.__anon2.string = PrintFloat((float)(op1->__anon1.f == value2));
5990 if(!exp->expType)
5991 {
5992 exp->expType = op1->type;
5993 if(op1->type)
5994 op1->type->refCount++;
5995 }
5996 return 1;
5997 }
5998
5999 static unsigned int DoubleEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6000 {
6001 double value2 = op2->__anon1.d;
6002
6003 exp->type = 2;
6004 exp->__anon1.__anon2.string = PrintDouble((double)(op1->__anon1.d == value2));
6005 if(!exp->expType)
6006 {
6007 exp->expType = op1->type;
6008 if(op1->type)
6009 op1->type->refCount++;
6010 }
6011 return 1;
6012 }
6013
6014 static unsigned int IntNqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6015 {
6016 int value2 = op2->__anon1.i;
6017
6018 exp->type = 2;
6019 exp->__anon1.__anon2.string = PrintInt((int)(op1->__anon1.i != value2));
6020 if(!exp->expType)
6021 {
6022 exp->expType = op1->type;
6023 if(op1->type)
6024 op1->type->refCount++;
6025 }
6026 return 1;
6027 }
6028
6029 static unsigned int UIntNqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6030 {
6031 unsigned int value2 = op2->__anon1.ui;
6032
6033 exp->type = 2;
6034 exp->__anon1.__anon2.string = PrintUInt((unsigned int)(op1->__anon1.ui != value2));
6035 if(!exp->expType)
6036 {
6037 exp->expType = op1->type;
6038 if(op1->type)
6039 op1->type->refCount++;
6040 }
6041 return 1;
6042 }
6043
6044 static unsigned int Int64Nqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6045 {
6046 long long value2 = op2->__anon1.i64;
6047
6048 exp->type = 2;
6049 exp->__anon1.__anon2.string = PrintInt64((long long)(op1->__anon1.i64 != value2));
6050 if(!exp->expType)
6051 {
6052 exp->expType = op1->type;
6053 if(op1->type)
6054 op1->type->refCount++;
6055 }
6056 return 1;
6057 }
6058
6059 static unsigned int UInt64Nqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6060 {
6061 uint64 value2 = op2->__anon1.ui64;
6062
6063 exp->type = 2;
6064 exp->__anon1.__anon2.string = PrintUInt64((uint64)(op1->__anon1.ui64 != value2));
6065 if(!exp->expType)
6066 {
6067 exp->expType = op1->type;
6068 if(op1->type)
6069 op1->type->refCount++;
6070 }
6071 return 1;
6072 }
6073
6074 static unsigned int ShortNqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6075 {
6076 short value2 = op2->__anon1.s;
6077
6078 exp->type = 2;
6079 exp->__anon1.__anon2.string = PrintShort((short)(op1->__anon1.s != value2));
6080 if(!exp->expType)
6081 {
6082 exp->expType = op1->type;
6083 if(op1->type)
6084 op1->type->refCount++;
6085 }
6086 return 1;
6087 }
6088
6089 static unsigned int UShortNqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6090 {
6091 unsigned short value2 = op2->__anon1.us;
6092
6093 exp->type = 2;
6094 exp->__anon1.__anon2.string = PrintUShort((unsigned short)(op1->__anon1.us != value2));
6095 if(!exp->expType)
6096 {
6097 exp->expType = op1->type;
6098 if(op1->type)
6099 op1->type->refCount++;
6100 }
6101 return 1;
6102 }
6103
6104 static unsigned int CharNqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6105 {
6106 char value2 = op2->__anon1.c;
6107
6108 exp->type = 2;
6109 exp->__anon1.__anon2.string = PrintChar((char)(op1->__anon1.c != value2));
6110 if(!exp->expType)
6111 {
6112 exp->expType = op1->type;
6113 if(op1->type)
6114 op1->type->refCount++;
6115 }
6116 return 1;
6117 }
6118
6119 static unsigned int UCharNqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6120 {
6121 unsigned char value2 = op2->__anon1.uc;
6122
6123 exp->type = 2;
6124 exp->__anon1.__anon2.string = PrintUChar((unsigned char)(op1->__anon1.uc != value2));
6125 if(!exp->expType)
6126 {
6127 exp->expType = op1->type;
6128 if(op1->type)
6129 op1->type->refCount++;
6130 }
6131 return 1;
6132 }
6133
6134 static unsigned int FloatNqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6135 {
6136 float value2 = op2->__anon1.f;
6137
6138 exp->type = 2;
6139 exp->__anon1.__anon2.string = PrintFloat((float)(op1->__anon1.f != value2));
6140 if(!exp->expType)
6141 {
6142 exp->expType = op1->type;
6143 if(op1->type)
6144 op1->type->refCount++;
6145 }
6146 return 1;
6147 }
6148
6149 static unsigned int DoubleNqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6150 {
6151 double value2 = op2->__anon1.d;
6152
6153 exp->type = 2;
6154 exp->__anon1.__anon2.string = PrintDouble((double)(op1->__anon1.d != value2));
6155 if(!exp->expType)
6156 {
6157 exp->expType = op1->type;
6158 if(op1->type)
6159 op1->type->refCount++;
6160 }
6161 return 1;
6162 }
6163
6164 static unsigned int IntAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6165 {
6166 int value2 = op2->__anon1.i;
6167
6168 exp->type = 2;
6169 exp->__anon1.__anon2.string = PrintInt((int)(op1->__anon1.i && value2));
6170 if(!exp->expType)
6171 {
6172 exp->expType = op1->type;
6173 if(op1->type)
6174 op1->type->refCount++;
6175 }
6176 return 1;
6177 }
6178
6179 static unsigned int UIntAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6180 {
6181 unsigned int value2 = op2->__anon1.ui;
6182
6183 exp->type = 2;
6184 exp->__anon1.__anon2.string = PrintUInt((unsigned int)(op1->__anon1.ui && value2));
6185 if(!exp->expType)
6186 {
6187 exp->expType = op1->type;
6188 if(op1->type)
6189 op1->type->refCount++;
6190 }
6191 return 1;
6192 }
6193
6194 static unsigned int Int64And(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6195 {
6196 long long value2 = op2->__anon1.i64;
6197
6198 exp->type = 2;
6199 exp->__anon1.__anon2.string = PrintInt64((long long)(op1->__anon1.i64 && value2));
6200 if(!exp->expType)
6201 {
6202 exp->expType = op1->type;
6203 if(op1->type)
6204 op1->type->refCount++;
6205 }
6206 return 1;
6207 }
6208
6209 static unsigned int UInt64And(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6210 {
6211 uint64 value2 = op2->__anon1.ui64;
6212
6213 exp->type = 2;
6214 exp->__anon1.__anon2.string = PrintUInt64((uint64)(op1->__anon1.ui64 && value2));
6215 if(!exp->expType)
6216 {
6217 exp->expType = op1->type;
6218 if(op1->type)
6219 op1->type->refCount++;
6220 }
6221 return 1;
6222 }
6223
6224 static unsigned int ShortAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6225 {
6226 short value2 = op2->__anon1.s;
6227
6228 exp->type = 2;
6229 exp->__anon1.__anon2.string = PrintShort((short)(op1->__anon1.s && value2));
6230 if(!exp->expType)
6231 {
6232 exp->expType = op1->type;
6233 if(op1->type)
6234 op1->type->refCount++;
6235 }
6236 return 1;
6237 }
6238
6239 static unsigned int UShortAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6240 {
6241 unsigned short value2 = op2->__anon1.us;
6242
6243 exp->type = 2;
6244 exp->__anon1.__anon2.string = PrintUShort((unsigned short)(op1->__anon1.us && value2));
6245 if(!exp->expType)
6246 {
6247 exp->expType = op1->type;
6248 if(op1->type)
6249 op1->type->refCount++;
6250 }
6251 return 1;
6252 }
6253
6254 static unsigned int CharAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6255 {
6256 char value2 = op2->__anon1.c;
6257
6258 exp->type = 2;
6259 exp->__anon1.__anon2.string = PrintChar((char)(op1->__anon1.c && value2));
6260 if(!exp->expType)
6261 {
6262 exp->expType = op1->type;
6263 if(op1->type)
6264 op1->type->refCount++;
6265 }
6266 return 1;
6267 }
6268
6269 static unsigned int UCharAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6270 {
6271 unsigned char value2 = op2->__anon1.uc;
6272
6273 exp->type = 2;
6274 exp->__anon1.__anon2.string = PrintUChar((unsigned char)(op1->__anon1.uc && value2));
6275 if(!exp->expType)
6276 {
6277 exp->expType = op1->type;
6278 if(op1->type)
6279 op1->type->refCount++;
6280 }
6281 return 1;
6282 }
6283
6284 static unsigned int FloatAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6285 {
6286 float value2 = op2->__anon1.f;
6287
6288 exp->type = 2;
6289 exp->__anon1.__anon2.string = PrintFloat((float)(op1->__anon1.f && value2));
6290 if(!exp->expType)
6291 {
6292 exp->expType = op1->type;
6293 if(op1->type)
6294 op1->type->refCount++;
6295 }
6296 return 1;
6297 }
6298
6299 static unsigned int DoubleAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6300 {
6301 double value2 = op2->__anon1.d;
6302
6303 exp->type = 2;
6304 exp->__anon1.__anon2.string = PrintDouble((double)(op1->__anon1.d && value2));
6305 if(!exp->expType)
6306 {
6307 exp->expType = op1->type;
6308 if(op1->type)
6309 op1->type->refCount++;
6310 }
6311 return 1;
6312 }
6313
6314 static unsigned int IntOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6315 {
6316 int value2 = op2->__anon1.i;
6317
6318 exp->type = 2;
6319 exp->__anon1.__anon2.string = PrintInt((int)(op1->__anon1.i || value2));
6320 if(!exp->expType)
6321 {
6322 exp->expType = op1->type;
6323 if(op1->type)
6324 op1->type->refCount++;
6325 }
6326 return 1;
6327 }
6328
6329 static unsigned int UIntOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6330 {
6331 unsigned int value2 = op2->__anon1.ui;
6332
6333 exp->type = 2;
6334 exp->__anon1.__anon2.string = PrintUInt((unsigned int)(op1->__anon1.ui || value2));
6335 if(!exp->expType)
6336 {
6337 exp->expType = op1->type;
6338 if(op1->type)
6339 op1->type->refCount++;
6340 }
6341 return 1;
6342 }
6343
6344 static unsigned int Int64Or(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6345 {
6346 long long value2 = op2->__anon1.i64;
6347
6348 exp->type = 2;
6349 exp->__anon1.__anon2.string = PrintInt64((long long)(op1->__anon1.i64 || value2));
6350 if(!exp->expType)
6351 {
6352 exp->expType = op1->type;
6353 if(op1->type)
6354 op1->type->refCount++;
6355 }
6356 return 1;
6357 }
6358
6359 static unsigned int UInt64Or(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6360 {
6361 uint64 value2 = op2->__anon1.ui64;
6362
6363 exp->type = 2;
6364 exp->__anon1.__anon2.string = PrintUInt64((uint64)(op1->__anon1.ui64 || value2));
6365 if(!exp->expType)
6366 {
6367 exp->expType = op1->type;
6368 if(op1->type)
6369 op1->type->refCount++;
6370 }
6371 return 1;
6372 }
6373
6374 static unsigned int ShortOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6375 {
6376 short value2 = op2->__anon1.s;
6377
6378 exp->type = 2;
6379 exp->__anon1.__anon2.string = PrintShort((short)(op1->__anon1.s || value2));
6380 if(!exp->expType)
6381 {
6382 exp->expType = op1->type;
6383 if(op1->type)
6384 op1->type->refCount++;
6385 }
6386 return 1;
6387 }
6388
6389 static unsigned int UShortOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6390 {
6391 unsigned short value2 = op2->__anon1.us;
6392
6393 exp->type = 2;
6394 exp->__anon1.__anon2.string = PrintUShort((unsigned short)(op1->__anon1.us || value2));
6395 if(!exp->expType)
6396 {
6397 exp->expType = op1->type;
6398 if(op1->type)
6399 op1->type->refCount++;
6400 }
6401 return 1;
6402 }
6403
6404 static unsigned int CharOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6405 {
6406 char value2 = op2->__anon1.c;
6407
6408 exp->type = 2;
6409 exp->__anon1.__anon2.string = PrintChar((char)(op1->__anon1.c || value2));
6410 if(!exp->expType)
6411 {
6412 exp->expType = op1->type;
6413 if(op1->type)
6414 op1->type->refCount++;
6415 }
6416 return 1;
6417 }
6418
6419 static unsigned int UCharOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6420 {
6421 unsigned char value2 = op2->__anon1.uc;
6422
6423 exp->type = 2;
6424 exp->__anon1.__anon2.string = PrintUChar((unsigned char)(op1->__anon1.uc || value2));
6425 if(!exp->expType)
6426 {
6427 exp->expType = op1->type;
6428 if(op1->type)
6429 op1->type->refCount++;
6430 }
6431 return 1;
6432 }
6433
6434 static unsigned int FloatOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6435 {
6436 float value2 = op2->__anon1.f;
6437
6438 exp->type = 2;
6439 exp->__anon1.__anon2.string = PrintFloat((float)(op1->__anon1.f || value2));
6440 if(!exp->expType)
6441 {
6442 exp->expType = op1->type;
6443 if(op1->type)
6444 op1->type->refCount++;
6445 }
6446 return 1;
6447 }
6448
6449 static unsigned int DoubleOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6450 {
6451 double value2 = op2->__anon1.d;
6452
6453 exp->type = 2;
6454 exp->__anon1.__anon2.string = PrintDouble((double)(op1->__anon1.d || value2));
6455 if(!exp->expType)
6456 {
6457 exp->expType = op1->type;
6458 if(op1->type)
6459 op1->type->refCount++;
6460 }
6461 return 1;
6462 }
6463
6464 static unsigned int IntGrt(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6465 {
6466 int value2 = op2->__anon1.i;
6467
6468 exp->type = 2;
6469 exp->__anon1.__anon2.string = PrintInt((int)(op1->__anon1.i > value2));
6470 if(!exp->expType)
6471 {
6472 exp->expType = op1->type;
6473 if(op1->type)
6474 op1->type->refCount++;
6475 }
6476 return 1;
6477 }
6478
6479 static unsigned int UIntGrt(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6480 {
6481 unsigned int value2 = op2->__anon1.ui;
6482
6483 exp->type = 2;
6484 exp->__anon1.__anon2.string = PrintUInt((unsigned int)(op1->__anon1.ui > value2));
6485 if(!exp->expType)
6486 {
6487 exp->expType = op1->type;
6488 if(op1->type)
6489 op1->type->refCount++;
6490 }
6491 return 1;
6492 }
6493
6494 static unsigned int Int64Grt(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6495 {
6496 long long value2 = op2->__anon1.i64;
6497
6498 exp->type = 2;
6499 exp->__anon1.__anon2.string = PrintInt64((long long)(op1->__anon1.i64 > value2));
6500 if(!exp->expType)
6501 {
6502 exp->expType = op1->type;
6503 if(op1->type)
6504 op1->type->refCount++;
6505 }
6506 return 1;
6507 }
6508
6509 static unsigned int UInt64Grt(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6510 {
6511 uint64 value2 = op2->__anon1.ui64;
6512
6513 exp->type = 2;
6514 exp->__anon1.__anon2.string = PrintUInt64((uint64)(op1->__anon1.ui64 > value2));
6515 if(!exp->expType)
6516 {
6517 exp->expType = op1->type;
6518 if(op1->type)
6519 op1->type->refCount++;
6520 }
6521 return 1;
6522 }
6523
6524 static unsigned int ShortGrt(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6525 {
6526 short value2 = op2->__anon1.s;
6527
6528 exp->type = 2;
6529 exp->__anon1.__anon2.string = PrintShort((short)(op1->__anon1.s > value2));
6530 if(!exp->expType)
6531 {
6532 exp->expType = op1->type;
6533 if(op1->type)
6534 op1->type->refCount++;
6535 }
6536 return 1;
6537 }
6538
6539 static unsigned int UShortGrt(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6540 {
6541 unsigned short value2 = op2->__anon1.us;
6542
6543 exp->type = 2;
6544 exp->__anon1.__anon2.string = PrintUShort((unsigned short)(op1->__anon1.us > value2));
6545 if(!exp->expType)
6546 {
6547 exp->expType = op1->type;
6548 if(op1->type)
6549 op1->type->refCount++;
6550 }
6551 return 1;
6552 }
6553
6554 static unsigned int CharGrt(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6555 {
6556 char value2 = op2->__anon1.c;
6557
6558 exp->type = 2;
6559 exp->__anon1.__anon2.string = PrintChar((char)(op1->__anon1.c > value2));
6560 if(!exp->expType)
6561 {
6562 exp->expType = op1->type;
6563 if(op1->type)
6564 op1->type->refCount++;
6565 }
6566 return 1;
6567 }
6568
6569 static unsigned int UCharGrt(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6570 {
6571 unsigned char value2 = op2->__anon1.uc;
6572
6573 exp->type = 2;
6574 exp->__anon1.__anon2.string = PrintUChar((unsigned char)(op1->__anon1.uc > value2));
6575 if(!exp->expType)
6576 {
6577 exp->expType = op1->type;
6578 if(op1->type)
6579 op1->type->refCount++;
6580 }
6581 return 1;
6582 }
6583
6584 static unsigned int FloatGrt(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6585 {
6586 float value2 = op2->__anon1.f;
6587
6588 exp->type = 2;
6589 exp->__anon1.__anon2.string = PrintFloat((float)(op1->__anon1.f > value2));
6590 if(!exp->expType)
6591 {
6592 exp->expType = op1->type;
6593 if(op1->type)
6594 op1->type->refCount++;
6595 }
6596 return 1;
6597 }
6598
6599 static unsigned int DoubleGrt(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6600 {
6601 double value2 = op2->__anon1.d;
6602
6603 exp->type = 2;
6604 exp->__anon1.__anon2.string = PrintDouble((double)(op1->__anon1.d > value2));
6605 if(!exp->expType)
6606 {
6607 exp->expType = op1->type;
6608 if(op1->type)
6609 op1->type->refCount++;
6610 }
6611 return 1;
6612 }
6613
6614 static unsigned int IntSma(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6615 {
6616 int value2 = op2->__anon1.i;
6617
6618 exp->type = 2;
6619 exp->__anon1.__anon2.string = PrintInt((int)(op1->__anon1.i < value2));
6620 if(!exp->expType)
6621 {
6622 exp->expType = op1->type;
6623 if(op1->type)
6624 op1->type->refCount++;
6625 }
6626 return 1;
6627 }
6628
6629 static unsigned int UIntSma(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6630 {
6631 unsigned int value2 = op2->__anon1.ui;
6632
6633 exp->type = 2;
6634 exp->__anon1.__anon2.string = PrintUInt((unsigned int)(op1->__anon1.ui < value2));
6635 if(!exp->expType)
6636 {
6637 exp->expType = op1->type;
6638 if(op1->type)
6639 op1->type->refCount++;
6640 }
6641 return 1;
6642 }
6643
6644 static unsigned int Int64Sma(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6645 {
6646 long long value2 = op2->__anon1.i64;
6647
6648 exp->type = 2;
6649 exp->__anon1.__anon2.string = PrintInt64((long long)(op1->__anon1.i64 < value2));
6650 if(!exp->expType)
6651 {
6652 exp->expType = op1->type;
6653 if(op1->type)
6654 op1->type->refCount++;
6655 }
6656 return 1;
6657 }
6658
6659 static unsigned int UInt64Sma(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6660 {
6661 uint64 value2 = op2->__anon1.ui64;
6662
6663 exp->type = 2;
6664 exp->__anon1.__anon2.string = PrintUInt64((uint64)(op1->__anon1.ui64 < value2));
6665 if(!exp->expType)
6666 {
6667 exp->expType = op1->type;
6668 if(op1->type)
6669 op1->type->refCount++;
6670 }
6671 return 1;
6672 }
6673
6674 static unsigned int ShortSma(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6675 {
6676 short value2 = op2->__anon1.s;
6677
6678 exp->type = 2;
6679 exp->__anon1.__anon2.string = PrintShort((short)(op1->__anon1.s < value2));
6680 if(!exp->expType)
6681 {
6682 exp->expType = op1->type;
6683 if(op1->type)
6684 op1->type->refCount++;
6685 }
6686 return 1;
6687 }
6688
6689 static unsigned int UShortSma(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6690 {
6691 unsigned short value2 = op2->__anon1.us;
6692
6693 exp->type = 2;
6694 exp->__anon1.__anon2.string = PrintUShort((unsigned short)(op1->__anon1.us < value2));
6695 if(!exp->expType)
6696 {
6697 exp->expType = op1->type;
6698 if(op1->type)
6699 op1->type->refCount++;
6700 }
6701 return 1;
6702 }
6703
6704 static unsigned int CharSma(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6705 {
6706 char value2 = op2->__anon1.c;
6707
6708 exp->type = 2;
6709 exp->__anon1.__anon2.string = PrintChar((char)(op1->__anon1.c < value2));
6710 if(!exp->expType)
6711 {
6712 exp->expType = op1->type;
6713 if(op1->type)
6714 op1->type->refCount++;
6715 }
6716 return 1;
6717 }
6718
6719 static unsigned int UCharSma(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6720 {
6721 unsigned char value2 = op2->__anon1.uc;
6722
6723 exp->type = 2;
6724 exp->__anon1.__anon2.string = PrintUChar((unsigned char)(op1->__anon1.uc < value2));
6725 if(!exp->expType)
6726 {
6727 exp->expType = op1->type;
6728 if(op1->type)
6729 op1->type->refCount++;
6730 }
6731 return 1;
6732 }
6733
6734 static unsigned int FloatSma(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6735 {
6736 float value2 = op2->__anon1.f;
6737
6738 exp->type = 2;
6739 exp->__anon1.__anon2.string = PrintFloat((float)(op1->__anon1.f < value2));
6740 if(!exp->expType)
6741 {
6742 exp->expType = op1->type;
6743 if(op1->type)
6744 op1->type->refCount++;
6745 }
6746 return 1;
6747 }
6748
6749 static unsigned int DoubleSma(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6750 {
6751 double value2 = op2->__anon1.d;
6752
6753 exp->type = 2;
6754 exp->__anon1.__anon2.string = PrintDouble((double)(op1->__anon1.d < value2));
6755 if(!exp->expType)
6756 {
6757 exp->expType = op1->type;
6758 if(op1->type)
6759 op1->type->refCount++;
6760 }
6761 return 1;
6762 }
6763
6764 static unsigned int IntGrtEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6765 {
6766 int value2 = op2->__anon1.i;
6767
6768 exp->type = 2;
6769 exp->__anon1.__anon2.string = PrintInt((int)(op1->__anon1.i >= value2));
6770 if(!exp->expType)
6771 {
6772 exp->expType = op1->type;
6773 if(op1->type)
6774 op1->type->refCount++;
6775 }
6776 return 1;
6777 }
6778
6779 static unsigned int UIntGrtEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6780 {
6781 unsigned int value2 = op2->__anon1.ui;
6782
6783 exp->type = 2;
6784 exp->__anon1.__anon2.string = PrintUInt((unsigned int)(op1->__anon1.ui >= value2));
6785 if(!exp->expType)
6786 {
6787 exp->expType = op1->type;
6788 if(op1->type)
6789 op1->type->refCount++;
6790 }
6791 return 1;
6792 }
6793
6794 static unsigned int Int64GrtEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6795 {
6796 long long value2 = op2->__anon1.i64;
6797
6798 exp->type = 2;
6799 exp->__anon1.__anon2.string = PrintInt64((long long)(op1->__anon1.i64 >= value2));
6800 if(!exp->expType)
6801 {
6802 exp->expType = op1->type;
6803 if(op1->type)
6804 op1->type->refCount++;
6805 }
6806 return 1;
6807 }
6808
6809 static unsigned int UInt64GrtEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6810 {
6811 uint64 value2 = op2->__anon1.ui64;
6812
6813 exp->type = 2;
6814 exp->__anon1.__anon2.string = PrintUInt64((uint64)(op1->__anon1.ui64 >= value2));
6815 if(!exp->expType)
6816 {
6817 exp->expType = op1->type;
6818 if(op1->type)
6819 op1->type->refCount++;
6820 }
6821 return 1;
6822 }
6823
6824 static unsigned int ShortGrtEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6825 {
6826 short value2 = op2->__anon1.s;
6827
6828 exp->type = 2;
6829 exp->__anon1.__anon2.string = PrintShort((short)(op1->__anon1.s >= value2));
6830 if(!exp->expType)
6831 {
6832 exp->expType = op1->type;
6833 if(op1->type)
6834 op1->type->refCount++;
6835 }
6836 return 1;
6837 }
6838
6839 static unsigned int UShortGrtEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6840 {
6841 unsigned short value2 = op2->__anon1.us;
6842
6843 exp->type = 2;
6844 exp->__anon1.__anon2.string = PrintUShort((unsigned short)(op1->__anon1.us >= value2));
6845 if(!exp->expType)
6846 {
6847 exp->expType = op1->type;
6848 if(op1->type)
6849 op1->type->refCount++;
6850 }
6851 return 1;
6852 }
6853
6854 static unsigned int CharGrtEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6855 {
6856 char value2 = op2->__anon1.c;
6857
6858 exp->type = 2;
6859 exp->__anon1.__anon2.string = PrintChar((char)(op1->__anon1.c >= value2));
6860 if(!exp->expType)
6861 {
6862 exp->expType = op1->type;
6863 if(op1->type)
6864 op1->type->refCount++;
6865 }
6866 return 1;
6867 }
6868
6869 static unsigned int UCharGrtEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6870 {
6871 unsigned char value2 = op2->__anon1.uc;
6872
6873 exp->type = 2;
6874 exp->__anon1.__anon2.string = PrintUChar((unsigned char)(op1->__anon1.uc >= value2));
6875 if(!exp->expType)
6876 {
6877 exp->expType = op1->type;
6878 if(op1->type)
6879 op1->type->refCount++;
6880 }
6881 return 1;
6882 }
6883
6884 static unsigned int FloatGrtEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6885 {
6886 float value2 = op2->__anon1.f;
6887
6888 exp->type = 2;
6889 exp->__anon1.__anon2.string = PrintFloat((float)(op1->__anon1.f >= value2));
6890 if(!exp->expType)
6891 {
6892 exp->expType = op1->type;
6893 if(op1->type)
6894 op1->type->refCount++;
6895 }
6896 return 1;
6897 }
6898
6899 static unsigned int DoubleGrtEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6900 {
6901 double value2 = op2->__anon1.d;
6902
6903 exp->type = 2;
6904 exp->__anon1.__anon2.string = PrintDouble((double)(op1->__anon1.d >= value2));
6905 if(!exp->expType)
6906 {
6907 exp->expType = op1->type;
6908 if(op1->type)
6909 op1->type->refCount++;
6910 }
6911 return 1;
6912 }
6913
6914 static unsigned int IntSmaEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6915 {
6916 int value2 = op2->__anon1.i;
6917
6918 exp->type = 2;
6919 exp->__anon1.__anon2.string = PrintInt((int)(op1->__anon1.i <= value2));
6920 if(!exp->expType)
6921 {
6922 exp->expType = op1->type;
6923 if(op1->type)
6924 op1->type->refCount++;
6925 }
6926 return 1;
6927 }
6928
6929 static unsigned int UIntSmaEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6930 {
6931 unsigned int value2 = op2->__anon1.ui;
6932
6933 exp->type = 2;
6934 exp->__anon1.__anon2.string = PrintUInt((unsigned int)(op1->__anon1.ui <= value2));
6935 if(!exp->expType)
6936 {
6937 exp->expType = op1->type;
6938 if(op1->type)
6939 op1->type->refCount++;
6940 }
6941 return 1;
6942 }
6943
6944 static unsigned int Int64SmaEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6945 {
6946 long long value2 = op2->__anon1.i64;
6947
6948 exp->type = 2;
6949 exp->__anon1.__anon2.string = PrintInt64((long long)(op1->__anon1.i64 <= value2));
6950 if(!exp->expType)
6951 {
6952 exp->expType = op1->type;
6953 if(op1->type)
6954 op1->type->refCount++;
6955 }
6956 return 1;
6957 }
6958
6959 static unsigned int UInt64SmaEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6960 {
6961 uint64 value2 = op2->__anon1.ui64;
6962
6963 exp->type = 2;
6964 exp->__anon1.__anon2.string = PrintUInt64((uint64)(op1->__anon1.ui64 <= value2));
6965 if(!exp->expType)
6966 {
6967 exp->expType = op1->type;
6968 if(op1->type)
6969 op1->type->refCount++;
6970 }
6971 return 1;
6972 }
6973
6974 static unsigned int ShortSmaEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6975 {
6976 short value2 = op2->__anon1.s;
6977
6978 exp->type = 2;
6979 exp->__anon1.__anon2.string = PrintShort((short)(op1->__anon1.s <= value2));
6980 if(!exp->expType)
6981 {
6982 exp->expType = op1->type;
6983 if(op1->type)
6984 op1->type->refCount++;
6985 }
6986 return 1;
6987 }
6988
6989 static unsigned int UShortSmaEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6990 {
6991 unsigned short value2 = op2->__anon1.us;
6992
6993 exp->type = 2;
6994 exp->__anon1.__anon2.string = PrintUShort((unsigned short)(op1->__anon1.us <= value2));
6995 if(!exp->expType)
6996 {
6997 exp->expType = op1->type;
6998 if(op1->type)
6999 op1->type->refCount++;
7000 }
7001 return 1;
7002 }
7003
7004 static unsigned int CharSmaEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
7005 {
7006 char value2 = op2->__anon1.c;
7007
7008 exp->type = 2;
7009 exp->__anon1.__anon2.string = PrintChar((char)(op1->__anon1.c <= value2));
7010 if(!exp->expType)
7011 {
7012 exp->expType = op1->type;
7013 if(op1->type)
7014 op1->type->refCount++;
7015 }
7016 return 1;
7017 }
7018
7019 static unsigned int UCharSmaEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
7020 {
7021 unsigned char value2 = op2->__anon1.uc;
7022
7023 exp->type = 2;
7024 exp->__anon1.__anon2.string = PrintUChar((unsigned char)(op1->__anon1.uc <= value2));
7025 if(!exp->expType)
7026 {
7027 exp->expType = op1->type;
7028 if(op1->type)
7029 op1->type->refCount++;
7030 }
7031 return 1;
7032 }
7033
7034 static unsigned int FloatSmaEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
7035 {
7036 float value2 = op2->__anon1.f;
7037
7038 exp->type = 2;
7039 exp->__anon1.__anon2.string = PrintFloat((float)(op1->__anon1.f <= value2));
7040 if(!exp->expType)
7041 {
7042 exp->expType = op1->type;
7043 if(op1->type)
7044 op1->type->refCount++;
7045 }
7046 return 1;
7047 }
7048
7049 static unsigned int DoubleSmaEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
7050 {
7051 double value2 = op2->__anon1.d;
7052
7053 exp->type = 2;
7054 exp->__anon1.__anon2.string = PrintDouble((double)(op1->__anon1.d <= value2));
7055 if(!exp->expType)
7056 {
7057 exp->expType = op1->type;
7058 if(op1->type)
7059 op1->type->refCount++;
7060 }
7061 return 1;
7062 }
7063
7064 static unsigned int IntCond(struct Expression * exp, struct Operand * op1, struct Operand * op2, struct Operand * op3)
7065 {
7066 exp->type = 2;
7067 exp->__anon1.__anon2.string = PrintInt(op1->__anon1.i ? op2->__anon1.i : op3->__anon1.i);
7068 if(!exp->expType)
7069 {
7070 exp->expType = op1->type;
7071 if(op1->type)
7072 op1->type->refCount++;
7073 }
7074 return 1;
7075 }
7076
7077 static unsigned int UIntCond(struct Expression * exp, struct Operand * op1, struct Operand * op2, struct Operand * op3)
7078 {
7079 exp->type = 2;
7080 exp->__anon1.__anon2.string = PrintUInt(op1->__anon1.ui ? op2->__anon1.ui : op3->__anon1.ui);
7081 if(!exp->expType)
7082 {
7083 exp->expType = op1->type;
7084 if(op1->type)
7085 op1->type->refCount++;
7086 }
7087 return 1;
7088 }
7089
7090 static unsigned int Int64Cond(struct Expression * exp, struct Operand * op1, struct Operand * op2, struct Operand * op3)
7091 {
7092 exp->type = 2;
7093 exp->__anon1.__anon2.string = PrintInt64(op1->__anon1.i64 ? op2->__anon1.i64 : op3->__anon1.i64);
7094 if(!exp->expType)
7095 {
7096 exp->expType = op1->type;
7097 if(op1->type)
7098 op1->type->refCount++;
7099 }
7100 return 1;
7101 }
7102
7103 static unsigned int UInt64Cond(struct Expression * exp, struct Operand * op1, struct Operand * op2, struct Operand * op3)
7104 {
7105 exp->type = 2;
7106 exp->__anon1.__anon2.string = PrintUInt64(op1->__anon1.ui64 ? op2->__anon1.ui64 : op3->__anon1.ui64);
7107 if(!exp->expType)
7108 {
7109 exp->expType = op1->type;
7110 if(op1->type)
7111 op1->type->refCount++;
7112 }
7113 return 1;
7114 }
7115
7116 static unsigned int ShortCond(struct Expression * exp, struct Operand * op1, struct Operand * op2, struct Operand * op3)
7117 {
7118 exp->type = 2;
7119 exp->__anon1.__anon2.string = PrintShort(op1->__anon1.s ? op2->__anon1.s : op3->__anon1.s);
7120 if(!exp->expType)
7121 {
7122 exp->expType = op1->type;
7123 if(op1->type)
7124 op1->type->refCount++;
7125 }
7126 return 1;
7127 }
7128
7129 static unsigned int UShortCond(struct Expression * exp, struct Operand * op1, struct Operand * op2, struct Operand * op3)
7130 {
7131 exp->type = 2;
7132 exp->__anon1.__anon2.string = PrintUShort(op1->__anon1.us ? op2->__anon1.us : op3->__anon1.us);
7133 if(!exp->expType)
7134 {
7135 exp->expType = op1->type;
7136 if(op1->type)
7137 op1->type->refCount++;
7138 }
7139 return 1;
7140 }
7141
7142 static unsigned int CharCond(struct Expression * exp, struct Operand * op1, struct Operand * op2, struct Operand * op3)
7143 {
7144 exp->type = 2;
7145 exp->__anon1.__anon2.string = PrintChar(op1->__anon1.c ? op2->__anon1.c : op3->__anon1.c);
7146 if(!exp->expType)
7147 {
7148 exp->expType = op1->type;
7149 if(op1->type)
7150 op1->type->refCount++;
7151 }
7152 return 1;
7153 }
7154
7155 static unsigned int UCharCond(struct Expression * exp, struct Operand * op1, struct Operand * op2, struct Operand * op3)
7156 {
7157 exp->type = 2;
7158 exp->__anon1.__anon2.string = PrintUChar(op1->__anon1.uc ? op2->__anon1.uc : op3->__anon1.uc);
7159 if(!exp->expType)
7160 {
7161 exp->expType = op1->type;
7162 if(op1->type)
7163 op1->type->refCount++;
7164 }
7165 return 1;
7166 }
7167
7168 static void PrintName(struct Type * type, char * string, unsigned int fullName)
7169 {
7170 if(type->name && type->name[0])
7171 {
7172 if(fullName)
7173 strcat(string, type->name);
7174 else
7175 {
7176 char * name = __ecereNameSpace__ecere__sys__RSearchString(type->name, "::", strlen(type->name), 1, 0);
7177
7178 if(name)
7179 name += 2;
7180 else
7181 name = type->name;
7182 strcat(string, name);
7183 }
7184 }
7185 }
7186
7187 static void PrintAttribs(struct Type * type, char * string)
7188 {
7189 if(type)
7190 {
7191 if(type->dllExport)
7192 strcat(string, "dllexport ");
7193 if(type->attrStdcall)
7194 strcat(string, "stdcall ");
7195 }
7196 }
7197
7198 static struct Type * FindMember(struct Type * type, char * string)
7199 {
7200 struct Type * memberType;
7201
7202 for(memberType = type->__anon1.__anon1.members.first; memberType; memberType = memberType->next)
7203 {
7204 if(!memberType->name)
7205 {
7206 struct Type * subType = FindMember(memberType, string);
7207
7208 if(subType)
7209 return subType;
7210 }
7211 else if(!strcmp(memberType->name, string))
7212 return memberType;
7213 }
7214 return (((void *)0));
7215 }
7216
7217 unsigned int __ecereProp_Type_Get_isPointerType(struct Type * this);
7218
7219 unsigned int __ecereProp_Type_Get_specConst(struct Type * this);
7220
7221 static unsigned int Promote(struct Operand * op, int kind, unsigned int isSigned)
7222 {
7223 unsigned int result = 0;
7224
7225 switch(kind)
7226 {
7227 case 2:
7228 if(op->kind == 1 || op->kind == 15 || op->kind == 24)
7229 result = isSigned ? GetOpShort(op, &op->__anon1.s) : GetOpUShort(op, &op->__anon1.us);
7230 break;
7231 case 3:
7232 case 5:
7233 if(op->kind == 1 || op->kind == 2 || op->kind == 15 || op->kind == 24)
7234 result = isSigned ? GetOpInt(op, &op->__anon1.i) : GetOpUInt(op, &op->__anon1.ui);
7235 break;
7236 case 4:
7237 if(op->kind == 1 || op->kind == 2 || op->kind == 3 || op->kind == 4 || op->kind == 5 || op->kind == 6 || op->kind == 7 || op->kind == 13 || op->kind == 15 || op->kind == 22 || op->kind == 23 || op->kind == 24)
7238 result = isSigned ? GetOpInt64(op, &op->__anon1.i64) : GetOpUInt64(op, &op->__anon1.ui64);
7239 break;
7240 case 6:
7241 if(op->kind == 1 || op->kind == 2 || op->kind == 3 || op->kind == 4 || op->kind == 5 || op->kind == 15 || op->kind == 22 || op->kind == 23 || op->kind == 24)
7242 result = GetOpFloat(op, &op->__anon1.f);
7243 break;
7244 case 7:
7245 if(op->kind == 1 || op->kind == 2 || op->kind == 3 || op->kind == 4 || op->kind == 5 || op->kind == 6 || op->kind == 15 || op->kind == 22 || op->kind == 23 || op->kind == 24)
7246 result = GetOpDouble(op, &op->__anon1.d);
7247 break;
7248 case 13:
7249 if(op->kind == 1 || op->kind == 2 || op->kind == 3 || op->kind == 4 || op->kind == 5 || op->kind == 6 || op->kind == 7 || op->kind == 13 || op->kind == 15 || op->kind == 22 || op->kind == 23 || op->kind == 24)
7250 result = GetOpUInt64(op, &op->__anon1.ui64);
7251 break;
7252 case 15:
7253 if(op->kind == 1 || op->kind == 2 || op->kind == 3 || op->kind == 4 || op->kind == 5 || op->kind == 6 || op->kind == 7 || op->kind == 13 || op->kind == 15 || op->kind == 22 || op->kind == 23 || op->kind == 24)
7254 result = isSigned ? GetOpInt(op, &op->__anon1.i) : GetOpUInt(op, &op->__anon1.ui);
7255 break;
7256 case 22:
7257 if(op->kind == 1 || op->kind == 2 || op->kind == 3 || op->kind == 5 || op->kind == 15 || op->kind == 24)
7258 result = isSigned ? GetOpInt64(op, &op->__anon1.i64) : GetOpUInt64(op, &op->__anon1.ui64);
7259 break;
7260 case 23:
7261 if(op->kind == 1 || op->kind == 2 || op->kind == 3 || op->kind == 5 || op->kind == 15 || op->kind == 24)
7262 result = isSigned ? GetOpInt64(op, &op->__anon1.i64) : GetOpUInt64(op, &op->__anon1.ui64);
7263 break;
7264 }
7265 return result;
7266 }
7267
7268 struct OpTable floatOps =
7269 {
7270 (void *)(FloatAdd), (void *)(FloatSub), (void *)(FloatMul), (void *)(FloatDiv), (((void *)0)), (void *)(FloatNeg), (void *)(FloatInc), (void *)(FloatDec), (void *)(FloatAsign), (void *)(FloatAddAsign), (void *)(FloatSubAsign), (void *)(FloatMulAsign), (void *)(FloatDivAsign), (((void *)0)), (((void *)0)), (((void *)0)), (((void *)0)), (((void *)0)), (((void *)0)), (((void *)0)), (((void *)0)), (((void *)0)), (((void *)0)), (((void *)0)), (((void *)0)), (((void *)0)), (void *)(FloatEqu), (void *)(FloatNqu), (void *)(FloatAnd), (void *)(FloatOr), (void *)(FloatGrt), (void *)(FloatSma), (void *)(FloatGrtEqu), (void *)(FloatSmaEqu)
7271 };
7272
7273 struct OpTable doubleOps =
7274 {
7275 (void *)(DoubleAdd), (void *)(DoubleSub), (void *)(DoubleMul), (void *)(DoubleDiv), (((void *)0)), (void *)(DoubleNeg), (void *)(DoubleInc), (void *)(DoubleDec), (void *)(DoubleAsign), (void *)(DoubleAddAsign), (void *)(DoubleSubAsign), (void *)(DoubleMulAsign), (void *)(DoubleDivAsign), (((void *)0)), (((void *)0)), (((void *)0)), (((void *)0)), (((void *)0)), (((void *)0)), (((void *)0)), (((void *)0)), (((void *)0)), (((void *)0)), (((void *)0)), (((void *)0)), (((void *)0)), (void *)(DoubleEqu), (void *)(DoubleNqu), (void *)(DoubleAnd), (void *)(DoubleOr), (void *)(DoubleGrt), (void *)(DoubleSma), (void *)(DoubleGrtEqu), (void *)(DoubleSmaEqu)
7276 };
7277
7278 struct OpTable intOps =
7279 {
7280 (void *)(IntAdd), (void *)(IntSub), (void *)(IntMul), (void *)(IntDiv), (void *)(IntMod), (void *)(IntNeg), (void *)(IntInc), (void *)(IntDec), (void *)(IntAsign), (void *)(IntAddAsign), (void *)(IntSubAsign), (void *)(IntMulAsign), (void *)(IntDivAsign), (void *)(IntModAsign), (void *)(IntBitAnd), (void *)(IntBitOr), (void *)(IntBitXor), (void *)(IntLShift), (void *)(IntRShift), (void *)(IntBitNot), (void *)(IntAndAsign), (void *)(IntOrAsign), (void *)(IntXorAsign), (void *)(IntLShiftAsign), (void *)(IntRShiftAsign), (void *)(IntNot), (void *)(IntEqu), (void *)(IntNqu), (void *)(IntAnd), (void *)(IntOr), (void *)(IntGrt), (void *)(IntSma), (void *)(IntGrtEqu), (void *)(IntSmaEqu), (void *)(IntCond)
7281 };
7282
7283 struct OpTable uintOps =
7284 {
7285 (void *)(UIntAdd), (void *)(UIntSub), (void *)(UIntMul), (void *)(UIntDiv), (void *)(UIntMod), (void *)(UIntNeg), (void *)(UIntInc), (void *)(UIntDec), (void *)(UIntAsign), (void *)(UIntAddAsign), (void *)(UIntSubAsign), (void *)(UIntMulAsign), (void *)(UIntDivAsign), (void *)(UIntModAsign), (void *)(UIntBitAnd), (void *)(UIntBitOr), (void *)(UIntBitXor), (void *)(UIntLShift), (void *)(UIntRShift), (void *)(UIntBitNot), (void *)(UIntAndAsign), (void *)(UIntOrAsign), (void *)(UIntXorAsign), (void *)(UIntLShiftAsign), (void *)(UIntRShiftAsign), (void *)(UIntNot), (void *)(UIntEqu), (void *)(UIntNqu), (void *)(UIntAnd), (void *)(UIntOr), (void *)(UIntGrt), (void *)(UIntSma), (void *)(UIntGrtEqu), (void *)(UIntSmaEqu), (void *)(UIntCond)
7286 };
7287
7288 struct OpTable int64Ops =
7289 {
7290 (void *)(Int64Add), (void *)(Int64Sub), (void *)(Int64Mul), (void *)(Int64Div), (void *)(Int64Mod), (void *)(Int64Neg), (void *)(Int64Inc), (void *)(Int64Dec), (void *)(Int64Asign), (void *)(Int64AddAsign), (void *)(Int64SubAsign), (void *)(Int64MulAsign), (void *)(Int64DivAsign), (void *)(Int64ModAsign), (void *)(Int64BitAnd), (void *)(Int64BitOr), (void *)(Int64BitXor), (void *)(Int64LShift), (void *)(Int64RShift), (void *)(Int64BitNot), (void *)(Int64AndAsign), (void *)(Int64OrAsign), (void *)(Int64XorAsign), (void *)(Int64LShiftAsign), (void *)(Int64RShiftAsign), (void *)(Int64Not), (void *)(Int64Equ), (void *)(Int64Nqu), (void *)(Int64And), (void *)(Int64Or), (void *)(Int64Grt), (void *)(Int64Sma), (void *)(Int64GrtEqu), (void *)(Int64SmaEqu), (void *)(Int64Cond)
7291 };
7292
7293 struct OpTable uint64Ops =
7294 {
7295 (void *)(UInt64Add), (void *)(UInt64Sub), (void *)(UInt64Mul), (void *)(UInt64Div), (void *)(UInt64Mod), (void *)(UInt64Neg), (void *)(UInt64Inc), (void *)(UInt64Dec), (void *)(UInt64Asign), (void *)(UInt64AddAsign), (void *)(UInt64SubAsign), (void *)(UInt64MulAsign), (void *)(UInt64DivAsign), (void *)(UInt64ModAsign), (void *)(UInt64BitAnd), (void *)(UInt64BitOr), (void *)(UInt64BitXor), (void *)(UInt64LShift), (void *)(UInt64RShift), (void *)(UInt64BitNot), (void *)(UInt64AndAsign), (void *)(UInt64OrAsign), (void *)(UInt64XorAsign), (void *)(UInt64LShiftAsign), (void *)(UInt64RShiftAsign), (void *)(UInt64Not), (void *)(UInt64Equ), (void *)(UInt64Nqu), (void *)(UInt64And), (void *)(UInt64Or), (void *)(UInt64Grt), (void *)(UInt64Sma), (void *)(UInt64GrtEqu), (void *)(UInt64SmaEqu), (void *)(UInt64Cond)
7296 };
7297
7298 struct OpTable shortOps =
7299 {
7300 (void *)(ShortAdd), (void *)(ShortSub), (void *)(ShortMul), (void *)(ShortDiv), (void *)(ShortMod), (void *)(ShortNeg), (void *)(ShortInc), (void *)(ShortDec), (void *)(ShortAsign), (void *)(ShortAddAsign), (void *)(ShortSubAsign), (void *)(ShortMulAsign), (void *)(ShortDivAsign), (void *)(ShortModAsign), (void *)(ShortBitAnd), (void *)(ShortBitOr), (void *)(ShortBitXor), (void *)(ShortLShift), (void *)(ShortRShift), (void *)(ShortBitNot), (void *)(ShortAndAsign), (void *)(ShortOrAsign), (void *)(ShortXorAsign), (void *)(ShortLShiftAsign), (void *)(ShortRShiftAsign), (void *)(ShortNot), (void *)(ShortEqu), (void *)(ShortNqu), (void *)(ShortAnd), (void *)(ShortOr), (void *)(ShortGrt), (void *)(ShortSma), (void *)(ShortGrtEqu), (void *)(ShortSmaEqu), (void *)(ShortCond)
7301 };
7302
7303 struct OpTable ushortOps =
7304 {
7305 (void *)(UShortAdd), (void *)(UShortSub), (void *)(UShortMul), (void *)(UShortDiv), (void *)(UShortMod), (void *)(UShortNeg), (void *)(UShortInc), (void *)(UShortDec), (void *)(UShortAsign), (void *)(UShortAddAsign), (void *)(UShortSubAsign), (void *)(UShortMulAsign), (void *)(UShortDivAsign), (void *)(UShortModAsign), (void *)(UShortBitAnd), (void *)(UShortBitOr), (void *)(UShortBitXor), (void *)(UShortLShift), (void *)(UShortRShift), (void *)(UShortBitNot), (void *)(UShortAndAsign), (void *)(UShortOrAsign), (void *)(UShortXorAsign), (void *)(UShortLShiftAsign), (void *)(UShortRShiftAsign), (void *)(UShortNot), (void *)(UShortEqu), (void *)(UShortNqu), (void *)(UShortAnd), (void *)(UShortOr), (void *)(UShortGrt), (void *)(UShortSma), (void *)(UShortGrtEqu), (void *)(UShortSmaEqu), (void *)(UShortCond)
7306 };
7307
7308 struct OpTable charOps =
7309 {
7310 (void *)(CharAdd), (void *)(CharSub), (void *)(CharMul), (void *)(CharDiv), (void *)(CharMod), (void *)(CharNeg), (void *)(CharInc), (void *)(CharDec), (void *)(CharAsign), (void *)(CharAddAsign), (void *)(CharSubAsign), (void *)(CharMulAsign), (void *)(CharDivAsign), (void *)(CharModAsign), (void *)(CharBitAnd), (void *)(CharBitOr), (void *)(CharBitXor), (void *)(CharLShift), (void *)(CharRShift), (void *)(CharBitNot), (void *)(CharAndAsign), (void *)(CharOrAsign), (void *)(CharXorAsign), (void *)(CharLShiftAsign), (void *)(CharRShiftAsign), (void *)(CharNot), (void *)(CharEqu), (void *)(CharNqu), (void *)(CharAnd), (void *)(CharOr), (void *)(CharGrt), (void *)(CharSma), (void *)(CharGrtEqu), (void *)(CharSmaEqu), (void *)(CharCond)
7311 };
7312
7313 struct OpTable ucharOps =
7314 {
7315 (void *)(UCharAdd), (void *)(UCharSub), (void *)(UCharMul), (void *)(UCharDiv), (void *)(UCharMod), (void *)(UCharNeg), (void *)(UCharInc), (void *)(UCharDec), (void *)(UCharAsign), (void *)(UCharAddAsign), (void *)(UCharSubAsign), (void *)(UCharMulAsign), (void *)(UCharDivAsign), (void *)(UCharModAsign), (void *)(UCharBitAnd), (void *)(UCharBitOr), (void *)(UCharBitXor), (void *)(UCharLShift), (void *)(UCharRShift), (void *)(UCharBitNot), (void *)(UCharAndAsign), (void *)(UCharOrAsign), (void *)(UCharXorAsign), (void *)(UCharLShiftAsign), (void *)(UCharRShiftAsign), (void *)(UCharNot), (void *)(UCharEqu), (void *)(UCharNqu), (void *)(UCharAnd), (void *)(UCharOr), (void *)(UCharGrt), (void *)(UCharSma), (void *)(UCharGrtEqu), (void *)(UCharSmaEqu), (void *)(UCharCond)
7316 };
7317
7318 struct Type * FindMemberAndOffset(struct Type * type, char * string, unsigned int * offset)
7319 {
7320 struct Type * memberType;
7321
7322 for(memberType = type->__anon1.__anon1.members.first; memberType; memberType = memberType->next)
7323 {
7324 if(!memberType->name)
7325 {
7326 struct Type * subType = FindMember(memberType, string);
7327
7328 if(subType)
7329 {
7330 *offset += memberType->offset;
7331 return subType;
7332 }
7333 }
7334 else if(!strcmp(memberType->name, string))
7335 {
7336 *offset += memberType->offset;
7337 return memberType;
7338 }
7339 }
7340 return (((void *)0));
7341 }
7342
7343 struct __ecereNameSpace__ecere__com__Module;
7344
7345 extern struct __ecereNameSpace__ecere__com__Property * __ecereNameSpace__ecere__com__eClass_FindProperty(struct __ecereNameSpace__ecere__com__Class * _class, const char *  name, struct __ecereNameSpace__ecere__com__Instance * module);
7346
7347 extern struct __ecereNameSpace__ecere__com__Instance * privateModule;
7348
7349 extern struct __ecereNameSpace__ecere__com__Method * __ecereNameSpace__ecere__com__eClass_FindMethod(struct __ecereNameSpace__ecere__com__Class * _class, const char *  name, struct __ecereNameSpace__ecere__com__Instance * module);
7350
7351 extern struct __ecereNameSpace__ecere__com__DataMember * __ecereNameSpace__ecere__com__eClass_FindDataMember(struct __ecereNameSpace__ecere__com__Class * _class, const char *  name, struct __ecereNameSpace__ecere__com__Instance * module, struct __ecereNameSpace__ecere__com__DataMember **  subMemberStack, int *  subMemberStackPos);
7352
7353 extern struct ModuleImport * FindModule(struct __ecereNameSpace__ecere__com__Instance * moduleToFind);
7354
7355 extern struct __ecereNameSpace__ecere__com__Class * __ecereNameSpace__ecere__com__eSystem_FindClass(struct __ecereNameSpace__ecere__com__Instance * module, const char *  name);
7356
7357 struct GlobalData
7358 {
7359 uintptr_t key;
7360 struct __ecereNameSpace__ecere__sys__BTNode * parent;
7361 struct __ecereNameSpace__ecere__sys__BTNode * left;
7362 struct __ecereNameSpace__ecere__sys__BTNode * right;
7363 int depth;
7364 struct __ecereNameSpace__ecere__com__Instance * module;
7365 char *  dataTypeString;
7366 struct Type * dataType;
7367 void *  symbol;
7368 char *  fullName;
7369 } ecere_gcc_struct;
7370
7371 extern struct __ecereNameSpace__ecere__com__DataMember * __ecereNameSpace__ecere__com__eClass_FindDataMemberAndOffset(struct __ecereNameSpace__ecere__com__Class * _class, const char *  name, unsigned int *  offset, struct __ecereNameSpace__ecere__com__Instance * module, struct __ecereNameSpace__ecere__com__DataMember **  subMemberStack, int *  subMemberStackPos);
7372
7373 extern struct __ecereNameSpace__ecere__com__Instance * GetPrivateModule(void);
7374
7375 extern struct __ecereNameSpace__ecere__com__Class * __ecereNameSpace__ecere__com__eSystem_RegisterClass(int type, const char *  name, const char *  baseName, int size, int sizeClass, unsigned int (*  Constructor)(void * ), void (*  Destructor)(void * ), struct __ecereNameSpace__ecere__com__Instance * module, int declMode, int inheritanceAccess);
7376
7377 extern struct __ecereNameSpace__ecere__com__Instance * __thisModule;
7378
7379 struct __ecereNameSpace__ecere__com__DefinedExpression;
7380
7381 extern struct __ecereNameSpace__ecere__com__DefinedExpression * __ecereNameSpace__ecere__com__eSystem_FindDefine(struct __ecereNameSpace__ecere__com__Instance * module, const char *  name);
7382
7383 struct __ecereNameSpace__ecere__com__DefinedExpression
7384 {
7385 struct __ecereNameSpace__ecere__com__DefinedExpression * prev;
7386 struct __ecereNameSpace__ecere__com__DefinedExpression * next;
7387 const char *  name;
7388 const char *  value;
7389 struct __ecereNameSpace__ecere__com__NameSpace *  nameSpace;
7390 } ecere_gcc_struct;
7391
7392 struct __ecereNameSpace__ecere__sys__BinaryTree;
7393
7394 struct __ecereNameSpace__ecere__sys__BinaryTree
7395 {
7396 struct __ecereNameSpace__ecere__sys__BTNode * root;
7397 int count;
7398 int (*  CompareKey)(struct __ecereNameSpace__ecere__sys__BinaryTree * tree, uintptr_t a, uintptr_t b);
7399 void (*  FreeKey)(void *  key);
7400 } ecere_gcc_struct;
7401
7402 struct __ecereNameSpace__ecere__com__Class
7403 {
7404 struct __ecereNameSpace__ecere__com__Class * prev;
7405 struct __ecereNameSpace__ecere__com__Class * next;
7406 const char *  name;
7407 int offset;
7408 int structSize;
7409 void * *  _vTbl;
7410 int vTblSize;
7411 unsigned int (*  Constructor)(void * );
7412 void (*  Destructor)(void * );
7413 int offsetClass;
7414 int sizeClass;
7415 struct __ecereNameSpace__ecere__com__Class * base;
7416 struct __ecereNameSpace__ecere__sys__BinaryTree methods;
7417 struct __ecereNameSpace__ecere__sys__BinaryTree members;
7418 struct __ecereNameSpace__ecere__sys__BinaryTree prop;
7419 struct __ecereNameSpace__ecere__sys__OldList membersAndProperties;
7420 struct __ecereNameSpace__ecere__sys__BinaryTree classProperties;
7421 struct __ecereNameSpace__ecere__sys__OldList derivatives;
7422 int memberID;
7423 int startMemberID;
7424 int type;
7425 struct __ecereNameSpace__ecere__com__Instance * module;
7426 struct __ecereNameSpace__ecere__com__NameSpace *  nameSpace;
7427 const char *  dataTypeString;
7428 struct Type * dataType;
7429 int typeSize;
7430 int defaultAlignment;
7431 void (*  Initialize)();
7432 int memberOffset;
7433 struct __ecereNameSpace__ecere__sys__OldList selfWatchers;
7434 const char *  designerClass;
7435 unsigned int noExpansion;
7436 const char *  defaultProperty;
7437 unsigned int comRedefinition;
7438 int count;
7439 int isRemote;
7440 unsigned int internalDecl;
7441 void *  data;
7442 unsigned int computeSize;
7443 short structAlignment;
7444 short pointerAlignment;
7445 int destructionWatchOffset;
7446 unsigned int fixed;
7447 struct __ecereNameSpace__ecere__sys__OldList delayedCPValues;
7448 int inheritanceAccess;
7449 const char *  fullName;
7450 void *  symbol;
7451 struct __ecereNameSpace__ecere__sys__OldList conversions;
7452 struct __ecereNameSpace__ecere__sys__OldList templateParams;
7453 struct __ecereNameSpace__ecere__com__ClassTemplateArgument *  templateArgs;
7454 struct __ecereNameSpace__ecere__com__Class * templateClass;
7455 struct __ecereNameSpace__ecere__sys__OldList templatized;
7456 int numParams;
7457 unsigned int isInstanceClass;
7458 unsigned int byValueSystemClass;
7459 } ecere_gcc_struct;
7460
7461 struct __ecereNameSpace__ecere__com__NameSpace
7462 {
7463 const char *  name;
7464 struct __ecereNameSpace__ecere__com__NameSpace *  btParent;
7465 struct __ecereNameSpace__ecere__com__NameSpace *  left;
7466 struct __ecereNameSpace__ecere__com__NameSpace *  right;
7467 int depth;
7468 struct __ecereNameSpace__ecere__com__NameSpace *  parent;
7469 struct __ecereNameSpace__ecere__sys__BinaryTree nameSpaces;
7470 struct __ecereNameSpace__ecere__sys__BinaryTree classes;
7471 struct __ecereNameSpace__ecere__sys__BinaryTree defines;
7472 struct __ecereNameSpace__ecere__sys__BinaryTree functions;
7473 } ecere_gcc_struct;
7474
7475 struct __ecereNameSpace__ecere__com__DataMember
7476 {
7477 struct __ecereNameSpace__ecere__com__DataMember * prev;
7478 struct __ecereNameSpace__ecere__com__DataMember * next;
7479 const char *  name;
7480 unsigned int isProperty;
7481 int memberAccess;
7482 int id;
7483 struct __ecereNameSpace__ecere__com__Class * _class;
7484 const char *  dataTypeString;
7485 struct __ecereNameSpace__ecere__com__Class * dataTypeClass;
7486 struct Type * dataType;
7487 int type;
7488 int offset;
7489 int memberID;
7490 struct __ecereNameSpace__ecere__sys__OldList members;
7491 struct __ecereNameSpace__ecere__sys__BinaryTree membersAlpha;
7492 int memberOffset;
7493 short structAlignment;
7494 short pointerAlignment;
7495 } ecere_gcc_struct;
7496
7497 struct __ecereNameSpace__ecere__sys__BTNode * __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindString(struct __ecereNameSpace__ecere__sys__BinaryTree * this, const char *  key);
7498
7499 unsigned int __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Add(struct __ecereNameSpace__ecere__sys__BinaryTree * this, struct __ecereNameSpace__ecere__sys__BTNode * node);
7500
7501 struct __ecereNameSpace__ecere__sys__BTNode * __ecereProp___ecereNameSpace__ecere__sys__BinaryTree_Get_first(struct __ecereNameSpace__ecere__sys__BinaryTree * this);
7502
7503 struct __ecereNameSpace__ecere__sys__BTNode * __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindPrefix(struct __ecereNameSpace__ecere__sys__BinaryTree * this, const char *  key);
7504
7505 void __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Remove(struct __ecereNameSpace__ecere__sys__BinaryTree * this, struct __ecereNameSpace__ecere__sys__BTNode * node);
7506
7507 static struct __ecereNameSpace__ecere__com__Class * __ecereClass_Conversion;
7508
7509 static void _DeclareType(struct External * neededFor, struct Type * type, unsigned int needDereference, unsigned int forFunctionDef, unsigned int fwdDecl)
7510 {
7511 if(inCompiler)
7512 {
7513 if(type->kind == 11)
7514 {
7515 struct Type * param;
7516
7517 for(param = type->__anon1.__anon2.params.first; param; param = param->next)
7518 _DeclareType(neededFor, param, forFunctionDef, 0, fwdDecl);
7519 _DeclareType(neededFor, type->__anon1.__anon2.returnType, forFunctionDef, 0, fwdDecl);
7520 }
7521 else if(type->kind == 13)
7522 _DeclareType(neededFor, type->__anon1.type, 0, 0, fwdDecl);
7523 else if(type->kind == 8)
7524 {
7525 struct __ecereNameSpace__ecere__com__Class * c = type->__anon1._class->__anon1.registered;
7526
7527 _DeclareStruct(neededFor, c ? c->fullName : "ecere::com::Instance", c ? c->type == 5 : 0, needDereference && c && c->type == 1, fwdDecl);
7528 }
7529 else if(type->kind == 9 || type->kind == 10)
7530 {
7531 struct Type * member;
7532
7533 for(member = type->__anon1.__anon1.members.first; member; member = member->next)
7534 _DeclareType(neededFor, member, needDereference, forFunctionDef, fwdDecl);
7535 }
7536 else if(type->kind == 12)
7537 _DeclareType(neededFor, type->__anon1.__anon4.arrayType, 1, 0, fwdDecl);
7538 }
7539 }
7540
7541 static unsigned int CheckConstCompatibility(struct Type * source, struct Type * dest, unsigned int warn)
7542 {
7543 unsigned int status = 1;
7544
7545 if(((source->kind == 8 && source->__anon1._class && source->__anon1._class->__anon1.registered) || source->kind == 12 || source->kind == 13) && ((dest->kind == 8 && dest->__anon1._class && dest->__anon1._class->__anon1.registered) || dest->kind == 13))
7546 {
7547 struct __ecereNameSpace__ecere__com__Class * sourceClass = source->kind == 8 ? source->__anon1._class->__anon1.registered : (((void *)0));
7548 struct __ecereNameSpace__ecere__com__Class * destClass = dest->kind == 8 ? dest->__anon1._class->__anon1.registered : (((void *)0));
7549
7550 if((!sourceClass || (sourceClass && sourceClass->type == 0 && !sourceClass->structSize)) && (!destClass || (destClass && destClass->type == 0 && !destClass->structSize)))
7551 {
7552 struct Type * sourceType = source, * destType = dest;
7553
7554 while((sourceType->kind == 13 || sourceType->kind == 12) && sourceType->__anon1.type)
7555 sourceType = sourceType->__anon1.type;
7556 while((destType->kind == 13 || destType->kind == 12) && destType->__anon1.type)
7557 destType = destType->__anon1.type;
7558 if(!destType->constant && sourceType->constant)
7559 {
7560 status = 0;
7561 if(warn)
7562 Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "discarding const qualifier\n", (((void *)0))));
7563 }
7564 }
7565 }
7566 return status;
7567 }
7568
7569 struct Operand GetOperand(struct Expression * exp)
7570 {
7571 struct Operand op =
7572 {
7573 0, 0, 0,
7574 .__anon1 = {
7575 .c = 0
7576 },
7577 {
7578 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
7579 }
7580 };
7581 struct Type * type = exp->expType;
7582
7583 if(type)
7584 {
7585 while(type->kind == 8 && type->__anon1._class && type->__anon1._class->__anon1.registered && (type->__anon1._class->__anon1.registered->type == 2 || type->__anon1._class->__anon1.registered->type == 3 || type->__anon1._class->__anon1.registered->type == 4))
7586 {
7587 if(!type->__anon1._class->__anon1.registered->dataType)
7588 type->__anon1._class->__anon1.registered->dataType = ProcessTypeString(type->__anon1._class->__anon1.registered->dataTypeString, 0);
7589 type = type->__anon1._class->__anon1.registered->dataType;
7590 }
7591 if(exp->type == 3 && op.kind == 13)
7592 {
7593 op.__anon1.ui64 = (uint64)(uintptr_t)exp->__anon1.__anon2.string;
7594 op.kind = 13;
7595 op.ops = uint64Ops;
7596 }
7597 else if(exp->isConstant && exp->type == 2)
7598 {
7599 op.kind = type->kind;
7600 op.type = type;
7601 switch(op.kind)
7602 {
7603 case 24:
7604 case 1:
7605 {
7606 if(exp->__anon1.__anon1.constant[0] == '\'')
7607 {
7608 op.__anon1.c = exp->__anon1.__anon1.constant[1];
7609 op.ops = charOps;
7610 }
7611 else if(type->isSigned)
7612 {
7613 op.__anon1.c = (char)strtol(exp->__anon1.__anon1.constant, (((void *)0)), 0);
7614 op.ops = charOps;
7615 }
7616 else
7617 {
7618 op.__anon1.uc = (unsigned char)strtoul(exp->__anon1.__anon1.constant, (((void *)0)), 0);
7619 op.ops = ucharOps;
7620 }
7621 break;
7622 }
7623 case 2:
7624 if(exp->__anon1.__anon1.constant[0] == '\'')
7625 {
7626 op.__anon1.s = exp->__anon1.__anon1.constant[1];
7627 op.ops = shortOps;
7628 }
7629 else if(type->isSigned)
7630 {
7631 op.__anon1.s = (short)strtol(exp->__anon1.__anon1.constant, (((void *)0)), 0);
7632 op.ops = shortOps;
7633 }
7634 else
7635 {
7636 op.__anon1.us = (unsigned short)strtoul(exp->__anon1.__anon1.constant, (((void *)0)), 0);
7637 op.ops = ushortOps;
7638 }
7639 break;
7640 case 3:
7641 case 5:
7642 if(exp->__anon1.__anon1.constant[0] == '\'')
7643 {
7644 op.__anon1.i = exp->__anon1.__anon1.constant[1];
7645 op.ops = intOps;
7646 }
7647 else if(type->isSigned)
7648 {
7649 op.__anon1.i = strtol(exp->__anon1.__anon1.constant, (((void *)0)), 0);
7650 op.ops = intOps;
7651 }
7652 else
7653 {
7654 op.__anon1.ui = (unsigned int)strtoul(exp->__anon1.__anon1.constant, (((void *)0)), 0);
7655 op.ops = uintOps;
7656 }
7657 op.kind = 3;
7658 break;
7659 case 4:
7660 if(type->isSigned)
7661 {
7662 op.__anon1.i64 = __ecereNameSpace__ecere__com___strtoi64(exp->__anon1.__anon1.constant, (((void *)0)), 0);
7663 op.ops = int64Ops;
7664 }
7665 else
7666 {
7667 op.__anon1.ui64 = __ecereNameSpace__ecere__com___strtoui64(exp->__anon1.__anon1.constant, (((void *)0)), 0);
7668 op.ops = uint64Ops;
7669 }
7670 op.kind = 4;
7671 break;
7672 case 22:
7673 if(type->isSigned)
7674 {
7675 op.__anon1.i64 = __ecereNameSpace__ecere__com___strtoi64(exp->__anon1.__anon1.constant, (((void *)0)), 0);
7676 op.ops = int64Ops;
7677 }
7678 else
7679 {
7680 op.__anon1.ui64 = __ecereNameSpace__ecere__com___strtoui64(exp->__anon1.__anon1.constant, (((void *)0)), 0);
7681 op.ops = uint64Ops;
7682 }
7683 op.kind = 4;
7684 break;
7685 case 23:
7686 if(type->isSigned)
7687 {
7688 op.__anon1.i64 = __ecereNameSpace__ecere__com___strtoi64(exp->__anon1.__anon1.constant, (((void *)0)), 0);
7689 op.ops = int64Ops;
7690 }
7691 else
7692 {
7693 op.__anon1.ui64 = __ecereNameSpace__ecere__com___strtoui64(exp->__anon1.__anon1.constant, (((void *)0)), 0);
7694 op.ops = uint64Ops;
7695 }
7696 op.kind = 4;
7697 break;
7698 case 6:
7699 if(!strcmp(exp->__anon1.__anon1.constant, "inf"))
7700 op.__anon1.f = __ecereMethod_float_inf();
7701 else if(!strcmp(exp->__anon1.__anon1.constant, "-inf"))
7702 op.__anon1.f = -__ecereMethod_float_inf();
7703 else if(!strcmp(exp->__anon1.__anon1.constant, "nan"))
7704 op.__anon1.f = __ecereMethod_float_nan();
7705 else if(!strcmp(exp->__anon1.__anon1.constant, "-nan"))
7706 op.__anon1.f = -__ecereMethod_float_nan();
7707 else
7708 op.__anon1.f = (float)strtod(exp->__anon1.__anon1.constant, (((void *)0)));
7709 op.ops = floatOps;
7710 break;
7711 case 7:
7712 if(!strcmp(exp->__anon1.__anon1.constant, "inf"))
7713 op.__anon1.d = __ecereMethod_double_inf();
7714 else if(!strcmp(exp->__anon1.__anon1.constant, "-inf"))
7715 op.__anon1.d = -__ecereMethod_double_inf();
7716 else if(!strcmp(exp->__anon1.__anon1.constant, "nan"))
7717 op.__anon1.d = __ecereMethod_double_nan();
7718 else if(!strcmp(exp->__anon1.__anon1.constant, "-nan"))
7719 op.__anon1.d = -__ecereMethod_double_nan();
7720 else
7721 op.__anon1.d = (double)strtod(exp->__anon1.__anon1.constant, (((void *)0)));
7722 op.ops = doubleOps;
7723 break;
7724 case 12:
7725 case 13:
7726 case 8:
7727 op.__anon1.ui64 = __ecereNameSpace__ecere__com___strtoui64(exp->__anon1.__anon1.constant, (((void *)0)), 0);
7728 op.kind = 13;
7729 op.ops = uint64Ops;
7730 break;
7731 }
7732 }
7733 }
7734 return op;
7735 }
7736
7737 static long long GetEnumValue(struct __ecereNameSpace__ecere__com__Class * _class, void * ptr)
7738 {
7739 long long v = 0;
7740
7741 switch(_class->typeSize)
7742 {
7743 case 8:
7744 if(!strcmp(_class->dataTypeString, "uint64"))
7745 v = (long long)*(uint64 *)ptr;
7746 else
7747 v = *(long long *)ptr;
7748 break;
7749 case 4:
7750 if(!strcmp(_class->dataTypeString, "uint"))
7751 v = (long long)*(unsigned int *)ptr;
7752 else
7753 v = (long long)*(int *)ptr;
7754 break;
7755 case 2:
7756 if(!strcmp(_class->dataTypeString, "uint16"))
7757 v = (long long)*(unsigned short *)ptr;
7758 else
7759 v = (long long)*(short *)ptr;
7760 break;
7761 case 1:
7762 if(!strcmp(_class->dataTypeString, "byte"))
7763 v = (long long)*(unsigned char *)ptr;
7764 else
7765 v = (long long)*(char *)ptr;
7766 break;
7767 }
7768 return v;
7769 }
7770
7771 static void GetTypeSpecs(struct Type * type, struct __ecereNameSpace__ecere__sys__OldList * specs)
7772 {
7773 if(!type->isSigned && type->kind != 22 && type->kind != 23)
7774 ListAdd(specs, MkSpecifier(UNSIGNED));
7775 switch(type->kind)
7776 {
7777 case 8:
7778 {
7779 if(type->__anon1._class->__anon1.registered)
7780 {
7781 if(!type->__anon1._class->__anon1.registered->dataType)
7782 type->__anon1._class->__anon1.registered->dataType = ProcessTypeString(type->__anon1._class->__anon1.registered->dataTypeString, 0);
7783 GetTypeSpecs(type->__anon1._class->__anon1.registered->dataType, specs);
7784 }
7785 break;
7786 }
7787 case 7:
7788 ListAdd(specs, MkSpecifier(DOUBLE));
7789 break;
7790 case 6:
7791 ListAdd(specs, MkSpecifier(FLOAT));
7792 break;
7793 case 1:
7794 ListAdd(specs, MkSpecifier(CHAR));
7795 break;
7796 case 24:
7797 ListAdd(specs, MkSpecifier(_BOOL));
7798 break;
7799 case 2:
7800 ListAdd(specs, MkSpecifier(SHORT));
7801 break;
7802 case 4:
7803 ListAdd(specs, MkSpecifier(INT64));
7804 break;
7805 case 22:
7806 ListAdd(specs, MkSpecifierName(type->isSigned ? "intptr" : "uintptr"));
7807 break;
7808 case 23:
7809 ListAdd(specs, MkSpecifierName(type->isSigned ? "intsize" : "uintsize"));
7810 break;
7811 case 3:
7812 default:
7813 ListAdd(specs, MkSpecifier(INT));
7814 break;
7815 }
7816 }
7817
7818 static void PrintTypeSpecs(struct Type * type, char * string, unsigned int fullName, unsigned int printConst)
7819 {
7820 if(type)
7821 {
7822 if(printConst && type->constant)
7823 strcat(string, "const ");
7824 switch(type->kind)
7825 {
7826 case 8:
7827 {
7828 struct Symbol * c = type->__anon1._class;
7829 unsigned int isObjectBaseClass = !c || !c->string || !strcmp(c->string, "class");
7830
7831 if(type->classObjectType == 2 && isObjectBaseClass)
7832 strcat(string, "typed_object");
7833 else if(type->classObjectType == 3 && isObjectBaseClass)
7834 strcat(string, "any_object");
7835 else
7836 {
7837 if(c && c->string)
7838 strcat(string, (fullName || !c->__anon1.registered) ? c->string : c->__anon1.registered->name);
7839 }
7840 if(type->byReference)
7841 strcat(string, " &");
7842 break;
7843 }
7844 case 0:
7845 strcat(string, "void");
7846 break;
7847 case 3:
7848 strcat(string, type->isSigned ? "int" : "uint");
7849 break;
7850 case 4:
7851 strcat(string, type->isSigned ? "int64" : "uint64");
7852 break;
7853 case 22:
7854 strcat(string, type->isSigned ? "intptr" : "uintptr");
7855 break;
7856 case 23:
7857 strcat(string, type->isSigned ? "intsize" : "uintsize");
7858 break;
7859 case 1:
7860 strcat(string, type->isSigned ? "char" : "byte");
7861 break;
7862 case 24:
7863 strcat(string, "_Bool");
7864 break;
7865 case 2:
7866 strcat(string, type->isSigned ? "short" : "uint16");
7867 break;
7868 case 6:
7869 strcat(string, "float");
7870 break;
7871 case 7:
7872 strcat(string, "double");
7873 break;
7874 case 9:
7875 if(type->__anon1.__anon1.enumName)
7876 {
7877 strcat(string, "struct ");
7878 strcat(string, type->__anon1.__anon1.enumName);
7879 }
7880 else if(type->typeName)
7881 strcat(string, type->typeName);
7882 else
7883 {
7884 struct Type * member;
7885
7886 strcat(string, "struct { ");
7887 for(member = type->__anon1.__anon1.members.first; member; member = member->next)
7888 {
7889 PrintType(member, string, 1, fullName);
7890 strcat(string, "; ");
7891 }
7892 strcat(string, "}");
7893 }
7894 break;
7895 case 10:
7896 if(type->__anon1.__anon1.enumName)
7897 {
7898 strcat(string, "union ");
7899 strcat(string, type->__anon1.__anon1.enumName);
7900 }
7901 else if(type->typeName)
7902 strcat(string, type->typeName);
7903 else
7904 {
7905 strcat(string, "union ");
7906 strcat(string, "(unnamed)");
7907 }
7908 break;
7909 case 15:
7910 if(type->__anon1.__anon1.enumName)
7911 {
7912 strcat(string, "enum ");
7913 strcat(string, type->__anon1.__anon1.enumName);
7914 }
7915 else if(type->typeName)
7916 strcat(string, type->typeName);
7917 else
7918 strcat(string, "int");
7919 break;
7920 case 14:
7921 strcat(string, "...");
7922 break;
7923 case 19:
7924 strcat(string, "subclass(");
7925 strcat(string, type->__anon1._class ? type->__anon1._class->string : "int");
7926 strcat(string, ")");
7927 break;
7928 case 20:
7929 strcat(string, type->__anon1.templateParameter->identifier->string);
7930 break;
7931 case 21:
7932 strcat(string, "thisclass");
7933 break;
7934 case 17:
7935 strcat(string, "__builtin_va_list");
7936 break;
7937 }
7938 }
7939 }
7940
7941 unsigned int RelatedUnits(struct __ecereNameSpace__ecere__com__Class * c1, struct __ecereNameSpace__ecere__com__Class * c2)
7942 {
7943 if(c1->base->type == 3)
7944 c1 = c1->base;
7945 if(c2->base->type == 3)
7946 c2 = c2->base;
7947 return c1 == c2;
7948 }
7949
7950 extern char *  __ecereNameSpace__ecere__com__PrintString(struct __ecereNameSpace__ecere__com__Class * class, const void * object, ...);
7951
7952 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass___ecereNameSpace__ecere__sys__TempFile;
7953
7954 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_ClassImport;
7955
7956 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_Symbol;
7957
7958 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_PropertyImport;
7959
7960 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_Type;
7961
7962 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_TemplatedType;
7963
7964 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_TemplateParameter;
7965
7966 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_MethodImport;
7967
7968 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_FunctionImport;
7969
7970 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_Expression;
7971
7972 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_Instantiation;
7973
7974 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass___ecereNameSpace__ecere__sys__NamedLink64;
7975
7976 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_TypeName;
7977
7978 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_Context;
7979
7980 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass___ecereNameSpace__ecere__com__Module;
7981
7982 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass___ecereNameSpace__ecere__com__LinkList;
7983
7984 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass___ecereNameSpace__ecere__com__Application;
7985
7986 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_int;
7987
7988 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass___ecereNameSpace__ecere__com__Instance;
7989
7990 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass___ecereNameSpace__ecere__sys__File;
7991
7992 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_External;
7993
7994 struct __ecereNameSpace__ecere__com__Application
7995 {
7996 int argc;
7997 const char * *  argv;
7998 int exitCode;
7999 unsigned int isGUIApp;
8000 struct __ecereNameSpace__ecere__sys__OldList allModules;
8001 char *  parsedCommand;
8002 struct __ecereNameSpace__ecere__com__NameSpace systemNameSpace;
8003 } ecere_gcc_struct;
8004
8005 static void FindNextDataMember(struct __ecereNameSpace__ecere__com__Class * _class, struct __ecereNameSpace__ecere__com__Class ** curClass, struct __ecereNameSpace__ecere__com__DataMember ** curMember, struct __ecereNameSpace__ecere__com__DataMember ** subMemberStack, int * subMemberStackPos)
8006 {
8007 if(*curMember)
8008 {
8009 *curMember = (*curMember)->next;
8010 if(subMemberStackPos && *subMemberStackPos > 0 && subMemberStack[*subMemberStackPos - 1]->type == 1)
8011 {
8012 *curMember = subMemberStack[--(*subMemberStackPos)];
8013 *curMember = (*curMember)->next;
8014 }
8015 while((*curMember) && (*curMember)->isProperty)
8016 *curMember = (*curMember)->next;
8017 if(subMemberStackPos)
8018 {
8019 while((*curMember) && !(*curMember)->isProperty && !(*curMember)->name && ((*curMember)->type == 2 || (*curMember)->type == 1))
8020 {
8021 subMemberStack[(*subMemberStackPos)++] = *curMember;
8022 *curMember = (*curMember)->members.first;
8023 while(*curMember && (*curMember)->isProperty)
8024 *curMember = (*curMember)->next;
8025 }
8026 }
8027 }
8028 while(!*curMember)
8029 {
8030 if(!*curMember)
8031 {
8032 if(subMemberStackPos && *subMemberStackPos)
8033 {
8034 *curMember = subMemberStack[--(*subMemberStackPos)];
8035 *curMember = (*curMember)->next;
8036 }
8037 else
8038 {
8039 struct __ecereNameSpace__ecere__com__Class * lastCurClass = *curClass;
8040
8041 if(*curClass == _class)
8042 break;
8043 for(*curClass = _class; (*curClass)->base != lastCurClass && (*curClass)->base->type != 1000; *curClass = (*curClass)->base)
8044 ;
8045 *curMember = (*curClass)->membersAndProperties.first;
8046 }
8047 while((*curMember) && (*curMember)->isProperty)
8048 *curMember = (*curMember)->next;
8049 if(subMemberStackPos)
8050 {
8051 while((*curMember) && !(*curMember)->isProperty && !(*curMember)->name && ((*curMember)->type == 2 || (*curMember)->type == 1))
8052 {
8053 subMemberStack[(*subMemberStackPos)++] = *curMember;
8054 *curMember = (*curMember)->members.first;
8055 while(*curMember && (*curMember)->isProperty)
8056 *curMember = (*curMember)->next;
8057 }
8058 }
8059 }
8060 }
8061 }
8062
8063 static struct GlobalData * ScanGlobalData(struct __ecereNameSpace__ecere__com__NameSpace * nameSpace, char * name)
8064 {
8065 struct __ecereNameSpace__ecere__sys__BinaryTree * tree = &nameSpace->functions;
8066 struct GlobalData * data = (struct GlobalData *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindString((&*tree), name);
8067 struct __ecereNameSpace__ecere__com__NameSpace * child;
8068
8069 if(!data)
8070 {
8071 for(child = (struct __ecereNameSpace__ecere__com__NameSpace *)__ecereProp___ecereNameSpace__ecere__sys__BinaryTree_Get_first(&nameSpace->nameSpaces); child; child = (struct __ecereNameSpace__ecere__com__NameSpace *)__ecereProp___ecereNameSpace__ecere__sys__BTNode_Get_next(((struct __ecereNameSpace__ecere__sys__BTNode *)child)))
8072 {
8073 data = ScanGlobalData(child, name);
8074 if(data)
8075 break;
8076 }
8077 }
8078 return data;
8079 }
8080
8081 static struct Symbol * ScanWithNameSpace(struct __ecereNameSpace__ecere__sys__BinaryTree * tree, const char * nameSpace, const char * name)
8082 {
8083 int nsLen = strlen(nameSpace);
8084 struct Symbol * symbol;
8085
8086 for(symbol = (struct Symbol *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindPrefix(tree, nameSpace); symbol; symbol = (struct Symbol *)__ecereProp___ecereNameSpace__ecere__sys__BTNode_Get_next(((struct __ecereNameSpace__ecere__sys__BTNode *)symbol)))
8087 {
8088 char * s = symbol->string;
8089
8090 if(!strncmp(s, nameSpace, nsLen))
8091 {
8092 int c;
8093 char * namePart;
8094
8095 for(c = strlen(s) - 1; c >= 0; c--)
8096 if(s[c] == ':')
8097 break;
8098 namePart = s + c + 1;
8099 if(!strcmp(namePart, name))
8100 {
8101 return symbol;
8102 }
8103 }
8104 else
8105 break;
8106 }
8107 return (((void *)0));
8108 }
8109
8110 unsigned int GetInt(struct Expression * exp, int * value2)
8111 {
8112 struct Operand op2 = GetOperand(exp);
8113
8114 return GetOpInt(&op2, value2);
8115 }
8116
8117 unsigned int GetUInt(struct Expression * exp, unsigned int * value2)
8118 {
8119 struct Operand op2 = GetOperand(exp);
8120
8121 return GetOpUInt(&op2, value2);
8122 }
8123
8124 unsigned int GetInt64(struct Expression * exp, long long * value2)
8125 {
8126 struct Operand op2 = GetOperand(exp);
8127
8128 return GetOpInt64(&op2, value2);
8129 }
8130
8131 unsigned int GetUInt64(struct Expression * exp, uint64 * value2)
8132 {
8133 struct Operand op2 = GetOperand(exp);
8134
8135 return GetOpUInt64(&op2, value2);
8136 }
8137
8138 unsigned int GetIntPtr(struct Expression * exp, intptr_t * value2)
8139 {
8140 struct Operand op2 = GetOperand(exp);
8141
8142 return GetOpIntPtr(&op2, value2);
8143 }
8144
8145 unsigned int GetUIntPtr(struct Expression * exp, uintptr_t * value2)
8146 {
8147 struct Operand op2 = GetOperand(exp);
8148
8149 return GetOpUIntPtr(&op2, value2);
8150 }
8151
8152 unsigned int GetIntSize(struct Expression * exp, ssize_t * value2)
8153 {
8154 struct Operand op2 = GetOperand(exp);
8155
8156 return GetOpIntSize(&op2, value2);
8157 }
8158
8159 unsigned int GetUIntSize(struct Expression * exp, size_t * value2)
8160 {
8161 struct Operand op2 = GetOperand(exp);
8162
8163 return GetOpUIntSize(&op2, value2);
8164 }
8165
8166 unsigned int GetShort(struct Expression * exp, short * value2)
8167 {
8168 struct Operand op2 = GetOperand(exp);
8169
8170 return GetOpShort(&op2, value2);
8171 }
8172
8173 unsigned int GetUShort(struct Expression * exp, unsigned short * value2)
8174 {
8175 struct Operand op2 = GetOperand(exp);
8176
8177 return GetOpUShort(&op2, value2);
8178 }
8179
8180 unsigned int GetChar(struct Expression * exp, char * value2)
8181 {
8182 struct Operand op2 = GetOperand(exp);
8183
8184 return GetOpChar(&op2, value2);
8185 }
8186
8187 unsigned int GetUChar(struct Expression * exp, unsigned char * value2)
8188 {
8189 struct Operand op2 = GetOperand(exp);
8190
8191 return GetOpUChar(&op2, value2);
8192 }
8193
8194 unsigned int GetFloat(struct Expression * exp, float * value2)
8195 {
8196 struct Operand op2 = GetOperand(exp);
8197
8198 return GetOpFloat(&op2, value2);
8199 }
8200
8201 unsigned int GetDouble(struct Expression * exp, double * value2)
8202 {
8203 struct Operand op2 = GetOperand(exp);
8204
8205 return GetOpDouble(&op2, value2);
8206 }
8207
8208 static void PrePrintType(struct Type * type, char * string, unsigned int fullName, struct Type * parentType, unsigned int printConst)
8209 {
8210 if(type->kind == 12 || type->kind == 13 || type->kind == 11 || type->kind == 16)
8211 {
8212 if((type->kind == 11 || type->kind == 16) && (!parentType || parentType->kind != 13))
8213 PrintAttribs(type, string);
8214 if(printConst && type->constant && (type->kind == 11 || type->kind == 16))
8215 strcat(string, " const");
8216 PrePrintType(type->kind == 16 ? type->__anon1.__anon3.method->dataType : type->__anon1.type, string, fullName, type, printConst);
8217 if(type->kind == 13 && (type->__anon1.type->kind == 12 || type->__anon1.type->kind == 11 || type->__anon1.type->kind == 16))
8218 strcat(string, " (");
8219 if(type->kind == 13)
8220 {
8221 if(type->__anon1.type->kind == 11 || type->__anon1.type->kind == 16)
8222 PrintAttribs(type->__anon1.type, string);
8223 }
8224 if(type->kind == 13)
8225 {
8226 if(type->__anon1.type->kind == 11 || type->__anon1.type->kind == 16 || type->__anon1.type->kind == 12)
8227 strcat(string, "*");
8228 else
8229 strcat(string, " *");
8230 }
8231 if(printConst && type->constant && type->kind == 13)
8232 strcat(string, " const");
8233 }
8234 else
8235 PrintTypeSpecs(type, string, fullName, printConst);
8236 }
8237
8238 void PrintExpression(struct Expression * exp, char * string)
8239 {
8240 {
8241 struct __ecereNameSpace__ecere__com__Instance * f = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass___ecereNameSpace__ecere__sys__TempFile);
8242 int count;
8243 unsigned int backOutputLineNumbers = outputLineNumbers;
8244
8245 outputLineNumbers = 0;
8246 if(exp)
8247 OutputExpression(exp, f);
8248 ((unsigned int (*)(struct __ecereNameSpace__ecere__com__Instance *, int pos, int mode))__extension__ ({
8249 struct __ecereNameSpace__ecere__com__Instance * __internal_ClassInst = f;
8250
8251 __internal_ClassInst ? __internal_ClassInst->_vTbl : __ecereClass___ecereNameSpace__ecere__sys__TempFile->_vTbl;
8252 })[__ecereVMethodID___ecereNameSpace__ecere__sys__File_Seek])(f, 0, 0);
8253 count = strlen(string);
8254 count += ((int (*)(struct __ecereNameSpace__ecere__com__Instance *, void *  buffer, unsigned int size, unsigned int count))__extension__ ({
8255 struct __ecereNameSpace__ecere__com__Instance * __internal_ClassInst = f;
8256
8257 __internal_ClassInst ? __internal_ClassInst->_vTbl : __ecereClass___ecereNameSpace__ecere__sys__TempFile->_vTbl;
8258 })[__ecereVMethodID___ecereNameSpace__ecere__sys__File_Read])(f, string + count, 1, 1023);
8259 string[count] = '\0';
8260 (__ecereNameSpace__ecere__com__eInstance_DecRef(f), f = 0);
8261 outputLineNumbers = backOutputLineNumbers;
8262 }
8263 }
8264
8265 struct Type * Dereference(struct Type * source)
8266 {
8267 struct Type * type = (((void *)0));
8268
8269 if(source)
8270 {
8271 if(source->kind == 13 || source->kind == 12)
8272 {
8273 type = source->__anon1.type;
8274 source->__anon1.type->refCount++;
8275 }
8276 else if(source->kind == 8 && !strcmp(source->__anon1._class->string, "String"))
8277 {
8278 type = __extension__ ({
8279 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
8280
8281 __ecereInstance1->kind = 1, __ecereInstance1->refCount = 1, __ecereInstance1;
8282 });
8283 }
8284 else if(source->kind == 8 && source->__anon1._class && source->__anon1._class->__anon1.registered && source->__anon1._class->__anon1.registered->type == 5)
8285 {
8286 type = source;
8287 source->refCount++;
8288 }
8289 else
8290 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "cannot dereference type\n", (((void *)0))));
8291 }
8292 return type;
8293 }
8294
8295 static struct Type * Reference(struct Type * source)
8296 {
8297 struct Type * type = (((void *)0));
8298
8299 if(source)
8300 {
8301 type = __extension__ ({
8302 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
8303
8304 __ecereInstance1->kind = 13, __ecereInstance1->__anon1.type = source, __ecereInstance1->refCount = 1, __ecereInstance1;
8305 });
8306 source->refCount++;
8307 }
8308 return type;
8309 }
8310
8311 void modifyPassAsTemplate(struct Type ** typePtr, unsigned int value)
8312 {
8313 if(*typePtr && (*typePtr)->passAsTemplate != value)
8314 {
8315 struct Type * type = (type = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type), type->refCount = 1, type);
8316
8317 CopyTypeInto(type, *typePtr);
8318 type->passAsTemplate = value;
8319 FreeType(*typePtr);
8320 *typePtr = type;
8321 }
8322 }
8323
8324 void ReplaceExpContents(struct Expression * checkedExp, struct Expression * newExp)
8325 {
8326 struct Expression * prev = checkedExp->prev, * next = checkedExp->next;
8327
8328 FreeExpContents(checkedExp);
8329 FreeType(checkedExp->expType);
8330 FreeType(checkedExp->destType);
8331 *checkedExp = *newExp;
8332 ((newExp ? __extension__ ({
8333 void * __ecerePtrToDelete = (newExp);
8334
8335 __ecereClass_Expression->Destructor ? __ecereClass_Expression->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete);
8336 }) : 0), newExp = 0);
8337 checkedExp->prev = prev;
8338 checkedExp->next = next;
8339 }
8340
8341 void FinishTemplatesContext(struct Context * context)
8342 {
8343 PopContext(context);
8344 FreeContext(context);
8345 ((context ? __extension__ ({
8346 void * __ecerePtrToDelete = (context);
8347
8348 __ecereClass_Context->Destructor ? __ecereClass_Context->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete);
8349 }) : 0), context = 0);
8350 }
8351
8352 static __attribute__((unused)) void UnusedFunction()
8353 {
8354 int a;
8355
8356 ((const char *  (*)(struct __ecereNameSpace__ecere__com__Class *, const void *, char *  tempString, void *  fieldData, unsigned int *  needClass))__ecereClass_int->_vTbl[__ecereVMethodID_class_OnGetString])(__ecereClass_int, (void *)&a, 0, 0, 0);
8357 }
8358
8359 struct Expression * ParseExpressionString(char * expression)
8360 {
8361 parseError = 0;
8362 fileInput = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass___ecereNameSpace__ecere__sys__TempFile);
8363 ((int (*)(struct __ecereNameSpace__ecere__com__Instance *, const void *  buffer, unsigned int size, unsigned int count))__extension__ ({
8364 struct __ecereNameSpace__ecere__com__Instance * __internal_ClassInst = fileInput;
8365
8366 __internal_ClassInst ? __internal_ClassInst->_vTbl : __ecereClass___ecereNameSpace__ecere__sys__File->_vTbl;
8367 })[__ecereVMethodID___ecereNameSpace__ecere__sys__File_Write])(fileInput, expression, 1, strlen(expression));
8368 ((unsigned int (*)(struct __ecereNameSpace__ecere__com__Instance *, int pos, int mode))__extension__ ({
8369 struct __ecereNameSpace__ecere__com__Instance * __internal_ClassInst = fileInput;
8370
8371 __internal_ClassInst ? __internal_ClassInst->_vTbl : __ecereClass___ecereNameSpace__ecere__sys__File->_vTbl;
8372 })[__ecereVMethodID___ecereNameSpace__ecere__sys__File_Seek])(fileInput, 0, 0);
8373 echoOn = 0;
8374 parsedExpression = (((void *)0));
8375 resetScanner();
8376 expression_yyparse();
8377 (__ecereNameSpace__ecere__com__eInstance_DecRef(fileInput), fileInput = 0);
8378 return parsedExpression;
8379 }
8380
8381 struct __ecereNameSpace__ecere__com__Module
8382 {
8383 struct __ecereNameSpace__ecere__com__Instance * application;
8384 struct __ecereNameSpace__ecere__sys__OldList classes;
8385 struct __ecereNameSpace__ecere__sys__OldList defines;
8386 struct __ecereNameSpace__ecere__sys__OldList functions;
8387 struct __ecereNameSpace__ecere__sys__OldList modules;
8388 struct __ecereNameSpace__ecere__com__Instance * prev;
8389 struct __ecereNameSpace__ecere__com__Instance * next;
8390 const char *  name;
8391 void *  library;
8392 void *  Unload;
8393 int importType;
8394 int origImportType;
8395 struct __ecereNameSpace__ecere__com__NameSpace privateNameSpace;
8396 struct __ecereNameSpace__ecere__com__NameSpace publicNameSpace;
8397 } ecere_gcc_struct;
8398
8399 static struct GlobalData * FindGlobalData(char * name)
8400 {
8401 int start = 0, c;
8402 struct __ecereNameSpace__ecere__com__NameSpace * nameSpace;
8403
8404 nameSpace = globalData;
8405 for(c = 0; name[c]; c++)
8406 {
8407 if(name[c] == '.' || (name[c] == ':' && name[c + 1] == ':'))
8408 {
8409 struct __ecereNameSpace__ecere__com__NameSpace * newSpace;
8410 char * spaceName = __ecereNameSpace__ecere__com__eSystem_New(sizeof(char) * (c - start + 1));
8411
8412 strncpy(spaceName, name + start, c - start);
8413 spaceName[c - start] = '\0';
8414 newSpace = (struct __ecereNameSpace__ecere__com__NameSpace *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindString(&(*nameSpace).nameSpaces, spaceName);
8415 (__ecereNameSpace__ecere__com__eSystem_Delete(spaceName), spaceName = 0);
8416 if(!newSpace)
8417 return (((void *)0));
8418 nameSpace = newSpace;
8419 if(name[c] == ':')
8420 c++;
8421 start = c + 1;
8422 }
8423 }
8424 if(c - start)
8425 {
8426 return ScanGlobalData(nameSpace, name + start);
8427 }
8428 return (((void *)0));
8429 }
8430
8431 static struct Symbol * FindWithNameSpace(struct __ecereNameSpace__ecere__sys__BinaryTree * tree, const char * name)
8432 {
8433 int c;
8434 char nameSpace[1024];
8435 const char * namePart;
8436 unsigned int gotColon = 0;
8437
8438 nameSpace[0] = '\0';
8439 for(c = strlen(name) - 1; c >= 0; c--)
8440 if(name[c] == ':')
8441 {
8442 gotColon = 1;
8443 break;
8444 }
8445 namePart = name + c + 1;
8446 while(c >= 0 && name[c] == ':')
8447 c--;
8448 if(c >= 0)
8449 {
8450 struct Symbol * symbol = (struct Symbol *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindString(tree, name);
8451
8452 if(symbol)
8453 return symbol;
8454 memcpy(nameSpace, name, c + 1);
8455 nameSpace[c + 1] = 0;
8456 return ScanWithNameSpace(tree, nameSpace, namePart);
8457 }
8458 else if(gotColon)
8459 {
8460 struct Symbol * symbol = (struct Symbol *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindString(tree, namePart);
8461
8462 return symbol;
8463 }
8464 else
8465 {
8466 struct Symbol * symbol = (struct Symbol *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindString(tree, namePart);
8467
8468 if(symbol)
8469 return symbol;
8470 return ScanWithNameSpace(tree, "", namePart);
8471 }
8472 return (((void *)0));
8473 }
8474
8475 static void PrintArraySize(struct Type * arrayType, char * string)
8476 {
8477 char size[256];
8478
8479 size[0] = '\0';
8480 strcat(size, "[");
8481 if(arrayType->__anon1.__anon4.enumClass)
8482 strcat(size, arrayType->__anon1.__anon4.enumClass->string);
8483 else if(arrayType->__anon1.__anon4.arraySizeExp)
8484 PrintExpression(arrayType->__anon1.__anon4.arraySizeExp, size);
8485 strcat(size, "]");
8486 strcat(string, size);
8487 }
8488
8489 void __ecereUnregisterModule_pass15(struct __ecereNameSpace__ecere__com__Instance * module)
8490 {
8491
8492 }
8493
8494 static void PostPrintType(struct Type * type, char * string, unsigned int fullName)
8495 {
8496 if(type->kind == 13 && (type->__anon1.type->kind == 12 || type->__anon1.type->kind == 11 || type->__anon1.type->kind == 16))
8497 strcat(string, ")");
8498 if(type->kind == 12)
8499 PrintArraySize(type, string);
8500 else if(type->kind == 11)
8501 {
8502 struct Type * param;
8503
8504 strcat(string, "(");
8505 for(param = type->__anon1.__anon2.params.first; param; param = param->next)
8506 {
8507 PrintType(param, string, 1, fullName);
8508 if(param->next)
8509 strcat(string, ", ");
8510 }
8511 strcat(string, ")");
8512 }
8513 if(type->kind == 12 || type->kind == 13 || type->kind == 11 || type->kind == 16)
8514 PostPrintType(type->kind == 16 ? type->__anon1.__anon3.method->dataType : type->__anon1.type, string, fullName);
8515 }
8516
8517 static void _PrintType(struct Type * type, char * string, unsigned int printName, unsigned int fullName, unsigned int printConst)
8518 {
8519 PrePrintType(type, string, fullName, (((void *)0)), printConst);
8520 if(type->__anon1.__anon2.thisClass || (printName && type->name && type->name[0]))
8521 strcat(string, " ");
8522 if((type->__anon1.__anon2.thisClass || type->__anon1.__anon2.staticMethod))
8523 {
8524 struct Symbol * _class = type->__anon1.__anon2.thisClass;
8525
8526 if((type->classObjectType == 2 || type->classObjectType == 1) || (_class && !strcmp(_class->string, "class")))
8527 {
8528 if(type->classObjectType == 1)
8529 strcat(string, "class");
8530 else
8531 strcat(string, type->byReference ? "typed_object&" : "typed_object");
8532 }
8533 else if(_class && _class->string)
8534 {
8535 char * s = _class->string;
8536
8537 if(fullName)
8538 strcat(string, s);
8539 else
8540 {
8541 char * name = __ecereNameSpace__ecere__sys__RSearchString(s, "::", strlen(s), 1, 0);
8542
8543 if(name)
8544 name += 2;
8545 else
8546 name = s;
8547 strcat(string, name);
8548 }
8549 }
8550 strcat(string, "::");
8551 }
8552 if(printName && type->name)
8553 PrintName(type, string, fullName);
8554 PostPrintType(type, string, fullName);
8555 if(type->bitFieldCount)
8556 {
8557 char count[100];
8558
8559 sprintf(count, ":%d", type->bitFieldCount);
8560 strcat(string, count);
8561 }
8562 }
8563
8564 struct Conversion;
8565
8566 struct Conversion
8567 {
8568 struct Conversion * prev, * next;
8569 struct __ecereNameSpace__ecere__com__Property * convert;
8570 unsigned int isGet;
8571 struct Type * resultType;
8572 } ecere_gcc_struct;
8573
8574 static void FreeConvert(struct Conversion * convert)
8575 {
8576 if(convert->resultType)
8577 FreeType(convert->resultType);
8578 }
8579
8580 struct Enumerator;
8581
8582 struct Enumerator
8583 {
8584 struct Enumerator * prev;
8585 struct Enumerator * next;
8586 struct Location loc;
8587 struct Identifier * id;
8588 struct Expression * exp;
8589 } ecere_gcc_struct;
8590
8591 struct AsmField;
8592
8593 struct AsmField
8594 {
8595 struct AsmField * prev;
8596 struct AsmField * next;
8597 struct Location loc;
8598 char *  command;
8599 struct Expression * expression;
8600 struct Identifier * symbolic;
8601 } ecere_gcc_struct;
8602
8603 struct ClassDefinition;
8604
8605 struct Context
8606 {
8607 struct Context * parent;
8608 struct __ecereNameSpace__ecere__sys__BinaryTree types;
8609 struct __ecereNameSpace__ecere__sys__BinaryTree classes;
8610 struct __ecereNameSpace__ecere__sys__BinaryTree symbols;
8611 struct __ecereNameSpace__ecere__sys__BinaryTree structSymbols;
8612 int nextID;
8613 int simpleID;
8614 struct __ecereNameSpace__ecere__sys__BinaryTree templateTypes;
8615 struct ClassDefinition * classDef;
8616 unsigned int templateTypesOnly;
8617 unsigned int hasNameSpace;
8618 } ecere_gcc_struct;
8619
8620 struct External
8621 {
8622 struct External * prev;
8623 struct External * next;
8624 struct Location loc;
8625 int type;
8626 struct Symbol * symbol;
8627 union
8628 {
8629 struct FunctionDefinition * function;
8630 struct ClassDefinition * _class;
8631 struct Declaration * declaration;
8632 char *  importString;
8633 struct Identifier * id;
8634 struct DBTableDef * table;
8635 } ecere_gcc_struct __anon1;
8636 int importType;
8637 struct External * fwdDecl;
8638 struct __ecereNameSpace__ecere__com__Instance * outgoing;
8639 struct __ecereNameSpace__ecere__com__Instance * incoming;
8640 int nonBreakableIncoming;
8641 } ecere_gcc_struct;
8642
8643 struct ClassDefinition
8644 {
8645 struct ClassDefinition * prev;
8646 struct ClassDefinition * next;
8647 struct Location loc;
8648 struct Specifier * _class;
8649 struct __ecereNameSpace__ecere__sys__OldList *  baseSpecs;
8650 struct __ecereNameSpace__ecere__sys__OldList *  definitions;
8651 struct Symbol * symbol;
8652 struct Location blockStart;
8653 struct Location nameLoc;
8654 int declMode;
8655 unsigned int deleteWatchable;
8656 } ecere_gcc_struct;
8657
8658 void __ecereMethod_External_CreateUniqueEdge(struct External * this, struct External * from, unsigned int soft);
8659
8660 void __ecereMethod_External_CreateEdge(struct External * this, struct External * from, unsigned int soft);
8661
8662 void DeclareGlobalData(struct External * neededFor, struct GlobalData * data)
8663 {
8664 struct Symbol * symbol = data->symbol;
8665
8666 if(!symbol || !symbol->__anon2.__anon1.pointerExternal)
8667 {
8668 if(inCompiler)
8669 {
8670 if(!symbol)
8671 symbol = data->symbol = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Symbol);
8672 }
8673 if(!data->dataType)
8674 data->dataType = ProcessTypeString(data->dataTypeString, 0);
8675 if(inCompiler)
8676 {
8677 struct Declaration * decl;
8678 struct __ecereNameSpace__ecere__sys__OldList * specifiers, * declarators;
8679 struct Declarator * d;
8680 struct External * external;
8681
8682 specifiers = MkList();
8683 declarators = MkList();
8684 ListAdd(specifiers, MkSpecifier(EXTERN));
8685 d = MkDeclaratorIdentifier(MkIdentifier(data->fullName));
8686 d = SpecDeclFromString(data->dataTypeString, specifiers, d);
8687 ListAdd(declarators, MkInitDeclarator(d, (((void *)0))));
8688 decl = MkDeclaration(specifiers, declarators);
8689 external = MkExternalDeclaration(decl);
8690 if(curExternal)
8691 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*ast), curExternal->prev, external);
8692 external->symbol = symbol;
8693 symbol->__anon2.__anon1.pointerExternal = external;
8694 DeclareType(external, data->dataType, 1, 1);
8695 }
8696 }
8697 if(inCompiler && neededFor && symbol && symbol->__anon2.__anon1.pointerExternal)
8698 __ecereMethod_External_CreateUniqueEdge(neededFor, symbol->__anon2.__anon1.pointerExternal, 0);
8699 }
8700
8701 struct Symbol * FindSymbol(const char * name, struct Context * startContext, struct Context * endContext, unsigned int isStruct, unsigned int globalNameSpace)
8702 {
8703 struct Context * ctx;
8704 struct Symbol * symbol = (((void *)0));
8705
8706 for(ctx = startContext; ctx && !symbol; ctx = ctx->parent)
8707 {
8708 if(ctx == globalContext && !globalNameSpace && ctx->hasNameSpace)
8709 {
8710 symbol = (((void *)0));
8711 if(thisNameSpace)
8712 {
8713 char curName[1024];
8714
8715 strcpy(curName, thisNameSpace);
8716 strcat(curName, "::");
8717 strcat(curName, name);
8718 symbol = FindWithNameSpace(isStruct ? &ctx->structSymbols : &ctx->symbols, curName);
8719 }
8720 if(!symbol)
8721 symbol = FindWithNameSpace(isStruct ? &ctx->structSymbols : &ctx->symbols, name);
8722 }
8723 else
8724 symbol = (struct Symbol *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindString((isStruct ? &ctx->structSymbols : &ctx->symbols), name);
8725 if(symbol || ctx == endContext)
8726 break;
8727 }
8728 if(inCompiler && symbol && ctx == globalContext && symbol->__anon2.__anon1.pointerExternal && curExternal && symbol->__anon2.__anon1.pointerExternal != curExternal)
8729 __ecereMethod_External_CreateUniqueEdge(curExternal, symbol->__anon2.__anon1.pointerExternal, symbol->__anon2.__anon1.pointerExternal->type == 0);
8730 return symbol;
8731 }
8732
8733 struct PropertyDef;
8734
8735 struct ClassDef
8736 {
8737 struct ClassDef * prev;
8738 struct ClassDef * next;
8739 struct Location loc;
8740 int type;
8741 union
8742 {
8743 struct Declaration * decl;
8744 struct ClassFunction * function;
8745 struct __ecereNameSpace__ecere__sys__OldList *  defProperties;
8746 struct PropertyDef * propertyDef;
8747 struct PropertyWatch * propertyWatch;
8748 char *  designer;
8749 struct Identifier * defaultProperty;
8750 struct
8751 {
8752 struct Identifier * id;
8753 struct Initializer * initializer;
8754 } ecere_gcc_struct __anon1;
8755 } ecere_gcc_struct __anon1;
8756 int memberAccess;
8757 void *  object;
8758 } ecere_gcc_struct;
8759
8760 struct PropertyDef
8761 {
8762 struct PropertyDef * prev;
8763 struct PropertyDef * next;
8764 struct Location loc;
8765 struct __ecereNameSpace__ecere__sys__OldList *  specifiers;
8766 struct Declarator * declarator;
8767 struct Identifier * id;
8768 struct Statement * getStmt;
8769 struct Statement * setStmt;
8770 struct Statement * issetStmt;
8771 struct Symbol * symbol;
8772 struct Expression * category;
8773 struct
8774 {
8775 unsigned int conversion : 1;
8776 unsigned int isWatchable : 1;
8777 unsigned int isDBProp : 1;
8778 } ecere_gcc_struct __anon1;
8779 } ecere_gcc_struct;
8780
8781 static void IdentifyAnonStructs(struct __ecereNameSpace__ecere__sys__OldList * definitions)
8782 {
8783 struct ClassDef * def;
8784 int anonID = 1;
8785
8786 for(def = (*definitions).first; def; def = def->next)
8787 {
8788 if(def->type == 2)
8789 {
8790 struct Declaration * decl = def->__anon1.decl;
8791
8792 if(decl && decl->__anon1.__anon1.specifiers)
8793 {
8794 struct Specifier * spec;
8795 unsigned int isStruct = 0;
8796
8797 for(spec = (*decl->__anon1.__anon1.specifiers).first; spec; spec = spec->next)
8798 {
8799 if(spec->type == 3 || spec->type == 4)
8800 {
8801 if(spec->__anon1.__anon2.definitions)
8802 IdentifyAnonStructs(spec->__anon1.__anon2.definitions);
8803 isStruct = 1;
8804 }
8805 }
8806 if(isStruct)
8807 {
8808 struct Declarator * d = (((void *)0));
8809
8810 if(decl->__anon1.__anon1.declarators)
8811 {
8812 for(d = (*decl->__anon1.__anon1.declarators).first; d; d = d->next)
8813 {
8814 struct Identifier * idDecl = GetDeclId(d);
8815
8816 if(idDecl)
8817 break;
8818 }
8819 }
8820 if(!d)
8821 {
8822 char id[100];
8823
8824 sprintf(id, "__anon%d", anonID++);
8825 if(!decl->__anon1.__anon1.declarators)
8826 decl->__anon1.__anon1.declarators = MkList();
8827 ListAdd(decl->__anon1.__anon1.declarators, MkDeclaratorIdentifier(MkIdentifier(id)));
8828 }
8829 }
8830 }
8831 }
8832 }
8833 }
8834
8835 struct MemberInit;
8836
8837 typedef union YYSTYPE
8838 {
8839 int specifierType;
8840 int i;
8841 int declMode;
8842 struct Identifier * id;
8843 struct Expression * exp;
8844 struct Specifier * specifier;
8845 struct __ecereNameSpace__ecere__sys__OldList * list;
8846 struct Enumerator * enumerator;
8847 struct Declarator * declarator;
8848 struct Pointer * pointer;
8849 struct Initializer * initializer;
8850 struct InitDeclarator * initDeclarator;
8851 struct TypeName * typeName;
8852 struct Declaration * declaration;
8853 struct Statement * stmt;
8854 struct FunctionDefinition * function;
8855 struct External * external;
8856 struct Context * context;
8857 struct AsmField * asmField;
8858 struct Attrib * attrib;
8859 struct ExtDecl * extDecl;
8860 struct Attribute * attribute;
8861 struct Instantiation * instance;
8862 struct MembersInit * membersInit;
8863 struct MemberInit * memberInit;
8864 struct ClassFunction * classFunction;
8865 struct ClassDefinition * _class;
8866 struct ClassDef * classDef;
8867 struct PropertyDef * prop;
8868 char * string;
8869 struct Symbol * symbol;
8870 struct PropertyWatch * propertyWatch;
8871 struct TemplateParameter * templateParameter;
8872 struct TemplateArgument * templateArgument;
8873 struct TemplateDatatype * templateDatatype;
8874 struct DBTableEntry * dbtableEntry;
8875 struct DBIndexItem * dbindexItem;
8876 struct DBTableDef * dbtableDef;
8877 } ecere_gcc_struct YYSTYPE;
8878
8879 extern YYSTYPE yylval;
8880
8881 struct MemberInit
8882 {
8883 struct MemberInit * prev;
8884 struct MemberInit * next;
8885 struct Location loc;
8886 struct Location realLoc;
8887 struct __ecereNameSpace__ecere__sys__OldList *  identifiers;
8888 struct Initializer * initializer;
8889 unsigned int used;
8890 unsigned int variable;
8891 unsigned int takeOutExp;
8892 } ecere_gcc_struct;
8893
8894 extern struct MemberInit * MkMemberInit(struct __ecereNameSpace__ecere__sys__OldList * ids, struct Initializer * initializer);
8895
8896 struct __ecereNameSpace__ecere__com__ClassTemplateParameter;
8897
8898 struct __ecereNameSpace__ecere__com__ClassTemplateParameter
8899 {
8900 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * prev;
8901 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * next;
8902 const char *  name;
8903 int type;
8904 union
8905 {
8906 const char *  dataTypeString;
8907 int memberType;
8908 } ecere_gcc_struct __anon1;
8909 struct __ecereNameSpace__ecere__com__ClassTemplateArgument defaultArg;
8910 void *  param;
8911 } ecere_gcc_struct;
8912
8913 struct __ecereNameSpace__ecere__com__ClassTemplateArgument * FindTemplateArg(struct __ecereNameSpace__ecere__com__Class * _class, struct TemplateParameter * param)
8914 {
8915 struct __ecereNameSpace__ecere__com__ClassTemplateArgument * arg = (((void *)0));
8916 int id = 0;
8917 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * curParam = (((void *)0));
8918 struct __ecereNameSpace__ecere__com__Class * sClass;
8919
8920 for(sClass = _class; sClass; sClass = sClass->base)
8921 {
8922 id = 0;
8923 if(sClass->templateClass)
8924 sClass = sClass->templateClass;
8925 for(curParam = sClass->templateParams.first; curParam; curParam = curParam->next)
8926 {
8927 if(curParam->type == 0 && !strcmp(param->identifier->string, curParam->name))
8928 {
8929 for(sClass = sClass->base; sClass; sClass = sClass->base)
8930 {
8931 if(sClass->templateClass)
8932 sClass = sClass->templateClass;
8933 id += sClass->templateParams.count;
8934 }
8935 break;
8936 }
8937 id++;
8938 }
8939 if(curParam)
8940 break;
8941 }
8942 if(curParam)
8943 {
8944 arg = &_class->templateArgs[id];
8945 if(arg && param->type == 0)
8946 (*arg).__anon1.__anon1.dataTypeClass = __ecereNameSpace__ecere__com__eSystem_FindClass(_class->module, (*arg).__anon1.__anon1.dataTypeString);
8947 }
8948 return arg;
8949 }
8950
8951 struct Context * SetupTemplatesContext(struct __ecereNameSpace__ecere__com__Class * _class)
8952 {
8953 struct Context * context = PushContext();
8954
8955 context->templateTypesOnly = 1;
8956 if(_class->symbol && ((struct Symbol *)_class->symbol)->templateParams)
8957 {
8958 struct TemplateParameter * param = (*((struct Symbol *)_class->symbol)->templateParams).first;
8959
8960 for(; param; param = param->next)
8961 {
8962 if(param->type == 0 && param->identifier)
8963 {
8964 struct TemplatedType * type = (type = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_TemplatedType), type->key = (uintptr_t)param->identifier->string, type->param = param, type);
8965
8966 __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Add(&curContext->templateTypes, (struct __ecereNameSpace__ecere__sys__BTNode *)type);
8967 }
8968 }
8969 }
8970 else if(_class)
8971 {
8972 struct __ecereNameSpace__ecere__com__Class * sClass;
8973
8974 for(sClass = _class; sClass; sClass = sClass->base)
8975 {
8976 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * p;
8977
8978 for(p = sClass->templateParams.first; p; p = p->next)
8979 {
8980 if(p->type == 0)
8981 {
8982 struct TemplateParameter * param = p->param;
8983 struct TemplatedType * type;
8984
8985 if(!param)
8986 {
8987 p->param = param = __extension__ ({
8988 struct TemplateParameter * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_TemplateParameter);
8989
8990 __ecereInstance1->identifier = MkIdentifier(p->name), __ecereInstance1->type = p->type, __ecereInstance1->dataTypeString = p->__anon1.dataTypeString, __ecereInstance1;
8991 });
8992 }
8993 type = __extension__ ({
8994 struct TemplatedType * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_TemplatedType);
8995
8996 __ecereInstance1->key = (uintptr_t)p->name, __ecereInstance1->param = param, __ecereInstance1;
8997 });
8998 __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Add(&curContext->templateTypes, (struct __ecereNameSpace__ecere__sys__BTNode *)type);
8999 }
9000 }
9001 }
9002 }
9003 return context;
9004 }
9005
9006 char * ReplaceThisClass(struct __ecereNameSpace__ecere__com__Class * _class)
9007 {
9008 if(thisClassParams && _class->templateParams.count && !_class->templateClass)
9009 {
9010 unsigned int first = 1;
9011 int p = 0;
9012 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * param;
9013 int lastParam = -1;
9014 char className[1024];
9015
9016 strcpy(className, _class->fullName);
9017 for(param = _class->templateParams.first; param; param = param->next)
9018 {
9019 {
9020 if(first)
9021 strcat(className, "<");
9022 if(!first)
9023 strcat(className, ", ");
9024 if(lastParam + 1 != p)
9025 {
9026 strcat(className, param->name);
9027 strcat(className, " = ");
9028 }
9029 strcat(className, param->name);
9030 first = 0;
9031 lastParam = p;
9032 }
9033 p++;
9034 }
9035 if(!first)
9036 {
9037 int len = strlen(className);
9038
9039 if(className[len - 1] == '>')
9040 className[len++] = ' ';
9041 className[len++] = '>';
9042 className[len++] = '\0';
9043 }
9044 return __ecereNameSpace__ecere__sys__CopyString(className);
9045 }
9046 else
9047 return __ecereNameSpace__ecere__sys__CopyString(_class->fullName);
9048 }
9049
9050 struct Type * ReplaceThisClassType(struct __ecereNameSpace__ecere__com__Class * _class)
9051 {
9052 struct Type * type;
9053
9054 if(thisClassParams && _class->templateParams.count && !_class->templateClass)
9055 {
9056 unsigned int first = 1;
9057 int p = 0;
9058 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * param;
9059 int lastParam = -1;
9060 char className[1024];
9061
9062 strcpy(className, _class->fullName);
9063 for(param = _class->templateParams.first; param; param = param->next)
9064 {
9065 {
9066 if(first)
9067 strcat(className, "<");
9068 if(!first)
9069 strcat(className, ", ");
9070 if(lastParam + 1 != p)
9071 {
9072 strcat(className, param->name);
9073 strcat(className, " = ");
9074 }
9075 strcat(className, param->name);
9076 first = 0;
9077 lastParam = p;
9078 }
9079 p++;
9080 }
9081 if(!first)
9082 {
9083 int len = strlen(className);
9084
9085 if(className[len - 1] == '>')
9086 className[len++] = ' ';
9087 className[len++] = '>';
9088 className[len++] = '\0';
9089 }
9090 type = MkClassType(className);
9091 }
9092 else
9093 {
9094 type = MkClassType(_class->fullName);
9095 }
9096 return type;
9097 }
9098
9099 static int DeclareMembers(struct External * neededBy, struct __ecereNameSpace__ecere__com__Class * _class, unsigned int isMember)
9100 {
9101 struct __ecereNameSpace__ecere__com__DataMember * topMember = isMember ? (struct __ecereNameSpace__ecere__com__DataMember *)_class : (((void *)0));
9102 struct __ecereNameSpace__ecere__com__DataMember * member;
9103 struct Context * context = isMember ? (((void *)0)) : SetupTemplatesContext(_class);
9104
9105 if(!isMember && (_class->type == 1 || _class->type == 5) && _class->base->type != 1000)
9106 DeclareMembers(neededBy, _class->base, 0);
9107 for(member = isMember ? topMember->members.first : _class->membersAndProperties.first; member; member = member->next)
9108 {
9109 if(!member->isProperty)
9110 {
9111 switch(member->type)
9112 {
9113 case 0:
9114 {
9115 if(!member->dataType && member->dataTypeString)
9116 member->dataType = ProcessTypeString(member->dataTypeString, 0);
9117 if(member->dataType)
9118 DeclareType(neededBy, member->dataType, 1, 0);
9119 break;
9120 }
9121 case 1:
9122 case 2:
9123 {
9124 DeclareMembers(neededBy, (struct __ecereNameSpace__ecere__com__Class *)member, 1);
9125 break;
9126 }
9127 }
9128 }
9129 }
9130 if(context)
9131 FinishTemplatesContext(context);
9132 return topMember ? topMember->memberID : _class->memberID;
9133 }
9134
9135 void ProcessMethodType(struct __ecereNameSpace__ecere__com__Method * method)
9136 {
9137 if(!method->dataType)
9138 {
9139 struct Context * context = SetupTemplatesContext(method->_class);
9140
9141 method->dataType = ProcessTypeString(method->dataTypeString, 0);
9142 FinishTemplatesContext(context);
9143 if(method->type != 1 && method->dataType)
9144 {
9145 if(!method->dataType->__anon1.__anon2.thisClass && !method->dataType->__anon1.__anon2.staticMethod)
9146 {
9147 if(!method->_class->symbol)
9148 method->_class->symbol = FindClass(method->_class->fullName);
9149 method->dataType->__anon1.__anon2.thisClass = method->_class->symbol;
9150 }
9151 }
9152 }
9153 }
9154
9155 void ProcessPropertyType(struct __ecereNameSpace__ecere__com__Property * prop)
9156 {
9157 if(!prop->dataType)
9158 {
9159 struct Context * context = SetupTemplatesContext(prop->_class);
9160
9161 prop->dataType = ProcessTypeString(prop->dataTypeString, 0);
9162 FinishTemplatesContext(context);
9163 }
9164 }
9165
9166 void ReplaceThisClassSpecifiers(struct __ecereNameSpace__ecere__sys__OldList * specs, struct __ecereNameSpace__ecere__com__Class * _class)
9167 {
9168 if(specs != (((void *)0)) && _class)
9169 {
9170 struct Specifier * spec;
9171
9172 for(spec = specs->first; spec; spec = spec->next)
9173 {
9174 if(spec->type == 0 && spec->__anon1.specifier == THISCLASS)
9175 {
9176 spec->type = 1;
9177 spec->__anon1.__anon1.name = ReplaceThisClass(_class);
9178 spec->__anon1.__anon1.symbol = FindClass(spec->__anon1.__anon1.name);
9179 }
9180 }
9181 }
9182 }
9183
9184 static unsigned int ResolveIdWithClass(struct Expression * exp, struct __ecereNameSpace__ecere__com__Class * _class, unsigned int skipIDClassCheck)
9185 {
9186 struct Identifier * id = exp->__anon1.__anon1.identifier;
9187 struct __ecereNameSpace__ecere__com__Method * method = (((void *)0));
9188 struct __ecereNameSpace__ecere__com__Property * prop = (((void *)0));
9189 struct __ecereNameSpace__ecere__com__DataMember * member = (((void *)0));
9190 struct __ecereNameSpace__ecere__com__ClassProperty * classProp = (((void *)0));
9191
9192 if(_class && _class->type == 4)
9193 {
9194 struct __ecereNameSpace__ecere__sys__NamedLink64 * value = (((void *)0));
9195 struct __ecereNameSpace__ecere__com__Class * enumClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "enum");
9196
9197 if(enumClass)
9198 {
9199 struct __ecereNameSpace__ecere__com__Class * baseClass;
9200
9201 for(baseClass = _class; baseClass && baseClass->type == 4; baseClass = baseClass->base)
9202 {
9203 struct __ecereNameSpace__ecere__com__EnumClassData * e = (baseClass ? ((void *)(((char *)baseClass->data) + enumClass->offsetClass)) : (((void *)0)));
9204
9205 for(value = e->values.first; value; value = value->next)
9206 {
9207 if(!strcmp(value->name, id->string))
9208 break;
9209 }
9210 if(value)
9211 {
9212 exp->isConstant = 1;
9213 if(inCompiler || inPreCompiler || inDebugger)
9214 {
9215 char constant[256];
9216
9217 FreeExpContents(exp);
9218 exp->type = 2;
9219 if(!strcmp(baseClass->dataTypeString, "int") || !strcmp(baseClass->dataTypeString, "int64") || !strcmp(baseClass->dataTypeString, "char") || !strcmp(baseClass->dataTypeString, "short"))
9220 sprintf(constant, ((__runtimePlatform == 1) ? "%I64d" : "%lld"), value->data);
9221 else
9222 sprintf(constant, ((__runtimePlatform == 1) ? "0x%I64X" : "0x%llX"), value->data);
9223 exp->__anon1.__anon1.constant = __ecereNameSpace__ecere__sys__CopyString(constant);
9224 }
9225 exp->expType = MkClassType(baseClass->fullName);
9226 break;
9227 }
9228 }
9229 }
9230 if(value)
9231 return 1;
9232 }
9233 if((method = __ecereNameSpace__ecere__com__eClass_FindMethod(_class, id->string, privateModule)))
9234 {
9235 ProcessMethodType(method);
9236 exp->expType = __extension__ ({
9237 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
9238
9239 __ecereInstance1->refCount = 1, __ecereInstance1->kind = 16, __ecereInstance1->__anon1.__anon3.method = method, __ecereInstance1->__anon1.__anon3.methodClass = (skipIDClassCheck || (id && id->_class)) ? _class : (((void *)0)), __ecereInstance1;
9240 });
9241 return 1;
9242 }
9243 else if((prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, id->string, privateModule)))
9244 {
9245 if(!prop->dataType)
9246 ProcessPropertyType(prop);
9247 exp->expType = prop->dataType;
9248 if(prop->dataType)
9249 prop->dataType->refCount++;
9250 return 1;
9251 }
9252 else if((member = __ecereNameSpace__ecere__com__eClass_FindDataMember(_class, id->string, privateModule, (((void *)0)), (((void *)0)))))
9253 {
9254 if(!member->dataType)
9255 member->dataType = ProcessTypeString(member->dataTypeString, 0);
9256 exp->expType = member->dataType;
9257 if(member->dataType)
9258 member->dataType->refCount++;
9259 return 1;
9260 }
9261 else if((classProp = __ecereNameSpace__ecere__com__eClass_FindClassProperty(_class, id->string)))
9262 {
9263 if(!classProp->dataType)
9264 classProp->dataType = ProcessTypeString(classProp->dataTypeString, 0);
9265 if(classProp->constant)
9266 {
9267 FreeExpContents(exp);
9268 exp->isConstant = 1;
9269 if(classProp->dataType->kind == 13 && classProp->dataType->__anon1.type->kind == 1)
9270 {
9271 exp->type = 3;
9272 exp->__anon1.__anon1.constant = QMkString((char *)(uintptr_t)classProp->Get(_class));
9273 }
9274 else
9275 {
9276 char constant[256];
9277
9278 exp->type = 2;
9279 sprintf(constant, "%d", (int)classProp->Get(_class));
9280 exp->__anon1.__anon1.constant = __ecereNameSpace__ecere__sys__CopyString(constant);
9281 }
9282 }
9283 else
9284 {
9285 }
9286 exp->expType = classProp->dataType;
9287 if(classProp->dataType)
9288 classProp->dataType->refCount++;
9289 return 1;
9290 }
9291 return 0;
9292 }
9293
9294 void DeclareProperty(struct External * neededBy, struct __ecereNameSpace__ecere__com__Property * prop, char * setName, char * getName)
9295 {
9296 struct Symbol * symbol = prop->symbol;
9297 unsigned int imported = 0;
9298 unsigned int dllImport = 0;
9299 struct External * structExternal = (((void *)0));
9300 struct External * instExternal = (((void *)0));
9301
9302 strcpy(setName, "__ecereProp_");
9303 FullClassNameCat(setName, prop->_class->fullName, 0);
9304 strcat(setName, "_Set_");
9305 FullClassNameCat(setName, prop->name, 1);
9306 strcpy(getName, "__ecereProp_");
9307 FullClassNameCat(getName, prop->_class->fullName, 0);
9308 strcat(getName, "_Get_");
9309 FullClassNameCat(getName, prop->name, 1);
9310 if(!symbol || symbol->_import)
9311 {
9312 if(!symbol)
9313 {
9314 struct Symbol * classSym;
9315
9316 if(!prop->_class->symbol)
9317 prop->_class->symbol = FindClass(prop->_class->fullName);
9318 classSym = prop->_class->symbol;
9319 if(classSym && !classSym->_import)
9320 {
9321 struct ModuleImport * module;
9322
9323 if(prop->_class->module)
9324 module = FindModule(prop->_class->module);
9325 else
9326 module = mainModule;
9327 classSym->_import = __extension__ ({
9328 struct ClassImport * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_ClassImport);
9329
9330 __ecereInstance1->name = __ecereNameSpace__ecere__sys__CopyString(prop->_class->fullName), __ecereInstance1->isRemote = prop->_class->isRemote, __ecereInstance1;
9331 });
9332 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(&module->classes, classSym->_import);
9333 }
9334 symbol = prop->symbol = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Symbol);
9335 symbol->_import = (struct ClassImport *)__extension__ ({
9336 struct PropertyImport * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_PropertyImport);
9337
9338 __ecereInstance1->name = __ecereNameSpace__ecere__sys__CopyString(prop->name), __ecereInstance1->isVirtual = 0, __ecereInstance1->hasSet = prop->Set ? 1 : 0, __ecereInstance1->hasGet = prop->Get ? 1 : 0, __ecereInstance1;
9339 });
9340 if(classSym)
9341 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(&classSym->_import->properties, symbol->_import);
9342 }
9343 imported = 1;
9344 if((prop->_class->module != privateModule || !strcmp(prop->_class->name, "float") || !strcmp(prop->_class->name, "double")) && ((struct __ecereNameSpace__ecere__com__Module *)(((char *)prop->_class->module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->importType != 1)
9345 dllImport = 1;
9346 }
9347 if(!symbol->type)
9348 {
9349 struct Context * context = SetupTemplatesContext(prop->_class);
9350
9351 symbol->type = ProcessTypeString(prop->dataTypeString, 0);
9352 FinishTemplatesContext(context);
9353 }
9354 if((prop->Get && !symbol->__anon2.__anon2.externalGet) || (prop->Set && !symbol->__anon2.__anon2.externalSet))
9355 {
9356 if(prop->_class->type == 0 && prop->_class->structSize)
9357 instExternal = DeclareStruct((((void *)0)), "ecere::com::Instance", 0, 1);
9358 structExternal = DeclareStruct((((void *)0)), prop->_class->fullName, prop->_class->type != 1, 0);
9359 }
9360 if(prop->Get && !symbol->__anon2.__anon2.externalGet)
9361 {
9362 struct Declaration * decl;
9363 struct __ecereNameSpace__ecere__sys__OldList * specifiers, * declarators;
9364 struct Declarator * d;
9365 struct __ecereNameSpace__ecere__sys__OldList * params;
9366 struct Specifier * spec = (((void *)0));
9367 struct External * external;
9368 struct Declarator * typeDecl;
9369 unsigned int simple = 0;
9370 unsigned int needReference;
9371
9372 specifiers = MkList();
9373 declarators = MkList();
9374 params = MkList();
9375 ListAdd(params, MkTypeName(MkListOne(MkSpecifierName(prop->_class->fullName)), MkDeclaratorIdentifier(MkIdentifier("this"))));
9376 d = MkDeclaratorIdentifier(MkIdentifier(getName));
9377 if(dllImport)
9378 d = MkDeclaratorBrackets(MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), d));
9379 {
9380 struct Context * context = SetupTemplatesContext(prop->_class);
9381
9382 typeDecl = SpecDeclFromString(prop->dataTypeString, specifiers, (((void *)0)));
9383 FinishTemplatesContext(context);
9384 }
9385 needReference = !typeDecl || typeDecl->type == 1;
9386 for(spec = (*specifiers).first; spec; spec = spec->next)
9387 {
9388 if(spec->type == 1)
9389 {
9390 struct Symbol * classSym = spec->__anon1.__anon1.symbol;
9391
9392 if(needReference)
9393 {
9394 symbol->_class = classSym->__anon1.registered;
9395 if(classSym->__anon1.registered && classSym->__anon1.registered->type == 1)
9396 simple = 1;
9397 }
9398 break;
9399 }
9400 }
9401 if(!simple)
9402 d = PlugDeclarator(typeDecl, d);
9403 else
9404 {
9405 ListAdd(params, MkTypeName(specifiers, PlugDeclarator(typeDecl, MkDeclaratorIdentifier(MkIdentifier("value")))));
9406 specifiers = MkList();
9407 }
9408 d = MkDeclaratorFunction(d, params);
9409 if(dllImport)
9410 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*specifiers), (((void *)0)), MkSpecifier(EXTERN));
9411 else if(prop->_class->symbol && ((struct Symbol *)prop->_class->symbol)->isStatic)
9412 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*specifiers), (((void *)0)), MkSpecifier(STATIC));
9413 if(simple)
9414 ListAdd(specifiers, MkSpecifier(VOID));
9415 ListAdd(declarators, MkInitDeclarator(d, (((void *)0))));
9416 decl = MkDeclaration(specifiers, declarators);
9417 external = MkExternalDeclaration(decl);
9418 if(structExternal)
9419 __ecereMethod_External_CreateEdge(external, structExternal, 0);
9420 if(instExternal)
9421 __ecereMethod_External_CreateEdge(external, instExternal, 0);
9422 if(spec)
9423 DeclareStruct(external, spec->__anon1.__anon1.name, 0, needReference);
9424 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add((&*ast), external);
9425 external->symbol = symbol;
9426 symbol->__anon2.__anon2.externalGet = external;
9427 ReplaceThisClassSpecifiers(specifiers, prop->_class);
9428 if(typeDecl)
9429 FreeDeclarator(typeDecl);
9430 }
9431 if(prop->Set && !symbol->__anon2.__anon2.externalSet)
9432 {
9433 struct Declaration * decl;
9434 struct __ecereNameSpace__ecere__sys__OldList * specifiers, * declarators;
9435 struct Declarator * d;
9436 struct __ecereNameSpace__ecere__sys__OldList * params;
9437 struct Specifier * spec = (((void *)0));
9438 struct External * external;
9439 struct Declarator * typeDecl;
9440 unsigned int needReference;
9441
9442 declarators = MkList();
9443 params = MkList();
9444 if(!prop->conversion || prop->_class->type == 1)
9445 {
9446 ListAdd(params, MkTypeName(MkListOne(MkSpecifierName(prop->_class->fullName)), MkDeclaratorIdentifier(MkIdentifier("this"))));
9447 }
9448 specifiers = MkList();
9449 {
9450 struct Context * context = SetupTemplatesContext(prop->_class);
9451
9452 typeDecl = d = SpecDeclFromString(prop->dataTypeString, specifiers, MkDeclaratorIdentifier(MkIdentifier("value")));
9453 FinishTemplatesContext(context);
9454 }
9455 if(!strcmp(prop->_class->base->fullName, "eda::Row") || !strcmp(prop->_class->base->fullName, "eda::Id"))
9456 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*specifiers), (((void *)0)), MkSpecifier(CONST));
9457 ListAdd(params, MkTypeName(specifiers, d));
9458 d = MkDeclaratorIdentifier(MkIdentifier(setName));
9459 if(dllImport)
9460 d = MkDeclaratorBrackets(MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), d));
9461 d = MkDeclaratorFunction(d, params);
9462 needReference = !typeDecl || typeDecl->type == 1;
9463 for(spec = (*specifiers).first; spec; spec = spec->next)
9464 {
9465 if(spec->type == 1)
9466 {
9467 struct Symbol * classSym = spec->__anon1.__anon1.symbol;
9468
9469 if(needReference)
9470 symbol->_class = classSym->__anon1.registered;
9471 break;
9472 }
9473 }
9474 ListAdd(declarators, MkInitDeclarator(d, (((void *)0))));
9475 specifiers = MkList();
9476 if(dllImport)
9477 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*specifiers), (((void *)0)), MkSpecifier(EXTERN));
9478 else if(prop->_class->symbol && ((struct Symbol *)prop->_class->symbol)->isStatic)
9479 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*specifiers), (((void *)0)), MkSpecifier(STATIC));
9480 if(!prop->conversion || prop->_class->type == 1)
9481 ListAdd(specifiers, MkSpecifier(VOID));
9482 else
9483 ListAdd(specifiers, MkSpecifierName(prop->_class->fullName));
9484 decl = MkDeclaration(specifiers, declarators);
9485 external = MkExternalDeclaration(decl);
9486 if(structExternal)
9487 __ecereMethod_External_CreateEdge(external, structExternal, 0);
9488 if(instExternal)
9489 __ecereMethod_External_CreateEdge(external, instExternal, 0);
9490 if(spec)
9491 DeclareStruct(external, spec->__anon1.__anon1.name, 0, needReference);
9492 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add((&*ast), external);
9493 external->symbol = symbol;
9494 symbol->__anon2.__anon2.externalSet = external;
9495 ReplaceThisClassSpecifiers(specifiers, prop->_class);
9496 }
9497 if(!symbol->__anon2.__anon2.externalPtr)
9498 {
9499 struct Declaration * decl;
9500 struct External * external;
9501 struct __ecereNameSpace__ecere__sys__OldList * specifiers = MkList();
9502 char propName[1024];
9503
9504 if(imported)
9505 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*specifiers), (((void *)0)), MkSpecifier(EXTERN));
9506 else
9507 {
9508 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*specifiers), (((void *)0)), MkSpecifier(STATIC));
9509 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add((&*specifiers), MkSpecifierExtended(MkExtDeclAttrib(MkAttrib(ATTRIB, MkListOne(MkAttribute(__ecereNameSpace__ecere__sys__CopyString("unused"), (((void *)0))))))));
9510 }
9511 ListAdd(specifiers, MkSpecifierName("Property"));
9512 strcpy(propName, "__ecereProp_");
9513 FullClassNameCat(propName, prop->_class->fullName, 0);
9514 strcat(propName, "_");
9515 FullClassNameCat(propName, prop->name, 1);
9516 {
9517 struct __ecereNameSpace__ecere__sys__OldList * list = MkList();
9518
9519 ListAdd(list, MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier(propName)), (((void *)0))));
9520 if(!imported)
9521 {
9522 strcpy(propName, "__ecerePropM_");
9523 FullClassNameCat(propName, prop->_class->fullName, 0);
9524 strcat(propName, "_");
9525 FullClassNameCat(propName, prop->name, 1);
9526 ListAdd(list, MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier(propName)), (((void *)0))));
9527 }
9528 decl = MkDeclaration(specifiers, list);
9529 }
9530 external = MkExternalDeclaration(decl);
9531 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*ast), curExternal->prev, external);
9532 external->symbol = symbol;
9533 symbol->__anon2.__anon2.externalPtr = external;
9534 }
9535 if(inCompiler && neededBy)
9536 {
9537 if(symbol->__anon2.__anon2.externalPtr)
9538 __ecereMethod_External_CreateUniqueEdge(neededBy, symbol->__anon2.__anon2.externalPtr, 0);
9539 if(symbol->__anon2.__anon2.externalGet)
9540 __ecereMethod_External_CreateUniqueEdge(neededBy, symbol->__anon2.__anon2.externalGet, symbol->__anon2.__anon2.externalGet->type == 0);
9541 if(symbol->__anon2.__anon2.externalSet)
9542 __ecereMethod_External_CreateUniqueEdge(neededBy, symbol->__anon2.__anon2.externalSet, symbol->__anon2.__anon2.externalSet->type == 0);
9543 }
9544 }
9545
9546 static void ProcessDeclarator(struct Declarator *  decl, unsigned int isFunction);
9547
9548 void DeclareMethod(struct External * neededFor, struct __ecereNameSpace__ecere__com__Method * method, const char * name)
9549 {
9550 struct Symbol * symbol = method->symbol;
9551
9552 if(!symbol || (!symbol->__anon2.__anon1.pointerExternal && (!symbol->__anon2.__anon3.methodCodeExternal || method->type == 1)))
9553 {
9554 unsigned int dllImport = 0;
9555
9556 if(!method->dataType)
9557 method->dataType = ProcessTypeString(method->dataTypeString, 0);
9558 {
9559 if(!symbol || method->type == 1)
9560 {
9561 struct Symbol * classSym;
9562
9563 if(!method->_class->symbol)
9564 method->_class->symbol = FindClass(method->_class->fullName);
9565 classSym = method->_class->symbol;
9566 if(!classSym->_import)
9567 {
9568 struct ModuleImport * module;
9569
9570 if(method->_class->module && ((struct __ecereNameSpace__ecere__com__Module *)(((char *)method->_class->module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->name)
9571 module = FindModule(method->_class->module);
9572 else
9573 module = mainModule;
9574 classSym->_import = __extension__ ({
9575 struct ClassImport * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_ClassImport);
9576
9577 __ecereInstance1->name = __ecereNameSpace__ecere__sys__CopyString(method->_class->fullName), __ecereInstance1->isRemote = method->_class->isRemote, __ecereInstance1;
9578 });
9579 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(&module->classes, classSym->_import);
9580 }
9581 if(!symbol)
9582 {
9583 symbol = method->symbol = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Symbol);
9584 }
9585 if(!symbol->_import)
9586 {
9587 symbol->_import = (struct ClassImport *)__extension__ ({
9588 struct MethodImport * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_MethodImport);
9589
9590 __ecereInstance1->name = __ecereNameSpace__ecere__sys__CopyString(method->name), __ecereInstance1->isVirtual = method->type == 1, __ecereInstance1;
9591 });
9592 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(&classSym->_import->methods, symbol->_import);
9593 }
9594 if(!symbol)
9595 {
9596 symbol->type = method->dataType;
9597 if(symbol->type)
9598 symbol->type->refCount++;
9599 }
9600 }
9601 if(!method->dataType->dllExport)
9602 {
9603 if((method->_class->module != privateModule || !strcmp(method->_class->name, "float") || !strcmp(method->_class->name, "double")) && ((struct __ecereNameSpace__ecere__com__Module *)(((char *)method->_class->module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->importType != 1)
9604 dllImport = 1;
9605 }
9606 }
9607 if(inCompiler)
9608 {
9609 struct Declaration * decl;
9610 struct __ecereNameSpace__ecere__sys__OldList * specifiers, * declarators;
9611 struct Declarator * d;
9612 struct Declarator * funcDecl;
9613 struct External * external;
9614
9615 specifiers = MkList();
9616 declarators = MkList();
9617 if(dllImport)
9618 ListAdd(specifiers, MkSpecifier(EXTERN));
9619 else if(method->_class->symbol && ((struct Symbol *)method->_class->symbol)->isStatic)
9620 ListAdd(specifiers, MkSpecifier(STATIC));
9621 if(method->type == 1)
9622 {
9623 ListAdd(specifiers, MkSpecifier(INT));
9624 d = MkDeclaratorIdentifier(MkIdentifier(name));
9625 }
9626 else
9627 {
9628 d = MkDeclaratorIdentifier(MkIdentifier(name));
9629 if(dllImport)
9630 d = MkDeclaratorBrackets(MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), d));
9631 {
9632 struct Context * context = SetupTemplatesContext(method->_class);
9633
9634 d = SpecDeclFromString(method->dataTypeString, specifiers, d);
9635 FinishTemplatesContext(context);
9636 }
9637 funcDecl = GetFuncDecl(d);
9638 if(dllImport)
9639 {
9640 struct Specifier * spec, * next;
9641
9642 for(spec = (*specifiers).first; spec; spec = next)
9643 {
9644 next = spec->next;
9645 if(spec->type == 5)
9646 {
9647 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove((&*specifiers), spec);
9648 FreeSpecifier(spec);
9649 }
9650 }
9651 }
9652 if(method->dataType && !method->dataType->__anon1.__anon2.staticMethod)
9653 {
9654 if(funcDecl && funcDecl->__anon1.function.parameters && (*funcDecl->__anon1.function.parameters).count)
9655 {
9656 struct __ecereNameSpace__ecere__com__Class * _class = method->dataType->__anon1.__anon2.thisClass ? method->dataType->__anon1.__anon2.thisClass->__anon1.registered : method->_class;
9657 struct TypeName * thisParam = MkTypeName(MkListOne(MkSpecifierName(method->dataType->__anon1.__anon2.thisClass ? method->dataType->__anon1.__anon2.thisClass->string : method->_class->fullName)), (_class && _class->type == 1000) ? MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), MkDeclaratorIdentifier(MkIdentifier("this"))) : MkDeclaratorIdentifier(MkIdentifier("this")));
9658 struct TypeName * firstParam = ((struct TypeName *)(*funcDecl->__anon1.function.parameters).first);
9659 struct Specifier * firstSpec = firstParam->qualifiers ? (*firstParam->qualifiers).first : (((void *)0));
9660
9661 if(firstSpec && firstSpec->type == 0 && firstSpec->__anon1.specifier == VOID && !firstParam->declarator)
9662 {
9663 struct TypeName * param = (*funcDecl->__anon1.function.parameters).first;
9664
9665 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove((&*funcDecl->__anon1.function.parameters), param);
9666 FreeTypeName(param);
9667 }
9668 if(!funcDecl->__anon1.function.parameters)
9669 funcDecl->__anon1.function.parameters = MkList();
9670 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*funcDecl->__anon1.function.parameters), (((void *)0)), thisParam);
9671 }
9672 }
9673 }
9674 ProcessDeclarator(d, 1);
9675 ListAdd(declarators, MkInitDeclarator(d, (((void *)0))));
9676 decl = MkDeclaration(specifiers, declarators);
9677 ReplaceThisClassSpecifiers(specifiers, method->_class);
9678 external = MkExternalDeclaration(decl);
9679 external->symbol = symbol;
9680 symbol->__anon2.__anon1.pointerExternal = external;
9681 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add((&*ast), external);
9682 DeclareStruct(external, method->_class->fullName, 1, 1);
9683 if(method->dataType)
9684 DeclareType(external, method->dataType, 1, 1);
9685 }
9686 }
9687 if(inCompiler && neededFor)
9688 {
9689 struct External * external = symbol->__anon2.__anon1.pointerExternal ? symbol->__anon2.__anon1.pointerExternal : symbol->__anon2.__anon3.methodCodeExternal;
9690
9691 __ecereMethod_External_CreateUniqueEdge(neededFor, external, external->type == 0);
9692 }
9693 }
9694
9695 struct __ecereNameSpace__ecere__com__GlobalFunction;
9696
9697 struct __ecereNameSpace__ecere__com__GlobalFunction
9698 {
9699 struct __ecereNameSpace__ecere__com__GlobalFunction * prev;
9700 struct __ecereNameSpace__ecere__com__GlobalFunction * next;
9701 const char *  name;
9702 int (*  function)();
9703 struct __ecereNameSpace__ecere__com__Instance * module;
9704 struct __ecereNameSpace__ecere__com__NameSpace *  nameSpace;
9705 const char *  dataTypeString;
9706 struct Type * dataType;
9707 void *  symbol;
9708 } ecere_gcc_struct;
9709
9710 extern struct __ecereNameSpace__ecere__com__GlobalFunction * __ecereNameSpace__ecere__com__eSystem_FindFunction(struct __ecereNameSpace__ecere__com__Instance * module, const char *  name);
9711
9712 extern struct __ecereNameSpace__ecere__com__GlobalFunction * __ecereNameSpace__ecere__com__eSystem_RegisterFunction(const char *  name, const char *  type, void *  func, struct __ecereNameSpace__ecere__com__Instance * module, int declMode);
9713
9714 unsigned int DeclareFunction(struct External * neededFor, struct __ecereNameSpace__ecere__com__GlobalFunction * function, char * name)
9715 {
9716 struct Symbol * symbol = function->symbol;
9717
9718 if(!symbol || !symbol->__anon2.__anon1.pointerExternal)
9719 {
9720 unsigned int imported = 0;
9721 unsigned int dllImport = 0;
9722
9723 if(!function->dataType)
9724 {
9725 function->dataType = ProcessTypeString(function->dataTypeString, 0);
9726 if(!function->dataType->__anon1.__anon2.thisClass)
9727 function->dataType->__anon1.__anon2.staticMethod = 1;
9728 }
9729 if(inCompiler)
9730 {
9731 if(!symbol)
9732 {
9733 struct ModuleImport * module = FindModule(function->module);
9734
9735 symbol = function->symbol = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Symbol);
9736 if(module->name)
9737 {
9738 if(!function->dataType->dllExport)
9739 {
9740 symbol->_import = (struct ClassImport *)__extension__ ({
9741 struct FunctionImport * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_FunctionImport);
9742
9743 __ecereInstance1->name = __ecereNameSpace__ecere__sys__CopyString(function->name), __ecereInstance1;
9744 });
9745 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(&module->functions, symbol->_import);
9746 }
9747 }
9748 {
9749 symbol->type = ProcessTypeString(function->dataTypeString, 0);
9750 if(!symbol->type->__anon1.__anon2.thisClass)
9751 symbol->type->__anon1.__anon2.staticMethod = 1;
9752 }
9753 }
9754 imported = symbol->_import ? 1 : 0;
9755 if(imported && function->module != privateModule && ((struct __ecereNameSpace__ecere__com__Module *)(((char *)function->module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->importType != 1)
9756 dllImport = 1;
9757 }
9758 if(inCompiler)
9759 {
9760 {
9761 struct Declaration * decl;
9762 struct __ecereNameSpace__ecere__sys__OldList * specifiers, * declarators;
9763 struct Declarator * d;
9764 struct Declarator * funcDecl;
9765 struct External * external;
9766
9767 specifiers = MkList();
9768 declarators = MkList();
9769 ListAdd(specifiers, MkSpecifier(EXTERN));
9770 d = MkDeclaratorIdentifier(MkIdentifier(imported ? name : function->name));
9771 if(dllImport)
9772 d = MkDeclaratorBrackets(MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), d));
9773 d = SpecDeclFromString(function->dataTypeString, specifiers, d);
9774 if(((struct __ecereNameSpace__ecere__com__Module *)(((char *)function->module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->importType == 1)
9775 {
9776 struct Specifier * spec;
9777
9778 for(spec = (*specifiers).first; spec; spec = spec->next)
9779 if(spec->type == 5 && spec->__anon1.__anon1.extDecl && spec->__anon1.__anon1.extDecl->type == 0 && !strcmp(spec->__anon1.__anon1.extDecl->__anon1.s, "dllexport"))
9780 {
9781 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove((&*specifiers), spec);
9782 FreeSpecifier(spec);
9783 break;
9784 }
9785 }
9786 funcDecl = GetFuncDecl(d);
9787 if(funcDecl && !funcDecl->__anon1.function.parameters)
9788 {
9789 funcDecl->__anon1.function.parameters = MkList();
9790 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*funcDecl->__anon1.function.parameters), (((void *)0)), MkTypeName(MkListOne(MkSpecifier(VOID)), (((void *)0))));
9791 }
9792 ListAdd(declarators, MkInitDeclarator(d, (((void *)0))));
9793 {
9794 struct Context * oldCtx = curContext;
9795
9796 curContext = globalContext;
9797 decl = MkDeclaration(specifiers, declarators);
9798 curContext = oldCtx;
9799 }
9800 external = MkExternalDeclaration(decl);
9801 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add((&*ast), external);
9802 external->symbol = symbol;
9803 symbol->__anon2.__anon1.pointerExternal = external;
9804 DeclareType(external, function->dataType, 1, 1);
9805 }
9806 }
9807 }
9808 if(inCompiler && neededFor && symbol && symbol->__anon2.__anon1.pointerExternal)
9809 __ecereMethod_External_CreateUniqueEdge(neededFor, symbol->__anon2.__anon1.pointerExternal, symbol->__anon2.__anon1.pointerExternal->type == 0);
9810 return (symbol && symbol->_import && function->module != privateModule && ((struct __ecereNameSpace__ecere__com__Module *)(((char *)function->module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->importType != 1) ? 1 : 0;
9811 }
9812
9813 void DeclareFunctionUtil(struct External * neededBy, const char * s)
9814 {
9815 struct __ecereNameSpace__ecere__com__GlobalFunction * function = __ecereNameSpace__ecere__com__eSystem_FindFunction(privateModule, s);
9816
9817 if(function)
9818 {
9819 char name[1024];
9820
9821 name[0] = 0;
9822 if(((struct __ecereNameSpace__ecere__com__Module *)(((char *)function->module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->importType != 1 && (!function->dataType || !function->dataType->dllExport))
9823 strcpy(name, "__ecereFunction_");
9824 FullClassNameCat(name, s, 0);
9825 DeclareFunction(neededBy, function, name);
9826 }
9827 else if(neededBy)
9828 FindSymbol(s, globalContext, globalContext, 0, 0);
9829 }
9830
9831 static void CreateFireWatcher(struct __ecereNameSpace__ecere__com__Property * prop, struct Expression * object, struct Statement * stmt)
9832 {
9833 char propName[1024], propNameM[1024];
9834 char getName[1024], setName[1024];
9835 struct __ecereNameSpace__ecere__sys__OldList * args;
9836
9837 DeclareProperty(curExternal, prop, setName, getName);
9838 strcpy(propName, "__ecereProp_");
9839 FullClassNameCat(propName, prop->_class->fullName, 0);
9840 strcat(propName, "_");
9841 FullClassNameCat(propName, prop->name, 1);
9842 strcpy(propNameM, "__ecerePropM_");
9843 FullClassNameCat(propNameM, prop->_class->fullName, 0);
9844 strcat(propNameM, "_");
9845 FullClassNameCat(propNameM, prop->name, 1);
9846 if(prop->isWatchable)
9847 {
9848 args = MkList();
9849 ListAdd(args, object ? CopyExpression(object) : MkExpIdentifier(MkIdentifier("this")));
9850 ListAdd(args, MkExpIdentifier(MkIdentifier(propName)));
9851 ListAdd(stmt->__anon1.expressions, MkExpCall(MkExpIdentifier(MkIdentifier("ecere::com::eInstance_FireWatchers")), args));
9852 args = MkList();
9853 ListAdd(args, object ? CopyExpression(object) : MkExpIdentifier(MkIdentifier("this")));
9854 ListAdd(args, MkExpIdentifier(MkIdentifier(propNameM)));
9855 ListAdd(stmt->__anon1.expressions, MkExpCall(MkExpIdentifier(MkIdentifier("ecere::com::eInstance_FireWatchers")), args));
9856 DeclareFunctionUtil(curExternal, "eInstance_FireWatchers");
9857 }
9858 {
9859 args = MkList();
9860 ListAdd(args, object ? CopyExpression(object) : MkExpIdentifier(MkIdentifier("this")));
9861 ListAdd(args, MkExpIdentifier(MkIdentifier(propName)));
9862 ListAdd(stmt->__anon1.expressions, MkExpCall(MkExpIdentifier(MkIdentifier("ecere::com::eInstance_FireSelfWatchers")), args));
9863 args = MkList();
9864 ListAdd(args, object ? CopyExpression(object) : MkExpIdentifier(MkIdentifier("this")));
9865 ListAdd(args, MkExpIdentifier(MkIdentifier(propNameM)));
9866 ListAdd(stmt->__anon1.expressions, MkExpCall(MkExpIdentifier(MkIdentifier("ecere::com::eInstance_FireSelfWatchers")), args));
9867 DeclareFunctionUtil(curExternal, "eInstance_FireSelfWatchers");
9868 }
9869 if(curFunction->propSet && !strcmp(curFunction->propSet->string, prop->name) && (!object || (object->type == 0 && !strcmp(object->__anon1.__anon1.identifier->string, "this"))))
9870 curFunction->propSet->fireWatchersDone = 1;
9871 }
9872
9873 struct __ecereNameSpace__ecere__com__SubModule;
9874
9875 struct __ecereNameSpace__ecere__com__SubModule
9876 {
9877 struct __ecereNameSpace__ecere__com__SubModule * prev;
9878 struct __ecereNameSpace__ecere__com__SubModule * next;
9879 struct __ecereNameSpace__ecere__com__Instance * module;
9880 int importMode;
9881 } ecere_gcc_struct;
9882
9883 unsigned int ModuleVisibility(struct __ecereNameSpace__ecere__com__Instance * searchIn, struct __ecereNameSpace__ecere__com__Instance * searchFor)
9884 {
9885 struct __ecereNameSpace__ecere__com__SubModule * subModule;
9886
9887 if(searchFor == searchIn)
9888 return 1;
9889 for(subModule = ((struct __ecereNameSpace__ecere__com__Module *)(((char *)searchIn + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->modules.first; subModule; subModule = subModule->next)
9890 {
9891 if(subModule->importMode == 1 || searchIn == ((struct __ecereNameSpace__ecere__com__Module *)(((char *)searchIn + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application)
9892 {
9893 if(ModuleVisibility(subModule->module, searchFor))
9894 return 1;
9895 }
9896 }
9897 return 0;
9898 }
9899
9900 int ComputeTypeSize(struct Type *  type);
9901
9902 void ComputeClassMembers(struct __ecereNameSpace__ecere__com__Class * _class, unsigned int isMember)
9903 {
9904 struct __ecereNameSpace__ecere__com__DataMember * member = isMember ? (struct __ecereNameSpace__ecere__com__DataMember *)_class : (((void *)0));
9905 struct Context * context = isMember ? (((void *)0)) : SetupTemplatesContext(_class);
9906
9907 if(member || ((_class->type == 2 || _class->type == 0 || _class->type == 1 || _class->type == 5) && (_class->type == 2 || (!_class->structSize || _class->structSize == _class->offset)) && _class->computeSize))
9908 {
9909 int unionMemberOffset = 0;
9910 int bitFields = 0;
9911
9912 if(member)
9913 {
9914 member->memberOffset = 0;
9915 if(targetBits < sizeof(void *) * 8)
9916 member->structAlignment = 0;
9917 }
9918 else if(targetBits < sizeof(void *) * 8)
9919 _class->structAlignment = 0;
9920 if(!member && ((_class->type == 0 || _class->type == 5) || (_class->type == 1 && _class->memberOffset && _class->memberOffset > _class->base->structSize)))
9921 _class->memberOffset = (_class->base && _class->type == 1) ? _class->base->structSize : 0;
9922 if(!member && _class->destructionWatchOffset)
9923 _class->memberOffset += sizeof(struct __ecereNameSpace__ecere__sys__OldList);
9924 {
9925 struct __ecereNameSpace__ecere__com__DataMember * dataMember;
9926
9927 for(dataMember = member ? member->members.first : _class->membersAndProperties.first; dataMember; dataMember = dataMember->next)
9928 {
9929 if(!dataMember->isProperty)
9930 {
9931 if(dataMember->type == 0 && dataMember->dataTypeString && !dataMember->dataType)
9932 {
9933 dataMember->dataType = ProcessTypeString(dataMember->dataTypeString, 0);
9934 }
9935 }
9936 }
9937 }
9938 {
9939 struct __ecereNameSpace__ecere__com__DataMember * dataMember;
9940
9941 for(dataMember = member ? member->members.first : _class->membersAndProperties.first; dataMember; dataMember = dataMember->next)
9942 {
9943 if(!dataMember->isProperty && (dataMember->type != 0 || dataMember->dataTypeString))
9944 {
9945 if(!isMember && _class->type == 2 && dataMember->dataType)
9946 {
9947 struct __ecereNameSpace__ecere__com__BitMember * bitMember = (struct __ecereNameSpace__ecere__com__BitMember *)dataMember;
9948 uint64 mask = 0;
9949 int d;
9950
9951 ComputeTypeSize(dataMember->dataType);
9952 if(bitMember->pos == -1)
9953 bitMember->pos = _class->memberOffset;
9954 if(!bitMember->size)
9955 bitMember->size = dataMember->dataType->size * 8;
9956 _class->memberOffset = bitMember->pos + bitMember->size;
9957 for(d = 0; d < bitMember->size; d++)
9958 {
9959 if(d)
9960 mask <<= 1;
9961 mask |= 1;
9962 }
9963 bitMember->mask = mask << bitMember->pos;
9964 }
9965 else if(dataMember->type == 0 && dataMember->dataType)
9966 {
9967 int size;
9968 int alignment = 0;
9969
9970 if(dataMember->dataType->kind != 8 || ((!dataMember->dataType->__anon1._class || !dataMember->dataType->__anon1._class->__anon1.registered || dataMember->dataType->__anon1._class->__anon1.registered != _class || _class->type != 1)))
9971 ComputeTypeSize(dataMember->dataType);
9972 if(dataMember->dataType->bitFieldCount)
9973 {
9974 bitFields += dataMember->dataType->bitFieldCount;
9975 size = 0;
9976 }
9977 else
9978 {
9979 if(bitFields)
9980 {
9981 int size = (bitFields + 7) / 8;
9982
9983 if(isMember)
9984 {
9985 int __simpleStruct0;
9986
9987 if(alignment)
9988 {
9989 short __simpleStruct0;
9990
9991 member->structAlignment = (__simpleStruct0 = member->structAlignment, (__simpleStruct0 > alignment) ? __simpleStruct0 : alignment);
9992 if(member->memberOffset % alignment)
9993 member->memberOffset += alignment - (member->memberOffset % alignment);
9994 }
9995 dataMember->offset = member->memberOffset;
9996 if(member->type == 1)
9997 unionMemberOffset = (__simpleStruct0 = dataMember->dataType->size, (unionMemberOffset > __simpleStruct0) ? unionMemberOffset : __simpleStruct0);
9998 else
9999 {
10000 member->memberOffset += size;
10001 }
10002 }
10003 else
10004 {
10005 if(alignment)
10006 {
10007 short __simpleStruct0;
10008
10009 _class->structAlignment = (__simpleStruct0 = _class->structAlignment, (__simpleStruct0 > alignment) ? __simpleStruct0 : alignment);
10010 if(_class->memberOffset % alignment)
10011 _class->memberOffset += alignment - (_class->memberOffset % alignment);
10012 }
10013 dataMember->offset = _class->memberOffset;
10014 _class->memberOffset += size;
10015 }
10016 bitFields = 0;
10017 }
10018 size = dataMember->dataType->size;
10019 alignment = dataMember->dataType->alignment;
10020 }
10021 if(isMember)
10022 {
10023 int __simpleStruct0;
10024
10025 if(alignment)
10026 {
10027 short __simpleStruct0;
10028
10029 member->structAlignment = (__simpleStruct0 = member->structAlignment, (__simpleStruct0 > alignment) ? __simpleStruct0 : alignment);
10030 if(member->memberOffset % alignment)
10031 member->memberOffset += alignment - (member->memberOffset % alignment);
10032 }
10033 dataMember->offset = member->memberOffset;
10034 if(member->type == 1)
10035 unionMemberOffset = (__simpleStruct0 = dataMember->dataType->size, (unionMemberOffset > __simpleStruct0) ? unionMemberOffset : __simpleStruct0);
10036 else
10037 {
10038 member->memberOffset += size;
10039 }
10040 }
10041 else
10042 {
10043 if(alignment)
10044 {
10045 short __simpleStruct0;
10046
10047 _class->structAlignment = (__simpleStruct0 = _class->structAlignment, (__simpleStruct0 > alignment) ? __simpleStruct0 : alignment);
10048 if(_class->memberOffset % alignment)
10049 _class->memberOffset += alignment - (_class->memberOffset % alignment);
10050 }
10051 dataMember->offset = _class->memberOffset;
10052 _class->memberOffset += size;
10053 }
10054 }
10055 else
10056 {
10057 int alignment;
10058
10059 ComputeClassMembers((struct __ecereNameSpace__ecere__com__Class *)dataMember, 1);
10060 alignment = dataMember->structAlignment;
10061 if(isMember)
10062 {
10063 int __simpleStruct0;
10064
10065 if(alignment)
10066 {
10067 short __simpleStruct0;
10068
10069 if(member->memberOffset % alignment)
10070 member->memberOffset += alignment - (member->memberOffset % alignment);
10071 member->structAlignment = (__simpleStruct0 = member->structAlignment, (__simpleStruct0 > alignment) ? __simpleStruct0 : alignment);
10072 }
10073 dataMember->offset = member->memberOffset;
10074 if(member->type == 1)
10075 unionMemberOffset = (__simpleStruct0 = dataMember->memberOffset, (unionMemberOffset > __simpleStruct0) ? unionMemberOffset : __simpleStruct0);
10076 else
10077 member->memberOffset += dataMember->memberOffset;
10078 }
10079 else
10080 {
10081 if(alignment)
10082 {
10083 short __simpleStruct0;
10084
10085 if(_class->memberOffset % alignment)
10086 _class->memberOffset += alignment - (_class->memberOffset % alignment);
10087 _class->structAlignment = (__simpleStruct0 = _class->structAlignment, (__simpleStruct0 > alignment) ? __simpleStruct0 : alignment);
10088 }
10089 dataMember->offset = _class->memberOffset;
10090 _class->memberOffset += dataMember->memberOffset;
10091 }
10092 }
10093 }
10094 }
10095 if(bitFields)
10096 {
10097 int alignment = 0;
10098 int size = (bitFields + 7) / 8;
10099
10100 if(isMember)
10101 {
10102 int __simpleStruct0;
10103
10104 if(alignment)
10105 {
10106 short __simpleStruct0;
10107
10108 member->structAlignment = (__simpleStruct0 = member->structAlignment, (__simpleStruct0 > alignment) ? __simpleStruct0 : alignment);
10109 if(member->memberOffset % alignment)
10110 member->memberOffset += alignment - (member->memberOffset % alignment);
10111 }
10112 if(member->type == 1)
10113 unionMemberOffset = (__simpleStruct0 = dataMember->dataType->size, (unionMemberOffset > __simpleStruct0) ? unionMemberOffset : __simpleStruct0);
10114 else
10115 {
10116 member->memberOffset += size;
10117 }
10118 }
10119 else
10120 {
10121 if(alignment)
10122 {
10123 short __simpleStruct0;
10124
10125 _class->structAlignment = (__simpleStruct0 = _class->structAlignment, (__simpleStruct0 > alignment) ? __simpleStruct0 : alignment);
10126 if(_class->memberOffset % alignment)
10127 _class->memberOffset += alignment - (_class->memberOffset % alignment);
10128 }
10129 _class->memberOffset += size;
10130 }
10131 bitFields = 0;
10132 }
10133 }
10134 if(member && member->type == 1)
10135 {
10136 member->memberOffset = unionMemberOffset;
10137 }
10138 if(!isMember)
10139 {
10140 if(_class->type != 2)
10141 {
10142 int extra = 0;
10143
10144 if(_class->structAlignment)
10145 {
10146 if(_class->memberOffset % _class->structAlignment)
10147 extra += _class->structAlignment - (_class->memberOffset % _class->structAlignment);
10148 }
10149 _class->structSize = (_class->base ? (_class->base->templateClass ? (_class->base->type == 5 ? _class->base->templateClass->memberOffset : _class->base->templateClass->structSize) : (_class->base->type == 5 ? _class->base->memberOffset : _class->base->structSize)) : 0) + _class->memberOffset + extra;
10150 if(!member)
10151 {
10152 struct __ecereNameSpace__ecere__com__Property * prop;
10153
10154 for(prop = _class->membersAndProperties.first; prop; prop = prop->next)
10155 {
10156 if(prop->isProperty && prop->isWatchable)
10157 {
10158 prop->watcherOffset = _class->structSize;
10159 _class->structSize += sizeof(struct __ecereNameSpace__ecere__sys__OldList);
10160 }
10161 }
10162 }
10163 {
10164 struct __ecereNameSpace__ecere__sys__OldLink * derivative;
10165
10166 for(derivative = _class->derivatives.first; derivative; derivative = derivative->next)
10167 {
10168 struct __ecereNameSpace__ecere__com__Class * deriv = derivative->data;
10169
10170 if(deriv->computeSize)
10171 {
10172 deriv->offset = (_class->type == 5 ? _class->memberOffset : _class->structSize);
10173 deriv->memberOffset = 0;
10174 deriv->structSize = deriv->offset;
10175 ComputeClassMembers(deriv, 0);
10176 }
10177 }
10178 }
10179 }
10180 }
10181 }
10182 if(context)
10183 FinishTemplatesContext(context);
10184 }
10185
10186 int AddMembers(struct External * neededBy, struct __ecereNameSpace__ecere__sys__OldList * declarations, struct __ecereNameSpace__ecere__com__Class * _class, unsigned int isMember, unsigned int * retSize, struct __ecereNameSpace__ecere__com__Class * topClass, unsigned int * addedPadding)
10187 {
10188 struct __ecereNameSpace__ecere__com__DataMember * topMember = isMember ? (struct __ecereNameSpace__ecere__com__DataMember *)_class : (((void *)0));
10189 unsigned int totalSize = 0;
10190 unsigned int maxSize = 0;
10191 int alignment;
10192 unsigned int size;
10193 struct __ecereNameSpace__ecere__com__DataMember * member;
10194 int anonID = 1;
10195 struct Context * context = isMember ? (((void *)0)) : SetupTemplatesContext(_class);
10196
10197 if(addedPadding)
10198 *addedPadding = 0;
10199 if(!isMember && _class->base)
10200 {
10201 maxSize = _class->structSize;
10202 {
10203 if(_class->type == 1 || _class->type == 5)
10204 AddMembers(neededBy, declarations, _class->base, 0, &totalSize, topClass, (((void *)0)));
10205 else
10206 {
10207 unsigned int baseSize = _class->base->templateClass ? _class->base->templateClass->structSize : _class->base->structSize;
10208
10209 if(maxSize > baseSize)
10210 maxSize -= baseSize;
10211 else
10212 maxSize = 0;
10213 }
10214 }
10215 }
10216 for(member = isMember ? topMember->members.first : _class->membersAndProperties.first; member; member = member->next)
10217 {
10218 if(!member->isProperty)
10219 {
10220 switch(member->type)
10221 {
10222 case 0:
10223 {
10224 if(member->dataTypeString)
10225 {
10226 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList(), * decls = MkList();
10227 struct Declarator * decl;
10228
10229 decl = SpecDeclFromString(member->dataTypeString, specs, MkDeclaratorIdentifier(MkIdentifier(member->name)));
10230 ListAdd(decls, MkStructDeclarator(decl, (((void *)0))));
10231 ListAdd(declarations, MkClassDefDeclaration(MkStructDeclaration(specs, decls, (((void *)0)))));
10232 if(!member->dataType)
10233 member->dataType = ProcessType(specs, decl);
10234 ReplaceThisClassSpecifiers(specs, topClass);
10235 {
10236 struct Type * type = ProcessType(specs, decl);
10237
10238 DeclareType(neededBy, member->dataType, 1, 0);
10239 FreeType(type);
10240 }
10241 ComputeTypeSize(member->dataType);
10242 size = member->dataType->size;
10243 alignment = member->dataType->alignment;
10244 if(alignment)
10245 {
10246 if(totalSize % alignment)
10247 totalSize += alignment - (totalSize % alignment);
10248 }
10249 totalSize += size;
10250 }
10251 break;
10252 }
10253 case 1:
10254 case 2:
10255 {
10256 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList(), * list = MkList();
10257 char id[100];
10258
10259 sprintf(id, "__anon%d", anonID++);
10260 size = 0;
10261 AddMembers(neededBy, list, (struct __ecereNameSpace__ecere__com__Class *)member, 1, &size, topClass, (((void *)0)));
10262 ListAdd(specs, MkStructOrUnion((member->type == 1) ? 4 : 3, (((void *)0)), list));
10263 ListAdd(declarations, MkClassDefDeclaration(MkStructDeclaration(specs, MkListOne(MkDeclaratorIdentifier(MkIdentifier(id))), (((void *)0)))));
10264 alignment = member->structAlignment;
10265 if(alignment)
10266 {
10267 if(totalSize % alignment)
10268 totalSize += alignment - (totalSize % alignment);
10269 }
10270 totalSize += size;
10271 break;
10272 }
10273 }
10274 }
10275 }
10276 if(retSize)
10277 {
10278 unsigned int __simpleStruct0;
10279
10280 if(topMember && topMember->type == 1)
10281 *retSize = (__simpleStruct0 = *retSize, (__simpleStruct0 > totalSize) ? __simpleStruct0 : totalSize);
10282 else
10283 *retSize += totalSize;
10284 }
10285 else if(totalSize < maxSize && _class->type != 1000)
10286 {
10287 int autoPadding = 0;
10288
10289 if(!isMember && _class->structAlignment && totalSize % _class->structAlignment)
10290 autoPadding = _class->structAlignment - (totalSize % _class->structAlignment);
10291 if(totalSize + autoPadding < maxSize)
10292 {
10293 char sizeString[50];
10294
10295 sprintf(sizeString, "%d", maxSize - totalSize);
10296 ListAdd(declarations, MkClassDefDeclaration(MkStructDeclaration(MkListOne(MkSpecifier(CHAR)), MkListOne(MkDeclaratorArray(MkDeclaratorIdentifier(MkIdentifier("__ecere_padding")), MkExpConstant(sizeString))), (((void *)0)))));
10297 if(addedPadding)
10298 *addedPadding = 1;
10299 }
10300 }
10301 if(context)
10302 FinishTemplatesContext(context);
10303 return topMember ? topMember->memberID : _class->memberID;
10304 }
10305
10306 unsigned int MatchTypes(struct Type * source, struct Type * dest, struct __ecereNameSpace__ecere__sys__OldList * conversions, struct __ecereNameSpace__ecere__com__Class * owningClassSource, struct __ecereNameSpace__ecere__com__Class * owningClassDest, unsigned int doConversion, unsigned int enumBaseType, unsigned int acceptReversedParams, unsigned int isConversionExploration, unsigned int warnConst)
10307 {
10308 if(source && dest)
10309 {
10310 if(warnConst)
10311 CheckConstCompatibility(source, dest, 1);
10312 if(source->kind == 20 && dest->kind != 20)
10313 {
10314 struct Type * type = ProcessTemplateParameterType(source->__anon1.templateParameter);
10315
10316 if(type)
10317 source = type;
10318 }
10319 if(dest->kind == 20 && source->kind != 20)
10320 {
10321 struct Type * type = ProcessTemplateParameterType(dest->__anon1.templateParameter);
10322
10323 if(type)
10324 dest = type;
10325 }
10326 if(dest->classObjectType == 2 && dest->kind != 11)
10327 {
10328 if(source->classObjectType != 3)
10329 return 1;
10330 else
10331 {
10332 if((dest->__anon1._class && strcmp(dest->__anon1._class->string, "class")) || (source->__anon1._class && strcmp(source->__anon1._class->string, "class")))
10333 {
10334 return 1;
10335 }
10336 }
10337 }
10338 else
10339 {
10340 if(source->kind != 11 && source->classObjectType == 3)
10341 return 1;
10342 if(dest->kind != 11 && dest->classObjectType == 3 && source->classObjectType != 2)
10343 return 1;
10344 }
10345 if((dest->kind == 9 && source->kind == 9) || (dest->kind == 10 && source->kind == 10))
10346 {
10347 if((dest->__anon1.__anon1.enumName && source->__anon1.__anon1.enumName && !strcmp(dest->__anon1.__anon1.enumName, source->__anon1.__anon1.enumName)) || (source->__anon1.__anon1.members.first && source->__anon1.__anon1.members.first == dest->__anon1.__anon1.members.first))
10348 return 1;
10349 }
10350 if(dest->kind == 14 && source->kind != 0)
10351 return 1;
10352 if(dest->kind == 13 && dest->__anon1.type->kind == 0 && ((source->kind == 8 && (!source->__anon1._class || !source->__anon1._class->__anon1.registered || source->__anon1._class->__anon1.registered->type == 1 || source->__anon1._class->__anon1.registered->type == 0 || source->__anon1._class->__anon1.registered->type == 5 || source->__anon1._class->__anon1.registered->type == 1000)) || source->kind == 19 || source->kind == 13 || source->kind == 12 || source->kind == 11 || source->kind == 21))
10353 return 1;
10354 if(!isConversionExploration && source->kind == 13 && source->__anon1.type->kind == 0 && ((dest->kind == 8 && (!dest->__anon1._class || !dest->__anon1._class->__anon1.registered || dest->__anon1._class->__anon1.registered->type == 1 || dest->__anon1._class->__anon1.registered->type == 0 || dest->__anon1._class->__anon1.registered->type == 5 || dest->__anon1._class->__anon1.registered->type == 1000)) || dest->kind == 19 || dest->kind == 13 || dest->kind == 12 || dest->kind == 11 || dest->kind == 21))
10355 return 1;
10356 if(((source->kind == 8 && dest->kind == 8) || (source->kind == 19 && dest->kind == 19)) && source->__anon1._class)
10357 {
10358 if(source->__anon1._class->__anon1.registered && source->__anon1._class->__anon1.registered->type == 3)
10359 {
10360 if(conversions != (((void *)0)))
10361 {
10362 if(source->__anon1._class->__anon1.registered == dest->__anon1._class->__anon1.registered)
10363 return 1;
10364 }
10365 else
10366 {
10367 struct __ecereNameSpace__ecere__com__Class * sourceBase, * destBase;
10368
10369 for(sourceBase = source->__anon1._class->__anon1.registered; sourceBase && sourceBase->base->type != 1000; sourceBase = sourceBase->base)
10370 ;
10371 for(destBase = dest->__anon1._class->__anon1.registered; destBase && destBase->base->type != 1000; destBase = destBase->base)
10372 ;
10373 if(sourceBase == destBase)
10374 return 1;
10375 }
10376 }
10377 else if(source->__anon1._class && dest->__anon1._class && (dest->classObjectType == source->classObjectType || !dest->classObjectType) && (enumBaseType || (!source->__anon1._class->__anon1.registered || source->__anon1._class->__anon1.registered->type != 4) || (!dest->__anon1._class->__anon1.registered || dest->__anon1._class->__anon1.registered->type != 4)) && __ecereNameSpace__ecere__com__eClass_IsDerived(source->__anon1._class->__anon1.registered, dest->__anon1._class->__anon1.registered))
10378 return 1;
10379 else
10380 {
10381 if(dest->__anon1._class && dest->__anon1._class->__anon1.registered && source->__anon1._class && source->__anon1._class->__anon1.registered && (dest->casted || (enumBaseType && dest->__anon1._class->__anon1.registered->type == 4 && (source->kind == 8 || source->__anon1._class->__anon1.registered->type != 4))))
10382 {
10383 if(__ecereNameSpace__ecere__com__eClass_IsDerived(dest->__anon1._class->__anon1.registered, source->__anon1._class->__anon1.registered))
10384 {
10385 return 1;
10386 }
10387 }
10388 }
10389 }
10390 if(source->kind == 19 && dest->kind == 8 && dest->__anon1._class && !strcmp(dest->__anon1._class->string, "ecere::com::Class"))
10391 return 1;
10392 if(doConversion)
10393 {
10394 if(source->kind == 8)
10395 {
10396 struct __ecereNameSpace__ecere__com__Class * _class;
10397
10398 for(_class = source->__anon1._class ? source->__anon1._class->__anon1.registered : (((void *)0)); _class; _class = _class->base)
10399 {
10400 struct __ecereNameSpace__ecere__com__Property * convert;
10401
10402 for(convert = _class->conversions.first; convert; convert = convert->next)
10403 {
10404 if(convert->memberAccess == 1 || _class->module == privateModule)
10405 {
10406 struct Conversion * after = (conversions != (((void *)0))) ? conversions->last : (((void *)0));
10407
10408 if(!convert->dataType)
10409 convert->dataType = ProcessTypeString(convert->dataTypeString, 0);
10410 if((!isConversionExploration || convert->dataType->kind == 8 || !strcmp(_class->name, "String")) && MatchTypes(convert->dataType, dest, conversions, (((void *)0)), (((void *)0)), (convert->dataType->kind == 8 && !strcmp(convert->dataTypeString, "String")) ? 1 : 0, convert->dataType->kind == 8, 0, 1, warnConst))
10411 {
10412 if(!conversions && !convert->Get)
10413 return 1;
10414 else if(conversions != (((void *)0)))
10415 {
10416 if(_class->type == 3 && convert->dataType->kind == 8 && convert->dataType->__anon1._class && convert->dataType->__anon1._class->__anon1.registered && _class->base == convert->dataType->__anon1._class->__anon1.registered->base && (dest->kind != 8 || dest->__anon1._class->__anon1.registered != _class->base))
10417 return 1;
10418 else
10419 {
10420 struct Conversion * conv = (conv = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Conversion), conv->convert = convert, conv->isGet = 1, conv);
10421
10422 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert(conversions, after, conv);
10423 return 1;
10424 }
10425 }
10426 }
10427 }
10428 }
10429 }
10430 }
10431 if(dest->kind == 8)
10432 {
10433 struct __ecereNameSpace__ecere__com__Class * _class;
10434
10435 for(_class = dest->__anon1._class ? dest->__anon1._class->__anon1.registered : (((void *)0)); _class; _class = _class->base)
10436 {
10437 struct __ecereNameSpace__ecere__com__Property * convert;
10438
10439 for(convert = _class->conversions.first; convert; convert = convert->next)
10440 {
10441 if(convert->memberAccess == 1 || _class->module == privateModule)
10442 {
10443 struct Type * constType = (((void *)0));
10444 unsigned int success = 0;
10445
10446 if(!convert->dataType)
10447 convert->dataType = ProcessTypeString(convert->dataTypeString, 0);
10448 if(warnConst && convert->dataType->kind == 13 && convert->dataType->__anon1.type && dest->constant)
10449 {
10450 struct Type * ptrType = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
10451
10452 constType = __extension__ ({
10453 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
10454
10455 __ecereInstance1->kind = 13, __ecereInstance1->refCount = 1, __ecereInstance1->__anon1.type = ptrType, __ecereInstance1;
10456 });
10457 CopyTypeInto(ptrType, convert->dataType->__anon1.type);
10458 ptrType->constant = 1;
10459 }
10460 if((constType || convert->dataType != dest) && MatchTypes(source, constType ? constType : convert->dataType, conversions, (((void *)0)), (((void *)0)), 1, 0, 0, 1, warnConst))
10461 {
10462 if(!conversions && !convert->Set)
10463 success = 1;
10464 else if(conversions != (((void *)0)))
10465 {
10466 if(_class->type == 3 && convert->dataType->kind == 8 && convert->dataType->__anon1._class && convert->dataType->__anon1._class->__anon1.registered && _class->base == convert->dataType->__anon1._class->__anon1.registered->base && (source->kind != 8 || source->__anon1._class->__anon1.registered != _class->base))
10467 success = 1;
10468 else
10469 {
10470 struct Conversion * conv = (conv = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Conversion), conv->convert = convert, conv);
10471
10472 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(conversions, conv);
10473 success = 1;
10474 }
10475 }
10476 }
10477 if(constType)
10478 FreeType(constType);
10479 if(success)
10480 return 1;
10481 }
10482 }
10483 }
10484 if(enumBaseType && dest->__anon1._class && dest->__anon1._class->__anon1.registered && dest->__anon1._class->__anon1.registered->type == 4)
10485 {
10486 if(!dest->__anon1._class->__anon1.registered->dataType)
10487 dest->__anon1._class->__anon1.registered->dataType = ProcessTypeString(dest->__anon1._class->__anon1.registered->dataTypeString, 0);
10488 if(dest->__anon1._class->__anon1.registered->dataType->kind == 8 || source->truth || dest->truth)
10489 {
10490 if(MatchTypes(source, dest->__anon1._class->__anon1.registered->dataType, conversions, (((void *)0)), (((void *)0)), 1, dest->__anon1._class->__anon1.registered->dataType->kind == 8, 0, 0, warnConst))
10491 {
10492 return 1;
10493 }
10494 }
10495 }
10496 }
10497 if(source->kind == 8)
10498 {
10499 struct __ecereNameSpace__ecere__com__Class * _class;
10500
10501 for(_class = source->__anon1._class ? source->__anon1._class->__anon1.registered : (((void *)0)); _class; _class = _class->base)
10502 {
10503 struct __ecereNameSpace__ecere__com__Property * convert;
10504
10505 for(convert = _class->conversions.first; convert; convert = convert->next)
10506 {
10507 if(convert->memberAccess == 1 || _class->module == privateModule)
10508 {
10509 struct Conversion * after = (conversions != (((void *)0))) ? conversions->last : (((void *)0));
10510
10511 if(!convert->dataType)
10512 convert->dataType = ProcessTypeString(convert->dataTypeString, 0);
10513 if(convert->dataType != source && (!isConversionExploration || convert->dataType->kind == 8 || !strcmp(_class->name, "String")) && MatchTypes(convert->dataType, dest, conversions, (((void *)0)), (((void *)0)), convert->dataType->kind == 8, convert->dataType->kind == 8, 0, 1, warnConst))
10514 {
10515 if(!conversions && !convert->Get)
10516 return 1;
10517 else if(conversions != (((void *)0)))
10518 {
10519 if(_class->type == 3 && convert->dataType->kind == 8 && convert->dataType->__anon1._class && convert->dataType->__anon1._class->__anon1.registered && _class->base == convert->dataType->__anon1._class->__anon1.registered->base && (dest->kind != 8 || dest->__anon1._class->__anon1.registered != _class->base))
10520 return 1;
10521 else
10522 {
10523 struct Conversion * conv = (conv = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Conversion), conv->convert = convert, conv->isGet = 1, conv);
10524
10525 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert(conversions, after, conv);
10526 return 1;
10527 }
10528 }
10529 }
10530 }
10531 }
10532 }
10533 if(enumBaseType && source->__anon1._class && source->__anon1._class->__anon1.registered && source->__anon1._class->__anon1.registered->type == 4)
10534 {
10535 if(!source->__anon1._class->__anon1.registered->dataType)
10536 source->__anon1._class->__anon1.registered->dataType = ProcessTypeString(source->__anon1._class->__anon1.registered->dataTypeString, 0);
10537 if(!isConversionExploration || source->__anon1._class->__anon1.registered->dataType->kind == 8 || !strcmp(source->__anon1._class->__anon1.registered->name, "String"))
10538 {
10539 if(MatchTypes(source->__anon1._class->__anon1.registered->dataType, dest, conversions, (((void *)0)), (((void *)0)), source->__anon1._class->__anon1.registered->dataType->kind == 8, source->__anon1._class->__anon1.registered->dataType->kind == 8, 0, 0, warnConst))
10540 return 1;
10541 else if(MatchTypes(dest, source->__anon1._class->__anon1.registered->dataType, (((void *)0)), (((void *)0)), (((void *)0)), 0, 0, 0, 0, warnConst))
10542 return 1;
10543 }
10544 }
10545 }
10546 }
10547 if(source->kind == 8 || source->kind == 19)
10548 ;
10549 else if(dest->kind == source->kind && (dest->kind != 9 && dest->kind != 10 && dest->kind != 11 && dest->kind != 12 && dest->kind != 13 && dest->kind != 16))
10550 return 1;
10551 else if(dest->kind == 7 && source->kind == 6)
10552 return 1;
10553 else if(dest->kind == 2 && (source->kind == 1 || source->kind == 24))
10554 return 1;
10555 else if(dest->kind == 3 && (source->kind == 2 || source->kind == 1 || source->kind == 24 || source->kind == 23))
10556 return 1;
10557 else if(dest->kind == 4 && (source->kind == 2 || source->kind == 1 || source->kind == 24 || source->kind == 3 || source->kind == 22 || source->kind == 23))
10558 return 1;
10559 else if(dest->kind == 22 && (source->kind == 2 || source->kind == 1 || source->kind == 24 || source->kind == 3 || source->kind == 23 || source->kind == 4))
10560 return 1;
10561 else if(dest->kind == 23 && (source->kind == 2 || source->kind == 1 || source->kind == 24 || source->kind == 3 || source->kind == 4 || source->kind == 22))
10562 return 1;
10563 else if(source->kind == 15 && (dest->kind == 3 || dest->kind == 2 || dest->kind == 1 || source->kind == 24 || dest->kind == 5 || dest->kind == 4 || dest->kind == 22 || dest->kind == 23))
10564 return 1;
10565 else if(dest->kind == 15 && !isConversionExploration && (source->kind == 3 || source->kind == 2 || source->kind == 1 || source->kind == 24 || source->kind == 5 || source->kind == 4 || source->kind == 22 || source->kind == 23))
10566 return 1;
10567 else if((dest->kind == 11 || (dest->kind == 13 && dest->__anon1.type->kind == 11) || dest->kind == 16) && ((source->kind == 11 || (source->kind == 13 && source->__anon1.type->kind == 11) || source->kind == 16)))
10568 {
10569 struct Type * paramSource, * paramDest;
10570
10571 if(dest->kind == 16)
10572 owningClassDest = dest->__anon1.__anon3.methodClass ? dest->__anon1.__anon3.methodClass : dest->__anon1.__anon3.method->_class;
10573 if(source->kind == 16)
10574 owningClassSource = source->__anon1.__anon3.methodClass ? source->__anon1.__anon3.methodClass : source->__anon1.__anon3.method->_class;
10575 if(dest->kind == 13 && dest->__anon1.type->kind == 11)
10576 dest = dest->__anon1.type;
10577 if(source->kind == 13 && source->__anon1.type->kind == 11)
10578 source = source->__anon1.type;
10579 if(dest->kind == 16)
10580 dest = dest->__anon1.__anon3.method->dataType;
10581 if(source->kind == 16)
10582 source = source->__anon1.__anon3.method->dataType;
10583 paramSource = source->__anon1.__anon2.params.first;
10584 if(paramSource && paramSource->kind == 0)
10585 paramSource = (((void *)0));
10586 paramDest = dest->__anon1.__anon2.params.first;
10587 if(paramDest && paramDest->kind == 0)
10588 paramDest = (((void *)0));
10589 if((dest->__anon1.__anon2.staticMethod || (!dest->__anon1.__anon2.thisClass && !owningClassDest)) && !(source->__anon1.__anon2.staticMethod || (!source->__anon1.__anon2.thisClass && !owningClassSource)))
10590 {
10591 if(!paramDest || (!(paramDest->kind == 13 && paramDest->__anon1.type && paramDest->__anon1.type->kind == 0) && (paramDest->kind != 8 || !__ecereNameSpace__ecere__com__eClass_IsDerived(source->__anon1.__anon2.thisClass ? source->__anon1.__anon2.thisClass->__anon1.registered : owningClassSource, paramDest->__anon1._class->__anon1.registered))))
10592 {
10593 if(paramDest && paramDest->kind == 8)
10594 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "method class must be derived from %s\n", (((void *)0))), paramDest->__anon1._class->string);
10595 else
10596 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "method class should not take an object\n", (((void *)0))));
10597 return 0;
10598 }
10599 paramDest = paramDest->next;
10600 }
10601 else if(!dest->__anon1.__anon2.staticMethod && (dest->__anon1.__anon2.thisClass || owningClassDest))
10602 {
10603 if((source->__anon1.__anon2.staticMethod || (!source->__anon1.__anon2.thisClass && !owningClassSource)))
10604 {
10605 if(dest->__anon1.__anon2.thisClass)
10606 {
10607 if(!paramSource || paramSource->kind != 8 || !__ecereNameSpace__ecere__com__eClass_IsDerived(paramSource->__anon1._class->__anon1.registered, dest->__anon1.__anon2.thisClass->__anon1.registered))
10608 {
10609 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "method class must be derived from %s\n", (((void *)0))), dest->__anon1.__anon2.thisClass->string);
10610 return 0;
10611 }
10612 }
10613 else
10614 {
10615 if(!paramSource || paramSource->kind != 8 || (owningClassDest && !__ecereNameSpace__ecere__com__eClass_IsDerived(paramSource->__anon1._class->__anon1.registered, owningClassDest)))
10616 {
10617 if(owningClassDest)
10618 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "%s expected to be derived from method class\n", (((void *)0))), owningClassDest->fullName);
10619 else
10620 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "overriding class expected to be derived from method class\n", (((void *)0))));
10621 return 0;
10622 }
10623 }
10624 paramSource = paramSource->next;
10625 }
10626 else
10627 {
10628 if(dest->__anon1.__anon2.thisClass)
10629 {
10630 if(!__ecereNameSpace__ecere__com__eClass_IsDerived(source->__anon1.__anon2.thisClass ? source->__anon1.__anon2.thisClass->__anon1.registered : owningClassSource, dest->__anon1.__anon2.thisClass->__anon1.registered))
10631 {
10632 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "method class must be derived from %s\n", (((void *)0))), dest->__anon1.__anon2.thisClass->string);
10633 return 0;
10634 }
10635 }
10636 else
10637 {
10638 if(source->__anon1.__anon2.thisClass && source->__anon1.__anon2.thisClass->__anon1.registered && owningClassDest && !__ecereNameSpace__ecere__com__eClass_IsDerived(source->__anon1.__anon2.thisClass->__anon1.registered, owningClassDest))
10639 {
10640 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "%s expected to be derived from method class\n", (((void *)0))), source->__anon1.__anon2.thisClass->__anon1.registered->fullName);
10641 return 0;
10642 }
10643 }
10644 }
10645 }
10646 if(!MatchTypes(source->__anon1.__anon2.returnType, dest->__anon1.__anon2.returnType, (((void *)0)), (((void *)0)), (((void *)0)), 1, 1, 0, 0, warnConst))
10647 {
10648 Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "incompatible return type for function\n", (((void *)0))));
10649 return 0;
10650 }
10651 else
10652 CheckConstCompatibility(dest->__anon1.__anon2.returnType, source->__anon1.__anon2.returnType, 1);
10653 for(; paramDest; paramDest = paramDest->next)
10654 {
10655 if(!paramSource)
10656 {
10657 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "not enough parameters\n", (((void *)0))));
10658 return 0;
10659 }
10660 {
10661 struct Type * paramDestType = paramDest;
10662 struct Type * paramSourceType = paramSource;
10663 struct Type * type = paramDestType;
10664
10665 if(paramDest->kind == 20 && paramDest->__anon1.templateParameter->type == 0 && owningClassSource && paramSource->kind != 20)
10666 {
10667 int id = 0;
10668 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * curParam = (((void *)0));
10669 struct __ecereNameSpace__ecere__com__Class * sClass;
10670
10671 for(sClass = owningClassSource; sClass; sClass = sClass->base)
10672 {
10673 id = 0;
10674 if(sClass->templateClass)
10675 sClass = sClass->templateClass;
10676 for(curParam = sClass->templateParams.first; curParam; curParam = curParam->next)
10677 {
10678 if(curParam->type == 0 && !strcmp(type->__anon1.templateParameter->identifier->string, curParam->name))
10679 {
10680 for(sClass = sClass->base; sClass; sClass = sClass->base)
10681 {
10682 if(sClass->templateClass)
10683 sClass = sClass->templateClass;
10684 id += sClass->templateParams.count;
10685 }
10686 break;
10687 }
10688 id++;
10689 }
10690 if(curParam)
10691 break;
10692 }
10693 if(curParam)
10694 {
10695 struct __ecereNameSpace__ecere__com__ClassTemplateArgument arg = owningClassSource->templateArgs[id];
10696
10697 paramDestType = type = ProcessTypeString(arg.__anon1.__anon1.dataTypeString, 0);
10698 }
10699 }
10700 if(!MatchTypes(paramDestType, paramSourceType, (((void *)0)), (((void *)0)), (((void *)0)), 1, 1, 0, 0, warnConst) && (!acceptReversedParams || !MatchTypes(paramSourceType, paramDestType, (((void *)0)), (((void *)0)), (((void *)0)), 1, 1, 0, 0, warnConst)))
10701 {
10702 char type[1024];
10703
10704 type[0] = 0;
10705 PrintType(paramDest, type, 0, 1);
10706 Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "incompatible parameter %s (expected %s)\n", (((void *)0))), paramSource->name, type);
10707 if(paramDestType != paramDest)
10708 FreeType(paramDestType);
10709 return 0;
10710 }
10711 if(paramDestType != paramDest)
10712 FreeType(paramDestType);
10713 }
10714 paramSource = paramSource->next;
10715 }
10716 if(paramSource)
10717 {
10718 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "too many parameters\n", (((void *)0))));
10719 return 0;
10720 }
10721 return 1;
10722 }
10723 else if((dest->kind == 11 || (dest->kind == 13 && dest->__anon1.type->kind == 11) || dest->kind == 16) && (source->kind == 13 && source->__anon1.type->kind == 0))
10724 {
10725 return 1;
10726 }
10727 else if((dest->kind == 13 || dest->kind == 12) && (source->kind == 12 || source->kind == 13))
10728 {
10729 if(!(dest->__anon1.type && dest->__anon1.type->kind == 13 && source->__anon1.type->kind == 8 && source->__anon1.type->__anon1._class && source->__anon1.type->__anon1._class->__anon1.registered && (source->__anon1.type->__anon1._class->__anon1.registered->type != 0 && source->__anon1.type->__anon1._class->__anon1.registered->type != 5) && !source->__anon1.type->byReference))
10730 {
10731 ComputeTypeSize(source->__anon1.type);
10732 ComputeTypeSize(dest->__anon1.type);
10733 if(source->__anon1.type->size == dest->__anon1.type->size && MatchTypes(source->__anon1.type, dest->__anon1.type, (((void *)0)), (((void *)0)), (((void *)0)), 1, 1, 0, 0, warnConst))
10734 return 1;
10735 }
10736 }
10737 }
10738 return 0;
10739 }
10740
10741 void CallOperator(struct Expression * exp, struct Expression * exp1, struct Expression * exp2, struct Operand * op1, struct Operand * op2)
10742 {
10743 if(exp->__anon1.op.op == SIZEOF)
10744 {
10745 FreeExpContents(exp);
10746 exp->type = 2;
10747 exp->__anon1.__anon1.constant = PrintUInt(ComputeTypeSize(op1->type));
10748 }
10749 else
10750 {
10751 if(!exp->__anon1.op.exp1)
10752 {
10753 switch(exp->__anon1.op.op)
10754 {
10755 case '+':
10756 {
10757 struct Expression * exp2 = exp->__anon1.op.exp2;
10758
10759 exp->__anon1.op.exp2 = (((void *)0));
10760 FreeExpContents(exp);
10761 FreeType(exp->expType);
10762 FreeType(exp->destType);
10763 *exp = *exp2;
10764 ((exp2 ? __extension__ ({
10765 void * __ecerePtrToDelete = (exp2);
10766
10767 __ecereClass_Expression->Destructor ? __ecereClass_Expression->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete);
10768 }) : 0), exp2 = 0);
10769 break;
10770 }
10771 case '-':
10772 if(op1->ops.Neg)
10773 {
10774 FreeExpContents(exp);
10775 op1->ops.Neg(exp, op1);
10776 }
10777 break;
10778 case '~':
10779 if(op1->ops.BitNot)
10780 {
10781 FreeExpContents(exp);
10782 op1->ops.BitNot(exp, op1);
10783 }
10784 break;
10785 case '!':
10786 if(op1->ops.Not)
10787 {
10788 FreeExpContents(exp);
10789 op1->ops.Not(exp, op1);
10790 }
10791 break;
10792 }
10793 }
10794 else
10795 {
10796 if(op1 && op2 && op1->type && op2->type && op1->kind != op2->kind)
10797 {
10798 if(Promote(op2, op1->kind, op1->type->isSigned))
10799 op2->kind = op1->kind, op2->ops = op1->ops;
10800 else if(Promote(op1, op2->kind, op2->type->isSigned))
10801 op1->kind = op2->kind, op1->ops = op2->ops;
10802 }
10803 switch(exp->__anon1.op.op)
10804 {
10805 case '+':
10806 if(op1->ops.Add)
10807 {
10808 FreeExpContents(exp);
10809 op1->ops.Add(exp, op1, op2);
10810 }
10811 break;
10812 case '-':
10813 if(op1->ops.Sub)
10814 {
10815 FreeExpContents(exp);
10816 op1->ops.Sub(exp, op1, op2);
10817 }
10818 break;
10819 case '*':
10820 if(op1->ops.Mul)
10821 {
10822 FreeExpContents(exp);
10823 op1->ops.Mul(exp, op1, op2);
10824 }
10825 break;
10826 case '/':
10827 if(op1->ops.Div)
10828 {
10829 FreeExpContents(exp);
10830 op1->ops.Div(exp, op1, op2);
10831 }
10832 break;
10833 case '%':
10834 if(op1->ops.Mod)
10835 {
10836 FreeExpContents(exp);
10837 op1->ops.Mod(exp, op1, op2);
10838 }
10839 break;
10840 case '&':
10841 if(exp->__anon1.op.exp2)
10842 {
10843 if(op1->ops.BitAnd)
10844 {
10845 FreeExpContents(exp);
10846 op1->ops.BitAnd(exp, op1, op2);
10847 }
10848 }
10849 break;
10850 case '|':
10851 if(op1->ops.BitOr)
10852 {
10853 FreeExpContents(exp);
10854 op1->ops.BitOr(exp, op1, op2);
10855 }
10856 break;
10857 case '^':
10858 if(op1->ops.BitXor)
10859 {
10860 FreeExpContents(exp);
10861 op1->ops.BitXor(exp, op1, op2);
10862 }
10863 break;
10864 case LEFT_OP:
10865 if(op1->ops.LShift)
10866 {
10867 FreeExpContents(exp);
10868 op1->ops.LShift(exp, op1, op2);
10869 }
10870 break;
10871 case RIGHT_OP:
10872 if(op1->ops.RShift)
10873 {
10874 FreeExpContents(exp);
10875 op1->ops.RShift(exp, op1, op2);
10876 }
10877 break;
10878 case EQ_OP:
10879 if(op1->ops.Equ)
10880 {
10881 FreeExpContents(exp);
10882 op1->ops.Equ(exp, op1, op2);
10883 }
10884 break;
10885 case NE_OP:
10886 if(op1->ops.Nqu)
10887 {
10888 FreeExpContents(exp);
10889 op1->ops.Nqu(exp, op1, op2);
10890 }
10891 break;
10892 case AND_OP:
10893 if(op1->ops.And)
10894 {
10895 FreeExpContents(exp);
10896 op1->ops.And(exp, op1, op2);
10897 }
10898 break;
10899 case OR_OP:
10900 if(op1->ops.Or)
10901 {
10902 FreeExpContents(exp);
10903 op1->ops.Or(exp, op1, op2);
10904 }
10905 break;
10906 case '>':
10907 if(op1->ops.Grt)
10908 {
10909 FreeExpContents(exp);
10910 op1->ops.Grt(exp, op1, op2);
10911 }
10912 break;
10913 case '<':
10914 if(op1->ops.Sma)
10915 {
10916 FreeExpContents(exp);
10917 op1->ops.Sma(exp, op1, op2);
10918 }
10919 break;
10920 case GE_OP:
10921 if(op1->ops.GrtEqu)
10922 {
10923 FreeExpContents(exp);
10924 op1->ops.GrtEqu(exp, op1, op2);
10925 }
10926 break;
10927 case LE_OP:
10928 if(op1->ops.SmaEqu)
10929 {
10930 FreeExpContents(exp);
10931 op1->ops.SmaEqu(exp, op1, op2);
10932 }
10933 break;
10934 }
10935 }
10936 }
10937 }
10938
10939 void ApplyAnyObjectLogic(struct Expression * e)
10940 {
10941 struct Type * destType = e->destType;
10942
10943 if(destType && (destType->classObjectType == 3))
10944 {
10945 if(e && e->expType)
10946 {
10947 struct Type * type = e->expType;
10948 struct __ecereNameSpace__ecere__com__Class * _class = (((void *)0));
10949
10950 if(type->kind == 8 && type->__anon1._class && type->__anon1._class->__anon1.registered)
10951 {
10952 _class = type->__anon1._class->__anon1.registered;
10953 }
10954 else if(type->kind == 19)
10955 {
10956 _class = FindClass("ecere::com::Class")->__anon1.registered;
10957 }
10958 else
10959 {
10960 char string[1024] = "";
10961 struct Symbol * classSym;
10962
10963 PrintTypeNoConst(type, string, 0, 1);
10964 classSym = FindClass(string);
10965 if(classSym)
10966 _class = classSym->__anon1.registered;
10967 }
10968 if((_class && (_class->type == 4 || _class->type == 3 || _class->type == 2 || _class->type == 1000) && strcmp(_class->fullName, "class") && strcmp(_class->fullName, "uintptr") && strcmp(_class->fullName, "intptr")) || (!e->expType->classObjectType && (((type->kind != 13 && type->kind != 22 && type->kind != 19 && (type->kind != 8 || !type->__anon1._class || !type->__anon1._class->__anon1.registered || type->__anon1._class->__anon1.registered->type == 1))) || destType->byReference)))
10969 {
10970 if(!_class || strcmp(_class->fullName, "char *"))
10971 {
10972 struct Expression * checkedExp = e, * newExp;
10973
10974 while(((checkedExp->type == 5 || checkedExp->type == 32 || checkedExp->type == 23) && checkedExp->__anon1.list) || checkedExp->type == 11)
10975 {
10976 if(checkedExp->type == 5 || checkedExp->type == 32 || checkedExp->type == 23)
10977 {
10978 if(checkedExp->type == 23)
10979 {
10980 checkedExp = (*((struct Statement *)(*checkedExp->__anon1.compound->__anon1.compound.statements).last)->__anon1.expressions).last;
10981 }
10982 else
10983 checkedExp = (*checkedExp->__anon1.list).last;
10984 }
10985 else if(checkedExp->type == 11)
10986 checkedExp = checkedExp->__anon1.cast.exp;
10987 }
10988 if(checkedExp && checkedExp->type == 4 && checkedExp->__anon1.op.op == '*' && !checkedExp->__anon1.op.exp1)
10989 {
10990 newExp = checkedExp->__anon1.op.exp2;
10991 checkedExp->__anon1.op.exp2 = (((void *)0));
10992 FreeExpContents(checkedExp);
10993 if(e->expType && e->expType->passAsTemplate)
10994 {
10995 char size[100];
10996
10997 ComputeTypeSize(e->expType);
10998 sprintf(size, "%d", e->expType->size);
10999 newExp = MkExpBrackets(MkListOne(MkExpOp(MkExpCast(MkTypeName(MkListOne(MkSpecifier(CHAR)), MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), (((void *)0)))), newExp), '+', MkExpCall(MkExpIdentifier(MkIdentifier("__ENDIAN_PAD")), MkListOne(MkExpConstant(size))))));
11000 }
11001 ReplaceExpContents(checkedExp, newExp);
11002 e->byReference = 1;
11003 }
11004 else if(!e->byReference || (_class && _class->type == 5))
11005 {
11006 struct Expression * checkedExp;
11007
11008 {
11009 unsigned int hasAddress = e->type == 0 || (e->type == 8 && e->__anon1.member.memberType == 3) || (e->type == 9 && e->__anon1.member.memberType == 3) || (e->type == 4 && !e->__anon1.op.exp1 && e->__anon1.op.op == '*') || e->type == 6;
11010
11011 if(_class && _class->type != 5 && _class->type != 0 && _class->type != 1 && !hasAddress)
11012 {
11013 struct Context * context = PushContext();
11014 struct Declarator * decl;
11015 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
11016 char typeString[1024];
11017 struct Expression * newExp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression);
11018
11019 typeString[0] = '\0';
11020 *newExp = *e;
11021 newExp->prev = (((void *)0));
11022 newExp->next = (((void *)0));
11023 newExp->expType = (((void *)0));
11024 PrintTypeNoConst(e->expType, typeString, 0, 1);
11025 decl = SpecDeclFromString(typeString, specs, (((void *)0)));
11026 newExp->destType = ProcessType(specs, decl);
11027 curContext = context;
11028 if(curCompound)
11029 {
11030 char name[100];
11031 struct __ecereNameSpace__ecere__sys__OldList * stmts = MkList();
11032
11033 e->type = 23;
11034 sprintf(name, "__internalValue%03X", internalValueCounter++);
11035 if(!curCompound->__anon1.compound.declarations)
11036 curCompound->__anon1.compound.declarations = MkList();
11037 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*curCompound->__anon1.compound.declarations), (((void *)0)), MkDeclaration(specs, MkListOne(MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier(name)), (((void *)0))))));
11038 ListAdd(stmts, MkExpressionStmt(MkListOne(MkExpOp(MkExpIdentifier(MkIdentifier(name)), '=', newExp))));
11039 ListAdd(stmts, MkExpressionStmt(MkListOne(MkExpIdentifier(MkIdentifier(name)))));
11040 e->__anon1.compound = MkCompoundStmt((((void *)0)), stmts);
11041 }
11042 else
11043 printf("libec: compiler error, curCompound is null in ApplyAnyObjectLogic\n");
11044 {
11045 struct Type * type = e->destType;
11046
11047 e->destType = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
11048 CopyTypeInto(e->destType, type);
11049 e->destType->refCount = 1;
11050 e->destType->classObjectType = 0;
11051 FreeType(type);
11052 }
11053 e->__anon1.compound->__anon1.compound.context = context;
11054 PopContext(context);
11055 curContext = context->parent;
11056 }
11057 }
11058 checkedExp = e;
11059 while(((checkedExp->type == 5 || checkedExp->type == 32 || checkedExp->type == 23) && checkedExp->__anon1.list) || checkedExp->type == 11)
11060 {
11061 if(checkedExp->type == 5 || checkedExp->type == 32 || checkedExp->type == 23)
11062 {
11063 if(checkedExp->type == 23)
11064 {
11065 checkedExp = (*((struct Statement *)(*checkedExp->__anon1.compound->__anon1.compound.statements).last)->__anon1.expressions).last;
11066 }
11067 else
11068 checkedExp = (*checkedExp->__anon1.list).last;
11069 }
11070 else if(checkedExp->type == 11)
11071 checkedExp = checkedExp->__anon1.cast.exp;
11072 }
11073 {
11074 struct Expression * operand = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression);
11075
11076 *operand = *checkedExp;
11077 __ecereMethod_Expression_Clear(checkedExp);
11078 checkedExp->destType = ProcessTypeString("void *", 0);
11079 checkedExp->expType = checkedExp->destType;
11080 checkedExp->destType->refCount++;
11081 checkedExp->type = 4;
11082 checkedExp->__anon1.op.op = '&';
11083 checkedExp->__anon1.op.exp1 = (((void *)0));
11084 checkedExp->__anon1.op.exp2 = operand;
11085 }
11086 }
11087 }
11088 }
11089 }
11090 }
11091 {
11092 }
11093 if((!destType || destType->kind == 14 || destType->kind == 0) && e->expType && (e->expType->classObjectType == 3 || e->expType->classObjectType == 2) && (e->expType->byReference || (e->expType->kind == 8 && e->expType->__anon1._class && e->expType->__anon1._class->__anon1.registered && (e->expType->__anon1._class->__anon1.registered->type == 2 || e->expType->__anon1._class->__anon1.registered->type == 4 || e->expType->__anon1._class->__anon1.registered->type == 3))))
11094 {
11095 if(e->expType->classObjectType && destType && destType->classObjectType)
11096 {
11097 return ;
11098 }
11099 else
11100 {
11101 struct Expression * thisExp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression);
11102
11103 *thisExp = *e;
11104 thisExp->prev = (((void *)0));
11105 thisExp->next = (((void *)0));
11106 __ecereMethod_Expression_Clear(e);
11107 e->type = 5;
11108 e->__anon1.list = MkListOne(MkExpOp((((void *)0)), '*', thisExp->type == 0 ? thisExp : MkExpBrackets(MkListOne(thisExp))));
11109 if(thisExp->expType->kind == 8 && thisExp->expType->__anon1._class && thisExp->expType->__anon1._class->__anon1.registered && thisExp->expType->__anon1._class->__anon1.registered->type == 5)
11110 ((struct Expression *)(*e->__anon1.list).first)->byReference = 1;
11111 {
11112 e->expType = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
11113 CopyTypeInto(e->expType, thisExp->expType);
11114 e->expType->byReference = 0;
11115 e->expType->refCount = 1;
11116 if(e->expType->kind == 8 && e->expType->__anon1._class && e->expType->__anon1._class->__anon1.registered && (e->expType->__anon1._class->__anon1.registered->type == 2 || e->expType->__anon1._class->__anon1.registered->type == 4 || e->expType->__anon1._class->__anon1.registered->type == 3))
11117 {
11118 e->expType->classObjectType = 0;
11119 }
11120 }
11121 }
11122 }
11123 else if(destType && e->expType && (e->expType->classObjectType == 3 || e->expType->classObjectType == 2) && !destType->classObjectType && destType->kind != 0)
11124 {
11125 if(destType->kind == 14)
11126 {
11127 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Unspecified type\n", (((void *)0))));
11128 }
11129 else if(!(destType->truth && e->expType->kind == 8 && e->expType->__anon1._class && e->expType->__anon1._class->__anon1.registered && e->expType->__anon1._class->__anon1.registered->type == 1))
11130 {
11131 unsigned int byReference = e->expType->byReference;
11132 struct Expression * thisExp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression);
11133 struct Declarator * decl;
11134 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
11135 char typeString[1024];
11136 struct Type * type;
11137 int backupClassObjectType;
11138 unsigned int backupByReference;
11139
11140 if(e->expType->kind == 8 && e->expType->__anon1._class && e->expType->__anon1._class->__anon1.registered && strcmp(e->expType->__anon1._class->__anon1.registered->name, "class"))
11141 type = e->expType;
11142 else
11143 type = destType;
11144 backupClassObjectType = type->classObjectType;
11145 backupByReference = type->byReference;
11146 type->classObjectType = 0;
11147 type->byReference = 0;
11148 typeString[0] = '\0';
11149 PrintType(type, typeString, 0, 1);
11150 decl = SpecDeclFromString(typeString, specs, (((void *)0)));
11151 type->classObjectType = backupClassObjectType;
11152 type->byReference = backupByReference;
11153 *thisExp = *e;
11154 thisExp->prev = (((void *)0));
11155 thisExp->next = (((void *)0));
11156 __ecereMethod_Expression_Clear(e);
11157 if((type->kind == 8 && type->__anon1._class && type->__anon1._class->__anon1.registered && (type->__anon1._class->__anon1.registered->type == 1000 || type->__anon1._class->__anon1.registered->type == 2 || type->__anon1._class->__anon1.registered->type == 4 || type->__anon1._class->__anon1.registered->type == 3)) || (type->kind != 13 && type->kind != 22 && type->kind != 12 && type->kind != 8) || (!destType->byReference && byReference && (destType->kind != 13 || type->kind != 13)))
11158 {
11159 unsigned int passAsTemplate = thisExp->destType->passAsTemplate;
11160 struct Type * t;
11161
11162 destType->refCount++;
11163 e->type = 4;
11164 e->__anon1.op.op = '*';
11165 e->__anon1.op.exp1 = (((void *)0));
11166 e->__anon1.op.exp2 = MkExpCast(MkTypeName(specs, MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), decl)), thisExp);
11167 t = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
11168 CopyTypeInto(t, thisExp->destType);
11169 t->passAsTemplate = 0;
11170 FreeType(thisExp->destType);
11171 thisExp->destType = t;
11172 t = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
11173 CopyTypeInto(t, destType);
11174 t->passAsTemplate = passAsTemplate;
11175 FreeType(destType);
11176 destType = t;
11177 destType->refCount = 0;
11178 e->expType = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
11179 CopyTypeInto(e->expType, type);
11180 if(type->passAsTemplate)
11181 {
11182 e->expType->classObjectType = 0;
11183 e->expType->passAsTemplate = 0;
11184 }
11185 e->expType->byReference = 0;
11186 e->expType->refCount = 1;
11187 }
11188 else
11189 {
11190 e->type = 11;
11191 e->__anon1.cast.typeName = MkTypeName(specs, decl);
11192 e->__anon1.cast.exp = thisExp;
11193 e->byReference = 1;
11194 e->expType = type;
11195 type->refCount++;
11196 }
11197 if(e->destType)
11198 FreeType(e->destType);
11199 e->destType = destType;
11200 destType->refCount++;
11201 }
11202 }
11203 }
11204
11205 void ComputeModuleClasses(struct __ecereNameSpace__ecere__com__Instance * module)
11206 {
11207 struct __ecereNameSpace__ecere__com__Class * _class;
11208 struct __ecereNameSpace__ecere__sys__OldLink * subModule;
11209
11210 for(subModule = ((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->modules.first; subModule; subModule = subModule->next)
11211 ComputeModuleClasses(subModule->data);
11212 for(_class = ((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->classes.first; _class; _class = _class->next)
11213 ComputeClassMembers(_class, 0);
11214 }
11215
11216 struct External * _DeclareStruct(struct External * neededBy, const char * name, unsigned int skipNoHead, unsigned int needDereference, unsigned int fwdDecl)
11217 {
11218 struct External * external = (((void *)0));
11219 struct Symbol * classSym = FindClass(name);
11220 struct __ecereNameSpace__ecere__sys__OldList * curDeclarations = (((void *)0));
11221
11222 if(!inCompiler || !classSym)
11223 return (((void *)0));
11224 if(classSym->__anon1.registered && (classSym->__anon1.registered->type == 2 || classSym->__anon1.registered->type == 3 || classSym->__anon1.registered->type == 4))
11225 return (((void *)0));
11226 if(!classSym->__anon1.registered || (classSym->__anon1.registered->type == 0 && classSym->__anon1.registered->structSize && classSym->__anon1.registered->base && classSym->__anon1.registered->base->base))
11227 _DeclareStruct(neededBy, "ecere::com::Instance", 0, 1, fwdDecl);
11228 external = classSym->__anon2.__anon1.structExternal;
11229 if(external && external->__anon1.declaration)
11230 {
11231 struct Specifier * spec;
11232
11233 for(spec = external->__anon1.declaration->__anon1.__anon1.specifiers ? (*external->__anon1.declaration->__anon1.__anon1.specifiers).first : (((void *)0)); spec; spec = spec->next)
11234 if(spec->type == 3 || spec->type == 4)
11235 {
11236 curDeclarations = spec->__anon1.__anon2.definitions;
11237 break;
11238 }
11239 }
11240 if(classSym->__anon1.registered && !classSym->declaring && classSym->imported && (!classSym->declaredStructSym || (classSym->__anon1.registered->type == 5 && !skipNoHead && external && !curDeclarations)))
11241 {
11242 struct __ecereNameSpace__ecere__sys__OldList * specifiers, * declarators;
11243 struct __ecereNameSpace__ecere__sys__OldList * declarations = (((void *)0));
11244 char structName[1024];
11245 unsigned int addedPadding = 0;
11246 struct Specifier * curSpec = (((void *)0));
11247
11248 classSym->declaring++;
11249 if(strchr(classSym->string, '<'))
11250 {
11251 if(classSym->__anon1.registered->templateClass)
11252 external = _DeclareStruct(neededBy, classSym->__anon1.registered->templateClass->fullName, skipNoHead, needDereference, fwdDecl);
11253 classSym->declaring--;
11254 return external;
11255 }
11256 structName[0] = 0;
11257 FullClassNameCat(structName, name, 0);
11258 classSym->declaredStructSym = 1;
11259 if(!external || (classSym->__anon1.registered->type == 5 && !skipNoHead && !curDeclarations))
11260 {
11261 unsigned int add = 0;
11262
11263 if(!external)
11264 {
11265 external = MkExternalDeclaration((((void *)0)));
11266 classSym->__anon2.__anon1.structExternal = external;
11267 external->symbol = classSym;
11268 add = 1;
11269 }
11270 if(!skipNoHead)
11271 {
11272 declarations = MkList();
11273 AddMembers(external, declarations, classSym->__anon1.registered, 0, (((void *)0)), classSym->__anon1.registered, &addedPadding);
11274 }
11275 if(external->__anon1.declaration)
11276 {
11277 struct Specifier * spec;
11278
11279 for(spec = external->__anon1.declaration->__anon1.__anon1.specifiers ? (*external->__anon1.declaration->__anon1.__anon1.specifiers).first : (((void *)0)); spec; spec = spec->next)
11280 if(spec->type == 3 || spec->type == 4)
11281 {
11282 curSpec = spec;
11283 curDeclarations = spec->__anon1.__anon2.definitions;
11284 break;
11285 }
11286 }
11287 if(declarations && (!(*declarations).count || ((*declarations).count == 1 && addedPadding)))
11288 {
11289 FreeList(declarations, (void *)(FreeClassDef));
11290 declarations = (((void *)0));
11291 }
11292 if(classSym->__anon1.registered->type != 5 && !declarations)
11293 {
11294 FreeExternal(external);
11295 external = (((void *)0));
11296 classSym->__anon2.__anon1.structExternal = (((void *)0));
11297 }
11298 else
11299 {
11300 if(curSpec)
11301 curSpec->__anon1.__anon2.definitions = declarations;
11302 else
11303 {
11304 specifiers = MkList();
11305 declarators = MkList();
11306 ListAdd(specifiers, MkStructOrUnion(3, MkIdentifier(structName), declarations));
11307 external->__anon1.declaration = MkDeclaration(specifiers, declarators);
11308 }
11309 if(add)
11310 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add((&*ast), external);
11311 }
11312 }
11313 classSym->declaring--;
11314 }
11315 else if(!classSym->declaredStructSym && classSym->__anon2.__anon1.structExternal)
11316 {
11317 classSym->declaredStructSym = 1;
11318 if(classSym->__anon1.registered)
11319 DeclareMembers(classSym->__anon2.__anon1.structExternal, classSym->__anon1.registered, 0);
11320 if(classSym->__anon2.__anon1.structExternal->__anon1.declaration && classSym->__anon2.__anon1.structExternal->__anon1.declaration->__anon1.__anon1.specifiers)
11321 {
11322 struct Specifier * spec;
11323
11324 for(spec = (*classSym->__anon2.__anon1.structExternal->__anon1.declaration->__anon1.__anon1.specifiers).first; spec; spec = spec->next)
11325 {
11326 if(spec->__anon1.__anon2.definitions)
11327 IdentifyAnonStructs(spec->__anon1.__anon2.definitions);
11328 }
11329 }
11330 }
11331 if(inCompiler && neededBy && (external || !classSym->imported))
11332 {
11333 if(!external)
11334 {
11335 classSym->__anon2.__anon1.structExternal = external = MkExternalDeclaration((((void *)0)));
11336 external->symbol = classSym;
11337 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add((&*ast), external);
11338 }
11339 if(reachedPass15 && !external->__anon1.declaration && classSym->__anon1.registered && classSym->__anon1.registered->type == 5)
11340 {
11341 char structName[1024];
11342 struct __ecereNameSpace__ecere__sys__OldList * specifiers, * declarators;
11343
11344 structName[0] = 0;
11345 FullClassNameCat(structName, name, 0);
11346 specifiers = MkList();
11347 declarators = MkList();
11348 ListAdd(specifiers, MkStructOrUnion(3, MkIdentifier(structName), (((void *)0))));
11349 external->__anon1.declaration = MkDeclaration(specifiers, declarators);
11350 }
11351 if(fwdDecl)
11352 {
11353 struct External * e = external->fwdDecl ? external->fwdDecl : external;
11354
11355 if(((struct __ecereNameSpace__ecere__com__LinkList *)(((char *)e->incoming + 0 + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->count)
11356 __ecereMethod_External_CreateUniqueEdge(neededBy, e, !needDereference && !external->fwdDecl);
11357 }
11358 else
11359 __ecereMethod_External_CreateUniqueEdge(neededBy, external, !needDereference);
11360 }
11361 return external;
11362 }
11363
11364 unsigned int MatchWithEnums_NameSpace(struct __ecereNameSpace__ecere__com__NameSpace * nameSpace, struct Expression * sourceExp, struct Type * dest, char * string, struct __ecereNameSpace__ecere__sys__OldList * conversions)
11365 {
11366 struct __ecereNameSpace__ecere__com__BTNamedLink * link;
11367
11368 for(link = (struct __ecereNameSpace__ecere__com__BTNamedLink *)__ecereProp___ecereNameSpace__ecere__sys__BinaryTree_Get_first(&nameSpace->classes); link; link = (struct __ecereNameSpace__ecere__com__BTNamedLink *)__ecereProp___ecereNameSpace__ecere__sys__BTNode_Get_next(((struct __ecereNameSpace__ecere__sys__BTNode *)link)))
11369 {
11370 struct __ecereNameSpace__ecere__com__Class * _class = link->data;
11371
11372 if(_class->type == 4)
11373 {
11374 struct __ecereNameSpace__ecere__sys__OldList converts =
11375 {
11376 0, 0, 0, 0, 0
11377 };
11378 struct Type * type = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
11379
11380 type->kind = 8;
11381 if(!_class->symbol)
11382 _class->symbol = FindClass(_class->fullName);
11383 type->__anon1._class = _class->symbol;
11384 if(MatchTypes(type, dest, &converts, (((void *)0)), (((void *)0)), dest->kind != 8 || !dest->__anon1._class || strcmp(dest->__anon1._class->string, "bool"), 0, 0, 0, 0))
11385 {
11386 struct __ecereNameSpace__ecere__sys__NamedLink64 * value;
11387 struct __ecereNameSpace__ecere__com__Class * enumClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "enum");
11388
11389 if(enumClass)
11390 {
11391 struct __ecereNameSpace__ecere__com__Class * baseClass;
11392
11393 for(baseClass = _class; baseClass && baseClass->type == 4; baseClass = baseClass->base)
11394 {
11395 struct __ecereNameSpace__ecere__com__EnumClassData * e = (baseClass ? ((void *)(((char *)baseClass->data) + enumClass->offsetClass)) : (((void *)0)));
11396
11397 for(value = e->values.first; value; value = value->next)
11398 {
11399 if(!strcmp(value->name, string))
11400 break;
11401 }
11402 if(value)
11403 {
11404 FreeType(sourceExp->expType);
11405 sourceExp->isConstant = 1;
11406 sourceExp->expType = MkClassType(baseClass->fullName);
11407 if(inCompiler || inPreCompiler || inDebugger)
11408 {
11409 char constant[256];
11410
11411 FreeExpContents(sourceExp);
11412 sourceExp->type = 2;
11413 if(!strcmp(baseClass->dataTypeString, "int") || !strcmp(baseClass->dataTypeString, "int64") || !strcmp(baseClass->dataTypeString, "short") || !strcmp(baseClass->dataTypeString, "char"))
11414 sprintf(constant, ((__runtimePlatform == 1) ? "%I64d" : "%lld"), value->data);
11415 else
11416 sprintf(constant, ((__runtimePlatform == 1) ? "0x%I64XLL" : "0x%llXLL"), value->data);
11417 sourceExp->__anon1.__anon1.constant = __ecereNameSpace__ecere__sys__CopyString(constant);
11418 }
11419 while(converts.first)
11420 {
11421 struct Conversion * convert = converts.first;
11422
11423 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove(&converts, convert);
11424 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(conversions, convert);
11425 }
11426 ((type ? __extension__ ({
11427 void * __ecerePtrToDelete = (type);
11428
11429 __ecereClass_Type->Destructor ? __ecereClass_Type->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete);
11430 }) : 0), type = 0);
11431 return 1;
11432 }
11433 }
11434 }
11435 }
11436 if(converts.first)
11437 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Free(&converts, (void *)(FreeConvert));
11438 ((type ? __extension__ ({
11439 void * __ecerePtrToDelete = (type);
11440
11441 __ecereClass_Type->Destructor ? __ecereClass_Type->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete);
11442 }) : 0), type = 0);
11443 }
11444 }
11445 for(nameSpace = (struct __ecereNameSpace__ecere__com__NameSpace *)__ecereProp___ecereNameSpace__ecere__sys__BinaryTree_Get_first(&nameSpace->nameSpaces); nameSpace != (((void *)0)); nameSpace = (struct __ecereNameSpace__ecere__com__NameSpace *)__ecereProp___ecereNameSpace__ecere__sys__BTNode_Get_next(((struct __ecereNameSpace__ecere__sys__BTNode *)nameSpace)))
11446 if(MatchWithEnums_NameSpace(nameSpace, sourceExp, dest, string, conversions))
11447 return 1;
11448 return 0;
11449 }
11450
11451 unsigned int MatchWithEnums_Module(struct __ecereNameSpace__ecere__com__Instance * mainModule, struct Expression * sourceExp, struct Type * dest, char * string, struct __ecereNameSpace__ecere__sys__OldList * conversions)
11452 {
11453 struct __ecereNameSpace__ecere__com__Instance * module;
11454
11455 if(MatchWithEnums_NameSpace(&((struct __ecereNameSpace__ecere__com__Application *)(((char *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)mainModule + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application + sizeof(struct __ecereNameSpace__ecere__com__Module) + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->systemNameSpace, sourceExp, dest, string, conversions))
11456 return 1;
11457 if(MatchWithEnums_NameSpace(&((struct __ecereNameSpace__ecere__com__Module *)(((char *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)mainModule + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->privateNameSpace, sourceExp, dest, string, conversions))
11458 return 1;
11459 if(MatchWithEnums_NameSpace(&((struct __ecereNameSpace__ecere__com__Module *)(((char *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)mainModule + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->publicNameSpace, sourceExp, dest, string, conversions))
11460 return 1;
11461 for(module = ((struct __ecereNameSpace__ecere__com__Application *)(((char *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)mainModule + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application + sizeof(struct __ecereNameSpace__ecere__com__Module) + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->allModules.first; module; module = ((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->next)
11462 {
11463 if(ModuleVisibility(mainModule, module) && MatchWithEnums_NameSpace(&((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->publicNameSpace, sourceExp, dest, string, conversions))
11464 return 1;
11465 }
11466 return 0;
11467 }
11468
11469 void ProcessExpressionType(struct Expression *  exp);
11470
11471 static void ReplaceClassMembers(struct Expression * exp, struct __ecereNameSpace__ecere__com__Class * _class)
11472 {
11473 if(exp->type == 0 && exp->__anon1.__anon1.identifier)
11474 {
11475 struct Identifier * id = exp->__anon1.__anon1.identifier;
11476 struct Context * ctx;
11477 struct Symbol * symbol = (((void *)0));
11478
11479 if(!id->_class || !id->_class->__anon1.__anon1.name || strcmp(id->_class->__anon1.__anon1.name, "property"))
11480 {
11481 for(ctx = curContext; ctx != topContext->parent && !symbol; ctx = ctx->parent)
11482 {
11483 if(!ctx)
11484 break;
11485 symbol = (struct Symbol *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindString(&ctx->symbols, id->string);
11486 if(symbol)
11487 break;
11488 }
11489 }
11490 if(!symbol && ((!id->_class || (id->_class->__anon1.__anon1.name && !strcmp(id->_class->__anon1.__anon1.name, "property"))) || (id->classSym && __ecereNameSpace__ecere__com__eClass_IsDerived(_class, id->classSym->__anon1.registered))))
11491 {
11492 struct __ecereNameSpace__ecere__com__Property * prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, id->string, privateModule);
11493 struct __ecereNameSpace__ecere__com__Method * method = (((void *)0));
11494 struct __ecereNameSpace__ecere__com__DataMember * member = (((void *)0));
11495 struct __ecereNameSpace__ecere__com__ClassProperty * classProp = (((void *)0));
11496
11497 if(!prop)
11498 {
11499 method = __ecereNameSpace__ecere__com__eClass_FindMethod(_class, id->string, privateModule);
11500 }
11501 if(!prop && !method)
11502 member = __ecereNameSpace__ecere__com__eClass_FindDataMember(_class, id->string, privateModule, (((void *)0)), (((void *)0)));
11503 if(!prop && !method && !member)
11504 {
11505 classProp = __ecereNameSpace__ecere__com__eClass_FindClassProperty(_class, id->string);
11506 }
11507 if(prop || method || member || classProp)
11508 {
11509 exp->type = 8;
11510 exp->__anon1.member.member = id;
11511 exp->__anon1.member.memberType = 0;
11512 exp->__anon1.member.exp = QMkExpId("this");
11513 exp->addedThis = 1;
11514 }
11515 else if(_class && _class->templateParams.first)
11516 {
11517 struct __ecereNameSpace__ecere__com__Class * sClass;
11518
11519 for(sClass = _class; sClass; sClass = sClass->base)
11520 {
11521 if(sClass->templateParams.first)
11522 {
11523 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * param;
11524
11525 for(param = sClass->templateParams.first; param; param = param->next)
11526 {
11527 if(param->type == 2 && !strcmp(param->name, id->string))
11528 {
11529 struct Expression * argExp = GetTemplateArgExpByName(param->name, _class, 2);
11530
11531 if(argExp)
11532 {
11533 struct Declarator * decl;
11534 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
11535
11536 FreeIdentifier(exp->__anon1.member.member);
11537 ProcessExpressionType(argExp);
11538 decl = SpecDeclFromString(param->__anon1.dataTypeString, specs, (((void *)0)));
11539 exp->expType = ProcessType(specs, decl);
11540 exp->type = 5;
11541 exp->__anon1.list = MkListOne(MkExpOp((((void *)0)), '*', MkExpCast(MkTypeName(specs, MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), decl)), MkExpOp((((void *)0)), '&', argExp))));
11542 }
11543 }
11544 }
11545 }
11546 }
11547 }
11548 }
11549 }
11550 }
11551
11552 int ComputeTypeSize(struct Type * type)
11553 {
11554 unsigned int size = type ? type->size : 0;
11555
11556 if(!size && type && !type->computing)
11557 {
11558 type->computing = 1;
11559 switch(type->kind)
11560 {
11561 case 24:
11562 type->alignment = size = sizeof(char);
11563 break;
11564 case 1:
11565 type->alignment = size = sizeof(char);
11566 break;
11567 case 3:
11568 type->alignment = size = sizeof(int);
11569 break;
11570 case 4:
11571 type->alignment = size = sizeof(long long);
11572 break;
11573 case 22:
11574 type->alignment = size = targetBits / 8;
11575 type->pointerAlignment = 1;
11576 break;
11577 case 23:
11578 type->alignment = size = targetBits / 8;
11579 type->pointerAlignment = 1;
11580 break;
11581 case 5:
11582 type->alignment = size = sizeof(long);
11583 break;
11584 case 2:
11585 type->alignment = size = sizeof(short);
11586 break;
11587 case 6:
11588 type->alignment = size = sizeof(float);
11589 break;
11590 case 7:
11591 type->alignment = size = sizeof(double);
11592 break;
11593 case 8:
11594 {
11595 struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class ? type->__anon1._class->__anon1.registered : (((void *)0));
11596
11597 if(_class && _class->type == 1)
11598 {
11599 ComputeClassMembers(_class, 0);
11600 type->alignment = _class->structAlignment;
11601 type->pointerAlignment = (unsigned int)_class->pointerAlignment;
11602 size = _class->structSize;
11603 if(type->alignment && size % type->alignment)
11604 size += type->alignment - (size % type->alignment);
11605 }
11606 else if(_class && (_class->type == 3 || _class->type == 4 || _class->type == 2))
11607 {
11608 if(!_class->dataType)
11609 _class->dataType = ProcessTypeString(_class->dataTypeString, 0);
11610 size = type->alignment = ComputeTypeSize(_class->dataType);
11611 }
11612 else
11613 {
11614 size = type->alignment = targetBits / 8;
11615 type->pointerAlignment = 1;
11616 }
11617 break;
11618 }
11619 case 13:
11620 case 19:
11621 size = type->alignment = targetBits / 8;
11622 type->pointerAlignment = 1;
11623 break;
11624 case 12:
11625 if(type->__anon1.__anon4.arraySizeExp)
11626 {
11627 ProcessExpressionType(type->__anon1.__anon4.arraySizeExp);
11628 ComputeExpression(type->__anon1.__anon4.arraySizeExp);
11629 if(!type->__anon1.__anon4.arraySizeExp->isConstant || (type->__anon1.__anon4.arraySizeExp->expType->kind != 3 && type->__anon1.__anon4.arraySizeExp->expType->kind != 2 && type->__anon1.__anon4.arraySizeExp->expType->kind != 1 && type->__anon1.__anon4.arraySizeExp->expType->kind != 5 && type->__anon1.__anon4.arraySizeExp->expType->kind != 4 && type->__anon1.__anon4.arraySizeExp->expType->kind != 23 && type->__anon1.__anon4.arraySizeExp->expType->kind != 22 && type->__anon1.__anon4.arraySizeExp->expType->kind != 15 && (type->__anon1.__anon4.arraySizeExp->expType->kind != 8 || !type->__anon1.__anon4.arraySizeExp->expType->__anon1._class->__anon1.registered || type->__anon1.__anon4.arraySizeExp->expType->__anon1._class->__anon1.registered->type != 4)))
11630 {
11631 struct Location oldLoc = yylloc;
11632 char expression[10240];
11633
11634 expression[0] = '\0';
11635 type->__anon1.__anon4.arraySizeExp->expType = (((void *)0));
11636 yylloc = type->__anon1.__anon4.arraySizeExp->loc;
11637 if(inCompiler)
11638 PrintExpression(type->__anon1.__anon4.arraySizeExp, expression);
11639 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Array size not constant int (%s)\n", (((void *)0))), expression);
11640 yylloc = oldLoc;
11641 }
11642 GetInt(type->__anon1.__anon4.arraySizeExp, &type->__anon1.__anon4.arraySize);
11643 }
11644 else if(type->__anon1.__anon4.enumClass)
11645 {
11646 if(type->__anon1.__anon4.enumClass && type->__anon1.__anon4.enumClass->__anon1.registered && type->__anon1.__anon4.enumClass->__anon1.registered->type == 4)
11647 {
11648 type->__anon1.__anon4.arraySize = (int)__ecereNameSpace__ecere__com__eClass_GetProperty(type->__anon1.__anon4.enumClass->__anon1.registered, "enumSize");
11649 }
11650 else
11651 type->__anon1.__anon4.arraySize = 0;
11652 }
11653 else
11654 {
11655 type->__anon1.__anon4.arraySize = 0;
11656 }
11657 size = ComputeTypeSize(type->__anon1.type) * type->__anon1.__anon4.arraySize;
11658 if(type->__anon1.type)
11659 {
11660 type->alignment = type->__anon1.type->alignment;
11661 type->pointerAlignment = type->__anon1.type->pointerAlignment;
11662 }
11663 break;
11664 case 9:
11665 {
11666 if(!type->__anon1.__anon1.members.first && type->__anon1.__anon1.enumName)
11667 {
11668 struct Symbol * symbol = FindStruct(curContext, type->__anon1.__anon1.enumName);
11669
11670 if(symbol && symbol->type)
11671 {
11672 ComputeTypeSize(symbol->type);
11673 size = symbol->type->size;
11674 }
11675 }
11676 else
11677 {
11678 struct Type * member;
11679
11680 for(member = type->__anon1.__anon1.members.first; member; member = member->next)
11681 {
11682 int __simpleStruct0, __simpleStruct1;
11683 unsigned int addSize = ComputeTypeSize(member);
11684
11685 member->offset = size;
11686 if(member->alignment && size % member->alignment)
11687 member->offset += member->alignment - (size % member->alignment);
11688 size = member->offset;
11689 if(member->pointerAlignment && type->size <= 4)
11690 type->pointerAlignment = 1;
11691 else if(!member->pointerAlignment && member->alignment >= 8)
11692 type->pointerAlignment = 0;
11693 type->alignment = (__simpleStruct0 = type->alignment, __simpleStruct1 = member->alignment, (__simpleStruct0 > __simpleStruct1) ? __simpleStruct0 : __simpleStruct1);
11694 size += addSize;
11695 }
11696 if(type->alignment && size % type->alignment)
11697 size += type->alignment - (size % type->alignment);
11698 }
11699 break;
11700 }
11701 case 10:
11702 {
11703 if(!type->__anon1.__anon1.members.first && type->__anon1.__anon1.enumName)
11704 {
11705 struct Symbol * symbol = FindStruct(curContext, type->__anon1.__anon1.enumName);
11706
11707 if(symbol && symbol->type)
11708 {
11709 ComputeTypeSize(symbol->type);
11710 size = symbol->type->size;
11711 type->alignment = symbol->type->alignment;
11712 }
11713 }
11714 else
11715 {
11716 struct Type * member;
11717
11718 for(member = type->__anon1.__anon1.members.first; member; member = member->next)
11719 {
11720 int __simpleStruct0, __simpleStruct1;
11721 unsigned int addSize = ComputeTypeSize(member);
11722
11723 member->offset = size;
11724 if(member->alignment && size % member->alignment)
11725 member->offset += member->alignment - (size % member->alignment);
11726 size = member->offset;
11727 if(member->pointerAlignment && type->size <= 4)
11728 type->pointerAlignment = 1;
11729 else if(!member->pointerAlignment && member->alignment >= 8)
11730 type->pointerAlignment = 0;
11731 type->alignment = (__simpleStruct0 = type->alignment, __simpleStruct1 = member->alignment, (__simpleStruct0 > __simpleStruct1) ? __simpleStruct0 : __simpleStruct1);
11732 size = ((size > addSize) ? size : addSize);
11733 }
11734 if(type->alignment && size % type->alignment)
11735 size += type->alignment - (size % type->alignment);
11736 }
11737 break;
11738 }
11739 case 20:
11740 {
11741 struct TemplateParameter * param = type->__anon1.templateParameter;
11742 struct Type * baseType = ProcessTemplateParameterType(param);
11743
11744 if(baseType)
11745 {
11746 size = ComputeTypeSize(baseType);
11747 type->alignment = baseType->alignment;
11748 type->pointerAlignment = baseType->pointerAlignment;
11749 }
11750 else
11751 type->alignment = size = sizeof(uint64);
11752 break;
11753 }
11754 case 15:
11755 {
11756 type->alignment = size = sizeof(enum
11757 {
11758 test
11759 });
11760 break;
11761 }
11762 case 21:
11763 {
11764 type->alignment = size = targetBits / 8;
11765 type->pointerAlignment = 1;
11766 break;
11767 }
11768 }
11769 type->size = size;
11770 type->computing = 0;
11771 }
11772 return size;
11773 }
11774
11775 unsigned int MatchTypeExpression(struct Expression * sourceExp, struct Type * dest, struct __ecereNameSpace__ecere__sys__OldList * conversions, unsigned int skipUnitBla, unsigned int warnConst)
11776 {
11777 struct Type * source;
11778 struct Type * realDest = dest;
11779 struct Type * backupSourceExpType = (((void *)0));
11780 struct Expression * nbExp = GetNonBracketsExp(sourceExp);
11781 struct Expression * computedExp = nbExp;
11782
11783 dest->refCount++;
11784 if(sourceExp->isConstant && sourceExp->type != 2 && sourceExp->type != 0 && sourceExp->type != 11 && dest->kind == 8 && dest->__anon1._class && dest->__anon1._class->__anon1.registered && dest->__anon1._class->__anon1.registered->type == 4)
11785 {
11786 computedExp = CopyExpression(nbExp);
11787 ComputeExpression(computedExp);
11788 }
11789 source = sourceExp->expType;
11790 if(dest->kind == 13 && sourceExp->type == 2 && !strtoul(sourceExp->__anon1.__anon1.constant, (((void *)0)), 0))
11791 {
11792 if(computedExp != nbExp)
11793 {
11794 FreeExpression(computedExp);
11795 computedExp = nbExp;
11796 }
11797 FreeType(dest);
11798 return 1;
11799 }
11800 if(!skipUnitBla && source && dest && source->kind == 8 && dest->kind == 8)
11801 {
11802 if(source->__anon1._class && source->__anon1._class->__anon1.registered && source->__anon1._class->__anon1.registered->type == 3)
11803 {
11804 struct __ecereNameSpace__ecere__com__Class * sourceBase, * destBase;
11805
11806 for(sourceBase = source->__anon1._class->__anon1.registered; sourceBase && sourceBase->base && sourceBase->base->type != 1000; sourceBase = sourceBase->base)
11807 ;
11808 for(destBase = dest->__anon1._class->__anon1.registered; destBase && destBase->base && destBase->base->type != 1000; destBase = destBase->base)
11809 ;
11810 if(sourceBase == destBase)
11811 {
11812 if(computedExp != nbExp)
11813 {
11814 FreeExpression(computedExp);
11815 computedExp = nbExp;
11816 }
11817 FreeType(dest);
11818 return 1;
11819 }
11820 }
11821 }
11822 if(source)
11823 {
11824 struct __ecereNameSpace__ecere__sys__OldList * specs;
11825 unsigned int flag = 0;
11826 long long value = (((int)0x7fffffff));
11827
11828 source->refCount++;
11829 if(computedExp->type == 2)
11830 {
11831 if(source->isSigned)
11832 value = strtoll(computedExp->__anon1.__anon1.constant, (((void *)0)), 0);
11833 else
11834 value = strtoull(computedExp->__anon1.__anon1.constant, (((void *)0)), 0);
11835 }
11836 else if(computedExp->type == 4 && computedExp->__anon1.op.op == '-' && !computedExp->__anon1.op.exp1 && computedExp->__anon1.op.exp2 && computedExp->__anon1.op.exp2->type == 2)
11837 {
11838 if(source->isSigned)
11839 value = -strtoll(computedExp->__anon1.op.exp2->__anon1.__anon1.constant, (((void *)0)), 0);
11840 else
11841 value = -strtoull(computedExp->__anon1.op.exp2->__anon1.__anon1.constant, (((void *)0)), 0);
11842 }
11843 if(computedExp != nbExp)
11844 {
11845 FreeExpression(computedExp);
11846 computedExp = nbExp;
11847 }
11848 if(dest->kind != 8 && source->kind == 8 && source->__anon1._class && source->__anon1._class->__anon1.registered && !strcmp(source->__anon1._class->__anon1.registered->fullName, "unichar"))
11849 {
11850 FreeType(source);
11851 source = __extension__ ({
11852 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
11853
11854 __ecereInstance1->kind = 3, __ecereInstance1->isSigned = 0, __ecereInstance1->refCount = 1, __ecereInstance1;
11855 });
11856 }
11857 if(dest->kind == 8)
11858 {
11859 struct __ecereNameSpace__ecere__com__Class * _class = dest->__anon1._class ? dest->__anon1._class->__anon1.registered : (((void *)0));
11860
11861 if(_class && _class->type == 3)
11862 {
11863 if(source->kind != 8)
11864 {
11865 struct Type * tempType = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
11866 struct Type * tempDest, * tempSource;
11867
11868 for(; _class->base->type != 1000; _class = _class->base)
11869 ;
11870 tempSource = dest;
11871 tempDest = tempType;
11872 tempType->kind = 8;
11873 if(!_class->symbol)
11874 _class->symbol = FindClass(_class->fullName);
11875 tempType->__anon1._class = _class->symbol;
11876 tempType->truth = dest->truth;
11877 if(tempType->__anon1._class)
11878 MatchTypes(tempSource, tempDest, conversions, (((void *)0)), (((void *)0)), 1, 1, 0, 0, warnConst);
11879 backupSourceExpType = sourceExp->expType;
11880 if(dest->passAsTemplate)
11881 {
11882 sourceExp->expType = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
11883 CopyTypeInto(sourceExp->expType, dest);
11884 sourceExp->expType->passAsTemplate = 0;
11885 }
11886 else
11887 {
11888 sourceExp->expType = dest;
11889 dest->refCount++;
11890 }
11891 flag = 1;
11892 ((tempType ? __extension__ ({
11893 void * __ecerePtrToDelete = (tempType);
11894
11895 __ecereClass_Type->Destructor ? __ecereClass_Type->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete);
11896 }) : 0), tempType = 0);
11897 }
11898 }
11899 if(_class && _class->type == 2 && source->kind != 8)
11900 {
11901 if(!dest->__anon1._class->__anon1.registered->dataType)
11902 dest->__anon1._class->__anon1.registered->dataType = ProcessTypeString(dest->__anon1._class->__anon1.registered->dataTypeString, 0);
11903 if(MatchTypes(source, dest->__anon1._class->__anon1.registered->dataType, conversions, (((void *)0)), (((void *)0)), 1, 1, 0, 0, warnConst))
11904 {
11905 FreeType(source);
11906 FreeType(sourceExp->expType);
11907 source = sourceExp->expType = MkClassType(dest->__anon1._class->string);
11908 source->refCount++;
11909 }
11910 }
11911 if(_class && !strcmp(_class->fullName, "ecere::com::Class") && source->kind == 13 && source->__anon1.type && source->__anon1.type->kind == 1 && sourceExp->type == 3)
11912 {
11913 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
11914 struct Declarator * decl;
11915 char string[1024];
11916
11917 ReadString(string, sourceExp->__anon1.__anon2.string);
11918 decl = SpecDeclFromString(string, specs, (((void *)0)));
11919 FreeExpContents(sourceExp);
11920 FreeType(sourceExp->expType);
11921 sourceExp->type = 24;
11922 sourceExp->__anon1._classExp.specifiers = specs;
11923 sourceExp->__anon1._classExp.decl = decl;
11924 sourceExp->expType = dest;
11925 dest->refCount++;
11926 FreeType(source);
11927 FreeType(dest);
11928 if(backupSourceExpType)
11929 FreeType(backupSourceExpType);
11930 return 1;
11931 }
11932 }
11933 else if(source->kind == 8)
11934 {
11935 struct __ecereNameSpace__ecere__com__Class * _class = source->__anon1._class ? source->__anon1._class->__anon1.registered : (((void *)0));
11936
11937 if(_class && (_class->type == 3 || _class->type == 2))
11938 {
11939 if(dest->kind != 8)
11940 {
11941 struct Type * tempType = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
11942 struct Type * tempDest, * tempSource;
11943
11944 if(!source->__anon1._class->__anon1.registered->dataType)
11945 source->__anon1._class->__anon1.registered->dataType = ProcessTypeString(source->__anon1._class->__anon1.registered->dataTypeString, 0);
11946 for(; _class->base->type != 1000; _class = _class->base)
11947 ;
11948 tempDest = source;
11949 tempSource = tempType;
11950 tempType->kind = 8;
11951 tempType->__anon1._class = FindClass(_class->fullName);
11952 tempType->truth = source->truth;
11953 tempType->classObjectType = source->classObjectType;
11954 if(tempType->__anon1._class)
11955 MatchTypes(tempSource, tempDest, conversions, (((void *)0)), (((void *)0)), 1, 1, 0, 0, warnConst);
11956 if(conversions && conversions->last)
11957 {
11958 ((struct Conversion *)conversions->last)->resultType = dest;
11959 dest->refCount++;
11960 modifyPassAsTemplate(&((struct Conversion *)conversions->last)->resultType, 0);
11961 }
11962 FreeType(sourceExp->expType);
11963 sourceExp->expType = MkClassType(_class->fullName);
11964 sourceExp->expType->truth = source->truth;
11965 sourceExp->expType->classObjectType = source->classObjectType;
11966 if(!sourceExp->destType)
11967 {
11968 FreeType(sourceExp->destType);
11969 sourceExp->destType = sourceExp->expType;
11970 if(sourceExp->expType)
11971 sourceExp->expType->refCount++;
11972 }
11973 if(!_class->dataType)
11974 _class->dataType = ProcessTypeString(_class->dataTypeString, 0);
11975 FreeType(dest);
11976 dest = MkClassType(source->__anon1._class->string);
11977 dest->truth = source->truth;
11978 dest->classObjectType = source->classObjectType;
11979 FreeType(source);
11980 source = _class->dataType;
11981 source->refCount++;
11982 ((tempType ? __extension__ ({
11983 void * __ecerePtrToDelete = (tempType);
11984
11985 __ecereClass_Type->Destructor ? __ecereClass_Type->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete);
11986 }) : 0), tempType = 0);
11987 }
11988 }
11989 }
11990 if(!flag)
11991 {
11992 if(MatchTypes(source, dest, conversions, (((void *)0)), (((void *)0)), 1, 1, 0, 0, warnConst))
11993 {
11994 FreeType(source);
11995 FreeType(dest);
11996 return 1;
11997 }
11998 }
11999 if(dest->kind == 8)
12000 {
12001 struct __ecereNameSpace__ecere__com__Class * _class = dest->__anon1._class ? dest->__anon1._class->__anon1.registered : (((void *)0));
12002 unsigned int fittingValue = 0;
12003
12004 if(_class && _class->type == 4)
12005 {
12006 struct __ecereNameSpace__ecere__com__Class * enumClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "enum");
12007 struct __ecereNameSpace__ecere__com__EnumClassData * c = (_class ? ((void *)(((char *)_class->data) + enumClass->offsetClass)) : (((void *)0)));
12008
12009 if(c && value >= 0 && value <= c->largest)
12010 fittingValue = 1;
12011 }
12012 if(_class && !dest->truth && (_class->type == 3 || fittingValue || (_class->type != 1 && !value && source->kind == 3) || _class->type == 2))
12013 {
12014 if(_class->type == 0 || _class->type == 5)
12015 {
12016 struct Expression * newExp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression);
12017
12018 *newExp = *sourceExp;
12019 if(sourceExp->destType)
12020 sourceExp->destType->refCount++;
12021 if(sourceExp->expType)
12022 sourceExp->expType->refCount++;
12023 sourceExp->type = 11;
12024 sourceExp->__anon1.cast.typeName = MkTypeName(MkListOne(MkSpecifier(VOID)), MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), (((void *)0))));
12025 sourceExp->__anon1.cast.exp = newExp;
12026 FreeType(sourceExp->expType);
12027 sourceExp->expType = (((void *)0));
12028 ProcessExpressionType(sourceExp);
12029 if(!inCompiler)
12030 {
12031 FreeType(sourceExp->expType);
12032 sourceExp->expType = dest;
12033 }
12034 FreeType(source);
12035 if(inCompiler)
12036 FreeType(dest);
12037 if(backupSourceExpType)
12038 FreeType(backupSourceExpType);
12039 return 1;
12040 }
12041 if(!_class->dataType)
12042 _class->dataType = ProcessTypeString(_class->dataTypeString, 0);
12043 FreeType(dest);
12044 dest = _class->dataType;
12045 dest->refCount++;
12046 }
12047 if(dest->kind == 7 && (source->kind == 7 || source->kind == 6 || dest->kind == 4 || source->kind == 3 || source->kind == 2 || source->kind == 1 || source->kind == 24))
12048 {
12049 specs = MkListOne(MkSpecifier(DOUBLE));
12050 }
12051 else if(dest->kind == 6 && (source->kind == 6 || dest->kind == 4 || source->kind == 3 || source->kind == 2 || source->kind == 1 || source->kind == 24 || source->kind == 7))
12052 {
12053 specs = MkListOne(MkSpecifier(FLOAT));
12054 }
12055 else if(dest->kind == 4 && (source->kind == 4 || source->kind == 3 || source->kind == 2 || source->kind == 1 || source->kind == 24 || source->kind == 6 || source->kind == 7))
12056 {
12057 specs = MkList();
12058 if(!dest->isSigned)
12059 ListAdd(specs, MkSpecifier(UNSIGNED));
12060 ListAdd(specs, MkSpecifier(INT64));
12061 }
12062 else if(dest->kind == 3 && (source->kind == 3 || source->kind == 2 || source->kind == 1 || source->kind == 24 || source->kind == 6 || source->kind == 7))
12063 {
12064 specs = MkList();
12065 if(!dest->isSigned)
12066 ListAdd(specs, MkSpecifier(UNSIGNED));
12067 ListAdd(specs, MkSpecifier(INT));
12068 }
12069 else if(dest->kind == 2 && (source->kind == 2 || source->kind == 1 || source->kind == 24 || source->kind == 3 || source->kind == 6 || source->kind == 7))
12070 {
12071 specs = MkList();
12072 if(!dest->isSigned)
12073 ListAdd(specs, MkSpecifier(UNSIGNED));
12074 ListAdd(specs, MkSpecifier(SHORT));
12075 }
12076 else if(dest->kind == 1 && (source->kind == 1 || source->kind == 24 || source->kind == 2 || source->kind == 3 || source->kind == 6 || source->kind == 7))
12077 {
12078 specs = MkList();
12079 if(!dest->isSigned)
12080 ListAdd(specs, MkSpecifier(UNSIGNED));
12081 ListAdd(specs, MkSpecifier(CHAR));
12082 }
12083 else
12084 {
12085 FreeType(source);
12086 FreeType(dest);
12087 if(backupSourceExpType)
12088 {
12089 if(sourceExp->expType)
12090 FreeType(sourceExp->expType);
12091 sourceExp->expType = backupSourceExpType;
12092 }
12093 return 0;
12094 }
12095 }
12096 else if(dest->kind == 7 && (source->kind == 7 || source->kind == 6 || source->kind == 4 || source->kind == 3 || source->kind == 15 || source->kind == 2 || source->kind == 24 || source->kind == 1))
12097 {
12098 specs = MkListOne(MkSpecifier(DOUBLE));
12099 }
12100 else if(dest->kind == 6 && (source->kind == 6 || source->kind == 15 || source->kind == 4 || source->kind == 3 || source->kind == 2 || source->kind == 24 || source->kind == 1))
12101 {
12102 specs = MkListOne(MkSpecifier(FLOAT));
12103 }
12104 else if(dest->kind == 24 && (source->kind == 24 || source->kind == 1 || source->kind == 15 || source->kind == 2 || source->kind == 3) && (value == 1 || value == 0))
12105 {
12106 specs = MkList();
12107 ListAdd(specs, MkSpecifier(BOOL));
12108 }
12109 else if(dest->kind == 1 && (source->kind == 24 || source->kind == 1 || source->kind == 15 || source->kind == 2 || source->kind == 3) && (dest->isSigned ? (value >= -128 && value <= 127) : (value >= 0 && value <= 255)))
12110 {
12111 if(source->kind == 3)
12112 {
12113 FreeType(dest);
12114 FreeType(source);
12115 if(backupSourceExpType)
12116 FreeType(backupSourceExpType);
12117 return 1;
12118 }
12119 else
12120 {
12121 specs = MkList();
12122 if(!dest->isSigned)
12123 ListAdd(specs, MkSpecifier(UNSIGNED));
12124 ListAdd(specs, MkSpecifier(CHAR));
12125 }
12126 }
12127 else if(dest->kind == 2 && (source->kind == 15 || source->kind == 24 || source->kind == 1 || source->kind == 2 || (source->kind == 3 && (dest->isSigned ? (value >= -32768 && value <= 32767) : (value >= 0 && value <= 65535)))))
12128 {
12129 if(source->kind == 3)
12130 {
12131 FreeType(dest);
12132 FreeType(source);
12133 if(backupSourceExpType)
12134 FreeType(backupSourceExpType);
12135 return 1;
12136 }
12137 else
12138 {
12139 specs = MkList();
12140 if(!dest->isSigned)
12141 ListAdd(specs, MkSpecifier(UNSIGNED));
12142 ListAdd(specs, MkSpecifier(SHORT));
12143 }
12144 }
12145 else if(dest->kind == 3 && (source->kind == 15 || source->kind == 2 || source->kind == 24 || source->kind == 1 || source->kind == 3))
12146 {
12147 specs = MkList();
12148 if(!dest->isSigned)
12149 ListAdd(specs, MkSpecifier(UNSIGNED));
12150 ListAdd(specs, MkSpecifier(INT));
12151 }
12152 else if(dest->kind == 4 && (source->kind == 15 || source->kind == 2 || source->kind == 24 || source->kind == 1 || source->kind == 3 || source->kind == 4))
12153 {
12154 specs = MkList();
12155 if(!dest->isSigned)
12156 ListAdd(specs, MkSpecifier(UNSIGNED));
12157 ListAdd(specs, MkSpecifier(INT64));
12158 }
12159 else if(dest->kind == 15 && (source->kind == 4 || source->kind == 3 || source->kind == 2 || source->kind == 24 || source->kind == 1))
12160 {
12161 specs = MkListOne(MkEnum(MkIdentifier(dest->__anon1.__anon1.enumName), (((void *)0))));
12162 }
12163 else
12164 {
12165 FreeType(source);
12166 FreeType(dest);
12167 if(backupSourceExpType)
12168 {
12169 if(sourceExp->expType)
12170 FreeType(sourceExp->expType);
12171 sourceExp->expType = backupSourceExpType;
12172 }
12173 return 0;
12174 }
12175 if(!flag && !sourceExp->opDestType)
12176 {
12177 struct Expression * newExp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression);
12178
12179 *newExp = *sourceExp;
12180 newExp->prev = (((void *)0));
12181 newExp->next = (((void *)0));
12182 if(sourceExp->destType)
12183 sourceExp->destType->refCount++;
12184 if(sourceExp->expType)
12185 sourceExp->expType->refCount++;
12186 sourceExp->type = 11;
12187 if(realDest->kind == 8)
12188 {
12189 sourceExp->__anon1.cast.typeName = QMkClass(realDest->__anon1._class->string, (((void *)0)));
12190 FreeList(specs, (void *)(FreeSpecifier));
12191 }
12192 else
12193 sourceExp->__anon1.cast.typeName = MkTypeName(specs, (((void *)0)));
12194 if(newExp->type == 4)
12195 {
12196 sourceExp->__anon1.cast.exp = MkExpBrackets(MkListOne(newExp));
12197 }
12198 else
12199 sourceExp->__anon1.cast.exp = newExp;
12200 FreeType(sourceExp->expType);
12201 sourceExp->expType = (((void *)0));
12202 ProcessExpressionType(sourceExp);
12203 }
12204 else
12205 FreeList(specs, (void *)(FreeSpecifier));
12206 FreeType(dest);
12207 FreeType(source);
12208 if(backupSourceExpType)
12209 FreeType(backupSourceExpType);
12210 return 1;
12211 }
12212 else
12213 {
12214 if(computedExp != nbExp)
12215 {
12216 FreeExpression(computedExp);
12217 computedExp = nbExp;
12218 }
12219 while((sourceExp->type == 5 || sourceExp->type == 32) && sourceExp->__anon1.list)
12220 sourceExp = (*sourceExp->__anon1.list).last;
12221 if(sourceExp->type == 0)
12222 {
12223 struct Identifier * id = sourceExp->__anon1.__anon1.identifier;
12224
12225 if(dest->kind == 8)
12226 {
12227 if(dest->__anon1._class && dest->__anon1._class->__anon1.registered && dest->__anon1._class->__anon1.registered->type == 4)
12228 {
12229 struct __ecereNameSpace__ecere__com__Class * _class = dest->__anon1._class->__anon1.registered;
12230 struct __ecereNameSpace__ecere__com__Class * enumClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "enum");
12231
12232 if(enumClass)
12233 {
12234 for(; _class && _class->type == 4; _class = _class->base)
12235 {
12236 struct __ecereNameSpace__ecere__sys__NamedLink64 * value;
12237 struct __ecereNameSpace__ecere__com__EnumClassData * e = (_class ? ((void *)(((char *)_class->data) + enumClass->offsetClass)) : (((void *)0)));
12238
12239 for(value = e->values.first; value; value = value->next)
12240 {
12241 if(!strcmp(value->name, id->string))
12242 break;
12243 }
12244 if(value)
12245 {
12246 FreeType(sourceExp->expType);
12247 sourceExp->isConstant = 1;
12248 sourceExp->expType = MkClassType(_class->fullName);
12249 if(inCompiler || inPreCompiler || inDebugger)
12250 {
12251 FreeExpContents(sourceExp);
12252 sourceExp->type = 2;
12253 if(_class->dataTypeString && (!strcmp(_class->dataTypeString, "int") || !strcmp(_class->dataTypeString, "int64") || !strcmp(_class->dataTypeString, "short") || !strcmp(_class->dataTypeString, "char")))
12254 sourceExp->__anon1.__anon1.constant = PrintInt64(value->data);
12255 else
12256 sourceExp->__anon1.__anon1.constant = PrintUInt64(value->data);
12257 }
12258 FreeType(dest);
12259 return 1;
12260 }
12261 }
12262 }
12263 }
12264 }
12265 if(dest->classObjectType != 2 && dest->kind == 8 && MatchWithEnums_Module(privateModule, sourceExp, dest, id->string, conversions))
12266 {
12267 FreeType(dest);
12268 return 1;
12269 }
12270 }
12271 FreeType(dest);
12272 }
12273 return 0;
12274 }
12275
12276 static void PopulateInstanceProcessMember(struct Instantiation * inst, struct __ecereNameSpace__ecere__sys__OldList * memberList, struct __ecereNameSpace__ecere__com__DataMember * parentDataMember, unsigned int offset)
12277 {
12278 struct __ecereNameSpace__ecere__com__DataMember * dataMember;
12279
12280 for(dataMember = parentDataMember->members.first; dataMember; dataMember = dataMember->next)
12281 {
12282 if(!dataMember->name && (dataMember->type == 2 || dataMember->type == 1))
12283 PopulateInstanceProcessMember(inst, memberList, dataMember, offset + dataMember->offset);
12284 else
12285 {
12286 struct Expression * exp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression);
12287 struct MemberInit * member = MkMemberInit(MkListOne(MkIdentifier(dataMember->name)), MkInitializerAssignment(exp));
12288 struct Type * type;
12289 void * ptr = inst->data + dataMember->offset + offset;
12290 char * result = (((void *)0));
12291
12292 exp->loc = member->loc = inst->loc;
12293 ((struct Identifier *)(*member->identifiers).first)->loc = inst->loc;
12294 if(!dataMember->dataType)
12295 dataMember->dataType = ProcessTypeString(dataMember->dataTypeString, 0);
12296 type = dataMember->dataType;
12297 if(type->kind == 8)
12298 {
12299 struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class->__anon1.registered;
12300
12301 if(_class->type == 4)
12302 {
12303 struct __ecereNameSpace__ecere__com__Class * enumClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "enum");
12304
12305 if(enumClass)
12306 {
12307 struct __ecereNameSpace__ecere__com__EnumClassData * e = (_class ? ((void *)(((char *)_class->data) + enumClass->offsetClass)) : (((void *)0)));
12308 struct __ecereNameSpace__ecere__sys__NamedLink64 * item;
12309
12310 for(item = e->values.first; item; item = item->next)
12311 {
12312 if(item->data == GetEnumValue(_class, ptr))
12313 {
12314 result = item->name;
12315 break;
12316 }
12317 }
12318 if(result)
12319 {
12320 exp->__anon1.__anon1.identifier = MkIdentifier(result);
12321 exp->type = 0;
12322 exp->destType = MkClassType(_class->fullName);
12323 ProcessExpressionType(exp);
12324 }
12325 }
12326 }
12327 if(_class->type == 4 || _class->type == 3 || _class->type == 2)
12328 {
12329 if(!_class->dataType)
12330 _class->dataType = ProcessTypeString(_class->dataTypeString, 0);
12331 type = _class->dataType;
12332 }
12333 }
12334 if(!result)
12335 {
12336 switch(type->kind)
12337 {
12338 case 6:
12339 {
12340 FreeExpContents(exp);
12341 exp->__anon1.__anon1.constant = PrintFloat(*(float *)ptr);
12342 exp->type = 2;
12343 break;
12344 }
12345 case 7:
12346 {
12347 FreeExpContents(exp);
12348 exp->__anon1.__anon1.constant = PrintDouble(*(double *)ptr);
12349 exp->type = 2;
12350 break;
12351 }
12352 case 3:
12353 {
12354 FreeExpContents(exp);
12355 exp->__anon1.__anon1.constant = PrintInt(*(int *)ptr);
12356 exp->type = 2;
12357 break;
12358 }
12359 case 4:
12360 {
12361 FreeExpContents(exp);
12362 exp->__anon1.__anon1.constant = PrintInt64(*(long long *)ptr);
12363 exp->type = 2;
12364 break;
12365 }
12366 case 22:
12367 {
12368 FreeExpContents(exp);
12369 exp->__anon1.__anon1.constant = PrintInt64((long long)*(intptr_t *)ptr);
12370 exp->type = 2;
12371 break;
12372 }
12373 case 23:
12374 {
12375 FreeExpContents(exp);
12376 exp->__anon1.__anon1.constant = PrintInt64((long long)*(ssize_t *)ptr);
12377 exp->type = 2;
12378 break;
12379 }
12380 default:
12381 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Unhandled type populating instance\n", (((void *)0))));
12382 }
12383 }
12384 ListAdd(memberList, member);
12385 }
12386 if(parentDataMember->type == 1)
12387 break;
12388 }
12389 }
12390
12391 void CheckTemplateTypes(struct Expression * exp)
12392 {
12393 struct Expression * nbExp = GetNonBracketsExp(exp);
12394
12395 if(exp->destType && exp->destType->passAsTemplate && exp->expType && exp->expType->kind != 20 && !exp->expType->passAsTemplate && (nbExp == exp || nbExp->type != 11))
12396 {
12397 struct Expression * newExp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression);
12398 struct Context * context;
12399 int kind = exp->expType->kind;
12400
12401 *newExp = *exp;
12402 if(exp->destType)
12403 exp->destType->refCount++;
12404 if(exp->expType)
12405 exp->expType->refCount++;
12406 newExp->prev = (((void *)0));
12407 newExp->next = (((void *)0));
12408 if(exp->expType->kind == 8 && exp->expType->__anon1._class && exp->expType->__anon1._class->__anon1.registered)
12409 {
12410 struct __ecereNameSpace__ecere__com__Class * c = exp->expType->__anon1._class->__anon1.registered;
12411
12412 if(c->type == 2 || c->type == 4 || c->type == 3)
12413 {
12414 if(!c->dataType)
12415 c->dataType = ProcessTypeString(c->dataTypeString, 0);
12416 kind = c->dataType->kind;
12417 }
12418 }
12419 switch(kind)
12420 {
12421 case 7:
12422 if(exp->destType->classObjectType)
12423 {
12424 if(exp->destType)
12425 exp->destType->refCount--;
12426 if(exp->expType)
12427 exp->expType->refCount--;
12428 ((newExp ? __extension__ ({
12429 void * __ecerePtrToDelete = (newExp);
12430
12431 __ecereClass_Expression->Destructor ? __ecereClass_Expression->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete);
12432 }) : 0), newExp = 0);
12433 }
12434 else
12435 {
12436 struct __ecereNameSpace__ecere__sys__OldList * specs;
12437 struct __ecereNameSpace__ecere__sys__OldList * unionDefs = MkList();
12438 struct __ecereNameSpace__ecere__sys__OldList * statements = MkList();
12439
12440 context = PushContext();
12441 ListAdd(unionDefs, MkClassDefDeclaration(MkStructDeclaration(MkListOne(MkSpecifier(DOUBLE)), MkListOne(MkDeclaratorIdentifier(MkIdentifier("d"))), (((void *)0)))));
12442 ListAdd(unionDefs, MkClassDefDeclaration(MkStructDeclaration(MkListOne(MkSpecifierName("uint64")), MkListOne(MkDeclaratorIdentifier(MkIdentifier("i"))), (((void *)0)))));
12443 specs = MkListOne(MkStructOrUnion(4, (((void *)0)), unionDefs));
12444 exp->type = 23;
12445 modifyPassAsTemplate(&exp->expType, 1);
12446 modifyPassAsTemplate(&newExp->destType, 0);
12447 modifyPassAsTemplate(&newExp->expType, 0);
12448 exp->__anon1.compound = MkCompoundStmt(MkListOne(MkDeclaration(specs, MkListOne(MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier("__internal_union")), (((void *)0)))))), statements);
12449 ListAdd(statements, MkExpressionStmt(MkListOne(MkExpOp(MkExpMember(MkExpIdentifier(MkIdentifier("__internal_union")), MkIdentifier("d")), '=', newExp))));
12450 ListAdd(statements, MkExpressionStmt(MkListOne(MkExpMember(MkExpIdentifier(MkIdentifier("__internal_union")), MkIdentifier("i")))));
12451 exp->__anon1.compound->__anon1.compound.context = context;
12452 PopContext(context);
12453 }
12454 break;
12455 case 6:
12456 if(exp->destType->classObjectType)
12457 {
12458 if(exp->destType)
12459 exp->destType->refCount--;
12460 if(exp->expType)
12461 exp->expType->refCount--;
12462 ((newExp ? __extension__ ({
12463 void * __ecerePtrToDelete = (newExp);
12464
12465 __ecereClass_Expression->Destructor ? __ecereClass_Expression->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete);
12466 }) : 0), newExp = 0);
12467 }
12468 else
12469 {
12470 struct __ecereNameSpace__ecere__sys__OldList * specs;
12471 struct __ecereNameSpace__ecere__sys__OldList * unionDefs = MkList();
12472 struct __ecereNameSpace__ecere__sys__OldList * statements = MkList();
12473
12474 context = PushContext();
12475 ListAdd(unionDefs, MkClassDefDeclaration(MkStructDeclaration(MkListOne(MkSpecifier(FLOAT)), MkListOne(MkDeclaratorIdentifier(MkIdentifier("f"))), (((void *)0)))));
12476 ListAdd(unionDefs, MkClassDefDeclaration(MkStructDeclaration(MkListOne(MkSpecifierName("uint64")), MkListOne(MkDeclaratorIdentifier(MkIdentifier("i"))), (((void *)0)))));
12477 specs = MkListOne(MkStructOrUnion(4, (((void *)0)), unionDefs));
12478 exp->type = 23;
12479 exp->__anon1.compound = MkCompoundStmt(MkListOne(MkDeclaration(specs, MkListOne(MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier("__internal_union")), (((void *)0)))))), statements);
12480 modifyPassAsTemplate(&exp->expType, 1);
12481 modifyPassAsTemplate(&newExp->destType, 0);
12482 modifyPassAsTemplate(&newExp->expType, 0);
12483 ListAdd(statements, MkExpressionStmt(MkListOne(MkExpOp(MkExpMember(MkExpIdentifier(MkIdentifier("__internal_union")), MkIdentifier("f")), '=', newExp))));
12484 ListAdd(statements, MkExpressionStmt(MkListOne(MkExpMember(MkExpIdentifier(MkIdentifier("__internal_union")), MkIdentifier("i")))));
12485 exp->__anon1.compound->__anon1.compound.context = context;
12486 PopContext(context);
12487 }
12488 break;
12489 case 0:
12490 break;
12491 default:
12492 exp->type = 11;
12493 exp->__anon1.cast.typeName = MkTypeName(MkListOne(MkSpecifierName("uint64")), (((void *)0)));
12494 if((exp->expType->kind == 8 && exp->expType->__anon1._class && exp->expType->__anon1._class->__anon1.registered && exp->expType->__anon1._class->__anon1.registered->type == 1) || __ecereProp_Type_Get_isPointerType(exp->expType))
12495 exp->__anon1.cast.exp = MkExpCast(MkTypeName(MkListOne(MkSpecifierName("uintptr")), (((void *)0))), MkExpBrackets(MkListOne(newExp)));
12496 else
12497 exp->__anon1.cast.exp = MkExpBrackets(MkListOne(newExp));
12498 exp->needCast = 1;
12499 break;
12500 }
12501 }
12502 else if(exp->expType && exp->expType->passAsTemplate && exp->destType && ((unsigned int)((exp->usage & 0x1) >> 0)) && exp->destType->kind != 20 && !exp->destType->passAsTemplate)
12503 {
12504 struct Expression * newExp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression);
12505 struct Context * context;
12506 int kind = exp->expType->kind;
12507
12508 *newExp = *exp;
12509 if(exp->destType)
12510 exp->destType->refCount++;
12511 if(exp->expType)
12512 exp->expType->refCount++;
12513 newExp->prev = (((void *)0));
12514 newExp->next = (((void *)0));
12515 if(exp->expType->kind == 8 && exp->expType->__anon1._class && exp->expType->__anon1._class->__anon1.registered)
12516 {
12517 struct __ecereNameSpace__ecere__com__Class * c = exp->expType->__anon1._class->__anon1.registered;
12518
12519 if(c->type == 2 || c->type == 4 || c->type == 3)
12520 {
12521 if(!c->dataType)
12522 c->dataType = ProcessTypeString(c->dataTypeString, 0);
12523 kind = c->dataType->kind;
12524 }
12525 }
12526 switch(kind)
12527 {
12528 case 7:
12529 if(exp->destType->classObjectType)
12530 {
12531 if(exp->destType)
12532 exp->destType->refCount--;
12533 if(exp->expType)
12534 exp->expType->refCount--;
12535 ((newExp ? __extension__ ({
12536 void * __ecerePtrToDelete = (newExp);
12537
12538 __ecereClass_Expression->Destructor ? __ecereClass_Expression->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete);
12539 }) : 0), newExp = 0);
12540 }
12541 else
12542 {
12543 struct __ecereNameSpace__ecere__sys__OldList * specs;
12544 struct __ecereNameSpace__ecere__sys__OldList * unionDefs = MkList();
12545 struct __ecereNameSpace__ecere__sys__OldList * statements = MkList();
12546
12547 context = PushContext();
12548 ListAdd(unionDefs, MkClassDefDeclaration(MkStructDeclaration(MkListOne(MkSpecifier(DOUBLE)), MkListOne(MkDeclaratorIdentifier(MkIdentifier("d"))), (((void *)0)))));
12549 ListAdd(unionDefs, MkClassDefDeclaration(MkStructDeclaration(MkListOne(MkSpecifierName("uint64")), MkListOne(MkDeclaratorIdentifier(MkIdentifier("i"))), (((void *)0)))));
12550 specs = MkListOne(MkStructOrUnion(4, (((void *)0)), unionDefs));
12551 exp->type = 23;
12552 exp->__anon1.compound = MkCompoundStmt(MkListOne(MkDeclaration(specs, MkListOne(MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier("__internal_union")), (((void *)0)))))), statements);
12553 modifyPassAsTemplate(&exp->expType, 0);
12554 modifyPassAsTemplate(&newExp->destType, 1);
12555 modifyPassAsTemplate(&newExp->expType, 1);
12556 ListAdd(statements, MkExpressionStmt(MkListOne(MkExpOp(MkExpMember(MkExpIdentifier(MkIdentifier("__internal_union")), MkIdentifier("i")), '=', newExp))));
12557 ListAdd(statements, MkExpressionStmt(MkListOne(MkExpMember(MkExpIdentifier(MkIdentifier("__internal_union")), MkIdentifier("d")))));
12558 exp->__anon1.compound->__anon1.compound.context = context;
12559 PopContext(context);
12560 }
12561 break;
12562 case 6:
12563 if(exp->destType->classObjectType)
12564 {
12565 if(exp->destType)
12566 exp->destType->refCount--;
12567 if(exp->expType)
12568 exp->expType->refCount--;
12569 ((newExp ? __extension__ ({
12570 void * __ecerePtrToDelete = (newExp);
12571
12572 __ecereClass_Expression->Destructor ? __ecereClass_Expression->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete);
12573 }) : 0), newExp = 0);
12574 }
12575 else
12576 {
12577 struct __ecereNameSpace__ecere__sys__OldList * specs;
12578 struct __ecereNameSpace__ecere__sys__OldList * unionDefs = MkList();
12579 struct __ecereNameSpace__ecere__sys__OldList * statements = MkList();
12580
12581 context = PushContext();
12582 ListAdd(unionDefs, MkClassDefDeclaration(MkStructDeclaration(MkListOne(MkSpecifier(FLOAT)), MkListOne(MkDeclaratorIdentifier(MkIdentifier("f"))), (((void *)0)))));
12583 ListAdd(unionDefs, MkClassDefDeclaration(MkStructDeclaration(MkListOne(MkSpecifierName("uint64")), MkListOne(MkDeclaratorIdentifier(MkIdentifier("i"))), (((void *)0)))));
12584 specs = MkListOne(MkStructOrUnion(4, (((void *)0)), unionDefs));
12585 exp->type = 23;
12586 exp->__anon1.compound = MkCompoundStmt(MkListOne(MkDeclaration(specs, MkListOne(MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier("__internal_union")), (((void *)0)))))), statements);
12587 modifyPassAsTemplate(&exp->expType, 0);
12588 modifyPassAsTemplate(&newExp->destType, 1);
12589 modifyPassAsTemplate(&newExp->expType, 1);
12590 ListAdd(statements, MkExpressionStmt(MkListOne(MkExpOp(MkExpMember(MkExpIdentifier(MkIdentifier("__internal_union")), MkIdentifier("i")), '=', newExp))));
12591 ListAdd(statements, MkExpressionStmt(MkListOne(MkExpMember(MkExpIdentifier(MkIdentifier("__internal_union")), MkIdentifier("f")))));
12592 exp->__anon1.compound->__anon1.compound.context = context;
12593 PopContext(context);
12594 }
12595 break;
12596 case 8:
12597 {
12598 if(exp->expType->__anon1._class && exp->expType->__anon1._class->__anon1.registered && exp->expType->__anon1._class->__anon1.registered->type == 1)
12599 {
12600 exp->type = 5;
12601 newExp = MkExpCast(MkTypeName(MkListOne(MkSpecifierName("uintptr")), (((void *)0))), newExp);
12602 exp->__anon1.list = MkListOne(MkExpOp((((void *)0)), '*', MkExpCast(MkTypeName(MkListOne(MkSpecifierName(exp->expType->__anon1._class->string)), MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), (((void *)0)))), newExp)));
12603 ProcessExpressionType((*exp->__anon1.list).first);
12604 break;
12605 }
12606 else
12607 {
12608 exp->type = 5;
12609 if(__ecereProp_Type_Get_isPointerType(exp->expType))
12610 {
12611 exp->needTemplateCast = 2;
12612 newExp->needCast = 1;
12613 newExp->needTemplateCast = 2;
12614 newExp = MkExpCast(MkTypeName(MkListOne(MkSpecifierName("uintptr")), (((void *)0))), newExp);
12615 }
12616 exp->__anon1.list = MkListOne(MkExpCast(MkTypeName(MkListOne(MkSpecifierName(exp->expType->__anon1._class->string)), (((void *)0))), newExp));
12617 exp->needTemplateCast = 2;
12618 newExp->needCast = 1;
12619 newExp->needTemplateCast = 2;
12620 ProcessExpressionType((*exp->__anon1.list).first);
12621 break;
12622 }
12623 }
12624 default:
12625 {
12626 if(exp->expType->kind == 20)
12627 {
12628 struct Type * type = ProcessTemplateParameterType(exp->expType->__anon1.templateParameter);
12629
12630 if(type)
12631 {
12632 FreeType(exp->destType);
12633 FreeType(exp->expType);
12634 ((newExp ? __extension__ ({
12635 void * __ecerePtrToDelete = (newExp);
12636
12637 __ecereClass_Expression->Destructor ? __ecereClass_Expression->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete);
12638 }) : 0), newExp = 0);
12639 break;
12640 }
12641 }
12642 {
12643 char typeString[1024];
12644 struct Declarator * decl;
12645 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
12646
12647 typeString[0] = '\0';
12648 PrintType(exp->expType, typeString, 0, 0);
12649 decl = SpecDeclFromString(typeString, specs, (((void *)0)));
12650 exp->type = 11;
12651 exp->__anon1.cast.typeName = MkTypeName(specs, decl);
12652 exp->__anon1.cast.exp = MkExpBrackets(MkListOne(newExp));
12653 exp->__anon1.cast.exp->needCast = 1;
12654 exp->needTemplateCast = 2;
12655 newExp->needTemplateCast = 2;
12656 }
12657 break;
12658 }
12659 }
12660 }
12661 }
12662
12663 static void ProcessInitializer(struct Initializer * init, struct Type * type)
12664 {
12665 switch(init->type)
12666 {
12667 case 0:
12668 if(!init->__anon1.exp || init->__anon1.exp->type != 1 || !init->__anon1.exp->__anon1.instance || init->__anon1.exp->__anon1.instance->_class || !type || type->kind == 8)
12669 {
12670 if(init->__anon1.exp && !init->__anon1.exp->destType)
12671 {
12672 FreeType(init->__anon1.exp->destType);
12673 init->__anon1.exp->destType = type;
12674 if(type)
12675 type->refCount++;
12676 }
12677 if(init->__anon1.exp)
12678 {
12679 ProcessExpressionType(init->__anon1.exp);
12680 init->isConstant = init->__anon1.exp->isConstant;
12681 }
12682 break;
12683 }
12684 else
12685 {
12686 struct Expression * exp = init->__anon1.exp;
12687 struct Instantiation * inst = exp->__anon1.instance;
12688 struct MembersInit * members;
12689
12690 init->type = 1;
12691 init->__anon1.list = MkList();
12692 if(inst->members)
12693 {
12694 for(members = (*inst->members).first; members; members = members->next)
12695 {
12696 if(members->type == 0)
12697 {
12698 struct MemberInit * member;
12699
12700 for(member = (*members->__anon1.dataMembers).first; member; member = member->next)
12701 {
12702 ListAdd(init->__anon1.list, member->initializer);
12703 member->initializer = (((void *)0));
12704 }
12705 }
12706 }
12707 }
12708 FreeExpression(exp);
12709 }
12710 case 1:
12711 {
12712 struct Initializer * i;
12713 struct Type * initializerType = (((void *)0));
12714 struct __ecereNameSpace__ecere__com__Class * curClass = (((void *)0));
12715 struct __ecereNameSpace__ecere__com__DataMember * curMember = (((void *)0));
12716 struct __ecereNameSpace__ecere__com__DataMember * subMemberStack[256];
12717 int subMemberStackPos = 0;
12718
12719 if(type && type->kind == 12)
12720 initializerType = Dereference(type);
12721 else if(type && (type->kind == 9 || type->kind == 10))
12722 initializerType = type->__anon1.__anon1.members.first;
12723 for(i = (*init->__anon1.list).first; i; i = i->next)
12724 {
12725 if(type && type->kind == 8 && type->__anon1._class && type->__anon1._class->__anon1.registered)
12726 {
12727 FindNextDataMember(type->__anon1._class->__anon1.registered, &curClass, &curMember, subMemberStack, &subMemberStackPos);
12728 if(curMember)
12729 {
12730 if(!curMember->dataType)
12731 curMember->dataType = ProcessTypeString(curMember->dataTypeString, 0);
12732 initializerType = curMember->dataType;
12733 }
12734 }
12735 ProcessInitializer(i, initializerType);
12736 if(initializerType && type && (type->kind == 9 || type->kind == 10))
12737 initializerType = initializerType->next;
12738 if(!i->isConstant)
12739 init->isConstant = 0;
12740 }
12741 if(type && type->kind == 12)
12742 FreeType(initializerType);
12743 if(type && type->kind != 12 && type->kind != 9 && type->kind != 10 && (type->kind != 8 || !type->__anon1._class->__anon1.registered || type->__anon1._class->__anon1.registered->type != 1))
12744 {
12745 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Assigning list initializer to non list\n", (((void *)0))));
12746 }
12747 break;
12748 }
12749 }
12750 }
12751
12752 static unsigned int CheckExpressionType(struct Expression * exp, struct Type * destType, unsigned int skipUnitBla, unsigned int warnConst)
12753 {
12754 unsigned int result = 1;
12755
12756 if(destType)
12757 {
12758 struct __ecereNameSpace__ecere__sys__OldList converts =
12759 {
12760 0, 0, 0, 0, 0
12761 };
12762 struct Conversion * convert;
12763
12764 if(destType->kind == 0)
12765 return 0;
12766 if(!MatchTypeExpression(exp, destType, &converts, skipUnitBla, warnConst))
12767 result = 0;
12768 if(converts.count)
12769 {
12770 for(convert = converts.first; convert; convert = convert->next)
12771 {
12772 unsigned int empty = !(convert->isGet ? (void *)convert->convert->Get : (void *)convert->convert->Set);
12773
12774 if(!empty)
12775 {
12776 struct Expression * newExp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression);
12777 int objectType = exp->expType ? exp->expType->classObjectType : 0;
12778
12779 *newExp = *exp;
12780 newExp->prev = (((void *)0));
12781 newExp->next = (((void *)0));
12782 newExp->destType = (((void *)0));
12783 if(convert->isGet)
12784 {
12785 exp->type = 8;
12786 exp->addedThis = 1;
12787 exp->__anon1.member.exp = newExp;
12788 FreeType(exp->__anon1.member.exp->expType);
12789 exp->__anon1.member.exp->expType = MkClassType(convert->convert->_class->fullName);
12790 exp->__anon1.member.exp->expType->classObjectType = objectType;
12791 exp->__anon1.member.member = MkIdentifier(convert->convert->dataTypeString);
12792 exp->__anon1.member.memberType = 1;
12793 exp->expType = convert->resultType ? convert->resultType : convert->convert->dataType;
12794 exp->needCast = 1;
12795 if(exp->expType)
12796 exp->expType->refCount++;
12797 ApplyAnyObjectLogic(exp->__anon1.member.exp);
12798 }
12799 else
12800 {
12801 {
12802 exp->type = 8;
12803 exp->addedThis = 1;
12804 exp->__anon1.member.exp = newExp;
12805 if(newExp->expType && newExp->expType->kind == 8 && newExp->expType->__anon1._class && newExp->expType->__anon1._class->__anon1.registered && newExp->expType->__anon1._class->__anon1.registered->type == 5)
12806 {
12807 newExp->byReference = 1;
12808 }
12809 FreeType(exp->__anon1.member.exp->expType);
12810 exp->__anon1.member.exp->expType = (((void *)0));
12811 if(convert->convert->dataType)
12812 {
12813 exp->__anon1.member.exp->expType = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
12814 CopyTypeInto(exp->__anon1.member.exp->expType, convert->convert->dataType);
12815 exp->__anon1.member.exp->expType->refCount = 1;
12816 exp->__anon1.member.exp->expType->classObjectType = objectType;
12817 ApplyAnyObjectLogic(exp->__anon1.member.exp);
12818 }
12819 exp->__anon1.member.member = MkIdentifier(convert->convert->_class->fullName);
12820 exp->__anon1.member.memberType = 4;
12821 exp->expType = convert->resultType ? convert->resultType : MkClassType(convert->convert->_class->fullName);
12822 exp->needCast = 1;
12823 if(convert->resultType)
12824 convert->resultType->refCount++;
12825 }
12826 }
12827 }
12828 else
12829 {
12830 FreeType(exp->expType);
12831 if(convert->isGet)
12832 {
12833 exp->expType = convert->resultType ? convert->resultType : convert->convert->dataType;
12834 if(exp->destType->casted)
12835 exp->needCast = 1;
12836 if(exp->expType)
12837 exp->expType->refCount++;
12838 }
12839 else
12840 {
12841 exp->expType = convert->resultType ? convert->resultType : MkClassType(convert->convert->_class->fullName);
12842 if(exp->destType->casted)
12843 exp->needCast = 1;
12844 if(convert->resultType)
12845 convert->resultType->refCount++;
12846 }
12847 }
12848 }
12849 if(exp->isConstant && inCompiler)
12850 ComputeExpression(exp);
12851 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Free(&converts, (void *)(FreeConvert));
12852 }
12853 if(!result && exp->expType && converts.count)
12854 {
12855 result = MatchTypes(exp->expType, exp->destType, (((void *)0)), (((void *)0)), (((void *)0)), 1, 1, 0, 0, warnConst);
12856 }
12857 if(!result && exp->expType && exp->destType)
12858 {
12859 if((exp->destType->kind == 8 && exp->expType->kind == 13 && exp->expType->__anon1.type->kind == 8 && exp->expType->__anon1.type->__anon1._class == exp->destType->__anon1._class && exp->destType->__anon1._class->__anon1.registered && exp->destType->__anon1._class->__anon1.registered->type == 1) || (exp->expType->kind == 8 && exp->destType->kind == 13 && exp->destType->__anon1.type->kind == 8 && exp->destType->__anon1.type->__anon1._class == exp->expType->__anon1._class && exp->expType->__anon1._class->__anon1.registered && exp->expType->__anon1._class->__anon1.registered->type == 1))
12860 result = 1;
12861 }
12862 }
12863 return result;
12864 }
12865
12866 void PopulateInstance(struct Instantiation * inst)
12867 {
12868 struct Symbol * classSym = inst->_class->__anon1.__anon1.symbol;
12869 struct __ecereNameSpace__ecere__com__Class * _class = classSym->__anon1.registered;
12870 struct __ecereNameSpace__ecere__com__DataMember * dataMember;
12871 struct __ecereNameSpace__ecere__sys__OldList * memberList = MkList();
12872
12873 if(!inst->members)
12874 inst->members = MkListOne(MkMembersInitList(memberList));
12875 else
12876 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add((&*inst->members), MkMembersInitList(memberList));
12877 for(dataMember = _class->membersAndProperties.first; dataMember; dataMember = dataMember->next)
12878 {
12879 if(!dataMember->isProperty)
12880 {
12881 if(!dataMember->name && (dataMember->type == 2 || dataMember->type == 1))
12882 PopulateInstanceProcessMember(inst, memberList, dataMember, dataMember->offset);
12883 else
12884 {
12885 struct Expression * exp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression);
12886 struct MemberInit * member = MkMemberInit(MkListOne(MkIdentifier(dataMember->name)), MkInitializerAssignment(exp));
12887 struct Type * type;
12888 void * ptr = inst->data + dataMember->offset;
12889 char * result = (((void *)0));
12890
12891 exp->loc = member->loc = inst->loc;
12892 ((struct Identifier *)(*member->identifiers).first)->loc = inst->loc;
12893 if(!dataMember->dataType)
12894 dataMember->dataType = ProcessTypeString(dataMember->dataTypeString, 0);
12895 type = dataMember->dataType;
12896 if(type->kind == 8)
12897 {
12898 struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class->__anon1.registered;
12899
12900 if(_class->type == 4)
12901 {
12902 struct __ecereNameSpace__ecere__com__Class * enumClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "enum");
12903
12904 if(enumClass)
12905 {
12906 struct __ecereNameSpace__ecere__com__EnumClassData * e = (_class ? ((void *)(((char *)_class->data) + enumClass->offsetClass)) : (((void *)0)));
12907 struct __ecereNameSpace__ecere__sys__NamedLink64 * item;
12908
12909 for(item = e->values.first; item; item = item->next)
12910 {
12911 if(item->data == GetEnumValue(_class, ptr))
12912 {
12913 result = item->name;
12914 break;
12915 }
12916 }
12917 }
12918 if(result)
12919 {
12920 exp->__anon1.__anon1.identifier = MkIdentifier(result);
12921 exp->type = 0;
12922 exp->destType = MkClassType(_class->fullName);
12923 ProcessExpressionType(exp);
12924 }
12925 }
12926 if(_class->type == 4 || _class->type == 3 || _class->type == 2)
12927 {
12928 if(!_class->dataType)
12929 _class->dataType = ProcessTypeString(_class->dataTypeString, 0);
12930 type = _class->dataType;
12931 }
12932 }
12933 if(!result)
12934 {
12935 switch(type->kind)
12936 {
12937 case 6:
12938 {
12939 exp->__anon1.__anon1.constant = PrintFloat(*(float *)ptr);
12940 exp->type = 2;
12941 break;
12942 }
12943 case 7:
12944 {
12945 exp->__anon1.__anon1.constant = PrintDouble(*(double *)ptr);
12946 exp->type = 2;
12947 break;
12948 }
12949 case 3:
12950 {
12951 exp->__anon1.__anon1.constant = PrintInt(*(int *)ptr);
12952 exp->type = 2;
12953 break;
12954 }
12955 case 4:
12956 {
12957 exp->__anon1.__anon1.constant = PrintInt64(*(long long *)ptr);
12958 exp->type = 2;
12959 break;
12960 }
12961 case 22:
12962 {
12963 exp->__anon1.__anon1.constant = PrintInt64((long long)*(intptr_t *)ptr);
12964 exp->type = 2;
12965 break;
12966 }
12967 default:
12968 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Unhandled type populating instance\n", (((void *)0))));
12969 }
12970 }
12971 ListAdd(memberList, member);
12972 }
12973 }
12974 }
12975 }
12976
12977 void ProcessMemberInitData(struct MemberInit * member, struct __ecereNameSpace__ecere__com__Class * _class, struct __ecereNameSpace__ecere__com__Class ** curClass, struct __ecereNameSpace__ecere__com__DataMember ** curMember, struct __ecereNameSpace__ecere__com__DataMember ** subMemberStack, int * subMemberStackPos)
12978 {
12979 struct Identifier * ident = member->identifiers ? (*member->identifiers).first : (((void *)0));
12980 unsigned int found = 0;
12981 struct __ecereNameSpace__ecere__com__DataMember * dataMember = (((void *)0));
12982 struct __ecereNameSpace__ecere__com__Method * method = (((void *)0));
12983 unsigned int freeType = 0;
12984
12985 yylloc = member->loc;
12986 if(!ident)
12987 {
12988 if(curMember)
12989 {
12990 __ecereNameSpace__ecere__com__eClass_FindNextMember(_class, curClass, curMember, subMemberStack, subMemberStackPos);
12991 if(*curMember)
12992 {
12993 found = 1;
12994 dataMember = *curMember;
12995 }
12996 }
12997 }
12998 else
12999 {
13000 struct __ecereNameSpace__ecere__com__DataMember * thisMember = (struct __ecereNameSpace__ecere__com__DataMember *)__ecereNameSpace__ecere__com__eClass_FindProperty(_class, ident->string, privateModule);
13001 struct __ecereNameSpace__ecere__com__DataMember * _subMemberStack[256];
13002 int _subMemberStackPos = 0;
13003
13004 if(!thisMember)
13005 thisMember = __ecereNameSpace__ecere__com__eClass_FindDataMember(_class, ident->string, privateModule, _subMemberStack, &_subMemberStackPos);
13006 if(thisMember)
13007 {
13008 dataMember = thisMember;
13009 if(curMember && thisMember->memberAccess == 1)
13010 {
13011 *curMember = thisMember;
13012 *curClass = thisMember->_class;
13013 memcpy(subMemberStack, _subMemberStack, sizeof(struct __ecereNameSpace__ecere__com__DataMember *) * _subMemberStackPos);
13014 *subMemberStackPos = _subMemberStackPos;
13015 }
13016 found = 1;
13017 }
13018 else
13019 {
13020 method = __ecereNameSpace__ecere__com__eClass_FindMethod(_class, ident->string, privateModule);
13021 if(method && method->type == 1)
13022 found = 1;
13023 else
13024 method = (((void *)0));
13025 }
13026 }
13027 if(found)
13028 {
13029 struct Type * type = (((void *)0));
13030
13031 if(dataMember)
13032 {
13033 if(!dataMember->dataType && dataMember->dataTypeString)
13034 {
13035 struct Context * context = SetupTemplatesContext(_class);
13036
13037 dataMember->dataType = ProcessTypeString(dataMember->dataTypeString, 0);
13038 FinishTemplatesContext(context);
13039 }
13040 type = dataMember->dataType;
13041 }
13042 else if(method)
13043 {
13044 if(!method->dataType)
13045 ProcessMethodType(method);
13046 type = method->dataType;
13047 }
13048 if(ident && ident->next)
13049 {
13050 for(ident = ident->next; ident && type; ident = ident->next)
13051 {
13052 if(type->kind == 8)
13053 {
13054 dataMember = (struct __ecereNameSpace__ecere__com__DataMember *)__ecereNameSpace__ecere__com__eClass_FindProperty(type->__anon1._class->__anon1.registered, ident->string, privateModule);
13055 if(!dataMember)
13056 dataMember = __ecereNameSpace__ecere__com__eClass_FindDataMember(type->__anon1._class->__anon1.registered, ident->string, privateModule, (((void *)0)), (((void *)0)));
13057 if(dataMember)
13058 type = dataMember->dataType;
13059 }
13060 else if(type->kind == 9 || type->kind == 10)
13061 {
13062 struct Type * memberType;
13063
13064 for(memberType = type->__anon1.__anon1.members.first; memberType; memberType = memberType->next)
13065 {
13066 if(!strcmp(memberType->name, ident->string))
13067 {
13068 type = memberType;
13069 break;
13070 }
13071 }
13072 }
13073 }
13074 }
13075 if(type && type->kind == 20 && type->__anon1.templateParameter->type == 0 && _class->templateArgs)
13076 {
13077 int id = 0;
13078 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * curParam = (((void *)0));
13079 struct __ecereNameSpace__ecere__com__Class * sClass;
13080
13081 for(sClass = _class; sClass; sClass = sClass->base)
13082 {
13083 id = 0;
13084 if(sClass->templateClass)
13085 sClass = sClass->templateClass;
13086 for(curParam = sClass->templateParams.first; curParam; curParam = curParam->next)
13087 {
13088 if(curParam->type == 0 && !strcmp(type->__anon1.templateParameter->identifier->string, curParam->name))
13089 {
13090 for(sClass = sClass->base; sClass; sClass = sClass->base)
13091 {
13092 if(sClass->templateClass)
13093 sClass = sClass->templateClass;
13094 id += sClass->templateParams.count;
13095 }
13096 break;
13097 }
13098 id++;
13099 }
13100 if(curParam)
13101 break;
13102 }
13103 if(curParam)
13104 {
13105 struct __ecereNameSpace__ecere__com__ClassTemplateArgument arg = _class->templateArgs[id];
13106
13107 if(arg.__anon1.__anon1.dataTypeString)
13108 {
13109 unsigned int constant = type->constant;
13110
13111 type = ProcessTypeString(arg.__anon1.__anon1.dataTypeString, 0);
13112 if(type->kind == 8 && constant)
13113 type->constant = 1;
13114 else if(type->kind == 13)
13115 {
13116 struct Type * t = type->__anon1.type;
13117
13118 while(t->kind == 13)
13119 t = t->__anon1.type;
13120 if(constant)
13121 t->constant = constant;
13122 }
13123 freeType = 1;
13124 if(type && _class->templateClass)
13125 type->passAsTemplate = 1;
13126 if(type)
13127 {
13128 }
13129 }
13130 }
13131 }
13132 if(type && type->kind == 8 && type->__anon1._class && type->__anon1._class->__anon1.registered && strchr(type->__anon1._class->__anon1.registered->fullName, '<'))
13133 {
13134 struct __ecereNameSpace__ecere__com__Class * expClass = type->__anon1._class->__anon1.registered;
13135 struct __ecereNameSpace__ecere__com__Class * cClass = (((void *)0));
13136 int paramCount = 0;
13137 int lastParam = -1;
13138 char templateString[1024];
13139 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * param;
13140
13141 sprintf(templateString, "%s<", expClass->templateClass->fullName);
13142 for(cClass = expClass; cClass; cClass = cClass->base)
13143 {
13144 int p = 0;
13145
13146 if(cClass->templateClass)
13147 cClass = cClass->templateClass;
13148 for(param = cClass->templateParams.first; param; param = param->next)
13149 {
13150 int id = p;
13151 struct __ecereNameSpace__ecere__com__Class * sClass;
13152 struct __ecereNameSpace__ecere__com__ClassTemplateArgument arg;
13153
13154 for(sClass = cClass->base; sClass; sClass = sClass->base)
13155 {
13156 if(sClass->templateClass)
13157 sClass = sClass->templateClass;
13158 id += sClass->templateParams.count;
13159 }
13160 arg = expClass->templateArgs[id];
13161 for(sClass = _class; sClass; sClass = sClass->base)
13162 {
13163 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * cParam;
13164 int p = 0;
13165 struct __ecereNameSpace__ecere__com__Class * nextClass;
13166
13167 if(sClass->templateClass)
13168 sClass = sClass->templateClass;
13169 for(nextClass = sClass->base; nextClass; nextClass = nextClass->base)
13170 {
13171 if(nextClass->templateClass)
13172 nextClass = nextClass->templateClass;
13173 p += nextClass->templateParams.count;
13174 }
13175 for(cParam = sClass->templateParams.first; cParam; cParam = cParam->next, p++)
13176 {
13177 if(cParam->type == 0 && arg.__anon1.__anon1.dataTypeString && !strcmp(cParam->name, arg.__anon1.__anon1.dataTypeString))
13178 {
13179 if(_class->templateArgs && arg.__anon1.__anon1.dataTypeString && (!param->defaultArg.__anon1.__anon1.dataTypeString || strcmp(arg.__anon1.__anon1.dataTypeString, param->defaultArg.__anon1.__anon1.dataTypeString)))
13180 {
13181 arg.__anon1.__anon1.dataTypeString = _class->templateArgs[p].__anon1.__anon1.dataTypeString;
13182 arg.__anon1.__anon1.dataTypeClass = _class->templateArgs[p].__anon1.__anon1.dataTypeClass;
13183 break;
13184 }
13185 }
13186 }
13187 }
13188 {
13189 char argument[256];
13190
13191 argument[0] = '\0';
13192 switch(param->type)
13193 {
13194 case 2:
13195 {
13196 char expString[1024];
13197 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
13198 struct Declarator * decl = SpecDeclFromString(param->__anon1.dataTypeString, specs, (((void *)0)));
13199 struct Expression * exp;
13200 char * string = PrintHexUInt64(arg.__anon1.expression.__anon1.ui64);
13201
13202 exp = MkExpCast(MkTypeName(specs, decl), MkExpConstant(string));
13203 (__ecereNameSpace__ecere__com__eSystem_Delete(string), string = 0);
13204 ProcessExpressionType(exp);
13205 ComputeExpression(exp);
13206 expString[0] = '\0';
13207 PrintExpression(exp, expString);
13208 strcat(argument, expString);
13209 FreeExpression(exp);
13210 break;
13211 }
13212 case 1:
13213 {
13214 strcat(argument, arg.__anon1.__anon2.__anon1.member->name);
13215 break;
13216 }
13217 case 0:
13218 {
13219 if(arg.__anon1.__anon1.dataTypeString && (!param->defaultArg.__anon1.__anon1.dataTypeString || strcmp(arg.__anon1.__anon1.dataTypeString, param->defaultArg.__anon1.__anon1.dataTypeString)))
13220 strcat(argument, arg.__anon1.__anon1.dataTypeString);
13221 break;
13222 }
13223 }
13224 if(argument[0])
13225 {
13226 if(paramCount)
13227 strcat(templateString, ", ");
13228 if(lastParam != p - 1)
13229 {
13230 strcat(templateString, param->name);
13231 strcat(templateString, " = ");
13232 }
13233 strcat(templateString, argument);
13234 paramCount++;
13235 lastParam = p;
13236 }
13237 p++;
13238 }
13239 }
13240 }
13241 {
13242 int len = strlen(templateString);
13243
13244 if(templateString[len - 1] == '<')
13245 len--;
13246 else
13247 {
13248 if(templateString[len - 1] == '>')
13249 templateString[len++] = ' ';
13250 templateString[len++] = '>';
13251 }
13252 templateString[len++] = '\0';
13253 }
13254 {
13255 struct Context * context = SetupTemplatesContext(_class);
13256
13257 if(freeType)
13258 FreeType(type);
13259 type = ProcessTypeString(templateString, 0);
13260 freeType = 1;
13261 FinishTemplatesContext(context);
13262 }
13263 }
13264 if(method && member->initializer && member->initializer->type == 0 && member->initializer->__anon1.exp)
13265 {
13266 ProcessExpressionType(member->initializer->__anon1.exp);
13267 if(!member->initializer->__anon1.exp->expType)
13268 {
13269 if(inCompiler)
13270 {
13271 char expString[10240];
13272
13273 expString[0] = '\0';
13274 PrintExpression(member->initializer->__anon1.exp, expString);
13275 __ecereNameSpace__ecere__sys__ChangeCh(expString, '\n', ' ');
13276 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "unresolved symbol used as an instance method %s\n", (((void *)0))), expString);
13277 }
13278 }
13279 else if(!MatchTypes(member->initializer->__anon1.exp->expType, type, (((void *)0)), (((void *)0)), _class, 1, 1, 0, 0, 1))
13280 {
13281 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "incompatible instance method %s\n", (((void *)0))), ident->string);
13282 }
13283 }
13284 else if(member->initializer)
13285 {
13286 ProcessInitializer(member->initializer, type);
13287 }
13288 if(freeType)
13289 FreeType(type);
13290 }
13291 else
13292 {
13293 if(_class && _class->type == 3)
13294 {
13295 if(member->initializer)
13296 {
13297 struct Type * type = MkClassType(_class->fullName);
13298
13299 ProcessInitializer(member->initializer, type);
13300 FreeType(type);
13301 }
13302 }
13303 else
13304 {
13305 if(member->initializer)
13306 {
13307 ProcessInitializer(member->initializer, (((void *)0)));
13308 }
13309 if(ident)
13310 {
13311 if(method)
13312 {
13313 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "couldn't find virtual method %s in class %s\n", (((void *)0))), ident->string, _class->fullName);
13314 }
13315 else if(_class)
13316 {
13317 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "couldn't find member %s in class %s\n", (((void *)0))), ident->string, _class->fullName);
13318 if(inCompiler)
13319 __ecereNameSpace__ecere__com__eClass_AddDataMember(_class, ident->string, "int", 0, 0, 1);
13320 }
13321 }
13322 else if(_class)
13323 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "too many initializers for instantiation of class %s\n", (((void *)0))), _class->fullName);
13324 }
13325 }
13326 }
13327
13328 void ComputeInstantiation(struct Expression * exp)
13329 {
13330 struct Instantiation * inst = exp->__anon1.instance;
13331 struct MembersInit * members;
13332 struct Symbol * classSym = inst->_class ? inst->_class->__anon1.__anon1.symbol : (((void *)0));
13333 struct __ecereNameSpace__ecere__com__Class * _class = classSym ? classSym->__anon1.registered : (((void *)0));
13334 struct __ecereNameSpace__ecere__com__DataMember * curMember = (((void *)0));
13335 struct __ecereNameSpace__ecere__com__Class * curClass = (((void *)0));
13336 struct __ecereNameSpace__ecere__com__DataMember * subMemberStack[256];
13337 int subMemberStackPos = 0;
13338 uint64 bits = 0;
13339
13340 if(_class && (_class->type == 1 || _class->type == 0 || _class->type == 5))
13341 {
13342 if(inst->data)
13343 return ;
13344 if(_class->type == 0 || _class->type == 5)
13345 {
13346 inst->data = (unsigned char *)__ecereNameSpace__ecere__com__eInstance_New(_class);
13347 if(_class->type == 0)
13348 ((struct __ecereNameSpace__ecere__com__Instance *)(char *)((struct __ecereNameSpace__ecere__com__Instance *)inst->data))->_refCount++;
13349 }
13350 else
13351 inst->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize));
13352 }
13353 if(inst->members)
13354 {
13355 for(members = (*inst->members).first; members; members = members->next)
13356 {
13357 switch(members->type)
13358 {
13359 case 0:
13360 {
13361 if(members->__anon1.dataMembers)
13362 {
13363 struct MemberInit * member;
13364
13365 for(member = (*members->__anon1.dataMembers).first; member; member = member->next)
13366 {
13367 struct Identifier * ident = member->identifiers ? (*member->identifiers).first : (((void *)0));
13368 unsigned int found = 0;
13369 struct __ecereNameSpace__ecere__com__Property * prop = (((void *)0));
13370 struct __ecereNameSpace__ecere__com__DataMember * dataMember = (((void *)0));
13371 unsigned int dataMemberOffset;
13372
13373 if(!ident)
13374 {
13375 __ecereNameSpace__ecere__com__eClass_FindNextMember(_class, &curClass, &curMember, subMemberStack, &subMemberStackPos);
13376 if(curMember)
13377 {
13378 if(curMember->isProperty)
13379 prop = (struct __ecereNameSpace__ecere__com__Property *)curMember;
13380 else
13381 {
13382 dataMember = curMember;
13383 __ecereNameSpace__ecere__com__eClass_FindDataMemberAndOffset(_class, dataMember->name, &dataMemberOffset, privateModule, (((void *)0)), (((void *)0)));
13384 if(_class->type == 0)
13385 dataMemberOffset += _class->base->structSize;
13386 }
13387 found = 1;
13388 }
13389 }
13390 else
13391 {
13392 prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, ident->string, privateModule);
13393 if(prop)
13394 {
13395 found = 1;
13396 if(prop->memberAccess == 1)
13397 {
13398 curMember = (struct __ecereNameSpace__ecere__com__DataMember *)prop;
13399 curClass = prop->_class;
13400 }
13401 }
13402 else
13403 {
13404 struct __ecereNameSpace__ecere__com__DataMember * _subMemberStack[256];
13405 int _subMemberStackPos = 0;
13406
13407 dataMember = __ecereNameSpace__ecere__com__eClass_FindDataMemberAndOffset(_class, ident->string, &dataMemberOffset, privateModule, _subMemberStack, &_subMemberStackPos);
13408 if(dataMember)
13409 {
13410 found = 1;
13411 if(dataMember->memberAccess == 1)
13412 {
13413 curMember = dataMember;
13414 curClass = dataMember->_class;
13415 memcpy(subMemberStack, _subMemberStack, sizeof(struct __ecereNameSpace__ecere__com__DataMember *) * _subMemberStackPos);
13416 subMemberStackPos = _subMemberStackPos;
13417 }
13418 }
13419 }
13420 }
13421 if(found && member->initializer && member->initializer->type == 0)
13422 {
13423 struct Expression * value = member->initializer->__anon1.exp;
13424 struct Type * type = (((void *)0));
13425 unsigned int deepMember = 0;
13426
13427 if(prop)
13428 {
13429 type = prop->dataType;
13430 }
13431 else if(dataMember)
13432 {
13433 if(!dataMember->dataType)
13434 dataMember->dataType = ProcessTypeString(dataMember->dataTypeString, 0);
13435 type = dataMember->dataType;
13436 }
13437 if(ident && ident->next)
13438 {
13439 deepMember = 1;
13440 for(ident = ident->next; ident && type; ident = ident->next)
13441 {
13442 if(type->kind == 8)
13443 {
13444 prop = __ecereNameSpace__ecere__com__eClass_FindProperty(type->__anon1._class->__anon1.registered, ident->string, privateModule);
13445 if(prop)
13446 type = prop->dataType;
13447 else
13448 {
13449 dataMember = __ecereNameSpace__ecere__com__eClass_FindDataMemberAndOffset(type->__anon1._class->__anon1.registered, ident->string, &dataMemberOffset, privateModule, (((void *)0)), (((void *)0)));
13450 if(dataMember)
13451 type = dataMember->dataType;
13452 }
13453 }
13454 else if(type->kind == 9 || type->kind == 10)
13455 {
13456 struct Type * memberType;
13457
13458 for(memberType = type->__anon1.__anon1.members.first; memberType; memberType = memberType->next)
13459 {
13460 if(!strcmp(memberType->name, ident->string))
13461 {
13462 type = memberType;
13463 break;
13464 }
13465 }
13466 }
13467 }
13468 }
13469 if(value)
13470 {
13471 FreeType(value->destType);
13472 value->destType = type;
13473 if(type)
13474 type->refCount++;
13475 ComputeExpression(value);
13476 }
13477 if(!deepMember && type && value && (_class->type == 1 || _class->type == 0 || _class->type == 5))
13478 {
13479 if(type->kind == 8)
13480 {
13481 struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class->__anon1.registered;
13482
13483 if(_class && (_class->type == 2 || _class->type == 3 || _class->type == 4))
13484 {
13485 if(!_class->dataType)
13486 _class->dataType = ProcessTypeString(_class->dataTypeString, 0);
13487 type = _class->dataType;
13488 }
13489 }
13490 if(dataMember)
13491 {
13492 void * ptr = inst->data + dataMemberOffset;
13493
13494 if(value->type == 2)
13495 {
13496 switch(type->kind)
13497 {
13498 case 3:
13499 {
13500 GetInt(value, (int *)ptr);
13501 break;
13502 }
13503 case 4:
13504 {
13505 GetInt64(value, (long long *)ptr);
13506 break;
13507 }
13508 case 22:
13509 {
13510 GetIntPtr(value, (intptr_t *)ptr);
13511 break;
13512 }
13513 case 23:
13514 {
13515 GetIntSize(value, (ssize_t *)ptr);
13516 break;
13517 }
13518 case 6:
13519 {
13520 GetFloat(value, (float *)ptr);
13521 break;
13522 }
13523 case 7:
13524 {
13525 GetDouble(value, (double *)ptr);
13526 break;
13527 }
13528 }
13529 }
13530 else if(value->type == 1)
13531 {
13532 if(type->kind == 8)
13533 {
13534 struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class->__anon1.registered;
13535
13536 if(_class->type == 1)
13537 {
13538 ComputeTypeSize(type);
13539 if(value->__anon1.instance->data)
13540 memcpy(ptr, value->__anon1.instance->data, type->size);
13541 }
13542 }
13543 }
13544 }
13545 else if(prop && prop->Set != (void *)(intptr_t)1)
13546 {
13547 if(value->type == 1 && value->__anon1.instance->data)
13548 {
13549 if(type->kind == 8)
13550 {
13551 struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class->__anon1.registered;
13552
13553 if(_class && (_class->type != 0 || __ecereNameSpace__ecere__com__eClass_IsDerived(((struct __ecereNameSpace__ecere__com__Instance *)(char *)((struct __ecereNameSpace__ecere__com__Instance *)value->__anon1.instance->data))->_class, _class)))
13554 {
13555 void (* Set)(void *, void *) = (void *)prop->Set;
13556
13557 Set(inst->data, value->__anon1.instance->data);
13558 PopulateInstance(inst);
13559 }
13560 }
13561 }
13562 else if(value->type == 2)
13563 {
13564 switch(type->kind)
13565 {
13566 case 7:
13567 {
13568 void (* Set)(void *, double) = (void *)prop->Set;
13569
13570 Set(inst->data, strtod(value->__anon1.__anon1.constant, (((void *)0))));
13571 break;
13572 }
13573 case 6:
13574 {
13575 void (* Set)(void *, float) = (void *)prop->Set;
13576
13577 Set(inst->data, (float)(strtod(value->__anon1.__anon1.constant, (((void *)0)))));
13578 break;
13579 }
13580 case 3:
13581 {
13582 void (* Set)(void *, int) = (void *)prop->Set;
13583
13584 Set(inst->data, strtol(value->__anon1.__anon1.constant, (((void *)0)), 0));
13585 break;
13586 }
13587 case 4:
13588 {
13589 void (* Set)(void *, long long) = (void *)prop->Set;
13590
13591 Set(inst->data, __ecereNameSpace__ecere__com___strtoi64(value->__anon1.__anon1.constant, (((void *)0)), 0));
13592 break;
13593 }
13594 case 22:
13595 {
13596 void (* Set)(void *, intptr_t) = (void *)prop->Set;
13597
13598 Set(inst->data, (intptr_t)__ecereNameSpace__ecere__com___strtoi64(value->__anon1.__anon1.constant, (((void *)0)), 0));
13599 break;
13600 }
13601 case 23:
13602 {
13603 void (* Set)(void *, ssize_t) = (void *)prop->Set;
13604
13605 Set(inst->data, (ssize_t)__ecereNameSpace__ecere__com___strtoi64(value->__anon1.__anon1.constant, (((void *)0)), 0));
13606 break;
13607 }
13608 }
13609 }
13610 else if(value->type == 3)
13611 {
13612 char temp[1024];
13613
13614 ReadString(temp, value->__anon1.__anon2.string);
13615 ((void (*)(void *, void *))(void *)prop->Set)(inst->data, temp);
13616 }
13617 }
13618 }
13619 else if(!deepMember && type && _class->type == 3)
13620 {
13621 if(prop)
13622 {
13623 if(value->type == 2)
13624 {
13625 if(type->kind == 8)
13626 {
13627 struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class->__anon1.registered;
13628
13629 if(_class->type == 3)
13630 {
13631 if(!_class->dataType)
13632 _class->dataType = ProcessTypeString(_class->dataTypeString, 0);
13633 type = _class->dataType;
13634 }
13635 }
13636 switch(type->kind)
13637 {
13638 case 6:
13639 {
13640 float fValue;
13641 float (* Set)(float) = (void *)prop->Set;
13642
13643 GetFloat(member->initializer->__anon1.exp, &fValue);
13644 exp->__anon1.__anon1.constant = PrintFloat(Set(fValue));
13645 exp->type = 2;
13646 break;
13647 }
13648 case 7:
13649 {
13650 double dValue;
13651 double (* Set)(double) = (void *)prop->Set;
13652
13653 GetDouble(member->initializer->__anon1.exp, &dValue);
13654 exp->__anon1.__anon1.constant = PrintDouble(Set(dValue));
13655 exp->type = 2;
13656 break;
13657 }
13658 }
13659 }
13660 }
13661 }
13662 else if(!deepMember && type && _class->type == 2)
13663 {
13664 if(prop)
13665 {
13666 if(value->type == 1 && value->__anon1.instance->data)
13667 {
13668 unsigned int (* Set)(void *) = (void *)prop->Set;
13669
13670 bits = Set(value->__anon1.instance->data);
13671 }
13672 else if(value->type == 2)
13673 {
13674 }
13675 }
13676 else if(dataMember)
13677 {
13678 struct __ecereNameSpace__ecere__com__BitMember * bitMember = (struct __ecereNameSpace__ecere__com__BitMember *)dataMember;
13679 struct Type * type;
13680 uint64 part = 0;
13681
13682 bits = (bits & ~bitMember->mask);
13683 if(!bitMember->dataType)
13684 bitMember->dataType = ProcessTypeString(bitMember->dataTypeString, 0);
13685 type = bitMember->dataType;
13686 if(type->kind == 8 && type->__anon1._class && type->__anon1._class->__anon1.registered)
13687 {
13688 if(!type->__anon1._class->__anon1.registered->dataType)
13689 type->__anon1._class->__anon1.registered->dataType = ProcessTypeString(type->__anon1._class->__anon1.registered->dataTypeString, 0);
13690 type = type->__anon1._class->__anon1.registered->dataType;
13691 }
13692 switch(type->kind)
13693 {
13694 case 24:
13695 case 1:
13696 {
13697 unsigned char v;
13698
13699 type->isSigned ? GetChar(value, (char *)&v) : GetUChar(value, &v);
13700 part = (uint64)v;
13701 break;
13702 }
13703 case 2:
13704 {
13705 unsigned short v;
13706
13707 type->isSigned ? GetShort(value, (short *)&v) : GetUShort(value, &v);
13708 part = (uint64)v;
13709 break;
13710 }
13711 case 3:
13712 case 5:
13713 {
13714 unsigned int v;
13715
13716 type->isSigned ? GetInt(value, (int *)&v) : GetUInt(value, &v);
13717 part = (uint64)v;
13718 break;
13719 }
13720 case 4:
13721 {
13722 uint64 v;
13723
13724 type->isSigned ? GetInt64(value, (long long *)&v) : GetUInt64(value, &v);
13725 part = v;
13726 break;
13727 }
13728 case 22:
13729 {
13730 uintptr_t v;
13731
13732 type->isSigned ? GetIntPtr(value, (intptr_t *)&v) : GetUIntPtr(value, &v);
13733 part = (uint64)v;
13734 break;
13735 }
13736 case 23:
13737 {
13738 size_t v;
13739
13740 type->isSigned ? GetIntSize(value, (ssize_t *)&v) : GetUIntSize(value, &v);
13741 part = (uint64)v;
13742 break;
13743 }
13744 }
13745 bits |= part << bitMember->pos;
13746 }
13747 }
13748 }
13749 else
13750 {
13751 if(_class && _class->type == 3)
13752 {
13753 ComputeExpression(member->initializer->__anon1.exp);
13754 exp->__anon1.__anon1.constant = member->initializer->__anon1.exp->__anon1.__anon1.constant;
13755 exp->type = 2;
13756 member->initializer->__anon1.exp->__anon1.__anon1.constant = (((void *)0));
13757 }
13758 }
13759 }
13760 }
13761 break;
13762 }
13763 }
13764 }
13765 }
13766 if(_class && _class->type == 2)
13767 {
13768 exp->__anon1.__anon1.constant = PrintHexUInt(bits);
13769 exp->type = 2;
13770 }
13771 if(exp->type != 1)
13772 {
13773 FreeInstance(inst);
13774 }
13775 }
13776
13777 void ComputeExpression(struct Expression * exp)
13778 {
13779 switch(exp->type)
13780 {
13781 case 0:
13782 {
13783 struct Identifier * id = exp->__anon1.__anon1.identifier;
13784
13785 if(id && exp->isConstant && !inCompiler && !inPreCompiler && !inDebugger)
13786 {
13787 struct __ecereNameSpace__ecere__com__Class * c = (exp->expType && exp->expType->kind == 8 && exp->expType->__anon1._class) ? exp->expType->__anon1._class->__anon1.registered : (((void *)0));
13788
13789 if(c && c->type == 4)
13790 {
13791 struct __ecereNameSpace__ecere__com__Class * enumClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "enum");
13792
13793 if(enumClass)
13794 {
13795 struct __ecereNameSpace__ecere__sys__NamedLink64 * value;
13796 struct __ecereNameSpace__ecere__com__EnumClassData * e = (c ? ((void *)(((char *)c->data) + enumClass->offsetClass)) : (((void *)0)));
13797
13798 for(value = e->values.first; value; value = value->next)
13799 {
13800 if(!strcmp(value->name, id->string))
13801 break;
13802 }
13803 if(value)
13804 {
13805 const char * dts = c->dataTypeString;
13806
13807 FreeExpContents(exp);
13808 exp->type = 2;
13809 exp->__anon1.__anon1.constant = (dts && (!strcmp(dts, "int") || !strcmp(dts, "int64") || !strcmp(dts, "short") || !strcmp(dts, "char"))) ? PrintInt64(value->data) : PrintUInt64(value->data);
13810 }
13811 }
13812 }
13813 }
13814 break;
13815 }
13816 case 1:
13817 {
13818 ComputeInstantiation(exp);
13819 break;
13820 }
13821 case 4:
13822 {
13823 struct Expression * exp1, * exp2 = (((void *)0));
13824 struct Operand op1 =
13825 {
13826 0, 0, 0,
13827 .__anon1 = {
13828 .c = 0
13829 },
13830 {
13831 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
13832 }
13833 };
13834 struct Operand op2 =
13835 {
13836 0, 0, 0,
13837 .__anon1 = {
13838 .c = 0
13839 },
13840 {
13841 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
13842 }
13843 };
13844
13845 if(exp->__anon1.op.exp2)
13846 {
13847 struct Expression * e = exp->__anon1.op.exp2;
13848
13849 while((e->type == 5 || e->type == 32 || e->type == 23) && e->__anon1.list)
13850 {
13851 if(e->type == 5 || e->type == 32 || e->type == 23)
13852 {
13853 if(e->type == 23)
13854 e = (*((struct Statement *)(*e->__anon1.compound->__anon1.compound.statements).last)->__anon1.expressions).last;
13855 else
13856 e = (*e->__anon1.list).last;
13857 }
13858 }
13859 if(exp->__anon1.op.op == 261 && e && e->expType)
13860 {
13861 if(e->type == 3 && e->__anon1.__anon2.string)
13862 {
13863 char * string = e->__anon1.__anon2.string;
13864 int len = strlen(string);
13865 char * tmp = __ecereNameSpace__ecere__com__eSystem_New(sizeof(char) * (len - 2 + 1));
13866
13867 len = UnescapeString(tmp, string + 1, len - 2);
13868 (__ecereNameSpace__ecere__com__eSystem_Delete(tmp), tmp = 0);
13869 FreeExpContents(exp);
13870 exp->type = 2;
13871 exp->__anon1.__anon1.constant = PrintUInt(len + 1);
13872 }
13873 else
13874 {
13875 struct Type * type = e->expType;
13876
13877 type->refCount++;
13878 FreeExpContents(exp);
13879 exp->type = 2;
13880 exp->__anon1.__anon1.constant = PrintUInt(ComputeTypeSize(type));
13881 FreeType(type);
13882 }
13883 break;
13884 }
13885 else
13886 ComputeExpression(exp->__anon1.op.exp2);
13887 }
13888 if(exp->__anon1.op.exp1)
13889 {
13890 ComputeExpression(exp->__anon1.op.exp1);
13891 exp1 = exp->__anon1.op.exp1;
13892 exp2 = exp->__anon1.op.exp2;
13893 op1 = GetOperand(exp1);
13894 if(op1.type)
13895 op1.type->refCount++;
13896 if(exp2)
13897 {
13898 op2 = GetOperand(exp2);
13899 if(op2.type)
13900 op2.type->refCount++;
13901 }
13902 }
13903 else
13904 {
13905 exp1 = exp->__anon1.op.exp2;
13906 op1 = GetOperand(exp1);
13907 if(op1.type)
13908 op1.type->refCount++;
13909 }
13910 CallOperator(exp, exp1, exp2, &op1, &op2);
13911 if(op1.type)
13912 FreeType(op1.type);
13913 if(op2.type)
13914 FreeType(op2.type);
13915 break;
13916 }
13917 case 5:
13918 case 32:
13919 {
13920 struct Expression * e, * n;
13921
13922 for(e = (*exp->__anon1.list).first; e; e = n)
13923 {
13924 n = e->next;
13925 if(!n)
13926 {
13927 struct __ecereNameSpace__ecere__sys__OldList * list = exp->__anon1.list;
13928 struct Expression * prev = exp->prev;
13929 struct Expression * next = exp->next;
13930
13931 if(exp->expType && exp->expType->kind == 8 && (!e->expType || e->expType->kind != 8))
13932 {
13933 FreeType(e->expType);
13934 e->expType = exp->expType;
13935 e->expType->refCount++;
13936 }
13937 ComputeExpression(e);
13938 FreeType(exp->expType);
13939 FreeType(exp->destType);
13940 *exp = *e;
13941 exp->prev = prev;
13942 exp->next = next;
13943 ((e ? __extension__ ({
13944 void * __ecerePtrToDelete = (e);
13945
13946 __ecereClass_Expression->Destructor ? __ecereClass_Expression->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete);
13947 }) : 0), e = 0);
13948 (__ecereNameSpace__ecere__com__eSystem_Delete(list), list = 0);
13949 }
13950 else
13951 {
13952 FreeExpression(e);
13953 }
13954 }
13955 break;
13956 }
13957 case 8:
13958 {
13959 struct Expression * memberExp = exp->__anon1.member.exp;
13960 struct Identifier * memberID = exp->__anon1.member.member;
13961 struct Type * type;
13962
13963 ComputeExpression(exp->__anon1.member.exp);
13964 type = exp->__anon1.member.exp->expType;
13965 if(type)
13966 {
13967 struct __ecereNameSpace__ecere__com__Class * _class = (exp->__anon1.member.member && exp->__anon1.member.member->classSym) ? exp->__anon1.member.member->classSym->__anon1.registered : (((type->kind == 8 || type->kind == 19) && type->__anon1._class) ? type->__anon1._class->__anon1.registered : (((void *)0)));
13968 struct __ecereNameSpace__ecere__com__Property * prop = (((void *)0));
13969 struct __ecereNameSpace__ecere__com__DataMember * member = (((void *)0));
13970 struct __ecereNameSpace__ecere__com__Class * convertTo = (((void *)0));
13971
13972 if(type->kind == 19 && exp->__anon1.member.exp->type == 24)
13973 _class = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "ecere::com::Class");
13974 if(!_class)
13975 {
13976 char string[256];
13977 struct Symbol * classSym;
13978
13979 string[0] = '\0';
13980 PrintTypeNoConst(type, string, 0, 1);
13981 classSym = FindClass(string);
13982 _class = classSym ? classSym->__anon1.registered : (((void *)0));
13983 }
13984 if(exp->__anon1.member.member)
13985 {
13986 prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, exp->__anon1.member.member->string, privateModule);
13987 if(!prop)
13988 member = __ecereNameSpace__ecere__com__eClass_FindDataMember(_class, exp->__anon1.member.member->string, privateModule, (((void *)0)), (((void *)0)));
13989 }
13990 if(!prop && !member && _class && exp->__anon1.member.member)
13991 {
13992 struct Symbol * classSym = FindClass(exp->__anon1.member.member->string);
13993
13994 convertTo = _class;
13995 _class = classSym ? classSym->__anon1.registered : (((void *)0));
13996 prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, convertTo->fullName, privateModule);
13997 }
13998 if(prop)
13999 {
14000 if(prop->compiled)
14001 {
14002 struct Type * type = prop->dataType;
14003
14004 if(_class->type == 3)
14005 {
14006 if(type->kind == 8)
14007 {
14008 struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class->__anon1.registered;
14009
14010 if(_class->type == 3)
14011 {
14012 if(!_class->dataType)
14013 _class->dataType = ProcessTypeString(_class->dataTypeString, 0);
14014 type = _class->dataType;
14015 }
14016 }
14017 switch(type->kind)
14018 {
14019 case 6:
14020 {
14021 float value;
14022 float (* Get)(float) = (void *)prop->Get;
14023
14024 GetFloat(exp->__anon1.member.exp, &value);
14025 exp->__anon1.__anon1.constant = PrintFloat(Get ? Get(value) : value);
14026 exp->type = 2;
14027 break;
14028 }
14029 case 7:
14030 {
14031 double value;
14032 double (* Get)(double);
14033
14034 GetDouble(exp->__anon1.member.exp, &value);
14035 if(convertTo)
14036 Get = (void *)prop->Set;
14037 else
14038 Get = (void *)prop->Get;
14039 exp->__anon1.__anon1.constant = PrintDouble(Get ? Get(value) : value);
14040 exp->type = 2;
14041 break;
14042 }
14043 }
14044 }
14045 else
14046 {
14047 if(convertTo)
14048 {
14049 struct Expression * value = exp->__anon1.member.exp;
14050 struct Type * type;
14051
14052 if(!prop->dataType)
14053 ProcessPropertyType(prop);
14054 type = prop->dataType;
14055 if(!type)
14056 {
14057 }
14058 else if(_class->type == 1)
14059 {
14060 switch(type->kind)
14061 {
14062 case 8:
14063 {
14064 struct __ecereNameSpace__ecere__com__Class * propertyClass = type->__anon1._class->__anon1.registered;
14065
14066 if(propertyClass->type == 1 && value->type == 1)
14067 {
14068 void (* Set)(void *, void *) = (void *)prop->Set;
14069
14070 exp->__anon1.instance = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Instantiation);
14071 exp->__anon1.instance->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize));
14072 exp->__anon1.instance->_class = MkSpecifierName(_class->fullName);
14073 exp->__anon1.instance->loc = exp->loc;
14074 exp->type = 1;
14075 Set(exp->__anon1.instance->data, value->__anon1.instance->data);
14076 PopulateInstance(exp->__anon1.instance);
14077 }
14078 break;
14079 }
14080 case 3:
14081 {
14082 int intValue;
14083 void (* Set)(void *, int) = (void *)prop->Set;
14084
14085 exp->__anon1.instance = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Instantiation);
14086 exp->__anon1.instance->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize));
14087 exp->__anon1.instance->_class = MkSpecifierName(_class->fullName);
14088 exp->__anon1.instance->loc = exp->loc;
14089 exp->type = 1;
14090 GetInt(value, &intValue);
14091 Set(exp->__anon1.instance->data, intValue);
14092 PopulateInstance(exp->__anon1.instance);
14093 break;
14094 }
14095 case 4:
14096 {
14097 long long intValue;
14098 void (* Set)(void *, long long) = (void *)prop->Set;
14099
14100 exp->__anon1.instance = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Instantiation);
14101 exp->__anon1.instance->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize));
14102 exp->__anon1.instance->_class = MkSpecifierName(_class->fullName);
14103 exp->__anon1.instance->loc = exp->loc;
14104 exp->type = 1;
14105 GetInt64(value, &intValue);
14106 Set(exp->__anon1.instance->data, intValue);
14107 PopulateInstance(exp->__anon1.instance);
14108 break;
14109 }
14110 case 22:
14111 {
14112 intptr_t intValue;
14113 void (* Set)(void *, intptr_t) = (void *)prop->Set;
14114
14115 exp->__anon1.instance = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Instantiation);
14116 exp->__anon1.instance->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize));
14117 exp->__anon1.instance->_class = MkSpecifierName(_class->fullName);
14118 exp->__anon1.instance->loc = exp->loc;
14119 exp->type = 1;
14120 GetIntPtr(value, &intValue);
14121 Set(exp->__anon1.instance->data, intValue);
14122 PopulateInstance(exp->__anon1.instance);
14123 break;
14124 }
14125 case 23:
14126 {
14127 ssize_t intValue;
14128 void (* Set)(void *, ssize_t) = (void *)prop->Set;
14129
14130 exp->__anon1.instance = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Instantiation);
14131 exp->__anon1.instance->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize));
14132 exp->__anon1.instance->_class = MkSpecifierName(_class->fullName);
14133 exp->__anon1.instance->loc = exp->loc;
14134 exp->type = 1;
14135 GetIntSize(value, &intValue);
14136 Set(exp->__anon1.instance->data, intValue);
14137 PopulateInstance(exp->__anon1.instance);
14138 break;
14139 }
14140 case 6:
14141 {
14142 float floatValue;
14143 void (* Set)(void *, float) = (void *)prop->Set;
14144
14145 exp->__anon1.instance = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Instantiation);
14146 exp->__anon1.instance->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize));
14147 exp->__anon1.instance->_class = MkSpecifierName(_class->fullName);
14148 exp->__anon1.instance->loc = exp->loc;
14149 exp->type = 1;
14150 GetFloat(value, &floatValue);
14151 Set(exp->__anon1.instance->data, floatValue);
14152 PopulateInstance(exp->__anon1.instance);
14153 break;
14154 }
14155 case 7:
14156 {
14157 double doubleValue;
14158 void (* Set)(void *, double) = (void *)prop->Set;
14159
14160 exp->__anon1.instance = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Instantiation);
14161 exp->__anon1.instance->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize));
14162 exp->__anon1.instance->_class = MkSpecifierName(_class->fullName);
14163 exp->__anon1.instance->loc = exp->loc;
14164 exp->type = 1;
14165 GetDouble(value, &doubleValue);
14166 Set(exp->__anon1.instance->data, doubleValue);
14167 PopulateInstance(exp->__anon1.instance);
14168 break;
14169 }
14170 }
14171 }
14172 else if(_class->type == 2)
14173 {
14174 switch(type->kind)
14175 {
14176 case 8:
14177 {
14178 struct __ecereNameSpace__ecere__com__Class * propertyClass = type->__anon1._class->__anon1.registered;
14179
14180 if(propertyClass->type == 1 && value->__anon1.instance->data)
14181 {
14182 unsigned int (* Set)(void *) = (void *)prop->Set;
14183 unsigned int bits = Set(value->__anon1.instance->data);
14184
14185 exp->__anon1.__anon1.constant = PrintHexUInt(bits);
14186 exp->type = 2;
14187 break;
14188 }
14189 else if(_class->type == 2)
14190 {
14191 unsigned int value;
14192 unsigned int (* Set)(unsigned int) = (void *)prop->Set;
14193 unsigned int bits;
14194
14195 GetUInt(exp->__anon1.member.exp, &value);
14196 bits = Set(value);
14197 exp->__anon1.__anon1.constant = PrintHexUInt(bits);
14198 exp->type = 2;
14199 }
14200 }
14201 }
14202 }
14203 }
14204 else
14205 {
14206 if(_class->type == 2)
14207 {
14208 unsigned int value;
14209
14210 GetUInt(exp->__anon1.member.exp, &value);
14211 switch(type->kind)
14212 {
14213 case 8:
14214 {
14215 struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class->__anon1.registered;
14216
14217 if(_class->type == 1)
14218 {
14219 void (* Get)(unsigned int, void *) = (void *)prop->Get;
14220
14221 exp->__anon1.instance = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Instantiation);
14222 exp->__anon1.instance->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize));
14223 exp->__anon1.instance->_class = MkSpecifierName(_class->fullName);
14224 exp->__anon1.instance->loc = exp->loc;
14225 exp->type = 1;
14226 Get(value, exp->__anon1.instance->data);
14227 PopulateInstance(exp->__anon1.instance);
14228 }
14229 else if(_class->type == 2)
14230 {
14231 unsigned int (* Get)(unsigned int) = (void *)prop->Get;
14232 uint64 bits = Get(value);
14233
14234 exp->__anon1.__anon1.constant = PrintHexUInt64(bits);
14235 exp->type = 2;
14236 }
14237 break;
14238 }
14239 }
14240 }
14241 else if(_class->type == 1)
14242 {
14243 unsigned char * value = (exp->__anon1.member.exp->type == 1) ? exp->__anon1.member.exp->__anon1.instance->data : (((void *)0));
14244
14245 switch(type->kind)
14246 {
14247 case 8:
14248 {
14249 struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class->__anon1.registered;
14250
14251 if(_class->type == 1 && value)
14252 {
14253 void (* Get)(void *, void *) = (void *)prop->Get;
14254
14255 exp->__anon1.instance = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Instantiation);
14256 exp->__anon1.instance->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize));
14257 exp->__anon1.instance->_class = MkSpecifierName(_class->fullName);
14258 exp->__anon1.instance->loc = exp->loc;
14259 exp->type = 1;
14260 Get(value, exp->__anon1.instance->data);
14261 PopulateInstance(exp->__anon1.instance);
14262 }
14263 break;
14264 }
14265 }
14266 }
14267 }
14268 }
14269 }
14270 else
14271 {
14272 exp->isConstant = 0;
14273 }
14274 }
14275 else if(member)
14276 {
14277 }
14278 }
14279 if(exp->type != 8)
14280 {
14281 FreeExpression(memberExp);
14282 FreeIdentifier(memberID);
14283 }
14284 break;
14285 }
14286 case 10:
14287 {
14288 struct Type * type = ProcessType(exp->__anon1.typeName->qualifiers, exp->__anon1.typeName->declarator);
14289
14290 FreeExpContents(exp);
14291 exp->__anon1.__anon1.constant = PrintUInt(ComputeTypeSize(type));
14292 exp->type = 2;
14293 FreeType(type);
14294 break;
14295 }
14296 case 15:
14297 {
14298 struct Symbol * classSym = exp->__anon1._class->__anon1.__anon1.symbol;
14299
14300 if(classSym && classSym->__anon1.registered)
14301 {
14302 if(classSym->__anon1.registered->fixed)
14303 {
14304 FreeSpecifier(exp->__anon1._class);
14305 exp->__anon1.__anon1.constant = PrintUInt(classSym->__anon1.registered->templateClass ? classSym->__anon1.registered->templateClass->structSize : classSym->__anon1.registered->structSize);
14306 exp->type = 2;
14307 }
14308 else
14309 {
14310 char className[1024];
14311
14312 strcpy(className, "__ecereClass_");
14313 FullClassNameCat(className, classSym->string, 1);
14314 DeclareClass(curExternal, classSym, className);
14315 FreeExpContents(exp);
14316 exp->type = 9;
14317 exp->__anon1.member.exp = MkExpIdentifier(MkIdentifier(className));
14318 exp->__anon1.member.member = MkIdentifier("structSize");
14319 }
14320 }
14321 break;
14322 }
14323 case 11:
14324 {
14325 struct Type * type;
14326 struct Expression * e = exp;
14327
14328 if(exp->type == 11)
14329 {
14330 if(exp->__anon1.cast.exp)
14331 ComputeExpression(exp->__anon1.cast.exp);
14332 e = exp->__anon1.cast.exp;
14333 }
14334 if(e && exp->expType)
14335 {
14336 type = exp->expType;
14337 if(type->kind == 8)
14338 {
14339 struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class->__anon1.registered;
14340
14341 if(_class && (_class->type == 3 || _class->type == 2))
14342 {
14343 if(!_class->dataType)
14344 _class->dataType = ProcessTypeString(_class->dataTypeString, 0);
14345 type = _class->dataType;
14346 }
14347 }
14348 switch(type->kind)
14349 {
14350 case 24:
14351 case 1:
14352 if(type->isSigned)
14353 {
14354 char value = 0;
14355
14356 if(GetChar(e, &value))
14357 {
14358 FreeExpContents(exp);
14359 exp->__anon1.__anon1.constant = PrintChar(value);
14360 exp->type = 2;
14361 }
14362 }
14363 else
14364 {
14365 unsigned char value = 0;
14366
14367 if(GetUChar(e, &value))
14368 {
14369 FreeExpContents(exp);
14370 exp->__anon1.__anon1.constant = PrintUChar(value);
14371 exp->type = 2;
14372 }
14373 }
14374 break;
14375 case 2:
14376 if(type->isSigned)
14377 {
14378 short value = 0;
14379
14380 if(GetShort(e, &value))
14381 {
14382 FreeExpContents(exp);
14383 exp->__anon1.__anon1.constant = PrintShort(value);
14384 exp->type = 2;
14385 }
14386 }
14387 else
14388 {
14389 unsigned short value = 0;
14390
14391 if(GetUShort(e, &value))
14392 {
14393 FreeExpContents(exp);
14394 exp->__anon1.__anon1.constant = PrintUShort(value);
14395 exp->type = 2;
14396 }
14397 }
14398 break;
14399 case 3:
14400 if(type->isSigned)
14401 {
14402 int value = 0;
14403
14404 if(GetInt(e, &value))
14405 {
14406 FreeExpContents(exp);
14407 exp->__anon1.__anon1.constant = PrintInt(value);
14408 exp->type = 2;
14409 }
14410 }
14411 else
14412 {
14413 unsigned int value = 0;
14414
14415 if(GetUInt(e, &value))
14416 {
14417 FreeExpContents(exp);
14418 exp->__anon1.__anon1.constant = PrintUInt(value);
14419 exp->type = 2;
14420 }
14421 }
14422 break;
14423 case 4:
14424 if(type->isSigned)
14425 {
14426 long long value = 0;
14427
14428 if(GetInt64(e, &value))
14429 {
14430 FreeExpContents(exp);
14431 exp->__anon1.__anon1.constant = PrintInt64(value);
14432 exp->type = 2;
14433 }
14434 }
14435 else
14436 {
14437 uint64 value = 0;
14438
14439 if(GetUInt64(e, &value))
14440 {
14441 FreeExpContents(exp);
14442 exp->__anon1.__anon1.constant = PrintUInt64(value);
14443 exp->type = 2;
14444 }
14445 }
14446 break;
14447 case 22:
14448 if(type->isSigned)
14449 {
14450 intptr_t value = 0;
14451
14452 if(GetIntPtr(e, &value))
14453 {
14454 FreeExpContents(exp);
14455 exp->__anon1.__anon1.constant = PrintInt64((long long)value);
14456 exp->type = 2;
14457 }
14458 }
14459 else
14460 {
14461 uintptr_t value = 0;
14462
14463 if(GetUIntPtr(e, &value))
14464 {
14465 FreeExpContents(exp);
14466 exp->__anon1.__anon1.constant = PrintUInt64((uint64)value);
14467 exp->type = 2;
14468 }
14469 }
14470 break;
14471 case 23:
14472 if(type->isSigned)
14473 {
14474 ssize_t value = 0;
14475
14476 if(GetIntSize(e, &value))
14477 {
14478 FreeExpContents(exp);
14479 exp->__anon1.__anon1.constant = PrintInt64((long long)value);
14480 exp->type = 2;
14481 }
14482 }
14483 else
14484 {
14485 size_t value = 0;
14486
14487 if(GetUIntSize(e, &value))
14488 {
14489 FreeExpContents(exp);
14490 exp->__anon1.__anon1.constant = PrintUInt64((uint64)value);
14491 exp->type = 2;
14492 }
14493 }
14494 break;
14495 case 6:
14496 {
14497 float value = 0;
14498
14499 if(GetFloat(e, &value))
14500 {
14501 FreeExpContents(exp);
14502 exp->__anon1.__anon1.constant = PrintFloat(value);
14503 exp->type = 2;
14504 }
14505 break;
14506 }
14507 case 7:
14508 {
14509 double value = 0;
14510
14511 if(GetDouble(e, &value))
14512 {
14513 FreeExpContents(exp);
14514 exp->__anon1.__anon1.constant = PrintDouble(value);
14515 exp->type = 2;
14516 }
14517 break;
14518 }
14519 }
14520 }
14521 break;
14522 }
14523 case 12:
14524 {
14525 struct Operand op1 =
14526 {
14527 0, 0, 0,
14528 .__anon1 = {
14529 .c = 0
14530 },
14531 {
14532 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
14533 }
14534 };
14535 struct Operand op2 =
14536 {
14537 0, 0, 0,
14538 .__anon1 = {
14539 .c = 0
14540 },
14541 {
14542 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
14543 }
14544 };
14545 struct Operand op3 =
14546 {
14547 0, 0, 0,
14548 .__anon1 = {
14549 .c = 0
14550 },
14551 {
14552 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
14553 }
14554 };
14555
14556 if(exp->__anon1.cond.exp)
14557 ComputeExpression((*exp->__anon1.cond.exp).last);
14558 if(exp->__anon1.cond.elseExp)
14559 ComputeExpression(exp->__anon1.cond.elseExp);
14560 if(exp->__anon1.cond.cond)
14561 ComputeExpression(exp->__anon1.cond.cond);
14562 op1 = GetOperand(exp->__anon1.cond.cond);
14563 if(op1.type)
14564 op1.type->refCount++;
14565 op2 = GetOperand((*exp->__anon1.cond.exp).last);
14566 if(op2.type)
14567 op2.type->refCount++;
14568 op3 = GetOperand(exp->__anon1.cond.elseExp);
14569 if(op3.type)
14570 op3.type->refCount++;
14571 if(op1.ops.Cond)
14572 {
14573 FreeExpContents(exp);
14574 op1.ops.Cond(exp, &op1, &op2, &op3);
14575 }
14576 if(op1.type)
14577 FreeType(op1.type);
14578 if(op2.type)
14579 FreeType(op2.type);
14580 if(op3.type)
14581 FreeType(op3.type);
14582 break;
14583 }
14584 }
14585 }
14586
14587 static void ProcessFunction(struct FunctionDefinition *  function);
14588
14589 void ProcessInstantiationType(struct Instantiation * inst)
14590 {
14591 yylloc = inst->loc;
14592 if(inst->_class)
14593 {
14594 struct MembersInit * members;
14595 struct Symbol * classSym;
14596 struct __ecereNameSpace__ecere__com__Class * _class;
14597
14598 classSym = inst->_class->__anon1.__anon1.symbol;
14599 _class = classSym ? classSym->__anon1.registered : (((void *)0));
14600 if(!_class || _class->type != 5)
14601 DeclareStruct(curExternal, inst->_class->__anon1.__anon1.name, 0, 1);
14602 afterExternal = afterExternal ? afterExternal : curExternal;
14603 if(inst->exp)
14604 ProcessExpressionType(inst->exp);
14605 inst->isConstant = 1;
14606 if(inst->members)
14607 {
14608 struct __ecereNameSpace__ecere__com__DataMember * curMember = (((void *)0));
14609 struct __ecereNameSpace__ecere__com__Class * curClass = (((void *)0));
14610 struct __ecereNameSpace__ecere__com__DataMember * subMemberStack[256];
14611 int subMemberStackPos = 0;
14612
14613 for(members = (*inst->members).first; members; members = members->next)
14614 {
14615 switch(members->type)
14616 {
14617 case 1:
14618 {
14619 char name[1024];
14620 static unsigned int instMethodID = 0;
14621 struct External * external = curExternal;
14622 struct Context * context = curContext;
14623 struct Declarator * declarator = members->__anon1.function->declarator;
14624 struct Identifier * nameID = GetDeclId(declarator);
14625 char * unmangled = nameID ? nameID->string : (((void *)0));
14626 struct Expression * exp;
14627 struct External * createdExternal = (((void *)0));
14628
14629 if(inCompiler)
14630 {
14631 char number[16];
14632
14633 strcpy(name, "__ecereInstMeth_");
14634 FullClassNameCat(name, _class ? _class->fullName : "_UNKNOWNCLASS", 0);
14635 strcat(name, "_");
14636 strcat(name, nameID->string);
14637 strcat(name, "_");
14638 sprintf(number, "_%08d", instMethodID++);
14639 strcat(name, number);
14640 nameID->string = __ecereNameSpace__ecere__sys__CopyString(name);
14641 }
14642 if(declarator)
14643 {
14644 struct Symbol * symbol = declarator->symbol;
14645 struct __ecereNameSpace__ecere__com__Method * method = __ecereNameSpace__ecere__com__eClass_FindMethod(_class, unmangled, privateModule);
14646
14647 if(method && method->type == 1)
14648 {
14649 symbol->__anon1.method = method;
14650 ProcessMethodType(method);
14651 if(!symbol->type->__anon1.__anon2.thisClass)
14652 {
14653 if(method->dataType->__anon1.__anon2.thisClass && currentClass && __ecereNameSpace__ecere__com__eClass_IsDerived(currentClass, method->dataType->__anon1.__anon2.thisClass->__anon1.registered))
14654 {
14655 if(!currentClass->symbol)
14656 currentClass->symbol = FindClass(currentClass->fullName);
14657 symbol->type->__anon1.__anon2.thisClass = currentClass->symbol;
14658 }
14659 else
14660 {
14661 if(!_class->symbol)
14662 _class->symbol = FindClass(_class->fullName);
14663 symbol->type->__anon1.__anon2.thisClass = _class->symbol;
14664 }
14665 }
14666 DeclareType(curExternal, symbol->type, 1, 1);
14667 }
14668 else if(classSym)
14669 {
14670 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "couldn't find virtual method %s in class %s\n", (((void *)0))), unmangled, classSym->string);
14671 }
14672 }
14673 createdExternal = ProcessClassFunction(classSym ? classSym->__anon1.registered : (((void *)0)), members->__anon1.function, ast, afterExternal, 1);
14674 if(nameID)
14675 {
14676 FreeSpecifier(nameID->_class);
14677 nameID->_class = (((void *)0));
14678 }
14679 curExternal = createdExternal;
14680 if(inCompiler)
14681 {
14682 if(createdExternal->__anon1.function)
14683 ProcessFunction(createdExternal->__anon1.function);
14684 }
14685 else if(declarator)
14686 {
14687 curExternal = declarator->symbol->__anon2.__anon1.pointerExternal;
14688 ProcessFunction((struct FunctionDefinition *)members->__anon1.function);
14689 }
14690 curExternal = external;
14691 curContext = context;
14692 if(inCompiler)
14693 {
14694 FreeClassFunction(members->__anon1.function);
14695 exp = QMkExpId(name);
14696 members->type = 0;
14697 members->__anon1.dataMembers = MkListOne(MkMemberInit(MkListOne(MkIdentifier(unmangled)), MkInitializerAssignment(exp)));
14698 (__ecereNameSpace__ecere__com__eSystem_Delete(unmangled), unmangled = 0);
14699 }
14700 break;
14701 }
14702 case 0:
14703 {
14704 if(members->__anon1.dataMembers && classSym)
14705 {
14706 struct MemberInit * member;
14707 struct Location oldyyloc = yylloc;
14708
14709 for(member = (*members->__anon1.dataMembers).first; member; member = member->next)
14710 {
14711 ProcessMemberInitData(member, classSym->__anon1.registered, &curClass, &curMember, subMemberStack, &subMemberStackPos);
14712 if(member->initializer && !member->initializer->isConstant)
14713 inst->isConstant = 0;
14714 }
14715 yylloc = oldyyloc;
14716 }
14717 break;
14718 }
14719 }
14720 }
14721 }
14722 }
14723 }
14724
14725 static void ProcessClass(struct __ecereNameSpace__ecere__sys__OldList *  definitions, struct Symbol *  symbol);
14726
14727 static void ProcessSpecifier(struct Specifier * spec, unsigned int declareStruct, unsigned int warnClasses)
14728 {
14729 switch(spec->type)
14730 {
14731 case 0:
14732 {
14733 if(spec->__anon1.specifier == THISCLASS)
14734 {
14735 if(thisClass)
14736 {
14737 spec->type = 1;
14738 spec->__anon1.__anon1.name = ReplaceThisClass(thisClass);
14739 spec->__anon1.__anon1.symbol = FindClass(spec->__anon1.__anon1.name);
14740 ProcessSpecifier(spec, declareStruct, 0);
14741 }
14742 }
14743 break;
14744 }
14745 case 1:
14746 {
14747 struct Symbol * symbol = FindType(curContext, spec->__anon1.__anon1.name);
14748
14749 if(symbol)
14750 DeclareType(curExternal, symbol->type, 1, 1);
14751 else if(spec->__anon1.__anon1.symbol)
14752 {
14753 struct __ecereNameSpace__ecere__com__Class * c = spec->__anon1.__anon1.symbol->__anon1.registered;
14754
14755 if(warnClasses && !c)
14756 Compiler_Warning("Undeclared class %s\n", spec->__anon1.__anon1.name);
14757 DeclareStruct(curExternal, spec->__anon1.__anon1.name, c && c->type == 5, declareStruct && c && c->type == 1);
14758 }
14759 break;
14760 }
14761 case 2:
14762 {
14763 struct Enumerator * e;
14764
14765 if(spec->__anon1.__anon2.list)
14766 {
14767 for(e = (*spec->__anon1.__anon2.list).first; e; e = e->next)
14768 {
14769 if(e->exp)
14770 ProcessExpressionType(e->exp);
14771 }
14772 }
14773 if(inCompiler)
14774 break;
14775 }
14776 case 3:
14777 case 4:
14778 {
14779 if(spec->__anon1.__anon2.definitions)
14780 {
14781 struct Symbol * symbol = spec->__anon1.__anon2.id ? FindClass(spec->__anon1.__anon2.id->string) : (((void *)0));
14782
14783 ProcessClass(spec->__anon1.__anon2.definitions, symbol);
14784 }
14785 break;
14786 }
14787 }
14788 }
14789
14790 static void ProcessDeclarator(struct Declarator * decl, unsigned int isFunction)
14791 {
14792 switch(decl->type)
14793 {
14794 case 1:
14795 if(decl->__anon1.identifier->classSym)
14796 {
14797 FreeSpecifier(decl->__anon1.identifier->_class);
14798 decl->__anon1.identifier->_class = (((void *)0));
14799 }
14800 break;
14801 case 3:
14802 if(decl->__anon1.array.exp)
14803 ProcessExpressionType(decl->__anon1.array.exp);
14804 case 0:
14805 case 2:
14806 case 4:
14807 case 5:
14808 case 6:
14809 case 7:
14810 {
14811 struct Identifier * id = (((void *)0));
14812 struct Specifier * classSpec = (((void *)0));
14813
14814 if(decl->type == 4)
14815 {
14816 id = GetDeclId(decl);
14817 if(id && id->_class)
14818 {
14819 classSpec = id->_class;
14820 id->_class = (((void *)0));
14821 }
14822 }
14823 if(decl->declarator)
14824 ProcessDeclarator(decl->declarator, isFunction);
14825 if(decl->type == 4)
14826 {
14827 if(classSpec)
14828 {
14829 struct TypeName * param = (param = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_TypeName), param->qualifiers = MkListOne(classSpec), param->declarator = (((void *)0)), param);
14830
14831 if(!decl->__anon1.function.parameters)
14832 decl->__anon1.function.parameters = MkList();
14833 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*decl->__anon1.function.parameters), (((void *)0)), param);
14834 }
14835 if(decl->__anon1.function.parameters)
14836 {
14837 struct TypeName * param;
14838
14839 for(param = (*decl->__anon1.function.parameters).first; param; param = param->next)
14840 {
14841 if(param->qualifiers)
14842 {
14843 struct Specifier * spec;
14844
14845 for(spec = (*param->qualifiers).first; spec; spec = spec->next)
14846 {
14847 if(spec->type == 0)
14848 {
14849 if(spec->__anon1.specifier == TYPED_OBJECT)
14850 {
14851 struct Declarator * d = param->declarator;
14852 struct TypeName * newParam = (newParam = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_TypeName), newParam->qualifiers = MkListOne(MkSpecifier(VOID)), newParam->declarator = MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), d), newParam);
14853
14854 if(!d || d->type != 5)
14855 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*newParam->qualifiers), (((void *)0)), MkSpecifier(CONST));
14856 FreeList(param->qualifiers, (void *)(FreeSpecifier));
14857 param->qualifiers = MkListOne(MkStructOrUnion(3, MkIdentifier("__ecereNameSpace__ecere__com__Class"), (((void *)0))));
14858 param->declarator = MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), MkDeclaratorIdentifier(MkIdentifier("class")));
14859 DeclareStruct(curExternal, "ecere::com::Class", 0, 1);
14860 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*decl->__anon1.function.parameters), param, newParam);
14861 param = newParam;
14862 break;
14863 }
14864 else if(spec->__anon1.specifier == ANY_OBJECT)
14865 {
14866 struct Declarator * d = param->declarator;
14867
14868 FreeList(param->qualifiers, (void *)(FreeSpecifier));
14869 param->qualifiers = MkListOne(MkSpecifier(VOID));
14870 if(!d || d->type != 5)
14871 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*param->qualifiers), (((void *)0)), MkSpecifier(CONST));
14872 param->declarator = MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), d);
14873 break;
14874 }
14875 else if(spec->__anon1.specifier == THISCLASS)
14876 {
14877 if(thisClass)
14878 {
14879 spec->type = 1;
14880 spec->__anon1.__anon1.name = ReplaceThisClass(thisClass);
14881 spec->__anon1.__anon1.symbol = FindClass(spec->__anon1.__anon1.name);
14882 ProcessSpecifier(spec, 0, 0);
14883 }
14884 break;
14885 }
14886 }
14887 else if(spec->type == 1)
14888 {
14889 ProcessSpecifier(spec, isFunction, 1);
14890 }
14891 else if((spec->type == 3 || spec->type == 4) && !spec->__anon1.__anon2.definitions && spec->__anon1.__anon2.id && spec->__anon1.__anon2.id->string)
14892 {
14893 struct Declarator * d = param->declarator;
14894
14895 if(!d || d->type != 5)
14896 DeclareStruct(curExternal, spec->__anon1.__anon2.id->string, 0, 1);
14897 }
14898 }
14899 }
14900 if(param->declarator)
14901 ProcessDeclarator(param->declarator, 0);
14902 }
14903 }
14904 }
14905 break;
14906 }
14907 }
14908 }
14909
14910 static void ProcessDeclaration(struct Declaration * decl, unsigned int warnClasses)
14911 {
14912 yylloc = decl->loc;
14913 switch(decl->type)
14914 {
14915 case 1:
14916 {
14917 unsigned int declareStruct = 0;
14918
14919 if(decl->__anon1.__anon1.declarators)
14920 {
14921 struct InitDeclarator * d;
14922
14923 for(d = (*decl->__anon1.__anon1.declarators).first; d; d = d->next)
14924 {
14925 struct Type * type, * subType;
14926
14927 ProcessDeclarator(d->declarator, 0);
14928 type = ProcessType(decl->__anon1.__anon1.specifiers, d->declarator);
14929 if(d->initializer)
14930 {
14931 ProcessInitializer(d->initializer, type);
14932 if((*decl->__anon1.__anon1.declarators).count == 1 && d->initializer->type == 0 && d->initializer->__anon1.exp->type == 1)
14933 {
14934 if(type->kind == 8 && type->__anon1._class == d->initializer->__anon1.exp->expType->__anon1._class)
14935 {
14936 struct Instantiation * inst = d->initializer->__anon1.exp->__anon1.instance;
14937
14938 inst->exp = MkExpIdentifier(CopyIdentifier(GetDeclId(d->declarator)));
14939 d->initializer->__anon1.exp->__anon1.instance = (((void *)0));
14940 if(decl->__anon1.__anon1.specifiers)
14941 FreeList(decl->__anon1.__anon1.specifiers, (void *)(FreeSpecifier));
14942 FreeList(decl->__anon1.__anon1.declarators, (void *)(FreeInitDeclarator));
14943 d = (((void *)0));
14944 decl->type = 2;
14945 decl->__anon1.inst = inst;
14946 }
14947 }
14948 }
14949 for(subType = type; subType; )
14950 {
14951 if(subType->kind == 8)
14952 {
14953 declareStruct = 1;
14954 break;
14955 }
14956 else if(subType->kind == 13)
14957 break;
14958 else if(subType->kind == 12)
14959 subType = subType->__anon1.__anon4.arrayType;
14960 else
14961 break;
14962 }
14963 FreeType(type);
14964 if(!d)
14965 break;
14966 }
14967 }
14968 if(decl->__anon1.__anon1.specifiers)
14969 {
14970 struct Specifier * s;
14971
14972 for(s = (*decl->__anon1.__anon1.specifiers).first; s; s = s->next)
14973 {
14974 ProcessSpecifier(s, declareStruct, 1);
14975 }
14976 }
14977 break;
14978 }
14979 case 2:
14980 {
14981 ProcessInstantiationType(decl->__anon1.inst);
14982 break;
14983 }
14984 case 0:
14985 {
14986 struct Specifier * spec;
14987 struct Declarator * d;
14988 unsigned int declareStruct = 0;
14989
14990 if(decl->__anon1.__anon1.declarators)
14991 {
14992 for(d = (*decl->__anon1.__anon1.declarators).first; d; d = d->next)
14993 {
14994 struct Type * type = ProcessType(decl->__anon1.__anon1.specifiers, d->declarator);
14995 struct Type * subType;
14996
14997 ProcessDeclarator(d, 0);
14998 for(subType = type; subType; )
14999 {
15000 if(subType->kind == 8)
15001 {
15002 declareStruct = 1;
15003 break;
15004 }
15005 else if(subType->kind == 13)
15006 break;
15007 else if(subType->kind == 12)
15008 subType = subType->__anon1.__anon4.arrayType;
15009 else
15010 break;
15011 }
15012 FreeType(type);
15013 }
15014 }
15015 if(decl->__anon1.__anon1.specifiers)
15016 {
15017 for(spec = (*decl->__anon1.__anon1.specifiers).first; spec; spec = spec->next)
15018 ProcessSpecifier(spec, declareStruct, warnClasses);
15019 }
15020 break;
15021 }
15022 }
15023 }
15024
15025 static void ProcessStatement(struct Statement * stmt)
15026 {
15027 yylloc = stmt->loc;
15028 switch(stmt->type)
15029 {
15030 case 0:
15031 ProcessStatement(stmt->__anon1.labeled.stmt);
15032 break;
15033 case 1:
15034 if(stmt->__anon1.caseStmt.exp)
15035 {
15036 FreeType(stmt->__anon1.caseStmt.exp->destType);
15037 stmt->__anon1.caseStmt.exp->destType = curSwitchType;
15038 if(curSwitchType)
15039 curSwitchType->refCount++;
15040 ProcessExpressionType(stmt->__anon1.caseStmt.exp);
15041 ComputeExpression(stmt->__anon1.caseStmt.exp);
15042 }
15043 if(stmt->__anon1.caseStmt.stmt)
15044 ProcessStatement(stmt->__anon1.caseStmt.stmt);
15045 break;
15046 case 2:
15047 {
15048 if(stmt->__anon1.compound.context)
15049 {
15050 struct Declaration * decl;
15051 struct Statement * s;
15052 struct Statement * prevCompound = curCompound;
15053 struct Context * prevContext = curContext;
15054
15055 if(!stmt->__anon1.compound.isSwitch)
15056 curCompound = stmt;
15057 curContext = stmt->__anon1.compound.context;
15058 if(stmt->__anon1.compound.declarations)
15059 {
15060 for(decl = (*stmt->__anon1.compound.declarations).first; decl; decl = decl->next)
15061 ProcessDeclaration(decl, 1);
15062 }
15063 if(stmt->__anon1.compound.statements)
15064 {
15065 for(s = (*stmt->__anon1.compound.statements).first; s; s = s->next)
15066 ProcessStatement(s);
15067 }
15068 curContext = prevContext;
15069 curCompound = prevCompound;
15070 }
15071 break;
15072 }
15073 case 3:
15074 {
15075 struct Expression * exp;
15076
15077 if(stmt->__anon1.expressions)
15078 {
15079 for(exp = (*stmt->__anon1.expressions).first; exp; exp = exp->next)
15080 ProcessExpressionType(exp);
15081 }
15082 break;
15083 }
15084 case 4:
15085 {
15086 struct Expression * exp;
15087
15088 FreeType(((struct Expression *)(*stmt->__anon1.ifStmt.exp).last)->destType);
15089 ((struct Expression *)(*stmt->__anon1.ifStmt.exp).last)->destType = MkClassType("bool");
15090 ((struct Expression *)(*stmt->__anon1.ifStmt.exp).last)->destType->truth = 1;
15091 for(exp = (*stmt->__anon1.ifStmt.exp).first; exp; exp = exp->next)
15092 {
15093 ProcessExpressionType(exp);
15094 }
15095 if(stmt->__anon1.ifStmt.stmt)
15096 ProcessStatement(stmt->__anon1.ifStmt.stmt);
15097 if(stmt->__anon1.ifStmt.elseStmt)
15098 ProcessStatement(stmt->__anon1.ifStmt.elseStmt);
15099 break;
15100 }
15101 case 5:
15102 {
15103 struct Type * oldSwitchType = curSwitchType;
15104
15105 if(stmt->__anon1.switchStmt.exp)
15106 {
15107 struct Expression * exp;
15108
15109 for(exp = (*stmt->__anon1.switchStmt.exp).first; exp; exp = exp->next)
15110 {
15111 if(!exp->next)
15112 {
15113 ProcessExpressionType(exp);
15114 }
15115 if(!exp->next)
15116 curSwitchType = exp->expType;
15117 }
15118 }
15119 ProcessStatement(stmt->__anon1.switchStmt.stmt);
15120 curSwitchType = oldSwitchType;
15121 break;
15122 }
15123 case 6:
15124 {
15125 if(stmt->__anon1.whileStmt.exp)
15126 {
15127 struct Expression * exp;
15128
15129 FreeType(((struct Expression *)(*stmt->__anon1.whileStmt.exp).last)->destType);
15130 ((struct Expression *)(*stmt->__anon1.whileStmt.exp).last)->destType = MkClassType("bool");
15131 ((struct Expression *)(*stmt->__anon1.whileStmt.exp).last)->destType->truth = 1;
15132 for(exp = (*stmt->__anon1.whileStmt.exp).first; exp; exp = exp->next)
15133 {
15134 ProcessExpressionType(exp);
15135 }
15136 }
15137 if(stmt->__anon1.whileStmt.stmt)
15138 ProcessStatement(stmt->__anon1.whileStmt.stmt);
15139 break;
15140 }
15141 case 7:
15142 {
15143 if(stmt->__anon1.doWhile.exp)
15144 {
15145 struct Expression * exp;
15146
15147 if((*stmt->__anon1.doWhile.exp).last)
15148 {
15149 FreeType(((struct Expression *)(*stmt->__anon1.doWhile.exp).last)->destType);
15150 ((struct Expression *)(*stmt->__anon1.doWhile.exp).last)->destType = MkClassType("bool");
15151 ((struct Expression *)(*stmt->__anon1.doWhile.exp).last)->destType->truth = 1;
15152 }
15153 for(exp = (*stmt->__anon1.doWhile.exp).first; exp; exp = exp->next)
15154 {
15155 ProcessExpressionType(exp);
15156 }
15157 }
15158 if(stmt->__anon1.doWhile.stmt)
15159 ProcessStatement(stmt->__anon1.doWhile.stmt);
15160 break;
15161 }
15162 case 8:
15163 {
15164 struct Expression * exp;
15165
15166 if(stmt->__anon1.forStmt.init)
15167 ProcessStatement(stmt->__anon1.forStmt.init);
15168 if(stmt->__anon1.forStmt.check && stmt->__anon1.forStmt.check->__anon1.expressions)
15169 {
15170 FreeType(((struct Expression *)(*stmt->__anon1.forStmt.check->__anon1.expressions).last)->destType);
15171 ((struct Expression *)(*stmt->__anon1.forStmt.check->__anon1.expressions).last)->destType = MkClassType("bool");
15172 ((struct Expression *)(*stmt->__anon1.forStmt.check->__anon1.expressions).last)->destType->truth = 1;
15173 }
15174 if(stmt->__anon1.forStmt.check)
15175 ProcessStatement(stmt->__anon1.forStmt.check);
15176 if(stmt->__anon1.forStmt.increment)
15177 {
15178 for(exp = (*stmt->__anon1.forStmt.increment).first; exp; exp = exp->next)
15179 ProcessExpressionType(exp);
15180 }
15181 if(stmt->__anon1.forStmt.stmt)
15182 ProcessStatement(stmt->__anon1.forStmt.stmt);
15183 break;
15184 }
15185 case 18:
15186 {
15187 struct Identifier * id = stmt->__anon1.forEachStmt.id;
15188 struct __ecereNameSpace__ecere__sys__OldList * exp = stmt->__anon1.forEachStmt.exp;
15189 struct __ecereNameSpace__ecere__sys__OldList * filter = stmt->__anon1.forEachStmt.filter;
15190 struct Statement * block = stmt->__anon1.forEachStmt.stmt;
15191 char iteratorType[1024];
15192 struct Type * source;
15193 struct Expression * e;
15194 unsigned int isBuiltin = exp && (*exp).last && (((struct Expression *)(*exp).last)->type == 35 || (((struct Expression *)(*exp).last)->type == 11 && ((struct Expression *)(*exp).last)->__anon1.cast.exp->type == 35));
15195 struct Expression * arrayExp;
15196 const char * typeString = (((void *)0));
15197 int builtinCount = 0;
15198
15199 for(e = exp ? (*exp).first : (((void *)0)); e; e = e->next)
15200 {
15201 if(!e->next)
15202 {
15203 FreeType(e->destType);
15204 e->destType = ProcessTypeString("Container", 0);
15205 }
15206 if(!isBuiltin || e->next)
15207 ProcessExpressionType(e);
15208 }
15209 source = (exp && (*exp).last) ? ((struct Expression *)(*exp).last)->expType : (((void *)0));
15210 if(isBuiltin || (source && source->kind == 8 && source->__anon1._class && source->__anon1._class->__anon1.registered && source->__anon1._class->__anon1.registered != containerClass && __ecereNameSpace__ecere__com__eClass_IsDerived(source->__anon1._class->__anon1.registered, containerClass)))
15211 {
15212 struct __ecereNameSpace__ecere__com__Class * _class = source ? source->__anon1._class->__anon1.registered : (((void *)0));
15213 struct Symbol * symbol;
15214 struct Expression * expIt = (((void *)0));
15215 unsigned int isMap = 0, isArray = 0, isLinkList = 0, isList = 0, isCustomAVLTree = 0;
15216 struct __ecereNameSpace__ecere__com__Class * arrayClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "Array");
15217 struct __ecereNameSpace__ecere__com__Class * linkListClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "LinkList");
15218 struct __ecereNameSpace__ecere__com__Class * customAVLTreeClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "CustomAVLTree");
15219
15220 if(inCompiler)
15221 {
15222 stmt->type = 2;
15223 stmt->__anon1.compound.context = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Context);
15224 stmt->__anon1.compound.context->parent = curContext;
15225 curContext = stmt->__anon1.compound.context;
15226 }
15227 if(source && __ecereNameSpace__ecere__com__eClass_IsDerived(source->__anon1._class->__anon1.registered, customAVLTreeClass))
15228 {
15229 struct __ecereNameSpace__ecere__com__Class * mapClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "Map");
15230
15231 isCustomAVLTree = 1;
15232 if(__ecereNameSpace__ecere__com__eClass_IsDerived(source->__anon1._class->__anon1.registered, mapClass))
15233 isMap = 1;
15234 }
15235 else if(source && __ecereNameSpace__ecere__com__eClass_IsDerived(source->__anon1._class->__anon1.registered, arrayClass))
15236 isArray = 1;
15237 else if(source && __ecereNameSpace__ecere__com__eClass_IsDerived(source->__anon1._class->__anon1.registered, linkListClass))
15238 {
15239 struct __ecereNameSpace__ecere__com__Class * listClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "List");
15240
15241 isLinkList = 1;
15242 isList = __ecereNameSpace__ecere__com__eClass_IsDerived(source->__anon1._class->__anon1.registered, listClass);
15243 }
15244 if(inCompiler && isArray)
15245 {
15246 struct Declarator * decl;
15247 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
15248
15249 decl = SpecDeclFromString(_class->templateArgs[2].__anon1.__anon1.dataTypeString, specs, MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), MkDeclaratorIdentifier(id)));
15250 stmt->__anon1.compound.declarations = MkListOne(MkDeclaration(specs, MkListOne(MkInitDeclarator(decl, (((void *)0))))));
15251 ListAdd(stmt->__anon1.compound.declarations, MkDeclaration(MkListOne(MkSpecifierName(source->__anon1._class->__anon1.registered->fullName)), MkListOne(MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier("__internalArray")), MkInitializerAssignment(MkExpBrackets(exp))))));
15252 }
15253 else if(isBuiltin)
15254 {
15255 struct Type * type = (((void *)0));
15256 char typeStringBuf[1024];
15257
15258 arrayExp = (((struct Expression *)(*exp).last)->type == 35) ? (struct Expression *)(*exp).last : ((struct Expression *)(*exp).last)->__anon1.cast.exp;
15259 if(((struct Expression *)(*exp).last)->type == 11)
15260 {
15261 struct TypeName * typeName = ((struct Expression *)(*exp).last)->__anon1.cast.typeName;
15262
15263 if(typeName)
15264 arrayExp->destType = ProcessType(typeName->qualifiers, typeName->declarator);
15265 }
15266 if(arrayExp->destType && arrayExp->destType->kind == 8 && arrayExp->destType->__anon1._class && arrayExp->destType->__anon1._class->__anon1.registered && arrayExp->destType->__anon1._class->__anon1.registered != containerClass && __ecereNameSpace__ecere__com__eClass_IsDerived(arrayExp->destType->__anon1._class->__anon1.registered, containerClass) && arrayExp->destType->__anon1._class->__anon1.registered->templateArgs)
15267 {
15268 struct __ecereNameSpace__ecere__com__Class * templateClass = arrayExp->destType->__anon1._class->__anon1.registered;
15269
15270 typeString = templateClass->templateArgs[2].__anon1.__anon1.dataTypeString;
15271 }
15272 else if(arrayExp->__anon1.list)
15273 {
15274 struct Expression * e;
15275
15276 for(e = (*arrayExp->__anon1.list).first; e; e = e->next)
15277 {
15278 ProcessExpressionType(e);
15279 if(e->expType)
15280 {
15281 if(!type)
15282 {
15283 type = e->expType;
15284 type->refCount++;
15285 }
15286 else
15287 {
15288 if(!MatchTypeExpression(e, type, (((void *)0)), 0, 1))
15289 {
15290 FreeType(type);
15291 type = e->expType;
15292 e->expType = (((void *)0));
15293 e = (*arrayExp->__anon1.list).first;
15294 ProcessExpressionType(e);
15295 if(e->expType)
15296 {
15297 if(!MatchTypeExpression(e, type, (((void *)0)), 0, 1))
15298 {
15299 FreeType(e->expType);
15300 e->expType = (((void *)0));
15301 FreeType(type);
15302 type = (((void *)0));
15303 break;
15304 }
15305 }
15306 }
15307 }
15308 if(e->expType)
15309 {
15310 FreeType(e->expType);
15311 e->expType = (((void *)0));
15312 }
15313 }
15314 }
15315 if(type)
15316 {
15317 typeStringBuf[0] = '\0';
15318 PrintType(type, typeStringBuf, 0, 1);
15319 typeString = typeStringBuf;
15320 FreeType(type);
15321 }
15322 }
15323 if(typeString)
15324 {
15325 if(inCompiler)
15326 {
15327 struct __ecereNameSpace__ecere__sys__OldList * initializers = MkList();
15328 struct Declarator * decl;
15329 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
15330
15331 if(arrayExp->__anon1.list)
15332 {
15333 struct Expression * e;
15334
15335 builtinCount = (*arrayExp->__anon1.list).count;
15336 type = ProcessTypeString(typeString, 0);
15337 while((e = (*arrayExp->__anon1.list).first))
15338 {
15339 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove((&*arrayExp->__anon1.list), e);
15340 e->destType = type;
15341 type->refCount++;
15342 ProcessExpressionType(e);
15343 if(inCompiler)
15344 ListAdd(initializers, MkInitializerAssignment(e));
15345 }
15346 FreeType(type);
15347 (__ecereNameSpace__ecere__com__eSystem_Delete(arrayExp->__anon1.list), arrayExp->__anon1.list = 0);
15348 }
15349 decl = SpecDeclFromString(typeString, specs, MkDeclaratorIdentifier(id));
15350 stmt->__anon1.compound.declarations = MkListOne(MkDeclaration(CopyList(specs, (void *)(CopySpecifier)), MkListOne(MkInitDeclarator(MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), decl), (((void *)0))))));
15351 ListAdd(stmt->__anon1.compound.declarations, MkDeclaration(specs, MkListOne(MkInitDeclarator(PlugDeclarator(decl, MkDeclaratorArray(MkDeclaratorIdentifier(MkIdentifier("__internalArray")), (((void *)0)))), MkInitializerList(initializers)))));
15352 FreeList(exp, (void *)(FreeExpression));
15353 }
15354 else if(arrayExp->__anon1.list)
15355 {
15356 struct Expression * e;
15357
15358 type = ProcessTypeString(typeString, 0);
15359 for(e = (*arrayExp->__anon1.list).first; e; e = e->next)
15360 {
15361 e->destType = type;
15362 type->refCount++;
15363 ProcessExpressionType(e);
15364 }
15365 FreeType(type);
15366 }
15367 }
15368 else
15369 {
15370 arrayExp->expType = ProcessTypeString("Container", 0);
15371 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Couldn't determine type of array elements\n", (((void *)0))));
15372 }
15373 }
15374 else if(inCompiler && isLinkList && !isList)
15375 {
15376 struct Declarator * decl;
15377 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
15378
15379 decl = SpecDeclFromString(_class->templateArgs[3].__anon1.__anon1.dataTypeString, specs, MkDeclaratorIdentifier(id));
15380 stmt->__anon1.compound.declarations = MkListOne(MkDeclaration(specs, MkListOne(MkInitDeclarator(decl, (((void *)0))))));
15381 ListAdd(stmt->__anon1.compound.declarations, MkDeclaration(MkListOne(MkSpecifierName(source->__anon1._class->__anon1.registered->fullName)), MkListOne(MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier("__internalLinkList")), MkInitializerAssignment(MkExpBrackets(exp))))));
15382 }
15383 else if(inCompiler && _class->templateArgs)
15384 {
15385 if(isMap)
15386 sprintf(iteratorType, "MapIterator<%s, %s >", _class->templateArgs[5].__anon1.__anon1.dataTypeString, _class->templateArgs[6].__anon1.__anon1.dataTypeString);
15387 else
15388 sprintf(iteratorType, "Iterator<%s, %s >", _class->templateArgs[2].__anon1.__anon1.dataTypeString, _class->templateArgs[1].__anon1.__anon1.dataTypeString);
15389 stmt->__anon1.compound.declarations = MkListOne(MkDeclarationInst(MkInstantiationNamed(MkListOne(MkSpecifierName(iteratorType)), MkExpIdentifier(id), MkListOne(MkMembersInitList(MkListOne(MkMemberInit(isMap ? MkListOne(MkIdentifier("map")) : (((void *)0)), MkInitializerAssignment(MkExpBrackets(exp)))))))));
15390 }
15391 if(inCompiler)
15392 {
15393 symbol = FindSymbol(id->string, curContext, curContext, 0, 0);
15394 if(block)
15395 {
15396 switch(block->type)
15397 {
15398 case 2:
15399 if(block->__anon1.compound.context)
15400 block->__anon1.compound.context->parent = stmt->__anon1.compound.context;
15401 break;
15402 case 4:
15403 if(block->__anon1.ifStmt.stmt && block->__anon1.ifStmt.stmt->type == 2 && block->__anon1.ifStmt.stmt->__anon1.compound.context)
15404 block->__anon1.ifStmt.stmt->__anon1.compound.context->parent = stmt->__anon1.compound.context;
15405 if(block->__anon1.ifStmt.elseStmt && block->__anon1.ifStmt.elseStmt->type == 2 && block->__anon1.ifStmt.elseStmt->__anon1.compound.context)
15406 block->__anon1.ifStmt.elseStmt->__anon1.compound.context->parent = stmt->__anon1.compound.context;
15407 break;
15408 case 5:
15409 if(block->__anon1.switchStmt.stmt && block->__anon1.switchStmt.stmt->type == 2 && block->__anon1.switchStmt.stmt->__anon1.compound.context)
15410 block->__anon1.switchStmt.stmt->__anon1.compound.context->parent = stmt->__anon1.compound.context;
15411 break;
15412 case 6:
15413 if(block->__anon1.whileStmt.stmt && block->__anon1.whileStmt.stmt->type == 2 && block->__anon1.whileStmt.stmt->__anon1.compound.context)
15414 block->__anon1.whileStmt.stmt->__anon1.compound.context->parent = stmt->__anon1.compound.context;
15415 break;
15416 case 7:
15417 if(block->__anon1.doWhile.stmt && block->__anon1.doWhile.stmt->type == 2 && block->__anon1.doWhile.stmt->__anon1.compound.context)
15418 block->__anon1.doWhile.stmt->__anon1.compound.context->parent = stmt->__anon1.compound.context;
15419 break;
15420 case 8:
15421 if(block->__anon1.forStmt.stmt && block->__anon1.forStmt.stmt->type == 2 && block->__anon1.forStmt.stmt->__anon1.compound.context)
15422 block->__anon1.forStmt.stmt->__anon1.compound.context->parent = stmt->__anon1.compound.context;
15423 break;
15424 case 18:
15425 if(block->__anon1.forEachStmt.stmt && block->__anon1.forEachStmt.stmt->type == 2 && block->__anon1.forEachStmt.stmt->__anon1.compound.context)
15426 block->__anon1.forEachStmt.stmt->__anon1.compound.context->parent = stmt->__anon1.compound.context;
15427 break;
15428 }
15429 }
15430 if(filter)
15431 {
15432 block = MkIfStmt(filter, block, (((void *)0)));
15433 }
15434 if(isArray)
15435 {
15436 stmt->__anon1.compound.statements = MkListOne(MkForStmt(MkExpressionStmt(MkListOne(MkExpOp(MkExpIdentifier(CopyIdentifier(id)), '=', MkExpMember(MkExpIdentifier(MkIdentifier("__internalArray")), MkIdentifier("array"))))), MkExpressionStmt(MkListOne(MkExpOp(MkExpIdentifier(CopyIdentifier(id)), '<', MkExpOp(MkExpMember(MkExpIdentifier(MkIdentifier("__internalArray")), MkIdentifier("array")), '+', MkExpMember(MkExpIdentifier(MkIdentifier("__internalArray")), MkIdentifier("count")))))), MkListOne(MkExpOp(MkExpIdentifier(CopyIdentifier(id)), INC_OP, (((void *)0)))), block));
15437 ProcessStatement(((struct Statement *)(*stmt->__anon1.compound.statements).first)->__anon1.forStmt.init);
15438 ProcessStatement(((struct Statement *)(*stmt->__anon1.compound.statements).first)->__anon1.forStmt.check);
15439 ProcessExpressionType((*((struct Statement *)(*stmt->__anon1.compound.statements).first)->__anon1.forStmt.increment).first);
15440 }
15441 else if(isBuiltin)
15442 {
15443 char count[128];
15444
15445 sprintf(count, "%d", builtinCount);
15446 stmt->__anon1.compound.statements = MkListOne(MkForStmt(MkExpressionStmt(MkListOne(MkExpOp(MkExpIdentifier(CopyIdentifier(id)), '=', MkExpIdentifier(MkIdentifier("__internalArray"))))), MkExpressionStmt(MkListOne(MkExpOp(MkExpIdentifier(CopyIdentifier(id)), '<', MkExpOp(MkExpIdentifier(MkIdentifier("__internalArray")), '+', MkExpConstant(count))))), MkListOne(MkExpOp(MkExpIdentifier(CopyIdentifier(id)), INC_OP, (((void *)0)))), block));
15447 ProcessStatement(((struct Statement *)(*stmt->__anon1.compound.statements).first)->__anon1.forStmt.init);
15448 ProcessStatement(((struct Statement *)(*stmt->__anon1.compound.statements).first)->__anon1.forStmt.check);
15449 ProcessExpressionType((*((struct Statement *)(*stmt->__anon1.compound.statements).first)->__anon1.forStmt.increment).first);
15450 }
15451 else if(isLinkList && !isList)
15452 {
15453 struct __ecereNameSpace__ecere__com__Class * typeClass = __ecereNameSpace__ecere__com__eSystem_FindClass(_class->module, _class->templateArgs[3].__anon1.__anon1.dataTypeString);
15454 struct __ecereNameSpace__ecere__com__Class * listItemClass = __ecereNameSpace__ecere__com__eSystem_FindClass(_class->module, "ListItem");
15455
15456 if(typeClass && __ecereNameSpace__ecere__com__eClass_IsDerived(typeClass, listItemClass) && _class->templateArgs[5].__anon1.__anon1.dataTypeString && !strcmp(_class->templateArgs[5].__anon1.__anon1.dataTypeString, "LT::link"))
15457 {
15458 stmt->__anon1.compound.statements = MkListOne(MkForStmt(MkExpressionStmt(MkListOne(MkExpOp(MkExpIdentifier(CopyIdentifier(id)), '=', MkExpMember(MkExpIdentifier(MkIdentifier("__internalLinkList")), MkIdentifier("first"))))), MkExpressionStmt(MkListOne(MkExpIdentifier(CopyIdentifier(id)))), MkListOne(MkExpOp(MkExpIdentifier(CopyIdentifier(id)), '=', MkExpMember(MkExpIdentifier(CopyIdentifier(id)), MkIdentifier("next")))), block));
15459 }
15460 else
15461 {
15462 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
15463 struct Declarator * decl = SpecDeclFromString(_class->templateArgs[3].__anon1.__anon1.dataTypeString, specs, (((void *)0)));
15464
15465 stmt->__anon1.compound.statements = MkListOne(MkForStmt(MkExpressionStmt(MkListOne(MkExpOp(MkExpIdentifier(CopyIdentifier(id)), '=', MkExpMember(MkExpIdentifier(MkIdentifier("__internalLinkList")), MkIdentifier("first"))))), MkExpressionStmt(MkListOne(MkExpIdentifier(CopyIdentifier(id)))), MkListOne(MkExpOp(MkExpIdentifier(CopyIdentifier(id)), '=', MkExpCast(MkTypeName(specs, decl), MkExpCall(MkExpMember(MkExpIdentifier(MkIdentifier("__internalLinkList")), MkIdentifier("GetNext")), MkListOne(MkExpCast(MkTypeName(MkListOne(MkSpecifierName("IteratorPointer")), (((void *)0))), MkExpIdentifier(CopyIdentifier(id)))))))), block));
15466 }
15467 ProcessStatement(((struct Statement *)(*stmt->__anon1.compound.statements).first)->__anon1.forStmt.init);
15468 ProcessStatement(((struct Statement *)(*stmt->__anon1.compound.statements).first)->__anon1.forStmt.check);
15469 ProcessExpressionType((*((struct Statement *)(*stmt->__anon1.compound.statements).first)->__anon1.forStmt.increment).first);
15470 }
15471 else
15472 {
15473 stmt->__anon1.compound.statements = MkListOne(MkWhileStmt(MkListOne(MkExpCall(MkExpMember(expIt = MkExpIdentifier(CopyIdentifier(id)), MkIdentifier("Next")), (((void *)0)))), block));
15474 }
15475 ProcessExpressionType(expIt);
15476 if((*stmt->__anon1.compound.declarations).first)
15477 ProcessDeclaration((*stmt->__anon1.compound.declarations).first, 1);
15478 if(symbol)
15479 symbol->isIterator = isMap ? 2 : ((isArray || isBuiltin) ? 3 : (isLinkList ? (isList ? 5 : 4) : (isCustomAVLTree ? 6 : 1)));
15480 ProcessStatement(stmt);
15481 }
15482 else
15483 ProcessStatement(stmt->__anon1.forEachStmt.stmt);
15484 if(inCompiler)
15485 curContext = stmt->__anon1.compound.context->parent;
15486 break;
15487 }
15488 else
15489 {
15490 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Expression is not a container\n", (((void *)0))));
15491 }
15492 break;
15493 }
15494 case 9:
15495 break;
15496 case 10:
15497 break;
15498 case 11:
15499 break;
15500 case 12:
15501 {
15502 struct Expression * exp;
15503
15504 if(stmt->__anon1.expressions)
15505 {
15506 for(exp = (*stmt->__anon1.expressions).first; exp; exp = exp->next)
15507 {
15508 if(!exp->next)
15509 {
15510 if(curFunction && !curFunction->type)
15511 curFunction->type = ProcessType(curFunction->specifiers, curFunction->declarator);
15512 FreeType(exp->destType);
15513 exp->destType = (curFunction && curFunction->type && curFunction->type->kind == 11) ? curFunction->type->__anon1.__anon2.returnType : (((void *)0));
15514 if(exp->destType)
15515 exp->destType->refCount++;
15516 }
15517 ProcessExpressionType(exp);
15518 }
15519 }
15520 break;
15521 }
15522 case 14:
15523 {
15524 ProcessDeclaration(stmt->__anon1.decl, 1);
15525 break;
15526 }
15527 case 13:
15528 {
15529 struct AsmField * field;
15530
15531 if(stmt->__anon1.asmStmt.inputFields)
15532 {
15533 for(field = (*stmt->__anon1.asmStmt.inputFields).first; field; field = field->next)
15534 if(field->expression)
15535 ProcessExpressionType(field->expression);
15536 }
15537 if(stmt->__anon1.asmStmt.outputFields)
15538 {
15539 for(field = (*stmt->__anon1.asmStmt.outputFields).first; field; field = field->next)
15540 if(field->expression)
15541 ProcessExpressionType(field->expression);
15542 }
15543 if(stmt->__anon1.asmStmt.clobberedFields)
15544 {
15545 for(field = (*stmt->__anon1.asmStmt.clobberedFields).first; field; field = field->next)
15546 {
15547 if(field->expression)
15548 ProcessExpressionType(field->expression);
15549 }
15550 }
15551 break;
15552 }
15553 case 17:
15554 {
15555 struct PropertyWatch * propWatch;
15556 struct __ecereNameSpace__ecere__sys__OldList * watches = stmt->__anon1._watch.watches;
15557 struct Expression * object = stmt->__anon1._watch.object;
15558 struct Expression * watcher = stmt->__anon1._watch.watcher;
15559
15560 if(watcher)
15561 ProcessExpressionType(watcher);
15562 if(object)
15563 ProcessExpressionType(object);
15564 if(inCompiler)
15565 {
15566 if(watcher || thisClass)
15567 {
15568 struct External * external = curExternal;
15569 struct Context * context = curContext;
15570
15571 stmt->type = 3;
15572 stmt->__anon1.expressions = MkList();
15573 for(propWatch = (*watches).first; propWatch; propWatch = propWatch->next)
15574 {
15575 struct ClassFunction * func;
15576 char watcherName[1024];
15577 struct __ecereNameSpace__ecere__com__Class * watcherClass = watcher ? ((watcher->expType && watcher->expType->kind == 8 && watcher->expType->__anon1._class) ? watcher->expType->__anon1._class->__anon1.registered : (((void *)0))) : thisClass;
15578 struct External * createdExternal;
15579
15580 sprintf(watcherName, "__ecerePropertyWatcher_%d", propWatcherID++);
15581 if(propWatch->deleteWatch)
15582 strcat(watcherName, "_delete");
15583 else
15584 {
15585 struct Identifier * propID;
15586
15587 for(propID = (*propWatch->properties).first; propID; propID = propID->next)
15588 {
15589 strcat(watcherName, "_");
15590 strcat(watcherName, propID->string);
15591 }
15592 }
15593 if(object && object->expType && object->expType->kind == 8 && object->expType->__anon1._class && object->expType->__anon1._class->__anon1.registered)
15594 {
15595 func = MkClassFunction(MkListOne(MkSpecifier(VOID)), (((void *)0)), MkDeclaratorFunction(MkDeclaratorIdentifier(MkIdentifier(watcherName)), MkListOne(MkTypeName(MkListOne(MkSpecifierName(object->expType->__anon1._class->string)), MkDeclaratorIdentifier(MkIdentifier("value"))))), (((void *)0)));
15596 ProcessClassFunctionBody(func, propWatch->compound);
15597 propWatch->compound = (((void *)0));
15598 createdExternal = ProcessClassFunction(watcherClass, func, ast, curExternal, 1);
15599 FreeClassFunction(func);
15600 curExternal = createdExternal;
15601 ProcessFunction(createdExternal->__anon1.function);
15602 if(propWatch->deleteWatch)
15603 {
15604 struct __ecereNameSpace__ecere__sys__OldList * args = MkList();
15605
15606 ListAdd(args, CopyExpression(object));
15607 ListAdd(args, watcher ? CopyExpression(watcher) : MkExpIdentifier(MkIdentifier("this")));
15608 ListAdd(args, MkExpIdentifier(MkIdentifier(watcherName)));
15609 ListAdd(stmt->__anon1.expressions, MkExpCall(MkExpIdentifier(MkIdentifier("ecere::com::eInstance_WatchDestruction")), args));
15610 }
15611 else
15612 {
15613 struct __ecereNameSpace__ecere__com__Class * _class = object->expType->__anon1._class->__anon1.registered;
15614 struct Identifier * propID;
15615
15616 for(propID = (*propWatch->properties).first; propID; propID = propID->next)
15617 {
15618 char propName[1024];
15619 struct __ecereNameSpace__ecere__com__Property * prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, propID->string, privateModule);
15620
15621 if(prop)
15622 {
15623 char getName[1024], setName[1024];
15624 struct __ecereNameSpace__ecere__sys__OldList * args = MkList();
15625
15626 DeclareProperty(createdExternal, prop, setName, getName);
15627 strcpy(propName, "__ecereProp_");
15628 FullClassNameCat(propName, prop->_class->fullName, 0);
15629 strcat(propName, "_");
15630 FullClassNameCat(propName, prop->name, 1);
15631 ListAdd(args, CopyExpression(object));
15632 ListAdd(args, MkExpIdentifier(MkIdentifier(propName)));
15633 ListAdd(args, watcher ? CopyExpression(watcher) : MkExpIdentifier(MkIdentifier("this")));
15634 ListAdd(args, MkExpCast(MkTypeName(MkListOne(MkSpecifier(VOID)), MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), (((void *)0)))), MkExpIdentifier(MkIdentifier(watcherName))));
15635 ListAdd(stmt->__anon1.expressions, MkExpCall(MkExpIdentifier(MkIdentifier("ecere::com::eInstance_Watch")), args));
15636 __ecereMethod_External_CreateUniqueEdge(external, createdExternal, 1);
15637 }
15638 else
15639 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Property %s not found in class %s\n", (((void *)0))), propID->string, _class->fullName);
15640 }
15641 }
15642 }
15643 else
15644 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Invalid watched object\n", (((void *)0))));
15645 }
15646 curExternal = external;
15647 curContext = context;
15648 if(watcher)
15649 FreeExpression(watcher);
15650 if(object)
15651 FreeExpression(object);
15652 FreeList(watches, (void *)(FreePropertyWatch));
15653 }
15654 else
15655 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "No observer specified and not inside a class\n", (((void *)0))));
15656 }
15657 else
15658 {
15659 for(propWatch = (*watches).first; propWatch; propWatch = propWatch->next)
15660 {
15661 ProcessStatement(propWatch->compound);
15662 }
15663 }
15664 break;
15665 }
15666 case 15:
15667 {
15668 struct __ecereNameSpace__ecere__sys__OldList * watches = stmt->__anon1._watch.watches;
15669 struct Expression * object = stmt->__anon1._watch.object;
15670 struct __ecereNameSpace__ecere__com__Class * _class;
15671
15672 if(object)
15673 ProcessExpressionType(object);
15674 if(inCompiler)
15675 {
15676 _class = object ? ((object->expType && object->expType->kind == 8 && object->expType->__anon1._class) ? object->expType->__anon1._class->__anon1.registered : (((void *)0))) : thisClass;
15677 if(_class)
15678 {
15679 struct Identifier * propID;
15680
15681 stmt->type = 3;
15682 stmt->__anon1.expressions = MkList();
15683 if(!watches && curFunction->propSet && (!object || (object->type == 0 && !strcmp(object->__anon1.__anon1.identifier->string, "this"))))
15684 {
15685 watches = MkListOne(MkIdentifier(curFunction->propSet->string));
15686 }
15687 else if(!watches)
15688 {
15689 }
15690 if(watches)
15691 {
15692 for(propID = (*watches).first; propID; propID = propID->next)
15693 {
15694 struct __ecereNameSpace__ecere__com__Property * prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, propID->string, privateModule);
15695
15696 if(prop)
15697 {
15698 CreateFireWatcher(prop, object, stmt);
15699 }
15700 else
15701 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Property %s not found in class %s\n", (((void *)0))), propID->string, _class->fullName);
15702 }
15703 }
15704 else
15705 {
15706 struct __ecereNameSpace__ecere__com__Property * prop;
15707 struct __ecereNameSpace__ecere__com__Class * base;
15708
15709 for(base = _class; base; base = base->base)
15710 {
15711 for(prop = base->membersAndProperties.first; prop; prop = prop->next)
15712 {
15713 if(prop->isProperty && prop->isWatchable)
15714 {
15715 CreateFireWatcher(prop, object, stmt);
15716 }
15717 }
15718 }
15719 }
15720 if(object)
15721 FreeExpression(object);
15722 FreeList(watches, (void *)(FreeIdentifier));
15723 }
15724 else
15725 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Invalid object specified and not inside a class\n", (((void *)0))));
15726 }
15727 break;
15728 }
15729 case 16:
15730 {
15731 struct __ecereNameSpace__ecere__sys__OldList * watches = stmt->__anon1._watch.watches;
15732 struct Expression * object = stmt->__anon1._watch.object;
15733 struct Expression * watcher = stmt->__anon1._watch.watcher;
15734 struct __ecereNameSpace__ecere__com__Class * _class;
15735
15736 if(object)
15737 ProcessExpressionType(object);
15738 if(watcher)
15739 ProcessExpressionType(watcher);
15740 if(inCompiler)
15741 {
15742 _class = (object && object->expType && object->expType->kind == 8 && object->expType->__anon1._class) ? object->expType->__anon1._class->__anon1.registered : (((void *)0));
15743 if(watcher || thisClass)
15744 {
15745 if(_class)
15746 {
15747 struct Identifier * propID;
15748
15749 stmt->type = 3;
15750 stmt->__anon1.expressions = MkList();
15751 if(!watches)
15752 {
15753 struct __ecereNameSpace__ecere__sys__OldList * args;
15754
15755 args = MkList();
15756 ListAdd(args, CopyExpression(object));
15757 ListAdd(args, MkExpConstant("0"));
15758 ListAdd(args, watcher ? CopyExpression(watcher) : MkExpIdentifier(MkIdentifier("this")));
15759 ListAdd(stmt->__anon1.expressions, MkExpCall(MkExpIdentifier(MkIdentifier("ecere::com::eInstance_StopWatching")), args));
15760 }
15761 else
15762 {
15763 for(propID = (*watches).first; propID; propID = propID->next)
15764 {
15765 char propName[1024];
15766 struct __ecereNameSpace__ecere__com__Property * prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, propID->string, privateModule);
15767
15768 if(prop)
15769 {
15770 char getName[1024], setName[1024];
15771 struct __ecereNameSpace__ecere__sys__OldList * args = MkList();
15772
15773 DeclareProperty(curExternal, prop, setName, getName);
15774 strcpy(propName, "__ecereProp_");
15775 FullClassNameCat(propName, prop->_class->fullName, 0);
15776 strcat(propName, "_");
15777 FullClassNameCat(propName, prop->name, 1);
15778 ListAdd(args, CopyExpression(object));
15779 ListAdd(args, MkExpIdentifier(MkIdentifier(propName)));
15780 ListAdd(args, watcher ? CopyExpression(watcher) : MkExpIdentifier(MkIdentifier("this")));
15781 ListAdd(stmt->__anon1.expressions, MkExpCall(MkExpIdentifier(MkIdentifier("ecere::com::eInstance_StopWatching")), args));
15782 }
15783 else
15784 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Property %s not found in class %s\n", (((void *)0))), propID->string, _class->fullName);
15785 }
15786 }
15787 if(object)
15788 FreeExpression(object);
15789 if(watcher)
15790 FreeExpression(watcher);
15791 FreeList(watches, (void *)(FreeIdentifier));
15792 }
15793 else
15794 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Invalid object specified and not inside a class\n", (((void *)0))));
15795 }
15796 else
15797 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "No observer specified and not inside a class\n", (((void *)0))));
15798 }
15799 break;
15800 }
15801 }
15802 }
15803
15804 void ComputeDataTypes()
15805 {
15806 struct External * external;
15807
15808 currentClass = (((void *)0));
15809 containerClass = __ecereNameSpace__ecere__com__eSystem_FindClass(GetPrivateModule(), "Container");
15810 DeclareStruct((((void *)0)), "ecere::com::Class", 0, 1);
15811 DeclareStruct((((void *)0)), "ecere::com::Instance", 0, 1);
15812 DeclareStruct((((void *)0)), "ecere::com::Property", 0, 1);
15813 DeclareStruct((((void *)0)), "ecere::com::DataMember", 0, 1);
15814 DeclareStruct((((void *)0)), "ecere::com::Method", 0, 1);
15815 DeclareStruct((((void *)0)), "ecere::com::SerialBuffer", 0, 1);
15816 DeclareStruct((((void *)0)), "ecere::com::ClassTemplateArgument", 0, 1);
15817 DeclareFunctionUtil((((void *)0)), "eSystem_New");
15818 DeclareFunctionUtil((((void *)0)), "eSystem_New0");
15819 DeclareFunctionUtil((((void *)0)), "eSystem_Renew");
15820 DeclareFunctionUtil((((void *)0)), "eSystem_Renew0");
15821 DeclareFunctionUtil((((void *)0)), "eSystem_Delete");
15822 DeclareFunctionUtil((((void *)0)), "eClass_GetProperty");
15823 DeclareFunctionUtil((((void *)0)), "eClass_SetProperty");
15824 DeclareFunctionUtil((((void *)0)), "eInstance_FireSelfWatchers");
15825 DeclareFunctionUtil((((void *)0)), "eInstance_SetMethod");
15826 DeclareFunctionUtil((((void *)0)), "eInstance_IncRef");
15827 DeclareFunctionUtil((((void *)0)), "eInstance_StopWatching");
15828 DeclareFunctionUtil((((void *)0)), "eInstance_Watch");
15829 DeclareFunctionUtil((((void *)0)), "eInstance_FireWatchers");
15830 reachedPass15 = 1;
15831 for(external = (*ast).first; external; external = external->next)
15832 {
15833 afterExternal = curExternal = external;
15834 if(external->type == 0)
15835 {
15836 if(memoryGuard)
15837 {
15838 DeclareFunctionUtil(external, "MemoryGuard_PushLoc");
15839 DeclareFunctionUtil(external, "MemoryGuard_PopLoc");
15840 }
15841 currentClass = external->__anon1.function->_class;
15842 ProcessFunction(external->__anon1.function);
15843 }
15844 else if(external->type == 1)
15845 {
15846 if(memoryGuard && external->__anon1.declaration && external->__anon1.declaration->type == 2)
15847 {
15848 DeclareFunctionUtil(external, "MemoryGuard_PushLoc");
15849 DeclareFunctionUtil(external, "MemoryGuard_PopLoc");
15850 }
15851 currentClass = (((void *)0));
15852 if(external->__anon1.declaration)
15853 ProcessDeclaration(external->__anon1.declaration, 1);
15854 }
15855 else if(external->type == 2)
15856 {
15857 struct ClassDefinition * _class = external->__anon1._class;
15858
15859 currentClass = external->symbol->__anon1.registered;
15860 if(memoryGuard)
15861 {
15862 DeclareFunctionUtil(external, "MemoryGuard_PushLoc");
15863 DeclareFunctionUtil(external, "MemoryGuard_PopLoc");
15864 }
15865 if(_class->definitions)
15866 {
15867 ProcessClass(_class->definitions, _class->symbol);
15868 }
15869 if(inCompiler)
15870 {
15871 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove((&*ast), external);
15872 ((external ? __extension__ ({
15873 void * __ecerePtrToDelete = (external);
15874
15875 __ecereClass_External->Destructor ? __ecereClass_External->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete);
15876 }) : 0), external = 0);
15877 }
15878 }
15879 else if(external->type == 4)
15880 {
15881 thisNameSpace = external->__anon1.id->string;
15882 }
15883 }
15884 currentClass = (((void *)0));
15885 thisNameSpace = (((void *)0));
15886 curExternal = (((void *)0));
15887 }
15888
15889 void ProcessExpressionType(struct Expression * exp)
15890 {
15891 unsigned int unresolved = 0;
15892 struct Location oldyylloc = yylloc;
15893 unsigned int notByReference = 0;
15894
15895 if(!exp || exp->expType)
15896 return ;
15897 yylloc = exp->loc;
15898 switch(exp->type)
15899 {
15900 case 0:
15901 {
15902 struct Identifier * id = exp->__anon1.__anon1.identifier;
15903
15904 if(!id || !topContext)
15905 return ;
15906 if(id->_class && id->_class->__anon1.__anon1.name)
15907 {
15908 id->classSym = id->_class->__anon1.__anon1.symbol;
15909 }
15910 if(!strcmp(id->string, "__runtimePlatform"))
15911 {
15912 exp->expType = ProcessTypeString("ecere::com::Platform", 1);
15913 break;
15914 }
15915 else if(strstr(id->string, "__ecereClass") == id->string)
15916 {
15917 exp->expType = ProcessTypeString("ecere::com::Class", 1);
15918 break;
15919 }
15920 else if(id->_class && (id->classSym || (id->_class->__anon1.__anon1.name && !strcmp(id->_class->__anon1.__anon1.name, "property"))))
15921 {
15922 ReplaceClassMembers(exp, thisClass);
15923 if(exp->type != 0)
15924 {
15925 ProcessExpressionType(exp);
15926 break;
15927 }
15928 if(id->classSym && ResolveIdWithClass(exp, id->classSym->__anon1.registered, 0))
15929 break;
15930 }
15931 else
15932 {
15933 struct Symbol * symbol = (((void *)0));
15934 unsigned int findInGlobal = 0;
15935
15936 if(!topContext->parent && exp->destType && exp->destType->kind == 8 && exp->destType->__anon1._class && exp->destType->__anon1._class->__anon1.registered && exp->destType->__anon1._class->__anon1.registered->type == 4)
15937 findInGlobal = 1;
15938 else
15939 symbol = FindSymbol(id->string, curContext, topContext, 0, id->_class && id->_class->__anon1.__anon1.name == (((void *)0)));
15940 if(!symbol)
15941 {
15942 if(exp->destType && CheckExpressionType(exp, exp->destType, 0, 0))
15943 break;
15944 else
15945 {
15946 if(thisClass)
15947 {
15948 ReplaceClassMembers(exp, thisClass ? thisClass : currentClass);
15949 if(exp->type != 0)
15950 {
15951 ProcessExpressionType(exp);
15952 break;
15953 }
15954 }
15955 else if(currentClass && !id->_class)
15956 {
15957 if(ResolveIdWithClass(exp, currentClass, 1))
15958 break;
15959 }
15960 symbol = FindSymbol(id->string, topContext->parent, globalContext, 0, id->_class && id->_class->__anon1.__anon1.name == (((void *)0)));
15961 }
15962 }
15963 if(findInGlobal)
15964 symbol = FindSymbol(id->string, curContext, topContext, 0, id->_class && id->_class->__anon1.__anon1.name == (((void *)0)));
15965 if(symbol)
15966 {
15967 struct Type * type = symbol->type;
15968 struct __ecereNameSpace__ecere__com__Class * _class = (type && type->kind == 8 && type->__anon1._class) ? type->__anon1._class->__anon1.registered : (((void *)0));
15969
15970 if(_class && !strcmp(id->string, "this") && !type->classObjectType)
15971 {
15972 struct Context * context = SetupTemplatesContext(_class);
15973
15974 type = ReplaceThisClassType(_class);
15975 FinishTemplatesContext(context);
15976 if(type)
15977 type->refCount = 0;
15978 }
15979 FreeSpecifier(id->_class);
15980 id->_class = (((void *)0));
15981 (__ecereNameSpace__ecere__com__eSystem_Delete(id->string), id->string = 0);
15982 id->string = __ecereNameSpace__ecere__sys__CopyString(symbol->string);
15983 id->classSym = (((void *)0));
15984 exp->expType = type;
15985 if(type)
15986 type->refCount++;
15987 if(type && (type->kind == 15))
15988 exp->isConstant = 1;
15989 if(symbol->isParam || !strcmp(id->string, "this"))
15990 {
15991 if(_class && _class->type == 1 && !type->declaredWithStruct)
15992 exp->byReference = 1;
15993 }
15994 if(symbol->isIterator)
15995 {
15996 if(symbol->isIterator == 3)
15997 {
15998 exp->type = 5;
15999 exp->__anon1.list = MkListOne(MkExpOp((((void *)0)), '*', MkExpIdentifier(exp->__anon1.__anon1.identifier)));
16000 ((struct Expression *)(*exp->__anon1.list).first)->__anon1.op.exp2->expType = exp->expType;
16001 exp->expType = (((void *)0));
16002 ProcessExpressionType(exp);
16003 }
16004 else if(symbol->isIterator != 4)
16005 {
16006 exp->type = 8;
16007 exp->__anon1.member.exp = MkExpIdentifier(exp->__anon1.__anon1.identifier);
16008 exp->__anon1.member.exp->expType = exp->expType;
16009 exp->__anon1.member.member = MkIdentifier("data");
16010 exp->expType = (((void *)0));
16011 ProcessExpressionType(exp);
16012 }
16013 }
16014 break;
16015 }
16016 else
16017 {
16018 struct __ecereNameSpace__ecere__com__DefinedExpression * definedExp = (((void *)0));
16019
16020 if(thisNameSpace && !(id->_class && !id->_class->__anon1.__anon1.name))
16021 {
16022 char name[1024];
16023
16024 strcpy(name, thisNameSpace);
16025 strcat(name, "::");
16026 strcat(name, id->string);
16027 definedExp = __ecereNameSpace__ecere__com__eSystem_FindDefine(privateModule, name);
16028 }
16029 if(!definedExp)
16030 definedExp = __ecereNameSpace__ecere__com__eSystem_FindDefine(privateModule, id->string);
16031 if(definedExp)
16032 {
16033 int c;
16034
16035 for(c = 0; c < definedExpStackPos; c++)
16036 if(definedExpStack[c] == definedExp)
16037 break;
16038 if(c == definedExpStackPos && c < sizeof (definedExpStack) / sizeof(void *))
16039 {
16040 struct Location backupYylloc = yylloc;
16041 struct __ecereNameSpace__ecere__com__Instance * backInput = fileInput;
16042
16043 definedExpStack[definedExpStackPos++] = definedExp;
16044 fileInput = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass___ecereNameSpace__ecere__sys__TempFile);
16045 ((int (*)(struct __ecereNameSpace__ecere__com__Instance *, const void *  buffer, unsigned int size, unsigned int count))__extension__ ({
16046 struct __ecereNameSpace__ecere__com__Instance * __internal_ClassInst = fileInput;
16047
16048 __internal_ClassInst ? __internal_ClassInst->_vTbl : __ecereClass___ecereNameSpace__ecere__sys__File->_vTbl;
16049 })[__ecereVMethodID___ecereNameSpace__ecere__sys__File_Write])(fileInput, definedExp->value, 1, strlen(definedExp->value));
16050 ((unsigned int (*)(struct __ecereNameSpace__ecere__com__Instance *, int pos, int mode))__extension__ ({
16051 struct __ecereNameSpace__ecere__com__Instance * __internal_ClassInst = fileInput;
16052
16053 __internal_ClassInst ? __internal_ClassInst->_vTbl : __ecereClass___ecereNameSpace__ecere__sys__File->_vTbl;
16054 })[__ecereVMethodID___ecereNameSpace__ecere__sys__File_Seek])(fileInput, 0, 0);
16055 echoOn = 0;
16056 parsedExpression = (((void *)0));
16057 resetScanner();
16058 expression_yyparse();
16059 (__ecereNameSpace__ecere__com__eInstance_DecRef(fileInput), fileInput = 0);
16060 if(backInput)
16061 fileInput = backInput;
16062 yylloc = backupYylloc;
16063 if(parsedExpression)
16064 {
16065 FreeIdentifier(id);
16066 exp->type = 5;
16067 exp->__anon1.list = MkListOne(parsedExpression);
16068 ApplyLocation(parsedExpression, &yylloc);
16069 ProcessExpressionType(exp);
16070 definedExpStackPos--;
16071 return ;
16072 }
16073 definedExpStackPos--;
16074 }
16075 else
16076 {
16077 if(inCompiler)
16078 {
16079 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Recursion in defined expression %s\n", (((void *)0))), id->string);
16080 }
16081 }
16082 }
16083 else
16084 {
16085 struct GlobalData * data = (((void *)0));
16086
16087 if(thisNameSpace && !(id->_class && !id->_class->__anon1.__anon1.name))
16088 {
16089 char name[1024];
16090
16091 strcpy(name, thisNameSpace);
16092 strcat(name, "::");
16093 strcat(name, id->string);
16094 data = FindGlobalData(name);
16095 }
16096 if(!data)
16097 data = FindGlobalData(id->string);
16098 if(data)
16099 {
16100 DeclareGlobalData(curExternal, data);
16101 exp->expType = data->dataType;
16102 if(data->dataType)
16103 data->dataType->refCount++;
16104 (__ecereNameSpace__ecere__com__eSystem_Delete(id->string), id->string = 0);
16105 id->string = __ecereNameSpace__ecere__sys__CopyString(data->fullName);
16106 FreeSpecifier(id->_class);
16107 id->_class = (((void *)0));
16108 break;
16109 }
16110 else
16111 {
16112 struct __ecereNameSpace__ecere__com__GlobalFunction * function = (((void *)0));
16113
16114 if(thisNameSpace && !(id->_class && !id->_class->__anon1.__anon1.name))
16115 {
16116 char name[1024];
16117
16118 strcpy(name, thisNameSpace);
16119 strcat(name, "::");
16120 strcat(name, id->string);
16121 function = __ecereNameSpace__ecere__com__eSystem_FindFunction(privateModule, name);
16122 }
16123 if(!function)
16124 function = __ecereNameSpace__ecere__com__eSystem_FindFunction(privateModule, id->string);
16125 if(function)
16126 {
16127 char name[1024];
16128
16129 (__ecereNameSpace__ecere__com__eSystem_Delete(id->string), id->string = 0);
16130 id->string = __ecereNameSpace__ecere__sys__CopyString(function->name);
16131 name[0] = 0;
16132 if(((struct __ecereNameSpace__ecere__com__Module *)(((char *)function->module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->importType != 1 && (!function->dataType || !function->dataType->dllExport))
16133 strcpy(name, "__ecereFunction_");
16134 FullClassNameCat(name, id->string, 0);
16135 if(DeclareFunction(curExternal, function, name))
16136 {
16137 (__ecereNameSpace__ecere__com__eSystem_Delete(id->string), id->string = 0);
16138 id->string = __ecereNameSpace__ecere__sys__CopyString(name);
16139 }
16140 exp->expType = function->dataType;
16141 if(function->dataType)
16142 function->dataType->refCount++;
16143 FreeSpecifier(id->_class);
16144 id->_class = (((void *)0));
16145 break;
16146 }
16147 }
16148 }
16149 }
16150 }
16151 unresolved = 1;
16152 break;
16153 }
16154 case 1:
16155 {
16156 if(!exp->__anon1.instance->_class)
16157 {
16158 if(exp->destType && exp->destType->kind == 8 && exp->destType->__anon1._class)
16159 {
16160 exp->__anon1.instance->_class = MkSpecifierName(exp->destType->__anon1._class->string);
16161 }
16162 }
16163 ProcessInstantiationType(exp->__anon1.instance);
16164 exp->isConstant = exp->__anon1.instance->isConstant;
16165 if(exp->__anon1.instance->_class)
16166 {
16167 exp->expType = MkClassType(exp->__anon1.instance->_class->__anon1.__anon1.name);
16168 }
16169 break;
16170 }
16171 case 2:
16172 {
16173 if(!exp->expType)
16174 {
16175 char * constant = exp->__anon1.__anon1.constant;
16176 struct Type * type = (type = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type), type->refCount = 1, type->constant = 1, type);
16177
16178 exp->expType = type;
16179 if(constant[0] == '\'')
16180 {
16181 if((int)((unsigned char *)constant)[1] > 127)
16182 {
16183 int nb;
16184 unsigned int ch = __ecereNameSpace__ecere__sys__UTF8GetChar(constant + 1, &nb);
16185
16186 if(nb < 2)
16187 ch = constant[1];
16188 (__ecereNameSpace__ecere__com__eSystem_Delete(constant), constant = 0);
16189 exp->__anon1.__anon1.constant = PrintUInt(ch);
16190 type->kind = 8;
16191 type->__anon1._class = FindClass("unichar");
16192 type->isSigned = 0;
16193 }
16194 else
16195 {
16196 type->kind = 1;
16197 type->isSigned = 1;
16198 }
16199 }
16200 else
16201 {
16202 char * dot = strchr(constant, '.');
16203 unsigned int isHex = (constant[0] == '0' && (constant[1] == 'x' || constant[1] == 'X'));
16204 char * exponent;
16205
16206 if(isHex)
16207 {
16208 exponent = strchr(constant, 'p');
16209 if(!exponent)
16210 exponent = strchr(constant, 'P');
16211 }
16212 else
16213 {
16214 exponent = strchr(constant, 'e');
16215 if(!exponent)
16216 exponent = strchr(constant, 'E');
16217 }
16218 if(dot || exponent)
16219 {
16220 if(strchr(constant, 'f') || strchr(constant, 'F'))
16221 type->kind = 6;
16222 else
16223 type->kind = 7;
16224 type->isSigned = 1;
16225 }
16226 else
16227 {
16228 unsigned int isSigned = constant[0] == '-';
16229 char * endP = (((void *)0));
16230 long long i64 = strtoll(constant, &endP, 0);
16231 uint64 ui64 = strtoull(constant, &endP, 0);
16232 unsigned int is64Bit = endP && (!strcmp(endP, "LL") || !strcmp(endP, "ll") || !strcmp(endP, "LLU") || !strcmp(endP, "llu") || !strcmp(endP, "ull") || !strcmp(endP, "ULL"));
16233 unsigned int forceUnsigned = endP && (!strcmp(endP, "U") || !strcmp(endP, "u") || !strcmp(endP, "LLU") || !strcmp(endP, "llu") || !strcmp(endP, "ull") || !strcmp(endP, "ULL"));
16234
16235 if(isSigned)
16236 {
16237 if(i64 < (((int)0x80000000)))
16238 is64Bit = 1;
16239 }
16240 else
16241 {
16242 if(ui64 > (((int)0x7fffffff)))
16243 {
16244 if(ui64 > (0xffffffff))
16245 {
16246 is64Bit = 1;
16247 if(ui64 <= (((long long)0x7fffffffffffffffLL)) && (constant[0] != '0' || !constant[1]))
16248 isSigned = 1;
16249 }
16250 }
16251 else if(constant[0] != '0' || !constant[1])
16252 isSigned = 1;
16253 }
16254 if(forceUnsigned)
16255 isSigned = 0;
16256 type->kind = is64Bit ? 4 : 3;
16257 type->isSigned = isSigned;
16258 }
16259 }
16260 exp->isConstant = 1;
16261 if(exp->destType && exp->destType->kind == 7)
16262 type->kind = 7;
16263 else if(exp->destType && exp->destType->kind == 6)
16264 type->kind = 6;
16265 else if(exp->destType && exp->destType->kind == 4)
16266 type->kind = 4;
16267 }
16268 break;
16269 }
16270 case 3:
16271 {
16272 exp->isConstant = 1;
16273 exp->expType = __extension__ ({
16274 struct Type * __ecereInstance2 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
16275
16276 __ecereInstance2->refCount = 1, __ecereInstance2->kind = 13, __ecereInstance2->__anon1.type = __extension__ ({
16277 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
16278
16279 __ecereInstance1->refCount = 1, __ecereInstance1->kind = exp->__anon1.__anon2.wideString ? 2 : 1, __ecereInstance1->constant = 1, __ecereInstance1->isSigned = exp->__anon1.__anon2.wideString ? 0 : 1, __ecereInstance1;
16280 }), __ecereInstance2;
16281 });
16282 break;
16283 }
16284 case 13:
16285 case 26:
16286 ProcessExpressionType(exp->__anon1._new.size);
16287 exp->expType = __extension__ ({
16288 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
16289
16290 __ecereInstance1->refCount = 1, __ecereInstance1->kind = 13, __ecereInstance1->__anon1.type = ProcessType(exp->__anon1._new.typeName->qualifiers, exp->__anon1._new.typeName->declarator), __ecereInstance1;
16291 });
16292 DeclareType(curExternal, exp->expType->__anon1.type, 1, 0);
16293 break;
16294 case 14:
16295 case 27:
16296 ProcessExpressionType(exp->__anon1._renew.size);
16297 ProcessExpressionType(exp->__anon1._renew.exp);
16298 exp->expType = __extension__ ({
16299 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
16300
16301 __ecereInstance1->refCount = 1, __ecereInstance1->kind = 13, __ecereInstance1->__anon1.type = ProcessType(exp->__anon1._renew.typeName->qualifiers, exp->__anon1._renew.typeName->declarator), __ecereInstance1;
16302 });
16303 DeclareType(curExternal, exp->expType->__anon1.type, 1, 0);
16304 break;
16305 case 4:
16306 {
16307 unsigned int assign = 0, boolResult = 0, boolOps = 0;
16308 struct Type * type1 = (((void *)0)), * type2 = (((void *)0));
16309 unsigned int useDestType = 0, useSideType = 0;
16310 struct Location oldyylloc = yylloc;
16311 unsigned int useSideUnit = 0;
16312 struct __ecereNameSpace__ecere__com__Class * destClass = (exp->destType && exp->destType->kind == 8 && exp->destType->__anon1._class) ? exp->destType->__anon1._class->__anon1.registered : (((void *)0));
16313 unsigned int powerOp = 0, relationOp = 0;
16314 struct __ecereNameSpace__ecere__com__Class * c1 = (((void *)0)), * c2 = (((void *)0));
16315 struct Type * dummy = (dummy = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type), dummy->count = 1, dummy->refCount = 1, dummy);
16316
16317 switch(exp->__anon1.op.op)
16318 {
16319 case '=':
16320 case MUL_ASSIGN:
16321 case DIV_ASSIGN:
16322 case MOD_ASSIGN:
16323 case ADD_ASSIGN:
16324 case SUB_ASSIGN:
16325 case LEFT_ASSIGN:
16326 case RIGHT_ASSIGN:
16327 case AND_ASSIGN:
16328 case XOR_ASSIGN:
16329 case OR_ASSIGN:
16330 assign = 1;
16331 break;
16332 case '!':
16333 break;
16334 case AND_OP:
16335 case OR_OP:
16336 boolOps = 1;
16337 boolResult = 1;
16338 break;
16339 case EQ_OP:
16340 case '<':
16341 case '>':
16342 case LE_OP:
16343 case GE_OP:
16344 case NE_OP:
16345 boolResult = 1;
16346 useSideType = 1;
16347 relationOp = 1;
16348 break;
16349 case '+':
16350 case '-':
16351 useSideUnit = 1;
16352 useSideType = 1;
16353 useDestType = 1;
16354 break;
16355 case LEFT_OP:
16356 case RIGHT_OP:
16357 break;
16358 case '|':
16359 case '^':
16360 useSideType = 1;
16361 useDestType = 1;
16362 break;
16363 case '/':
16364 case '%':
16365 useSideType = 1;
16366 useDestType = 1;
16367 if(exp->__anon1.op.op == '/')
16368 powerOp = 1;
16369 break;
16370 case '&':
16371 case '*':
16372 if(exp->__anon1.op.exp1)
16373 {
16374 useSideType = 1;
16375 useDestType = 1;
16376 if(exp->__anon1.op.op == '*')
16377 powerOp = 1;
16378 }
16379 break;
16380 }
16381 if(exp->__anon1.op.op == '&')
16382 {
16383 if(!exp->__anon1.op.exp1 && exp->__anon1.op.exp2 && exp->__anon1.op.exp2->type == 0 && exp->__anon1.op.exp2->__anon1.__anon1.identifier)
16384 {
16385 struct Identifier * id = exp->__anon1.op.exp2->__anon1.__anon1.identifier;
16386 struct Symbol * symbol = FindSymbol(id->string, curContext, topContext, 0, id->_class && id->_class->__anon1.__anon1.name == (((void *)0)));
16387
16388 if(symbol && symbol->isIterator == 2)
16389 {
16390 exp->type = 8;
16391 exp->__anon1.member.exp = exp->__anon1.op.exp2;
16392 exp->__anon1.member.member = MkIdentifier("key");
16393 exp->expType = (((void *)0));
16394 exp->__anon1.op.exp2->expType = symbol->type;
16395 symbol->type->refCount++;
16396 ProcessExpressionType(exp);
16397 FreeType(dummy);
16398 break;
16399 }
16400 }
16401 }
16402 if(exp->__anon1.op.exp1)
16403 {
16404 if(exp->__anon1.op.exp2 && useSideUnit && useDestType && destClass && destClass->type == 3 && destClass->base->type != 3)
16405 useDestType = 0;
16406 if(destClass && useDestType && ((destClass->type == 3 && useSideUnit) || destClass->type == 4 || destClass->type == 2))
16407 {
16408 if(exp->__anon1.op.exp1->destType)
16409 FreeType(exp->__anon1.op.exp1->destType);
16410 exp->__anon1.op.exp1->destType = exp->destType;
16411 exp->__anon1.op.exp1->opDestType = 1;
16412 if(exp->destType)
16413 exp->destType->refCount++;
16414 }
16415 else if(!assign)
16416 {
16417 if(exp->__anon1.op.exp1->destType)
16418 FreeType(exp->__anon1.op.exp1->destType);
16419 exp->__anon1.op.exp1->destType = dummy;
16420 dummy->refCount++;
16421 if(powerOp)
16422 exp->__anon1.op.exp1->opDestType = 1;
16423 if(relationOp)
16424 exp->__anon1.op.exp1->usedInComparison = 1;
16425 }
16426 if(exp->__anon1.op.op == '+' || exp->__anon1.op.op == '-')
16427 {
16428 if(exp->opDestType)
16429 exp->__anon1.op.exp1->parentOpDestType = 1;
16430 if(exp->usedInComparison)
16431 exp->__anon1.op.exp1->usedInComparison = 1;
16432 }
16433 if(exp->__anon1.op.exp1->destType && exp->__anon1.op.op != '=')
16434 exp->__anon1.op.exp1->destType->count++;
16435 ProcessExpressionType(exp->__anon1.op.exp1);
16436 if(exp->__anon1.op.exp1->destType && exp->__anon1.op.op != '=')
16437 exp->__anon1.op.exp1->destType->count--;
16438 exp->__anon1.op.exp1->opDestType = 0;
16439 exp->__anon1.op.exp1->usedInComparison = 0;
16440 if(!exp->__anon1.op.exp2 && (exp->__anon1.op.op == INC_OP || exp->__anon1.op.op == DEC_OP) && exp->__anon1.op.exp1->expType && exp->__anon1.op.exp1->expType->kind == 8 && exp->__anon1.op.exp1->expType->__anon1._class && exp->__anon1.op.exp1->expType->__anon1._class->__anon1.registered && exp->__anon1.op.exp1->expType->__anon1._class->__anon1.registered->type == 3)
16441 {
16442 exp->__anon1.op.exp2 = MkExpConstant("1");
16443 exp->__anon1.op.op = exp->__anon1.op.op == INC_OP ? ADD_ASSIGN : SUB_ASSIGN;
16444 assign = 1;
16445 }
16446 if(exp->__anon1.op.exp1->destType == dummy)
16447 {
16448 FreeType(dummy);
16449 exp->__anon1.op.exp1->destType = (((void *)0));
16450 }
16451 if(exp->__anon1.op.exp2)
16452 {
16453 if(!assign && exp->__anon1.op.exp1->expType && (exp->__anon1.op.exp1->expType->kind == 1 || exp->__anon1.op.exp1->expType->kind == 2))
16454 {
16455 struct Type * type = (type = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type), type->kind = 3, type->isSigned = 1, type->refCount = 1, type->signedBeforePromotion = exp->__anon1.op.exp1->expType->isSigned, type->bitMemberSize = exp->__anon1.op.exp1->expType->bitMemberSize, type->promotedFrom = exp->__anon1.op.exp1->expType->kind, type);
16456
16457 FreeType(exp->__anon1.op.exp1->expType);
16458 exp->__anon1.op.exp1->expType = type;
16459 }
16460 }
16461 type1 = exp->__anon1.op.exp1->expType;
16462 }
16463 if(exp->__anon1.op.exp2)
16464 {
16465 char expString[10240];
16466
16467 expString[0] = '\0';
16468 if(exp->__anon1.op.exp2->type == 1 && !exp->__anon1.op.exp2->__anon1.instance->_class)
16469 {
16470 if(exp->__anon1.op.exp1)
16471 {
16472 exp->__anon1.op.exp2->destType = exp->__anon1.op.exp1->expType;
16473 if(exp->__anon1.op.exp1->expType)
16474 exp->__anon1.op.exp1->expType->refCount++;
16475 }
16476 else
16477 {
16478 exp->__anon1.op.exp2->destType = exp->destType;
16479 if(!exp->__anon1.op.exp1 || (exp->__anon1.op.op != '&' && exp->__anon1.op.op != '^'))
16480 exp->__anon1.op.exp2->opDestType = 1;
16481 if(exp->destType)
16482 exp->destType->refCount++;
16483 }
16484 if(type1)
16485 type1->refCount++;
16486 exp->expType = type1;
16487 }
16488 else if(assign)
16489 {
16490 if(inCompiler)
16491 PrintExpression(exp->__anon1.op.exp2, expString);
16492 if(type1 && type1->kind == 13)
16493 {
16494 if(exp->__anon1.op.op == MUL_ASSIGN || exp->__anon1.op.op == DIV_ASSIGN || exp->__anon1.op.op == MOD_ASSIGN || exp->__anon1.op.op == LEFT_ASSIGN || exp->__anon1.op.op == RIGHT_ASSIGN || exp->__anon1.op.op == AND_ASSIGN || exp->__anon1.op.op == OR_ASSIGN)
16495 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "operator %s illegal on pointer\n", (((void *)0))), exp->__anon1.op.op);
16496 else if(exp->__anon1.op.op == '=')
16497 {
16498 if(exp->__anon1.op.exp2->destType)
16499 FreeType(exp->__anon1.op.exp2->destType);
16500 exp->__anon1.op.exp2->destType = type1;
16501 if(type1)
16502 type1->refCount++;
16503 }
16504 }
16505 else
16506 {
16507 if(exp->__anon1.op.op == MUL_ASSIGN || exp->__anon1.op.op == DIV_ASSIGN || exp->__anon1.op.op == MOD_ASSIGN || exp->__anon1.op.op == LEFT_ASSIGN || exp->__anon1.op.op == RIGHT_ASSIGN)
16508 ;
16509 else
16510 {
16511 if(exp->__anon1.op.exp2->destType)
16512 FreeType(exp->__anon1.op.exp2->destType);
16513 exp->__anon1.op.exp2->destType = type1;
16514 if(type1)
16515 type1->refCount++;
16516 }
16517 }
16518 if(type1)
16519 type1->refCount++;
16520 exp->expType = type1;
16521 }
16522 else if(destClass && ((destClass->type == 3 && useDestType && useSideUnit) || (destClass->type == 4 && useDestType)))
16523 {
16524 if(exp->__anon1.op.exp2->destType)
16525 FreeType(exp->__anon1.op.exp2->destType);
16526 exp->__anon1.op.exp2->destType = exp->destType;
16527 if(exp->__anon1.op.op != '&' && exp->__anon1.op.op != '^')
16528 exp->__anon1.op.exp2->opDestType = 1;
16529 if(exp->destType)
16530 exp->destType->refCount++;
16531 }
16532 else
16533 {
16534 if(exp->__anon1.op.exp2->destType)
16535 FreeType(exp->__anon1.op.exp2->destType);
16536 exp->__anon1.op.exp2->destType = dummy;
16537 dummy->refCount++;
16538 if(powerOp)
16539 exp->__anon1.op.exp2->opDestType = 1;
16540 if(relationOp)
16541 exp->__anon1.op.exp2->usedInComparison = 1;
16542 }
16543 if(type1 && boolResult && useSideType && type1->kind == 8 && type1->__anon1._class && type1->__anon1._class->__anon1.registered && (type1->__anon1._class->__anon1.registered->type == 2 || type1->__anon1._class->__anon1.registered->type == 4))
16544 {
16545 FreeType(exp->__anon1.op.exp2->destType);
16546 exp->__anon1.op.exp2->destType = type1;
16547 type1->refCount++;
16548 }
16549 if(exp->__anon1.op.exp2->destType && exp->__anon1.op.op != '=')
16550 exp->__anon1.op.exp2->destType->count++;
16551 if(exp->__anon1.op.op == SIZEOF)
16552 {
16553 struct Expression * e = exp->__anon1.op.exp2;
16554
16555 while((e->type == 5 || e->type == 32 || e->type == 23) && e->__anon1.list)
16556 {
16557 if(e->type == 5 || e->type == 32 || e->type == 23)
16558 {
16559 if(e->type == 23)
16560 e = (*((struct Statement *)(*e->__anon1.compound->__anon1.compound.statements).last)->__anon1.expressions).last;
16561 else
16562 e = (*e->__anon1.list).last;
16563 }
16564 }
16565 if(e->type == 11 && e->__anon1.cast.exp)
16566 e->__anon1.cast.exp->needCast = 1;
16567 }
16568 if(exp->__anon1.op.op == '+' || exp->__anon1.op.op == '-')
16569 {
16570 if(exp->opDestType)
16571 exp->__anon1.op.exp2->parentOpDestType = 1;
16572 if(exp->usedInComparison)
16573 exp->__anon1.op.exp2->usedInComparison = 1;
16574 }
16575 ProcessExpressionType(exp->__anon1.op.exp2);
16576 exp->__anon1.op.exp2->opDestType = 0;
16577 exp->__anon1.op.exp2->usedInComparison = 0;
16578 if(exp->__anon1.op.exp2->destType && exp->__anon1.op.op != '=')
16579 exp->__anon1.op.exp2->destType->count--;
16580 if(!assign && (exp->__anon1.op.exp1 || exp->__anon1.op.op == '~'))
16581 {
16582 if(exp->__anon1.op.exp2->expType && (exp->__anon1.op.exp2->expType->kind == 1 || exp->__anon1.op.exp2->expType->kind == 2))
16583 {
16584 struct Type * type = (type = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type), type->kind = 3, type->isSigned = 1, type->refCount = 1, type->signedBeforePromotion = exp->__anon1.op.exp2->expType->isSigned, type->bitMemberSize = exp->__anon1.op.exp2->expType->bitMemberSize, type->promotedFrom = exp->__anon1.op.exp2->expType->kind, type);
16585
16586 FreeType(exp->__anon1.op.exp2->expType);
16587 exp->__anon1.op.exp2->expType = type;
16588 }
16589 }
16590 if(assign && type1 && type1->kind == 13 && exp->__anon1.op.exp2->expType)
16591 {
16592 if(exp->__anon1.op.exp2->expType->kind == 23 || exp->__anon1.op.exp2->expType->kind == 22 || exp->__anon1.op.exp2->expType->kind == 4 || exp->__anon1.op.exp2->expType->kind == 3 || exp->__anon1.op.exp2->expType->kind == 2 || exp->__anon1.op.exp2->expType->kind == 1)
16593 {
16594 if(exp->__anon1.op.op != '=' && type1->__anon1.type->kind == 0)
16595 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "void *: unknown size\n", (((void *)0))));
16596 }
16597 else if(exp->__anon1.op.exp2->expType->kind == 13 || exp->__anon1.op.exp2->expType->kind == 12 || exp->__anon1.op.exp2->expType->kind == 11 || exp->__anon1.op.exp2->expType->kind == 16 || (type1->__anon1.type->kind == 0 && exp->__anon1.op.exp2->expType->kind == 8 && exp->__anon1.op.exp2->expType->__anon1._class->__anon1.registered && (exp->__anon1.op.exp2->expType->__anon1._class->__anon1.registered->type == 0 || exp->__anon1.op.exp2->expType->__anon1._class->__anon1.registered->type == 1 || exp->__anon1.op.exp2->expType->__anon1._class->__anon1.registered->type == 5)))
16598 {
16599 if(exp->__anon1.op.op == ADD_ASSIGN)
16600 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "cannot add two pointers\n", (((void *)0))));
16601 }
16602 else if((exp->__anon1.op.exp2->expType->kind == 8 && type1->kind == 13 && type1->__anon1.type->kind == 8 && type1->__anon1.type->__anon1._class == exp->__anon1.op.exp2->expType->__anon1._class && exp->__anon1.op.exp2->expType->__anon1._class->__anon1.registered && exp->__anon1.op.exp2->expType->__anon1._class->__anon1.registered->type == 1))
16603 {
16604 if(exp->__anon1.op.op == ADD_ASSIGN)
16605 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "cannot add two pointers\n", (((void *)0))));
16606 }
16607 else if(inCompiler)
16608 {
16609 char type1String[1024];
16610 char type2String[1024];
16611
16612 type1String[0] = '\0';
16613 type2String[0] = '\0';
16614 PrintType(exp->__anon1.op.exp2->expType, type1String, 0, 1);
16615 PrintType(type1, type2String, 0, 1);
16616 __ecereNameSpace__ecere__sys__ChangeCh(expString, '\n', ' ');
16617 Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "incompatible expression %s (%s); expected %s\n", (((void *)0))), expString, type1String, type2String);
16618 }
16619 }
16620 if(exp->__anon1.op.exp2->destType == dummy)
16621 {
16622 FreeType(dummy);
16623 exp->__anon1.op.exp2->destType = (((void *)0));
16624 }
16625 if(exp->__anon1.op.op == '-' && !exp->__anon1.op.exp1 && exp->__anon1.op.exp2->expType && !exp->__anon1.op.exp2->expType->isSigned)
16626 {
16627 type2 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
16628 type2->refCount = 1;
16629 CopyTypeInto(type2, exp->__anon1.op.exp2->expType);
16630 type2->isSigned = 1;
16631 }
16632 else if(exp->__anon1.op.op == '~' && !exp->__anon1.op.exp1 && exp->__anon1.op.exp2->expType && (!exp->__anon1.op.exp2->expType->isSigned || exp->__anon1.op.exp2->expType->kind != 3))
16633 {
16634 type2 = __extension__ ({
16635 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
16636
16637 __ecereInstance1->kind = 3, __ecereInstance1;
16638 });
16639 type2->refCount = 1;
16640 type2->isSigned = 1;
16641 }
16642 else
16643 {
16644 type2 = exp->__anon1.op.exp2->expType;
16645 if(type2)
16646 type2->refCount++;
16647 }
16648 }
16649 c1 = type1 && type1->kind == 8 && type1->__anon1._class ? type1->__anon1._class->__anon1.registered : (((void *)0));
16650 c2 = type2 && type2->kind == 8 && type2->__anon1._class ? type2->__anon1._class->__anon1.registered : (((void *)0));
16651 if(relationOp && ((exp->__anon1.op.exp1 && exp->__anon1.op.exp1->ambiguousUnits && (!c2 || c2->type != 3)) || (exp->__anon1.op.exp2 && exp->__anon1.op.exp2->ambiguousUnits && (!c1 || c1->type != 3))))
16652 Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "ambiguous units in relational operation\n", (((void *)0))));
16653 if(!relationOp && ((exp->__anon1.op.exp1 && exp->__anon1.op.exp1->ambiguousUnits) || (exp->__anon1.op.exp2 && exp->__anon1.op.exp2->ambiguousUnits)) && (!powerOp || !c1 || c1->type != 3 || !c2 || c2->type != 3 || !RelatedUnits(c1, c2)))
16654 {
16655 if(exp->opDestType || exp->usedInComparison)
16656 exp->ambiguousUnits = 1;
16657 else
16658 Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "ambiguous units\n", (((void *)0))));
16659 }
16660 dummy->kind = 0;
16661 if(exp->__anon1.op.op == SIZEOF)
16662 {
16663 exp->expType = __extension__ ({
16664 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
16665
16666 __ecereInstance1->refCount = 1, __ecereInstance1->kind = 23, __ecereInstance1;
16667 });
16668 exp->isConstant = 1;
16669 }
16670 else if(exp->__anon1.op.op == '*' && !exp->__anon1.op.exp1)
16671 {
16672 exp->expType = Dereference(type2);
16673 if(type2 && type2->kind == 8)
16674 notByReference = 1;
16675 }
16676 else if(exp->__anon1.op.op == '&' && !exp->__anon1.op.exp1)
16677 exp->expType = Reference(type2);
16678 else if(exp->__anon1.op.op == LEFT_OP || exp->__anon1.op.op == RIGHT_OP)
16679 {
16680 if(exp->__anon1.op.exp1->expType)
16681 {
16682 exp->expType = exp->__anon1.op.exp1->expType;
16683 exp->expType->refCount++;
16684 }
16685 }
16686 else if(!assign)
16687 {
16688 if(c1 && !c1->dataType)
16689 c1->dataType = ProcessTypeString(c1->dataTypeString, 0);
16690 if(c2 && !c2->dataType)
16691 c2->dataType = ProcessTypeString(c2->dataTypeString, 0);
16692 if(boolOps)
16693 {
16694 if(exp->__anon1.op.exp1)
16695 {
16696 if(exp->__anon1.op.exp1->destType)
16697 FreeType(exp->__anon1.op.exp1->destType);
16698 exp->__anon1.op.exp1->destType = MkClassType("bool");
16699 exp->__anon1.op.exp1->destType->truth = 1;
16700 if(!exp->__anon1.op.exp1->expType)
16701 ProcessExpressionType(exp->__anon1.op.exp1);
16702 else
16703 CheckExpressionType(exp->__anon1.op.exp1, exp->__anon1.op.exp1->destType, 0, 0);
16704 FreeType(exp->__anon1.op.exp1->expType);
16705 exp->__anon1.op.exp1->expType = MkClassType("bool");
16706 exp->__anon1.op.exp1->expType->truth = 1;
16707 }
16708 if(exp->__anon1.op.exp2)
16709 {
16710 if(exp->__anon1.op.exp2->destType)
16711 FreeType(exp->__anon1.op.exp2->destType);
16712 exp->__anon1.op.exp2->destType = MkClassType("bool");
16713 exp->__anon1.op.exp2->destType->truth = 1;
16714 if(!exp->__anon1.op.exp2->expType)
16715 ProcessExpressionType(exp->__anon1.op.exp2);
16716 else
16717 CheckExpressionType(exp->__anon1.op.exp2, exp->__anon1.op.exp2->destType, 0, 0);
16718 FreeType(exp->__anon1.op.exp2->expType);
16719 exp->__anon1.op.exp2->expType = MkClassType("bool");
16720 exp->__anon1.op.exp2->expType->truth = 1;
16721 }
16722 }
16723 else if(powerOp && exp->__anon1.op.exp1 && exp->__anon1.op.exp2 && ((c1 && c1->type == 3) || (c2 && c2->type == 3)))
16724 {
16725 if(c1 && c1->type == 3 && c2 && c2->type == 3)
16726 {
16727 if(c1->dataType->kind == 7)
16728 exp->expType = c1->dataType;
16729 else if(c2->dataType->kind == 7)
16730 exp->expType = c2->dataType;
16731 else if(c1->dataType->kind == 6)
16732 exp->expType = c1->dataType;
16733 else if(c2->dataType->kind == 6)
16734 exp->expType = c2->dataType;
16735 else
16736 exp->expType = c1->dataType;
16737 }
16738 else if((c1 && c1->type == 3) || exp->__anon1.op.op == '/')
16739 exp->expType = type1;
16740 else
16741 exp->expType = type2;
16742 if(exp->expType)
16743 exp->expType->refCount++;
16744 }
16745 else if(exp->__anon1.op.exp1 && exp->__anon1.op.exp2 && ((useSideType) || ((!type1 || type1->kind != 8 || !strcmp(type1->__anon1._class->string, "String")) && (!type2 || type2->kind != 8 || !strcmp(type2->__anon1._class->string, "String")))))
16746 {
16747 if(type1 && type2 && ((type1->kind == 8 && type1->__anon1._class && strcmp(type1->__anon1._class->string, "String")) == (type2->kind == 8 && type2->__anon1._class && strcmp(type2->__anon1._class->string, "String"))))
16748 {
16749 if(exp->__anon1.op.op == '-' && ((c1 && c1->type == 4) || (c2 && c2->type == 4)))
16750 {
16751 struct Type * intType = ProcessTypeString((c1 && c1->dataType->kind == 4) || (c2 && c2->dataType->kind == 4) ? "int64" : "int", 0);
16752
16753 if(exp->__anon1.op.exp1->destType)
16754 FreeType(exp->__anon1.op.exp1->destType);
16755 if(exp->__anon1.op.exp2->destType)
16756 FreeType(exp->__anon1.op.exp2->destType);
16757 exp->__anon1.op.exp1->destType = intType;
16758 exp->__anon1.op.exp2->destType = intType;
16759 intType->refCount++;
16760 }
16761 else
16762 {
16763 if(exp->__anon1.op.exp2->destType)
16764 FreeType(exp->__anon1.op.exp2->destType);
16765 exp->__anon1.op.exp2->destType = type1;
16766 type1->refCount++;
16767 if(exp->__anon1.op.exp1->destType)
16768 FreeType(exp->__anon1.op.exp1->destType);
16769 exp->__anon1.op.exp1->destType = type2;
16770 type2->refCount++;
16771 }
16772 if(!boolResult && !exp->opDestType && (!exp->destType || exp->destType->kind != 8) && c1 && c1->type == 3 && c2 && c2->type == 3 && c1 != c2)
16773 {
16774 if(exp->usedInComparison || exp->parentOpDestType)
16775 exp->ambiguousUnits = 1;
16776 else
16777 Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "operating on %s and %s with an untyped result, assuming %s\n", (((void *)0))), type1->__anon1._class->string, type2->__anon1._class->string, type1->__anon1._class->string);
16778 }
16779 if(type1->kind == 13 && type1->__anon1.type->kind == 20 && type2->kind != 13)
16780 {
16781 struct Expression * argExp = GetTemplateArgExp(type1->__anon1.type->__anon1.templateParameter, thisClass, 1);
16782
16783 if(argExp)
16784 {
16785 struct Expression * classExp = MkExpMember(argExp, MkIdentifier("dataTypeClass"));
16786
16787 exp->__anon1.op.exp1 = MkExpBrackets(MkListOne(MkExpCast(MkTypeName(MkListOne(MkSpecifierName("byte")), MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), (((void *)0)))), exp->__anon1.op.exp1)));
16788 ProcessExpressionType(exp->__anon1.op.exp1);
16789 if(type2->kind != 13)
16790 {
16791 ProcessExpressionType(classExp);
16792 exp->__anon1.op.exp2 = MkExpBrackets(MkListOne(MkExpOp(exp->__anon1.op.exp2, '*', MkExpMember(classExp, MkIdentifier("typeSize")))));
16793 if(!exp->__anon1.op.exp2->expType)
16794 {
16795 if(type2)
16796 FreeType(type2);
16797 type2 = exp->__anon1.op.exp2->expType = ProcessTypeString("int", 0);
16798 c2 = (((void *)0));
16799 type2->refCount++;
16800 }
16801 ProcessExpressionType(exp->__anon1.op.exp2);
16802 }
16803 }
16804 }
16805 if(!boolResult && ((type1->kind == 13 || type1->kind == 12 || (type1->kind == 8 && !strcmp(type1->__anon1._class->string, "String"))) && (type2->kind == 23 || type2->kind == 22 || type2->kind == 4 || type2->kind == 3 || type2->kind == 2 || type2->kind == 1)))
16806 {
16807 if(type1->kind != 8 && type1->__anon1.type->kind == 0)
16808 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "void *: unknown size\n", (((void *)0))));
16809 exp->expType = type1;
16810 if(type1)
16811 type1->refCount++;
16812 }
16813 else if(!boolResult && ((type2->kind == 13 || type2->kind == 12 || (type2->kind == 8 && !strcmp(type2->__anon1._class->string, "String"))) && (type1->kind == 23 || type1->kind == 22 || type1->kind == 4 || type1->kind == 3 || type1->kind == 2 || type1->kind == 1)))
16814 {
16815 if(type2->kind != 8 && type2->__anon1.type->kind == 0)
16816 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "void *: unknown size\n", (((void *)0))));
16817 exp->expType = type2;
16818 if(type2)
16819 type2->refCount++;
16820 }
16821 else if((type1->kind == 13 && type2->kind != 13 && type2->kind != 12 && type2->kind != 11 && type2->kind != 16 && type2->kind != 8 && type2->kind != 19) || (type2->kind == 13 && type1->kind != 13 && type1->kind != 12 && type1->kind != 11 && type1->kind != 16 && type1->kind != 8 && type1->kind != 19))
16822 {
16823 Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "different levels of indirection\n", (((void *)0))));
16824 }
16825 else
16826 {
16827 unsigned int success = 0;
16828
16829 if(type1->kind == 13 && type2->kind == 13)
16830 {
16831 if(exp->__anon1.op.op == '+')
16832 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "cannot add two pointers\n", (((void *)0))));
16833 else if(exp->__anon1.op.op == '-')
16834 {
16835 if(MatchTypes(type1->__anon1.type, type2->__anon1.type, (((void *)0)), (((void *)0)), (((void *)0)), 0, 0, 0, 0, 0))
16836 {
16837 exp->expType = __extension__ ({
16838 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
16839
16840 __ecereInstance1->kind = 3, __ecereInstance1->refCount = 1, __ecereInstance1;
16841 });
16842 success = 1;
16843 if(type1->__anon1.type->kind == 20)
16844 {
16845 struct Expression * argExp = GetTemplateArgExp(type1->__anon1.type->__anon1.templateParameter, thisClass, 1);
16846
16847 if(argExp)
16848 {
16849 struct Expression * classExp = MkExpMember(argExp, MkIdentifier("dataTypeClass"));
16850
16851 ProcessExpressionType(classExp);
16852 exp->type = 5;
16853 exp->__anon1.list = MkListOne(MkExpOp(MkExpBrackets(MkListOne(MkExpOp(MkExpCast(MkTypeName(MkListOne(MkSpecifierName("byte")), MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), (((void *)0)))), MkExpBrackets(MkListOne(exp->__anon1.op.exp1))), exp->__anon1.op.op, MkExpCast(MkTypeName(MkListOne(MkSpecifierName("byte")), MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), (((void *)0)))), MkExpBrackets(MkListOne(exp->__anon1.op.exp2)))))), '/', MkExpMember(classExp, MkIdentifier("typeSize"))));
16854 ProcessExpressionType(((struct Expression *)(*exp->__anon1.list).first)->__anon1.op.exp2);
16855 FreeType(dummy);
16856 return ;
16857 }
16858 }
16859 }
16860 }
16861 }
16862 if(!success && exp->__anon1.op.exp1->type == 2)
16863 {
16864 if(CheckExpressionType(exp->__anon1.op.exp1, exp->__anon1.op.exp1->destType, 0, 0))
16865 {
16866 if(exp->expType)
16867 FreeType(exp->expType);
16868 exp->expType = exp->__anon1.op.exp1->destType;
16869 if(exp->__anon1.op.exp1->destType)
16870 exp->__anon1.op.exp1->destType->refCount++;
16871 success = 1;
16872 }
16873 else if(CheckExpressionType(exp->__anon1.op.exp2, exp->__anon1.op.exp2->destType, 0, 0))
16874 {
16875 if(exp->expType)
16876 FreeType(exp->expType);
16877 exp->expType = exp->__anon1.op.exp2->destType;
16878 if(exp->__anon1.op.exp2->destType)
16879 exp->__anon1.op.exp2->destType->refCount++;
16880 success = 1;
16881 }
16882 }
16883 else if(!success)
16884 {
16885 if(CheckExpressionType(exp->__anon1.op.exp2, exp->__anon1.op.exp2->destType, 0, 0))
16886 {
16887 if(exp->expType)
16888 FreeType(exp->expType);
16889 exp->expType = exp->__anon1.op.exp2->destType;
16890 if(exp->__anon1.op.exp2->destType)
16891 exp->__anon1.op.exp2->destType->refCount++;
16892 success = 1;
16893 }
16894 else if(CheckExpressionType(exp->__anon1.op.exp1, exp->__anon1.op.exp1->destType, 0, 0))
16895 {
16896 if(exp->expType)
16897 FreeType(exp->expType);
16898 exp->expType = exp->__anon1.op.exp1->destType;
16899 if(exp->__anon1.op.exp1->destType)
16900 exp->__anon1.op.exp1->destType->refCount++;
16901 success = 1;
16902 }
16903 }
16904 if(!success)
16905 {
16906 char expString1[10240];
16907 char expString2[10240];
16908 char type1[1024];
16909 char type2[1024];
16910
16911 expString1[0] = '\0';
16912 expString2[0] = '\0';
16913 type1[0] = '\0';
16914 type2[0] = '\0';
16915 if(inCompiler)
16916 {
16917 PrintExpression(exp->__anon1.op.exp1, expString1);
16918 __ecereNameSpace__ecere__sys__ChangeCh(expString1, '\n', ' ');
16919 PrintExpression(exp->__anon1.op.exp2, expString2);
16920 __ecereNameSpace__ecere__sys__ChangeCh(expString2, '\n', ' ');
16921 PrintType(exp->__anon1.op.exp1->expType, type1, 0, 1);
16922 PrintType(exp->__anon1.op.exp2->expType, type2, 0, 1);
16923 }
16924 Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "incompatible expressions %s (%s) and %s (%s)\n", (((void *)0))), expString1, type1, expString2, type2);
16925 }
16926 }
16927 }
16928 else if(!boolResult && !useSideUnit && c2 && c2->type == 3 && type1 && type1->kind != 8)
16929 {
16930 if(exp->__anon1.op.exp1->destType)
16931 FreeType(exp->__anon1.op.exp1->destType);
16932 exp->__anon1.op.exp1->destType = type2->__anon1._class->__anon1.registered->dataType;
16933 if(type2->__anon1._class->__anon1.registered->dataType)
16934 type2->__anon1._class->__anon1.registered->dataType->refCount++;
16935 CheckExpressionType(exp->__anon1.op.exp1, exp->__anon1.op.exp1->destType, 0, 0);
16936 exp->expType = type2;
16937 if(type2)
16938 type2->refCount++;
16939 }
16940 else if(!boolResult && !useSideUnit && c1 && c1->type == 3 && type2 && type2->kind != 8)
16941 {
16942 if(exp->__anon1.op.exp2->destType)
16943 FreeType(exp->__anon1.op.exp2->destType);
16944 exp->__anon1.op.exp2->destType = type1->__anon1._class->__anon1.registered->dataType;
16945 if(type1->__anon1._class->__anon1.registered->dataType)
16946 type1->__anon1._class->__anon1.registered->dataType->refCount++;
16947 CheckExpressionType(exp->__anon1.op.exp2, exp->__anon1.op.exp2->destType, 0, 0);
16948 exp->expType = type1;
16949 if(type1)
16950 type1->refCount++;
16951 }
16952 else if(type1)
16953 {
16954 unsigned int valid = 0;
16955
16956 if(!boolResult && useSideUnit && c1 && c1->type == 3 && type2 && type2->kind != 8)
16957 {
16958 if(exp->__anon1.op.exp2->destType)
16959 FreeType(exp->__anon1.op.exp2->destType);
16960 exp->__anon1.op.exp2->destType = c1->dataType;
16961 exp->__anon1.op.exp2->destType->refCount++;
16962 CheckExpressionType(exp->__anon1.op.exp2, exp->__anon1.op.exp2->destType, 0, 0);
16963 if(type2)
16964 FreeType(type2);
16965 type2 = exp->__anon1.op.exp2->destType;
16966 c2 = type2 && type2->kind == 8 && type2->__anon1._class ? type2->__anon1._class->__anon1.registered : (((void *)0));
16967 if(type2)
16968 type2->refCount++;
16969 exp->expType = type2;
16970 type2->refCount++;
16971 }
16972 if(!boolResult && useSideUnit && c2 && c2->type == 3 && type1 && type1->kind != 8)
16973 {
16974 if(exp->__anon1.op.exp1->destType)
16975 FreeType(exp->__anon1.op.exp1->destType);
16976 exp->__anon1.op.exp1->destType = c2->dataType;
16977 exp->__anon1.op.exp1->destType->refCount++;
16978 CheckExpressionType(exp->__anon1.op.exp1, exp->__anon1.op.exp1->destType, 0, 0);
16979 type1 = exp->__anon1.op.exp1->destType;
16980 c1 = type1 && type1->kind == 8 && type1->__anon1._class ? type1->__anon1._class->__anon1.registered : (((void *)0));
16981 exp->expType = type1;
16982 type1->refCount++;
16983 }
16984 if(!boolResult || exp->__anon1.op.op == '>' || exp->__anon1.op.op == '<' || exp->__anon1.op.op == GE_OP || exp->__anon1.op.op == LE_OP)
16985 {
16986 unsigned int op1IsEnum = c1 && c1->type == 4;
16987 unsigned int op2IsEnum = c2 && c2->type == 4;
16988
16989 if(exp->__anon1.op.op == '*' || exp->__anon1.op.op == '/' || exp->__anon1.op.op == '-' || exp->__anon1.op.op == '|' || exp->__anon1.op.op == '^')
16990 {
16991 if(op1IsEnum && exp->__anon1.op.exp2->expType)
16992 {
16993 if(CheckExpressionType(exp->__anon1.op.exp1, exp->__anon1.op.exp2->expType, 0, 0))
16994 {
16995 if(exp->expType)
16996 FreeType(exp->expType);
16997 exp->expType = exp->__anon1.op.exp2->expType;
16998 if(exp->__anon1.op.exp2->expType)
16999 exp->__anon1.op.exp2->expType->refCount++;
17000 valid = 1;
17001 }
17002 }
17003 else if(op2IsEnum && exp->__anon1.op.exp1->expType)
17004 {
17005 if(CheckExpressionType(exp->__anon1.op.exp2, exp->__anon1.op.exp1->expType, 0, 0))
17006 {
17007 if(exp->expType)
17008 FreeType(exp->expType);
17009 exp->expType = exp->__anon1.op.exp1->expType;
17010 if(exp->__anon1.op.exp1->expType)
17011 exp->__anon1.op.exp1->expType->refCount++;
17012 valid = 1;
17013 }
17014 }
17015 }
17016 else
17017 {
17018 if(op1IsEnum && exp->__anon1.op.exp2->expType)
17019 {
17020 if(CheckExpressionType(exp->__anon1.op.exp1, exp->__anon1.op.exp2->expType, 0, 0))
17021 {
17022 if(exp->expType)
17023 FreeType(exp->expType);
17024 exp->expType = exp->__anon1.op.exp1->expType;
17025 if(exp->__anon1.op.exp1->expType)
17026 exp->__anon1.op.exp1->expType->refCount++;
17027 valid = 1;
17028 }
17029 }
17030 else if(op2IsEnum && exp->__anon1.op.exp1->expType)
17031 {
17032 if(CheckExpressionType(exp->__anon1.op.exp2, exp->__anon1.op.exp1->expType, 0, 0))
17033 {
17034 if(exp->expType)
17035 FreeType(exp->expType);
17036 exp->expType = exp->__anon1.op.exp2->expType;
17037 if(exp->__anon1.op.exp2->expType)
17038 exp->__anon1.op.exp2->expType->refCount++;
17039 valid = 1;
17040 }
17041 }
17042 }
17043 }
17044 if(!valid)
17045 {
17046 if(c2 && c2->type == 3 && (!c1 || c1->type != 3))
17047 {
17048 if(exp->__anon1.op.exp1->destType)
17049 FreeType(exp->__anon1.op.exp1->destType);
17050 exp->__anon1.op.exp1->destType = type2;
17051 type2->refCount++;
17052 if(CheckExpressionType(exp->__anon1.op.exp1, exp->__anon1.op.exp1->destType, 0, 0))
17053 {
17054 if(exp->expType)
17055 FreeType(exp->expType);
17056 exp->expType = exp->__anon1.op.exp1->destType;
17057 if(exp->__anon1.op.exp1->destType)
17058 exp->__anon1.op.exp1->destType->refCount++;
17059 }
17060 }
17061 else
17062 {
17063 if(exp->__anon1.op.exp2->destType)
17064 FreeType(exp->__anon1.op.exp2->destType);
17065 exp->__anon1.op.exp2->destType = type1;
17066 type1->refCount++;
17067 if(CheckExpressionType(exp->__anon1.op.exp2, exp->__anon1.op.exp2->destType, 0, 0))
17068 {
17069 if(exp->expType)
17070 FreeType(exp->expType);
17071 exp->expType = exp->__anon1.op.exp2->destType;
17072 if(exp->__anon1.op.exp2->destType)
17073 exp->__anon1.op.exp2->destType->refCount++;
17074 }
17075 else if(type1 && type2)
17076 {
17077 char expString1[10240];
17078 char expString2[10240];
17079 char type1String[1024];
17080 char type2String[1024];
17081
17082 expString1[0] = '\0';
17083 expString2[0] = '\0';
17084 type1String[0] = '\0';
17085 type2String[0] = '\0';
17086 if(inCompiler)
17087 {
17088 PrintExpression(exp->__anon1.op.exp1, expString1);
17089 __ecereNameSpace__ecere__sys__ChangeCh(expString1, '\n', ' ');
17090 PrintExpression(exp->__anon1.op.exp2, expString2);
17091 __ecereNameSpace__ecere__sys__ChangeCh(expString2, '\n', ' ');
17092 PrintType(exp->__anon1.op.exp1->expType, type1String, 0, 1);
17093 PrintType(exp->__anon1.op.exp2->expType, type2String, 0, 1);
17094 }
17095 Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "incompatible expressions %s (%s) and %s (%s)\n", (((void *)0))), expString1, type1String, expString2, type2String);
17096 if(c1 && c1->type == 4)
17097 {
17098 exp->expType = exp->__anon1.op.exp1->expType;
17099 if(exp->__anon1.op.exp1->expType)
17100 exp->__anon1.op.exp1->expType->refCount++;
17101 }
17102 else if(c2 && c2->type == 4)
17103 {
17104 exp->expType = exp->__anon1.op.exp2->expType;
17105 if(exp->__anon1.op.exp2->expType)
17106 exp->__anon1.op.exp2->expType->refCount++;
17107 }
17108 }
17109 }
17110 }
17111 }
17112 else if(type2)
17113 {
17114 if(c2 && c2->type == 4)
17115 {
17116 struct Type * oldType = exp->__anon1.op.exp1->expType;
17117
17118 exp->__anon1.op.exp1->expType = (((void *)0));
17119 if(CheckExpressionType(exp->__anon1.op.exp1, exp->__anon1.op.exp1->destType, 0, 0))
17120 FreeType(oldType);
17121 else
17122 exp->__anon1.op.exp1->expType = oldType;
17123 }
17124 if(exp->__anon1.op.exp1->destType)
17125 FreeType(exp->__anon1.op.exp1->destType);
17126 exp->__anon1.op.exp1->destType = type2;
17127 type2->refCount++;
17128 if(CheckExpressionType(exp->__anon1.op.exp1, exp->__anon1.op.exp1->destType, 0, 0))
17129 {
17130 if(exp->expType)
17131 FreeType(exp->expType);
17132 exp->expType = exp->__anon1.op.exp1->destType;
17133 if(exp->__anon1.op.exp1->destType)
17134 exp->__anon1.op.exp1->destType->refCount++;
17135 }
17136 }
17137 }
17138 else if(type2 && (!type1 || (type2->kind == 8 && type1->kind != 8)))
17139 {
17140 if(type1 && c2 && c2->type == 3)
17141 {
17142 if(exp->__anon1.op.exp1->destType)
17143 FreeType(exp->__anon1.op.exp1->destType);
17144 exp->__anon1.op.exp1->destType = type2->__anon1._class->__anon1.registered->dataType;
17145 if(type2->__anon1._class->__anon1.registered->dataType)
17146 type2->__anon1._class->__anon1.registered->dataType->refCount++;
17147 CheckExpressionType(exp->__anon1.op.exp1, exp->__anon1.op.exp1->destType, 0, 0);
17148 }
17149 if(exp->__anon1.op.op == '!')
17150 {
17151 exp->expType = MkClassType("bool");
17152 exp->expType->truth = 1;
17153 }
17154 else
17155 {
17156 exp->expType = type2;
17157 if(type2)
17158 type2->refCount++;
17159 }
17160 }
17161 else if(type1 && (!type2 || (type1->kind == 8 && type2->kind != 8)))
17162 {
17163 if(c2 && c2->type == 3)
17164 {
17165 if(exp->__anon1.op.exp2->destType)
17166 FreeType(exp->__anon1.op.exp2->destType);
17167 exp->__anon1.op.exp2->destType = type1->__anon1._class->__anon1.registered->dataType;
17168 if(type1->__anon1._class->__anon1.registered->dataType)
17169 type1->__anon1._class->__anon1.registered->dataType->refCount++;
17170 CheckExpressionType(exp->__anon1.op.exp2, exp->__anon1.op.exp2->destType, 0, 0);
17171 }
17172 exp->expType = type1;
17173 if(type1)
17174 type1->refCount++;
17175 }
17176 }
17177 yylloc = exp->loc;
17178 if(exp->__anon1.op.exp1 && !exp->__anon1.op.exp1->expType)
17179 {
17180 char expString[10000];
17181
17182 expString[0] = '\0';
17183 if(inCompiler)
17184 {
17185 PrintExpression(exp->__anon1.op.exp1, expString);
17186 __ecereNameSpace__ecere__sys__ChangeCh(expString, '\n', ' ');
17187 }
17188 if(expString[0])
17189 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "couldn't determine type of %s\n", (((void *)0))), expString);
17190 }
17191 if(exp->__anon1.op.exp2 && !exp->__anon1.op.exp2->expType)
17192 {
17193 char expString[10240];
17194
17195 expString[0] = '\0';
17196 if(inCompiler)
17197 {
17198 PrintExpression(exp->__anon1.op.exp2, expString);
17199 __ecereNameSpace__ecere__sys__ChangeCh(expString, '\n', ' ');
17200 }
17201 if(expString[0])
17202 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "couldn't determine type of %s\n", (((void *)0))), expString);
17203 }
17204 if(boolResult)
17205 {
17206 FreeType(exp->expType);
17207 exp->expType = MkClassType("bool");
17208 exp->expType->truth = 1;
17209 }
17210 if(exp->__anon1.op.op != SIZEOF)
17211 exp->isConstant = (!exp->__anon1.op.exp1 || exp->__anon1.op.exp1->isConstant) && (!exp->__anon1.op.exp2 || exp->__anon1.op.exp2->isConstant);
17212 if(exp->__anon1.op.op == SIZEOF && exp->__anon1.op.exp2->expType)
17213 {
17214 DeclareType(curExternal, exp->__anon1.op.exp2->expType, 1, 0);
17215 }
17216 if(exp->__anon1.op.op == DELETE && exp->__anon1.op.exp2 && exp->__anon1.op.exp2->expType && __ecereProp_Type_Get_specConst(exp->__anon1.op.exp2->expType))
17217 Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "deleting const qualified object\n", (((void *)0))));
17218 yylloc = oldyylloc;
17219 FreeType(dummy);
17220 if(type2)
17221 FreeType(type2);
17222 break;
17223 }
17224 case 5:
17225 case 32:
17226 {
17227 struct Expression * e;
17228
17229 exp->isConstant = 1;
17230 for(e = (*exp->__anon1.list).first; e; e = e->next)
17231 {
17232 if(!e->next)
17233 {
17234 FreeType(e->destType);
17235 e->opDestType = exp->opDestType;
17236 e->usedInComparison = exp->usedInComparison;
17237 e->parentOpDestType = exp->parentOpDestType;
17238 e->destType = exp->destType;
17239 if(e->destType)
17240 {
17241 exp->destType->refCount++;
17242 }
17243 }
17244 ProcessExpressionType(e);
17245 if(e->ambiguousUnits)
17246 exp->ambiguousUnits = 1;
17247 if(!exp->expType && !e->next)
17248 {
17249 exp->expType = e->expType;
17250 if(e->expType)
17251 e->expType->refCount++;
17252 exp->needCast = e->needCast;
17253 }
17254 if(!e->isConstant)
17255 exp->isConstant = 0;
17256 }
17257 e = (*exp->__anon1.list).first;
17258 if(!e->next && e->type == 8)
17259 {
17260 struct Expression * next = exp->next, * prev = exp->prev;
17261
17262 FreeType(exp->expType);
17263 FreeType(exp->destType);
17264 (__ecereNameSpace__ecere__com__eSystem_Delete(exp->__anon1.list), exp->__anon1.list = 0);
17265 *exp = *e;
17266 exp->prev = prev;
17267 exp->next = next;
17268 ((e ? __extension__ ({
17269 void * __ecerePtrToDelete = (e);
17270
17271 __ecereClass_Expression->Destructor ? __ecereClass_Expression->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete);
17272 }) : 0), e = 0);
17273 ProcessExpressionType(exp);
17274 }
17275 break;
17276 }
17277 case 6:
17278 {
17279 struct Expression * e;
17280
17281 exp->isConstant = 1;
17282 ProcessExpressionType(exp->__anon1.index.exp);
17283 if(!exp->__anon1.index.exp->isConstant)
17284 exp->isConstant = 0;
17285 if(exp->__anon1.index.exp->expType)
17286 {
17287 struct Type * source = exp->__anon1.index.exp->expType;
17288
17289 if(source->kind == 8 && source->__anon1._class && source->__anon1._class->__anon1.registered)
17290 {
17291 struct __ecereNameSpace__ecere__com__Class * _class = source->__anon1._class->__anon1.registered;
17292 struct __ecereNameSpace__ecere__com__Class * c = _class->templateClass ? _class->templateClass : _class;
17293
17294 if(_class != containerClass && __ecereNameSpace__ecere__com__eClass_IsDerived(c, containerClass) && _class->templateArgs)
17295 {
17296 exp->expType = ProcessTypeString(_class->templateArgs[2].__anon1.__anon1.dataTypeString, 0);
17297 if(exp->__anon1.index.index && (*exp->__anon1.index.index).last)
17298 {
17299 struct Type * type = ProcessTypeString(_class->templateArgs[1].__anon1.__anon1.dataTypeString, 0);
17300
17301 if(type->kind == 8)
17302 type->constant = 1;
17303 else if(type->kind == 13)
17304 {
17305 struct Type * t = type;
17306
17307 while(t->kind == 13)
17308 t = t->__anon1.type;
17309 t->constant = 1;
17310 }
17311 ((struct Expression *)(*exp->__anon1.index.index).last)->destType = type;
17312 }
17313 }
17314 }
17315 }
17316 for(e = (*exp->__anon1.index.index).first; e; e = e->next)
17317 {
17318 if(!e->next && exp->__anon1.index.exp->expType && exp->__anon1.index.exp->expType->kind == 12 && exp->__anon1.index.exp->expType->__anon1.__anon4.enumClass)
17319 {
17320 if(e->destType)
17321 FreeType(e->destType);
17322 e->destType = MkClassType(exp->__anon1.index.exp->expType->__anon1.__anon4.enumClass->string);
17323 }
17324 ProcessExpressionType(e);
17325 if(!e->next)
17326 {
17327 }
17328 if(!e->isConstant)
17329 exp->isConstant = 0;
17330 }
17331 if(!exp->expType)
17332 exp->expType = Dereference(exp->__anon1.index.exp->expType);
17333 if(exp->expType)
17334 DeclareType(curExternal, exp->expType, 1, 0);
17335 break;
17336 }
17337 case 7:
17338 {
17339 struct Expression * e;
17340 struct Type * functionType;
17341 struct Type * methodType = (((void *)0));
17342 char name[1024];
17343
17344 name[0] = '\0';
17345 if(inCompiler)
17346 {
17347 PrintExpression(exp->__anon1.call.exp, name);
17348 if(exp->__anon1.call.exp->expType && !exp->__anon1.call.exp->expType->__anon1.__anon2.returnType)
17349 {
17350 PrintExpression(exp->__anon1.call.exp, name);
17351 }
17352 }
17353 if(exp->__anon1.call.exp->type == 0)
17354 {
17355 struct Expression * idExp = exp->__anon1.call.exp;
17356 struct Identifier * id = idExp->__anon1.__anon1.identifier;
17357
17358 if(!strcmp(id->string, "__builtin_frame_address"))
17359 {
17360 exp->expType = ProcessTypeString("void *", 1);
17361 if(exp->__anon1.call.arguments && (*exp->__anon1.call.arguments).first)
17362 ProcessExpressionType((*exp->__anon1.call.arguments).first);
17363 break;
17364 }
17365 else if(!strcmp(id->string, "__ENDIAN_PAD"))
17366 {
17367 exp->expType = ProcessTypeString("int", 1);
17368 if(exp->__anon1.call.arguments && (*exp->__anon1.call.arguments).first)
17369 ProcessExpressionType((*exp->__anon1.call.arguments).first);
17370 break;
17371 }
17372 else if(!strcmp(id->string, "Max") || !strcmp(id->string, "Min") || !strcmp(id->string, "Sgn") || !strcmp(id->string, "Abs"))
17373 {
17374 struct Expression * a = (((void *)0));
17375 struct Expression * b = (((void *)0));
17376 struct Expression * tempExp1 = (((void *)0)), * tempExp2 = (((void *)0));
17377
17378 if((!strcmp(id->string, "Max") || !strcmp(id->string, "Min")) && (*exp->__anon1.call.arguments).count == 2)
17379 {
17380 a = (*exp->__anon1.call.arguments).first;
17381 b = (*exp->__anon1.call.arguments).last;
17382 tempExp1 = a;
17383 tempExp2 = b;
17384 }
17385 else if((*exp->__anon1.call.arguments).count == 1)
17386 {
17387 a = (*exp->__anon1.call.arguments).first;
17388 tempExp1 = a;
17389 }
17390 if(a)
17391 {
17392 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Clear((&*exp->__anon1.call.arguments));
17393 idExp->__anon1.__anon1.identifier = (((void *)0));
17394 FreeExpContents(exp);
17395 ProcessExpressionType(a);
17396 if(b)
17397 ProcessExpressionType(b);
17398 exp->type = 5;
17399 exp->__anon1.list = MkList();
17400 if(a->expType && (!b || b->expType))
17401 {
17402 if((!a->isConstant && a->type != 0) || (b && !b->isConstant && b->type != 0))
17403 {
17404 if(inCompiler)
17405 {
17406 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
17407 struct __ecereNameSpace__ecere__sys__OldList * decls = MkList();
17408 struct Declaration * decl;
17409 char temp1[1024], temp2[1024];
17410
17411 GetTypeSpecs(a->expType, specs);
17412 if(a && !a->isConstant && a->type != 0)
17413 {
17414 sprintf(temp1, "__simpleStruct%d", curContext->simpleID++);
17415 ListAdd(decls, MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier(temp1)), (((void *)0))));
17416 tempExp1 = QMkExpId(temp1);
17417 tempExp1->expType = a->expType;
17418 if(a->expType)
17419 a->expType->refCount++;
17420 ListAdd(exp->__anon1.list, MkExpOp(CopyExpression(tempExp1), '=', a));
17421 }
17422 if(b && !b->isConstant && b->type != 0)
17423 {
17424 sprintf(temp2, "__simpleStruct%d", curContext->simpleID++);
17425 ListAdd(decls, MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier(temp2)), (((void *)0))));
17426 tempExp2 = QMkExpId(temp2);
17427 tempExp2->expType = b->expType;
17428 if(b->expType)
17429 b->expType->refCount++;
17430 ListAdd(exp->__anon1.list, MkExpOp(CopyExpression(tempExp2), '=', b));
17431 }
17432 decl = MkDeclaration(specs, decls);
17433 if(!curCompound->__anon1.compound.declarations)
17434 curCompound->__anon1.compound.declarations = MkList();
17435 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*curCompound->__anon1.compound.declarations), (((void *)0)), decl);
17436 }
17437 }
17438 }
17439 if(!strcmp(id->string, "Max") || !strcmp(id->string, "Min"))
17440 {
17441 int op = (!strcmp(id->string, "Max")) ? '>' : '<';
17442
17443 ListAdd(exp->__anon1.list, MkExpCondition(MkExpBrackets(MkListOne(MkExpOp(CopyExpression(tempExp1), op, CopyExpression(tempExp2)))), MkListOne(CopyExpression(tempExp1)), CopyExpression(tempExp2)));
17444 exp->expType = a->expType;
17445 if(a->expType)
17446 a->expType->refCount++;
17447 }
17448 else if(!strcmp(id->string, "Abs"))
17449 {
17450 ListAdd(exp->__anon1.list, MkExpCondition(MkExpBrackets(MkListOne(MkExpOp(CopyExpression(tempExp1), '<', MkExpConstant("0")))), MkListOne(MkExpOp((((void *)0)), '-', CopyExpression(tempExp1))), CopyExpression(tempExp1)));
17451 exp->expType = a->expType;
17452 if(a->expType)
17453 a->expType->refCount++;
17454 }
17455 else if(!strcmp(id->string, "Sgn"))
17456 {
17457 ListAdd(exp->__anon1.list, MkExpCondition(MkExpBrackets(MkListOne(MkExpOp((((void *)0)), '!', CopyExpression(tempExp1)))), MkListOne(MkExpConstant("0")), MkExpBrackets(MkListOne(MkExpCondition(MkExpBrackets(MkListOne(MkExpOp(CopyExpression(tempExp1), '<', MkExpConstant("0")))), MkListOne(MkExpConstant("-1")), MkExpConstant("1"))))));
17458 exp->expType = ProcessTypeString("int", 0);
17459 }
17460 FreeExpression(tempExp1);
17461 if(tempExp2)
17462 FreeExpression(tempExp2);
17463 FreeIdentifier(id);
17464 break;
17465 }
17466 }
17467 }
17468 {
17469 struct Type * dummy = (dummy = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type), dummy->count = 1, dummy->refCount = 1, dummy);
17470
17471 if(!exp->__anon1.call.exp->destType)
17472 {
17473 exp->__anon1.call.exp->destType = dummy;
17474 dummy->refCount++;
17475 }
17476 ProcessExpressionType(exp->__anon1.call.exp);
17477 if(exp->__anon1.call.exp->destType == dummy)
17478 {
17479 FreeType(dummy);
17480 exp->__anon1.call.exp->destType = (((void *)0));
17481 }
17482 FreeType(dummy);
17483 }
17484 functionType = exp->__anon1.call.exp->expType;
17485 if(functionType && functionType->kind == 16)
17486 {
17487 methodType = functionType;
17488 functionType = methodType->__anon1.__anon3.method->dataType;
17489 if(exp->__anon1.call.exp->expType->__anon1.__anon3.usedClass)
17490 {
17491 char typeString[1024];
17492
17493 typeString[0] = '\0';
17494 {
17495 struct Symbol * back = functionType->__anon1.__anon2.thisClass;
17496
17497 functionType->__anon1.__anon2.thisClass = (((void *)0));
17498 PrintType(functionType, typeString, 1, 1);
17499 functionType->__anon1.__anon2.thisClass = back;
17500 }
17501 if(strstr(typeString, "thisclass"))
17502 {
17503 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
17504 struct Declarator * decl;
17505
17506 {
17507 struct Context * context = SetupTemplatesContext(exp->__anon1.call.exp->expType->__anon1.__anon3.usedClass);
17508
17509 decl = SpecDeclFromString(typeString, specs, (((void *)0)));
17510 if(thisClass != (exp->__anon1.call.exp->expType->__anon1.__anon3.usedClass->templateClass ? exp->__anon1.call.exp->expType->__anon1.__anon3.usedClass->templateClass : exp->__anon1.call.exp->expType->__anon1.__anon3.usedClass))
17511 thisClassParams = 0;
17512 ReplaceThisClassSpecifiers(specs, exp->__anon1.call.exp->expType->__anon1.__anon3.usedClass);
17513 {
17514 struct __ecereNameSpace__ecere__com__Class * backupThisClass = thisClass;
17515
17516 thisClass = exp->__anon1.call.exp->expType->__anon1.__anon3.usedClass;
17517 ProcessDeclarator(decl, 1);
17518 thisClass = backupThisClass;
17519 }
17520 thisClassParams = 1;
17521 functionType = ProcessType(specs, decl);
17522 functionType->refCount = 0;
17523 FinishTemplatesContext(context);
17524 {
17525 struct Type * p, * op;
17526
17527 for(p = functionType->__anon1.__anon2.params.first, op = methodType->__anon1.__anon3.method->dataType->__anon1.__anon2.params.first; p && op; p = p->next, op = op->next)
17528 {
17529 if(op->kind == 21)
17530 p->thisClassFrom = methodType->__anon1.__anon3.method->_class;
17531 }
17532 }
17533 if(methodType->__anon1.__anon3.method->dataType->__anon1.__anon2.returnType->kind == 21)
17534 {
17535 functionType->__anon1.__anon2.returnType->thisClassFrom = methodType->__anon1.__anon3.method->_class;
17536 }
17537 }
17538 FreeList(specs, (void *)(FreeSpecifier));
17539 FreeDeclarator(decl);
17540 }
17541 }
17542 }
17543 if(functionType && functionType->kind == 13 && functionType->__anon1.type && functionType->__anon1.type->kind == 11)
17544 {
17545 struct Type * type = functionType->__anon1.type;
17546
17547 if(!functionType->refCount)
17548 {
17549 functionType->__anon1.type = (((void *)0));
17550 FreeType(functionType);
17551 }
17552 functionType = type;
17553 }
17554 if(functionType && functionType->kind != 11)
17555 {
17556 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "called object %s is not a function\n", (((void *)0))), name);
17557 }
17558 else if(functionType)
17559 {
17560 unsigned int emptyParams = 0, noParams = 0;
17561 struct Expression * e = exp->__anon1.call.arguments ? (*exp->__anon1.call.arguments).first : (((void *)0));
17562 struct Type * type = functionType->__anon1.__anon2.params.first;
17563 struct Expression * memberExp = (exp->__anon1.call.exp->type == 8) ? exp->__anon1.call.exp : (((void *)0));
17564 int extra = 0;
17565 struct Location oldyylloc = yylloc;
17566
17567 if(!type)
17568 emptyParams = 1;
17569 if(functionType->extraParam && e && functionType->__anon1.__anon2.thisClass)
17570 {
17571 e->destType = MkClassType(functionType->__anon1.__anon2.thisClass->string);
17572 e = e->next;
17573 }
17574 if(!functionType->__anon1.__anon2.staticMethod && !functionType->extraParam)
17575 {
17576 if(memberExp && memberExp->__anon1.member.exp && memberExp->__anon1.member.exp->expType && memberExp->__anon1.member.exp->expType->kind == 19 && memberExp->__anon1.member.exp->expType->__anon1._class)
17577 {
17578 type = MkClassType(memberExp->__anon1.member.exp->expType->__anon1._class->string);
17579 if(e)
17580 {
17581 e->destType = type;
17582 e = e->next;
17583 type = functionType->__anon1.__anon2.params.first;
17584 }
17585 else
17586 type->refCount = 0;
17587 }
17588 else if(!memberExp && (functionType->__anon1.__anon2.thisClass || (methodType && methodType->__anon1.__anon3.methodClass)))
17589 {
17590 type = MkClassType(functionType->__anon1.__anon2.thisClass ? functionType->__anon1.__anon2.thisClass->string : (methodType ? methodType->__anon1.__anon3.methodClass->fullName : (((void *)0))));
17591 type->byReference = functionType->byReference;
17592 type->typedByReference = functionType->typedByReference;
17593 if(e)
17594 {
17595 if(e->next && type->kind == 8 && (functionType && functionType->__anon1.__anon2.thisClass) && functionType->classObjectType == 2)
17596 e = e->next;
17597 e->destType = type;
17598 e = e->next;
17599 type = functionType->__anon1.__anon2.params.first;
17600 }
17601 else
17602 type->refCount = 0;
17603 }
17604 }
17605 if(type && type->kind == 0)
17606 {
17607 noParams = 1;
17608 if(!type->refCount)
17609 FreeType(type);
17610 type = (((void *)0));
17611 }
17612 for(; e; e = e->next)
17613 {
17614 if(!type && !emptyParams)
17615 {
17616 yylloc = e->loc;
17617 if(methodType && methodType->__anon1.__anon3.methodClass)
17618 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "too many arguments for method %s::%s (%d given, expected %d)\n", (((void *)0))), methodType->__anon1.__anon3.methodClass->fullName, methodType->__anon1.__anon3.method->name, (*exp->__anon1.call.arguments).count, noParams ? 0 : functionType->__anon1.__anon2.params.count);
17619 else
17620 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "too many arguments for function %s (%d given, expected %d)\n", (((void *)0))), name, (*exp->__anon1.call.arguments).count, noParams ? 0 : functionType->__anon1.__anon2.params.count);
17621 break;
17622 }
17623 if(methodType && type && type->kind == 20 && type->__anon1.templateParameter->type == 0)
17624 {
17625 struct Type * templatedType = (((void *)0));
17626 struct __ecereNameSpace__ecere__com__Class * _class = methodType->__anon1.__anon3.usedClass;
17627 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * curParam = (((void *)0));
17628 int id = 0;
17629
17630 if(_class && _class->templateArgs)
17631 {
17632 struct __ecereNameSpace__ecere__com__Class * sClass;
17633
17634 for(sClass = _class; sClass; sClass = sClass->base)
17635 {
17636 if(sClass->templateClass)
17637 sClass = sClass->templateClass;
17638 id = 0;
17639 for(curParam = sClass->templateParams.first; curParam; curParam = curParam->next)
17640 {
17641 if(curParam->type == 0 && !strcmp(type->__anon1.templateParameter->identifier->string, curParam->name))
17642 {
17643 struct __ecereNameSpace__ecere__com__Class * nextClass;
17644
17645 for(nextClass = sClass->base; nextClass; nextClass = nextClass->base)
17646 {
17647 if(nextClass->templateClass)
17648 nextClass = nextClass->templateClass;
17649 id += nextClass->templateParams.count;
17650 }
17651 break;
17652 }
17653 id++;
17654 }
17655 if(curParam)
17656 break;
17657 }
17658 }
17659 if(curParam && _class->templateArgs[id].__anon1.__anon1.dataTypeString)
17660 {
17661 unsigned int constant = type->constant;
17662 struct __ecereNameSpace__ecere__com__ClassTemplateArgument arg = _class->templateArgs[id];
17663
17664 {
17665 struct Context * context = SetupTemplatesContext(_class);
17666
17667 templatedType = ProcessTypeString(arg.__anon1.__anon1.dataTypeString, 0);
17668 FinishTemplatesContext(context);
17669 }
17670 if(templatedType->kind == 8 && constant)
17671 templatedType->constant = 1;
17672 else if(templatedType->kind == 13)
17673 {
17674 struct Type * t = templatedType->__anon1.type;
17675
17676 while(t->kind == 13)
17677 t = t->__anon1.type;
17678 if(constant)
17679 t->constant = constant;
17680 }
17681 e->destType = templatedType;
17682 if(templatedType)
17683 {
17684 templatedType->passAsTemplate = 1;
17685 }
17686 }
17687 else
17688 {
17689 e->destType = type;
17690 if(type)
17691 type->refCount++;
17692 }
17693 }
17694 else
17695 {
17696 if(type && type->kind == 14 && type->prev && type->prev->kind == 8 && type->prev->classObjectType)
17697 {
17698 e->destType = type->prev;
17699 e->destType->refCount++;
17700 }
17701 else
17702 {
17703 e->destType = type;
17704 if(type)
17705 type->refCount++;
17706 }
17707 }
17708 if(type && type->kind != 14)
17709 {
17710 struct Type * next = type->next;
17711
17712 if(!type->refCount)
17713 FreeType(type);
17714 type = next;
17715 }
17716 }
17717 if(type && type->kind != 14)
17718 {
17719 if(methodType && methodType->__anon1.__anon3.methodClass)
17720 Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "not enough arguments for method %s::%s (%d given, expected %d)\n", (((void *)0))), methodType->__anon1.__anon3.methodClass->fullName, methodType->__anon1.__anon3.method->name, exp->__anon1.call.arguments ? (*exp->__anon1.call.arguments).count : 0, functionType->__anon1.__anon2.params.count + extra);
17721 else
17722 Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "not enough arguments for function %s (%d given, expected %d)\n", (((void *)0))), name, exp->__anon1.call.arguments ? (*exp->__anon1.call.arguments).count : 0, functionType->__anon1.__anon2.params.count + extra);
17723 }
17724 yylloc = oldyylloc;
17725 if(type && !type->refCount)
17726 FreeType(type);
17727 }
17728 else
17729 {
17730 functionType = __extension__ ({
17731 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
17732
17733 __ecereInstance1->refCount = 0, __ecereInstance1->kind = 11, __ecereInstance1;
17734 });
17735 if(exp->__anon1.call.exp->type == 0)
17736 {
17737 char * string = exp->__anon1.call.exp->__anon1.__anon1.identifier->string;
17738
17739 if(inCompiler)
17740 {
17741 struct Symbol * symbol;
17742 struct Location oldyylloc = yylloc;
17743
17744 yylloc = exp->__anon1.call.exp->__anon1.__anon1.identifier->loc;
17745 if(strstr(string, "__builtin_") == string)
17746 {
17747 if(exp->destType)
17748 {
17749 functionType->__anon1.__anon2.returnType = exp->destType;
17750 exp->destType->refCount++;
17751 }
17752 }
17753 else
17754 Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "%s undefined; assuming extern returning int\n", (((void *)0))), string);
17755 symbol = __extension__ ({
17756 struct Symbol * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Symbol);
17757
17758 __ecereInstance1->string = __ecereNameSpace__ecere__sys__CopyString(string), __ecereInstance1->type = ProcessTypeString("int()", 1), __ecereInstance1;
17759 });
17760 __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Add(&globalContext->symbols, (struct __ecereNameSpace__ecere__sys__BTNode *)symbol);
17761 if(strstr(symbol->string, "::"))
17762 globalContext->hasNameSpace = 1;
17763 yylloc = oldyylloc;
17764 }
17765 }
17766 else if(exp->__anon1.call.exp->type == 8)
17767 {
17768 }
17769 else
17770 Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "callable object undefined; extern assuming returning int\n", (((void *)0))));
17771 if(!functionType->__anon1.__anon2.returnType)
17772 {
17773 functionType->__anon1.__anon2.returnType = __extension__ ({
17774 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
17775
17776 __ecereInstance1->refCount = 1, __ecereInstance1->kind = 3, __ecereInstance1;
17777 });
17778 }
17779 }
17780 if(functionType && functionType->kind == 11)
17781 {
17782 exp->expType = functionType->__anon1.__anon2.returnType;
17783 if(functionType->__anon1.__anon2.returnType)
17784 functionType->__anon1.__anon2.returnType->refCount++;
17785 if(!functionType->refCount)
17786 FreeType(functionType);
17787 }
17788 if(exp->__anon1.call.arguments)
17789 {
17790 for(e = (*exp->__anon1.call.arguments).first; e; e = e->next)
17791 ProcessExpressionType(e);
17792 }
17793 break;
17794 }
17795 case 8:
17796 {
17797 struct Type * type;
17798 struct Location oldyylloc = yylloc;
17799 unsigned int thisPtr;
17800 struct Expression * checkExp = exp->__anon1.member.exp;
17801
17802 while(checkExp)
17803 {
17804 if(checkExp->type == 11)
17805 checkExp = checkExp->__anon1.cast.exp;
17806 else if(checkExp->type == 5)
17807 checkExp = checkExp->__anon1.list ? (*checkExp->__anon1.list).first : (((void *)0));
17808 else
17809 break;
17810 }
17811 thisPtr = (checkExp && checkExp->type == 0 && !strcmp(checkExp->__anon1.__anon1.identifier->string, "this"));
17812 exp->thisPtr = thisPtr;
17813 if(exp->__anon1.member.member && exp->__anon1.member.member->_class && exp->__anon1.member.member->_class->__anon1.__anon1.name)
17814 {
17815 exp->__anon1.member.member->classSym = exp->__anon1.member.member->_class->__anon1.__anon1.symbol;
17816 }
17817 ProcessExpressionType(exp->__anon1.member.exp);
17818 if(exp->__anon1.member.exp->expType && exp->__anon1.member.exp->expType->kind == 8 && exp->__anon1.member.exp->expType->__anon1._class && exp->__anon1.member.exp->expType->__anon1._class->__anon1.registered && exp->__anon1.member.exp->expType->__anon1._class->__anon1.registered->type == 0)
17819 {
17820 exp->isConstant = 0;
17821 }
17822 else
17823 exp->isConstant = exp->__anon1.member.exp->isConstant;
17824 type = exp->__anon1.member.exp->expType;
17825 yylloc = exp->loc;
17826 if(type && (type->kind == 20))
17827 {
17828 struct __ecereNameSpace__ecere__com__Class * _class = thisClass ? thisClass : currentClass;
17829 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * param = (((void *)0));
17830
17831 if(_class)
17832 {
17833 for(param = _class->templateParams.first; param; param = param->next)
17834 {
17835 if(param->type == 1 && exp->__anon1.member.member && exp->__anon1.member.member->string && !strcmp(param->name, exp->__anon1.member.member->string))
17836 break;
17837 }
17838 }
17839 if(param && param->defaultArg.__anon1.__anon2.__anon1.member)
17840 {
17841 struct Expression * argExp = GetTemplateArgExpByName(param->name, thisClass, 1);
17842
17843 if(argExp)
17844 {
17845 struct Expression * expMember = exp->__anon1.member.exp;
17846 struct Declarator * decl;
17847 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
17848 char thisClassTypeString[1024];
17849
17850 FreeIdentifier(exp->__anon1.member.member);
17851 ProcessExpressionType(argExp);
17852 {
17853 char * colon = strstr(param->defaultArg.__anon1.__anon2.memberString, "::");
17854
17855 if(colon)
17856 {
17857 memcpy(thisClassTypeString, param->defaultArg.__anon1.__anon2.memberString, colon - param->defaultArg.__anon1.__anon2.memberString);
17858 thisClassTypeString[colon - param->defaultArg.__anon1.__anon2.memberString] = '\0';
17859 }
17860 else
17861 strcpy(thisClassTypeString, _class->fullName);
17862 }
17863 decl = SpecDeclFromString(param->defaultArg.__anon1.__anon2.__anon1.member->dataTypeString, specs, (((void *)0)));
17864 exp->expType = ProcessType(specs, decl);
17865 if(exp->expType->kind == 8 && exp->expType->__anon1._class && exp->expType->__anon1._class->__anon1.registered && exp->expType->__anon1._class->__anon1.registered->templateClass)
17866 {
17867 struct __ecereNameSpace__ecere__com__Class * expClass = exp->expType->__anon1._class->__anon1.registered;
17868 struct __ecereNameSpace__ecere__com__Class * cClass = (((void *)0));
17869 int paramCount = 0;
17870 int lastParam = -1;
17871 char templateString[1024];
17872 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * param;
17873
17874 sprintf(templateString, "%s<", expClass->templateClass->fullName);
17875 for(cClass = expClass; cClass; cClass = cClass->base)
17876 {
17877 int p = 0;
17878
17879 for(param = cClass->templateParams.first; param; param = param->next)
17880 {
17881 int id = p;
17882 struct __ecereNameSpace__ecere__com__Class * sClass;
17883 struct __ecereNameSpace__ecere__com__ClassTemplateArgument arg;
17884
17885 for(sClass = cClass->base; sClass; sClass = sClass->base)
17886 id += sClass->templateParams.count;
17887 arg = expClass->templateArgs[id];
17888 for(sClass = _class; sClass; sClass = sClass->base)
17889 {
17890 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * cParam;
17891 int p = 0;
17892 struct __ecereNameSpace__ecere__com__Class * nextClass;
17893
17894 for(nextClass = sClass->base; nextClass; nextClass = nextClass->base)
17895 p += nextClass->templateParams.count;
17896 for(cParam = sClass->templateParams.first; cParam; cParam = cParam->next, p++)
17897 {
17898 if(cParam->type == 0 && arg.__anon1.__anon1.dataTypeString && !strcmp(cParam->name, arg.__anon1.__anon1.dataTypeString))
17899 {
17900 if(_class->templateArgs && arg.__anon1.__anon1.dataTypeString && (!param->defaultArg.__anon1.__anon1.dataTypeString || strcmp(arg.__anon1.__anon1.dataTypeString, param->defaultArg.__anon1.__anon1.dataTypeString)))
17901 {
17902 arg.__anon1.__anon1.dataTypeString = _class->templateArgs[p].__anon1.__anon1.dataTypeString;
17903 arg.__anon1.__anon1.dataTypeClass = _class->templateArgs[p].__anon1.__anon1.dataTypeClass;
17904 break;
17905 }
17906 }
17907 }
17908 }
17909 {
17910 char argument[256];
17911
17912 argument[0] = '\0';
17913 switch(param->type)
17914 {
17915 case 2:
17916 {
17917 char expString[1024];
17918 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
17919 struct Declarator * decl = SpecDeclFromString(param->__anon1.dataTypeString, specs, (((void *)0)));
17920 struct Expression * exp;
17921 char * string = PrintHexUInt64(arg.__anon1.expression.__anon1.ui64);
17922
17923 exp = MkExpCast(MkTypeName(specs, decl), MkExpConstant(string));
17924 (__ecereNameSpace__ecere__com__eSystem_Delete(string), string = 0);
17925 ProcessExpressionType(exp);
17926 ComputeExpression(exp);
17927 expString[0] = '\0';
17928 PrintExpression(exp, expString);
17929 strcat(argument, expString);
17930 FreeExpression(exp);
17931 break;
17932 }
17933 case 1:
17934 {
17935 strcat(argument, arg.__anon1.__anon2.__anon1.member->name);
17936 break;
17937 }
17938 case 0:
17939 {
17940 if(arg.__anon1.__anon1.dataTypeString && (!param->defaultArg.__anon1.__anon1.dataTypeString || strcmp(arg.__anon1.__anon1.dataTypeString, param->defaultArg.__anon1.__anon1.dataTypeString)))
17941 {
17942 if(!strcmp(arg.__anon1.__anon1.dataTypeString, "thisclass"))
17943 strcat(argument, thisClassTypeString);
17944 else
17945 strcat(argument, arg.__anon1.__anon1.dataTypeString);
17946 }
17947 break;
17948 }
17949 }
17950 if(argument[0])
17951 {
17952 if(paramCount)
17953 strcat(templateString, ", ");
17954 if(lastParam != p - 1)
17955 {
17956 strcat(templateString, param->name);
17957 strcat(templateString, " = ");
17958 }
17959 strcat(templateString, argument);
17960 paramCount++;
17961 lastParam = p;
17962 }
17963 p++;
17964 }
17965 }
17966 }
17967 {
17968 int len = strlen(templateString);
17969
17970 if(templateString[len - 1] == '>')
17971 templateString[len++] = ' ';
17972 templateString[len++] = '>';
17973 templateString[len++] = '\0';
17974 }
17975 {
17976 struct Context * context = SetupTemplatesContext(_class);
17977
17978 FreeType(exp->expType);
17979 exp->expType = ProcessTypeString(templateString, 0);
17980 FinishTemplatesContext(context);
17981 }
17982 }
17983 if(!__ecereProp_Type_Get_isPointerType(expMember->expType))
17984 expMember = MkExpCast(MkTypeName(MkListOne(MkSpecifierName("uintptr")), (((void *)0))), expMember);
17985 exp->type = 5;
17986 exp->__anon1.list = MkListOne(MkExpOp((((void *)0)), '*', MkExpCast(MkTypeName(specs, MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), decl)), MkExpBrackets(MkListOne(MkExpOp(MkExpBrackets(MkListOne(MkExpCast(MkTypeName(MkListOne(MkSpecifierName("byte")), MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), (((void *)0)))), expMember))), '+', MkExpOp(MkExpMember(MkExpMember(argExp, MkIdentifier("member")), MkIdentifier("offset")), '+', MkExpMember(MkExpMember(MkExpMember(CopyExpression(argExp), MkIdentifier("member")), MkIdentifier("_class")), MkIdentifier("offset")))))))));
17987 }
17988 }
17989 else if(type->__anon1.templateParameter && type->__anon1.templateParameter->type == 0 && (type->__anon1.templateParameter->__anon1.dataType || type->__anon1.templateParameter->dataTypeString))
17990 {
17991 type = ProcessTemplateParameterType(type->__anon1.templateParameter);
17992 }
17993 }
17994 if(type && (type->kind == 20))
17995 ;
17996 else if(type && (type->kind == 8 || type->kind == 19 || type->kind == 3 || type->kind == 15 || type->kind == 4 || type->kind == 2 || type->kind == 5 || type->kind == 1 || type->kind == 24 || type->kind == 22 || type->kind == 23 || type->kind == 6 || type->kind == 7 || (type->kind == 13 && type->__anon1.type->kind == 1)))
17997 {
17998 struct Identifier * id = exp->__anon1.member.member;
17999 int typeKind = type->kind;
18000 struct __ecereNameSpace__ecere__com__Class * _class = (id && (!id->_class || id->_class->__anon1.__anon1.name)) ? (id->classSym ? id->classSym->__anon1.registered : (type->__anon1._class ? type->__anon1._class->__anon1.registered : (((void *)0)))) : (((void *)0));
18001
18002 if(typeKind == 19 && exp->__anon1.member.exp->type == 24)
18003 {
18004 _class = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "ecere::com::Class");
18005 typeKind = 8;
18006 }
18007 if(id)
18008 {
18009 if(typeKind == 3 || typeKind == 15)
18010 _class = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "int");
18011 else if(!_class)
18012 {
18013 if(type->kind == 8 && type->__anon1._class && type->__anon1._class->__anon1.registered)
18014 {
18015 _class = type->__anon1._class->__anon1.registered;
18016 }
18017 else if((type->kind == 12 || type->kind == 13) && type->__anon1.type && type->__anon1.type->kind == 1)
18018 {
18019 _class = FindClass("char *")->__anon1.registered;
18020 }
18021 else if(type->kind == 13)
18022 {
18023 _class = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "uintptr");
18024 FreeType(exp->expType);
18025 exp->expType = ProcessTypeString("uintptr", 0);
18026 exp->byReference = 1;
18027 }
18028 else
18029 {
18030 char string[1024] = "";
18031 struct Symbol * classSym;
18032
18033 PrintTypeNoConst(type, string, 0, 1);
18034 classSym = FindClass(string);
18035 if(classSym)
18036 _class = classSym->__anon1.registered;
18037 }
18038 }
18039 }
18040 if(_class && id)
18041 {
18042 struct __ecereNameSpace__ecere__com__Property * prop = (((void *)0));
18043 struct __ecereNameSpace__ecere__com__Method * method = (((void *)0));
18044 struct __ecereNameSpace__ecere__com__DataMember * member = (((void *)0));
18045 struct __ecereNameSpace__ecere__com__Property * revConvert = (((void *)0));
18046 struct __ecereNameSpace__ecere__com__ClassProperty * classProp = (((void *)0));
18047
18048 if(id && id->_class && id->_class->__anon1.__anon1.name && !strcmp(id->_class->__anon1.__anon1.name, "property"))
18049 exp->__anon1.member.memberType = 1;
18050 if(id && id->_class && type->__anon1._class && !__ecereNameSpace__ecere__com__eClass_IsDerived(type->__anon1._class->__anon1.registered, _class))
18051 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "invalid class specifier %s for object of class %s\n", (((void *)0))), _class->fullName, type->__anon1._class->string);
18052 if(typeKind != 19)
18053 {
18054 if((exp->__anon1.member.memberType == 0 && thisPtr) || exp->__anon1.member.memberType == 3)
18055 {
18056 member = __ecereNameSpace__ecere__com__eClass_FindDataMember(_class, id->string, privateModule, (((void *)0)), (((void *)0)));
18057 if(member && member->_class != (_class->templateClass ? _class->templateClass : _class) && exp->__anon1.member.memberType != 3)
18058 {
18059 prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, id->string, privateModule);
18060 if(prop)
18061 member = (((void *)0));
18062 }
18063 if(!member && !prop)
18064 prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, id->string, privateModule);
18065 if((member && member->_class == (_class->templateClass ? _class->templateClass : _class)) || (prop && prop->_class == (_class->templateClass ? _class->templateClass : _class)))
18066 exp->__anon1.member.thisPtr = 1;
18067 }
18068 else
18069 {
18070 unsigned int useMemberForNonConst = 0;
18071
18072 if(!id->classSym)
18073 {
18074 prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, id->string, (((void *)0)));
18075 useMemberForNonConst = prop && exp->destType && ((exp->destType->kind == 8 && !exp->destType->constant) || ((exp->destType->kind == 13 || exp->destType->kind == 12) && exp->destType->__anon1.type && !exp->destType->__anon1.type->constant)) && !strncmp(prop->dataTypeString, "const ", 6);
18076 if(useMemberForNonConst || !id->_class || !id->_class->__anon1.__anon1.name || strcmp(id->_class->__anon1.__anon1.name, "property"))
18077 member = __ecereNameSpace__ecere__com__eClass_FindDataMember(_class, id->string, (((void *)0)), (((void *)0)), (((void *)0)));
18078 }
18079 if((!prop || useMemberForNonConst) && !member)
18080 {
18081 method = useMemberForNonConst ? (((void *)0)) : __ecereNameSpace__ecere__com__eClass_FindMethod(_class, id->string, (((void *)0)));
18082 if(!method)
18083 {
18084 prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, id->string, privateModule);
18085 useMemberForNonConst |= prop && exp->destType && ((exp->destType->kind == 8 && !exp->destType->constant) || ((exp->destType->kind == 13 || exp->destType->kind == 12) && exp->destType->__anon1.type && !exp->destType->__anon1.type->constant)) && !strncmp(prop->dataTypeString, "const ", 6);
18086 if(useMemberForNonConst || !id->_class || !id->_class->__anon1.__anon1.name || strcmp(id->_class->__anon1.__anon1.name, "property"))
18087 member = __ecereNameSpace__ecere__com__eClass_FindDataMember(_class, id->string, privateModule, (((void *)0)), (((void *)0)));
18088 }
18089 }
18090 if(member && prop)
18091 {
18092 if(useMemberForNonConst || (member->_class != prop->_class && !id->_class && __ecereNameSpace__ecere__com__eClass_IsDerived(member->_class, prop->_class)))
18093 prop = (((void *)0));
18094 else
18095 member = (((void *)0));
18096 }
18097 }
18098 }
18099 if(!prop && !member && !method)
18100 method = __ecereNameSpace__ecere__com__eClass_FindMethod(_class, id->string, privateModule);
18101 if(!prop && !member && !method)
18102 {
18103 if(typeKind == 19)
18104 {
18105 classProp = __ecereNameSpace__ecere__com__eClass_FindClassProperty(type->__anon1._class->__anon1.registered, exp->__anon1.member.member->string);
18106 if(classProp)
18107 {
18108 exp->__anon1.member.memberType = 5;
18109 exp->expType = ProcessTypeString(classProp->dataTypeString, 0);
18110 }
18111 else
18112 {
18113 char structName[1024];
18114 struct Identifier * id = exp->__anon1.member.member;
18115 struct Expression * classExp = exp->__anon1.member.exp;
18116
18117 type->refCount++;
18118 FreeType(classExp->expType);
18119 classExp->expType = ProcessTypeString("ecere::com::Class", 0);
18120 strcpy(structName, "__ecereClassData_");
18121 FullClassNameCat(structName, type->__anon1._class->string, 0);
18122 exp->type = 9;
18123 exp->__anon1.member.member = id;
18124 exp->__anon1.member.exp = MkExpBrackets(MkListOne(MkExpCast(MkTypeName(MkListOne(MkStructOrUnion(3, MkIdentifier(structName), (((void *)0)))), MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), (((void *)0)))), MkExpBrackets(MkListOne(MkExpOp(MkExpCast(MkTypeName(MkListOne(MkSpecifier(CHAR)), MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), (((void *)0)))), MkExpMember(classExp, MkIdentifier("data"))), '+', MkExpMember(MkExpClass(MkListOne(MkSpecifierName(type->__anon1._class->string)), (((void *)0))), MkIdentifier("offsetClass"))))))));
18125 FreeType(type);
18126 ProcessExpressionType(exp);
18127 return ;
18128 }
18129 }
18130 else
18131 {
18132 struct Symbol * classSym = FindClass(id->string);
18133
18134 if(classSym)
18135 {
18136 struct __ecereNameSpace__ecere__com__Class * convertClass = classSym->__anon1.registered;
18137
18138 if(convertClass)
18139 revConvert = __ecereNameSpace__ecere__com__eClass_FindProperty(convertClass, _class->fullName, privateModule);
18140 }
18141 }
18142 }
18143 if(exp->__anon1.member.exp->destType)
18144 FreeType(exp->__anon1.member.exp->destType);
18145 {
18146 if(method && !method->_class->symbol)
18147 method->_class->symbol = FindClass(method->_class->fullName);
18148 if(prop && !prop->_class->symbol)
18149 prop->_class->symbol = FindClass(prop->_class->fullName);
18150 exp->__anon1.member.exp->destType = __extension__ ({
18151 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
18152
18153 __ecereInstance1->refCount = 1, __ecereInstance1->kind = 8, __ecereInstance1->__anon1._class = prop ? prop->_class->symbol : method ? method->_class->symbol : _class->symbol, __ecereInstance1->thisClassFrom = type ? type->thisClassFrom : (((void *)0)), __ecereInstance1;
18154 });
18155 }
18156 if(prop)
18157 {
18158 exp->__anon1.member.memberType = 1;
18159 if(!prop->dataType)
18160 ProcessPropertyType(prop);
18161 exp->expType = prop->dataType;
18162 if(!strcmp(_class->base->fullName, "eda::Row") && !exp->expType->constant && !exp->destType)
18163 {
18164 struct Type * type = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
18165
18166 CopyTypeInto(type, exp->expType);
18167 type->refCount = 1;
18168 type->constant = 1;
18169 exp->expType = type;
18170 }
18171 else if(prop->dataType)
18172 prop->dataType->refCount++;
18173 }
18174 else if(member)
18175 {
18176 if(exp->__anon1.member.exp->expType->classObjectType == 2 && !strcmp(exp->__anon1.member.member->string, "_class"))
18177 {
18178 FreeExpContents(exp);
18179 exp->type = 0;
18180 exp->__anon1.__anon1.identifier = MkIdentifier("class");
18181 ProcessExpressionType(exp);
18182 return ;
18183 }
18184 exp->__anon1.member.memberType = 3;
18185 DeclareStruct(curExternal, _class->fullName, 0, 1);
18186 if(member->_class != _class)
18187 DeclareStruct(curExternal, member->_class->fullName, 0, 1);
18188 if(!member->dataType)
18189 {
18190 struct Context * context = SetupTemplatesContext(_class);
18191
18192 member->dataType = ProcessTypeString(member->dataTypeString, 0);
18193 FinishTemplatesContext(context);
18194 }
18195 if(exp->__anon1.member.exp->expType->kind == 8 && exp->__anon1.member.exp->expType->__anon1._class && exp->__anon1.member.exp->expType->__anon1._class->__anon1.registered && exp->__anon1.member.exp->expType->__anon1._class->__anon1.registered->type == 2)
18196 member->dataType->bitMemberSize = ((struct __ecereNameSpace__ecere__com__BitMember *)member)->size;
18197 exp->expType = member->dataType;
18198 if(member->dataType)
18199 member->dataType->refCount++;
18200 }
18201 else if(revConvert)
18202 {
18203 exp->__anon1.member.memberType = 4;
18204 exp->expType = MkClassType(revConvert->_class->fullName);
18205 }
18206 else if(method)
18207 {
18208 {
18209 exp->__anon1.member.memberType = 2;
18210 }
18211 if(!method->dataType)
18212 ProcessMethodType(method);
18213 exp->expType = __extension__ ({
18214 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
18215
18216 __ecereInstance1->refCount = 1, __ecereInstance1->kind = 16, __ecereInstance1->__anon1.__anon3.method = method, __ecereInstance1;
18217 });
18218 exp->expType->__anon1.__anon3.methodClass = (id && id->_class) ? _class : (((void *)0));
18219 exp->expType->__anon1.__anon3.usedClass = _class;
18220 }
18221 else if(!classProp)
18222 {
18223 if(exp->__anon1.member.exp->expType->classObjectType == 2 && !strcmp(exp->__anon1.member.member->string, "_class"))
18224 {
18225 FreeExpContents(exp);
18226 exp->type = 0;
18227 exp->__anon1.__anon1.identifier = MkIdentifier("class");
18228 FreeType(exp->expType);
18229 exp->expType = MkClassType("ecere::com::Class");
18230 return ;
18231 }
18232 yylloc = exp->__anon1.member.member->loc;
18233 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "couldn't find member %s in class %s\n", (((void *)0))), id->string, _class->fullName);
18234 if(inCompiler)
18235 __ecereNameSpace__ecere__com__eClass_AddDataMember(_class, id->string, "int", 0, 0, 1);
18236 }
18237 if(_class && exp->expType)
18238 {
18239 struct __ecereNameSpace__ecere__com__Class * tClass;
18240
18241 tClass = type->__anon1._class && type->__anon1._class->__anon1.registered ? type->__anon1._class->__anon1.registered : _class;
18242 while(tClass && !tClass->templateClass)
18243 tClass = tClass->base;
18244 if(tClass && exp->expType->kind == 20 && exp->expType->__anon1.templateParameter->type == 0)
18245 {
18246 int id = 0;
18247 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * curParam = (((void *)0));
18248 struct __ecereNameSpace__ecere__com__Class * sClass;
18249
18250 for(sClass = tClass; sClass; sClass = sClass->base)
18251 {
18252 id = 0;
18253 if(sClass->templateClass)
18254 sClass = sClass->templateClass;
18255 for(curParam = sClass->templateParams.first; curParam; curParam = curParam->next)
18256 {
18257 if(curParam->type == 0 && !strcmp(exp->expType->__anon1.templateParameter->identifier->string, curParam->name))
18258 {
18259 for(sClass = sClass->base; sClass; sClass = sClass->base)
18260 id += sClass->templateParams.count;
18261 break;
18262 }
18263 id++;
18264 }
18265 if(curParam)
18266 break;
18267 }
18268 if(curParam && tClass->templateArgs[id].__anon1.__anon1.dataTypeString)
18269 {
18270 struct __ecereNameSpace__ecere__com__ClassTemplateArgument arg = tClass->templateArgs[id];
18271 struct Context * context = SetupTemplatesContext(tClass);
18272 unsigned int constant = exp->expType->constant;
18273 unsigned int passAsTemplate = 0;
18274 struct __ecereNameSpace__ecere__com__Class * thisClassFrom = (((void *)0));
18275 struct Type * t = ProcessTypeString(exp->expType->__anon1.templateParameter->dataTypeString, 0);
18276
18277 if(t && t->kind == 8 && t->__anon1._class)
18278 thisClassFrom = t->__anon1._class->__anon1.registered;
18279 else
18280 thisClassFrom = __ecereNameSpace__ecere__com__eSystem_FindClass(GetPrivateModule(), "class");
18281 FreeType(t);
18282 passAsTemplate = tClass->templateClass && (exp->expType->kind != 20 || (!exp->expType->__anon1.templateParameter || (!exp->expType->__anon1.templateParameter->dataTypeString && !exp->expType->__anon1.templateParameter->__anon1.dataType)));
18283 FreeType(exp->expType);
18284 exp->expType = ProcessTypeString(arg.__anon1.__anon1.dataTypeString, 0);
18285 exp->expType->thisClassFrom = thisClassFrom;
18286 if(exp->expType->kind == 8 && constant)
18287 exp->expType->constant = 1;
18288 else if(exp->expType->kind == 13)
18289 {
18290 struct Type * t = exp->expType->__anon1.type;
18291
18292 while(t->kind == 13)
18293 t = t->__anon1.type;
18294 if(constant)
18295 t->constant = constant;
18296 }
18297 if(exp->expType)
18298 {
18299 if(exp->expType->kind == 21)
18300 {
18301 FreeType(exp->expType);
18302 exp->expType = ReplaceThisClassType(_class);
18303 }
18304 if(passAsTemplate)
18305 exp->expType->passAsTemplate = 1;
18306 if(!exp->destType)
18307 {
18308 exp->destType = ProcessTypeString(arg.__anon1.__anon1.dataTypeString, 0);
18309 if(exp->destType->kind == 8 && constant)
18310 exp->destType->constant = 1;
18311 else if(exp->destType->kind == 13)
18312 {
18313 struct Type * t = exp->destType->__anon1.type;
18314
18315 while(t->kind == 13)
18316 t = t->__anon1.type;
18317 if(constant)
18318 t->constant = constant;
18319 }
18320 if(exp->destType->kind == 21)
18321 {
18322 FreeType(exp->destType);
18323 exp->destType = ReplaceThisClassType(_class);
18324 }
18325 }
18326 }
18327 FinishTemplatesContext(context);
18328 }
18329 }
18330 else if(tClass && exp->expType->kind == 13 && exp->expType->__anon1.type && exp->expType->__anon1.type->kind == 20 && exp->expType->__anon1.type->__anon1.templateParameter->type == 0)
18331 {
18332 int id = 0;
18333 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * curParam = (((void *)0));
18334 struct __ecereNameSpace__ecere__com__Class * sClass;
18335
18336 for(sClass = tClass; sClass; sClass = sClass->base)
18337 {
18338 id = 0;
18339 if(sClass->templateClass)
18340 sClass = sClass->templateClass;
18341 for(curParam = sClass->templateParams.first; curParam; curParam = curParam->next)
18342 {
18343 if(curParam->type == 0 && !strcmp(exp->expType->__anon1.type->__anon1.templateParameter->identifier->string, curParam->name))
18344 {
18345 for(sClass = sClass->base; sClass; sClass = sClass->base)
18346 id += sClass->templateParams.count;
18347 break;
18348 }
18349 id++;
18350 }
18351 if(curParam)
18352 break;
18353 }
18354 if(curParam)
18355 {
18356 struct __ecereNameSpace__ecere__com__ClassTemplateArgument arg = tClass->templateArgs[id];
18357 struct Context * context = SetupTemplatesContext(tClass);
18358 struct Type * basicType;
18359
18360 basicType = ProcessTypeString(arg.__anon1.__anon1.dataTypeString, 0);
18361 if(basicType)
18362 {
18363 if(basicType->kind == 21)
18364 {
18365 FreeType(basicType);
18366 basicType = ReplaceThisClassType(_class);
18367 }
18368 FreeType(exp->expType);
18369 exp->expType = __extension__ ({
18370 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
18371
18372 __ecereInstance1->refCount = 1, __ecereInstance1->kind = 13, __ecereInstance1->__anon1.type = basicType, __ecereInstance1;
18373 });
18374 if(!exp->destType)
18375 {
18376 exp->destType = exp->expType;
18377 exp->destType->refCount++;
18378 }
18379 {
18380 struct Expression * newExp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression);
18381 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
18382 struct Declarator * decl;
18383
18384 decl = SpecDeclFromString(arg.__anon1.__anon1.dataTypeString, specs, (((void *)0)));
18385 *newExp = *exp;
18386 if(exp->destType)
18387 exp->destType->refCount++;
18388 if(exp->expType)
18389 exp->expType->refCount++;
18390 exp->type = 11;
18391 exp->__anon1.cast.typeName = MkTypeName(specs, MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), decl));
18392 exp->__anon1.cast.exp = newExp;
18393 }
18394 }
18395 FinishTemplatesContext(context);
18396 }
18397 }
18398 else if(tClass && exp->expType->kind == 8 && exp->expType->__anon1._class && strchr(exp->expType->__anon1._class->string, '<'))
18399 {
18400 struct __ecereNameSpace__ecere__com__Class * expClass = exp->expType->__anon1._class->__anon1.registered;
18401
18402 if(expClass)
18403 {
18404 struct __ecereNameSpace__ecere__com__Class * cClass = (((void *)0));
18405 int p = 0;
18406 int paramCount = 0;
18407 int lastParam = -1;
18408 char templateString[1024];
18409 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * param;
18410
18411 sprintf(templateString, "%s<", expClass->templateClass->fullName);
18412 while(cClass != expClass)
18413 {
18414 struct __ecereNameSpace__ecere__com__Class * sClass;
18415
18416 for(sClass = expClass; sClass && sClass->base != cClass; sClass = sClass->base)
18417 ;
18418 cClass = sClass;
18419 for(param = cClass->templateParams.first; param; param = param->next)
18420 {
18421 struct __ecereNameSpace__ecere__com__Class * cClassCur = (((void *)0));
18422 int cp = 0;
18423 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * paramCur = (((void *)0));
18424 struct __ecereNameSpace__ecere__com__ClassTemplateArgument arg;
18425
18426 while(cClassCur != tClass && !paramCur)
18427 {
18428 struct __ecereNameSpace__ecere__com__Class * sClassCur;
18429
18430 for(sClassCur = tClass; sClassCur && sClassCur->base != cClassCur; sClassCur = sClassCur->base)
18431 ;
18432 cClassCur = sClassCur;
18433 for(paramCur = cClassCur->templateParams.first; paramCur; paramCur = paramCur->next)
18434 {
18435 if(!strcmp(paramCur->name, param->name))
18436 {
18437 break;
18438 }
18439 cp++;
18440 }
18441 }
18442 if(paramCur && paramCur->type == 0)
18443 arg = tClass->templateArgs[cp];
18444 else
18445 arg = expClass->templateArgs[p];
18446 {
18447 char argument[256];
18448
18449 argument[0] = '\0';
18450 switch(param->type)
18451 {
18452 case 2:
18453 {
18454 char expString[1024];
18455 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
18456 struct Declarator * decl = SpecDeclFromString(param->__anon1.dataTypeString, specs, (((void *)0)));
18457 struct Expression * exp;
18458 char * string = PrintHexUInt64(arg.__anon1.expression.__anon1.ui64);
18459
18460 exp = MkExpCast(MkTypeName(specs, decl), MkExpConstant(string));
18461 (__ecereNameSpace__ecere__com__eSystem_Delete(string), string = 0);
18462 ProcessExpressionType(exp);
18463 ComputeExpression(exp);
18464 expString[0] = '\0';
18465 PrintExpression(exp, expString);
18466 strcat(argument, expString);
18467 FreeExpression(exp);
18468 break;
18469 }
18470 case 1:
18471 {
18472 strcat(argument, arg.__anon1.__anon2.__anon1.member->name);
18473 break;
18474 }
18475 case 0:
18476 {
18477 if(arg.__anon1.__anon1.dataTypeString && (!param->defaultArg.__anon1.__anon1.dataTypeString || strcmp(arg.__anon1.__anon1.dataTypeString, param->defaultArg.__anon1.__anon1.dataTypeString)))
18478 strcat(argument, arg.__anon1.__anon1.dataTypeString);
18479 break;
18480 }
18481 }
18482 if(argument[0])
18483 {
18484 if(paramCount)
18485 strcat(templateString, ", ");
18486 if(lastParam != p - 1)
18487 {
18488 strcat(templateString, param->name);
18489 strcat(templateString, " = ");
18490 }
18491 strcat(templateString, argument);
18492 paramCount++;
18493 lastParam = p;
18494 }
18495 }
18496 p++;
18497 }
18498 }
18499 {
18500 int len = strlen(templateString);
18501
18502 if(templateString[len - 1] == '>')
18503 templateString[len++] = ' ';
18504 templateString[len++] = '>';
18505 templateString[len++] = '\0';
18506 }
18507 FreeType(exp->expType);
18508 {
18509 struct Context * context = SetupTemplatesContext(tClass);
18510
18511 exp->expType = ProcessTypeString(templateString, 0);
18512 FinishTemplatesContext(context);
18513 }
18514 }
18515 }
18516 }
18517 }
18518 else
18519 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "undefined class %s\n", (((void *)0))), (id && (!id->_class || id->_class->__anon1.__anon1.name)) ? (id->classSym ? id->classSym->string : (type->__anon1._class ? type->__anon1._class->string : (((void *)0)))) : "(null)");
18520 }
18521 else if(type && (type->kind == 9 || type->kind == 10))
18522 {
18523 struct Type * memberType = exp->__anon1.member.member ? FindMember(type, exp->__anon1.member.member->string) : (((void *)0));
18524
18525 if(memberType)
18526 {
18527 exp->expType = memberType;
18528 if(memberType)
18529 memberType->refCount++;
18530 }
18531 }
18532 else
18533 {
18534 char expString[10240];
18535
18536 expString[0] = '\0';
18537 if(inCompiler)
18538 {
18539 PrintExpression(exp, expString);
18540 __ecereNameSpace__ecere__sys__ChangeCh(expString, '\n', ' ');
18541 }
18542 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "member operator on non-structure type expression %s\n", (((void *)0))), expString);
18543 }
18544 if(exp->expType && exp->expType->kind == 21 && (!exp->destType || exp->destType->kind != 21))
18545 {
18546 if(type && (type->kind == 8 || type->kind == 19 || type->kind == 3 || type->kind == 15))
18547 {
18548 struct Identifier * id = exp->__anon1.member.member;
18549 struct __ecereNameSpace__ecere__com__Class * _class = (id && (!id->_class || id->_class->__anon1.__anon1.name)) ? (id->classSym ? id->classSym->__anon1.registered : (type->__anon1._class ? type->__anon1._class->__anon1.registered : (((void *)0)))) : (((void *)0));
18550
18551 if(_class)
18552 {
18553 FreeType(exp->expType);
18554 exp->expType = ReplaceThisClassType(_class);
18555 }
18556 }
18557 }
18558 yylloc = oldyylloc;
18559 break;
18560 }
18561 case 9:
18562 {
18563 struct Type * destType = exp->destType;
18564
18565 if(exp->__anon1.member.member && exp->__anon1.member.member->_class && exp->__anon1.member.member->_class->__anon1.__anon1.name)
18566 {
18567 exp->__anon1.member.member->classSym = exp->__anon1.member.member->_class->__anon1.__anon1.symbol;
18568 }
18569 exp->__anon1.member.exp = MkExpBrackets(MkListOne(MkExpOp((((void *)0)), '*', exp->__anon1.member.exp)));
18570 exp->type = 8;
18571 if(destType)
18572 destType->count++;
18573 ProcessExpressionType(exp);
18574 if(destType)
18575 destType->count--;
18576 break;
18577 }
18578 case 15:
18579 {
18580 struct Symbol * classSym = exp->__anon1._class->__anon1.__anon1.symbol;
18581
18582 if(classSym && classSym->__anon1.registered)
18583 {
18584 if(classSym->__anon1.registered->type == 5 || (classSym->__anon1.registered->fixed && classSym->__anon1.registered->structSize))
18585 {
18586 char name[1024];
18587 struct __ecereNameSpace__ecere__com__Class * b = classSym->__anon1.registered;
18588
18589 name[0] = '\0';
18590 DeclareStruct(curExternal, classSym->string, 0, 1);
18591 FreeSpecifier(exp->__anon1._class);
18592 FullClassNameCat(name, classSym->string, 0);
18593 if(b->offset == 0)
18594 {
18595 exp->type = 10;
18596 exp->__anon1.typeName = MkTypeName(MkListOne(MkStructOrUnion(3, MkIdentifier(name), (((void *)0)))), (((void *)0)));
18597 }
18598 else
18599 {
18600 struct Expression * e;
18601
18602 exp->type = 4;
18603 if(b->structSize == b->offset)
18604 exp->__anon1.op.exp1 = MkExpConstant("0");
18605 else
18606 exp->__anon1.op.exp1 = MkExpTypeSize(MkTypeName(MkListOne(MkStructOrUnion(3, MkIdentifier(name), (((void *)0)))), (((void *)0))));
18607 exp->__anon1.op.op = '+';
18608 e = exp;
18609 while(b->offset != 0)
18610 {
18611 struct Symbol * sym;
18612 struct Expression * typeSize;
18613
18614 b = b->base;
18615 sym = FindClass(b->fullName);
18616 name[0] = '\0';
18617 DeclareStruct(curExternal, sym->string, 0, 1);
18618 FullClassNameCat(name, sym->string, 0);
18619 if(b->structSize == b->offset)
18620 typeSize = MkExpConstant("0");
18621 else
18622 typeSize = MkExpTypeSize(MkTypeName(MkListOne(MkStructOrUnion(3, MkIdentifier(name), (((void *)0)))), (((void *)0))));
18623 e->__anon1.op.exp2 = b->offset ? MkExpOp(typeSize, '+', (((void *)0))) : typeSize;
18624 e = e->__anon1.op.exp2;
18625 }
18626 }
18627 }
18628 else
18629 {
18630 if(classSym->__anon1.registered->fixed && !classSym->__anon1.registered->structSize)
18631 {
18632 FreeSpecifier(exp->__anon1._class);
18633 exp->__anon1.__anon1.constant = PrintUInt(classSym->__anon1.registered->templateClass ? classSym->__anon1.registered->templateClass->structSize : classSym->__anon1.registered->structSize);
18634 exp->type = 2;
18635 }
18636 else
18637 {
18638 char className[1024];
18639
18640 strcpy(className, "__ecereClass_");
18641 FullClassNameCat(className, classSym->string, 1);
18642 DeclareClass(curExternal, classSym, className);
18643 FreeExpContents(exp);
18644 exp->type = 9;
18645 exp->__anon1.member.exp = MkExpIdentifier(MkIdentifier(className));
18646 exp->__anon1.member.member = MkIdentifier("structSize");
18647 }
18648 }
18649 }
18650 exp->expType = __extension__ ({
18651 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
18652
18653 __ecereInstance1->refCount = 1, __ecereInstance1->kind = 23, __ecereInstance1;
18654 });
18655 break;
18656 }
18657 case 10:
18658 {
18659 struct Type * type = ProcessType(exp->__anon1.typeName->qualifiers, exp->__anon1.typeName->declarator);
18660
18661 exp->expType = __extension__ ({
18662 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
18663
18664 __ecereInstance1->refCount = 1, __ecereInstance1->kind = 23, __ecereInstance1;
18665 });
18666 exp->isConstant = 1;
18667 DeclareType(curExternal, type, 1, 0);
18668 FreeType(type);
18669 break;
18670 }
18671 case 11:
18672 {
18673 struct Type * type = ProcessType(exp->__anon1.cast.typeName->qualifiers, exp->__anon1.cast.typeName->declarator);
18674
18675 type->count = 1;
18676 FreeType(exp->__anon1.cast.exp->destType);
18677 exp->__anon1.cast.exp->destType = type;
18678 type->refCount++;
18679 type->casted = 1;
18680 ProcessExpressionType(exp->__anon1.cast.exp);
18681 type->casted = 0;
18682 type->count = 0;
18683 exp->expType = type;
18684 if(!exp->__anon1.cast.exp->needCast && !NeedCast(exp->__anon1.cast.exp->expType, type))
18685 {
18686 void * prev = exp->prev, * next = exp->next;
18687 struct Type * expType = exp->__anon1.cast.exp->destType;
18688 struct Expression * castExp = exp->__anon1.cast.exp;
18689 struct Type * destType = exp->destType;
18690
18691 if(expType)
18692 expType->refCount++;
18693 FreeType(exp->expType);
18694 FreeTypeName(exp->__anon1.cast.typeName);
18695 *exp = *castExp;
18696 FreeType(exp->expType);
18697 FreeType(exp->destType);
18698 exp->expType = expType;
18699 exp->destType = destType;
18700 ((castExp ? __extension__ ({
18701 void * __ecerePtrToDelete = (castExp);
18702
18703 __ecereClass_Expression->Destructor ? __ecereClass_Expression->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete);
18704 }) : 0), castExp = 0);
18705 exp->prev = prev;
18706 exp->next = next;
18707 }
18708 else
18709 {
18710 exp->isConstant = exp->__anon1.cast.exp->isConstant;
18711 }
18712 break;
18713 }
18714 case 33:
18715 {
18716 struct Type * type = ProcessType(exp->__anon1.initializer.typeName->qualifiers, exp->__anon1.initializer.typeName->declarator);
18717
18718 exp->expType = type;
18719 break;
18720 }
18721 case 34:
18722 {
18723 struct Type * type = ProcessType(exp->__anon1.vaArg.typeName->qualifiers, exp->__anon1.vaArg.typeName->declarator);
18724
18725 ProcessExpressionType(exp->__anon1.vaArg.exp);
18726 exp->expType = type;
18727 break;
18728 }
18729 case 12:
18730 {
18731 struct Expression * e;
18732 struct Type * t = exp->destType;
18733
18734 if(t && !exp->destType->casted)
18735 {
18736 t = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
18737 CopyTypeInto(t, exp->destType);
18738 t->count = 0;
18739 }
18740 else if(t)
18741 t->refCount++;
18742 exp->isConstant = 1;
18743 FreeType(exp->__anon1.cond.cond->destType);
18744 exp->__anon1.cond.cond->destType = MkClassType("bool");
18745 exp->__anon1.cond.cond->destType->truth = 1;
18746 ProcessExpressionType(exp->__anon1.cond.cond);
18747 if(!exp->__anon1.cond.cond->isConstant)
18748 exp->isConstant = 0;
18749 for(e = (*exp->__anon1.cond.exp).first; e; e = e->next)
18750 {
18751 if(!e->next)
18752 {
18753 FreeType(e->destType);
18754 e->destType = t;
18755 if(e->destType)
18756 e->destType->refCount++;
18757 }
18758 ProcessExpressionType(e);
18759 if(!e->next)
18760 {
18761 exp->expType = e->expType;
18762 if(e->expType)
18763 e->expType->refCount++;
18764 }
18765 if(!e->isConstant)
18766 exp->isConstant = 0;
18767 }
18768 FreeType(exp->__anon1.cond.elseExp->destType);
18769 exp->__anon1.cond.elseExp->destType = t ? t : exp->expType;
18770 if(exp->__anon1.cond.elseExp->destType)
18771 exp->__anon1.cond.elseExp->destType->refCount++;
18772 ProcessExpressionType(exp->__anon1.cond.elseExp);
18773 if(!exp->__anon1.cond.elseExp->isConstant)
18774 exp->isConstant = 0;
18775 FreeType(t);
18776 break;
18777 }
18778 case 23:
18779 {
18780 if(exp->__anon1.compound && exp->__anon1.compound->__anon1.compound.statements && (*exp->__anon1.compound->__anon1.compound.statements).last)
18781 {
18782 struct Statement * last = (*exp->__anon1.compound->__anon1.compound.statements).last;
18783
18784 if(last->type == 3 && last->__anon1.expressions && (*last->__anon1.expressions).last)
18785 {
18786 ((struct Expression *)(*last->__anon1.expressions).last)->destType = exp->destType;
18787 if(exp->destType)
18788 exp->destType->refCount++;
18789 }
18790 ProcessStatement(exp->__anon1.compound);
18791 exp->expType = (last->__anon1.expressions && (*last->__anon1.expressions).last) ? ((struct Expression *)(*last->__anon1.expressions).last)->expType : (((void *)0));
18792 if(exp->expType)
18793 exp->expType->refCount++;
18794 }
18795 break;
18796 }
18797 case 24:
18798 {
18799 struct Specifier * spec = (*exp->__anon1._classExp.specifiers).first;
18800
18801 if(spec && spec->type == 1)
18802 {
18803 exp->expType = MkClassType(spec->__anon1.__anon1.name);
18804 exp->expType->kind = 19;
18805 exp->byReference = 1;
18806 }
18807 else
18808 {
18809 exp->expType = MkClassType("ecere::com::Class");
18810 exp->byReference = 1;
18811 }
18812 break;
18813 }
18814 case 25:
18815 {
18816 struct __ecereNameSpace__ecere__com__Class * _class = thisClass ? thisClass : currentClass;
18817
18818 if(_class)
18819 {
18820 struct Identifier * id = exp->__anon1.classData.id;
18821 char structName[1024];
18822 struct Expression * classExp;
18823
18824 strcpy(structName, "__ecereClassData_");
18825 FullClassNameCat(structName, _class->fullName, 0);
18826 exp->type = 9;
18827 exp->__anon1.member.member = id;
18828 if(curCompound && FindSymbol("this", curContext, curCompound->__anon1.compound.context, 0, 0))
18829 classExp = MkExpMember(MkExpIdentifier(MkIdentifier("this")), MkIdentifier("_class"));
18830 else
18831 classExp = MkExpIdentifier(MkIdentifier("class"));
18832 exp->__anon1.member.exp = MkExpBrackets(MkListOne(MkExpCast(MkTypeName(MkListOne(MkStructOrUnion(3, MkIdentifier(structName), (((void *)0)))), MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), (((void *)0)))), MkExpBrackets(MkListOne(MkExpOp(MkExpCast(MkTypeName(MkListOne(MkSpecifier(CHAR)), MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), (((void *)0)))), MkExpMember(classExp, MkIdentifier("data"))), '+', MkExpMember(MkExpClass(MkListOne(MkSpecifierName(_class->fullName)), (((void *)0))), MkIdentifier("offsetClass"))))))));
18833 ProcessExpressionType(exp);
18834 return ;
18835 }
18836 break;
18837 }
18838 case 35:
18839 {
18840 struct Type * type = (((void *)0));
18841 const char * typeString = (((void *)0));
18842 char typeStringBuf[1024];
18843
18844 if(exp->destType && exp->destType->kind == 8 && exp->destType->__anon1._class && exp->destType->__anon1._class->__anon1.registered && exp->destType->__anon1._class->__anon1.registered != containerClass && __ecereNameSpace__ecere__com__eClass_IsDerived(exp->destType->__anon1._class->__anon1.registered, containerClass))
18845 {
18846 struct __ecereNameSpace__ecere__com__Class * templateClass = exp->destType->__anon1._class->__anon1.registered;
18847
18848 typeString = templateClass->templateArgs[2].__anon1.__anon1.dataTypeString;
18849 }
18850 else if(exp->__anon1.list)
18851 {
18852 struct Expression * e;
18853
18854 for(e = (*exp->__anon1.list).first; e; e = e->next)
18855 {
18856 ProcessExpressionType(e);
18857 if(e->expType)
18858 {
18859 if(!type)
18860 {
18861 type = e->expType;
18862 type->refCount++;
18863 }
18864 else
18865 {
18866 if(!MatchTypeExpression(e, type, (((void *)0)), 0, 1))
18867 {
18868 FreeType(type);
18869 type = e->expType;
18870 e->expType = (((void *)0));
18871 e = (*exp->__anon1.list).first;
18872 ProcessExpressionType(e);
18873 if(e->expType)
18874 {
18875 if(!MatchTypeExpression(e, type, (((void *)0)), 0, 1))
18876 {
18877 FreeType(e->expType);
18878 e->expType = (((void *)0));
18879 FreeType(type);
18880 type = (((void *)0));
18881 break;
18882 }
18883 }
18884 }
18885 }
18886 if(e->expType)
18887 {
18888 FreeType(e->expType);
18889 e->expType = (((void *)0));
18890 }
18891 }
18892 }
18893 if(type)
18894 {
18895 typeStringBuf[0] = '\0';
18896 PrintTypeNoConst(type, typeStringBuf, 0, 1);
18897 typeString = typeStringBuf;
18898 FreeType(type);
18899 type = (((void *)0));
18900 }
18901 }
18902 if(typeString)
18903 {
18904 char templateString[1024];
18905 struct __ecereNameSpace__ecere__sys__OldList * initializers = MkList();
18906 struct __ecereNameSpace__ecere__sys__OldList * structInitializers = MkList();
18907 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
18908 struct Expression * expExt;
18909 struct Declarator * decl = SpecDeclFromString(typeString, specs, (((void *)0)));
18910
18911 sprintf(templateString, "Container<%s>", typeString);
18912 if(exp->__anon1.list)
18913 {
18914 struct Expression * e;
18915
18916 type = ProcessTypeString(typeString, 0);
18917 while((e = (*exp->__anon1.list).first))
18918 {
18919 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove((&*exp->__anon1.list), e);
18920 e->destType = type;
18921 type->refCount++;
18922 ProcessExpressionType(e);
18923 ListAdd(initializers, MkInitializerAssignment(e));
18924 }
18925 FreeType(type);
18926 (__ecereNameSpace__ecere__com__eSystem_Delete(exp->__anon1.list), exp->__anon1.list = 0);
18927 }
18928 DeclareStruct(curExternal, "ecere::com::BuiltInContainer", 0, 1);
18929 ListAdd(structInitializers, MkInitializerAssignment(MkExpMember(MkExpClass(MkListOne(MkSpecifierName("BuiltInContainer")), (((void *)0))), MkIdentifier("_vTbl"))));
18930 ProcessExpressionType(((struct Initializer *)(*structInitializers).last)->__anon1.exp);
18931 ListAdd(structInitializers, MkInitializerAssignment(MkExpClass(MkListOne(MkSpecifierName("BuiltInContainer")), (((void *)0)))));
18932 ProcessExpressionType(((struct Initializer *)(*structInitializers).last)->__anon1.exp);
18933 ListAdd(structInitializers, MkInitializerAssignment(MkExpConstant("0")));
18934 ProcessExpressionType(((struct Initializer *)(*structInitializers).last)->__anon1.exp);
18935 ListAdd(structInitializers, MkInitializerAssignment(MkExpExtensionInitializer(MkTypeName(specs, MkDeclaratorArray(decl, (((void *)0)))), MkInitializerList(initializers))));
18936 ProcessExpressionType(((struct Initializer *)(*structInitializers).last)->__anon1.exp);
18937 ListAdd(structInitializers, MkInitializerAssignment(__extension__ ({
18938 struct Expression * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression);
18939
18940 __ecereInstance1->type = 2, __ecereInstance1->__anon1.__anon1.constant = __ecereNameSpace__ecere__com__PrintString(__ecereClass_int, (void *)&(*initializers).count, (void *)0), __ecereInstance1;
18941 })));
18942 ProcessExpressionType(((struct Initializer *)(*structInitializers).last)->__anon1.exp);
18943 ListAdd(structInitializers, MkInitializerAssignment(MkExpClass(CopyList(specs, (void *)(CopySpecifier)), CopyDeclarator(decl))));
18944 ProcessExpressionType(((struct Initializer *)(*structInitializers).last)->__anon1.exp);
18945 exp->expType = ProcessTypeString(templateString, 0);
18946 exp->type = 5;
18947 exp->__anon1.list = MkListOne(MkExpCast(MkTypeName(MkListOne(MkSpecifierName(templateString)), (((void *)0))), MkExpOp((((void *)0)), '&', expExt = MkExpExtensionInitializer(MkTypeName(MkListOne(MkSpecifierName("BuiltInContainer")), (((void *)0))), MkInitializerList(structInitializers)))));
18948 ProcessExpressionType(expExt);
18949 }
18950 else
18951 {
18952 exp->expType = ProcessTypeString("Container", 0);
18953 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Couldn't determine type of array elements\n", (((void *)0))));
18954 }
18955 break;
18956 }
18957 }
18958 if(exp->expType && exp->expType->kind == 21 && thisClass && (!exp->destType || exp->destType->kind != 21))
18959 {
18960 FreeType(exp->expType);
18961 exp->expType = ReplaceThisClassType(thisClass);
18962 }
18963 if(exp->expType && (exp->expType->kind == 9 || exp->expType->kind == 10 || exp->expType->kind == 15) && !exp->expType->__anon1.__anon1.members.first && exp->expType->__anon1.__anon1.enumName)
18964 {
18965 struct Symbol * symbol = FindSymbol(exp->expType->__anon1.__anon1.enumName, curContext, globalContext, 1, 0);
18966
18967 if(symbol)
18968 {
18969 if(exp->expType->kind != 15)
18970 {
18971 struct Type * member;
18972 char * enumName = __ecereNameSpace__ecere__sys__CopyString(exp->expType->__anon1.__anon1.enumName);
18973
18974 FreeType(exp->expType);
18975 exp->expType = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
18976 exp->expType->kind = symbol->type->kind;
18977 exp->expType->refCount++;
18978 exp->expType->__anon1.__anon1.enumName = enumName;
18979 exp->expType->__anon1.__anon1.members = symbol->type->__anon1.__anon1.members;
18980 for(member = symbol->type->__anon1.__anon1.members.first; member; member = member->next)
18981 member->refCount++;
18982 }
18983 else
18984 {
18985 struct __ecereNameSpace__ecere__sys__NamedLink64 * member;
18986
18987 for(member = symbol->type->__anon1.__anon1.members.first; member; member = member->next)
18988 {
18989 struct __ecereNameSpace__ecere__sys__NamedLink64 * value = (value = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(struct __ecereNameSpace__ecere__sys__NamedLink64)), value->name = __ecereNameSpace__ecere__sys__CopyString(member->name), value);
18990
18991 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(&exp->expType->__anon1.__anon1.members, value);
18992 }
18993 }
18994 }
18995 }
18996 if(!notByReference && exp->expType && exp->expType->kind == 8 && exp->expType->__anon1._class && exp->expType->__anon1._class->__anon1.registered && exp->expType->__anon1._class->__anon1.registered->type == 5 && (!exp->destType || (exp->destType->kind != 3 && exp->destType->kind != 4 && exp->destType->kind != 22 && exp->destType->kind != 23 && exp->destType->kind != 5 && exp->destType->kind != 2 && exp->destType->kind != 1 && exp->destType->kind != 24)))
18997 {
18998 exp->byReference = 1;
18999 }
19000 yylloc = exp->loc;
19001 if(exp->destType && (exp->destType->kind == 18))
19002 ;
19003 else if(exp->destType && !exp->destType->keepCast)
19004 {
19005 if(!exp->needTemplateCast && exp->expType && (exp->expType->kind == 20 || exp->expType->passAsTemplate))
19006 exp->needTemplateCast = 1;
19007 if(exp->destType->kind == 0)
19008 ;
19009 else if(!CheckExpressionType(exp, exp->destType, 0, !exp->destType->casted))
19010 {
19011 unsigned int invalidCast = 0;
19012
19013 if(inCompiler && exp->destType->count && exp->expType)
19014 {
19015 struct __ecereNameSpace__ecere__com__Class * c1 = (exp->expType->kind == 8 && exp->expType->__anon1._class) ? exp->expType->__anon1._class->__anon1.registered : (((void *)0));
19016 struct __ecereNameSpace__ecere__com__Class * c2 = (exp->destType->kind == 8 && exp->destType->__anon1._class) ? exp->destType->__anon1._class->__anon1.registered : (((void *)0));
19017
19018 if(c1 && c1->type != 1)
19019 c1 = (((void *)0));
19020 if(c2 && c2->type != 1)
19021 c2 = (((void *)0));
19022 if((c1 && !exp->expType->byReference && !c2 && !__ecereProp_Type_Get_isPointerType(exp->destType)) || (c2 && !exp->destType->byReference && !c1 && !__ecereProp_Type_Get_isPointerType(exp->expType)))
19023 invalidCast = 1;
19024 }
19025 if(!exp->destType->count || unresolved || invalidCast)
19026 {
19027 if(!exp->expType)
19028 {
19029 yylloc = exp->loc;
19030 if(exp->destType->kind != 14)
19031 {
19032 char type2[1024];
19033
19034 type2[0] = '\0';
19035 if(inCompiler)
19036 {
19037 char expString[10240];
19038
19039 expString[0] = '\0';
19040 PrintType(exp->destType, type2, 0, 1);
19041 if(inCompiler)
19042 {
19043 PrintExpression(exp, expString);
19044 __ecereNameSpace__ecere__sys__ChangeCh(expString, '\n', ' ');
19045 }
19046 if(unresolved)
19047 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "unresolved identifier %s; expected %s\n", (((void *)0))), expString, type2);
19048 else if(exp->type != 16)
19049 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "couldn't determine type of %s; expected %s\n", (((void *)0))), expString, type2);
19050 }
19051 }
19052 else
19053 {
19054 char expString[10240];
19055
19056 expString[0] = '\0';
19057 if(inCompiler)
19058 {
19059 PrintExpression(exp, expString);
19060 __ecereNameSpace__ecere__sys__ChangeCh(expString, '\n', ' ');
19061 }
19062 if(unresolved)
19063 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "unresolved identifier %s\n", (((void *)0))), expString);
19064 else if(exp->type != 16)
19065 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "couldn't determine type of %s\n", (((void *)0))), expString);
19066 }
19067 }
19068 else
19069 {
19070 char type1[1024];
19071 char type2[1024];
19072
19073 type1[0] = '\0';
19074 type2[0] = '\0';
19075 if(inCompiler)
19076 {
19077 PrintType(exp->expType, type1, 0, 1);
19078 PrintType(exp->destType, type2, 0, 1);
19079 }
19080 if(exp->destType->truth && exp->destType->__anon1._class && exp->destType->__anon1._class->__anon1.registered && !strcmp(exp->destType->__anon1._class->__anon1.registered->name, "bool") && exp->expType->kind != 0 && exp->expType->kind != 9 && exp->expType->kind != 10 && (exp->expType->kind != 8 || exp->expType->classObjectType || (exp->expType->__anon1._class && exp->expType->__anon1._class->__anon1.registered && exp->expType->__anon1._class->__anon1.registered->type != 1)))
19081 ;
19082 else
19083 {
19084 struct Expression * nbExp = GetNonBracketsExp(exp);
19085 unsigned int skipWarning = 0;
19086 int kind = exp->destType->kind;
19087
19088 if(nbExp->type == 12 && nbExp->destType && !nbExp->destType->casted && nbExp->destType->kind == exp->destType->kind)
19089 skipWarning = 1;
19090 if((kind == 1 || kind == 2) && exp->destType->isSigned == exp->expType->signedBeforePromotion && nbExp->type == 4 && nbExp->__anon1.op.exp1 && nbExp->__anon1.op.exp2)
19091 {
19092 int op = nbExp->__anon1.op.op;
19093 struct Expression * nbExp1, * nbExp2;
19094 int from;
19095
19096 switch(op)
19097 {
19098 case '%':
19099 case '/':
19100 nbExp1 = GetNonBracketsExp(nbExp->__anon1.op.exp1);
19101 from = nbExp1->expType->promotedFrom;
19102 if(from == 1 || (kind == 2 && from == 2))
19103 skipWarning = 1;
19104 break;
19105 case LEFT_OP:
19106 case RIGHT_OP:
19107 nbExp1 = GetNonBracketsExp(nbExp->__anon1.op.exp1);
19108 nbExp2 = GetNonBracketsExp(nbExp->__anon1.op.exp2);
19109 from = nbExp1->expType->promotedFrom;
19110 if(op == RIGHT_OP && (from == 1 || (kind == 2 && from == 2)))
19111 skipWarning = 1;
19112 else if(nbExp2->isConstant && nbExp2->type == 2 && (nbExp->__anon1.op.op == RIGHT_OP || nbExp1->expType->bitMemberSize))
19113 {
19114 int n = strtol(nbExp2->__anon1.__anon1.constant, (((void *)0)), 0);
19115 int s = from == 1 ? 8 : 16;
19116
19117 if(nbExp1->expType->bitMemberSize && nbExp1->expType->bitMemberSize < s)
19118 s = nbExp1->expType->bitMemberSize;
19119 if(nbExp->__anon1.op.op == RIGHT_OP)
19120 s -= n;
19121 else
19122 s += n;
19123 if(s <= (kind == 1 ? 8 : 16))
19124 skipWarning = 1;
19125 }
19126 break;
19127 case '-':
19128 if(!exp->destType->isSigned)
19129 {
19130 nbExp1 = GetNonBracketsExp(nbExp->__anon1.op.exp1);
19131 nbExp2 = GetNonBracketsExp(nbExp->__anon1.op.exp2);
19132 from = nbExp2->expType->promotedFrom;
19133 if((from == 1 || from == 2) && nbExp1->isConstant && nbExp1->type == 2)
19134 {
19135 int n = strtol(nbExp1->__anon1.__anon1.constant, (((void *)0)), 0);
19136
19137 if(n == (from == 1 ? 255 : 65535))
19138 skipWarning = 1;
19139 }
19140 }
19141 break;
19142 case '|':
19143 {
19144 int kind1, kind2;
19145
19146 nbExp1 = GetNonBracketsExp(nbExp->__anon1.op.exp1);
19147 nbExp2 = GetNonBracketsExp(nbExp->__anon1.op.exp2);
19148 kind1 = nbExp1->expType->promotedFrom ? nbExp1->expType->promotedFrom : nbExp1->expType->kind;
19149 kind2 = nbExp2->expType->promotedFrom ? nbExp2->expType->promotedFrom : nbExp2->expType->kind;
19150 if(((kind1 == 1 || (kind1 == 2 && kind == 2)) || MatchTypeExpression(nbExp1, exp->destType, (((void *)0)), 0, 0)) && ((kind2 == 1 || (kind2 == 2 && kind == 2)) || MatchTypeExpression(nbExp2, exp->destType, (((void *)0)), 0, 0)))
19151 skipWarning = 1;
19152 break;
19153 }
19154 case '&':
19155 {
19156 int kind1, kind2;
19157
19158 nbExp1 = GetNonBracketsExp(nbExp->__anon1.op.exp1);
19159 nbExp2 = GetNonBracketsExp(nbExp->__anon1.op.exp2);
19160 kind1 = nbExp1->expType->promotedFrom ? nbExp1->expType->promotedFrom : nbExp1->expType->kind;
19161 kind2 = nbExp2->expType->promotedFrom ? nbExp2->expType->promotedFrom : nbExp2->expType->kind;
19162 if(((kind1 == 1 || (kind1 == 2 && kind == 2)) || MatchTypeExpression(nbExp1, exp->destType, (((void *)0)), 0, 0)) || ((kind2 == 1 || (kind2 == 2 && kind == 2)) || MatchTypeExpression(nbExp2, exp->destType, (((void *)0)), 0, 0)))
19163 skipWarning = 1;
19164 break;
19165 }
19166 }
19167 }
19168 if(!skipWarning)
19169 {
19170 char expString[10240];
19171
19172 expString[0] = '\0';
19173 if(inCompiler)
19174 {
19175 PrintExpression(exp, expString);
19176 __ecereNameSpace__ecere__sys__ChangeCh(expString, '\n', ' ');
19177 }
19178 if(!sourceFile || (!strstr(sourceFile, "src\\lexer.ec") && !strstr(sourceFile, "src/lexer.ec") && !strstr(sourceFile, "src\\grammar.ec") && !strstr(sourceFile, "src/grammar.ec") && !strstr(sourceFile, "src\\type.ec") && !strstr(sourceFile, "src/type.ec") && !strstr(sourceFile, "src\\expression.ec") && !strstr(sourceFile, "src/expression.ec")))
19179 {
19180 if(invalidCast)
19181 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "incompatible expression %s (%s); expected %s\n", (((void *)0))), expString, type1, type2);
19182 else
19183 Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "incompatible expression %s (%s); expected %s\n", (((void *)0))), expString, type1, type2);
19184 }
19185 }
19186 if(!inCompiler)
19187 {
19188 FreeType(exp->expType);
19189 exp->destType->refCount++;
19190 exp->expType = exp->destType;
19191 }
19192 }
19193 }
19194 }
19195 }
19196 else if(exp->destType && exp->destType->kind == 13 && exp->destType->__anon1.type && exp->destType->__anon1.type->kind == 11 && exp->expType && (exp->expType->kind == 11 || exp->expType->kind == 16))
19197 {
19198 struct Expression * nbExp = GetNonBracketsExp(exp);
19199
19200 if(nbExp->type != 11 || !IsVoidPtrCast(nbExp->__anon1.cast.typeName))
19201 {
19202 struct Expression * e = MoveExpContents(exp);
19203
19204 exp->__anon1.cast.exp = MkExpBrackets(MkListOne(e));
19205 exp->type = 11;
19206 exp->__anon1.cast.exp->destType = exp->destType;
19207 if(exp->destType)
19208 exp->destType->refCount++;
19209 exp->__anon1.cast.typeName = MkTypeName(MkListOne(MkSpecifier(VOID)), MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), (((void *)0))));
19210 }
19211 }
19212 }
19213 else if(unresolved)
19214 {
19215 if(exp->__anon1.__anon1.identifier->_class && exp->__anon1.__anon1.identifier->_class->__anon1.__anon1.name)
19216 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "unresolved identifier %s::%s\n", (((void *)0))), exp->__anon1.__anon1.identifier->_class->__anon1.__anon1.name, exp->__anon1.__anon1.identifier->string);
19217 else if(exp->__anon1.__anon1.identifier->string && exp->__anon1.__anon1.identifier->string[0])
19218 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "unresolved identifier %s\n", (((void *)0))), exp->__anon1.__anon1.identifier->string);
19219 }
19220 else if(!exp->expType && exp->type != 16)
19221 {
19222 char expString[10240];
19223
19224 expString[0] = '\0';
19225 if(inCompiler)
19226 {
19227 PrintExpression(exp, expString);
19228 __ecereNameSpace__ecere__sys__ChangeCh(expString, '\n', ' ');
19229 }
19230 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "couldn't determine type of %s\n", (((void *)0))), expString);
19231 }
19232 if(inCompiler)
19233 ApplyAnyObjectLogic(exp);
19234 if(!notByReference && exp->expType && exp->expType->kind == 8 && exp->expType->__anon1._class && exp->expType->__anon1._class->__anon1.registered && exp->expType->__anon1._class->__anon1.registered->type == 5 && (!exp->destType || (exp->destType->kind != 3 && exp->destType->kind != 4 && exp->destType->kind != 22 && exp->destType->kind != 23 && exp->destType->kind != 5 && exp->destType->kind != 2 && exp->destType->kind != 1 && exp->destType->kind != 24)))
19235 {
19236 exp->byReference = 1;
19237 }
19238 yylloc = oldyylloc;
19239 }
19240
19241 static void ProcessFunction(struct FunctionDefinition * function)
19242 {
19243 struct Identifier * id = GetDeclId(function->declarator);
19244 struct Symbol * symbol = function->declarator ? function->declarator->symbol : (((void *)0));
19245 struct Type * type = symbol ? symbol->type : (((void *)0));
19246 struct __ecereNameSpace__ecere__com__Class * oldThisClass = thisClass;
19247 struct Context * oldTopContext = topContext;
19248
19249 yylloc = function->loc;
19250 if(type && type->__anon1.__anon2.thisClass)
19251 {
19252 struct Symbol * classSym = type->__anon1.__anon2.thisClass;
19253 struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1.__anon2.thisClass->__anon1.registered;
19254 char className[1024];
19255 char structName[1024];
19256 struct Declarator * funcDecl;
19257 struct Symbol * thisSymbol;
19258 unsigned int typedObject = 0;
19259
19260 if(_class && !_class->base)
19261 {
19262 _class = currentClass;
19263 if(_class && !_class->symbol)
19264 _class->symbol = FindClass(_class->fullName);
19265 classSym = _class ? _class->symbol : (((void *)0));
19266 typedObject = 1;
19267 }
19268 thisClass = _class;
19269 if(inCompiler && _class)
19270 {
19271 if(type->kind == 11)
19272 {
19273 if(symbol->type->__anon1.__anon2.params.count == 1 && ((struct Type *)symbol->type->__anon1.__anon2.params.first)->kind == 0)
19274 {
19275 struct Type * param = symbol->type->__anon1.__anon2.params.first;
19276
19277 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove(&symbol->type->__anon1.__anon2.params, param);
19278 FreeType(param);
19279 }
19280 if(type->classObjectType != 1)
19281 {
19282 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert(&symbol->type->__anon1.__anon2.params, (((void *)0)), MkClassType(_class->fullName));
19283 symbol->type->__anon1.__anon2.staticMethod = 1;
19284 symbol->type->__anon1.__anon2.thisClass = (((void *)0));
19285 symbol->type->extraParam = 0;
19286 }
19287 }
19288 strcpy(className, "__ecereClass_");
19289 FullClassNameCat(className, _class->fullName, 1);
19290 structName[0] = 0;
19291 FullClassNameCat(structName, _class->fullName, 0);
19292 funcDecl = GetFuncDecl(function->declarator);
19293 if(funcDecl)
19294 {
19295 if(funcDecl->__anon1.function.parameters && (*funcDecl->__anon1.function.parameters).count == 1)
19296 {
19297 struct TypeName * param = (*funcDecl->__anon1.function.parameters).first;
19298
19299 if(param->qualifiers && (*param->qualifiers).count == 1 && ((struct Specifier *)(*param->qualifiers).first)->__anon1.specifier == VOID && !param->declarator)
19300 {
19301 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove((&*funcDecl->__anon1.function.parameters), param);
19302 FreeTypeName(param);
19303 }
19304 }
19305 if(!function->propertyNoThis)
19306 {
19307 struct TypeName * thisParam = (((void *)0));
19308
19309 if(type->classObjectType != 1)
19310 {
19311 thisParam = QMkClass(_class->fullName, MkDeclaratorIdentifier(MkIdentifier("this")));
19312 if(!funcDecl->__anon1.function.parameters)
19313 funcDecl->__anon1.function.parameters = MkList();
19314 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*funcDecl->__anon1.function.parameters), (((void *)0)), thisParam);
19315 }
19316 if(typedObject)
19317 {
19318 if(type->classObjectType != 1)
19319 {
19320 if(type->byReference || _class->type == 3 || _class->type == 1000 || _class->type == 4 || _class->type == 2)
19321 thisParam->declarator = MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), thisParam->declarator);
19322 }
19323 thisParam = __extension__ ({
19324 struct TypeName * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_TypeName);
19325
19326 __ecereInstance1->declarator = MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), MkDeclaratorIdentifier(MkIdentifier("class"))), __ecereInstance1->qualifiers = MkListOne(MkStructOrUnion(3, MkIdentifier("__ecereNameSpace__ecere__com__Class"), (((void *)0)))), __ecereInstance1;
19327 });
19328 DeclareStruct(curExternal, "ecere::com::Class", 0, 1);
19329 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*funcDecl->__anon1.function.parameters), (((void *)0)), thisParam);
19330 }
19331 }
19332 }
19333 if(symbol && symbol->__anon2.__anon1.pointerExternal && symbol->__anon2.__anon1.pointerExternal->type == 1)
19334 {
19335 struct InitDeclarator * initDecl = (*symbol->__anon2.__anon1.pointerExternal->__anon1.declaration->__anon1.__anon1.declarators).first;
19336
19337 funcDecl = GetFuncDecl(initDecl->declarator);
19338 if(funcDecl)
19339 {
19340 if(funcDecl->__anon1.function.parameters && (*funcDecl->__anon1.function.parameters).count == 1)
19341 {
19342 struct TypeName * param = (*funcDecl->__anon1.function.parameters).first;
19343
19344 if(param->qualifiers && (*param->qualifiers).count == 1 && ((struct Specifier *)(*param->qualifiers).first)->__anon1.specifier == VOID && !param->declarator)
19345 {
19346 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove((&*funcDecl->__anon1.function.parameters), param);
19347 FreeTypeName(param);
19348 }
19349 }
19350 if(type->classObjectType != 1)
19351 {
19352 if((_class->type != 2 && _class->type != 3 && _class->type != 4) || function != (struct FunctionDefinition *)symbol->__anon2.__anon2.externalSet)
19353 {
19354 struct TypeName * thisParam = QMkClass(_class->fullName, MkDeclaratorIdentifier(MkIdentifier("this")));
19355
19356 if(!funcDecl->__anon1.function.parameters)
19357 funcDecl->__anon1.function.parameters = MkList();
19358 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*funcDecl->__anon1.function.parameters), (((void *)0)), thisParam);
19359 }
19360 }
19361 }
19362 }
19363 }
19364 if(function->body)
19365 {
19366 if(type->classObjectType != 1)
19367 {
19368 thisSymbol = __extension__ ({
19369 struct Symbol * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Symbol);
19370
19371 __ecereInstance1->string = __ecereNameSpace__ecere__sys__CopyString("this"), __ecereInstance1->type = classSym ? MkClassType(classSym->string) : (((void *)0)), __ecereInstance1;
19372 });
19373 __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Add(&function->body->__anon1.compound.context->symbols, (struct __ecereNameSpace__ecere__sys__BTNode *)thisSymbol);
19374 if(typedObject && thisSymbol->type)
19375 {
19376 thisSymbol->type->classObjectType = 2;
19377 thisSymbol->type->byReference = type->byReference;
19378 thisSymbol->type->typedByReference = type->byReference;
19379 }
19380 }
19381 }
19382 if(inCompiler && _class && _class->type == 0 && type->classObjectType != 1)
19383 {
19384 struct __ecereNameSpace__ecere__com__DataMember * member = (((void *)0));
19385
19386 {
19387 struct __ecereNameSpace__ecere__com__Class * base;
19388
19389 for(base = _class; base && base->type != 1000; base = base->next)
19390 {
19391 for(member = base->membersAndProperties.first; member; member = member->next)
19392 if(!member->isProperty)
19393 break;
19394 if(member)
19395 break;
19396 }
19397 }
19398 for(member = _class->membersAndProperties.first; member; member = member->next)
19399 if(!member->isProperty)
19400 break;
19401 if(member)
19402 {
19403 char pointerName[1024];
19404 struct Declaration * decl;
19405 struct Initializer * initializer;
19406 struct Expression * exp, * bytePtr;
19407
19408 strcpy(pointerName, "__ecerePointer_");
19409 FullClassNameCat(pointerName, _class->fullName, 0);
19410 {
19411 char className[1024];
19412
19413 strcpy(className, "__ecereClass_");
19414 FullClassNameCat(className, classSym->string, 1);
19415 DeclareClass(curExternal, classSym, className);
19416 }
19417 bytePtr = QBrackets(MkExpCast(QMkType("char", QMkPtrDecl((((void *)0)))), QMkExpId("this")));
19418 if(_class->fixed)
19419 {
19420 struct Expression * e;
19421
19422 if(_class->offset && _class->offset == (_class->base->type == 5 ? _class->base->memberOffset : _class->base->structSize))
19423 {
19424 e = MkExpClassSize(MkSpecifierName(_class->base->fullName));
19425 ProcessExpressionType(e);
19426 }
19427 else
19428 {
19429 char string[256];
19430
19431 sprintf(string, "%d", _class->offset);
19432 e = MkExpConstant(string);
19433 }
19434 exp = QBrackets(MkExpOp(bytePtr, '+', e));
19435 }
19436 else
19437 {
19438 exp = QBrackets(MkExpOp(bytePtr, '+', MkExpPointer(QMkExpId(className), MkIdentifier("offset"))));
19439 }
19440 exp = QBrackets(QMkExpCond(QMkExpId("this"), exp, MkExpConstant("0")));
19441 exp->expType = __extension__ ({
19442 struct Type * __ecereInstance2 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
19443
19444 __ecereInstance2->refCount = 1, __ecereInstance2->kind = 13, __ecereInstance2->__anon1.type = __extension__ ({
19445 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
19446
19447 __ecereInstance1->refCount = 1, __ecereInstance1->kind = 0, __ecereInstance1;
19448 }), __ecereInstance2;
19449 });
19450 if(function->body)
19451 {
19452 yylloc = function->body->loc;
19453 initializer = MkInitializerAssignment(MkExpCast(MkTypeName(MkListOne(MkStructOrUnion(3, MkIdentifier(structName), (((void *)0)))), MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), (((void *)0)))), exp));
19454 {
19455 struct Context * prevContext = curContext;
19456 struct __ecereNameSpace__ecere__sys__OldList * list;
19457
19458 curContext = function->body->__anon1.compound.context;
19459 decl = MkDeclaration((list = MkListOne(MkStructOrUnion(3, MkIdentifier(structName), (((void *)0))))), MkListOne(MkInitDeclarator(QMkPtrDecl(pointerName), initializer)));
19460 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*list), (((void *)0)), MkSpecifierExtended(MkExtDeclAttrib(MkAttrib(ATTRIB, MkListOne(MkAttribute(__ecereNameSpace__ecere__sys__CopyString("unused"), (((void *)0))))))));
19461 curContext = prevContext;
19462 }
19463 decl->symbol = (((void *)0));
19464 if(!function->body->__anon1.compound.declarations)
19465 function->body->__anon1.compound.declarations = MkList();
19466 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*function->body->__anon1.compound.declarations), (((void *)0)), decl);
19467 }
19468 }
19469 }
19470 }
19471 else
19472 thisClass = (((void *)0));
19473 if(id)
19474 {
19475 FreeSpecifier(id->_class);
19476 id->_class = (((void *)0));
19477 if(symbol && symbol->__anon2.__anon1.pointerExternal && symbol->__anon2.__anon1.pointerExternal->type == 1)
19478 {
19479 struct InitDeclarator * initDecl = (*symbol->__anon2.__anon1.pointerExternal->__anon1.declaration->__anon1.__anon1.declarators).first;
19480
19481 id = GetDeclId(initDecl->declarator);
19482 FreeSpecifier(id->_class);
19483 id->_class = (((void *)0));
19484 }
19485 }
19486 if(function->body)
19487 topContext = function->body->__anon1.compound.context;
19488 {
19489 struct FunctionDefinition * oldFunction = curFunction;
19490
19491 curFunction = function;
19492 if(function->body)
19493 ProcessStatement(function->body);
19494 if(inCompiler && function->propSet && !function->propSet->fireWatchersDone)
19495 {
19496 struct Statement * prevCompound = curCompound;
19497 struct Context * prevContext = curContext;
19498 struct Statement * fireWatchers = MkFireWatchersStmt((((void *)0)), (((void *)0)));
19499
19500 if(!function->body->__anon1.compound.statements)
19501 function->body->__anon1.compound.statements = MkList();
19502 ListAdd(function->body->__anon1.compound.statements, fireWatchers);
19503 curCompound = function->body;
19504 curContext = function->body->__anon1.compound.context;
19505 ProcessStatement(fireWatchers);
19506 curContext = prevContext;
19507 curCompound = prevCompound;
19508 }
19509 curFunction = oldFunction;
19510 }
19511 if(function->declarator)
19512 {
19513 ProcessDeclarator(function->declarator, 1);
19514 }
19515 topContext = oldTopContext;
19516 thisClass = oldThisClass;
19517 }
19518
19519 static void ProcessClass(struct __ecereNameSpace__ecere__sys__OldList * definitions, struct Symbol * symbol)
19520 {
19521 struct ClassDef * def;
19522 struct External * external = curExternal;
19523 struct __ecereNameSpace__ecere__com__Class * regClass = symbol ? symbol->__anon1.registered : (((void *)0));
19524
19525 for(def = definitions->first; def; def = def->next)
19526 {
19527 if(def->type == 0)
19528 {
19529 if(def->__anon1.function->declarator)
19530 curExternal = def->__anon1.function->declarator->symbol->__anon2.__anon1.pointerExternal;
19531 else
19532 curExternal = external;
19533 ProcessFunction((struct FunctionDefinition *)def->__anon1.function);
19534 }
19535 else if(def->type == 2)
19536 {
19537 if(def->__anon1.decl->type == 2)
19538 {
19539 thisClass = regClass;
19540 ProcessInstantiationType(def->__anon1.decl->__anon1.inst);
19541 thisClass = (((void *)0));
19542 }
19543 else
19544 {
19545 struct __ecereNameSpace__ecere__com__Class * backThisClass = thisClass;
19546
19547 if(regClass)
19548 thisClass = regClass;
19549 ProcessDeclaration(def->__anon1.decl, symbol ? 1 : 0);
19550 thisClass = backThisClass;
19551 }
19552 }
19553 else if(def->type == 1 && def->__anon1.defProperties)
19554 {
19555 struct MemberInit * defProperty;
19556 struct Symbol * thisSymbol = (thisSymbol = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Symbol), thisSymbol->string = __ecereNameSpace__ecere__sys__CopyString("this"), thisSymbol->type = regClass ? MkClassType(regClass->fullName) : (((void *)0)), thisSymbol);
19557
19558 __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Add(&globalContext->symbols, (struct __ecereNameSpace__ecere__sys__BTNode *)thisSymbol);
19559 for(defProperty = (*def->__anon1.defProperties).first; defProperty; defProperty = defProperty->next)
19560 {
19561 thisClass = regClass;
19562 ProcessMemberInitData(defProperty, regClass, (((void *)0)), (((void *)0)), (((void *)0)), (((void *)0)));
19563 thisClass = (((void *)0));
19564 }
19565 __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Remove(&globalContext->symbols, (struct __ecereNameSpace__ecere__sys__BTNode *)thisSymbol);
19566 FreeSymbol(thisSymbol);
19567 }
19568 else if(def->type == 3 && def->__anon1.propertyDef)
19569 {
19570 struct PropertyDef * prop = def->__anon1.propertyDef;
19571
19572 thisClass = regClass;
19573 if(prop->setStmt)
19574 {
19575 if(regClass)
19576 {
19577 struct Symbol * thisSymbol = (thisSymbol = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Symbol), thisSymbol->string = __ecereNameSpace__ecere__sys__CopyString("this"), thisSymbol->type = MkClassType(regClass->fullName), thisSymbol);
19578
19579 __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Add(&prop->setStmt->__anon1.compound.context->symbols, (struct __ecereNameSpace__ecere__sys__BTNode *)thisSymbol);
19580 }
19581 curExternal = prop->symbol ? prop->symbol->__anon2.__anon2.externalSet : (((void *)0));
19582 ProcessStatement(prop->setStmt);
19583 }
19584 if(prop->getStmt)
19585 {
19586 if(regClass)
19587 {
19588 struct Symbol * thisSymbol = (thisSymbol = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Symbol), thisSymbol->string = __ecereNameSpace__ecere__sys__CopyString("this"), thisSymbol->type = MkClassType(regClass->fullName), thisSymbol);
19589
19590 __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Add(&prop->getStmt->__anon1.compound.context->symbols, (struct __ecereNameSpace__ecere__sys__BTNode *)thisSymbol);
19591 }
19592 curExternal = prop->symbol ? prop->symbol->__anon2.__anon2.externalGet : (((void *)0));
19593 ProcessStatement(prop->getStmt);
19594 }
19595 if(prop->issetStmt)
19596 {
19597 if(regClass)
19598 {
19599 struct Symbol * thisSymbol = (thisSymbol = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Symbol), thisSymbol->string = __ecereNameSpace__ecere__sys__CopyString("this"), thisSymbol->type = MkClassType(regClass->fullName), thisSymbol);
19600
19601 __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Add(&prop->issetStmt->__anon1.compound.context->symbols, (struct __ecereNameSpace__ecere__sys__BTNode *)thisSymbol);
19602 }
19603 curExternal = prop->symbol ? prop->symbol->__anon2.__anon2.externalIsSet : (((void *)0));
19604 ProcessStatement(prop->issetStmt);
19605 }
19606 thisClass = (((void *)0));
19607 }
19608 else if(def->type == 4 && def->__anon1.propertyWatch)
19609 {
19610 struct PropertyWatch * propertyWatch = def->__anon1.propertyWatch;
19611
19612 thisClass = regClass;
19613 if(propertyWatch->compound)
19614 {
19615 struct Symbol * thisSymbol = (thisSymbol = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Symbol), thisSymbol->string = __ecereNameSpace__ecere__sys__CopyString("this"), thisSymbol->type = regClass ? MkClassType(regClass->fullName) : (((void *)0)), thisSymbol);
19616
19617 __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Add(&propertyWatch->compound->__anon1.compound.context->symbols, (struct __ecereNameSpace__ecere__sys__BTNode *)thisSymbol);
19618 curExternal = (((void *)0));
19619 ProcessStatement(propertyWatch->compound);
19620 }
19621 thisClass = (((void *)0));
19622 }
19623 }
19624 }
19625
19626 void __ecereRegisterModule_pass15(struct __ecereNameSpace__ecere__com__Instance * module)
19627 {
19628 struct __ecereNameSpace__ecere__com__Class __attribute__((unused)) * class;
19629
19630 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("SetYydebug", "void SetYydebug(bool b)", SetYydebug, module, 1);
19631 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("SetThisClass", "void SetThisClass(ecere::com::Class c)", SetThisClass, module, 1);
19632 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetThisClass", "ecere::com::Class GetThisClass(void)", GetThisClass, module, 1);
19633 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintExpression", "void PrintExpression(Expression exp, char * string)", PrintExpression, module, 1);
19634 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ProcessTemplateParameterType", "Type ProcessTemplateParameterType(TemplateParameter param)", ProcessTemplateParameterType, module, 2);
19635 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("NeedCast", "bool NeedCast(Type type1, Type type2)", NeedCast, module, 2);
19636 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintInt", "char * PrintInt(int64 result)", PrintInt, module, 1);
19637 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintUInt", "char * PrintUInt(uint64 result)", PrintUInt, module, 1);
19638 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintInt64", "char * PrintInt64(int64 result)", PrintInt64, module, 1);
19639 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintUInt64", "char * PrintUInt64(uint64 result)", PrintUInt64, module, 1);
19640 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintHexUInt", "char * PrintHexUInt(uint64 result)", PrintHexUInt, module, 1);
19641 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintHexUInt64", "char * PrintHexUInt64(uint64 result)", PrintHexUInt64, module, 1);
19642 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintShort", "char * PrintShort(short result)", PrintShort, module, 1);
19643 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintUShort", "char * PrintUShort(uint16 result)", PrintUShort, module, 1);
19644 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintChar", "char * PrintChar(char result)", PrintChar, module, 1);
19645 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintUChar", "char * PrintUChar(byte result)", PrintUChar, module, 1);
19646 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintFloat", "char * PrintFloat(float result)", PrintFloat, module, 1);
19647 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintDouble", "char * PrintDouble(double result)", PrintDouble, module, 1);
19648 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpInt", "bool GetOpInt(Operand op2, int * value2)", GetOpInt, module, 1);
19649 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetInt", "bool GetInt(Expression exp, int * value2)", GetInt, module, 1);
19650 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpUInt", "bool GetOpUInt(Operand op2, uint * value2)", GetOpUInt, module, 1);
19651 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetUInt", "bool GetUInt(Expression exp, uint * value2)", GetUInt, module, 1);
19652 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpInt64", "bool GetOpInt64(Operand op2, int64 * value2)", GetOpInt64, module, 1);
19653 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetInt64", "bool GetInt64(Expression exp, int64 * value2)", GetInt64, module, 1);
19654 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpUInt64", "bool GetOpUInt64(Operand op2, uint64 * value2)", GetOpUInt64, module, 1);
19655 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetUInt64", "bool GetUInt64(Expression exp, uint64 * value2)", GetUInt64, module, 1);
19656 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpIntPtr", "bool GetOpIntPtr(Operand op2, intptr * value2)", GetOpIntPtr, module, 1);
19657 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetIntPtr", "bool GetIntPtr(Expression exp, intptr * value2)", GetIntPtr, module, 1);
19658 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpUIntPtr", "bool GetOpUIntPtr(Operand op2, uintptr * value2)", GetOpUIntPtr, module, 1);
19659 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetUIntPtr", "bool GetUIntPtr(Expression exp, uintptr * value2)", GetUIntPtr, module, 1);
19660 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpIntSize", "bool GetOpIntSize(Operand op2, intsize * value2)", GetOpIntSize, module, 1);
19661 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetIntSize", "bool GetIntSize(Expression exp, intsize * value2)", GetIntSize, module, 1);
19662 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpUIntSize", "bool GetOpUIntSize(Operand op2, uintsize * value2)", GetOpUIntSize, module, 1);
19663 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetUIntSize", "bool GetUIntSize(Expression exp, uintsize * value2)", GetUIntSize, module, 1);
19664 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpShort", "bool GetOpShort(Operand op2, short * value2)", GetOpShort, module, 1);
19665 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetShort", "bool GetShort(Expression exp, short * value2)", GetShort, module, 1);
19666 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpUShort", "bool GetOpUShort(Operand op2, uint16 * value2)", GetOpUShort, module, 1);
19667 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetUShort", "bool GetUShort(Expression exp, uint16 * value2)", GetUShort, module, 1);
19668 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpChar", "bool GetOpChar(Operand op2, char * value2)", GetOpChar, module, 1);
19669 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetChar", "bool GetChar(Expression exp, char * value2)", GetChar, module, 1);
19670 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpUChar", "bool GetOpUChar(Operand op2, byte * value2)", GetOpUChar, module, 1);
19671 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetUChar", "bool GetUChar(Expression exp, byte * value2)", GetUChar, module, 1);
19672 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpFloat", "bool GetOpFloat(Operand op2, float * value2)", GetOpFloat, module, 1);
19673 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetFloat", "bool GetFloat(Expression exp, float * value2)", GetFloat, module, 1);
19674 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpDouble", "bool GetOpDouble(Operand op2, double * value2)", GetOpDouble, module, 1);
19675 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetDouble", "bool GetDouble(Expression exp, double * value2)", GetDouble, module, 1);
19676 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ComputeClassMembers", "void ComputeClassMembers(ecere::com::Class _class, bool isMember)", ComputeClassMembers, module, 2);
19677 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ComputeModuleClasses", "void ComputeModuleClasses(ecere::com::Module module)", ComputeModuleClasses, module, 1);
19678 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ComputeTypeSize", "int ComputeTypeSize(Type type)", ComputeTypeSize, module, 1);
19679 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("AddMembers", "int AddMembers(External neededBy, ecere::sys::OldList * declarations, ecere::com::Class _class, bool isMember, uint * retSize, ecere::com::Class topClass, bool * addedPadding)", AddMembers, module, 2);
19680 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("DeclareStruct", "External DeclareStruct(External neededBy, const char * name, bool skipNoHead, bool needDereference)", DeclareStruct, module, 2);
19681 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("_DeclareStruct", "External _DeclareStruct(External neededBy, const char * name, bool skipNoHead, bool needDereference, bool fwdDecl)", _DeclareStruct, module, 2);
19682 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("DeclareProperty", "void DeclareProperty(External neededBy, ecere::com::Property prop, char * setName, char * getName)", DeclareProperty, module, 2);
19683 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("Dereference", "Type Dereference(Type source)", Dereference, module, 1);
19684 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ProcessMemberInitData", "void ProcessMemberInitData(MemberInit member, ecere::com::Class _class, ecere::com::Class * curClass, ecere::com::DataMember * curMember, ecere::com::DataMember * subMemberStack, int * subMemberStackPos)", ProcessMemberInitData, module, 2);
19685 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ProcessInstantiationType", "void ProcessInstantiationType(Instantiation inst)", ProcessInstantiationType, module, 2);
19686 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("DeclareType", "void DeclareType(External neededFor, Type type, bool needDereference, bool forFunctionDef)", DeclareType, module, 2);
19687 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("DeclareTypeForwardDeclare", "void DeclareTypeForwardDeclare(External neededFor, Type type, bool needDereference, bool forFunctionDef)", DeclareTypeForwardDeclare, module, 2);
19688 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("FindTemplateArg", "ecere::com::ClassTemplateArgument * FindTemplateArg(ecere::com::Class _class, TemplateParameter param)", FindTemplateArg, module, 2);
19689 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("SetupTemplatesContext", "Context SetupTemplatesContext(ecere::com::Class _class)", SetupTemplatesContext, module, 1);
19690 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("FinishTemplatesContext", "void FinishTemplatesContext(Context context)", FinishTemplatesContext, module, 1);
19691 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ProcessMethodType", "void ProcessMethodType(ecere::com::Method method)", ProcessMethodType, module, 1);
19692 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ProcessPropertyType", "void ProcessPropertyType(ecere::com::Property prop)", ProcessPropertyType, module, 1);
19693 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("DeclareMethod", "void DeclareMethod(External neededFor, ecere::com::Method method, const char * name)", DeclareMethod, module, 1);
19694 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ReplaceThisClass", "char * ReplaceThisClass(ecere::com::Class _class)", ReplaceThisClass, module, 2);
19695 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ReplaceThisClassType", "Type ReplaceThisClassType(ecere::com::Class _class)", ReplaceThisClassType, module, 2);
19696 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ReplaceThisClassSpecifiers", "void ReplaceThisClassSpecifiers(ecere::sys::OldList specs, ecere::com::Class _class)", ReplaceThisClassSpecifiers, module, 2);
19697 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("DeclareFunction", "bool DeclareFunction(External neededFor, ecere::com::GlobalFunction function, char * name)", DeclareFunction, module, 2);
19698 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("DeclareGlobalData", "void DeclareGlobalData(External neededFor, GlobalData data)", DeclareGlobalData, module, 2);
19699 class = __ecereNameSpace__ecere__com__eSystem_RegisterClass(5, "Conversion", 0, sizeof(struct Conversion), 0, (void *)0, (void *)0, module, 2, 1);
19700 if(((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application == ((struct __ecereNameSpace__ecere__com__Module *)(((char *)__thisModule + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application && class)
19701 __ecereClass_Conversion = class;
19702 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("MatchTypes", "bool MatchTypes(Type source, Type dest, ecere::sys::OldList conversions, ecere::com::Class owningClassSource, ecere::com::Class owningClassDest, bool doConversion, bool enumBaseType, bool acceptReversedParams, bool isConversionExploration, bool warnConst)", MatchTypes, module, 1);
19703 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("MatchWithEnums_NameSpace", "bool MatchWithEnums_NameSpace(ecere::com::NameSpace nameSpace, Expression sourceExp, Type dest, char * string, ecere::sys::OldList conversions)", MatchWithEnums_NameSpace, module, 2);
19704 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ModuleVisibility", "bool ModuleVisibility(ecere::com::Module searchIn, ecere::com::Module searchFor)", ModuleVisibility, module, 1);
19705 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("MatchWithEnums_Module", "bool MatchWithEnums_Module(ecere::com::Module mainModule, Expression sourceExp, Type dest, char * string, ecere::sys::OldList conversions)", MatchWithEnums_Module, module, 2);
19706 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("MatchTypeExpression", "bool MatchTypeExpression(Expression sourceExp, Type dest, ecere::sys::OldList conversions, bool skipUnitBla, bool warnConst)", MatchTypeExpression, module, 2);
19707 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ReadString", "void ReadString(char * output, char * string)", ReadString, module, 1);
19708 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("UnescapeString", "int UnescapeString(char * d, char * s, int len)", UnescapeString, module, 1);
19709 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("OffsetEscapedString", "char * OffsetEscapedString(char * s, int len, int offset)", OffsetEscapedString, module, 1);
19710 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOperand", "Operand GetOperand(Expression exp)", GetOperand, module, 1);
19711 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PopulateInstance", "void PopulateInstance(Instantiation inst)", PopulateInstance, module, 1);
19712 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ComputeInstantiation", "void ComputeInstantiation(Expression exp)", ComputeInstantiation, module, 1);
19713 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("CallOperator", "void CallOperator(Expression exp, Expression exp1, Expression exp2, Operand op1, Operand op2)", CallOperator, module, 1);
19714 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ComputeExpression", "void ComputeExpression(Expression exp)", ComputeExpression, module, 1);
19715 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("modifyPassAsTemplate", "void modifyPassAsTemplate(Type * typePtr, bool value)", modifyPassAsTemplate, module, 1);
19716 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("CheckTemplateTypes", "void CheckTemplateTypes(Expression exp)", CheckTemplateTypes, module, 1);
19717 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("FindSymbol", "Symbol FindSymbol(const char * name, Context startContext, Context endContext, bool isStruct, bool globalNameSpace)", FindSymbol, module, 1);
19718 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintType", "void PrintType(Type type, char * string, bool printName, bool fullName)", PrintType, module, 1);
19719 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintTypeNoConst", "void PrintTypeNoConst(Type type, char * string, bool printName, bool fullName)", PrintTypeNoConst, module, 1);
19720 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("FindMemberAndOffset", "Type FindMemberAndOffset(Type type, char * string, uint * offset)", FindMemberAndOffset, module, 1);
19721 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetParseError", "bool GetParseError(void)", GetParseError, module, 1);
19722 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ParseExpressionString", "Expression ParseExpressionString(char * expression)", ParseExpressionString, module, 1);
19723 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ReplaceExpContents", "void ReplaceExpContents(Expression checkedExp, Expression newExp)", ReplaceExpContents, module, 1);
19724 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ApplyAnyObjectLogic", "void ApplyAnyObjectLogic(Expression e)", ApplyAnyObjectLogic, module, 1);
19725 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ApplyLocation", "void ApplyLocation(Expression exp, Location loc)", ApplyLocation, module, 1);
19726 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("RelatedUnits", "bool RelatedUnits(ecere::com::Class c1, ecere::com::Class c2)", RelatedUnits, module, 1);
19727 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ProcessExpressionType", "void ProcessExpressionType(Expression exp)", ProcessExpressionType, module, 1);
19728 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("DeclareFunctionUtil", "void DeclareFunctionUtil(External neededBy, const String s)", DeclareFunctionUtil, module, 1);
19729 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ComputeDataTypes", "void ComputeDataTypes(void)", ComputeDataTypes, module, 1);
19730 }
19731