compiler/libec: Added grammar rule for __builtin_offset
[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 needTemplateCast;
1404 } ecere_gcc_struct;
1405
1406 extern struct InitDeclarator * MkInitDeclarator(struct Declarator * declarator, struct Initializer * initializer);
1407
1408 struct Initializer
1409 {
1410 struct Initializer * prev;
1411 struct Initializer * next;
1412 struct Location loc;
1413 int type;
1414 union
1415 {
1416 struct Expression * exp;
1417 struct __ecereNameSpace__ecere__sys__OldList *  list;
1418 } ecere_gcc_struct __anon1;
1419 unsigned int isConstant;
1420 struct Identifier * id;
1421 } ecere_gcc_struct;
1422
1423 extern struct Initializer * MkInitializerAssignment(struct Expression * exp);
1424
1425 extern struct Expression * MkExpExtensionInitializer(struct TypeName * typeName, struct Initializer * initializer);
1426
1427 extern struct Initializer * MkInitializerList(struct __ecereNameSpace__ecere__sys__OldList * list);
1428
1429 struct InitDeclarator
1430 {
1431 struct InitDeclarator * prev;
1432 struct InitDeclarator * next;
1433 struct Location loc;
1434 struct Declarator * declarator;
1435 struct Initializer * initializer;
1436 } ecere_gcc_struct;
1437
1438 void ApplyLocation(struct Expression * exp, struct Location * loc)
1439 {
1440 exp->loc = *loc;
1441 switch(exp->type)
1442 {
1443 case 4:
1444 if(exp->__anon1.op.exp1)
1445 ApplyLocation(exp->__anon1.op.exp1, loc);
1446 if(exp->__anon1.op.exp2)
1447 ApplyLocation(exp->__anon1.op.exp2, loc);
1448 break;
1449 case 5:
1450 if(exp->__anon1.list)
1451 {
1452 struct Expression * e;
1453
1454 for(e = (*exp->__anon1.list).first; e; e = e->next)
1455 ApplyLocation(e, loc);
1456 }
1457 break;
1458 case 6:
1459 if(exp->__anon1.index.index)
1460 {
1461 struct Expression * e;
1462
1463 for(e = (*exp->__anon1.index.index).first; e; e = e->next)
1464 ApplyLocation(e, loc);
1465 }
1466 if(exp->__anon1.index.exp)
1467 ApplyLocation(exp->__anon1.index.exp, loc);
1468 break;
1469 case 7:
1470 if(exp->__anon1.call.arguments)
1471 {
1472 struct Expression * arg;
1473
1474 for(arg = (*exp->__anon1.call.arguments).first; arg; arg = arg->next)
1475 ApplyLocation(arg, loc);
1476 }
1477 if(exp->__anon1.call.exp)
1478 ApplyLocation(exp->__anon1.call.exp, loc);
1479 break;
1480 case 8:
1481 case 9:
1482 if(exp->__anon1.member.exp)
1483 ApplyLocation(exp->__anon1.member.exp, loc);
1484 break;
1485 case 11:
1486 if(exp->__anon1.cast.exp)
1487 ApplyLocation(exp->__anon1.cast.exp, loc);
1488 break;
1489 case 12:
1490 if(exp->__anon1.cond.exp)
1491 {
1492 struct Expression * e;
1493
1494 for(e = (*exp->__anon1.cond.exp).first; e; e = e->next)
1495 ApplyLocation(e, loc);
1496 }
1497 if(exp->__anon1.cond.cond)
1498 ApplyLocation(exp->__anon1.cond.cond, loc);
1499 if(exp->__anon1.cond.elseExp)
1500 ApplyLocation(exp->__anon1.cond.elseExp, loc);
1501 break;
1502 case 34:
1503 if(exp->__anon1.vaArg.exp)
1504 ApplyLocation(exp->__anon1.vaArg.exp, loc);
1505 break;
1506 default:
1507 break;
1508 }
1509 }
1510
1511 void __ecereMethod_Expression_Clear();
1512
1513 struct MembersInit;
1514
1515 struct MembersInit
1516 {
1517 struct MembersInit * prev;
1518 struct MembersInit * next;
1519 struct Location loc;
1520 int type;
1521 union
1522 {
1523 struct __ecereNameSpace__ecere__sys__OldList *  dataMembers;
1524 struct ClassFunction * function;
1525 } ecere_gcc_struct __anon1;
1526 } ecere_gcc_struct;
1527
1528 extern struct MembersInit * MkMembersInitList(struct __ecereNameSpace__ecere__sys__OldList * dataMembers);
1529
1530 struct Operand;
1531
1532 struct OpTable
1533 {
1534 unsigned int (*  Add)(struct Expression *, struct Operand *, struct Operand *);
1535 unsigned int (*  Sub)(struct Expression *, struct Operand *, struct Operand *);
1536 unsigned int (*  Mul)(struct Expression *, struct Operand *, struct Operand *);
1537 unsigned int (*  Div)(struct Expression *, struct Operand *, struct Operand *);
1538 unsigned int (*  Mod)(struct Expression *, struct Operand *, struct Operand *);
1539 unsigned int (*  Neg)(struct Expression *, struct Operand *);
1540 unsigned int (*  Inc)(struct Expression *, struct Operand *);
1541 unsigned int (*  Dec)(struct Expression *, struct Operand *);
1542 unsigned int (*  Asign)(struct Expression *, struct Operand *, struct Operand *);
1543 unsigned int (*  AddAsign)(struct Expression *, struct Operand *, struct Operand *);
1544 unsigned int (*  SubAsign)(struct Expression *, struct Operand *, struct Operand *);
1545 unsigned int (*  MulAsign)(struct Expression *, struct Operand *, struct Operand *);
1546 unsigned int (*  DivAsign)(struct Expression *, struct Operand *, struct Operand *);
1547 unsigned int (*  ModAsign)(struct Expression *, struct Operand *, struct Operand *);
1548 unsigned int (*  BitAnd)(struct Expression *, struct Operand *, struct Operand *);
1549 unsigned int (*  BitOr)(struct Expression *, struct Operand *, struct Operand *);
1550 unsigned int (*  BitXor)(struct Expression *, struct Operand *, struct Operand *);
1551 unsigned int (*  LShift)(struct Expression *, struct Operand *, struct Operand *);
1552 unsigned int (*  RShift)(struct Expression *, struct Operand *, struct Operand *);
1553 unsigned int (*  BitNot)(struct Expression *, struct Operand *);
1554 unsigned int (*  AndAsign)(struct Expression *, struct Operand *, struct Operand *);
1555 unsigned int (*  OrAsign)(struct Expression *, struct Operand *, struct Operand *);
1556 unsigned int (*  XorAsign)(struct Expression *, struct Operand *, struct Operand *);
1557 unsigned int (*  LShiftAsign)(struct Expression *, struct Operand *, struct Operand *);
1558 unsigned int (*  RShiftAsign)(struct Expression *, struct Operand *, struct Operand *);
1559 unsigned int (*  Not)(struct Expression *, struct Operand *);
1560 unsigned int (*  Equ)(struct Expression *, struct Operand *, struct Operand *);
1561 unsigned int (*  Nqu)(struct Expression *, struct Operand *, struct Operand *);
1562 unsigned int (*  And)(struct Expression *, struct Operand *, struct Operand *);
1563 unsigned int (*  Or)(struct Expression *, struct Operand *, struct Operand *);
1564 unsigned int (*  Grt)(struct Expression *, struct Operand *, struct Operand *);
1565 unsigned int (*  Sma)(struct Expression *, struct Operand *, struct Operand *);
1566 unsigned int (*  GrtEqu)(struct Expression *, struct Operand *, struct Operand *);
1567 unsigned int (*  SmaEqu)(struct Expression *, struct Operand *, struct Operand *);
1568 unsigned int (*  Cond)(struct Expression *, struct Operand *, struct Operand *, struct Operand *);
1569 } ecere_gcc_struct;
1570
1571 struct Operand
1572 {
1573 int kind;
1574 struct Type * type;
1575 unsigned int ptrSize;
1576 union
1577 {
1578 char c;
1579 unsigned char uc;
1580 short s;
1581 unsigned short us;
1582 int i;
1583 unsigned int ui;
1584 float f;
1585 double d;
1586 long long i64;
1587 uint64 ui64;
1588 } ecere_gcc_struct __anon1;
1589 struct OpTable ops;
1590 } ecere_gcc_struct;
1591
1592 struct External *  _DeclareStruct(struct External *  neededBy, const char *  name, unsigned int skipNoHead, unsigned int needDereference, unsigned int fwdDecl);
1593
1594 struct External * DeclareStruct(struct External * neededBy, const char * name, unsigned int skipNoHead, unsigned int needDereference)
1595 {
1596 return _DeclareStruct(neededBy, name, skipNoHead, needDereference, 0);
1597 }
1598
1599 static void _DeclareType(struct External *  neededFor, struct Type *  type, unsigned int needDereference, unsigned int forFunctionDef, unsigned int fwdDecl);
1600
1601 void DeclareType(struct External * neededFor, struct Type * type, unsigned int needDereference, unsigned int forFunctionDef)
1602 {
1603 _DeclareType(neededFor, type, needDereference, forFunctionDef, 0);
1604 }
1605
1606 void DeclareTypeForwardDeclare(struct External * neededFor, struct Type * type, unsigned int needDereference, unsigned int forFunctionDef)
1607 {
1608 _DeclareType(neededFor, type, needDereference, forFunctionDef, 1);
1609 }
1610
1611 static void _PrintType(struct Type *  type, char *  string, unsigned int printName, unsigned int fullName, unsigned int printConst);
1612
1613 void PrintType(struct Type * type, char * string, unsigned int printName, unsigned int fullName)
1614 {
1615 _PrintType(type, string, printName, fullName, 1);
1616 }
1617
1618 void PrintTypeNoConst(struct Type * type, char * string, unsigned int printName, unsigned int fullName)
1619 {
1620 _PrintType(type, string, printName, fullName, 0);
1621 }
1622
1623 struct __ecereNameSpace__ecere__com__Method;
1624
1625 struct __ecereNameSpace__ecere__com__Method
1626 {
1627 const char *  name;
1628 struct __ecereNameSpace__ecere__com__Method * parent;
1629 struct __ecereNameSpace__ecere__com__Method * left;
1630 struct __ecereNameSpace__ecere__com__Method * right;
1631 int depth;
1632 int (*  function)();
1633 int vid;
1634 int type;
1635 struct __ecereNameSpace__ecere__com__Class * _class;
1636 void *  symbol;
1637 const char *  dataTypeString;
1638 struct Type * dataType;
1639 int memberAccess;
1640 } ecere_gcc_struct;
1641
1642 struct Symbol
1643 {
1644 char *  string;
1645 struct Symbol * parent;
1646 struct Symbol * left;
1647 struct Symbol * right;
1648 int depth;
1649 struct Type * type;
1650 union
1651 {
1652 struct __ecereNameSpace__ecere__com__Method * method;
1653 struct __ecereNameSpace__ecere__com__Property * _property;
1654 struct __ecereNameSpace__ecere__com__Class * registered;
1655 } ecere_gcc_struct __anon1;
1656 unsigned int notYetDeclared;
1657 union
1658 {
1659 struct
1660 {
1661 struct External * pointerExternal;
1662 struct External * structExternal;
1663 } ecere_gcc_struct __anon1;
1664 struct
1665 {
1666 struct External * externalGet;
1667 struct External * externalSet;
1668 struct External * externalPtr;
1669 struct External * externalIsSet;
1670 } ecere_gcc_struct __anon2;
1671 struct
1672 {
1673 struct External * methodExternal;
1674 struct External * methodCodeExternal;
1675 } ecere_gcc_struct __anon3;
1676 } ecere_gcc_struct __anon2;
1677 unsigned int imported;
1678 unsigned int declaredStructSym;
1679 struct __ecereNameSpace__ecere__com__Class * _class;
1680 unsigned int declaredStruct;
1681 unsigned int needConstructor;
1682 unsigned int needDestructor;
1683 char *  constructorName;
1684 char *  structName;
1685 char *  className;
1686 char *  destructorName;
1687 struct ModuleImport * module;
1688 struct ClassImport * _import;
1689 struct Location nameLoc;
1690 unsigned int isParam;
1691 unsigned int isRemote;
1692 unsigned int isStruct;
1693 unsigned int fireWatchersDone;
1694 int declaring;
1695 unsigned int classData;
1696 unsigned int isStatic;
1697 char *  shortName;
1698 struct __ecereNameSpace__ecere__sys__OldList *  templateParams;
1699 struct __ecereNameSpace__ecere__sys__OldList templatedClasses;
1700 struct Context * ctx;
1701 int isIterator;
1702 struct Expression * propCategory;
1703 unsigned int mustRegister;
1704 } ecere_gcc_struct;
1705
1706 struct __ecereNameSpace__ecere__com__ClassProperty;
1707
1708 extern struct __ecereNameSpace__ecere__com__ClassProperty * __ecereNameSpace__ecere__com__eClass_FindClassProperty(struct __ecereNameSpace__ecere__com__Class * _class, const char *  name);
1709
1710 struct __ecereNameSpace__ecere__com__ClassProperty
1711 {
1712 const char *  name;
1713 struct __ecereNameSpace__ecere__com__ClassProperty * parent;
1714 struct __ecereNameSpace__ecere__com__ClassProperty * left;
1715 struct __ecereNameSpace__ecere__com__ClassProperty * right;
1716 int depth;
1717 void (*  Set)(struct __ecereNameSpace__ecere__com__Class *, long long);
1718 long long (*  Get)(struct __ecereNameSpace__ecere__com__Class *);
1719 const char *  dataTypeString;
1720 struct Type * dataType;
1721 unsigned int constant;
1722 } ecere_gcc_struct;
1723
1724 struct __ecereNameSpace__ecere__com__BitMember;
1725
1726 struct __ecereNameSpace__ecere__com__BitMember
1727 {
1728 struct __ecereNameSpace__ecere__com__BitMember * prev;
1729 struct __ecereNameSpace__ecere__com__BitMember * next;
1730 const char *  name;
1731 unsigned int isProperty;
1732 int memberAccess;
1733 int id;
1734 struct __ecereNameSpace__ecere__com__Class * _class;
1735 const char *  dataTypeString;
1736 struct __ecereNameSpace__ecere__com__Class * dataTypeClass;
1737 struct Type * dataType;
1738 int type;
1739 int size;
1740 int pos;
1741 uint64 mask;
1742 } ecere_gcc_struct;
1743
1744 struct __ecereNameSpace__ecere__com__DataMember;
1745
1746 struct __ecereNameSpace__ecere__com__ClassTemplateArgument
1747 {
1748 union
1749 {
1750 struct
1751 {
1752 const char *  dataTypeString;
1753 struct __ecereNameSpace__ecere__com__Class * dataTypeClass;
1754 } ecere_gcc_struct __anon1;
1755 struct __ecereNameSpace__ecere__com__DataValue expression;
1756 struct
1757 {
1758 const char *  memberString;
1759 union
1760 {
1761 struct __ecereNameSpace__ecere__com__DataMember * member;
1762 struct __ecereNameSpace__ecere__com__Property * prop;
1763 struct __ecereNameSpace__ecere__com__Method * method;
1764 } ecere_gcc_struct __anon1;
1765 } ecere_gcc_struct __anon2;
1766 } ecere_gcc_struct __anon1;
1767 } ecere_gcc_struct;
1768
1769 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);
1770
1771 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);
1772
1773 struct TemplateParameter;
1774
1775 struct TemplateParameter
1776 {
1777 struct TemplateParameter * prev;
1778 struct TemplateParameter * next;
1779 struct Location loc;
1780 int type;
1781 struct Identifier * identifier;
1782 union
1783 {
1784 struct TemplateDatatype * dataType;
1785 int memberType;
1786 } ecere_gcc_struct __anon1;
1787 struct TemplateArgument * defaultArgument;
1788 const char *  dataTypeString;
1789 struct Type * baseType;
1790 } ecere_gcc_struct;
1791
1792 struct Type
1793 {
1794 struct Type * prev;
1795 struct Type * next;
1796 int refCount;
1797 union
1798 {
1799 struct Symbol * _class;
1800 struct
1801 {
1802 struct __ecereNameSpace__ecere__sys__OldList members;
1803 char *  enumName;
1804 } ecere_gcc_struct __anon1;
1805 struct
1806 {
1807 struct Type * returnType;
1808 struct __ecereNameSpace__ecere__sys__OldList params;
1809 struct Symbol * thisClass;
1810 unsigned int staticMethod;
1811 struct TemplateParameter * thisClassTemplate;
1812 } ecere_gcc_struct __anon2;
1813 struct
1814 {
1815 struct __ecereNameSpace__ecere__com__Method * method;
1816 struct __ecereNameSpace__ecere__com__Class * methodClass;
1817 struct __ecereNameSpace__ecere__com__Class * usedClass;
1818 } ecere_gcc_struct __anon3;
1819 struct
1820 {
1821 struct Type * arrayType;
1822 int arraySize;
1823 struct Expression * arraySizeExp;
1824 unsigned int freeExp;
1825 struct Symbol * enumClass;
1826 } ecere_gcc_struct __anon4;
1827 struct Type * type;
1828 struct TemplateParameter * templateParameter;
1829 } ecere_gcc_struct __anon1;
1830 int kind;
1831 unsigned int size;
1832 char *  name;
1833 char *  typeName;
1834 struct __ecereNameSpace__ecere__com__Class * thisClassFrom;
1835 int promotedFrom;
1836 int classObjectType;
1837 int alignment;
1838 unsigned int offset;
1839 int bitFieldCount;
1840 int count;
1841 int bitMemberSize;
1842 unsigned int isSigned : 1;
1843 unsigned int constant : 1;
1844 unsigned int truth : 1;
1845 unsigned int byReference : 1;
1846 unsigned int extraParam : 1;
1847 unsigned int directClassAccess : 1;
1848 unsigned int computing : 1;
1849 unsigned int keepCast : 1;
1850 unsigned int passAsTemplate : 1;
1851 unsigned int dllExport : 1;
1852 unsigned int attrStdcall : 1;
1853 unsigned int declaredWithStruct : 1;
1854 unsigned int typedByReference : 1;
1855 unsigned int casted : 1;
1856 unsigned int pointerAlignment : 1;
1857 unsigned int isLong : 1;
1858 unsigned int signedBeforePromotion : 1;
1859 } ecere_gcc_struct;
1860
1861 struct Specifier
1862 {
1863 struct Specifier * prev;
1864 struct Specifier * next;
1865 struct Location loc;
1866 int type;
1867 union
1868 {
1869 int specifier;
1870 struct
1871 {
1872 struct ExtDecl * extDecl;
1873 char *  name;
1874 struct Symbol * symbol;
1875 struct __ecereNameSpace__ecere__sys__OldList *  templateArgs;
1876 struct Specifier * nsSpec;
1877 } ecere_gcc_struct __anon1;
1878 struct
1879 {
1880 struct Identifier * id;
1881 struct __ecereNameSpace__ecere__sys__OldList *  list;
1882 struct __ecereNameSpace__ecere__sys__OldList *  baseSpecs;
1883 struct __ecereNameSpace__ecere__sys__OldList *  definitions;
1884 unsigned int addNameSpace;
1885 struct Context * ctx;
1886 struct ExtDecl * extDeclStruct;
1887 } ecere_gcc_struct __anon2;
1888 struct Expression * expression;
1889 struct Specifier * _class;
1890 struct TemplateParameter * templateParameter;
1891 } ecere_gcc_struct __anon1;
1892 } ecere_gcc_struct;
1893
1894 extern struct Expression * GetTemplateArgExp(struct TemplateParameter * param, struct __ecereNameSpace__ecere__com__Class * curClass, unsigned int pointer);
1895
1896 struct TemplatedType
1897 {
1898 uintptr_t key;
1899 struct __ecereNameSpace__ecere__sys__BTNode * parent;
1900 struct __ecereNameSpace__ecere__sys__BTNode * left;
1901 struct __ecereNameSpace__ecere__sys__BTNode * right;
1902 int depth;
1903 struct TemplateParameter * param;
1904 } ecere_gcc_struct;
1905
1906 struct Type * ProcessTemplateParameterType(struct TemplateParameter * param)
1907 {
1908 if(param && param->type == 0 && (param->__anon1.dataType || param->dataTypeString))
1909 {
1910 if(!param->baseType)
1911 {
1912 if(param->dataTypeString)
1913 param->baseType = ProcessTypeString(param->dataTypeString, 0);
1914 else
1915 param->baseType = ProcessType(param->__anon1.dataType->specifiers, param->__anon1.dataType->decl);
1916 }
1917 return param->baseType;
1918 }
1919 return (((void *)0));
1920 }
1921
1922 unsigned int NeedCast(struct Type * type1, struct Type * type2)
1923 {
1924 if(!type1 || !type2 || type1->keepCast || type2->keepCast)
1925 return 1;
1926 if(type1->kind == 20 && type2->kind == 4 && type2->passAsTemplate == 0)
1927 {
1928 return 0;
1929 }
1930 if(type1->kind == type2->kind && type1->isLong == type2->isLong)
1931 {
1932 switch(type1->kind)
1933 {
1934 case 24:
1935 case 1:
1936 case 2:
1937 case 3:
1938 case 4:
1939 case 22:
1940 case 23:
1941 if(type1->passAsTemplate && !type2->passAsTemplate)
1942 return 1;
1943 return type1->isSigned != type2->isSigned;
1944 case 8:
1945 return type1->__anon1._class != type2->__anon1._class;
1946 case 13:
1947 return (type1->__anon1.type && type2->__anon1.type && type1->__anon1.type->constant != type2->__anon1.type->constant) || NeedCast(type1->__anon1.type, type2->__anon1.type);
1948 default:
1949 return 1;
1950 }
1951 }
1952 return 1;
1953 }
1954
1955 unsigned int GetOpInt(struct Operand * op2, int * value2)
1956 {
1957 if(op2->kind == 3 && op2->type->isSigned)
1958 *value2 = op2->__anon1.i;
1959 else if(op2->kind == 3)
1960 *value2 = (int)op2->__anon1.ui;
1961 else if(op2->kind == 4 && op2->type->isSigned)
1962 *value2 = (int)op2->__anon1.i64;
1963 else if(op2->kind == 4)
1964 *value2 = (int)op2->__anon1.ui64;
1965 else if(op2->kind == 23 && op2->type->isSigned)
1966 *value2 = (int)op2->__anon1.i64;
1967 else if(op2->kind == 23)
1968 *value2 = (int)op2->__anon1.ui64;
1969 else if(op2->kind == 22 && op2->type->isSigned)
1970 *value2 = (int)op2->__anon1.i64;
1971 else if(op2->kind == 22)
1972 *value2 = (int)op2->__anon1.ui64;
1973 else if(op2->kind == 2 && op2->type->isSigned)
1974 *value2 = (int)op2->__anon1.s;
1975 else if(op2->kind == 2)
1976 *value2 = (int)op2->__anon1.us;
1977 else if(op2->kind == 1 && op2->type->isSigned)
1978 *value2 = (int)op2->__anon1.c;
1979 else if(op2->kind == 24 || op2->kind == 1)
1980 *value2 = (int)op2->__anon1.uc;
1981 else if(op2->kind == 6)
1982 *value2 = (int)op2->__anon1.f;
1983 else if(op2->kind == 7)
1984 *value2 = (int)op2->__anon1.d;
1985 else if(op2->kind == 13)
1986 *value2 = (int)op2->__anon1.ui64;
1987 else
1988 return 0;
1989 return 1;
1990 }
1991
1992 unsigned int GetOpUInt(struct Operand * op2, unsigned int * value2)
1993 {
1994 if(op2->kind == 3 && op2->type->isSigned)
1995 *value2 = (unsigned int)op2->__anon1.i;
1996 else if(op2->kind == 3)
1997 *value2 = op2->__anon1.ui;
1998 else if(op2->kind == 4 && op2->type->isSigned)
1999 *value2 = (unsigned int)op2->__anon1.i64;
2000 else if(op2->kind == 4)
2001 *value2 = (unsigned int)op2->__anon1.ui64;
2002 else if(op2->kind == 23 && op2->type->isSigned)
2003 *value2 = (unsigned int)op2->__anon1.i64;
2004 else if(op2->kind == 23)
2005 *value2 = (unsigned int)op2->__anon1.ui64;
2006 else if(op2->kind == 22 && op2->type->isSigned)
2007 *value2 = (unsigned int)op2->__anon1.i64;
2008 else if(op2->kind == 22)
2009 *value2 = (unsigned int)op2->__anon1.ui64;
2010 else if(op2->kind == 2 && op2->type->isSigned)
2011 *value2 = (unsigned int)op2->__anon1.s;
2012 else if(op2->kind == 2)
2013 *value2 = (unsigned int)op2->__anon1.us;
2014 else if(op2->kind == 1 && op2->type->isSigned)
2015 *value2 = (unsigned int)op2->__anon1.c;
2016 else if(op2->kind == 24 || op2->kind == 1)
2017 *value2 = (unsigned int)op2->__anon1.uc;
2018 else if(op2->kind == 6)
2019 *value2 = (unsigned int)op2->__anon1.f;
2020 else if(op2->kind == 7)
2021 *value2 = (unsigned int)op2->__anon1.d;
2022 else if(op2->kind == 13)
2023 *value2 = (unsigned int)op2->__anon1.ui64;
2024 else
2025 return 0;
2026 return 1;
2027 }
2028
2029 unsigned int GetOpInt64(struct Operand * op2, long long * value2)
2030 {
2031 if(op2->kind == 3 && op2->type->isSigned)
2032 *value2 = (long long)op2->__anon1.i;
2033 else if(op2->kind == 3)
2034 *value2 = (long long)op2->__anon1.ui;
2035 else if(op2->kind == 4 && op2->type->isSigned)
2036 *value2 = op2->__anon1.i64;
2037 else if(op2->kind == 4)
2038 *value2 = (long long)op2->__anon1.ui64;
2039 else if(op2->kind == 23 && op2->type->isSigned)
2040 *value2 = op2->__anon1.i64;
2041 else if(op2->kind == 23)
2042 *value2 = (long long)op2->__anon1.ui64;
2043 else if(op2->kind == 22 && op2->type->isSigned)
2044 *value2 = op2->__anon1.i64;
2045 else if(op2->kind == 22)
2046 *value2 = (long long)op2->__anon1.ui64;
2047 else if(op2->kind == 2 && op2->type->isSigned)
2048 *value2 = (long long)op2->__anon1.s;
2049 else if(op2->kind == 2)
2050 *value2 = (long long)op2->__anon1.us;
2051 else if(op2->kind == 1 && op2->type->isSigned)
2052 *value2 = (long long)op2->__anon1.c;
2053 else if(op2->kind == 24 || op2->kind == 1)
2054 *value2 = (long long)op2->__anon1.uc;
2055 else if(op2->kind == 6)
2056 *value2 = (long long)op2->__anon1.f;
2057 else if(op2->kind == 7)
2058 *value2 = (long long)op2->__anon1.d;
2059 else if(op2->kind == 13)
2060 *value2 = (long long)op2->__anon1.ui64;
2061 else
2062 return 0;
2063 return 1;
2064 }
2065
2066 unsigned int GetOpUInt64(struct Operand * op2, uint64 * value2)
2067 {
2068 if(op2->kind == 3 && op2->type->isSigned)
2069 *value2 = (uint64)op2->__anon1.i;
2070 else if(op2->kind == 3)
2071 *value2 = (uint64)op2->__anon1.ui;
2072 else if(op2->kind == 4 && op2->type->isSigned)
2073 *value2 = (uint64)op2->__anon1.i64;
2074 else if(op2->kind == 4)
2075 *value2 = op2->__anon1.ui64;
2076 else if(op2->kind == 23 && op2->type->isSigned)
2077 *value2 = (uint64)op2->__anon1.i64;
2078 else if(op2->kind == 23)
2079 *value2 = op2->__anon1.ui64;
2080 else if(op2->kind == 22 && op2->type->isSigned)
2081 *value2 = (uint64)op2->__anon1.i64;
2082 else if(op2->kind == 22)
2083 *value2 = op2->__anon1.ui64;
2084 else if(op2->kind == 2 && op2->type->isSigned)
2085 *value2 = (uint64)op2->__anon1.s;
2086 else if(op2->kind == 2)
2087 *value2 = (uint64)op2->__anon1.us;
2088 else if(op2->kind == 1 && op2->type->isSigned)
2089 *value2 = (uint64)op2->__anon1.c;
2090 else if(op2->kind == 24 || op2->kind == 1)
2091 *value2 = (uint64)op2->__anon1.uc;
2092 else if(op2->kind == 6)
2093 *value2 = (uint64)op2->__anon1.f;
2094 else if(op2->kind == 7)
2095 *value2 = (uint64)op2->__anon1.d;
2096 else if(op2->kind == 13)
2097 *value2 = op2->__anon1.ui64;
2098 else
2099 return 0;
2100 return 1;
2101 }
2102
2103 unsigned int GetOpIntPtr(struct Operand * op2, intptr_t * value2)
2104 {
2105 if(op2->kind == 3 && op2->type->isSigned)
2106 *value2 = (intptr_t)op2->__anon1.i;
2107 else if(op2->kind == 3)
2108 *value2 = (intptr_t)op2->__anon1.ui;
2109 else if(op2->kind == 4 && op2->type->isSigned)
2110 *value2 = (intptr_t)op2->__anon1.i64;
2111 else if(op2->kind == 4)
2112 *value2 = (intptr_t)op2->__anon1.ui64;
2113 else if(op2->kind == 23 && op2->type->isSigned)
2114 *value2 = (intptr_t)op2->__anon1.i64;
2115 else if(op2->kind == 23)
2116 *value2 = (intptr_t)op2->__anon1.ui64;
2117 else if(op2->kind == 22 && op2->type->isSigned)
2118 *value2 = (intptr_t)op2->__anon1.i64;
2119 else if(op2->kind == 22)
2120 *value2 = (intptr_t)op2->__anon1.ui64;
2121 else if(op2->kind == 2 && op2->type->isSigned)
2122 *value2 = (intptr_t)op2->__anon1.s;
2123 else if(op2->kind == 2)
2124 *value2 = (intptr_t)op2->__anon1.us;
2125 else if(op2->kind == 1 && op2->type->isSigned)
2126 *value2 = (intptr_t)op2->__anon1.c;
2127 else if(op2->kind == 24 || op2->kind == 1)
2128 *value2 = (intptr_t)op2->__anon1.uc;
2129 else if(op2->kind == 6)
2130 *value2 = (intptr_t)op2->__anon1.f;
2131 else if(op2->kind == 7)
2132 *value2 = (intptr_t)op2->__anon1.d;
2133 else if(op2->kind == 13)
2134 *value2 = (intptr_t)op2->__anon1.ui64;
2135 else
2136 return 0;
2137 return 1;
2138 }
2139
2140 unsigned int GetOpUIntPtr(struct Operand * op2, uintptr_t * value2)
2141 {
2142 if(op2->kind == 3 && op2->type->isSigned)
2143 *value2 = (uintptr_t)op2->__anon1.i;
2144 else if(op2->kind == 3)
2145 *value2 = (uintptr_t)op2->__anon1.ui;
2146 else if(op2->kind == 4 && op2->type->isSigned)
2147 *value2 = (uintptr_t)op2->__anon1.i64;
2148 else if(op2->kind == 4)
2149 *value2 = (uintptr_t)op2->__anon1.ui64;
2150 else if(op2->kind == 23 && op2->type->isSigned)
2151 *value2 = (uintptr_t)op2->__anon1.i64;
2152 else if(op2->kind == 23)
2153 *value2 = (uintptr_t)op2->__anon1.ui64;
2154 else if(op2->kind == 22 && op2->type->isSigned)
2155 *value2 = (uintptr_t)op2->__anon1.i64;
2156 else if(op2->kind == 22)
2157 *value2 = (uintptr_t)op2->__anon1.ui64;
2158 else if(op2->kind == 2 && op2->type->isSigned)
2159 *value2 = (uintptr_t)op2->__anon1.s;
2160 else if(op2->kind == 2)
2161 *value2 = (uintptr_t)op2->__anon1.us;
2162 else if(op2->kind == 1 && op2->type->isSigned)
2163 *value2 = (uintptr_t)op2->__anon1.c;
2164 else if(op2->kind == 24 || op2->kind == 1)
2165 *value2 = (uintptr_t)op2->__anon1.uc;
2166 else if(op2->kind == 6)
2167 *value2 = (uintptr_t)op2->__anon1.f;
2168 else if(op2->kind == 7)
2169 *value2 = (uintptr_t)op2->__anon1.d;
2170 else if(op2->kind == 13)
2171 *value2 = (uintptr_t)op2->__anon1.ui64;
2172 else
2173 return 0;
2174 return 1;
2175 }
2176
2177 unsigned int GetOpIntSize(struct Operand * op2, ssize_t * value2)
2178 {
2179 if(op2->kind == 3 && op2->type->isSigned)
2180 *value2 = (ssize_t)op2->__anon1.i;
2181 else if(op2->kind == 3)
2182 *value2 = (ssize_t)op2->__anon1.ui;
2183 else if(op2->kind == 4 && op2->type->isSigned)
2184 *value2 = (ssize_t)op2->__anon1.i64;
2185 else if(op2->kind == 4)
2186 *value2 = (ssize_t)op2->__anon1.ui64;
2187 else if(op2->kind == 23 && op2->type->isSigned)
2188 *value2 = (ssize_t)op2->__anon1.i64;
2189 else if(op2->kind == 23)
2190 *value2 = (ssize_t)op2->__anon1.ui64;
2191 else if(op2->kind == 22 && op2->type->isSigned)
2192 *value2 = (ssize_t)op2->__anon1.i64;
2193 else if(op2->kind == 22)
2194 *value2 = (ssize_t)op2->__anon1.ui64;
2195 else if(op2->kind == 2 && op2->type->isSigned)
2196 *value2 = (ssize_t)op2->__anon1.s;
2197 else if(op2->kind == 2)
2198 *value2 = (ssize_t)op2->__anon1.us;
2199 else if(op2->kind == 1 && op2->type->isSigned)
2200 *value2 = (ssize_t)op2->__anon1.c;
2201 else if(op2->kind == 24 || op2->kind == 1)
2202 *value2 = (ssize_t)op2->__anon1.uc;
2203 else if(op2->kind == 6)
2204 *value2 = (ssize_t)op2->__anon1.f;
2205 else if(op2->kind == 7)
2206 *value2 = (ssize_t)op2->__anon1.d;
2207 else if(op2->kind == 13)
2208 *value2 = (ssize_t)op2->__anon1.ui64;
2209 else
2210 return 0;
2211 return 1;
2212 }
2213
2214 unsigned int GetOpUIntSize(struct Operand * op2, size_t * value2)
2215 {
2216 if(op2->kind == 3 && op2->type->isSigned)
2217 *value2 = (size_t)op2->__anon1.i;
2218 else if(op2->kind == 3)
2219 *value2 = (size_t)op2->__anon1.ui;
2220 else if(op2->kind == 4 && op2->type->isSigned)
2221 *value2 = (size_t)op2->__anon1.i64;
2222 else if(op2->kind == 4)
2223 *value2 = (size_t)op2->__anon1.ui64;
2224 else if(op2->kind == 23 && op2->type->isSigned)
2225 *value2 = (size_t)op2->__anon1.i64;
2226 else if(op2->kind == 23)
2227 *value2 = (size_t)op2->__anon1.ui64;
2228 else if(op2->kind == 22 && op2->type->isSigned)
2229 *value2 = (size_t)op2->__anon1.i64;
2230 else if(op2->kind == 22)
2231 *value2 = (size_t)op2->__anon1.ui64;
2232 else if(op2->kind == 2 && op2->type->isSigned)
2233 *value2 = (size_t)op2->__anon1.s;
2234 else if(op2->kind == 2)
2235 *value2 = (size_t)op2->__anon1.us;
2236 else if(op2->kind == 1 && op2->type->isSigned)
2237 *value2 = (size_t)op2->__anon1.c;
2238 else if(op2->kind == 24 || op2->kind == 1)
2239 *value2 = (size_t)op2->__anon1.uc;
2240 else if(op2->kind == 6)
2241 *value2 = (size_t)op2->__anon1.f;
2242 else if(op2->kind == 7)
2243 *value2 = (size_t)op2->__anon1.d;
2244 else if(op2->kind == 13)
2245 *value2 = (size_t)op2->__anon1.ui64;
2246 else
2247 return 0;
2248 return 1;
2249 }
2250
2251 unsigned int GetOpShort(struct Operand * op2, short * value2)
2252 {
2253 if(op2->kind == 3 && op2->type->isSigned)
2254 *value2 = (short)op2->__anon1.i;
2255 else if(op2->kind == 3)
2256 *value2 = (short)op2->__anon1.ui;
2257 else if(op2->kind == 4 && op2->type->isSigned)
2258 *value2 = (short)op2->__anon1.i64;
2259 else if(op2->kind == 4)
2260 *value2 = (short)op2->__anon1.ui64;
2261 else if(op2->kind == 23 && op2->type->isSigned)
2262 *value2 = (short)op2->__anon1.i64;
2263 else if(op2->kind == 23)
2264 *value2 = (short)op2->__anon1.ui64;
2265 else if(op2->kind == 22 && op2->type->isSigned)
2266 *value2 = (short)op2->__anon1.i64;
2267 else if(op2->kind == 22)
2268 *value2 = (short)op2->__anon1.ui64;
2269 else if(op2->kind == 2 && op2->type->isSigned)
2270 *value2 = op2->__anon1.s;
2271 else if(op2->kind == 2)
2272 *value2 = (short)op2->__anon1.us;
2273 else if(op2->kind == 1 && op2->type->isSigned)
2274 *value2 = (short)op2->__anon1.c;
2275 else if(op2->kind == 24 || op2->kind == 1)
2276 *value2 = (short)op2->__anon1.uc;
2277 else if(op2->kind == 6)
2278 *value2 = (short)op2->__anon1.f;
2279 else if(op2->kind == 7)
2280 *value2 = (short)op2->__anon1.d;
2281 else if(op2->kind == 13)
2282 *value2 = (short)op2->__anon1.ui64;
2283 else
2284 return 0;
2285 return 1;
2286 }
2287
2288 unsigned int GetOpUShort(struct Operand * op2, unsigned short * value2)
2289 {
2290 if(op2->kind == 3 && op2->type->isSigned)
2291 *value2 = (unsigned short)op2->__anon1.i;
2292 else if(op2->kind == 3)
2293 *value2 = (unsigned short)op2->__anon1.ui;
2294 else if(op2->kind == 4 && op2->type->isSigned)
2295 *value2 = (unsigned short)op2->__anon1.i64;
2296 else if(op2->kind == 4)
2297 *value2 = (unsigned short)op2->__anon1.ui64;
2298 else if(op2->kind == 23 && op2->type->isSigned)
2299 *value2 = (unsigned short)op2->__anon1.i64;
2300 else if(op2->kind == 23)
2301 *value2 = (unsigned short)op2->__anon1.ui64;
2302 else if(op2->kind == 22 && op2->type->isSigned)
2303 *value2 = (unsigned short)op2->__anon1.i64;
2304 else if(op2->kind == 22)
2305 *value2 = (unsigned short)op2->__anon1.ui64;
2306 else if(op2->kind == 2 && op2->type->isSigned)
2307 *value2 = (unsigned short)op2->__anon1.s;
2308 else if(op2->kind == 2)
2309 *value2 = op2->__anon1.us;
2310 else if(op2->kind == 1 && op2->type->isSigned)
2311 *value2 = (unsigned short)op2->__anon1.c;
2312 else if(op2->kind == 24 || op2->kind == 1)
2313 *value2 = (unsigned short)op2->__anon1.uc;
2314 else if(op2->kind == 6)
2315 *value2 = (unsigned short)op2->__anon1.f;
2316 else if(op2->kind == 7)
2317 *value2 = (unsigned short)op2->__anon1.d;
2318 else if(op2->kind == 13)
2319 *value2 = (unsigned short)op2->__anon1.ui64;
2320 else
2321 return 0;
2322 return 1;
2323 }
2324
2325 unsigned int GetOpChar(struct Operand * op2, char * value2)
2326 {
2327 if(op2->kind == 3 && op2->type->isSigned)
2328 *value2 = (char)op2->__anon1.i;
2329 else if(op2->kind == 3)
2330 *value2 = (char)op2->__anon1.ui;
2331 else if(op2->kind == 4 && op2->type->isSigned)
2332 *value2 = (char)op2->__anon1.i64;
2333 else if(op2->kind == 4)
2334 *value2 = (char)op2->__anon1.ui64;
2335 else if(op2->kind == 23 && op2->type->isSigned)
2336 *value2 = (char)op2->__anon1.i64;
2337 else if(op2->kind == 23)
2338 *value2 = (char)op2->__anon1.ui64;
2339 else if(op2->kind == 22 && op2->type->isSigned)
2340 *value2 = (char)op2->__anon1.i64;
2341 else if(op2->kind == 22)
2342 *value2 = (char)op2->__anon1.ui64;
2343 else if(op2->kind == 2 && op2->type->isSigned)
2344 *value2 = (char)op2->__anon1.s;
2345 else if(op2->kind == 2)
2346 *value2 = (char)op2->__anon1.us;
2347 else if(op2->kind == 1 && op2->type->isSigned)
2348 *value2 = op2->__anon1.c;
2349 else if(op2->kind == 24 || op2->kind == 1)
2350 *value2 = (char)op2->__anon1.uc;
2351 else if(op2->kind == 6)
2352 *value2 = (char)op2->__anon1.f;
2353 else if(op2->kind == 7)
2354 *value2 = (char)op2->__anon1.d;
2355 else if(op2->kind == 13)
2356 *value2 = (char)op2->__anon1.ui64;
2357 else
2358 return 0;
2359 return 1;
2360 }
2361
2362 unsigned int GetOpUChar(struct Operand * op2, unsigned char * value2)
2363 {
2364 if(op2->kind == 3 && op2->type->isSigned)
2365 *value2 = (unsigned char)op2->__anon1.i;
2366 else if(op2->kind == 3)
2367 *value2 = (unsigned char)op2->__anon1.ui;
2368 else if(op2->kind == 4 && op2->type->isSigned)
2369 *value2 = (unsigned char)op2->__anon1.i64;
2370 else if(op2->kind == 4)
2371 *value2 = (unsigned char)op2->__anon1.ui64;
2372 else if(op2->kind == 23 && op2->type->isSigned)
2373 *value2 = (unsigned char)op2->__anon1.i64;
2374 else if(op2->kind == 23)
2375 *value2 = (unsigned char)op2->__anon1.ui64;
2376 else if(op2->kind == 22 && op2->type->isSigned)
2377 *value2 = (unsigned char)op2->__anon1.i64;
2378 else if(op2->kind == 22)
2379 *value2 = (unsigned char)op2->__anon1.ui64;
2380 else if(op2->kind == 2 && op2->type->isSigned)
2381 *value2 = (unsigned char)op2->__anon1.s;
2382 else if(op2->kind == 2)
2383 *value2 = (unsigned char)op2->__anon1.us;
2384 else if(op2->kind == 1 && op2->type->isSigned)
2385 *value2 = (unsigned char)op2->__anon1.c;
2386 else if(op2->kind == 24 || op2->kind == 1)
2387 *value2 = op2->__anon1.uc;
2388 else if(op2->kind == 6)
2389 *value2 = (unsigned char)op2->__anon1.f;
2390 else if(op2->kind == 7)
2391 *value2 = (unsigned char)op2->__anon1.d;
2392 else if(op2->kind == 13)
2393 *value2 = (unsigned char)op2->__anon1.ui64;
2394 else
2395 return 0;
2396 return 1;
2397 }
2398
2399 unsigned int GetOpFloat(struct Operand * op2, float * value2)
2400 {
2401 if(op2->kind == 3 && op2->type->isSigned)
2402 *value2 = (float)(float)op2->__anon1.i;
2403 else if(op2->kind == 3)
2404 *value2 = (float)(float)op2->__anon1.ui;
2405 else if(op2->kind == 4 && op2->type->isSigned)
2406 *value2 = (float)(float)op2->__anon1.i64;
2407 else if(op2->kind == 4)
2408 *value2 = (float)(float)op2->__anon1.ui64;
2409 else if(op2->kind == 23 && op2->type->isSigned)
2410 *value2 = (float)(float)op2->__anon1.i64;
2411 else if(op2->kind == 23)
2412 *value2 = (float)(float)op2->__anon1.ui64;
2413 else if(op2->kind == 22 && op2->type->isSigned)
2414 *value2 = (float)(float)op2->__anon1.i64;
2415 else if(op2->kind == 22)
2416 *value2 = (float)(float)op2->__anon1.ui64;
2417 else if(op2->kind == 2 && op2->type->isSigned)
2418 *value2 = (float)(float)op2->__anon1.s;
2419 else if(op2->kind == 2)
2420 *value2 = (float)(float)op2->__anon1.us;
2421 else if(op2->kind == 1 && op2->type->isSigned)
2422 *value2 = (float)(float)op2->__anon1.c;
2423 else if(op2->kind == 24 || op2->kind == 1)
2424 *value2 = (float)(float)op2->__anon1.uc;
2425 else if(op2->kind == 6)
2426 *value2 = (float)op2->__anon1.f;
2427 else if(op2->kind == 7)
2428 *value2 = (float)op2->__anon1.d;
2429 else if(op2->kind == 13)
2430 *value2 = (float)(float)op2->__anon1.ui64;
2431 else
2432 return 0;
2433 return 1;
2434 }
2435
2436 unsigned int GetOpDouble(struct Operand * op2, double * value2)
2437 {
2438 if(op2->kind == 3 && op2->type->isSigned)
2439 *value2 = (double)(double)op2->__anon1.i;
2440 else if(op2->kind == 3)
2441 *value2 = (double)(double)op2->__anon1.ui;
2442 else if(op2->kind == 4 && op2->type->isSigned)
2443 *value2 = (double)(double)op2->__anon1.i64;
2444 else if(op2->kind == 4)
2445 *value2 = (double)(double)op2->__anon1.ui64;
2446 else if(op2->kind == 23 && op2->type->isSigned)
2447 *value2 = (double)(double)op2->__anon1.i64;
2448 else if(op2->kind == 23)
2449 *value2 = (double)(double)op2->__anon1.ui64;
2450 else if(op2->kind == 22 && op2->type->isSigned)
2451 *value2 = (double)(double)op2->__anon1.i64;
2452 else if(op2->kind == 22)
2453 *value2 = (double)(double)op2->__anon1.ui64;
2454 else if(op2->kind == 2 && op2->type->isSigned)
2455 *value2 = (double)(double)op2->__anon1.s;
2456 else if(op2->kind == 2)
2457 *value2 = (double)(double)op2->__anon1.us;
2458 else if(op2->kind == 1 && op2->type->isSigned)
2459 *value2 = (double)(double)op2->__anon1.c;
2460 else if(op2->kind == 24 || op2->kind == 1)
2461 *value2 = (double)(double)op2->__anon1.uc;
2462 else if(op2->kind == 6)
2463 *value2 = (double)op2->__anon1.f;
2464 else if(op2->kind == 7)
2465 *value2 = (double)op2->__anon1.d;
2466 else if(op2->kind == 13)
2467 *value2 = (double)(double)op2->__anon1.ui64;
2468 else
2469 return 0;
2470 return 1;
2471 }
2472
2473 static unsigned int IntAdd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2474 {
2475 int value2 = op2->__anon1.i;
2476
2477 exp->type = 2;
2478 exp->__anon1.__anon2.string = PrintInt((op1->__anon1.i + value2));
2479 if(!exp->expType)
2480 {
2481 exp->expType = op1->type;
2482 if(op1->type)
2483 op1->type->refCount++;
2484 }
2485 return 1;
2486 }
2487
2488 static unsigned int UIntAdd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2489 {
2490 unsigned int value2 = op2->__anon1.ui;
2491
2492 exp->type = 2;
2493 exp->__anon1.__anon2.string = PrintUInt((op1->__anon1.ui + value2));
2494 if(!exp->expType)
2495 {
2496 exp->expType = op1->type;
2497 if(op1->type)
2498 op1->type->refCount++;
2499 }
2500 return 1;
2501 }
2502
2503 static unsigned int Int64Add(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2504 {
2505 long long value2 = op2->__anon1.i64;
2506
2507 exp->type = 2;
2508 exp->__anon1.__anon2.string = PrintInt64((op1->__anon1.i64 + value2));
2509 if(!exp->expType)
2510 {
2511 exp->expType = op1->type;
2512 if(op1->type)
2513 op1->type->refCount++;
2514 }
2515 return 1;
2516 }
2517
2518 static unsigned int UInt64Add(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2519 {
2520 uint64 value2 = op2->__anon1.ui64;
2521
2522 exp->type = 2;
2523 exp->__anon1.__anon2.string = PrintUInt64((op1->__anon1.ui64 + value2));
2524 if(!exp->expType)
2525 {
2526 exp->expType = op1->type;
2527 if(op1->type)
2528 op1->type->refCount++;
2529 }
2530 return 1;
2531 }
2532
2533 static unsigned int ShortAdd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2534 {
2535 short value2 = op2->__anon1.s;
2536
2537 exp->type = 2;
2538 exp->__anon1.__anon2.string = PrintShort((short)(op1->__anon1.s + value2));
2539 if(!exp->expType)
2540 {
2541 exp->expType = op1->type;
2542 if(op1->type)
2543 op1->type->refCount++;
2544 }
2545 return 1;
2546 }
2547
2548 static unsigned int UShortAdd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2549 {
2550 unsigned short value2 = op2->__anon1.us;
2551
2552 exp->type = 2;
2553 exp->__anon1.__anon2.string = PrintUShort((unsigned short)(op1->__anon1.us + value2));
2554 if(!exp->expType)
2555 {
2556 exp->expType = op1->type;
2557 if(op1->type)
2558 op1->type->refCount++;
2559 }
2560 return 1;
2561 }
2562
2563 static unsigned int CharAdd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2564 {
2565 char value2 = op2->__anon1.c;
2566
2567 exp->type = 2;
2568 exp->__anon1.__anon2.string = PrintChar((char)(op1->__anon1.c + value2));
2569 if(!exp->expType)
2570 {
2571 exp->expType = op1->type;
2572 if(op1->type)
2573 op1->type->refCount++;
2574 }
2575 return 1;
2576 }
2577
2578 static unsigned int UCharAdd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2579 {
2580 unsigned char value2 = op2->__anon1.uc;
2581
2582 exp->type = 2;
2583 exp->__anon1.__anon2.string = PrintUChar((unsigned char)(op1->__anon1.uc + value2));
2584 if(!exp->expType)
2585 {
2586 exp->expType = op1->type;
2587 if(op1->type)
2588 op1->type->refCount++;
2589 }
2590 return 1;
2591 }
2592
2593 static unsigned int FloatAdd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2594 {
2595 float value2 = op2->__anon1.f;
2596
2597 exp->type = 2;
2598 exp->__anon1.__anon2.string = PrintFloat((float)(op1->__anon1.f + value2));
2599 if(!exp->expType)
2600 {
2601 exp->expType = op1->type;
2602 if(op1->type)
2603 op1->type->refCount++;
2604 }
2605 return 1;
2606 }
2607
2608 static unsigned int DoubleAdd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2609 {
2610 double value2 = op2->__anon1.d;
2611
2612 exp->type = 2;
2613 exp->__anon1.__anon2.string = PrintDouble((double)(op1->__anon1.d + value2));
2614 if(!exp->expType)
2615 {
2616 exp->expType = op1->type;
2617 if(op1->type)
2618 op1->type->refCount++;
2619 }
2620 return 1;
2621 }
2622
2623 static unsigned int IntSub(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2624 {
2625 int value2 = op2->__anon1.i;
2626
2627 exp->type = 2;
2628 exp->__anon1.__anon2.string = PrintInt((op1->__anon1.i - value2));
2629 if(!exp->expType)
2630 {
2631 exp->expType = op1->type;
2632 if(op1->type)
2633 op1->type->refCount++;
2634 }
2635 return 1;
2636 }
2637
2638 static unsigned int UIntSub(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2639 {
2640 unsigned int value2 = op2->__anon1.ui;
2641
2642 exp->type = 2;
2643 exp->__anon1.__anon2.string = PrintUInt((op1->__anon1.ui - value2));
2644 if(!exp->expType)
2645 {
2646 exp->expType = op1->type;
2647 if(op1->type)
2648 op1->type->refCount++;
2649 }
2650 return 1;
2651 }
2652
2653 static unsigned int Int64Sub(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2654 {
2655 long long value2 = op2->__anon1.i64;
2656
2657 exp->type = 2;
2658 exp->__anon1.__anon2.string = PrintInt64((op1->__anon1.i64 - value2));
2659 if(!exp->expType)
2660 {
2661 exp->expType = op1->type;
2662 if(op1->type)
2663 op1->type->refCount++;
2664 }
2665 return 1;
2666 }
2667
2668 static unsigned int UInt64Sub(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2669 {
2670 uint64 value2 = op2->__anon1.ui64;
2671
2672 exp->type = 2;
2673 exp->__anon1.__anon2.string = PrintUInt64((op1->__anon1.ui64 - value2));
2674 if(!exp->expType)
2675 {
2676 exp->expType = op1->type;
2677 if(op1->type)
2678 op1->type->refCount++;
2679 }
2680 return 1;
2681 }
2682
2683 static unsigned int ShortSub(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2684 {
2685 short value2 = op2->__anon1.s;
2686
2687 exp->type = 2;
2688 exp->__anon1.__anon2.string = PrintShort((short)(op1->__anon1.s - value2));
2689 if(!exp->expType)
2690 {
2691 exp->expType = op1->type;
2692 if(op1->type)
2693 op1->type->refCount++;
2694 }
2695 return 1;
2696 }
2697
2698 static unsigned int UShortSub(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2699 {
2700 unsigned short value2 = op2->__anon1.us;
2701
2702 exp->type = 2;
2703 exp->__anon1.__anon2.string = PrintUShort((unsigned short)(op1->__anon1.us - value2));
2704 if(!exp->expType)
2705 {
2706 exp->expType = op1->type;
2707 if(op1->type)
2708 op1->type->refCount++;
2709 }
2710 return 1;
2711 }
2712
2713 static unsigned int CharSub(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2714 {
2715 char value2 = op2->__anon1.c;
2716
2717 exp->type = 2;
2718 exp->__anon1.__anon2.string = PrintChar((char)(op1->__anon1.c - value2));
2719 if(!exp->expType)
2720 {
2721 exp->expType = op1->type;
2722 if(op1->type)
2723 op1->type->refCount++;
2724 }
2725 return 1;
2726 }
2727
2728 static unsigned int UCharSub(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2729 {
2730 unsigned char value2 = op2->__anon1.uc;
2731
2732 exp->type = 2;
2733 exp->__anon1.__anon2.string = PrintUChar((unsigned char)(op1->__anon1.uc - value2));
2734 if(!exp->expType)
2735 {
2736 exp->expType = op1->type;
2737 if(op1->type)
2738 op1->type->refCount++;
2739 }
2740 return 1;
2741 }
2742
2743 static unsigned int FloatSub(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2744 {
2745 float value2 = op2->__anon1.f;
2746
2747 exp->type = 2;
2748 exp->__anon1.__anon2.string = PrintFloat((float)(op1->__anon1.f - value2));
2749 if(!exp->expType)
2750 {
2751 exp->expType = op1->type;
2752 if(op1->type)
2753 op1->type->refCount++;
2754 }
2755 return 1;
2756 }
2757
2758 static unsigned int DoubleSub(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2759 {
2760 double value2 = op2->__anon1.d;
2761
2762 exp->type = 2;
2763 exp->__anon1.__anon2.string = PrintDouble((double)(op1->__anon1.d - value2));
2764 if(!exp->expType)
2765 {
2766 exp->expType = op1->type;
2767 if(op1->type)
2768 op1->type->refCount++;
2769 }
2770 return 1;
2771 }
2772
2773 static unsigned int IntMul(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2774 {
2775 int value2 = op2->__anon1.i;
2776
2777 exp->type = 2;
2778 exp->__anon1.__anon2.string = PrintInt((op1->__anon1.i * value2));
2779 if(!exp->expType)
2780 {
2781 exp->expType = op1->type;
2782 if(op1->type)
2783 op1->type->refCount++;
2784 }
2785 return 1;
2786 }
2787
2788 static unsigned int UIntMul(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2789 {
2790 unsigned int value2 = op2->__anon1.ui;
2791
2792 exp->type = 2;
2793 exp->__anon1.__anon2.string = PrintUInt((op1->__anon1.ui * value2));
2794 if(!exp->expType)
2795 {
2796 exp->expType = op1->type;
2797 if(op1->type)
2798 op1->type->refCount++;
2799 }
2800 return 1;
2801 }
2802
2803 static unsigned int Int64Mul(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2804 {
2805 long long value2 = op2->__anon1.i64;
2806
2807 exp->type = 2;
2808 exp->__anon1.__anon2.string = PrintInt64((op1->__anon1.i64 * value2));
2809 if(!exp->expType)
2810 {
2811 exp->expType = op1->type;
2812 if(op1->type)
2813 op1->type->refCount++;
2814 }
2815 return 1;
2816 }
2817
2818 static unsigned int UInt64Mul(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2819 {
2820 uint64 value2 = op2->__anon1.ui64;
2821
2822 exp->type = 2;
2823 exp->__anon1.__anon2.string = PrintUInt64((op1->__anon1.ui64 * value2));
2824 if(!exp->expType)
2825 {
2826 exp->expType = op1->type;
2827 if(op1->type)
2828 op1->type->refCount++;
2829 }
2830 return 1;
2831 }
2832
2833 static unsigned int ShortMul(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2834 {
2835 short value2 = op2->__anon1.s;
2836
2837 exp->type = 2;
2838 exp->__anon1.__anon2.string = PrintShort((short)(op1->__anon1.s * value2));
2839 if(!exp->expType)
2840 {
2841 exp->expType = op1->type;
2842 if(op1->type)
2843 op1->type->refCount++;
2844 }
2845 return 1;
2846 }
2847
2848 static unsigned int UShortMul(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2849 {
2850 unsigned short value2 = op2->__anon1.us;
2851
2852 exp->type = 2;
2853 exp->__anon1.__anon2.string = PrintUShort((unsigned short)(op1->__anon1.us * value2));
2854 if(!exp->expType)
2855 {
2856 exp->expType = op1->type;
2857 if(op1->type)
2858 op1->type->refCount++;
2859 }
2860 return 1;
2861 }
2862
2863 static unsigned int CharMul(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2864 {
2865 char value2 = op2->__anon1.c;
2866
2867 exp->type = 2;
2868 exp->__anon1.__anon2.string = PrintChar((char)(op1->__anon1.c * value2));
2869 if(!exp->expType)
2870 {
2871 exp->expType = op1->type;
2872 if(op1->type)
2873 op1->type->refCount++;
2874 }
2875 return 1;
2876 }
2877
2878 static unsigned int UCharMul(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2879 {
2880 unsigned char value2 = op2->__anon1.uc;
2881
2882 exp->type = 2;
2883 exp->__anon1.__anon2.string = PrintUChar((unsigned char)(op1->__anon1.uc * value2));
2884 if(!exp->expType)
2885 {
2886 exp->expType = op1->type;
2887 if(op1->type)
2888 op1->type->refCount++;
2889 }
2890 return 1;
2891 }
2892
2893 static unsigned int FloatMul(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2894 {
2895 float value2 = op2->__anon1.f;
2896
2897 exp->type = 2;
2898 exp->__anon1.__anon2.string = PrintFloat((float)(op1->__anon1.f * value2));
2899 if(!exp->expType)
2900 {
2901 exp->expType = op1->type;
2902 if(op1->type)
2903 op1->type->refCount++;
2904 }
2905 return 1;
2906 }
2907
2908 static unsigned int DoubleMul(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2909 {
2910 double value2 = op2->__anon1.d;
2911
2912 exp->type = 2;
2913 exp->__anon1.__anon2.string = PrintDouble((double)(op1->__anon1.d * value2));
2914 if(!exp->expType)
2915 {
2916 exp->expType = op1->type;
2917 if(op1->type)
2918 op1->type->refCount++;
2919 }
2920 return 1;
2921 }
2922
2923 static unsigned int IntDiv(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2924 {
2925 int value2 = op2->__anon1.i;
2926
2927 exp->type = 2;
2928 exp->__anon1.__anon2.string = PrintInt(value2 ? ((op1->__anon1.i / value2)) : 0);
2929 if(!exp->expType)
2930 {
2931 exp->expType = op1->type;
2932 if(op1->type)
2933 op1->type->refCount++;
2934 }
2935 return 1;
2936 }
2937
2938 static unsigned int UIntDiv(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2939 {
2940 unsigned int value2 = op2->__anon1.ui;
2941
2942 exp->type = 2;
2943 exp->__anon1.__anon2.string = PrintUInt(value2 ? ((op1->__anon1.ui / value2)) : 0);
2944 if(!exp->expType)
2945 {
2946 exp->expType = op1->type;
2947 if(op1->type)
2948 op1->type->refCount++;
2949 }
2950 return 1;
2951 }
2952
2953 static unsigned int Int64Div(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2954 {
2955 long long value2 = op2->__anon1.i64;
2956
2957 exp->type = 2;
2958 exp->__anon1.__anon2.string = PrintInt64(value2 ? ((op1->__anon1.i64 / value2)) : 0);
2959 if(!exp->expType)
2960 {
2961 exp->expType = op1->type;
2962 if(op1->type)
2963 op1->type->refCount++;
2964 }
2965 return 1;
2966 }
2967
2968 static unsigned int UInt64Div(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2969 {
2970 uint64 value2 = op2->__anon1.ui64;
2971
2972 exp->type = 2;
2973 exp->__anon1.__anon2.string = PrintUInt64(value2 ? ((op1->__anon1.ui64 / value2)) : 0);
2974 if(!exp->expType)
2975 {
2976 exp->expType = op1->type;
2977 if(op1->type)
2978 op1->type->refCount++;
2979 }
2980 return 1;
2981 }
2982
2983 static unsigned int ShortDiv(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2984 {
2985 short value2 = op2->__anon1.s;
2986
2987 exp->type = 2;
2988 exp->__anon1.__anon2.string = PrintShort(value2 ? ((short)(op1->__anon1.s / value2)) : 0);
2989 if(!exp->expType)
2990 {
2991 exp->expType = op1->type;
2992 if(op1->type)
2993 op1->type->refCount++;
2994 }
2995 return 1;
2996 }
2997
2998 static unsigned int UShortDiv(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2999 {
3000 unsigned short value2 = op2->__anon1.us;
3001
3002 exp->type = 2;
3003 exp->__anon1.__anon2.string = PrintUShort(value2 ? ((unsigned short)(op1->__anon1.us / value2)) : 0);
3004 if(!exp->expType)
3005 {
3006 exp->expType = op1->type;
3007 if(op1->type)
3008 op1->type->refCount++;
3009 }
3010 return 1;
3011 }
3012
3013 static unsigned int CharDiv(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3014 {
3015 char value2 = op2->__anon1.c;
3016
3017 exp->type = 2;
3018 exp->__anon1.__anon2.string = PrintChar(value2 ? ((char)(op1->__anon1.c / value2)) : 0);
3019 if(!exp->expType)
3020 {
3021 exp->expType = op1->type;
3022 if(op1->type)
3023 op1->type->refCount++;
3024 }
3025 return 1;
3026 }
3027
3028 static unsigned int UCharDiv(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3029 {
3030 unsigned char value2 = op2->__anon1.uc;
3031
3032 exp->type = 2;
3033 exp->__anon1.__anon2.string = PrintUChar(value2 ? ((unsigned char)(op1->__anon1.uc / value2)) : 0);
3034 if(!exp->expType)
3035 {
3036 exp->expType = op1->type;
3037 if(op1->type)
3038 op1->type->refCount++;
3039 }
3040 return 1;
3041 }
3042
3043 static unsigned int FloatDiv(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3044 {
3045 float value2 = op2->__anon1.f;
3046
3047 exp->type = 2;
3048 exp->__anon1.__anon2.string = PrintFloat((float)(op1->__anon1.f / value2));
3049 if(!exp->expType)
3050 {
3051 exp->expType = op1->type;
3052 if(op1->type)
3053 op1->type->refCount++;
3054 }
3055 return 1;
3056 }
3057
3058 static unsigned int DoubleDiv(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3059 {
3060 double value2 = op2->__anon1.d;
3061
3062 exp->type = 2;
3063 exp->__anon1.__anon2.string = PrintDouble((double)(op1->__anon1.d / value2));
3064 if(!exp->expType)
3065 {
3066 exp->expType = op1->type;
3067 if(op1->type)
3068 op1->type->refCount++;
3069 }
3070 return 1;
3071 }
3072
3073 static unsigned int IntMod(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3074 {
3075 int value2 = op2->__anon1.i;
3076
3077 exp->type = 2;
3078 exp->__anon1.__anon2.string = PrintInt(value2 ? ((op1->__anon1.i % value2)) : 0);
3079 if(!exp->expType)
3080 {
3081 exp->expType = op1->type;
3082 if(op1->type)
3083 op1->type->refCount++;
3084 }
3085 return 1;
3086 }
3087
3088 static unsigned int UIntMod(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3089 {
3090 unsigned int value2 = op2->__anon1.ui;
3091
3092 exp->type = 2;
3093 exp->__anon1.__anon2.string = PrintUInt(value2 ? ((op1->__anon1.ui % value2)) : 0);
3094 if(!exp->expType)
3095 {
3096 exp->expType = op1->type;
3097 if(op1->type)
3098 op1->type->refCount++;
3099 }
3100 return 1;
3101 }
3102
3103 static unsigned int Int64Mod(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3104 {
3105 long long value2 = op2->__anon1.i64;
3106
3107 exp->type = 2;
3108 exp->__anon1.__anon2.string = PrintInt64(value2 ? ((op1->__anon1.i64 % value2)) : 0);
3109 if(!exp->expType)
3110 {
3111 exp->expType = op1->type;
3112 if(op1->type)
3113 op1->type->refCount++;
3114 }
3115 return 1;
3116 }
3117
3118 static unsigned int UInt64Mod(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3119 {
3120 uint64 value2 = op2->__anon1.ui64;
3121
3122 exp->type = 2;
3123 exp->__anon1.__anon2.string = PrintUInt64(value2 ? ((op1->__anon1.ui64 % value2)) : 0);
3124 if(!exp->expType)
3125 {
3126 exp->expType = op1->type;
3127 if(op1->type)
3128 op1->type->refCount++;
3129 }
3130 return 1;
3131 }
3132
3133 static unsigned int ShortMod(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3134 {
3135 short value2 = op2->__anon1.s;
3136
3137 exp->type = 2;
3138 exp->__anon1.__anon2.string = PrintShort(value2 ? ((short)(op1->__anon1.s % value2)) : 0);
3139 if(!exp->expType)
3140 {
3141 exp->expType = op1->type;
3142 if(op1->type)
3143 op1->type->refCount++;
3144 }
3145 return 1;
3146 }
3147
3148 static unsigned int UShortMod(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3149 {
3150 unsigned short value2 = op2->__anon1.us;
3151
3152 exp->type = 2;
3153 exp->__anon1.__anon2.string = PrintUShort(value2 ? ((unsigned short)(op1->__anon1.us % value2)) : 0);
3154 if(!exp->expType)
3155 {
3156 exp->expType = op1->type;
3157 if(op1->type)
3158 op1->type->refCount++;
3159 }
3160 return 1;
3161 }
3162
3163 static unsigned int CharMod(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3164 {
3165 char value2 = op2->__anon1.c;
3166
3167 exp->type = 2;
3168 exp->__anon1.__anon2.string = PrintChar(value2 ? ((char)(op1->__anon1.c % value2)) : 0);
3169 if(!exp->expType)
3170 {
3171 exp->expType = op1->type;
3172 if(op1->type)
3173 op1->type->refCount++;
3174 }
3175 return 1;
3176 }
3177
3178 static unsigned int UCharMod(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3179 {
3180 unsigned char value2 = op2->__anon1.uc;
3181
3182 exp->type = 2;
3183 exp->__anon1.__anon2.string = PrintUChar(value2 ? ((unsigned char)(op1->__anon1.uc % value2)) : 0);
3184 if(!exp->expType)
3185 {
3186 exp->expType = op1->type;
3187 if(op1->type)
3188 op1->type->refCount++;
3189 }
3190 return 1;
3191 }
3192
3193 static unsigned int IntNeg(struct Expression * exp, struct Operand * op1)
3194 {
3195 exp->type = 2;
3196 exp->__anon1.__anon2.string = PrintInt((-op1->__anon1.i));
3197 if(!exp->expType)
3198 {
3199 exp->expType = op1->type;
3200 if(op1->type)
3201 op1->type->refCount++;
3202 }
3203 return 1;
3204 }
3205
3206 static unsigned int UIntNeg(struct Expression * exp, struct Operand * op1)
3207 {
3208 exp->type = 2;
3209 exp->__anon1.__anon2.string = PrintUInt((unsigned int)(-op1->__anon1.ui));
3210 if(!exp->expType)
3211 {
3212 exp->expType = op1->type;
3213 if(op1->type)
3214 op1->type->refCount++;
3215 }
3216 return 1;
3217 }
3218
3219 static unsigned int Int64Neg(struct Expression * exp, struct Operand * op1)
3220 {
3221 exp->type = 2;
3222 exp->__anon1.__anon2.string = PrintInt64((-op1->__anon1.i64));
3223 if(!exp->expType)
3224 {
3225 exp->expType = op1->type;
3226 if(op1->type)
3227 op1->type->refCount++;
3228 }
3229 return 1;
3230 }
3231
3232 static unsigned int UInt64Neg(struct Expression * exp, struct Operand * op1)
3233 {
3234 exp->type = 2;
3235 exp->__anon1.__anon2.string = PrintUInt64((uint64)(-op1->__anon1.ui64));
3236 if(!exp->expType)
3237 {
3238 exp->expType = op1->type;
3239 if(op1->type)
3240 op1->type->refCount++;
3241 }
3242 return 1;
3243 }
3244
3245 static unsigned int ShortNeg(struct Expression * exp, struct Operand * op1)
3246 {
3247 exp->type = 2;
3248 exp->__anon1.__anon2.string = PrintShort((-op1->__anon1.s));
3249 if(!exp->expType)
3250 {
3251 exp->expType = op1->type;
3252 if(op1->type)
3253 op1->type->refCount++;
3254 }
3255 return 1;
3256 }
3257
3258 static unsigned int UShortNeg(struct Expression * exp, struct Operand * op1)
3259 {
3260 exp->type = 2;
3261 exp->__anon1.__anon2.string = PrintUShort((unsigned short)(-op1->__anon1.us));
3262 if(!exp->expType)
3263 {
3264 exp->expType = op1->type;
3265 if(op1->type)
3266 op1->type->refCount++;
3267 }
3268 return 1;
3269 }
3270
3271 static unsigned int CharNeg(struct Expression * exp, struct Operand * op1)
3272 {
3273 exp->type = 2;
3274 exp->__anon1.__anon2.string = PrintChar((-op1->__anon1.c));
3275 if(!exp->expType)
3276 {
3277 exp->expType = op1->type;
3278 if(op1->type)
3279 op1->type->refCount++;
3280 }
3281 return 1;
3282 }
3283
3284 static unsigned int UCharNeg(struct Expression * exp, struct Operand * op1)
3285 {
3286 exp->type = 2;
3287 exp->__anon1.__anon2.string = PrintUChar((unsigned char)(-op1->__anon1.uc));
3288 if(!exp->expType)
3289 {
3290 exp->expType = op1->type;
3291 if(op1->type)
3292 op1->type->refCount++;
3293 }
3294 return 1;
3295 }
3296
3297 static unsigned int FloatNeg(struct Expression * exp, struct Operand * op1)
3298 {
3299 exp->type = 2;
3300 exp->__anon1.__anon2.string = PrintFloat((float)(-op1->__anon1.f));
3301 if(!exp->expType)
3302 {
3303 exp->expType = op1->type;
3304 if(op1->type)
3305 op1->type->refCount++;
3306 }
3307 return 1;
3308 }
3309
3310 static unsigned int DoubleNeg(struct Expression * exp, struct Operand * op1)
3311 {
3312 exp->type = 2;
3313 exp->__anon1.__anon2.string = PrintDouble((double)(-op1->__anon1.d));
3314 if(!exp->expType)
3315 {
3316 exp->expType = op1->type;
3317 if(op1->type)
3318 op1->type->refCount++;
3319 }
3320 return 1;
3321 }
3322
3323 static unsigned int IntInc(struct Expression * exp, struct Operand * op1)
3324 {
3325 exp->type = 2;
3326 exp->__anon1.__anon2.string = PrintInt((++op1->__anon1.i));
3327 if(!exp->expType)
3328 {
3329 exp->expType = op1->type;
3330 if(op1->type)
3331 op1->type->refCount++;
3332 }
3333 return 1;
3334 }
3335
3336 static unsigned int UIntInc(struct Expression * exp, struct Operand * op1)
3337 {
3338 exp->type = 2;
3339 exp->__anon1.__anon2.string = PrintUInt((++op1->__anon1.ui));
3340 if(!exp->expType)
3341 {
3342 exp->expType = op1->type;
3343 if(op1->type)
3344 op1->type->refCount++;
3345 }
3346 return 1;
3347 }
3348
3349 static unsigned int Int64Inc(struct Expression * exp, struct Operand * op1)
3350 {
3351 exp->type = 2;
3352 exp->__anon1.__anon2.string = PrintInt64((++op1->__anon1.i64));
3353 if(!exp->expType)
3354 {
3355 exp->expType = op1->type;
3356 if(op1->type)
3357 op1->type->refCount++;
3358 }
3359 return 1;
3360 }
3361
3362 static unsigned int UInt64Inc(struct Expression * exp, struct Operand * op1)
3363 {
3364 exp->type = 2;
3365 exp->__anon1.__anon2.string = PrintUInt64((++op1->__anon1.ui64));
3366 if(!exp->expType)
3367 {
3368 exp->expType = op1->type;
3369 if(op1->type)
3370 op1->type->refCount++;
3371 }
3372 return 1;
3373 }
3374
3375 static unsigned int ShortInc(struct Expression * exp, struct Operand * op1)
3376 {
3377 exp->type = 2;
3378 exp->__anon1.__anon2.string = PrintShort((++op1->__anon1.s));
3379 if(!exp->expType)
3380 {
3381 exp->expType = op1->type;
3382 if(op1->type)
3383 op1->type->refCount++;
3384 }
3385 return 1;
3386 }
3387
3388 static unsigned int UShortInc(struct Expression * exp, struct Operand * op1)
3389 {
3390 exp->type = 2;
3391 exp->__anon1.__anon2.string = PrintUShort((++op1->__anon1.us));
3392 if(!exp->expType)
3393 {
3394 exp->expType = op1->type;
3395 if(op1->type)
3396 op1->type->refCount++;
3397 }
3398 return 1;
3399 }
3400
3401 static unsigned int CharInc(struct Expression * exp, struct Operand * op1)
3402 {
3403 exp->type = 2;
3404 exp->__anon1.__anon2.string = PrintChar((++op1->__anon1.c));
3405 if(!exp->expType)
3406 {
3407 exp->expType = op1->type;
3408 if(op1->type)
3409 op1->type->refCount++;
3410 }
3411 return 1;
3412 }
3413
3414 static unsigned int UCharInc(struct Expression * exp, struct Operand * op1)
3415 {
3416 exp->type = 2;
3417 exp->__anon1.__anon2.string = PrintUChar((++op1->__anon1.uc));
3418 if(!exp->expType)
3419 {
3420 exp->expType = op1->type;
3421 if(op1->type)
3422 op1->type->refCount++;
3423 }
3424 return 1;
3425 }
3426
3427 static unsigned int FloatInc(struct Expression * exp, struct Operand * op1)
3428 {
3429 exp->type = 2;
3430 exp->__anon1.__anon2.string = PrintFloat((float)(++op1->__anon1.f));
3431 if(!exp->expType)
3432 {
3433 exp->expType = op1->type;
3434 if(op1->type)
3435 op1->type->refCount++;
3436 }
3437 return 1;
3438 }
3439
3440 static unsigned int DoubleInc(struct Expression * exp, struct Operand * op1)
3441 {
3442 exp->type = 2;
3443 exp->__anon1.__anon2.string = PrintDouble((double)(++op1->__anon1.d));
3444 if(!exp->expType)
3445 {
3446 exp->expType = op1->type;
3447 if(op1->type)
3448 op1->type->refCount++;
3449 }
3450 return 1;
3451 }
3452
3453 static unsigned int IntDec(struct Expression * exp, struct Operand * op1)
3454 {
3455 exp->type = 2;
3456 exp->__anon1.__anon2.string = PrintInt((--op1->__anon1.i));
3457 if(!exp->expType)
3458 {
3459 exp->expType = op1->type;
3460 if(op1->type)
3461 op1->type->refCount++;
3462 }
3463 return 1;
3464 }
3465
3466 static unsigned int UIntDec(struct Expression * exp, struct Operand * op1)
3467 {
3468 exp->type = 2;
3469 exp->__anon1.__anon2.string = PrintUInt((--op1->__anon1.ui));
3470 if(!exp->expType)
3471 {
3472 exp->expType = op1->type;
3473 if(op1->type)
3474 op1->type->refCount++;
3475 }
3476 return 1;
3477 }
3478
3479 static unsigned int Int64Dec(struct Expression * exp, struct Operand * op1)
3480 {
3481 exp->type = 2;
3482 exp->__anon1.__anon2.string = PrintInt64((--op1->__anon1.i64));
3483 if(!exp->expType)
3484 {
3485 exp->expType = op1->type;
3486 if(op1->type)
3487 op1->type->refCount++;
3488 }
3489 return 1;
3490 }
3491
3492 static unsigned int UInt64Dec(struct Expression * exp, struct Operand * op1)
3493 {
3494 exp->type = 2;
3495 exp->__anon1.__anon2.string = PrintUInt64((--op1->__anon1.ui64));
3496 if(!exp->expType)
3497 {
3498 exp->expType = op1->type;
3499 if(op1->type)
3500 op1->type->refCount++;
3501 }
3502 return 1;
3503 }
3504
3505 static unsigned int ShortDec(struct Expression * exp, struct Operand * op1)
3506 {
3507 exp->type = 2;
3508 exp->__anon1.__anon2.string = PrintShort((--op1->__anon1.s));
3509 if(!exp->expType)
3510 {
3511 exp->expType = op1->type;
3512 if(op1->type)
3513 op1->type->refCount++;
3514 }
3515 return 1;
3516 }
3517
3518 static unsigned int UShortDec(struct Expression * exp, struct Operand * op1)
3519 {
3520 exp->type = 2;
3521 exp->__anon1.__anon2.string = PrintUShort((--op1->__anon1.us));
3522 if(!exp->expType)
3523 {
3524 exp->expType = op1->type;
3525 if(op1->type)
3526 op1->type->refCount++;
3527 }
3528 return 1;
3529 }
3530
3531 static unsigned int CharDec(struct Expression * exp, struct Operand * op1)
3532 {
3533 exp->type = 2;
3534 exp->__anon1.__anon2.string = PrintChar((--op1->__anon1.c));
3535 if(!exp->expType)
3536 {
3537 exp->expType = op1->type;
3538 if(op1->type)
3539 op1->type->refCount++;
3540 }
3541 return 1;
3542 }
3543
3544 static unsigned int UCharDec(struct Expression * exp, struct Operand * op1)
3545 {
3546 exp->type = 2;
3547 exp->__anon1.__anon2.string = PrintUChar((--op1->__anon1.uc));
3548 if(!exp->expType)
3549 {
3550 exp->expType = op1->type;
3551 if(op1->type)
3552 op1->type->refCount++;
3553 }
3554 return 1;
3555 }
3556
3557 static unsigned int FloatDec(struct Expression * exp, struct Operand * op1)
3558 {
3559 exp->type = 2;
3560 exp->__anon1.__anon2.string = PrintFloat((float)(--op1->__anon1.f));
3561 if(!exp->expType)
3562 {
3563 exp->expType = op1->type;
3564 if(op1->type)
3565 op1->type->refCount++;
3566 }
3567 return 1;
3568 }
3569
3570 static unsigned int DoubleDec(struct Expression * exp, struct Operand * op1)
3571 {
3572 exp->type = 2;
3573 exp->__anon1.__anon2.string = PrintDouble((double)(--op1->__anon1.d));
3574 if(!exp->expType)
3575 {
3576 exp->expType = op1->type;
3577 if(op1->type)
3578 op1->type->refCount++;
3579 }
3580 return 1;
3581 }
3582
3583 static unsigned int IntAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3584 {
3585 int value2 = op2->__anon1.i;
3586
3587 exp->type = 2;
3588 exp->__anon1.__anon2.string = PrintInt((op1->__anon1.i = value2));
3589 if(!exp->expType)
3590 {
3591 exp->expType = op1->type;
3592 if(op1->type)
3593 op1->type->refCount++;
3594 }
3595 return 1;
3596 }
3597
3598 static unsigned int UIntAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3599 {
3600 unsigned int value2 = op2->__anon1.ui;
3601
3602 exp->type = 2;
3603 exp->__anon1.__anon2.string = PrintUInt((op1->__anon1.ui = value2));
3604 if(!exp->expType)
3605 {
3606 exp->expType = op1->type;
3607 if(op1->type)
3608 op1->type->refCount++;
3609 }
3610 return 1;
3611 }
3612
3613 static unsigned int Int64Asign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3614 {
3615 long long value2 = op2->__anon1.i64;
3616
3617 exp->type = 2;
3618 exp->__anon1.__anon2.string = PrintInt64((op1->__anon1.i64 = value2));
3619 if(!exp->expType)
3620 {
3621 exp->expType = op1->type;
3622 if(op1->type)
3623 op1->type->refCount++;
3624 }
3625 return 1;
3626 }
3627
3628 static unsigned int UInt64Asign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3629 {
3630 uint64 value2 = op2->__anon1.ui64;
3631
3632 exp->type = 2;
3633 exp->__anon1.__anon2.string = PrintUInt64((op1->__anon1.ui64 = value2));
3634 if(!exp->expType)
3635 {
3636 exp->expType = op1->type;
3637 if(op1->type)
3638 op1->type->refCount++;
3639 }
3640 return 1;
3641 }
3642
3643 static unsigned int ShortAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3644 {
3645 short value2 = op2->__anon1.s;
3646
3647 exp->type = 2;
3648 exp->__anon1.__anon2.string = PrintShort((op1->__anon1.s = value2));
3649 if(!exp->expType)
3650 {
3651 exp->expType = op1->type;
3652 if(op1->type)
3653 op1->type->refCount++;
3654 }
3655 return 1;
3656 }
3657
3658 static unsigned int UShortAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3659 {
3660 unsigned short value2 = op2->__anon1.us;
3661
3662 exp->type = 2;
3663 exp->__anon1.__anon2.string = PrintUShort((op1->__anon1.us = value2));
3664 if(!exp->expType)
3665 {
3666 exp->expType = op1->type;
3667 if(op1->type)
3668 op1->type->refCount++;
3669 }
3670 return 1;
3671 }
3672
3673 static unsigned int CharAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3674 {
3675 char value2 = op2->__anon1.c;
3676
3677 exp->type = 2;
3678 exp->__anon1.__anon2.string = PrintChar((op1->__anon1.c = value2));
3679 if(!exp->expType)
3680 {
3681 exp->expType = op1->type;
3682 if(op1->type)
3683 op1->type->refCount++;
3684 }
3685 return 1;
3686 }
3687
3688 static unsigned int UCharAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3689 {
3690 unsigned char value2 = op2->__anon1.uc;
3691
3692 exp->type = 2;
3693 exp->__anon1.__anon2.string = PrintUChar((op1->__anon1.uc = value2));
3694 if(!exp->expType)
3695 {
3696 exp->expType = op1->type;
3697 if(op1->type)
3698 op1->type->refCount++;
3699 }
3700 return 1;
3701 }
3702
3703 static unsigned int FloatAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3704 {
3705 float value2 = op2->__anon1.f;
3706
3707 exp->type = 2;
3708 exp->__anon1.__anon2.string = PrintFloat((float)(op1->__anon1.f = value2));
3709 if(!exp->expType)
3710 {
3711 exp->expType = op1->type;
3712 if(op1->type)
3713 op1->type->refCount++;
3714 }
3715 return 1;
3716 }
3717
3718 static unsigned int DoubleAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3719 {
3720 double value2 = op2->__anon1.d;
3721
3722 exp->type = 2;
3723 exp->__anon1.__anon2.string = PrintDouble((double)(op1->__anon1.d = value2));
3724 if(!exp->expType)
3725 {
3726 exp->expType = op1->type;
3727 if(op1->type)
3728 op1->type->refCount++;
3729 }
3730 return 1;
3731 }
3732
3733 static unsigned int IntAddAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3734 {
3735 int value2 = op2->__anon1.i;
3736
3737 exp->type = 2;
3738 exp->__anon1.__anon2.string = PrintInt((op1->__anon1.i += value2));
3739 if(!exp->expType)
3740 {
3741 exp->expType = op1->type;
3742 if(op1->type)
3743 op1->type->refCount++;
3744 }
3745 return 1;
3746 }
3747
3748 static unsigned int UIntAddAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3749 {
3750 unsigned int value2 = op2->__anon1.ui;
3751
3752 exp->type = 2;
3753 exp->__anon1.__anon2.string = PrintUInt((op1->__anon1.ui += value2));
3754 if(!exp->expType)
3755 {
3756 exp->expType = op1->type;
3757 if(op1->type)
3758 op1->type->refCount++;
3759 }
3760 return 1;
3761 }
3762
3763 static unsigned int Int64AddAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3764 {
3765 long long value2 = op2->__anon1.i64;
3766
3767 exp->type = 2;
3768 exp->__anon1.__anon2.string = PrintInt64((op1->__anon1.i64 += value2));
3769 if(!exp->expType)
3770 {
3771 exp->expType = op1->type;
3772 if(op1->type)
3773 op1->type->refCount++;
3774 }
3775 return 1;
3776 }
3777
3778 static unsigned int UInt64AddAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3779 {
3780 uint64 value2 = op2->__anon1.ui64;
3781
3782 exp->type = 2;
3783 exp->__anon1.__anon2.string = PrintUInt64((op1->__anon1.ui64 += value2));
3784 if(!exp->expType)
3785 {
3786 exp->expType = op1->type;
3787 if(op1->type)
3788 op1->type->refCount++;
3789 }
3790 return 1;
3791 }
3792
3793 static unsigned int ShortAddAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3794 {
3795 short value2 = op2->__anon1.s;
3796
3797 exp->type = 2;
3798 exp->__anon1.__anon2.string = PrintShort((op1->__anon1.s += value2));
3799 if(!exp->expType)
3800 {
3801 exp->expType = op1->type;
3802 if(op1->type)
3803 op1->type->refCount++;
3804 }
3805 return 1;
3806 }
3807
3808 static unsigned int UShortAddAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3809 {
3810 unsigned short value2 = op2->__anon1.us;
3811
3812 exp->type = 2;
3813 exp->__anon1.__anon2.string = PrintUShort((op1->__anon1.us += value2));
3814 if(!exp->expType)
3815 {
3816 exp->expType = op1->type;
3817 if(op1->type)
3818 op1->type->refCount++;
3819 }
3820 return 1;
3821 }
3822
3823 static unsigned int CharAddAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3824 {
3825 char value2 = op2->__anon1.c;
3826
3827 exp->type = 2;
3828 exp->__anon1.__anon2.string = PrintChar((op1->__anon1.c += value2));
3829 if(!exp->expType)
3830 {
3831 exp->expType = op1->type;
3832 if(op1->type)
3833 op1->type->refCount++;
3834 }
3835 return 1;
3836 }
3837
3838 static unsigned int UCharAddAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3839 {
3840 unsigned char value2 = op2->__anon1.uc;
3841
3842 exp->type = 2;
3843 exp->__anon1.__anon2.string = PrintUChar((op1->__anon1.uc += value2));
3844 if(!exp->expType)
3845 {
3846 exp->expType = op1->type;
3847 if(op1->type)
3848 op1->type->refCount++;
3849 }
3850 return 1;
3851 }
3852
3853 static unsigned int FloatAddAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3854 {
3855 float value2 = op2->__anon1.f;
3856
3857 exp->type = 2;
3858 exp->__anon1.__anon2.string = PrintFloat((float)(op1->__anon1.f += value2));
3859 if(!exp->expType)
3860 {
3861 exp->expType = op1->type;
3862 if(op1->type)
3863 op1->type->refCount++;
3864 }
3865 return 1;
3866 }
3867
3868 static unsigned int DoubleAddAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3869 {
3870 double value2 = op2->__anon1.d;
3871
3872 exp->type = 2;
3873 exp->__anon1.__anon2.string = PrintDouble((double)(op1->__anon1.d += value2));
3874 if(!exp->expType)
3875 {
3876 exp->expType = op1->type;
3877 if(op1->type)
3878 op1->type->refCount++;
3879 }
3880 return 1;
3881 }
3882
3883 static unsigned int IntSubAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3884 {
3885 int value2 = op2->__anon1.i;
3886
3887 exp->type = 2;
3888 exp->__anon1.__anon2.string = PrintInt((op1->__anon1.i -= value2));
3889 if(!exp->expType)
3890 {
3891 exp->expType = op1->type;
3892 if(op1->type)
3893 op1->type->refCount++;
3894 }
3895 return 1;
3896 }
3897
3898 static unsigned int UIntSubAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3899 {
3900 unsigned int value2 = op2->__anon1.ui;
3901
3902 exp->type = 2;
3903 exp->__anon1.__anon2.string = PrintUInt((op1->__anon1.ui -= value2));
3904 if(!exp->expType)
3905 {
3906 exp->expType = op1->type;
3907 if(op1->type)
3908 op1->type->refCount++;
3909 }
3910 return 1;
3911 }
3912
3913 static unsigned int Int64SubAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3914 {
3915 long long value2 = op2->__anon1.i64;
3916
3917 exp->type = 2;
3918 exp->__anon1.__anon2.string = PrintInt64((op1->__anon1.i64 -= value2));
3919 if(!exp->expType)
3920 {
3921 exp->expType = op1->type;
3922 if(op1->type)
3923 op1->type->refCount++;
3924 }
3925 return 1;
3926 }
3927
3928 static unsigned int UInt64SubAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3929 {
3930 uint64 value2 = op2->__anon1.ui64;
3931
3932 exp->type = 2;
3933 exp->__anon1.__anon2.string = PrintUInt64((op1->__anon1.ui64 -= value2));
3934 if(!exp->expType)
3935 {
3936 exp->expType = op1->type;
3937 if(op1->type)
3938 op1->type->refCount++;
3939 }
3940 return 1;
3941 }
3942
3943 static unsigned int ShortSubAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3944 {
3945 short value2 = op2->__anon1.s;
3946
3947 exp->type = 2;
3948 exp->__anon1.__anon2.string = PrintShort((op1->__anon1.s -= value2));
3949 if(!exp->expType)
3950 {
3951 exp->expType = op1->type;
3952 if(op1->type)
3953 op1->type->refCount++;
3954 }
3955 return 1;
3956 }
3957
3958 static unsigned int UShortSubAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3959 {
3960 unsigned short value2 = op2->__anon1.us;
3961
3962 exp->type = 2;
3963 exp->__anon1.__anon2.string = PrintUShort((op1->__anon1.us -= value2));
3964 if(!exp->expType)
3965 {
3966 exp->expType = op1->type;
3967 if(op1->type)
3968 op1->type->refCount++;
3969 }
3970 return 1;
3971 }
3972
3973 static unsigned int CharSubAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3974 {
3975 char value2 = op2->__anon1.c;
3976
3977 exp->type = 2;
3978 exp->__anon1.__anon2.string = PrintChar((op1->__anon1.c -= value2));
3979 if(!exp->expType)
3980 {
3981 exp->expType = op1->type;
3982 if(op1->type)
3983 op1->type->refCount++;
3984 }
3985 return 1;
3986 }
3987
3988 static unsigned int UCharSubAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3989 {
3990 unsigned char value2 = op2->__anon1.uc;
3991
3992 exp->type = 2;
3993 exp->__anon1.__anon2.string = PrintUChar((op1->__anon1.uc -= value2));
3994 if(!exp->expType)
3995 {
3996 exp->expType = op1->type;
3997 if(op1->type)
3998 op1->type->refCount++;
3999 }
4000 return 1;
4001 }
4002
4003 static unsigned int FloatSubAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4004 {
4005 float value2 = op2->__anon1.f;
4006
4007 exp->type = 2;
4008 exp->__anon1.__anon2.string = PrintFloat((float)(op1->__anon1.f -= value2));
4009 if(!exp->expType)
4010 {
4011 exp->expType = op1->type;
4012 if(op1->type)
4013 op1->type->refCount++;
4014 }
4015 return 1;
4016 }
4017
4018 static unsigned int DoubleSubAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4019 {
4020 double value2 = op2->__anon1.d;
4021
4022 exp->type = 2;
4023 exp->__anon1.__anon2.string = PrintDouble((double)(op1->__anon1.d -= value2));
4024 if(!exp->expType)
4025 {
4026 exp->expType = op1->type;
4027 if(op1->type)
4028 op1->type->refCount++;
4029 }
4030 return 1;
4031 }
4032
4033 static unsigned int IntMulAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4034 {
4035 int value2 = op2->__anon1.i;
4036
4037 exp->type = 2;
4038 exp->__anon1.__anon2.string = PrintInt((op1->__anon1.i *= value2));
4039 if(!exp->expType)
4040 {
4041 exp->expType = op1->type;
4042 if(op1->type)
4043 op1->type->refCount++;
4044 }
4045 return 1;
4046 }
4047
4048 static unsigned int UIntMulAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4049 {
4050 unsigned int value2 = op2->__anon1.ui;
4051
4052 exp->type = 2;
4053 exp->__anon1.__anon2.string = PrintUInt((op1->__anon1.ui *= value2));
4054 if(!exp->expType)
4055 {
4056 exp->expType = op1->type;
4057 if(op1->type)
4058 op1->type->refCount++;
4059 }
4060 return 1;
4061 }
4062
4063 static unsigned int Int64MulAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4064 {
4065 long long value2 = op2->__anon1.i64;
4066
4067 exp->type = 2;
4068 exp->__anon1.__anon2.string = PrintInt64((op1->__anon1.i64 *= value2));
4069 if(!exp->expType)
4070 {
4071 exp->expType = op1->type;
4072 if(op1->type)
4073 op1->type->refCount++;
4074 }
4075 return 1;
4076 }
4077
4078 static unsigned int UInt64MulAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4079 {
4080 uint64 value2 = op2->__anon1.ui64;
4081
4082 exp->type = 2;
4083 exp->__anon1.__anon2.string = PrintUInt64((op1->__anon1.ui64 *= value2));
4084 if(!exp->expType)
4085 {
4086 exp->expType = op1->type;
4087 if(op1->type)
4088 op1->type->refCount++;
4089 }
4090 return 1;
4091 }
4092
4093 static unsigned int ShortMulAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4094 {
4095 short value2 = op2->__anon1.s;
4096
4097 exp->type = 2;
4098 exp->__anon1.__anon2.string = PrintShort((op1->__anon1.s *= value2));
4099 if(!exp->expType)
4100 {
4101 exp->expType = op1->type;
4102 if(op1->type)
4103 op1->type->refCount++;
4104 }
4105 return 1;
4106 }
4107
4108 static unsigned int UShortMulAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4109 {
4110 unsigned short value2 = op2->__anon1.us;
4111
4112 exp->type = 2;
4113 exp->__anon1.__anon2.string = PrintUShort((op1->__anon1.us *= value2));
4114 if(!exp->expType)
4115 {
4116 exp->expType = op1->type;
4117 if(op1->type)
4118 op1->type->refCount++;
4119 }
4120 return 1;
4121 }
4122
4123 static unsigned int CharMulAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4124 {
4125 char value2 = op2->__anon1.c;
4126
4127 exp->type = 2;
4128 exp->__anon1.__anon2.string = PrintChar((op1->__anon1.c *= value2));
4129 if(!exp->expType)
4130 {
4131 exp->expType = op1->type;
4132 if(op1->type)
4133 op1->type->refCount++;
4134 }
4135 return 1;
4136 }
4137
4138 static unsigned int UCharMulAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4139 {
4140 unsigned char value2 = op2->__anon1.uc;
4141
4142 exp->type = 2;
4143 exp->__anon1.__anon2.string = PrintUChar((op1->__anon1.uc *= value2));
4144 if(!exp->expType)
4145 {
4146 exp->expType = op1->type;
4147 if(op1->type)
4148 op1->type->refCount++;
4149 }
4150 return 1;
4151 }
4152
4153 static unsigned int FloatMulAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4154 {
4155 float value2 = op2->__anon1.f;
4156
4157 exp->type = 2;
4158 exp->__anon1.__anon2.string = PrintFloat((float)(op1->__anon1.f *= value2));
4159 if(!exp->expType)
4160 {
4161 exp->expType = op1->type;
4162 if(op1->type)
4163 op1->type->refCount++;
4164 }
4165 return 1;
4166 }
4167
4168 static unsigned int DoubleMulAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4169 {
4170 double value2 = op2->__anon1.d;
4171
4172 exp->type = 2;
4173 exp->__anon1.__anon2.string = PrintDouble((double)(op1->__anon1.d *= value2));
4174 if(!exp->expType)
4175 {
4176 exp->expType = op1->type;
4177 if(op1->type)
4178 op1->type->refCount++;
4179 }
4180 return 1;
4181 }
4182
4183 static unsigned int IntDivAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4184 {
4185 int value2 = op2->__anon1.i;
4186
4187 exp->type = 2;
4188 exp->__anon1.__anon2.string = PrintInt(value2 ? ((op1->__anon1.i /= value2)) : 0);
4189 if(!exp->expType)
4190 {
4191 exp->expType = op1->type;
4192 if(op1->type)
4193 op1->type->refCount++;
4194 }
4195 return 1;
4196 }
4197
4198 static unsigned int UIntDivAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4199 {
4200 unsigned int value2 = op2->__anon1.ui;
4201
4202 exp->type = 2;
4203 exp->__anon1.__anon2.string = PrintUInt(value2 ? ((op1->__anon1.ui /= value2)) : 0);
4204 if(!exp->expType)
4205 {
4206 exp->expType = op1->type;
4207 if(op1->type)
4208 op1->type->refCount++;
4209 }
4210 return 1;
4211 }
4212
4213 static unsigned int Int64DivAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4214 {
4215 long long value2 = op2->__anon1.i64;
4216
4217 exp->type = 2;
4218 exp->__anon1.__anon2.string = PrintInt64(value2 ? ((op1->__anon1.i64 /= value2)) : 0);
4219 if(!exp->expType)
4220 {
4221 exp->expType = op1->type;
4222 if(op1->type)
4223 op1->type->refCount++;
4224 }
4225 return 1;
4226 }
4227
4228 static unsigned int UInt64DivAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4229 {
4230 uint64 value2 = op2->__anon1.ui64;
4231
4232 exp->type = 2;
4233 exp->__anon1.__anon2.string = PrintUInt64(value2 ? ((op1->__anon1.ui64 /= value2)) : 0);
4234 if(!exp->expType)
4235 {
4236 exp->expType = op1->type;
4237 if(op1->type)
4238 op1->type->refCount++;
4239 }
4240 return 1;
4241 }
4242
4243 static unsigned int ShortDivAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4244 {
4245 short value2 = op2->__anon1.s;
4246
4247 exp->type = 2;
4248 exp->__anon1.__anon2.string = PrintShort(value2 ? ((op1->__anon1.s /= value2)) : 0);
4249 if(!exp->expType)
4250 {
4251 exp->expType = op1->type;
4252 if(op1->type)
4253 op1->type->refCount++;
4254 }
4255 return 1;
4256 }
4257
4258 static unsigned int UShortDivAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4259 {
4260 unsigned short value2 = op2->__anon1.us;
4261
4262 exp->type = 2;
4263 exp->__anon1.__anon2.string = PrintUShort(value2 ? ((op1->__anon1.us /= value2)) : 0);
4264 if(!exp->expType)
4265 {
4266 exp->expType = op1->type;
4267 if(op1->type)
4268 op1->type->refCount++;
4269 }
4270 return 1;
4271 }
4272
4273 static unsigned int CharDivAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4274 {
4275 char value2 = op2->__anon1.c;
4276
4277 exp->type = 2;
4278 exp->__anon1.__anon2.string = PrintChar(value2 ? ((op1->__anon1.c /= value2)) : 0);
4279 if(!exp->expType)
4280 {
4281 exp->expType = op1->type;
4282 if(op1->type)
4283 op1->type->refCount++;
4284 }
4285 return 1;
4286 }
4287
4288 static unsigned int UCharDivAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4289 {
4290 unsigned char value2 = op2->__anon1.uc;
4291
4292 exp->type = 2;
4293 exp->__anon1.__anon2.string = PrintUChar(value2 ? ((op1->__anon1.uc /= value2)) : 0);
4294 if(!exp->expType)
4295 {
4296 exp->expType = op1->type;
4297 if(op1->type)
4298 op1->type->refCount++;
4299 }
4300 return 1;
4301 }
4302
4303 static unsigned int FloatDivAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4304 {
4305 float value2 = op2->__anon1.f;
4306
4307 exp->type = 2;
4308 exp->__anon1.__anon2.string = PrintFloat((float)(op1->__anon1.f /= value2));
4309 if(!exp->expType)
4310 {
4311 exp->expType = op1->type;
4312 if(op1->type)
4313 op1->type->refCount++;
4314 }
4315 return 1;
4316 }
4317
4318 static unsigned int DoubleDivAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4319 {
4320 double value2 = op2->__anon1.d;
4321
4322 exp->type = 2;
4323 exp->__anon1.__anon2.string = PrintDouble((double)(op1->__anon1.d /= value2));
4324 if(!exp->expType)
4325 {
4326 exp->expType = op1->type;
4327 if(op1->type)
4328 op1->type->refCount++;
4329 }
4330 return 1;
4331 }
4332
4333 static unsigned int IntModAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4334 {
4335 int value2 = op2->__anon1.i;
4336
4337 exp->type = 2;
4338 exp->__anon1.__anon2.string = PrintInt(value2 ? ((op1->__anon1.i %= value2)) : 0);
4339 if(!exp->expType)
4340 {
4341 exp->expType = op1->type;
4342 if(op1->type)
4343 op1->type->refCount++;
4344 }
4345 return 1;
4346 }
4347
4348 static unsigned int UIntModAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4349 {
4350 unsigned int value2 = op2->__anon1.ui;
4351
4352 exp->type = 2;
4353 exp->__anon1.__anon2.string = PrintUInt(value2 ? ((op1->__anon1.ui %= value2)) : 0);
4354 if(!exp->expType)
4355 {
4356 exp->expType = op1->type;
4357 if(op1->type)
4358 op1->type->refCount++;
4359 }
4360 return 1;
4361 }
4362
4363 static unsigned int Int64ModAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4364 {
4365 long long value2 = op2->__anon1.i64;
4366
4367 exp->type = 2;
4368 exp->__anon1.__anon2.string = PrintInt64(value2 ? ((op1->__anon1.i64 %= value2)) : 0);
4369 if(!exp->expType)
4370 {
4371 exp->expType = op1->type;
4372 if(op1->type)
4373 op1->type->refCount++;
4374 }
4375 return 1;
4376 }
4377
4378 static unsigned int UInt64ModAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4379 {
4380 uint64 value2 = op2->__anon1.ui64;
4381
4382 exp->type = 2;
4383 exp->__anon1.__anon2.string = PrintUInt64(value2 ? ((op1->__anon1.ui64 %= value2)) : 0);
4384 if(!exp->expType)
4385 {
4386 exp->expType = op1->type;
4387 if(op1->type)
4388 op1->type->refCount++;
4389 }
4390 return 1;
4391 }
4392
4393 static unsigned int ShortModAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4394 {
4395 short value2 = op2->__anon1.s;
4396
4397 exp->type = 2;
4398 exp->__anon1.__anon2.string = PrintShort(value2 ? ((op1->__anon1.s %= value2)) : 0);
4399 if(!exp->expType)
4400 {
4401 exp->expType = op1->type;
4402 if(op1->type)
4403 op1->type->refCount++;
4404 }
4405 return 1;
4406 }
4407
4408 static unsigned int UShortModAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4409 {
4410 unsigned short value2 = op2->__anon1.us;
4411
4412 exp->type = 2;
4413 exp->__anon1.__anon2.string = PrintUShort(value2 ? ((op1->__anon1.us %= value2)) : 0);
4414 if(!exp->expType)
4415 {
4416 exp->expType = op1->type;
4417 if(op1->type)
4418 op1->type->refCount++;
4419 }
4420 return 1;
4421 }
4422
4423 static unsigned int CharModAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4424 {
4425 char value2 = op2->__anon1.c;
4426
4427 exp->type = 2;
4428 exp->__anon1.__anon2.string = PrintChar(value2 ? ((op1->__anon1.c %= value2)) : 0);
4429 if(!exp->expType)
4430 {
4431 exp->expType = op1->type;
4432 if(op1->type)
4433 op1->type->refCount++;
4434 }
4435 return 1;
4436 }
4437
4438 static unsigned int UCharModAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4439 {
4440 unsigned char value2 = op2->__anon1.uc;
4441
4442 exp->type = 2;
4443 exp->__anon1.__anon2.string = PrintUChar(value2 ? ((op1->__anon1.uc %= value2)) : 0);
4444 if(!exp->expType)
4445 {
4446 exp->expType = op1->type;
4447 if(op1->type)
4448 op1->type->refCount++;
4449 }
4450 return 1;
4451 }
4452
4453 static unsigned int IntBitAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4454 {
4455 int value2 = op2->__anon1.i;
4456
4457 exp->type = 2;
4458 exp->__anon1.__anon2.string = PrintInt((op1->__anon1.i & value2));
4459 if(!exp->expType)
4460 {
4461 exp->expType = op1->type;
4462 if(op1->type)
4463 op1->type->refCount++;
4464 }
4465 return 1;
4466 }
4467
4468 static unsigned int UIntBitAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4469 {
4470 unsigned int value2 = op2->__anon1.ui;
4471
4472 exp->type = 2;
4473 exp->__anon1.__anon2.string = PrintUInt((op1->__anon1.ui & value2));
4474 if(!exp->expType)
4475 {
4476 exp->expType = op1->type;
4477 if(op1->type)
4478 op1->type->refCount++;
4479 }
4480 return 1;
4481 }
4482
4483 static unsigned int Int64BitAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4484 {
4485 long long value2 = op2->__anon1.i64;
4486
4487 exp->type = 2;
4488 exp->__anon1.__anon2.string = PrintInt64((op1->__anon1.i64 & value2));
4489 if(!exp->expType)
4490 {
4491 exp->expType = op1->type;
4492 if(op1->type)
4493 op1->type->refCount++;
4494 }
4495 return 1;
4496 }
4497
4498 static unsigned int UInt64BitAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4499 {
4500 uint64 value2 = op2->__anon1.ui64;
4501
4502 exp->type = 2;
4503 exp->__anon1.__anon2.string = PrintUInt64((op1->__anon1.ui64 & value2));
4504 if(!exp->expType)
4505 {
4506 exp->expType = op1->type;
4507 if(op1->type)
4508 op1->type->refCount++;
4509 }
4510 return 1;
4511 }
4512
4513 static unsigned int ShortBitAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4514 {
4515 short value2 = op2->__anon1.s;
4516
4517 exp->type = 2;
4518 exp->__anon1.__anon2.string = PrintShort((short)(op1->__anon1.s & value2));
4519 if(!exp->expType)
4520 {
4521 exp->expType = op1->type;
4522 if(op1->type)
4523 op1->type->refCount++;
4524 }
4525 return 1;
4526 }
4527
4528 static unsigned int UShortBitAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4529 {
4530 unsigned short value2 = op2->__anon1.us;
4531
4532 exp->type = 2;
4533 exp->__anon1.__anon2.string = PrintUShort((unsigned short)(op1->__anon1.us & value2));
4534 if(!exp->expType)
4535 {
4536 exp->expType = op1->type;
4537 if(op1->type)
4538 op1->type->refCount++;
4539 }
4540 return 1;
4541 }
4542
4543 static unsigned int CharBitAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4544 {
4545 char value2 = op2->__anon1.c;
4546
4547 exp->type = 2;
4548 exp->__anon1.__anon2.string = PrintChar((char)(op1->__anon1.c & value2));
4549 if(!exp->expType)
4550 {
4551 exp->expType = op1->type;
4552 if(op1->type)
4553 op1->type->refCount++;
4554 }
4555 return 1;
4556 }
4557
4558 static unsigned int UCharBitAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4559 {
4560 unsigned char value2 = op2->__anon1.uc;
4561
4562 exp->type = 2;
4563 exp->__anon1.__anon2.string = PrintUChar((unsigned char)(op1->__anon1.uc & value2));
4564 if(!exp->expType)
4565 {
4566 exp->expType = op1->type;
4567 if(op1->type)
4568 op1->type->refCount++;
4569 }
4570 return 1;
4571 }
4572
4573 static unsigned int IntBitOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4574 {
4575 int value2 = op2->__anon1.i;
4576
4577 exp->type = 2;
4578 exp->__anon1.__anon2.string = PrintInt((op1->__anon1.i | value2));
4579 if(!exp->expType)
4580 {
4581 exp->expType = op1->type;
4582 if(op1->type)
4583 op1->type->refCount++;
4584 }
4585 return 1;
4586 }
4587
4588 static unsigned int UIntBitOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4589 {
4590 unsigned int value2 = op2->__anon1.ui;
4591
4592 exp->type = 2;
4593 exp->__anon1.__anon2.string = PrintUInt((op1->__anon1.ui | value2));
4594 if(!exp->expType)
4595 {
4596 exp->expType = op1->type;
4597 if(op1->type)
4598 op1->type->refCount++;
4599 }
4600 return 1;
4601 }
4602
4603 static unsigned int Int64BitOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4604 {
4605 long long value2 = op2->__anon1.i64;
4606
4607 exp->type = 2;
4608 exp->__anon1.__anon2.string = PrintInt64((op1->__anon1.i64 | value2));
4609 if(!exp->expType)
4610 {
4611 exp->expType = op1->type;
4612 if(op1->type)
4613 op1->type->refCount++;
4614 }
4615 return 1;
4616 }
4617
4618 static unsigned int UInt64BitOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4619 {
4620 uint64 value2 = op2->__anon1.ui64;
4621
4622 exp->type = 2;
4623 exp->__anon1.__anon2.string = PrintUInt64((op1->__anon1.ui64 | value2));
4624 if(!exp->expType)
4625 {
4626 exp->expType = op1->type;
4627 if(op1->type)
4628 op1->type->refCount++;
4629 }
4630 return 1;
4631 }
4632
4633 static unsigned int ShortBitOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4634 {
4635 short value2 = op2->__anon1.s;
4636
4637 exp->type = 2;
4638 exp->__anon1.__anon2.string = PrintShort((short)(op1->__anon1.s | value2));
4639 if(!exp->expType)
4640 {
4641 exp->expType = op1->type;
4642 if(op1->type)
4643 op1->type->refCount++;
4644 }
4645 return 1;
4646 }
4647
4648 static unsigned int UShortBitOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4649 {
4650 unsigned short value2 = op2->__anon1.us;
4651
4652 exp->type = 2;
4653 exp->__anon1.__anon2.string = PrintUShort((unsigned short)(op1->__anon1.us | value2));
4654 if(!exp->expType)
4655 {
4656 exp->expType = op1->type;
4657 if(op1->type)
4658 op1->type->refCount++;
4659 }
4660 return 1;
4661 }
4662
4663 static unsigned int CharBitOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4664 {
4665 char value2 = op2->__anon1.c;
4666
4667 exp->type = 2;
4668 exp->__anon1.__anon2.string = PrintChar((char)(op1->__anon1.c | value2));
4669 if(!exp->expType)
4670 {
4671 exp->expType = op1->type;
4672 if(op1->type)
4673 op1->type->refCount++;
4674 }
4675 return 1;
4676 }
4677
4678 static unsigned int UCharBitOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4679 {
4680 unsigned char value2 = op2->__anon1.uc;
4681
4682 exp->type = 2;
4683 exp->__anon1.__anon2.string = PrintUChar((unsigned char)(op1->__anon1.uc | value2));
4684 if(!exp->expType)
4685 {
4686 exp->expType = op1->type;
4687 if(op1->type)
4688 op1->type->refCount++;
4689 }
4690 return 1;
4691 }
4692
4693 static unsigned int IntBitXor(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4694 {
4695 int value2 = op2->__anon1.i;
4696
4697 exp->type = 2;
4698 exp->__anon1.__anon2.string = PrintInt((op1->__anon1.i ^ value2));
4699 if(!exp->expType)
4700 {
4701 exp->expType = op1->type;
4702 if(op1->type)
4703 op1->type->refCount++;
4704 }
4705 return 1;
4706 }
4707
4708 static unsigned int UIntBitXor(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4709 {
4710 unsigned int value2 = op2->__anon1.ui;
4711
4712 exp->type = 2;
4713 exp->__anon1.__anon2.string = PrintUInt((op1->__anon1.ui ^ value2));
4714 if(!exp->expType)
4715 {
4716 exp->expType = op1->type;
4717 if(op1->type)
4718 op1->type->refCount++;
4719 }
4720 return 1;
4721 }
4722
4723 static unsigned int Int64BitXor(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4724 {
4725 long long value2 = op2->__anon1.i64;
4726
4727 exp->type = 2;
4728 exp->__anon1.__anon2.string = PrintInt64((op1->__anon1.i64 ^ value2));
4729 if(!exp->expType)
4730 {
4731 exp->expType = op1->type;
4732 if(op1->type)
4733 op1->type->refCount++;
4734 }
4735 return 1;
4736 }
4737
4738 static unsigned int UInt64BitXor(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4739 {
4740 uint64 value2 = op2->__anon1.ui64;
4741
4742 exp->type = 2;
4743 exp->__anon1.__anon2.string = PrintUInt64((op1->__anon1.ui64 ^ value2));
4744 if(!exp->expType)
4745 {
4746 exp->expType = op1->type;
4747 if(op1->type)
4748 op1->type->refCount++;
4749 }
4750 return 1;
4751 }
4752
4753 static unsigned int ShortBitXor(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4754 {
4755 short value2 = op2->__anon1.s;
4756
4757 exp->type = 2;
4758 exp->__anon1.__anon2.string = PrintShort((short)(op1->__anon1.s ^ value2));
4759 if(!exp->expType)
4760 {
4761 exp->expType = op1->type;
4762 if(op1->type)
4763 op1->type->refCount++;
4764 }
4765 return 1;
4766 }
4767
4768 static unsigned int UShortBitXor(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4769 {
4770 unsigned short value2 = op2->__anon1.us;
4771
4772 exp->type = 2;
4773 exp->__anon1.__anon2.string = PrintUShort((unsigned short)(op1->__anon1.us ^ value2));
4774 if(!exp->expType)
4775 {
4776 exp->expType = op1->type;
4777 if(op1->type)
4778 op1->type->refCount++;
4779 }
4780 return 1;
4781 }
4782
4783 static unsigned int CharBitXor(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4784 {
4785 char value2 = op2->__anon1.c;
4786
4787 exp->type = 2;
4788 exp->__anon1.__anon2.string = PrintChar((char)(op1->__anon1.c ^ value2));
4789 if(!exp->expType)
4790 {
4791 exp->expType = op1->type;
4792 if(op1->type)
4793 op1->type->refCount++;
4794 }
4795 return 1;
4796 }
4797
4798 static unsigned int UCharBitXor(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4799 {
4800 unsigned char value2 = op2->__anon1.uc;
4801
4802 exp->type = 2;
4803 exp->__anon1.__anon2.string = PrintUChar((unsigned char)(op1->__anon1.uc ^ value2));
4804 if(!exp->expType)
4805 {
4806 exp->expType = op1->type;
4807 if(op1->type)
4808 op1->type->refCount++;
4809 }
4810 return 1;
4811 }
4812
4813 static unsigned int IntLShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4814 {
4815 int value2 = op2->__anon1.i;
4816
4817 exp->type = 2;
4818 exp->__anon1.__anon2.string = PrintInt((op1->__anon1.i << value2));
4819 if(!exp->expType)
4820 {
4821 exp->expType = op1->type;
4822 if(op1->type)
4823 op1->type->refCount++;
4824 }
4825 return 1;
4826 }
4827
4828 static unsigned int UIntLShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4829 {
4830 unsigned int value2 = op2->__anon1.ui;
4831
4832 exp->type = 2;
4833 exp->__anon1.__anon2.string = PrintUInt((op1->__anon1.ui << value2));
4834 if(!exp->expType)
4835 {
4836 exp->expType = op1->type;
4837 if(op1->type)
4838 op1->type->refCount++;
4839 }
4840 return 1;
4841 }
4842
4843 static unsigned int Int64LShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4844 {
4845 long long value2 = op2->__anon1.i64;
4846
4847 exp->type = 2;
4848 exp->__anon1.__anon2.string = PrintInt64((op1->__anon1.i64 << value2));
4849 if(!exp->expType)
4850 {
4851 exp->expType = op1->type;
4852 if(op1->type)
4853 op1->type->refCount++;
4854 }
4855 return 1;
4856 }
4857
4858 static unsigned int UInt64LShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4859 {
4860 uint64 value2 = op2->__anon1.ui64;
4861
4862 exp->type = 2;
4863 exp->__anon1.__anon2.string = PrintUInt64((op1->__anon1.ui64 << value2));
4864 if(!exp->expType)
4865 {
4866 exp->expType = op1->type;
4867 if(op1->type)
4868 op1->type->refCount++;
4869 }
4870 return 1;
4871 }
4872
4873 static unsigned int ShortLShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4874 {
4875 short value2 = op2->__anon1.s;
4876
4877 exp->type = 2;
4878 exp->__anon1.__anon2.string = PrintShort((short)(op1->__anon1.s << value2));
4879 if(!exp->expType)
4880 {
4881 exp->expType = op1->type;
4882 if(op1->type)
4883 op1->type->refCount++;
4884 }
4885 return 1;
4886 }
4887
4888 static unsigned int UShortLShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4889 {
4890 unsigned short value2 = op2->__anon1.us;
4891
4892 exp->type = 2;
4893 exp->__anon1.__anon2.string = PrintUShort((unsigned short)(op1->__anon1.us << value2));
4894 if(!exp->expType)
4895 {
4896 exp->expType = op1->type;
4897 if(op1->type)
4898 op1->type->refCount++;
4899 }
4900 return 1;
4901 }
4902
4903 static unsigned int CharLShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4904 {
4905 char value2 = op2->__anon1.c;
4906
4907 exp->type = 2;
4908 exp->__anon1.__anon2.string = PrintChar((char)(op1->__anon1.c << value2));
4909 if(!exp->expType)
4910 {
4911 exp->expType = op1->type;
4912 if(op1->type)
4913 op1->type->refCount++;
4914 }
4915 return 1;
4916 }
4917
4918 static unsigned int UCharLShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4919 {
4920 unsigned char value2 = op2->__anon1.uc;
4921
4922 exp->type = 2;
4923 exp->__anon1.__anon2.string = PrintUChar((unsigned char)(op1->__anon1.uc << value2));
4924 if(!exp->expType)
4925 {
4926 exp->expType = op1->type;
4927 if(op1->type)
4928 op1->type->refCount++;
4929 }
4930 return 1;
4931 }
4932
4933 static unsigned int IntRShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4934 {
4935 int value2 = op2->__anon1.i;
4936
4937 exp->type = 2;
4938 exp->__anon1.__anon2.string = PrintInt((op1->__anon1.i >> value2));
4939 if(!exp->expType)
4940 {
4941 exp->expType = op1->type;
4942 if(op1->type)
4943 op1->type->refCount++;
4944 }
4945 return 1;
4946 }
4947
4948 static unsigned int UIntRShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4949 {
4950 unsigned int value2 = op2->__anon1.ui;
4951
4952 exp->type = 2;
4953 exp->__anon1.__anon2.string = PrintUInt((op1->__anon1.ui >> value2));
4954 if(!exp->expType)
4955 {
4956 exp->expType = op1->type;
4957 if(op1->type)
4958 op1->type->refCount++;
4959 }
4960 return 1;
4961 }
4962
4963 static unsigned int Int64RShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4964 {
4965 long long value2 = op2->__anon1.i64;
4966
4967 exp->type = 2;
4968 exp->__anon1.__anon2.string = PrintInt64((op1->__anon1.i64 >> value2));
4969 if(!exp->expType)
4970 {
4971 exp->expType = op1->type;
4972 if(op1->type)
4973 op1->type->refCount++;
4974 }
4975 return 1;
4976 }
4977
4978 static unsigned int UInt64RShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4979 {
4980 uint64 value2 = op2->__anon1.ui64;
4981
4982 exp->type = 2;
4983 exp->__anon1.__anon2.string = PrintUInt64((op1->__anon1.ui64 >> value2));
4984 if(!exp->expType)
4985 {
4986 exp->expType = op1->type;
4987 if(op1->type)
4988 op1->type->refCount++;
4989 }
4990 return 1;
4991 }
4992
4993 static unsigned int ShortRShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4994 {
4995 short value2 = op2->__anon1.s;
4996
4997 exp->type = 2;
4998 exp->__anon1.__anon2.string = PrintShort((short)(op1->__anon1.s >> value2));
4999 if(!exp->expType)
5000 {
5001 exp->expType = op1->type;
5002 if(op1->type)
5003 op1->type->refCount++;
5004 }
5005 return 1;
5006 }
5007
5008 static unsigned int UShortRShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5009 {
5010 unsigned short value2 = op2->__anon1.us;
5011
5012 exp->type = 2;
5013 exp->__anon1.__anon2.string = PrintUShort((unsigned short)(op1->__anon1.us >> value2));
5014 if(!exp->expType)
5015 {
5016 exp->expType = op1->type;
5017 if(op1->type)
5018 op1->type->refCount++;
5019 }
5020 return 1;
5021 }
5022
5023 static unsigned int CharRShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5024 {
5025 char value2 = op2->__anon1.c;
5026
5027 exp->type = 2;
5028 exp->__anon1.__anon2.string = PrintChar((char)(op1->__anon1.c >> value2));
5029 if(!exp->expType)
5030 {
5031 exp->expType = op1->type;
5032 if(op1->type)
5033 op1->type->refCount++;
5034 }
5035 return 1;
5036 }
5037
5038 static unsigned int UCharRShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5039 {
5040 unsigned char value2 = op2->__anon1.uc;
5041
5042 exp->type = 2;
5043 exp->__anon1.__anon2.string = PrintUChar((unsigned char)(op1->__anon1.uc >> value2));
5044 if(!exp->expType)
5045 {
5046 exp->expType = op1->type;
5047 if(op1->type)
5048 op1->type->refCount++;
5049 }
5050 return 1;
5051 }
5052
5053 static unsigned int IntBitNot(struct Expression * exp, struct Operand * op1)
5054 {
5055 exp->type = 2;
5056 exp->__anon1.__anon2.string = PrintInt((~op1->__anon1.i));
5057 if(!exp->expType)
5058 {
5059 exp->expType = op1->type;
5060 if(op1->type)
5061 op1->type->refCount++;
5062 }
5063 return 1;
5064 }
5065
5066 static unsigned int UIntBitNot(struct Expression * exp, struct Operand * op1)
5067 {
5068 exp->type = 2;
5069 exp->__anon1.__anon2.string = PrintUInt((unsigned int)(~op1->__anon1.ui));
5070 if(!exp->expType)
5071 {
5072 exp->expType = op1->type;
5073 if(op1->type)
5074 op1->type->refCount++;
5075 }
5076 return 1;
5077 }
5078
5079 static unsigned int Int64BitNot(struct Expression * exp, struct Operand * op1)
5080 {
5081 exp->type = 2;
5082 exp->__anon1.__anon2.string = PrintInt64((long long)(~op1->__anon1.i64));
5083 if(!exp->expType)
5084 {
5085 exp->expType = op1->type;
5086 if(op1->type)
5087 op1->type->refCount++;
5088 }
5089 return 1;
5090 }
5091
5092 static unsigned int UInt64BitNot(struct Expression * exp, struct Operand * op1)
5093 {
5094 exp->type = 2;
5095 exp->__anon1.__anon2.string = PrintUInt64((uint64)(~op1->__anon1.ui64));
5096 if(!exp->expType)
5097 {
5098 exp->expType = op1->type;
5099 if(op1->type)
5100 op1->type->refCount++;
5101 }
5102 return 1;
5103 }
5104
5105 static unsigned int ShortBitNot(struct Expression * exp, struct Operand * op1)
5106 {
5107 exp->type = 2;
5108 exp->__anon1.__anon2.string = PrintShort((short)(~op1->__anon1.s));
5109 if(!exp->expType)
5110 {
5111 exp->expType = op1->type;
5112 if(op1->type)
5113 op1->type->refCount++;
5114 }
5115 return 1;
5116 }
5117
5118 static unsigned int UShortBitNot(struct Expression * exp, struct Operand * op1)
5119 {
5120 exp->type = 2;
5121 exp->__anon1.__anon2.string = PrintUShort((unsigned short)(~op1->__anon1.us));
5122 if(!exp->expType)
5123 {
5124 exp->expType = op1->type;
5125 if(op1->type)
5126 op1->type->refCount++;
5127 }
5128 return 1;
5129 }
5130
5131 static unsigned int CharBitNot(struct Expression * exp, struct Operand * op1)
5132 {
5133 exp->type = 2;
5134 exp->__anon1.__anon2.string = PrintChar((char)(~op1->__anon1.c));
5135 if(!exp->expType)
5136 {
5137 exp->expType = op1->type;
5138 if(op1->type)
5139 op1->type->refCount++;
5140 }
5141 return 1;
5142 }
5143
5144 static unsigned int UCharBitNot(struct Expression * exp, struct Operand * op1)
5145 {
5146 exp->type = 2;
5147 exp->__anon1.__anon2.string = PrintUChar((unsigned char)(~op1->__anon1.uc));
5148 if(!exp->expType)
5149 {
5150 exp->expType = op1->type;
5151 if(op1->type)
5152 op1->type->refCount++;
5153 }
5154 return 1;
5155 }
5156
5157 static unsigned int IntAndAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5158 {
5159 int value2 = op2->__anon1.i;
5160
5161 exp->type = 2;
5162 exp->__anon1.__anon2.string = PrintInt((op1->__anon1.i &= value2));
5163 if(!exp->expType)
5164 {
5165 exp->expType = op1->type;
5166 if(op1->type)
5167 op1->type->refCount++;
5168 }
5169 return 1;
5170 }
5171
5172 static unsigned int UIntAndAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5173 {
5174 unsigned int value2 = op2->__anon1.ui;
5175
5176 exp->type = 2;
5177 exp->__anon1.__anon2.string = PrintUInt((op1->__anon1.ui &= value2));
5178 if(!exp->expType)
5179 {
5180 exp->expType = op1->type;
5181 if(op1->type)
5182 op1->type->refCount++;
5183 }
5184 return 1;
5185 }
5186
5187 static unsigned int Int64AndAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5188 {
5189 long long value2 = op2->__anon1.i64;
5190
5191 exp->type = 2;
5192 exp->__anon1.__anon2.string = PrintInt64((op1->__anon1.i64 &= value2));
5193 if(!exp->expType)
5194 {
5195 exp->expType = op1->type;
5196 if(op1->type)
5197 op1->type->refCount++;
5198 }
5199 return 1;
5200 }
5201
5202 static unsigned int UInt64AndAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5203 {
5204 uint64 value2 = op2->__anon1.ui64;
5205
5206 exp->type = 2;
5207 exp->__anon1.__anon2.string = PrintUInt64((op1->__anon1.ui64 &= value2));
5208 if(!exp->expType)
5209 {
5210 exp->expType = op1->type;
5211 if(op1->type)
5212 op1->type->refCount++;
5213 }
5214 return 1;
5215 }
5216
5217 static unsigned int ShortAndAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5218 {
5219 short value2 = op2->__anon1.s;
5220
5221 exp->type = 2;
5222 exp->__anon1.__anon2.string = PrintShort((op1->__anon1.s &= value2));
5223 if(!exp->expType)
5224 {
5225 exp->expType = op1->type;
5226 if(op1->type)
5227 op1->type->refCount++;
5228 }
5229 return 1;
5230 }
5231
5232 static unsigned int UShortAndAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5233 {
5234 unsigned short value2 = op2->__anon1.us;
5235
5236 exp->type = 2;
5237 exp->__anon1.__anon2.string = PrintUShort((op1->__anon1.us &= value2));
5238 if(!exp->expType)
5239 {
5240 exp->expType = op1->type;
5241 if(op1->type)
5242 op1->type->refCount++;
5243 }
5244 return 1;
5245 }
5246
5247 static unsigned int CharAndAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5248 {
5249 char value2 = op2->__anon1.c;
5250
5251 exp->type = 2;
5252 exp->__anon1.__anon2.string = PrintChar((op1->__anon1.c &= value2));
5253 if(!exp->expType)
5254 {
5255 exp->expType = op1->type;
5256 if(op1->type)
5257 op1->type->refCount++;
5258 }
5259 return 1;
5260 }
5261
5262 static unsigned int UCharAndAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5263 {
5264 unsigned char value2 = op2->__anon1.uc;
5265
5266 exp->type = 2;
5267 exp->__anon1.__anon2.string = PrintUChar((op1->__anon1.uc &= value2));
5268 if(!exp->expType)
5269 {
5270 exp->expType = op1->type;
5271 if(op1->type)
5272 op1->type->refCount++;
5273 }
5274 return 1;
5275 }
5276
5277 static unsigned int IntOrAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5278 {
5279 int value2 = op2->__anon1.i;
5280
5281 exp->type = 2;
5282 exp->__anon1.__anon2.string = PrintInt((op1->__anon1.i |= value2));
5283 if(!exp->expType)
5284 {
5285 exp->expType = op1->type;
5286 if(op1->type)
5287 op1->type->refCount++;
5288 }
5289 return 1;
5290 }
5291
5292 static unsigned int UIntOrAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5293 {
5294 unsigned int value2 = op2->__anon1.ui;
5295
5296 exp->type = 2;
5297 exp->__anon1.__anon2.string = PrintUInt((op1->__anon1.ui |= value2));
5298 if(!exp->expType)
5299 {
5300 exp->expType = op1->type;
5301 if(op1->type)
5302 op1->type->refCount++;
5303 }
5304 return 1;
5305 }
5306
5307 static unsigned int Int64OrAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5308 {
5309 long long value2 = op2->__anon1.i64;
5310
5311 exp->type = 2;
5312 exp->__anon1.__anon2.string = PrintInt64((op1->__anon1.i64 |= value2));
5313 if(!exp->expType)
5314 {
5315 exp->expType = op1->type;
5316 if(op1->type)
5317 op1->type->refCount++;
5318 }
5319 return 1;
5320 }
5321
5322 static unsigned int UInt64OrAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5323 {
5324 uint64 value2 = op2->__anon1.ui64;
5325
5326 exp->type = 2;
5327 exp->__anon1.__anon2.string = PrintUInt64((op1->__anon1.ui64 |= value2));
5328 if(!exp->expType)
5329 {
5330 exp->expType = op1->type;
5331 if(op1->type)
5332 op1->type->refCount++;
5333 }
5334 return 1;
5335 }
5336
5337 static unsigned int ShortOrAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5338 {
5339 short value2 = op2->__anon1.s;
5340
5341 exp->type = 2;
5342 exp->__anon1.__anon2.string = PrintShort((op1->__anon1.s |= value2));
5343 if(!exp->expType)
5344 {
5345 exp->expType = op1->type;
5346 if(op1->type)
5347 op1->type->refCount++;
5348 }
5349 return 1;
5350 }
5351
5352 static unsigned int UShortOrAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5353 {
5354 unsigned short value2 = op2->__anon1.us;
5355
5356 exp->type = 2;
5357 exp->__anon1.__anon2.string = PrintUShort((op1->__anon1.us |= value2));
5358 if(!exp->expType)
5359 {
5360 exp->expType = op1->type;
5361 if(op1->type)
5362 op1->type->refCount++;
5363 }
5364 return 1;
5365 }
5366
5367 static unsigned int CharOrAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5368 {
5369 char value2 = op2->__anon1.c;
5370
5371 exp->type = 2;
5372 exp->__anon1.__anon2.string = PrintChar((op1->__anon1.c |= value2));
5373 if(!exp->expType)
5374 {
5375 exp->expType = op1->type;
5376 if(op1->type)
5377 op1->type->refCount++;
5378 }
5379 return 1;
5380 }
5381
5382 static unsigned int UCharOrAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5383 {
5384 unsigned char value2 = op2->__anon1.uc;
5385
5386 exp->type = 2;
5387 exp->__anon1.__anon2.string = PrintUChar((op1->__anon1.uc |= value2));
5388 if(!exp->expType)
5389 {
5390 exp->expType = op1->type;
5391 if(op1->type)
5392 op1->type->refCount++;
5393 }
5394 return 1;
5395 }
5396
5397 static unsigned int IntXorAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5398 {
5399 int value2 = op2->__anon1.i;
5400
5401 exp->type = 2;
5402 exp->__anon1.__anon2.string = PrintInt((op1->__anon1.i ^= value2));
5403 if(!exp->expType)
5404 {
5405 exp->expType = op1->type;
5406 if(op1->type)
5407 op1->type->refCount++;
5408 }
5409 return 1;
5410 }
5411
5412 static unsigned int UIntXorAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5413 {
5414 unsigned int value2 = op2->__anon1.ui;
5415
5416 exp->type = 2;
5417 exp->__anon1.__anon2.string = PrintUInt((op1->__anon1.ui ^= value2));
5418 if(!exp->expType)
5419 {
5420 exp->expType = op1->type;
5421 if(op1->type)
5422 op1->type->refCount++;
5423 }
5424 return 1;
5425 }
5426
5427 static unsigned int Int64XorAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5428 {
5429 long long value2 = op2->__anon1.i64;
5430
5431 exp->type = 2;
5432 exp->__anon1.__anon2.string = PrintInt64((op1->__anon1.i64 ^= value2));
5433 if(!exp->expType)
5434 {
5435 exp->expType = op1->type;
5436 if(op1->type)
5437 op1->type->refCount++;
5438 }
5439 return 1;
5440 }
5441
5442 static unsigned int UInt64XorAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5443 {
5444 uint64 value2 = op2->__anon1.ui64;
5445
5446 exp->type = 2;
5447 exp->__anon1.__anon2.string = PrintUInt64((op1->__anon1.ui64 ^= value2));
5448 if(!exp->expType)
5449 {
5450 exp->expType = op1->type;
5451 if(op1->type)
5452 op1->type->refCount++;
5453 }
5454 return 1;
5455 }
5456
5457 static unsigned int ShortXorAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5458 {
5459 short value2 = op2->__anon1.s;
5460
5461 exp->type = 2;
5462 exp->__anon1.__anon2.string = PrintShort((op1->__anon1.s ^= value2));
5463 if(!exp->expType)
5464 {
5465 exp->expType = op1->type;
5466 if(op1->type)
5467 op1->type->refCount++;
5468 }
5469 return 1;
5470 }
5471
5472 static unsigned int UShortXorAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5473 {
5474 unsigned short value2 = op2->__anon1.us;
5475
5476 exp->type = 2;
5477 exp->__anon1.__anon2.string = PrintUShort((op1->__anon1.us ^= value2));
5478 if(!exp->expType)
5479 {
5480 exp->expType = op1->type;
5481 if(op1->type)
5482 op1->type->refCount++;
5483 }
5484 return 1;
5485 }
5486
5487 static unsigned int CharXorAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5488 {
5489 char value2 = op2->__anon1.c;
5490
5491 exp->type = 2;
5492 exp->__anon1.__anon2.string = PrintChar((op1->__anon1.c ^= value2));
5493 if(!exp->expType)
5494 {
5495 exp->expType = op1->type;
5496 if(op1->type)
5497 op1->type->refCount++;
5498 }
5499 return 1;
5500 }
5501
5502 static unsigned int UCharXorAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5503 {
5504 unsigned char value2 = op2->__anon1.uc;
5505
5506 exp->type = 2;
5507 exp->__anon1.__anon2.string = PrintUChar((op1->__anon1.uc ^= value2));
5508 if(!exp->expType)
5509 {
5510 exp->expType = op1->type;
5511 if(op1->type)
5512 op1->type->refCount++;
5513 }
5514 return 1;
5515 }
5516
5517 static unsigned int IntLShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5518 {
5519 int value2 = op2->__anon1.i;
5520
5521 exp->type = 2;
5522 exp->__anon1.__anon2.string = PrintInt((op1->__anon1.i <<= value2));
5523 if(!exp->expType)
5524 {
5525 exp->expType = op1->type;
5526 if(op1->type)
5527 op1->type->refCount++;
5528 }
5529 return 1;
5530 }
5531
5532 static unsigned int UIntLShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5533 {
5534 unsigned int value2 = op2->__anon1.ui;
5535
5536 exp->type = 2;
5537 exp->__anon1.__anon2.string = PrintUInt((op1->__anon1.ui <<= value2));
5538 if(!exp->expType)
5539 {
5540 exp->expType = op1->type;
5541 if(op1->type)
5542 op1->type->refCount++;
5543 }
5544 return 1;
5545 }
5546
5547 static unsigned int Int64LShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5548 {
5549 long long value2 = op2->__anon1.i64;
5550
5551 exp->type = 2;
5552 exp->__anon1.__anon2.string = PrintInt64((op1->__anon1.i64 <<= value2));
5553 if(!exp->expType)
5554 {
5555 exp->expType = op1->type;
5556 if(op1->type)
5557 op1->type->refCount++;
5558 }
5559 return 1;
5560 }
5561
5562 static unsigned int UInt64LShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5563 {
5564 uint64 value2 = op2->__anon1.ui64;
5565
5566 exp->type = 2;
5567 exp->__anon1.__anon2.string = PrintUInt64((op1->__anon1.ui64 <<= value2));
5568 if(!exp->expType)
5569 {
5570 exp->expType = op1->type;
5571 if(op1->type)
5572 op1->type->refCount++;
5573 }
5574 return 1;
5575 }
5576
5577 static unsigned int ShortLShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5578 {
5579 short value2 = op2->__anon1.s;
5580
5581 exp->type = 2;
5582 exp->__anon1.__anon2.string = PrintShort((op1->__anon1.s <<= value2));
5583 if(!exp->expType)
5584 {
5585 exp->expType = op1->type;
5586 if(op1->type)
5587 op1->type->refCount++;
5588 }
5589 return 1;
5590 }
5591
5592 static unsigned int UShortLShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5593 {
5594 unsigned short value2 = op2->__anon1.us;
5595
5596 exp->type = 2;
5597 exp->__anon1.__anon2.string = PrintUShort((op1->__anon1.us <<= value2));
5598 if(!exp->expType)
5599 {
5600 exp->expType = op1->type;
5601 if(op1->type)
5602 op1->type->refCount++;
5603 }
5604 return 1;
5605 }
5606
5607 static unsigned int CharLShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5608 {
5609 char value2 = op2->__anon1.c;
5610
5611 exp->type = 2;
5612 exp->__anon1.__anon2.string = PrintChar((op1->__anon1.c <<= value2));
5613 if(!exp->expType)
5614 {
5615 exp->expType = op1->type;
5616 if(op1->type)
5617 op1->type->refCount++;
5618 }
5619 return 1;
5620 }
5621
5622 static unsigned int UCharLShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5623 {
5624 unsigned char value2 = op2->__anon1.uc;
5625
5626 exp->type = 2;
5627 exp->__anon1.__anon2.string = PrintUChar((op1->__anon1.uc <<= value2));
5628 if(!exp->expType)
5629 {
5630 exp->expType = op1->type;
5631 if(op1->type)
5632 op1->type->refCount++;
5633 }
5634 return 1;
5635 }
5636
5637 static unsigned int IntRShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5638 {
5639 int value2 = op2->__anon1.i;
5640
5641 exp->type = 2;
5642 exp->__anon1.__anon2.string = PrintInt((op1->__anon1.i >>= value2));
5643 if(!exp->expType)
5644 {
5645 exp->expType = op1->type;
5646 if(op1->type)
5647 op1->type->refCount++;
5648 }
5649 return 1;
5650 }
5651
5652 static unsigned int UIntRShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5653 {
5654 unsigned int value2 = op2->__anon1.ui;
5655
5656 exp->type = 2;
5657 exp->__anon1.__anon2.string = PrintUInt((op1->__anon1.ui >>= value2));
5658 if(!exp->expType)
5659 {
5660 exp->expType = op1->type;
5661 if(op1->type)
5662 op1->type->refCount++;
5663 }
5664 return 1;
5665 }
5666
5667 static unsigned int Int64RShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5668 {
5669 long long value2 = op2->__anon1.i64;
5670
5671 exp->type = 2;
5672 exp->__anon1.__anon2.string = PrintInt64((op1->__anon1.i64 >>= value2));
5673 if(!exp->expType)
5674 {
5675 exp->expType = op1->type;
5676 if(op1->type)
5677 op1->type->refCount++;
5678 }
5679 return 1;
5680 }
5681
5682 static unsigned int UInt64RShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5683 {
5684 uint64 value2 = op2->__anon1.ui64;
5685
5686 exp->type = 2;
5687 exp->__anon1.__anon2.string = PrintUInt64((op1->__anon1.ui64 >>= value2));
5688 if(!exp->expType)
5689 {
5690 exp->expType = op1->type;
5691 if(op1->type)
5692 op1->type->refCount++;
5693 }
5694 return 1;
5695 }
5696
5697 static unsigned int ShortRShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5698 {
5699 short value2 = op2->__anon1.s;
5700
5701 exp->type = 2;
5702 exp->__anon1.__anon2.string = PrintShort((op1->__anon1.s >>= value2));
5703 if(!exp->expType)
5704 {
5705 exp->expType = op1->type;
5706 if(op1->type)
5707 op1->type->refCount++;
5708 }
5709 return 1;
5710 }
5711
5712 static unsigned int UShortRShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5713 {
5714 unsigned short value2 = op2->__anon1.us;
5715
5716 exp->type = 2;
5717 exp->__anon1.__anon2.string = PrintUShort((op1->__anon1.us >>= value2));
5718 if(!exp->expType)
5719 {
5720 exp->expType = op1->type;
5721 if(op1->type)
5722 op1->type->refCount++;
5723 }
5724 return 1;
5725 }
5726
5727 static unsigned int CharRShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5728 {
5729 char value2 = op2->__anon1.c;
5730
5731 exp->type = 2;
5732 exp->__anon1.__anon2.string = PrintChar((op1->__anon1.c >>= value2));
5733 if(!exp->expType)
5734 {
5735 exp->expType = op1->type;
5736 if(op1->type)
5737 op1->type->refCount++;
5738 }
5739 return 1;
5740 }
5741
5742 static unsigned int UCharRShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5743 {
5744 unsigned char value2 = op2->__anon1.uc;
5745
5746 exp->type = 2;
5747 exp->__anon1.__anon2.string = PrintUChar((op1->__anon1.uc >>= value2));
5748 if(!exp->expType)
5749 {
5750 exp->expType = op1->type;
5751 if(op1->type)
5752 op1->type->refCount++;
5753 }
5754 return 1;
5755 }
5756
5757 static unsigned int IntNot(struct Expression * exp, struct Operand * op1)
5758 {
5759 exp->type = 2;
5760 exp->__anon1.__anon2.string = PrintInt((int)(!op1->__anon1.i));
5761 if(!exp->expType)
5762 {
5763 exp->expType = op1->type;
5764 if(op1->type)
5765 op1->type->refCount++;
5766 }
5767 return 1;
5768 }
5769
5770 static unsigned int UIntNot(struct Expression * exp, struct Operand * op1)
5771 {
5772 exp->type = 2;
5773 exp->__anon1.__anon2.string = PrintUInt((unsigned int)(!op1->__anon1.ui));
5774 if(!exp->expType)
5775 {
5776 exp->expType = op1->type;
5777 if(op1->type)
5778 op1->type->refCount++;
5779 }
5780 return 1;
5781 }
5782
5783 static unsigned int Int64Not(struct Expression * exp, struct Operand * op1)
5784 {
5785 exp->type = 2;
5786 exp->__anon1.__anon2.string = PrintInt64((long long)(!op1->__anon1.i64));
5787 if(!exp->expType)
5788 {
5789 exp->expType = op1->type;
5790 if(op1->type)
5791 op1->type->refCount++;
5792 }
5793 return 1;
5794 }
5795
5796 static unsigned int UInt64Not(struct Expression * exp, struct Operand * op1)
5797 {
5798 exp->type = 2;
5799 exp->__anon1.__anon2.string = PrintUInt64((uint64)(!op1->__anon1.ui64));
5800 if(!exp->expType)
5801 {
5802 exp->expType = op1->type;
5803 if(op1->type)
5804 op1->type->refCount++;
5805 }
5806 return 1;
5807 }
5808
5809 static unsigned int ShortNot(struct Expression * exp, struct Operand * op1)
5810 {
5811 exp->type = 2;
5812 exp->__anon1.__anon2.string = PrintShort((short)(!op1->__anon1.s));
5813 if(!exp->expType)
5814 {
5815 exp->expType = op1->type;
5816 if(op1->type)
5817 op1->type->refCount++;
5818 }
5819 return 1;
5820 }
5821
5822 static unsigned int UShortNot(struct Expression * exp, struct Operand * op1)
5823 {
5824 exp->type = 2;
5825 exp->__anon1.__anon2.string = PrintUShort((unsigned short)(!op1->__anon1.us));
5826 if(!exp->expType)
5827 {
5828 exp->expType = op1->type;
5829 if(op1->type)
5830 op1->type->refCount++;
5831 }
5832 return 1;
5833 }
5834
5835 static unsigned int CharNot(struct Expression * exp, struct Operand * op1)
5836 {
5837 exp->type = 2;
5838 exp->__anon1.__anon2.string = PrintChar((char)(!op1->__anon1.c));
5839 if(!exp->expType)
5840 {
5841 exp->expType = op1->type;
5842 if(op1->type)
5843 op1->type->refCount++;
5844 }
5845 return 1;
5846 }
5847
5848 static unsigned int UCharNot(struct Expression * exp, struct Operand * op1)
5849 {
5850 exp->type = 2;
5851 exp->__anon1.__anon2.string = PrintUChar((unsigned char)(!op1->__anon1.uc));
5852 if(!exp->expType)
5853 {
5854 exp->expType = op1->type;
5855 if(op1->type)
5856 op1->type->refCount++;
5857 }
5858 return 1;
5859 }
5860
5861 static unsigned int IntEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5862 {
5863 int value2 = op2->__anon1.i;
5864
5865 exp->type = 2;
5866 exp->__anon1.__anon2.string = PrintInt((int)(op1->__anon1.i == value2));
5867 if(!exp->expType)
5868 {
5869 exp->expType = op1->type;
5870 if(op1->type)
5871 op1->type->refCount++;
5872 }
5873 return 1;
5874 }
5875
5876 static unsigned int UIntEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5877 {
5878 unsigned int value2 = op2->__anon1.ui;
5879
5880 exp->type = 2;
5881 exp->__anon1.__anon2.string = PrintUInt((unsigned int)(op1->__anon1.ui == value2));
5882 if(!exp->expType)
5883 {
5884 exp->expType = op1->type;
5885 if(op1->type)
5886 op1->type->refCount++;
5887 }
5888 return 1;
5889 }
5890
5891 static unsigned int Int64Equ(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5892 {
5893 long long value2 = op2->__anon1.i64;
5894
5895 exp->type = 2;
5896 exp->__anon1.__anon2.string = PrintInt64((long long)(op1->__anon1.i64 == value2));
5897 if(!exp->expType)
5898 {
5899 exp->expType = op1->type;
5900 if(op1->type)
5901 op1->type->refCount++;
5902 }
5903 return 1;
5904 }
5905
5906 static unsigned int UInt64Equ(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5907 {
5908 uint64 value2 = op2->__anon1.ui64;
5909
5910 exp->type = 2;
5911 exp->__anon1.__anon2.string = PrintUInt64((uint64)(op1->__anon1.ui64 == value2));
5912 if(!exp->expType)
5913 {
5914 exp->expType = op1->type;
5915 if(op1->type)
5916 op1->type->refCount++;
5917 }
5918 return 1;
5919 }
5920
5921 static unsigned int ShortEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5922 {
5923 short value2 = op2->__anon1.s;
5924
5925 exp->type = 2;
5926 exp->__anon1.__anon2.string = PrintShort((short)(op1->__anon1.s == value2));
5927 if(!exp->expType)
5928 {
5929 exp->expType = op1->type;
5930 if(op1->type)
5931 op1->type->refCount++;
5932 }
5933 return 1;
5934 }
5935
5936 static unsigned int UShortEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5937 {
5938 unsigned short value2 = op2->__anon1.us;
5939
5940 exp->type = 2;
5941 exp->__anon1.__anon2.string = PrintUShort((unsigned short)(op1->__anon1.us == value2));
5942 if(!exp->expType)
5943 {
5944 exp->expType = op1->type;
5945 if(op1->type)
5946 op1->type->refCount++;
5947 }
5948 return 1;
5949 }
5950
5951 static unsigned int CharEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5952 {
5953 char value2 = op2->__anon1.c;
5954
5955 exp->type = 2;
5956 exp->__anon1.__anon2.string = PrintChar((char)(op1->__anon1.c == value2));
5957 if(!exp->expType)
5958 {
5959 exp->expType = op1->type;
5960 if(op1->type)
5961 op1->type->refCount++;
5962 }
5963 return 1;
5964 }
5965
5966 static unsigned int UCharEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5967 {
5968 unsigned char value2 = op2->__anon1.uc;
5969
5970 exp->type = 2;
5971 exp->__anon1.__anon2.string = PrintUChar((unsigned char)(op1->__anon1.uc == value2));
5972 if(!exp->expType)
5973 {
5974 exp->expType = op1->type;
5975 if(op1->type)
5976 op1->type->refCount++;
5977 }
5978 return 1;
5979 }
5980
5981 static unsigned int FloatEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5982 {
5983 float value2 = op2->__anon1.f;
5984
5985 exp->type = 2;
5986 exp->__anon1.__anon2.string = PrintFloat((float)(op1->__anon1.f == value2));
5987 if(!exp->expType)
5988 {
5989 exp->expType = op1->type;
5990 if(op1->type)
5991 op1->type->refCount++;
5992 }
5993 return 1;
5994 }
5995
5996 static unsigned int DoubleEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5997 {
5998 double value2 = op2->__anon1.d;
5999
6000 exp->type = 2;
6001 exp->__anon1.__anon2.string = PrintDouble((double)(op1->__anon1.d == value2));
6002 if(!exp->expType)
6003 {
6004 exp->expType = op1->type;
6005 if(op1->type)
6006 op1->type->refCount++;
6007 }
6008 return 1;
6009 }
6010
6011 static unsigned int IntNqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6012 {
6013 int value2 = op2->__anon1.i;
6014
6015 exp->type = 2;
6016 exp->__anon1.__anon2.string = PrintInt((int)(op1->__anon1.i != value2));
6017 if(!exp->expType)
6018 {
6019 exp->expType = op1->type;
6020 if(op1->type)
6021 op1->type->refCount++;
6022 }
6023 return 1;
6024 }
6025
6026 static unsigned int UIntNqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6027 {
6028 unsigned int value2 = op2->__anon1.ui;
6029
6030 exp->type = 2;
6031 exp->__anon1.__anon2.string = PrintUInt((unsigned int)(op1->__anon1.ui != value2));
6032 if(!exp->expType)
6033 {
6034 exp->expType = op1->type;
6035 if(op1->type)
6036 op1->type->refCount++;
6037 }
6038 return 1;
6039 }
6040
6041 static unsigned int Int64Nqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6042 {
6043 long long value2 = op2->__anon1.i64;
6044
6045 exp->type = 2;
6046 exp->__anon1.__anon2.string = PrintInt64((long long)(op1->__anon1.i64 != value2));
6047 if(!exp->expType)
6048 {
6049 exp->expType = op1->type;
6050 if(op1->type)
6051 op1->type->refCount++;
6052 }
6053 return 1;
6054 }
6055
6056 static unsigned int UInt64Nqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6057 {
6058 uint64 value2 = op2->__anon1.ui64;
6059
6060 exp->type = 2;
6061 exp->__anon1.__anon2.string = PrintUInt64((uint64)(op1->__anon1.ui64 != value2));
6062 if(!exp->expType)
6063 {
6064 exp->expType = op1->type;
6065 if(op1->type)
6066 op1->type->refCount++;
6067 }
6068 return 1;
6069 }
6070
6071 static unsigned int ShortNqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6072 {
6073 short value2 = op2->__anon1.s;
6074
6075 exp->type = 2;
6076 exp->__anon1.__anon2.string = PrintShort((short)(op1->__anon1.s != value2));
6077 if(!exp->expType)
6078 {
6079 exp->expType = op1->type;
6080 if(op1->type)
6081 op1->type->refCount++;
6082 }
6083 return 1;
6084 }
6085
6086 static unsigned int UShortNqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6087 {
6088 unsigned short value2 = op2->__anon1.us;
6089
6090 exp->type = 2;
6091 exp->__anon1.__anon2.string = PrintUShort((unsigned short)(op1->__anon1.us != value2));
6092 if(!exp->expType)
6093 {
6094 exp->expType = op1->type;
6095 if(op1->type)
6096 op1->type->refCount++;
6097 }
6098 return 1;
6099 }
6100
6101 static unsigned int CharNqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6102 {
6103 char value2 = op2->__anon1.c;
6104
6105 exp->type = 2;
6106 exp->__anon1.__anon2.string = PrintChar((char)(op1->__anon1.c != value2));
6107 if(!exp->expType)
6108 {
6109 exp->expType = op1->type;
6110 if(op1->type)
6111 op1->type->refCount++;
6112 }
6113 return 1;
6114 }
6115
6116 static unsigned int UCharNqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6117 {
6118 unsigned char value2 = op2->__anon1.uc;
6119
6120 exp->type = 2;
6121 exp->__anon1.__anon2.string = PrintUChar((unsigned char)(op1->__anon1.uc != value2));
6122 if(!exp->expType)
6123 {
6124 exp->expType = op1->type;
6125 if(op1->type)
6126 op1->type->refCount++;
6127 }
6128 return 1;
6129 }
6130
6131 static unsigned int FloatNqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6132 {
6133 float value2 = op2->__anon1.f;
6134
6135 exp->type = 2;
6136 exp->__anon1.__anon2.string = PrintFloat((float)(op1->__anon1.f != value2));
6137 if(!exp->expType)
6138 {
6139 exp->expType = op1->type;
6140 if(op1->type)
6141 op1->type->refCount++;
6142 }
6143 return 1;
6144 }
6145
6146 static unsigned int DoubleNqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6147 {
6148 double value2 = op2->__anon1.d;
6149
6150 exp->type = 2;
6151 exp->__anon1.__anon2.string = PrintDouble((double)(op1->__anon1.d != value2));
6152 if(!exp->expType)
6153 {
6154 exp->expType = op1->type;
6155 if(op1->type)
6156 op1->type->refCount++;
6157 }
6158 return 1;
6159 }
6160
6161 static unsigned int IntAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6162 {
6163 int value2 = op2->__anon1.i;
6164
6165 exp->type = 2;
6166 exp->__anon1.__anon2.string = PrintInt((int)(op1->__anon1.i && value2));
6167 if(!exp->expType)
6168 {
6169 exp->expType = op1->type;
6170 if(op1->type)
6171 op1->type->refCount++;
6172 }
6173 return 1;
6174 }
6175
6176 static unsigned int UIntAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6177 {
6178 unsigned int value2 = op2->__anon1.ui;
6179
6180 exp->type = 2;
6181 exp->__anon1.__anon2.string = PrintUInt((unsigned int)(op1->__anon1.ui && value2));
6182 if(!exp->expType)
6183 {
6184 exp->expType = op1->type;
6185 if(op1->type)
6186 op1->type->refCount++;
6187 }
6188 return 1;
6189 }
6190
6191 static unsigned int Int64And(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6192 {
6193 long long value2 = op2->__anon1.i64;
6194
6195 exp->type = 2;
6196 exp->__anon1.__anon2.string = PrintInt64((long long)(op1->__anon1.i64 && value2));
6197 if(!exp->expType)
6198 {
6199 exp->expType = op1->type;
6200 if(op1->type)
6201 op1->type->refCount++;
6202 }
6203 return 1;
6204 }
6205
6206 static unsigned int UInt64And(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6207 {
6208 uint64 value2 = op2->__anon1.ui64;
6209
6210 exp->type = 2;
6211 exp->__anon1.__anon2.string = PrintUInt64((uint64)(op1->__anon1.ui64 && value2));
6212 if(!exp->expType)
6213 {
6214 exp->expType = op1->type;
6215 if(op1->type)
6216 op1->type->refCount++;
6217 }
6218 return 1;
6219 }
6220
6221 static unsigned int ShortAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6222 {
6223 short value2 = op2->__anon1.s;
6224
6225 exp->type = 2;
6226 exp->__anon1.__anon2.string = PrintShort((short)(op1->__anon1.s && value2));
6227 if(!exp->expType)
6228 {
6229 exp->expType = op1->type;
6230 if(op1->type)
6231 op1->type->refCount++;
6232 }
6233 return 1;
6234 }
6235
6236 static unsigned int UShortAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6237 {
6238 unsigned short value2 = op2->__anon1.us;
6239
6240 exp->type = 2;
6241 exp->__anon1.__anon2.string = PrintUShort((unsigned short)(op1->__anon1.us && value2));
6242 if(!exp->expType)
6243 {
6244 exp->expType = op1->type;
6245 if(op1->type)
6246 op1->type->refCount++;
6247 }
6248 return 1;
6249 }
6250
6251 static unsigned int CharAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6252 {
6253 char value2 = op2->__anon1.c;
6254
6255 exp->type = 2;
6256 exp->__anon1.__anon2.string = PrintChar((char)(op1->__anon1.c && value2));
6257 if(!exp->expType)
6258 {
6259 exp->expType = op1->type;
6260 if(op1->type)
6261 op1->type->refCount++;
6262 }
6263 return 1;
6264 }
6265
6266 static unsigned int UCharAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6267 {
6268 unsigned char value2 = op2->__anon1.uc;
6269
6270 exp->type = 2;
6271 exp->__anon1.__anon2.string = PrintUChar((unsigned char)(op1->__anon1.uc && value2));
6272 if(!exp->expType)
6273 {
6274 exp->expType = op1->type;
6275 if(op1->type)
6276 op1->type->refCount++;
6277 }
6278 return 1;
6279 }
6280
6281 static unsigned int FloatAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6282 {
6283 float value2 = op2->__anon1.f;
6284
6285 exp->type = 2;
6286 exp->__anon1.__anon2.string = PrintFloat((float)(op1->__anon1.f && value2));
6287 if(!exp->expType)
6288 {
6289 exp->expType = op1->type;
6290 if(op1->type)
6291 op1->type->refCount++;
6292 }
6293 return 1;
6294 }
6295
6296 static unsigned int DoubleAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6297 {
6298 double value2 = op2->__anon1.d;
6299
6300 exp->type = 2;
6301 exp->__anon1.__anon2.string = PrintDouble((double)(op1->__anon1.d && value2));
6302 if(!exp->expType)
6303 {
6304 exp->expType = op1->type;
6305 if(op1->type)
6306 op1->type->refCount++;
6307 }
6308 return 1;
6309 }
6310
6311 static unsigned int IntOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6312 {
6313 int value2 = op2->__anon1.i;
6314
6315 exp->type = 2;
6316 exp->__anon1.__anon2.string = PrintInt((int)(op1->__anon1.i || value2));
6317 if(!exp->expType)
6318 {
6319 exp->expType = op1->type;
6320 if(op1->type)
6321 op1->type->refCount++;
6322 }
6323 return 1;
6324 }
6325
6326 static unsigned int UIntOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6327 {
6328 unsigned int value2 = op2->__anon1.ui;
6329
6330 exp->type = 2;
6331 exp->__anon1.__anon2.string = PrintUInt((unsigned int)(op1->__anon1.ui || value2));
6332 if(!exp->expType)
6333 {
6334 exp->expType = op1->type;
6335 if(op1->type)
6336 op1->type->refCount++;
6337 }
6338 return 1;
6339 }
6340
6341 static unsigned int Int64Or(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6342 {
6343 long long value2 = op2->__anon1.i64;
6344
6345 exp->type = 2;
6346 exp->__anon1.__anon2.string = PrintInt64((long long)(op1->__anon1.i64 || value2));
6347 if(!exp->expType)
6348 {
6349 exp->expType = op1->type;
6350 if(op1->type)
6351 op1->type->refCount++;
6352 }
6353 return 1;
6354 }
6355
6356 static unsigned int UInt64Or(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6357 {
6358 uint64 value2 = op2->__anon1.ui64;
6359
6360 exp->type = 2;
6361 exp->__anon1.__anon2.string = PrintUInt64((uint64)(op1->__anon1.ui64 || value2));
6362 if(!exp->expType)
6363 {
6364 exp->expType = op1->type;
6365 if(op1->type)
6366 op1->type->refCount++;
6367 }
6368 return 1;
6369 }
6370
6371 static unsigned int ShortOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6372 {
6373 short value2 = op2->__anon1.s;
6374
6375 exp->type = 2;
6376 exp->__anon1.__anon2.string = PrintShort((short)(op1->__anon1.s || value2));
6377 if(!exp->expType)
6378 {
6379 exp->expType = op1->type;
6380 if(op1->type)
6381 op1->type->refCount++;
6382 }
6383 return 1;
6384 }
6385
6386 static unsigned int UShortOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6387 {
6388 unsigned short value2 = op2->__anon1.us;
6389
6390 exp->type = 2;
6391 exp->__anon1.__anon2.string = PrintUShort((unsigned short)(op1->__anon1.us || value2));
6392 if(!exp->expType)
6393 {
6394 exp->expType = op1->type;
6395 if(op1->type)
6396 op1->type->refCount++;
6397 }
6398 return 1;
6399 }
6400
6401 static unsigned int CharOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6402 {
6403 char value2 = op2->__anon1.c;
6404
6405 exp->type = 2;
6406 exp->__anon1.__anon2.string = PrintChar((char)(op1->__anon1.c || value2));
6407 if(!exp->expType)
6408 {
6409 exp->expType = op1->type;
6410 if(op1->type)
6411 op1->type->refCount++;
6412 }
6413 return 1;
6414 }
6415
6416 static unsigned int UCharOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6417 {
6418 unsigned char value2 = op2->__anon1.uc;
6419
6420 exp->type = 2;
6421 exp->__anon1.__anon2.string = PrintUChar((unsigned char)(op1->__anon1.uc || value2));
6422 if(!exp->expType)
6423 {
6424 exp->expType = op1->type;
6425 if(op1->type)
6426 op1->type->refCount++;
6427 }
6428 return 1;
6429 }
6430
6431 static unsigned int FloatOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6432 {
6433 float value2 = op2->__anon1.f;
6434
6435 exp->type = 2;
6436 exp->__anon1.__anon2.string = PrintFloat((float)(op1->__anon1.f || value2));
6437 if(!exp->expType)
6438 {
6439 exp->expType = op1->type;
6440 if(op1->type)
6441 op1->type->refCount++;
6442 }
6443 return 1;
6444 }
6445
6446 static unsigned int DoubleOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6447 {
6448 double value2 = op2->__anon1.d;
6449
6450 exp->type = 2;
6451 exp->__anon1.__anon2.string = PrintDouble((double)(op1->__anon1.d || value2));
6452 if(!exp->expType)
6453 {
6454 exp->expType = op1->type;
6455 if(op1->type)
6456 op1->type->refCount++;
6457 }
6458 return 1;
6459 }
6460
6461 static unsigned int IntGrt(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6462 {
6463 int value2 = op2->__anon1.i;
6464
6465 exp->type = 2;
6466 exp->__anon1.__anon2.string = PrintInt((int)(op1->__anon1.i > value2));
6467 if(!exp->expType)
6468 {
6469 exp->expType = op1->type;
6470 if(op1->type)
6471 op1->type->refCount++;
6472 }
6473 return 1;
6474 }
6475
6476 static unsigned int UIntGrt(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6477 {
6478 unsigned int value2 = op2->__anon1.ui;
6479
6480 exp->type = 2;
6481 exp->__anon1.__anon2.string = PrintUInt((unsigned int)(op1->__anon1.ui > value2));
6482 if(!exp->expType)
6483 {
6484 exp->expType = op1->type;
6485 if(op1->type)
6486 op1->type->refCount++;
6487 }
6488 return 1;
6489 }
6490
6491 static unsigned int Int64Grt(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6492 {
6493 long long value2 = op2->__anon1.i64;
6494
6495 exp->type = 2;
6496 exp->__anon1.__anon2.string = PrintInt64((long long)(op1->__anon1.i64 > value2));
6497 if(!exp->expType)
6498 {
6499 exp->expType = op1->type;
6500 if(op1->type)
6501 op1->type->refCount++;
6502 }
6503 return 1;
6504 }
6505
6506 static unsigned int UInt64Grt(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6507 {
6508 uint64 value2 = op2->__anon1.ui64;
6509
6510 exp->type = 2;
6511 exp->__anon1.__anon2.string = PrintUInt64((uint64)(op1->__anon1.ui64 > value2));
6512 if(!exp->expType)
6513 {
6514 exp->expType = op1->type;
6515 if(op1->type)
6516 op1->type->refCount++;
6517 }
6518 return 1;
6519 }
6520
6521 static unsigned int ShortGrt(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6522 {
6523 short value2 = op2->__anon1.s;
6524
6525 exp->type = 2;
6526 exp->__anon1.__anon2.string = PrintShort((short)(op1->__anon1.s > value2));
6527 if(!exp->expType)
6528 {
6529 exp->expType = op1->type;
6530 if(op1->type)
6531 op1->type->refCount++;
6532 }
6533 return 1;
6534 }
6535
6536 static unsigned int UShortGrt(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6537 {
6538 unsigned short value2 = op2->__anon1.us;
6539
6540 exp->type = 2;
6541 exp->__anon1.__anon2.string = PrintUShort((unsigned short)(op1->__anon1.us > value2));
6542 if(!exp->expType)
6543 {
6544 exp->expType = op1->type;
6545 if(op1->type)
6546 op1->type->refCount++;
6547 }
6548 return 1;
6549 }
6550
6551 static unsigned int CharGrt(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6552 {
6553 char value2 = op2->__anon1.c;
6554
6555 exp->type = 2;
6556 exp->__anon1.__anon2.string = PrintChar((char)(op1->__anon1.c > value2));
6557 if(!exp->expType)
6558 {
6559 exp->expType = op1->type;
6560 if(op1->type)
6561 op1->type->refCount++;
6562 }
6563 return 1;
6564 }
6565
6566 static unsigned int UCharGrt(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6567 {
6568 unsigned char value2 = op2->__anon1.uc;
6569
6570 exp->type = 2;
6571 exp->__anon1.__anon2.string = PrintUChar((unsigned char)(op1->__anon1.uc > value2));
6572 if(!exp->expType)
6573 {
6574 exp->expType = op1->type;
6575 if(op1->type)
6576 op1->type->refCount++;
6577 }
6578 return 1;
6579 }
6580
6581 static unsigned int FloatGrt(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6582 {
6583 float value2 = op2->__anon1.f;
6584
6585 exp->type = 2;
6586 exp->__anon1.__anon2.string = PrintFloat((float)(op1->__anon1.f > value2));
6587 if(!exp->expType)
6588 {
6589 exp->expType = op1->type;
6590 if(op1->type)
6591 op1->type->refCount++;
6592 }
6593 return 1;
6594 }
6595
6596 static unsigned int DoubleGrt(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6597 {
6598 double value2 = op2->__anon1.d;
6599
6600 exp->type = 2;
6601 exp->__anon1.__anon2.string = PrintDouble((double)(op1->__anon1.d > value2));
6602 if(!exp->expType)
6603 {
6604 exp->expType = op1->type;
6605 if(op1->type)
6606 op1->type->refCount++;
6607 }
6608 return 1;
6609 }
6610
6611 static unsigned int IntSma(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6612 {
6613 int value2 = op2->__anon1.i;
6614
6615 exp->type = 2;
6616 exp->__anon1.__anon2.string = PrintInt((int)(op1->__anon1.i < value2));
6617 if(!exp->expType)
6618 {
6619 exp->expType = op1->type;
6620 if(op1->type)
6621 op1->type->refCount++;
6622 }
6623 return 1;
6624 }
6625
6626 static unsigned int UIntSma(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6627 {
6628 unsigned int value2 = op2->__anon1.ui;
6629
6630 exp->type = 2;
6631 exp->__anon1.__anon2.string = PrintUInt((unsigned int)(op1->__anon1.ui < value2));
6632 if(!exp->expType)
6633 {
6634 exp->expType = op1->type;
6635 if(op1->type)
6636 op1->type->refCount++;
6637 }
6638 return 1;
6639 }
6640
6641 static unsigned int Int64Sma(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6642 {
6643 long long value2 = op2->__anon1.i64;
6644
6645 exp->type = 2;
6646 exp->__anon1.__anon2.string = PrintInt64((long long)(op1->__anon1.i64 < value2));
6647 if(!exp->expType)
6648 {
6649 exp->expType = op1->type;
6650 if(op1->type)
6651 op1->type->refCount++;
6652 }
6653 return 1;
6654 }
6655
6656 static unsigned int UInt64Sma(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6657 {
6658 uint64 value2 = op2->__anon1.ui64;
6659
6660 exp->type = 2;
6661 exp->__anon1.__anon2.string = PrintUInt64((uint64)(op1->__anon1.ui64 < value2));
6662 if(!exp->expType)
6663 {
6664 exp->expType = op1->type;
6665 if(op1->type)
6666 op1->type->refCount++;
6667 }
6668 return 1;
6669 }
6670
6671 static unsigned int ShortSma(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6672 {
6673 short value2 = op2->__anon1.s;
6674
6675 exp->type = 2;
6676 exp->__anon1.__anon2.string = PrintShort((short)(op1->__anon1.s < value2));
6677 if(!exp->expType)
6678 {
6679 exp->expType = op1->type;
6680 if(op1->type)
6681 op1->type->refCount++;
6682 }
6683 return 1;
6684 }
6685
6686 static unsigned int UShortSma(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6687 {
6688 unsigned short value2 = op2->__anon1.us;
6689
6690 exp->type = 2;
6691 exp->__anon1.__anon2.string = PrintUShort((unsigned short)(op1->__anon1.us < value2));
6692 if(!exp->expType)
6693 {
6694 exp->expType = op1->type;
6695 if(op1->type)
6696 op1->type->refCount++;
6697 }
6698 return 1;
6699 }
6700
6701 static unsigned int CharSma(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6702 {
6703 char value2 = op2->__anon1.c;
6704
6705 exp->type = 2;
6706 exp->__anon1.__anon2.string = PrintChar((char)(op1->__anon1.c < value2));
6707 if(!exp->expType)
6708 {
6709 exp->expType = op1->type;
6710 if(op1->type)
6711 op1->type->refCount++;
6712 }
6713 return 1;
6714 }
6715
6716 static unsigned int UCharSma(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6717 {
6718 unsigned char value2 = op2->__anon1.uc;
6719
6720 exp->type = 2;
6721 exp->__anon1.__anon2.string = PrintUChar((unsigned char)(op1->__anon1.uc < value2));
6722 if(!exp->expType)
6723 {
6724 exp->expType = op1->type;
6725 if(op1->type)
6726 op1->type->refCount++;
6727 }
6728 return 1;
6729 }
6730
6731 static unsigned int FloatSma(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6732 {
6733 float value2 = op2->__anon1.f;
6734
6735 exp->type = 2;
6736 exp->__anon1.__anon2.string = PrintFloat((float)(op1->__anon1.f < value2));
6737 if(!exp->expType)
6738 {
6739 exp->expType = op1->type;
6740 if(op1->type)
6741 op1->type->refCount++;
6742 }
6743 return 1;
6744 }
6745
6746 static unsigned int DoubleSma(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6747 {
6748 double value2 = op2->__anon1.d;
6749
6750 exp->type = 2;
6751 exp->__anon1.__anon2.string = PrintDouble((double)(op1->__anon1.d < value2));
6752 if(!exp->expType)
6753 {
6754 exp->expType = op1->type;
6755 if(op1->type)
6756 op1->type->refCount++;
6757 }
6758 return 1;
6759 }
6760
6761 static unsigned int IntGrtEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6762 {
6763 int value2 = op2->__anon1.i;
6764
6765 exp->type = 2;
6766 exp->__anon1.__anon2.string = PrintInt((int)(op1->__anon1.i >= value2));
6767 if(!exp->expType)
6768 {
6769 exp->expType = op1->type;
6770 if(op1->type)
6771 op1->type->refCount++;
6772 }
6773 return 1;
6774 }
6775
6776 static unsigned int UIntGrtEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6777 {
6778 unsigned int value2 = op2->__anon1.ui;
6779
6780 exp->type = 2;
6781 exp->__anon1.__anon2.string = PrintUInt((unsigned int)(op1->__anon1.ui >= value2));
6782 if(!exp->expType)
6783 {
6784 exp->expType = op1->type;
6785 if(op1->type)
6786 op1->type->refCount++;
6787 }
6788 return 1;
6789 }
6790
6791 static unsigned int Int64GrtEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6792 {
6793 long long value2 = op2->__anon1.i64;
6794
6795 exp->type = 2;
6796 exp->__anon1.__anon2.string = PrintInt64((long long)(op1->__anon1.i64 >= value2));
6797 if(!exp->expType)
6798 {
6799 exp->expType = op1->type;
6800 if(op1->type)
6801 op1->type->refCount++;
6802 }
6803 return 1;
6804 }
6805
6806 static unsigned int UInt64GrtEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6807 {
6808 uint64 value2 = op2->__anon1.ui64;
6809
6810 exp->type = 2;
6811 exp->__anon1.__anon2.string = PrintUInt64((uint64)(op1->__anon1.ui64 >= value2));
6812 if(!exp->expType)
6813 {
6814 exp->expType = op1->type;
6815 if(op1->type)
6816 op1->type->refCount++;
6817 }
6818 return 1;
6819 }
6820
6821 static unsigned int ShortGrtEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6822 {
6823 short value2 = op2->__anon1.s;
6824
6825 exp->type = 2;
6826 exp->__anon1.__anon2.string = PrintShort((short)(op1->__anon1.s >= value2));
6827 if(!exp->expType)
6828 {
6829 exp->expType = op1->type;
6830 if(op1->type)
6831 op1->type->refCount++;
6832 }
6833 return 1;
6834 }
6835
6836 static unsigned int UShortGrtEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6837 {
6838 unsigned short value2 = op2->__anon1.us;
6839
6840 exp->type = 2;
6841 exp->__anon1.__anon2.string = PrintUShort((unsigned short)(op1->__anon1.us >= value2));
6842 if(!exp->expType)
6843 {
6844 exp->expType = op1->type;
6845 if(op1->type)
6846 op1->type->refCount++;
6847 }
6848 return 1;
6849 }
6850
6851 static unsigned int CharGrtEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6852 {
6853 char value2 = op2->__anon1.c;
6854
6855 exp->type = 2;
6856 exp->__anon1.__anon2.string = PrintChar((char)(op1->__anon1.c >= value2));
6857 if(!exp->expType)
6858 {
6859 exp->expType = op1->type;
6860 if(op1->type)
6861 op1->type->refCount++;
6862 }
6863 return 1;
6864 }
6865
6866 static unsigned int UCharGrtEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6867 {
6868 unsigned char value2 = op2->__anon1.uc;
6869
6870 exp->type = 2;
6871 exp->__anon1.__anon2.string = PrintUChar((unsigned char)(op1->__anon1.uc >= value2));
6872 if(!exp->expType)
6873 {
6874 exp->expType = op1->type;
6875 if(op1->type)
6876 op1->type->refCount++;
6877 }
6878 return 1;
6879 }
6880
6881 static unsigned int FloatGrtEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6882 {
6883 float value2 = op2->__anon1.f;
6884
6885 exp->type = 2;
6886 exp->__anon1.__anon2.string = PrintFloat((float)(op1->__anon1.f >= value2));
6887 if(!exp->expType)
6888 {
6889 exp->expType = op1->type;
6890 if(op1->type)
6891 op1->type->refCount++;
6892 }
6893 return 1;
6894 }
6895
6896 static unsigned int DoubleGrtEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6897 {
6898 double value2 = op2->__anon1.d;
6899
6900 exp->type = 2;
6901 exp->__anon1.__anon2.string = PrintDouble((double)(op1->__anon1.d >= value2));
6902 if(!exp->expType)
6903 {
6904 exp->expType = op1->type;
6905 if(op1->type)
6906 op1->type->refCount++;
6907 }
6908 return 1;
6909 }
6910
6911 static unsigned int IntSmaEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6912 {
6913 int value2 = op2->__anon1.i;
6914
6915 exp->type = 2;
6916 exp->__anon1.__anon2.string = PrintInt((int)(op1->__anon1.i <= value2));
6917 if(!exp->expType)
6918 {
6919 exp->expType = op1->type;
6920 if(op1->type)
6921 op1->type->refCount++;
6922 }
6923 return 1;
6924 }
6925
6926 static unsigned int UIntSmaEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6927 {
6928 unsigned int value2 = op2->__anon1.ui;
6929
6930 exp->type = 2;
6931 exp->__anon1.__anon2.string = PrintUInt((unsigned int)(op1->__anon1.ui <= value2));
6932 if(!exp->expType)
6933 {
6934 exp->expType = op1->type;
6935 if(op1->type)
6936 op1->type->refCount++;
6937 }
6938 return 1;
6939 }
6940
6941 static unsigned int Int64SmaEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6942 {
6943 long long value2 = op2->__anon1.i64;
6944
6945 exp->type = 2;
6946 exp->__anon1.__anon2.string = PrintInt64((long long)(op1->__anon1.i64 <= value2));
6947 if(!exp->expType)
6948 {
6949 exp->expType = op1->type;
6950 if(op1->type)
6951 op1->type->refCount++;
6952 }
6953 return 1;
6954 }
6955
6956 static unsigned int UInt64SmaEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6957 {
6958 uint64 value2 = op2->__anon1.ui64;
6959
6960 exp->type = 2;
6961 exp->__anon1.__anon2.string = PrintUInt64((uint64)(op1->__anon1.ui64 <= value2));
6962 if(!exp->expType)
6963 {
6964 exp->expType = op1->type;
6965 if(op1->type)
6966 op1->type->refCount++;
6967 }
6968 return 1;
6969 }
6970
6971 static unsigned int ShortSmaEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6972 {
6973 short value2 = op2->__anon1.s;
6974
6975 exp->type = 2;
6976 exp->__anon1.__anon2.string = PrintShort((short)(op1->__anon1.s <= value2));
6977 if(!exp->expType)
6978 {
6979 exp->expType = op1->type;
6980 if(op1->type)
6981 op1->type->refCount++;
6982 }
6983 return 1;
6984 }
6985
6986 static unsigned int UShortSmaEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6987 {
6988 unsigned short value2 = op2->__anon1.us;
6989
6990 exp->type = 2;
6991 exp->__anon1.__anon2.string = PrintUShort((unsigned short)(op1->__anon1.us <= value2));
6992 if(!exp->expType)
6993 {
6994 exp->expType = op1->type;
6995 if(op1->type)
6996 op1->type->refCount++;
6997 }
6998 return 1;
6999 }
7000
7001 static unsigned int CharSmaEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
7002 {
7003 char value2 = op2->__anon1.c;
7004
7005 exp->type = 2;
7006 exp->__anon1.__anon2.string = PrintChar((char)(op1->__anon1.c <= value2));
7007 if(!exp->expType)
7008 {
7009 exp->expType = op1->type;
7010 if(op1->type)
7011 op1->type->refCount++;
7012 }
7013 return 1;
7014 }
7015
7016 static unsigned int UCharSmaEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
7017 {
7018 unsigned char value2 = op2->__anon1.uc;
7019
7020 exp->type = 2;
7021 exp->__anon1.__anon2.string = PrintUChar((unsigned char)(op1->__anon1.uc <= value2));
7022 if(!exp->expType)
7023 {
7024 exp->expType = op1->type;
7025 if(op1->type)
7026 op1->type->refCount++;
7027 }
7028 return 1;
7029 }
7030
7031 static unsigned int FloatSmaEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
7032 {
7033 float value2 = op2->__anon1.f;
7034
7035 exp->type = 2;
7036 exp->__anon1.__anon2.string = PrintFloat((float)(op1->__anon1.f <= value2));
7037 if(!exp->expType)
7038 {
7039 exp->expType = op1->type;
7040 if(op1->type)
7041 op1->type->refCount++;
7042 }
7043 return 1;
7044 }
7045
7046 static unsigned int DoubleSmaEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
7047 {
7048 double value2 = op2->__anon1.d;
7049
7050 exp->type = 2;
7051 exp->__anon1.__anon2.string = PrintDouble((double)(op1->__anon1.d <= value2));
7052 if(!exp->expType)
7053 {
7054 exp->expType = op1->type;
7055 if(op1->type)
7056 op1->type->refCount++;
7057 }
7058 return 1;
7059 }
7060
7061 static unsigned int IntCond(struct Expression * exp, struct Operand * op1, struct Operand * op2, struct Operand * op3)
7062 {
7063 exp->type = 2;
7064 exp->__anon1.__anon2.string = PrintInt(op1->__anon1.i ? op2->__anon1.i : op3->__anon1.i);
7065 if(!exp->expType)
7066 {
7067 exp->expType = op1->type;
7068 if(op1->type)
7069 op1->type->refCount++;
7070 }
7071 return 1;
7072 }
7073
7074 static unsigned int UIntCond(struct Expression * exp, struct Operand * op1, struct Operand * op2, struct Operand * op3)
7075 {
7076 exp->type = 2;
7077 exp->__anon1.__anon2.string = PrintUInt(op1->__anon1.ui ? op2->__anon1.ui : op3->__anon1.ui);
7078 if(!exp->expType)
7079 {
7080 exp->expType = op1->type;
7081 if(op1->type)
7082 op1->type->refCount++;
7083 }
7084 return 1;
7085 }
7086
7087 static unsigned int Int64Cond(struct Expression * exp, struct Operand * op1, struct Operand * op2, struct Operand * op3)
7088 {
7089 exp->type = 2;
7090 exp->__anon1.__anon2.string = PrintInt64(op1->__anon1.i64 ? op2->__anon1.i64 : op3->__anon1.i64);
7091 if(!exp->expType)
7092 {
7093 exp->expType = op1->type;
7094 if(op1->type)
7095 op1->type->refCount++;
7096 }
7097 return 1;
7098 }
7099
7100 static unsigned int UInt64Cond(struct Expression * exp, struct Operand * op1, struct Operand * op2, struct Operand * op3)
7101 {
7102 exp->type = 2;
7103 exp->__anon1.__anon2.string = PrintUInt64(op1->__anon1.ui64 ? op2->__anon1.ui64 : op3->__anon1.ui64);
7104 if(!exp->expType)
7105 {
7106 exp->expType = op1->type;
7107 if(op1->type)
7108 op1->type->refCount++;
7109 }
7110 return 1;
7111 }
7112
7113 static unsigned int ShortCond(struct Expression * exp, struct Operand * op1, struct Operand * op2, struct Operand * op3)
7114 {
7115 exp->type = 2;
7116 exp->__anon1.__anon2.string = PrintShort(op1->__anon1.s ? op2->__anon1.s : op3->__anon1.s);
7117 if(!exp->expType)
7118 {
7119 exp->expType = op1->type;
7120 if(op1->type)
7121 op1->type->refCount++;
7122 }
7123 return 1;
7124 }
7125
7126 static unsigned int UShortCond(struct Expression * exp, struct Operand * op1, struct Operand * op2, struct Operand * op3)
7127 {
7128 exp->type = 2;
7129 exp->__anon1.__anon2.string = PrintUShort(op1->__anon1.us ? op2->__anon1.us : op3->__anon1.us);
7130 if(!exp->expType)
7131 {
7132 exp->expType = op1->type;
7133 if(op1->type)
7134 op1->type->refCount++;
7135 }
7136 return 1;
7137 }
7138
7139 static unsigned int CharCond(struct Expression * exp, struct Operand * op1, struct Operand * op2, struct Operand * op3)
7140 {
7141 exp->type = 2;
7142 exp->__anon1.__anon2.string = PrintChar(op1->__anon1.c ? op2->__anon1.c : op3->__anon1.c);
7143 if(!exp->expType)
7144 {
7145 exp->expType = op1->type;
7146 if(op1->type)
7147 op1->type->refCount++;
7148 }
7149 return 1;
7150 }
7151
7152 static unsigned int UCharCond(struct Expression * exp, struct Operand * op1, struct Operand * op2, struct Operand * op3)
7153 {
7154 exp->type = 2;
7155 exp->__anon1.__anon2.string = PrintUChar(op1->__anon1.uc ? op2->__anon1.uc : op3->__anon1.uc);
7156 if(!exp->expType)
7157 {
7158 exp->expType = op1->type;
7159 if(op1->type)
7160 op1->type->refCount++;
7161 }
7162 return 1;
7163 }
7164
7165 static void PrintName(struct Type * type, char * string, unsigned int fullName)
7166 {
7167 if(type->name && type->name[0])
7168 {
7169 if(fullName)
7170 strcat(string, type->name);
7171 else
7172 {
7173 char * name = __ecereNameSpace__ecere__sys__RSearchString(type->name, "::", strlen(type->name), 1, 0);
7174
7175 if(name)
7176 name += 2;
7177 else
7178 name = type->name;
7179 strcat(string, name);
7180 }
7181 }
7182 }
7183
7184 static void PrintAttribs(struct Type * type, char * string)
7185 {
7186 if(type)
7187 {
7188 if(type->dllExport)
7189 strcat(string, "dllexport ");
7190 if(type->attrStdcall)
7191 strcat(string, "stdcall ");
7192 }
7193 }
7194
7195 static struct Type * FindMember(struct Type * type, char * string)
7196 {
7197 struct Type * memberType;
7198
7199 for(memberType = type->__anon1.__anon1.members.first; memberType; memberType = memberType->next)
7200 {
7201 if(!memberType->name)
7202 {
7203 struct Type * subType = FindMember(memberType, string);
7204
7205 if(subType)
7206 return subType;
7207 }
7208 else if(!strcmp(memberType->name, string))
7209 return memberType;
7210 }
7211 return (((void *)0));
7212 }
7213
7214 unsigned int __ecereProp_Type_Get_isPointerType(struct Type * this);
7215
7216 unsigned int __ecereProp_Type_Get_specConst(struct Type * this);
7217
7218 static unsigned int Promote(struct Operand * op, int kind, unsigned int isSigned)
7219 {
7220 unsigned int result = 0;
7221
7222 switch(kind)
7223 {
7224 case 2:
7225 if(op->kind == 1 || op->kind == 15 || op->kind == 24)
7226 result = isSigned ? GetOpShort(op, &op->__anon1.s) : GetOpUShort(op, &op->__anon1.us);
7227 break;
7228 case 3:
7229 case 5:
7230 if(op->kind == 1 || op->kind == 2 || op->kind == 15 || op->kind == 24)
7231 result = isSigned ? GetOpInt(op, &op->__anon1.i) : GetOpUInt(op, &op->__anon1.ui);
7232 break;
7233 case 4:
7234 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)
7235 result = isSigned ? GetOpInt64(op, &op->__anon1.i64) : GetOpUInt64(op, &op->__anon1.ui64);
7236 break;
7237 case 6:
7238 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)
7239 result = GetOpFloat(op, &op->__anon1.f);
7240 break;
7241 case 7:
7242 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)
7243 result = GetOpDouble(op, &op->__anon1.d);
7244 break;
7245 case 13:
7246 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)
7247 result = GetOpUInt64(op, &op->__anon1.ui64);
7248 break;
7249 case 15:
7250 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)
7251 result = isSigned ? GetOpInt(op, &op->__anon1.i) : GetOpUInt(op, &op->__anon1.ui);
7252 break;
7253 case 22:
7254 if(op->kind == 1 || op->kind == 2 || op->kind == 3 || op->kind == 5 || op->kind == 15 || op->kind == 24)
7255 result = isSigned ? GetOpInt64(op, &op->__anon1.i64) : GetOpUInt64(op, &op->__anon1.ui64);
7256 break;
7257 case 23:
7258 if(op->kind == 1 || op->kind == 2 || op->kind == 3 || op->kind == 5 || op->kind == 15 || op->kind == 24)
7259 result = isSigned ? GetOpInt64(op, &op->__anon1.i64) : GetOpUInt64(op, &op->__anon1.ui64);
7260 break;
7261 }
7262 return result;
7263 }
7264
7265 struct OpTable floatOps =
7266 {
7267 (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)
7268 };
7269
7270 struct OpTable doubleOps =
7271 {
7272 (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)
7273 };
7274
7275 struct OpTable intOps =
7276 {
7277 (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)
7278 };
7279
7280 struct OpTable uintOps =
7281 {
7282 (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)
7283 };
7284
7285 struct OpTable int64Ops =
7286 {
7287 (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)
7288 };
7289
7290 struct OpTable uint64Ops =
7291 {
7292 (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)
7293 };
7294
7295 struct OpTable shortOps =
7296 {
7297 (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)
7298 };
7299
7300 struct OpTable ushortOps =
7301 {
7302 (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)
7303 };
7304
7305 struct OpTable charOps =
7306 {
7307 (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)
7308 };
7309
7310 struct OpTable ucharOps =
7311 {
7312 (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)
7313 };
7314
7315 struct Type * FindMemberAndOffset(struct Type * type, char * string, unsigned int * offset)
7316 {
7317 struct Type * memberType;
7318
7319 for(memberType = type->__anon1.__anon1.members.first; memberType; memberType = memberType->next)
7320 {
7321 if(!memberType->name)
7322 {
7323 struct Type * subType = FindMember(memberType, string);
7324
7325 if(subType)
7326 {
7327 *offset += memberType->offset;
7328 return subType;
7329 }
7330 }
7331 else if(!strcmp(memberType->name, string))
7332 {
7333 *offset += memberType->offset;
7334 return memberType;
7335 }
7336 }
7337 return (((void *)0));
7338 }
7339
7340 struct __ecereNameSpace__ecere__com__Module;
7341
7342 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);
7343
7344 extern struct __ecereNameSpace__ecere__com__Instance * privateModule;
7345
7346 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);
7347
7348 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);
7349
7350 extern struct ModuleImport * FindModule(struct __ecereNameSpace__ecere__com__Instance * moduleToFind);
7351
7352 extern struct __ecereNameSpace__ecere__com__Class * __ecereNameSpace__ecere__com__eSystem_FindClass(struct __ecereNameSpace__ecere__com__Instance * module, const char *  name);
7353
7354 struct GlobalData
7355 {
7356 uintptr_t key;
7357 struct __ecereNameSpace__ecere__sys__BTNode * parent;
7358 struct __ecereNameSpace__ecere__sys__BTNode * left;
7359 struct __ecereNameSpace__ecere__sys__BTNode * right;
7360 int depth;
7361 struct __ecereNameSpace__ecere__com__Instance * module;
7362 char *  dataTypeString;
7363 struct Type * dataType;
7364 void *  symbol;
7365 char *  fullName;
7366 } ecere_gcc_struct;
7367
7368 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);
7369
7370 extern struct __ecereNameSpace__ecere__com__Instance * GetPrivateModule(void);
7371
7372 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);
7373
7374 extern struct __ecereNameSpace__ecere__com__Instance * __thisModule;
7375
7376 struct __ecereNameSpace__ecere__com__DefinedExpression;
7377
7378 extern struct __ecereNameSpace__ecere__com__DefinedExpression * __ecereNameSpace__ecere__com__eSystem_FindDefine(struct __ecereNameSpace__ecere__com__Instance * module, const char *  name);
7379
7380 struct __ecereNameSpace__ecere__com__DefinedExpression
7381 {
7382 struct __ecereNameSpace__ecere__com__DefinedExpression * prev;
7383 struct __ecereNameSpace__ecere__com__DefinedExpression * next;
7384 const char *  name;
7385 const char *  value;
7386 struct __ecereNameSpace__ecere__com__NameSpace *  nameSpace;
7387 } ecere_gcc_struct;
7388
7389 struct __ecereNameSpace__ecere__sys__BinaryTree;
7390
7391 struct __ecereNameSpace__ecere__sys__BinaryTree
7392 {
7393 struct __ecereNameSpace__ecere__sys__BTNode * root;
7394 int count;
7395 int (*  CompareKey)(struct __ecereNameSpace__ecere__sys__BinaryTree * tree, uintptr_t a, uintptr_t b);
7396 void (*  FreeKey)(void *  key);
7397 } ecere_gcc_struct;
7398
7399 struct __ecereNameSpace__ecere__com__Class
7400 {
7401 struct __ecereNameSpace__ecere__com__Class * prev;
7402 struct __ecereNameSpace__ecere__com__Class * next;
7403 const char *  name;
7404 int offset;
7405 int structSize;
7406 void * *  _vTbl;
7407 int vTblSize;
7408 unsigned int (*  Constructor)(void * );
7409 void (*  Destructor)(void * );
7410 int offsetClass;
7411 int sizeClass;
7412 struct __ecereNameSpace__ecere__com__Class * base;
7413 struct __ecereNameSpace__ecere__sys__BinaryTree methods;
7414 struct __ecereNameSpace__ecere__sys__BinaryTree members;
7415 struct __ecereNameSpace__ecere__sys__BinaryTree prop;
7416 struct __ecereNameSpace__ecere__sys__OldList membersAndProperties;
7417 struct __ecereNameSpace__ecere__sys__BinaryTree classProperties;
7418 struct __ecereNameSpace__ecere__sys__OldList derivatives;
7419 int memberID;
7420 int startMemberID;
7421 int type;
7422 struct __ecereNameSpace__ecere__com__Instance * module;
7423 struct __ecereNameSpace__ecere__com__NameSpace *  nameSpace;
7424 const char *  dataTypeString;
7425 struct Type * dataType;
7426 int typeSize;
7427 int defaultAlignment;
7428 void (*  Initialize)();
7429 int memberOffset;
7430 struct __ecereNameSpace__ecere__sys__OldList selfWatchers;
7431 const char *  designerClass;
7432 unsigned int noExpansion;
7433 const char *  defaultProperty;
7434 unsigned int comRedefinition;
7435 int count;
7436 int isRemote;
7437 unsigned int internalDecl;
7438 void *  data;
7439 unsigned int computeSize;
7440 short structAlignment;
7441 short pointerAlignment;
7442 int destructionWatchOffset;
7443 unsigned int fixed;
7444 struct __ecereNameSpace__ecere__sys__OldList delayedCPValues;
7445 int inheritanceAccess;
7446 const char *  fullName;
7447 void *  symbol;
7448 struct __ecereNameSpace__ecere__sys__OldList conversions;
7449 struct __ecereNameSpace__ecere__sys__OldList templateParams;
7450 struct __ecereNameSpace__ecere__com__ClassTemplateArgument *  templateArgs;
7451 struct __ecereNameSpace__ecere__com__Class * templateClass;
7452 struct __ecereNameSpace__ecere__sys__OldList templatized;
7453 int numParams;
7454 unsigned int isInstanceClass;
7455 unsigned int byValueSystemClass;
7456 } ecere_gcc_struct;
7457
7458 struct __ecereNameSpace__ecere__com__NameSpace
7459 {
7460 const char *  name;
7461 struct __ecereNameSpace__ecere__com__NameSpace *  btParent;
7462 struct __ecereNameSpace__ecere__com__NameSpace *  left;
7463 struct __ecereNameSpace__ecere__com__NameSpace *  right;
7464 int depth;
7465 struct __ecereNameSpace__ecere__com__NameSpace *  parent;
7466 struct __ecereNameSpace__ecere__sys__BinaryTree nameSpaces;
7467 struct __ecereNameSpace__ecere__sys__BinaryTree classes;
7468 struct __ecereNameSpace__ecere__sys__BinaryTree defines;
7469 struct __ecereNameSpace__ecere__sys__BinaryTree functions;
7470 } ecere_gcc_struct;
7471
7472 struct __ecereNameSpace__ecere__com__DataMember
7473 {
7474 struct __ecereNameSpace__ecere__com__DataMember * prev;
7475 struct __ecereNameSpace__ecere__com__DataMember * next;
7476 const char *  name;
7477 unsigned int isProperty;
7478 int memberAccess;
7479 int id;
7480 struct __ecereNameSpace__ecere__com__Class * _class;
7481 const char *  dataTypeString;
7482 struct __ecereNameSpace__ecere__com__Class * dataTypeClass;
7483 struct Type * dataType;
7484 int type;
7485 int offset;
7486 int memberID;
7487 struct __ecereNameSpace__ecere__sys__OldList members;
7488 struct __ecereNameSpace__ecere__sys__BinaryTree membersAlpha;
7489 int memberOffset;
7490 short structAlignment;
7491 short pointerAlignment;
7492 } ecere_gcc_struct;
7493
7494 struct __ecereNameSpace__ecere__sys__BTNode * __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindString(struct __ecereNameSpace__ecere__sys__BinaryTree * this, const char *  key);
7495
7496 unsigned int __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Add(struct __ecereNameSpace__ecere__sys__BinaryTree * this, struct __ecereNameSpace__ecere__sys__BTNode * node);
7497
7498 struct __ecereNameSpace__ecere__sys__BTNode * __ecereProp___ecereNameSpace__ecere__sys__BinaryTree_Get_first(struct __ecereNameSpace__ecere__sys__BinaryTree * this);
7499
7500 struct __ecereNameSpace__ecere__sys__BTNode * __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindPrefix(struct __ecereNameSpace__ecere__sys__BinaryTree * this, const char *  key);
7501
7502 void __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Remove(struct __ecereNameSpace__ecere__sys__BinaryTree * this, struct __ecereNameSpace__ecere__sys__BTNode * node);
7503
7504 static struct __ecereNameSpace__ecere__com__Class * __ecereClass_Conversion;
7505
7506 static void _DeclareType(struct External * neededFor, struct Type * type, unsigned int needDereference, unsigned int forFunctionDef, unsigned int fwdDecl)
7507 {
7508 if(inCompiler)
7509 {
7510 if(type->kind == 11)
7511 {
7512 struct Type * param;
7513
7514 for(param = type->__anon1.__anon2.params.first; param; param = param->next)
7515 _DeclareType(neededFor, param, forFunctionDef, 0, fwdDecl);
7516 _DeclareType(neededFor, type->__anon1.__anon2.returnType, forFunctionDef, 0, fwdDecl);
7517 }
7518 else if(type->kind == 13)
7519 _DeclareType(neededFor, type->__anon1.type, 0, 0, fwdDecl);
7520 else if(type->kind == 8)
7521 {
7522 struct __ecereNameSpace__ecere__com__Class * c = type->__anon1._class->__anon1.registered;
7523
7524 _DeclareStruct(neededFor, c ? c->fullName : "ecere::com::Instance", c ? c->type == 5 : 0, needDereference && c && c->type == 1, fwdDecl);
7525 }
7526 else if(type->kind == 9 || type->kind == 10)
7527 {
7528 struct Type * member;
7529
7530 for(member = type->__anon1.__anon1.members.first; member; member = member->next)
7531 _DeclareType(neededFor, member, needDereference, forFunctionDef, fwdDecl);
7532 }
7533 else if(type->kind == 12)
7534 _DeclareType(neededFor, type->__anon1.__anon4.arrayType, 1, 0, fwdDecl);
7535 }
7536 }
7537
7538 static unsigned int CheckConstCompatibility(struct Type * source, struct Type * dest, unsigned int warn)
7539 {
7540 unsigned int status = 1;
7541
7542 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))
7543 {
7544 struct __ecereNameSpace__ecere__com__Class * sourceClass = source->kind == 8 ? source->__anon1._class->__anon1.registered : (((void *)0));
7545 struct __ecereNameSpace__ecere__com__Class * destClass = dest->kind == 8 ? dest->__anon1._class->__anon1.registered : (((void *)0));
7546
7547 if((!sourceClass || (sourceClass && sourceClass->type == 0 && !sourceClass->structSize)) && (!destClass || (destClass && destClass->type == 0 && !destClass->structSize)))
7548 {
7549 struct Type * sourceType = source, * destType = dest;
7550
7551 while((sourceType->kind == 13 || sourceType->kind == 12) && sourceType->__anon1.type)
7552 sourceType = sourceType->__anon1.type;
7553 while((destType->kind == 13 || destType->kind == 12) && destType->__anon1.type)
7554 destType = destType->__anon1.type;
7555 if(!destType->constant && sourceType->constant)
7556 {
7557 status = 0;
7558 if(warn)
7559 Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "discarding const qualifier\n", (((void *)0))));
7560 }
7561 }
7562 }
7563 return status;
7564 }
7565
7566 struct Operand GetOperand(struct Expression * exp)
7567 {
7568 struct Operand op =
7569 {
7570 0, 0, 0,
7571 .__anon1 = {
7572 .c = 0
7573 },
7574 {
7575 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
7576 }
7577 };
7578 struct Type * type = exp->expType;
7579
7580 if(type)
7581 {
7582 while(type->kind == 8 && 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))
7583 {
7584 if(!type->__anon1._class->__anon1.registered->dataType)
7585 type->__anon1._class->__anon1.registered->dataType = ProcessTypeString(type->__anon1._class->__anon1.registered->dataTypeString, 0);
7586 type = type->__anon1._class->__anon1.registered->dataType;
7587 }
7588 if(exp->type == 3 && op.kind == 13)
7589 {
7590 op.__anon1.ui64 = (uint64)(uintptr_t)exp->__anon1.__anon2.string;
7591 op.kind = 13;
7592 op.ops = uint64Ops;
7593 }
7594 else if(exp->isConstant && exp->type == 2)
7595 {
7596 op.kind = type->kind;
7597 op.type = type;
7598 switch(op.kind)
7599 {
7600 case 24:
7601 case 1:
7602 {
7603 if(exp->__anon1.__anon1.constant[0] == '\'')
7604 {
7605 op.__anon1.c = exp->__anon1.__anon1.constant[1];
7606 op.ops = charOps;
7607 }
7608 else if(type->isSigned)
7609 {
7610 op.__anon1.c = (char)strtol(exp->__anon1.__anon1.constant, (((void *)0)), 0);
7611 op.ops = charOps;
7612 }
7613 else
7614 {
7615 op.__anon1.uc = (unsigned char)strtoul(exp->__anon1.__anon1.constant, (((void *)0)), 0);
7616 op.ops = ucharOps;
7617 }
7618 break;
7619 }
7620 case 2:
7621 if(exp->__anon1.__anon1.constant[0] == '\'')
7622 {
7623 op.__anon1.s = exp->__anon1.__anon1.constant[1];
7624 op.ops = shortOps;
7625 }
7626 else if(type->isSigned)
7627 {
7628 op.__anon1.s = (short)strtol(exp->__anon1.__anon1.constant, (((void *)0)), 0);
7629 op.ops = shortOps;
7630 }
7631 else
7632 {
7633 op.__anon1.us = (unsigned short)strtoul(exp->__anon1.__anon1.constant, (((void *)0)), 0);
7634 op.ops = ushortOps;
7635 }
7636 break;
7637 case 3:
7638 case 5:
7639 if(exp->__anon1.__anon1.constant[0] == '\'')
7640 {
7641 op.__anon1.i = exp->__anon1.__anon1.constant[1];
7642 op.ops = intOps;
7643 }
7644 else if(type->isSigned)
7645 {
7646 op.__anon1.i = strtol(exp->__anon1.__anon1.constant, (((void *)0)), 0);
7647 op.ops = intOps;
7648 }
7649 else
7650 {
7651 op.__anon1.ui = (unsigned int)strtoul(exp->__anon1.__anon1.constant, (((void *)0)), 0);
7652 op.ops = uintOps;
7653 }
7654 op.kind = 3;
7655 break;
7656 case 4:
7657 if(type->isSigned)
7658 {
7659 op.__anon1.i64 = __ecereNameSpace__ecere__com___strtoi64(exp->__anon1.__anon1.constant, (((void *)0)), 0);
7660 op.ops = int64Ops;
7661 }
7662 else
7663 {
7664 op.__anon1.ui64 = __ecereNameSpace__ecere__com___strtoui64(exp->__anon1.__anon1.constant, (((void *)0)), 0);
7665 op.ops = uint64Ops;
7666 }
7667 op.kind = 4;
7668 break;
7669 case 22:
7670 if(type->isSigned)
7671 {
7672 op.__anon1.i64 = __ecereNameSpace__ecere__com___strtoi64(exp->__anon1.__anon1.constant, (((void *)0)), 0);
7673 op.ops = int64Ops;
7674 }
7675 else
7676 {
7677 op.__anon1.ui64 = __ecereNameSpace__ecere__com___strtoui64(exp->__anon1.__anon1.constant, (((void *)0)), 0);
7678 op.ops = uint64Ops;
7679 }
7680 op.kind = 4;
7681 break;
7682 case 23:
7683 if(type->isSigned)
7684 {
7685 op.__anon1.i64 = __ecereNameSpace__ecere__com___strtoi64(exp->__anon1.__anon1.constant, (((void *)0)), 0);
7686 op.ops = int64Ops;
7687 }
7688 else
7689 {
7690 op.__anon1.ui64 = __ecereNameSpace__ecere__com___strtoui64(exp->__anon1.__anon1.constant, (((void *)0)), 0);
7691 op.ops = uint64Ops;
7692 }
7693 op.kind = 4;
7694 break;
7695 case 6:
7696 if(!strcmp(exp->__anon1.__anon1.constant, "inf"))
7697 op.__anon1.f = __ecereMethod_float_inf();
7698 else if(!strcmp(exp->__anon1.__anon1.constant, "-inf"))
7699 op.__anon1.f = -__ecereMethod_float_inf();
7700 else if(!strcmp(exp->__anon1.__anon1.constant, "nan"))
7701 op.__anon1.f = __ecereMethod_float_nan();
7702 else if(!strcmp(exp->__anon1.__anon1.constant, "-nan"))
7703 op.__anon1.f = -__ecereMethod_float_nan();
7704 else
7705 op.__anon1.f = (float)strtod(exp->__anon1.__anon1.constant, (((void *)0)));
7706 op.ops = floatOps;
7707 break;
7708 case 7:
7709 if(!strcmp(exp->__anon1.__anon1.constant, "inf"))
7710 op.__anon1.d = __ecereMethod_double_inf();
7711 else if(!strcmp(exp->__anon1.__anon1.constant, "-inf"))
7712 op.__anon1.d = -__ecereMethod_double_inf();
7713 else if(!strcmp(exp->__anon1.__anon1.constant, "nan"))
7714 op.__anon1.d = __ecereMethod_double_nan();
7715 else if(!strcmp(exp->__anon1.__anon1.constant, "-nan"))
7716 op.__anon1.d = -__ecereMethod_double_nan();
7717 else
7718 op.__anon1.d = (double)strtod(exp->__anon1.__anon1.constant, (((void *)0)));
7719 op.ops = doubleOps;
7720 break;
7721 case 12:
7722 case 13:
7723 case 8:
7724 op.__anon1.ui64 = __ecereNameSpace__ecere__com___strtoui64(exp->__anon1.__anon1.constant, (((void *)0)), 0);
7725 op.kind = 13;
7726 op.ops = uint64Ops;
7727 break;
7728 }
7729 }
7730 }
7731 return op;
7732 }
7733
7734 static long long GetEnumValue(struct __ecereNameSpace__ecere__com__Class * _class, void * ptr)
7735 {
7736 long long v = 0;
7737
7738 switch(_class->typeSize)
7739 {
7740 case 8:
7741 if(!strcmp(_class->dataTypeString, "uint64"))
7742 v = (long long)*(uint64 *)ptr;
7743 else
7744 v = *(long long *)ptr;
7745 break;
7746 case 4:
7747 if(!strcmp(_class->dataTypeString, "uint"))
7748 v = (long long)*(unsigned int *)ptr;
7749 else
7750 v = (long long)*(int *)ptr;
7751 break;
7752 case 2:
7753 if(!strcmp(_class->dataTypeString, "uint16"))
7754 v = (long long)*(unsigned short *)ptr;
7755 else
7756 v = (long long)*(short *)ptr;
7757 break;
7758 case 1:
7759 if(!strcmp(_class->dataTypeString, "byte"))
7760 v = (long long)*(unsigned char *)ptr;
7761 else
7762 v = (long long)*(char *)ptr;
7763 break;
7764 }
7765 return v;
7766 }
7767
7768 static void GetTypeSpecs(struct Type * type, struct __ecereNameSpace__ecere__sys__OldList * specs)
7769 {
7770 if(!type->isSigned && type->kind != 22 && type->kind != 23)
7771 ListAdd(specs, MkSpecifier(UNSIGNED));
7772 switch(type->kind)
7773 {
7774 case 8:
7775 {
7776 if(type->__anon1._class->__anon1.registered)
7777 {
7778 if(!type->__anon1._class->__anon1.registered->dataType)
7779 type->__anon1._class->__anon1.registered->dataType = ProcessTypeString(type->__anon1._class->__anon1.registered->dataTypeString, 0);
7780 GetTypeSpecs(type->__anon1._class->__anon1.registered->dataType, specs);
7781 }
7782 break;
7783 }
7784 case 7:
7785 ListAdd(specs, MkSpecifier(DOUBLE));
7786 break;
7787 case 6:
7788 ListAdd(specs, MkSpecifier(FLOAT));
7789 break;
7790 case 1:
7791 ListAdd(specs, MkSpecifier(CHAR));
7792 break;
7793 case 24:
7794 ListAdd(specs, MkSpecifier(_BOOL));
7795 break;
7796 case 2:
7797 ListAdd(specs, MkSpecifier(SHORT));
7798 break;
7799 case 4:
7800 ListAdd(specs, MkSpecifier(INT64));
7801 break;
7802 case 22:
7803 ListAdd(specs, MkSpecifierName(type->isSigned ? "intptr" : "uintptr"));
7804 break;
7805 case 23:
7806 ListAdd(specs, MkSpecifierName(type->isSigned ? "intsize" : "uintsize"));
7807 break;
7808 case 3:
7809 default:
7810 ListAdd(specs, MkSpecifier(INT));
7811 break;
7812 }
7813 }
7814
7815 static void PrintTypeSpecs(struct Type * type, char * string, unsigned int fullName, unsigned int printConst)
7816 {
7817 if(type)
7818 {
7819 if(printConst && type->constant)
7820 strcat(string, "const ");
7821 switch(type->kind)
7822 {
7823 case 8:
7824 {
7825 struct Symbol * c = type->__anon1._class;
7826 unsigned int isObjectBaseClass = !c || !c->string || !strcmp(c->string, "class");
7827
7828 if(type->classObjectType == 2 && isObjectBaseClass)
7829 strcat(string, "typed_object");
7830 else if(type->classObjectType == 3 && isObjectBaseClass)
7831 strcat(string, "any_object");
7832 else
7833 {
7834 if(c && c->string)
7835 strcat(string, (fullName || !c->__anon1.registered) ? c->string : c->__anon1.registered->name);
7836 }
7837 if(type->byReference)
7838 strcat(string, " &");
7839 break;
7840 }
7841 case 0:
7842 strcat(string, "void");
7843 break;
7844 case 3:
7845 strcat(string, type->isSigned ? "int" : "uint");
7846 break;
7847 case 4:
7848 strcat(string, type->isSigned ? "int64" : "uint64");
7849 break;
7850 case 22:
7851 strcat(string, type->isSigned ? "intptr" : "uintptr");
7852 break;
7853 case 23:
7854 strcat(string, type->isSigned ? "intsize" : "uintsize");
7855 break;
7856 case 1:
7857 strcat(string, type->isSigned ? "char" : "byte");
7858 break;
7859 case 24:
7860 strcat(string, "_Bool");
7861 break;
7862 case 2:
7863 strcat(string, type->isSigned ? "short" : "uint16");
7864 break;
7865 case 6:
7866 strcat(string, "float");
7867 break;
7868 case 7:
7869 strcat(string, "double");
7870 break;
7871 case 9:
7872 if(type->__anon1.__anon1.enumName)
7873 {
7874 strcat(string, "struct ");
7875 strcat(string, type->__anon1.__anon1.enumName);
7876 }
7877 else if(type->typeName)
7878 strcat(string, type->typeName);
7879 else
7880 {
7881 struct Type * member;
7882
7883 strcat(string, "struct { ");
7884 for(member = type->__anon1.__anon1.members.first; member; member = member->next)
7885 {
7886 PrintType(member, string, 1, fullName);
7887 strcat(string, "; ");
7888 }
7889 strcat(string, "}");
7890 }
7891 break;
7892 case 10:
7893 if(type->__anon1.__anon1.enumName)
7894 {
7895 strcat(string, "union ");
7896 strcat(string, type->__anon1.__anon1.enumName);
7897 }
7898 else if(type->typeName)
7899 strcat(string, type->typeName);
7900 else
7901 {
7902 strcat(string, "union ");
7903 strcat(string, "(unnamed)");
7904 }
7905 break;
7906 case 15:
7907 if(type->__anon1.__anon1.enumName)
7908 {
7909 strcat(string, "enum ");
7910 strcat(string, type->__anon1.__anon1.enumName);
7911 }
7912 else if(type->typeName)
7913 strcat(string, type->typeName);
7914 else
7915 strcat(string, "int");
7916 break;
7917 case 14:
7918 strcat(string, "...");
7919 break;
7920 case 19:
7921 strcat(string, "subclass(");
7922 strcat(string, type->__anon1._class ? type->__anon1._class->string : "int");
7923 strcat(string, ")");
7924 break;
7925 case 20:
7926 strcat(string, type->__anon1.templateParameter->identifier->string);
7927 break;
7928 case 21:
7929 strcat(string, "thisclass");
7930 break;
7931 case 17:
7932 strcat(string, "__builtin_va_list");
7933 break;
7934 }
7935 }
7936 }
7937
7938 extern char *  __ecereNameSpace__ecere__com__PrintString(struct __ecereNameSpace__ecere__com__Class * class, const void * object, ...);
7939
7940 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass___ecereNameSpace__ecere__sys__TempFile;
7941
7942 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_ClassImport;
7943
7944 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_Symbol;
7945
7946 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_PropertyImport;
7947
7948 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_Type;
7949
7950 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_TemplatedType;
7951
7952 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_TemplateParameter;
7953
7954 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_MethodImport;
7955
7956 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_FunctionImport;
7957
7958 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_Expression;
7959
7960 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_Instantiation;
7961
7962 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass___ecereNameSpace__ecere__sys__NamedLink64;
7963
7964 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_TypeName;
7965
7966 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_Context;
7967
7968 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass___ecereNameSpace__ecere__com__Module;
7969
7970 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass___ecereNameSpace__ecere__com__LinkList;
7971
7972 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass___ecereNameSpace__ecere__com__Application;
7973
7974 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_int;
7975
7976 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass___ecereNameSpace__ecere__com__Instance;
7977
7978 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass___ecereNameSpace__ecere__sys__File;
7979
7980 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_External;
7981
7982 struct __ecereNameSpace__ecere__com__Application
7983 {
7984 int argc;
7985 const char * *  argv;
7986 int exitCode;
7987 unsigned int isGUIApp;
7988 struct __ecereNameSpace__ecere__sys__OldList allModules;
7989 char *  parsedCommand;
7990 struct __ecereNameSpace__ecere__com__NameSpace systemNameSpace;
7991 } ecere_gcc_struct;
7992
7993 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)
7994 {
7995 if(*curMember)
7996 {
7997 *curMember = (*curMember)->next;
7998 if(subMemberStackPos && *subMemberStackPos > 0 && subMemberStack[*subMemberStackPos - 1]->type == 1)
7999 {
8000 *curMember = subMemberStack[--(*subMemberStackPos)];
8001 *curMember = (*curMember)->next;
8002 }
8003 while((*curMember) && (*curMember)->isProperty)
8004 *curMember = (*curMember)->next;
8005 if(subMemberStackPos)
8006 {
8007 while((*curMember) && !(*curMember)->isProperty && !(*curMember)->name && ((*curMember)->type == 2 || (*curMember)->type == 1))
8008 {
8009 subMemberStack[(*subMemberStackPos)++] = *curMember;
8010 *curMember = (*curMember)->members.first;
8011 while(*curMember && (*curMember)->isProperty)
8012 *curMember = (*curMember)->next;
8013 }
8014 }
8015 }
8016 while(!*curMember)
8017 {
8018 if(!*curMember)
8019 {
8020 if(subMemberStackPos && *subMemberStackPos)
8021 {
8022 *curMember = subMemberStack[--(*subMemberStackPos)];
8023 *curMember = (*curMember)->next;
8024 }
8025 else
8026 {
8027 struct __ecereNameSpace__ecere__com__Class * lastCurClass = *curClass;
8028
8029 if(*curClass == _class)
8030 break;
8031 for(*curClass = _class; (*curClass)->base != lastCurClass && (*curClass)->base->type != 1000; *curClass = (*curClass)->base)
8032 ;
8033 *curMember = (*curClass)->membersAndProperties.first;
8034 }
8035 while((*curMember) && (*curMember)->isProperty)
8036 *curMember = (*curMember)->next;
8037 if(subMemberStackPos)
8038 {
8039 while((*curMember) && !(*curMember)->isProperty && !(*curMember)->name && ((*curMember)->type == 2 || (*curMember)->type == 1))
8040 {
8041 subMemberStack[(*subMemberStackPos)++] = *curMember;
8042 *curMember = (*curMember)->members.first;
8043 while(*curMember && (*curMember)->isProperty)
8044 *curMember = (*curMember)->next;
8045 }
8046 }
8047 }
8048 }
8049 }
8050
8051 static struct GlobalData * ScanGlobalData(struct __ecereNameSpace__ecere__com__NameSpace * nameSpace, char * name)
8052 {
8053 struct __ecereNameSpace__ecere__sys__BinaryTree * tree = &nameSpace->functions;
8054 struct GlobalData * data = (struct GlobalData *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindString((&*tree), name);
8055 struct __ecereNameSpace__ecere__com__NameSpace * child;
8056
8057 if(!data)
8058 {
8059 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)))
8060 {
8061 data = ScanGlobalData(child, name);
8062 if(data)
8063 break;
8064 }
8065 }
8066 return data;
8067 }
8068
8069 static struct Symbol * ScanWithNameSpace(struct __ecereNameSpace__ecere__sys__BinaryTree * tree, const char * nameSpace, const char * name)
8070 {
8071 int nsLen = strlen(nameSpace);
8072 struct Symbol * symbol;
8073
8074 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)))
8075 {
8076 char * s = symbol->string;
8077
8078 if(!strncmp(s, nameSpace, nsLen))
8079 {
8080 int c;
8081 char * namePart;
8082
8083 for(c = strlen(s) - 1; c >= 0; c--)
8084 if(s[c] == ':')
8085 break;
8086 namePart = s + c + 1;
8087 if(!strcmp(namePart, name))
8088 {
8089 return symbol;
8090 }
8091 }
8092 else
8093 break;
8094 }
8095 return (((void *)0));
8096 }
8097
8098 unsigned int GetInt(struct Expression * exp, int * value2)
8099 {
8100 struct Operand op2 = GetOperand(exp);
8101
8102 return GetOpInt(&op2, value2);
8103 }
8104
8105 unsigned int GetUInt(struct Expression * exp, unsigned int * value2)
8106 {
8107 struct Operand op2 = GetOperand(exp);
8108
8109 return GetOpUInt(&op2, value2);
8110 }
8111
8112 unsigned int GetInt64(struct Expression * exp, long long * value2)
8113 {
8114 struct Operand op2 = GetOperand(exp);
8115
8116 return GetOpInt64(&op2, value2);
8117 }
8118
8119 unsigned int GetUInt64(struct Expression * exp, uint64 * value2)
8120 {
8121 struct Operand op2 = GetOperand(exp);
8122
8123 return GetOpUInt64(&op2, value2);
8124 }
8125
8126 unsigned int GetIntPtr(struct Expression * exp, intptr_t * value2)
8127 {
8128 struct Operand op2 = GetOperand(exp);
8129
8130 return GetOpIntPtr(&op2, value2);
8131 }
8132
8133 unsigned int GetUIntPtr(struct Expression * exp, uintptr_t * value2)
8134 {
8135 struct Operand op2 = GetOperand(exp);
8136
8137 return GetOpUIntPtr(&op2, value2);
8138 }
8139
8140 unsigned int GetIntSize(struct Expression * exp, ssize_t * value2)
8141 {
8142 struct Operand op2 = GetOperand(exp);
8143
8144 return GetOpIntSize(&op2, value2);
8145 }
8146
8147 unsigned int GetUIntSize(struct Expression * exp, size_t * value2)
8148 {
8149 struct Operand op2 = GetOperand(exp);
8150
8151 return GetOpUIntSize(&op2, value2);
8152 }
8153
8154 unsigned int GetShort(struct Expression * exp, short * value2)
8155 {
8156 struct Operand op2 = GetOperand(exp);
8157
8158 return GetOpShort(&op2, value2);
8159 }
8160
8161 unsigned int GetUShort(struct Expression * exp, unsigned short * value2)
8162 {
8163 struct Operand op2 = GetOperand(exp);
8164
8165 return GetOpUShort(&op2, value2);
8166 }
8167
8168 unsigned int GetChar(struct Expression * exp, char * value2)
8169 {
8170 struct Operand op2 = GetOperand(exp);
8171
8172 return GetOpChar(&op2, value2);
8173 }
8174
8175 unsigned int GetUChar(struct Expression * exp, unsigned char * value2)
8176 {
8177 struct Operand op2 = GetOperand(exp);
8178
8179 return GetOpUChar(&op2, value2);
8180 }
8181
8182 unsigned int GetFloat(struct Expression * exp, float * value2)
8183 {
8184 struct Operand op2 = GetOperand(exp);
8185
8186 return GetOpFloat(&op2, value2);
8187 }
8188
8189 unsigned int GetDouble(struct Expression * exp, double * value2)
8190 {
8191 struct Operand op2 = GetOperand(exp);
8192
8193 return GetOpDouble(&op2, value2);
8194 }
8195
8196 static void PrePrintType(struct Type * type, char * string, unsigned int fullName, struct Type * parentType, unsigned int printConst)
8197 {
8198 if(type->kind == 12 || type->kind == 13 || type->kind == 11 || type->kind == 16)
8199 {
8200 if((type->kind == 11 || type->kind == 16) && (!parentType || parentType->kind != 13))
8201 PrintAttribs(type, string);
8202 if(printConst && type->constant && (type->kind == 11 || type->kind == 16))
8203 strcat(string, " const");
8204 PrePrintType(type->kind == 16 ? type->__anon1.__anon3.method->dataType : type->__anon1.type, string, fullName, type, printConst);
8205 if(type->kind == 13 && (type->__anon1.type->kind == 12 || type->__anon1.type->kind == 11 || type->__anon1.type->kind == 16))
8206 strcat(string, " (");
8207 if(type->kind == 13)
8208 {
8209 if(type->__anon1.type->kind == 11 || type->__anon1.type->kind == 16)
8210 PrintAttribs(type->__anon1.type, string);
8211 }
8212 if(type->kind == 13)
8213 {
8214 if(type->__anon1.type->kind == 11 || type->__anon1.type->kind == 16 || type->__anon1.type->kind == 12)
8215 strcat(string, "*");
8216 else
8217 strcat(string, " *");
8218 }
8219 if(printConst && type->constant && type->kind == 13)
8220 strcat(string, " const");
8221 }
8222 else
8223 PrintTypeSpecs(type, string, fullName, printConst);
8224 }
8225
8226 void PrintExpression(struct Expression * exp, char * string)
8227 {
8228 {
8229 struct __ecereNameSpace__ecere__com__Instance * f = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass___ecereNameSpace__ecere__sys__TempFile);
8230 int count;
8231 unsigned int backOutputLineNumbers = outputLineNumbers;
8232
8233 outputLineNumbers = 0;
8234 if(exp)
8235 OutputExpression(exp, f);
8236 ((unsigned int (*)(struct __ecereNameSpace__ecere__com__Instance *, int pos, int mode))__extension__ ({
8237 struct __ecereNameSpace__ecere__com__Instance * __internal_ClassInst = f;
8238
8239 __internal_ClassInst ? __internal_ClassInst->_vTbl : __ecereClass___ecereNameSpace__ecere__sys__TempFile->_vTbl;
8240 })[__ecereVMethodID___ecereNameSpace__ecere__sys__File_Seek])(f, 0, 0);
8241 count = strlen(string);
8242 count += ((int (*)(struct __ecereNameSpace__ecere__com__Instance *, void *  buffer, unsigned int size, unsigned int count))__extension__ ({
8243 struct __ecereNameSpace__ecere__com__Instance * __internal_ClassInst = f;
8244
8245 __internal_ClassInst ? __internal_ClassInst->_vTbl : __ecereClass___ecereNameSpace__ecere__sys__TempFile->_vTbl;
8246 })[__ecereVMethodID___ecereNameSpace__ecere__sys__File_Read])(f, string + count, 1, 1023);
8247 string[count] = '\0';
8248 (__ecereNameSpace__ecere__com__eInstance_DecRef(f), f = 0);
8249 outputLineNumbers = backOutputLineNumbers;
8250 }
8251 }
8252
8253 struct Type * Dereference(struct Type * source)
8254 {
8255 struct Type * type = (((void *)0));
8256
8257 if(source)
8258 {
8259 if(source->kind == 13 || source->kind == 12)
8260 {
8261 type = source->__anon1.type;
8262 source->__anon1.type->refCount++;
8263 }
8264 else if(source->kind == 8 && !strcmp(source->__anon1._class->string, "String"))
8265 {
8266 type = __extension__ ({
8267 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
8268
8269 __ecereInstance1->kind = 1, __ecereInstance1->refCount = 1, __ecereInstance1;
8270 });
8271 }
8272 else if(source->kind == 8 && source->__anon1._class && source->__anon1._class->__anon1.registered && source->__anon1._class->__anon1.registered->type == 5)
8273 {
8274 type = source;
8275 source->refCount++;
8276 }
8277 else
8278 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "cannot dereference type\n", (((void *)0))));
8279 }
8280 return type;
8281 }
8282
8283 static struct Type * Reference(struct Type * source)
8284 {
8285 struct Type * type = (((void *)0));
8286
8287 if(source)
8288 {
8289 type = __extension__ ({
8290 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
8291
8292 __ecereInstance1->kind = 13, __ecereInstance1->__anon1.type = source, __ecereInstance1->refCount = 1, __ecereInstance1;
8293 });
8294 source->refCount++;
8295 }
8296 return type;
8297 }
8298
8299 void ReplaceExpContents(struct Expression * checkedExp, struct Expression * newExp)
8300 {
8301 struct Expression * prev = checkedExp->prev, * next = checkedExp->next;
8302
8303 FreeExpContents(checkedExp);
8304 FreeType(checkedExp->expType);
8305 FreeType(checkedExp->destType);
8306 *checkedExp = *newExp;
8307 ((newExp ? (__ecereClass_Expression->Destructor ? __ecereClass_Expression->Destructor((void *)newExp) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(newExp)) : 0), newExp = 0);
8308 checkedExp->prev = prev;
8309 checkedExp->next = next;
8310 }
8311
8312 void FinishTemplatesContext(struct Context * context)
8313 {
8314 PopContext(context);
8315 FreeContext(context);
8316 ((context ? (__ecereClass_Context->Destructor ? __ecereClass_Context->Destructor((void *)context) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(context)) : 0), context = 0);
8317 }
8318
8319 static __attribute__((unused)) void UnusedFunction()
8320 {
8321 int a;
8322
8323 ((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);
8324 }
8325
8326 struct Expression * ParseExpressionString(char * expression)
8327 {
8328 parseError = 0;
8329 fileInput = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass___ecereNameSpace__ecere__sys__TempFile);
8330 ((int (*)(struct __ecereNameSpace__ecere__com__Instance *, const void *  buffer, unsigned int size, unsigned int count))__extension__ ({
8331 struct __ecereNameSpace__ecere__com__Instance * __internal_ClassInst = fileInput;
8332
8333 __internal_ClassInst ? __internal_ClassInst->_vTbl : __ecereClass___ecereNameSpace__ecere__sys__File->_vTbl;
8334 })[__ecereVMethodID___ecereNameSpace__ecere__sys__File_Write])(fileInput, expression, 1, strlen(expression));
8335 ((unsigned int (*)(struct __ecereNameSpace__ecere__com__Instance *, int pos, int mode))__extension__ ({
8336 struct __ecereNameSpace__ecere__com__Instance * __internal_ClassInst = fileInput;
8337
8338 __internal_ClassInst ? __internal_ClassInst->_vTbl : __ecereClass___ecereNameSpace__ecere__sys__File->_vTbl;
8339 })[__ecereVMethodID___ecereNameSpace__ecere__sys__File_Seek])(fileInput, 0, 0);
8340 echoOn = 0;
8341 parsedExpression = (((void *)0));
8342 resetScanner();
8343 expression_yyparse();
8344 (__ecereNameSpace__ecere__com__eInstance_DecRef(fileInput), fileInput = 0);
8345 return parsedExpression;
8346 }
8347
8348 struct __ecereNameSpace__ecere__com__Module
8349 {
8350 struct __ecereNameSpace__ecere__com__Instance * application;
8351 struct __ecereNameSpace__ecere__sys__OldList classes;
8352 struct __ecereNameSpace__ecere__sys__OldList defines;
8353 struct __ecereNameSpace__ecere__sys__OldList functions;
8354 struct __ecereNameSpace__ecere__sys__OldList modules;
8355 struct __ecereNameSpace__ecere__com__Instance * prev;
8356 struct __ecereNameSpace__ecere__com__Instance * next;
8357 const char *  name;
8358 void *  library;
8359 void *  Unload;
8360 int importType;
8361 int origImportType;
8362 struct __ecereNameSpace__ecere__com__NameSpace privateNameSpace;
8363 struct __ecereNameSpace__ecere__com__NameSpace publicNameSpace;
8364 } ecere_gcc_struct;
8365
8366 static struct GlobalData * FindGlobalData(char * name)
8367 {
8368 int start = 0, c;
8369 struct __ecereNameSpace__ecere__com__NameSpace * nameSpace;
8370
8371 nameSpace = globalData;
8372 for(c = 0; name[c]; c++)
8373 {
8374 if(name[c] == '.' || (name[c] == ':' && name[c + 1] == ':'))
8375 {
8376 struct __ecereNameSpace__ecere__com__NameSpace * newSpace;
8377 char * spaceName = __ecereNameSpace__ecere__com__eSystem_New(sizeof(char) * (c - start + 1));
8378
8379 strncpy(spaceName, name + start, c - start);
8380 spaceName[c - start] = '\0';
8381 newSpace = (struct __ecereNameSpace__ecere__com__NameSpace *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindString(&(*nameSpace).nameSpaces, spaceName);
8382 (__ecereNameSpace__ecere__com__eSystem_Delete(spaceName), spaceName = 0);
8383 if(!newSpace)
8384 return (((void *)0));
8385 nameSpace = newSpace;
8386 if(name[c] == ':')
8387 c++;
8388 start = c + 1;
8389 }
8390 }
8391 if(c - start)
8392 {
8393 return ScanGlobalData(nameSpace, name + start);
8394 }
8395 return (((void *)0));
8396 }
8397
8398 static struct Symbol * FindWithNameSpace(struct __ecereNameSpace__ecere__sys__BinaryTree * tree, const char * name)
8399 {
8400 int c;
8401 char nameSpace[1024];
8402 const char * namePart;
8403 unsigned int gotColon = 0;
8404
8405 nameSpace[0] = '\0';
8406 for(c = strlen(name) - 1; c >= 0; c--)
8407 if(name[c] == ':')
8408 {
8409 gotColon = 1;
8410 break;
8411 }
8412 namePart = name + c + 1;
8413 while(c >= 0 && name[c] == ':')
8414 c--;
8415 if(c >= 0)
8416 {
8417 struct Symbol * symbol = (struct Symbol *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindString(tree, name);
8418
8419 if(symbol)
8420 return symbol;
8421 memcpy(nameSpace, name, c + 1);
8422 nameSpace[c + 1] = 0;
8423 return ScanWithNameSpace(tree, nameSpace, namePart);
8424 }
8425 else if(gotColon)
8426 {
8427 struct Symbol * symbol = (struct Symbol *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindString(tree, namePart);
8428
8429 return symbol;
8430 }
8431 else
8432 {
8433 struct Symbol * symbol = (struct Symbol *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindString(tree, namePart);
8434
8435 if(symbol)
8436 return symbol;
8437 return ScanWithNameSpace(tree, "", namePart);
8438 }
8439 return (((void *)0));
8440 }
8441
8442 static void PrintArraySize(struct Type * arrayType, char * string)
8443 {
8444 char size[256];
8445
8446 size[0] = '\0';
8447 strcat(size, "[");
8448 if(arrayType->__anon1.__anon4.enumClass)
8449 strcat(size, arrayType->__anon1.__anon4.enumClass->string);
8450 else if(arrayType->__anon1.__anon4.arraySizeExp)
8451 PrintExpression(arrayType->__anon1.__anon4.arraySizeExp, size);
8452 strcat(size, "]");
8453 strcat(string, size);
8454 }
8455
8456 void __ecereUnregisterModule_pass15(struct __ecereNameSpace__ecere__com__Instance * module)
8457 {
8458
8459 }
8460
8461 static void PostPrintType(struct Type * type, char * string, unsigned int fullName)
8462 {
8463 if(type->kind == 13 && (type->__anon1.type->kind == 12 || type->__anon1.type->kind == 11 || type->__anon1.type->kind == 16))
8464 strcat(string, ")");
8465 if(type->kind == 12)
8466 PrintArraySize(type, string);
8467 else if(type->kind == 11)
8468 {
8469 struct Type * param;
8470
8471 strcat(string, "(");
8472 for(param = type->__anon1.__anon2.params.first; param; param = param->next)
8473 {
8474 PrintType(param, string, 1, fullName);
8475 if(param->next)
8476 strcat(string, ", ");
8477 }
8478 strcat(string, ")");
8479 }
8480 if(type->kind == 12 || type->kind == 13 || type->kind == 11 || type->kind == 16)
8481 PostPrintType(type->kind == 16 ? type->__anon1.__anon3.method->dataType : type->__anon1.type, string, fullName);
8482 }
8483
8484 static void _PrintType(struct Type * type, char * string, unsigned int printName, unsigned int fullName, unsigned int printConst)
8485 {
8486 PrePrintType(type, string, fullName, (((void *)0)), printConst);
8487 if(type->__anon1.__anon2.thisClass || (printName && type->name && type->name[0]))
8488 strcat(string, " ");
8489 if((type->__anon1.__anon2.thisClass || type->__anon1.__anon2.staticMethod))
8490 {
8491 struct Symbol * _class = type->__anon1.__anon2.thisClass;
8492
8493 if((type->classObjectType == 2 || type->classObjectType == 1) || (_class && !strcmp(_class->string, "class")))
8494 {
8495 if(type->classObjectType == 1)
8496 strcat(string, "class");
8497 else
8498 strcat(string, type->byReference ? "typed_object&" : "typed_object");
8499 }
8500 else if(_class && _class->string)
8501 {
8502 char * s = _class->string;
8503
8504 if(fullName)
8505 strcat(string, s);
8506 else
8507 {
8508 char * name = __ecereNameSpace__ecere__sys__RSearchString(s, "::", strlen(s), 1, 0);
8509
8510 if(name)
8511 name += 2;
8512 else
8513 name = s;
8514 strcat(string, name);
8515 }
8516 }
8517 strcat(string, "::");
8518 }
8519 if(printName && type->name)
8520 PrintName(type, string, fullName);
8521 PostPrintType(type, string, fullName);
8522 if(type->bitFieldCount)
8523 {
8524 char count[100];
8525
8526 sprintf(count, ":%d", type->bitFieldCount);
8527 strcat(string, count);
8528 }
8529 }
8530
8531 struct Conversion;
8532
8533 struct Conversion
8534 {
8535 struct Conversion * prev, * next;
8536 struct __ecereNameSpace__ecere__com__Property * convert;
8537 unsigned int isGet;
8538 struct Type * resultType;
8539 } ecere_gcc_struct;
8540
8541 static void FreeConvert(struct Conversion * convert)
8542 {
8543 if(convert->resultType)
8544 FreeType(convert->resultType);
8545 }
8546
8547 struct Enumerator;
8548
8549 struct Enumerator
8550 {
8551 struct Enumerator * prev;
8552 struct Enumerator * next;
8553 struct Location loc;
8554 struct Identifier * id;
8555 struct Expression * exp;
8556 } ecere_gcc_struct;
8557
8558 struct AsmField;
8559
8560 struct AsmField
8561 {
8562 struct AsmField * prev;
8563 struct AsmField * next;
8564 struct Location loc;
8565 char *  command;
8566 struct Expression * expression;
8567 struct Identifier * symbolic;
8568 } ecere_gcc_struct;
8569
8570 struct ClassDefinition;
8571
8572 struct Context
8573 {
8574 struct Context * parent;
8575 struct __ecereNameSpace__ecere__sys__BinaryTree types;
8576 struct __ecereNameSpace__ecere__sys__BinaryTree classes;
8577 struct __ecereNameSpace__ecere__sys__BinaryTree symbols;
8578 struct __ecereNameSpace__ecere__sys__BinaryTree structSymbols;
8579 int nextID;
8580 int simpleID;
8581 struct __ecereNameSpace__ecere__sys__BinaryTree templateTypes;
8582 struct ClassDefinition * classDef;
8583 unsigned int templateTypesOnly;
8584 unsigned int hasNameSpace;
8585 } ecere_gcc_struct;
8586
8587 struct External
8588 {
8589 struct External * prev;
8590 struct External * next;
8591 struct Location loc;
8592 int type;
8593 struct Symbol * symbol;
8594 union
8595 {
8596 struct FunctionDefinition * function;
8597 struct ClassDefinition * _class;
8598 struct Declaration * declaration;
8599 char *  importString;
8600 struct Identifier * id;
8601 struct DBTableDef * table;
8602 } ecere_gcc_struct __anon1;
8603 int importType;
8604 struct External * fwdDecl;
8605 struct __ecereNameSpace__ecere__com__Instance * outgoing;
8606 struct __ecereNameSpace__ecere__com__Instance * incoming;
8607 int nonBreakableIncoming;
8608 } ecere_gcc_struct;
8609
8610 struct ClassDefinition
8611 {
8612 struct ClassDefinition * prev;
8613 struct ClassDefinition * next;
8614 struct Location loc;
8615 struct Specifier * _class;
8616 struct __ecereNameSpace__ecere__sys__OldList *  baseSpecs;
8617 struct __ecereNameSpace__ecere__sys__OldList *  definitions;
8618 struct Symbol * symbol;
8619 struct Location blockStart;
8620 struct Location nameLoc;
8621 int declMode;
8622 unsigned int deleteWatchable;
8623 } ecere_gcc_struct;
8624
8625 void __ecereMethod_External_CreateUniqueEdge(struct External * this, struct External * from, unsigned int soft);
8626
8627 void __ecereMethod_External_CreateEdge(struct External * this, struct External * from, unsigned int soft);
8628
8629 void DeclareGlobalData(struct External * neededFor, struct GlobalData * data)
8630 {
8631 struct Symbol * symbol = data->symbol;
8632
8633 if(!symbol || !symbol->__anon2.__anon1.pointerExternal)
8634 {
8635 if(inCompiler)
8636 {
8637 if(!symbol)
8638 symbol = data->symbol = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Symbol);
8639 }
8640 if(!data->dataType)
8641 data->dataType = ProcessTypeString(data->dataTypeString, 0);
8642 if(inCompiler)
8643 {
8644 struct Declaration * decl;
8645 struct __ecereNameSpace__ecere__sys__OldList * specifiers, * declarators;
8646 struct Declarator * d;
8647 struct External * external;
8648
8649 specifiers = MkList();
8650 declarators = MkList();
8651 ListAdd(specifiers, MkSpecifier(EXTERN));
8652 d = MkDeclaratorIdentifier(MkIdentifier(data->fullName));
8653 d = SpecDeclFromString(data->dataTypeString, specifiers, d);
8654 ListAdd(declarators, MkInitDeclarator(d, (((void *)0))));
8655 decl = MkDeclaration(specifiers, declarators);
8656 external = MkExternalDeclaration(decl);
8657 if(curExternal)
8658 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*ast), curExternal->prev, external);
8659 external->symbol = symbol;
8660 symbol->__anon2.__anon1.pointerExternal = external;
8661 DeclareType(external, data->dataType, 1, 1);
8662 }
8663 }
8664 if(inCompiler && neededFor && symbol && symbol->__anon2.__anon1.pointerExternal)
8665 __ecereMethod_External_CreateUniqueEdge(neededFor, symbol->__anon2.__anon1.pointerExternal, 0);
8666 }
8667
8668 struct Symbol * FindSymbol(const char * name, struct Context * startContext, struct Context * endContext, unsigned int isStruct, unsigned int globalNameSpace)
8669 {
8670 struct Context * ctx;
8671 struct Symbol * symbol = (((void *)0));
8672
8673 for(ctx = startContext; ctx && !symbol; ctx = ctx->parent)
8674 {
8675 if(ctx == globalContext && !globalNameSpace && ctx->hasNameSpace)
8676 {
8677 symbol = (((void *)0));
8678 if(thisNameSpace)
8679 {
8680 char curName[1024];
8681
8682 strcpy(curName, thisNameSpace);
8683 strcat(curName, "::");
8684 strcat(curName, name);
8685 symbol = FindWithNameSpace(isStruct ? &ctx->structSymbols : &ctx->symbols, curName);
8686 }
8687 if(!symbol)
8688 symbol = FindWithNameSpace(isStruct ? &ctx->structSymbols : &ctx->symbols, name);
8689 }
8690 else
8691 symbol = (struct Symbol *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindString((isStruct ? &ctx->structSymbols : &ctx->symbols), name);
8692 if(symbol || ctx == endContext)
8693 break;
8694 }
8695 if(inCompiler && symbol && ctx == globalContext && symbol->__anon2.__anon1.pointerExternal && curExternal && symbol->__anon2.__anon1.pointerExternal != curExternal)
8696 __ecereMethod_External_CreateUniqueEdge(curExternal, symbol->__anon2.__anon1.pointerExternal, symbol->__anon2.__anon1.pointerExternal->type == 0);
8697 return symbol;
8698 }
8699
8700 struct PropertyDef;
8701
8702 struct ClassDef
8703 {
8704 struct ClassDef * prev;
8705 struct ClassDef * next;
8706 struct Location loc;
8707 int type;
8708 union
8709 {
8710 struct Declaration * decl;
8711 struct ClassFunction * function;
8712 struct __ecereNameSpace__ecere__sys__OldList *  defProperties;
8713 struct PropertyDef * propertyDef;
8714 struct PropertyWatch * propertyWatch;
8715 char *  designer;
8716 struct Identifier * defaultProperty;
8717 struct
8718 {
8719 struct Identifier * id;
8720 struct Initializer * initializer;
8721 } ecere_gcc_struct __anon1;
8722 } ecere_gcc_struct __anon1;
8723 int memberAccess;
8724 void *  object;
8725 } ecere_gcc_struct;
8726
8727 struct PropertyDef
8728 {
8729 struct PropertyDef * prev;
8730 struct PropertyDef * next;
8731 struct Location loc;
8732 struct __ecereNameSpace__ecere__sys__OldList *  specifiers;
8733 struct Declarator * declarator;
8734 struct Identifier * id;
8735 struct Statement * getStmt;
8736 struct Statement * setStmt;
8737 struct Statement * issetStmt;
8738 struct Symbol * symbol;
8739 struct Expression * category;
8740 struct
8741 {
8742 unsigned int conversion : 1;
8743 unsigned int isWatchable : 1;
8744 unsigned int isDBProp : 1;
8745 } ecere_gcc_struct __anon1;
8746 } ecere_gcc_struct;
8747
8748 static void IdentifyAnonStructs(struct __ecereNameSpace__ecere__sys__OldList * definitions)
8749 {
8750 struct ClassDef * def;
8751 int anonID = 1;
8752
8753 for(def = (*definitions).first; def; def = def->next)
8754 {
8755 if(def->type == 2)
8756 {
8757 struct Declaration * decl = def->__anon1.decl;
8758
8759 if(decl && decl->__anon1.__anon1.specifiers)
8760 {
8761 struct Specifier * spec;
8762 unsigned int isStruct = 0;
8763
8764 for(spec = (*decl->__anon1.__anon1.specifiers).first; spec; spec = spec->next)
8765 {
8766 if(spec->type == 3 || spec->type == 4)
8767 {
8768 if(spec->__anon1.__anon2.definitions)
8769 IdentifyAnonStructs(spec->__anon1.__anon2.definitions);
8770 isStruct = 1;
8771 }
8772 }
8773 if(isStruct)
8774 {
8775 struct Declarator * d = (((void *)0));
8776
8777 if(decl->__anon1.__anon1.declarators)
8778 {
8779 for(d = (*decl->__anon1.__anon1.declarators).first; d; d = d->next)
8780 {
8781 struct Identifier * idDecl = GetDeclId(d);
8782
8783 if(idDecl)
8784 break;
8785 }
8786 }
8787 if(!d)
8788 {
8789 char id[100];
8790
8791 sprintf(id, "__anon%d", anonID++);
8792 if(!decl->__anon1.__anon1.declarators)
8793 decl->__anon1.__anon1.declarators = MkList();
8794 ListAdd(decl->__anon1.__anon1.declarators, MkDeclaratorIdentifier(MkIdentifier(id)));
8795 }
8796 }
8797 }
8798 }
8799 }
8800 }
8801
8802 struct MemberInit;
8803
8804 typedef union YYSTYPE
8805 {
8806 int specifierType;
8807 int i;
8808 int declMode;
8809 struct Identifier * id;
8810 struct Expression * exp;
8811 struct Specifier * specifier;
8812 struct __ecereNameSpace__ecere__sys__OldList * list;
8813 struct Enumerator * enumerator;
8814 struct Declarator * declarator;
8815 struct Pointer * pointer;
8816 struct Initializer * initializer;
8817 struct InitDeclarator * initDeclarator;
8818 struct TypeName * typeName;
8819 struct Declaration * declaration;
8820 struct Statement * stmt;
8821 struct FunctionDefinition * function;
8822 struct External * external;
8823 struct Context * context;
8824 struct AsmField * asmField;
8825 struct Attrib * attrib;
8826 struct ExtDecl * extDecl;
8827 struct Attribute * attribute;
8828 struct Instantiation * instance;
8829 struct MembersInit * membersInit;
8830 struct MemberInit * memberInit;
8831 struct ClassFunction * classFunction;
8832 struct ClassDefinition * _class;
8833 struct ClassDef * classDef;
8834 struct PropertyDef * prop;
8835 char * string;
8836 struct Symbol * symbol;
8837 struct PropertyWatch * propertyWatch;
8838 struct TemplateParameter * templateParameter;
8839 struct TemplateArgument * templateArgument;
8840 struct TemplateDatatype * templateDatatype;
8841 struct DBTableEntry * dbtableEntry;
8842 struct DBIndexItem * dbindexItem;
8843 struct DBTableDef * dbtableDef;
8844 } ecere_gcc_struct YYSTYPE;
8845
8846 extern YYSTYPE yylval;
8847
8848 struct MemberInit
8849 {
8850 struct MemberInit * prev;
8851 struct MemberInit * next;
8852 struct Location loc;
8853 struct Location realLoc;
8854 struct __ecereNameSpace__ecere__sys__OldList *  identifiers;
8855 struct Initializer * initializer;
8856 unsigned int used;
8857 unsigned int variable;
8858 unsigned int takeOutExp;
8859 } ecere_gcc_struct;
8860
8861 extern struct MemberInit * MkMemberInit(struct __ecereNameSpace__ecere__sys__OldList * ids, struct Initializer * initializer);
8862
8863 struct __ecereNameSpace__ecere__com__ClassTemplateParameter;
8864
8865 struct __ecereNameSpace__ecere__com__ClassTemplateParameter
8866 {
8867 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * prev;
8868 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * next;
8869 const char *  name;
8870 int type;
8871 union
8872 {
8873 const char *  dataTypeString;
8874 int memberType;
8875 } ecere_gcc_struct __anon1;
8876 struct __ecereNameSpace__ecere__com__ClassTemplateArgument defaultArg;
8877 void *  param;
8878 } ecere_gcc_struct;
8879
8880 struct __ecereNameSpace__ecere__com__ClassTemplateArgument * FindTemplateArg(struct __ecereNameSpace__ecere__com__Class * _class, struct TemplateParameter * param)
8881 {
8882 struct __ecereNameSpace__ecere__com__ClassTemplateArgument * arg = (((void *)0));
8883 int id = 0;
8884 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * curParam = (((void *)0));
8885 struct __ecereNameSpace__ecere__com__Class * sClass;
8886
8887 for(sClass = _class; sClass; sClass = sClass->base)
8888 {
8889 id = 0;
8890 if(sClass->templateClass)
8891 sClass = sClass->templateClass;
8892 for(curParam = sClass->templateParams.first; curParam; curParam = curParam->next)
8893 {
8894 if(curParam->type == 0 && !strcmp(param->identifier->string, curParam->name))
8895 {
8896 for(sClass = sClass->base; sClass; sClass = sClass->base)
8897 {
8898 if(sClass->templateClass)
8899 sClass = sClass->templateClass;
8900 id += sClass->templateParams.count;
8901 }
8902 break;
8903 }
8904 id++;
8905 }
8906 if(curParam)
8907 break;
8908 }
8909 if(curParam)
8910 {
8911 arg = &_class->templateArgs[id];
8912 if(arg && param->type == 0)
8913 (*arg).__anon1.__anon1.dataTypeClass = __ecereNameSpace__ecere__com__eSystem_FindClass(_class->module, (*arg).__anon1.__anon1.dataTypeString);
8914 }
8915 return arg;
8916 }
8917
8918 struct Context * SetupTemplatesContext(struct __ecereNameSpace__ecere__com__Class * _class)
8919 {
8920 struct Context * context = PushContext();
8921
8922 context->templateTypesOnly = 1;
8923 if(_class->symbol && ((struct Symbol *)_class->symbol)->templateParams)
8924 {
8925 struct TemplateParameter * param = (*((struct Symbol *)_class->symbol)->templateParams).first;
8926
8927 for(; param; param = param->next)
8928 {
8929 if(param->type == 0 && param->identifier)
8930 {
8931 struct TemplatedType * type = (type = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_TemplatedType), type->key = (uintptr_t)param->identifier->string, type->param = param, type);
8932
8933 __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Add(&curContext->templateTypes, (struct __ecereNameSpace__ecere__sys__BTNode *)type);
8934 }
8935 }
8936 }
8937 else if(_class)
8938 {
8939 struct __ecereNameSpace__ecere__com__Class * sClass;
8940
8941 for(sClass = _class; sClass; sClass = sClass->base)
8942 {
8943 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * p;
8944
8945 for(p = sClass->templateParams.first; p; p = p->next)
8946 {
8947 if(p->type == 0)
8948 {
8949 struct TemplateParameter * param = p->param;
8950 struct TemplatedType * type;
8951
8952 if(!param)
8953 {
8954 p->param = param = __extension__ ({
8955 struct TemplateParameter * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_TemplateParameter);
8956
8957 __ecereInstance1->identifier = MkIdentifier(p->name), __ecereInstance1->type = p->type, __ecereInstance1->dataTypeString = p->__anon1.dataTypeString, __ecereInstance1;
8958 });
8959 }
8960 type = __extension__ ({
8961 struct TemplatedType * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_TemplatedType);
8962
8963 __ecereInstance1->key = (uintptr_t)p->name, __ecereInstance1->param = param, __ecereInstance1;
8964 });
8965 __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Add(&curContext->templateTypes, (struct __ecereNameSpace__ecere__sys__BTNode *)type);
8966 }
8967 }
8968 }
8969 }
8970 return context;
8971 }
8972
8973 char * ReplaceThisClass(struct __ecereNameSpace__ecere__com__Class * _class)
8974 {
8975 if(thisClassParams && _class->templateParams.count && !_class->templateClass)
8976 {
8977 unsigned int first = 1;
8978 int p = 0;
8979 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * param;
8980 int lastParam = -1;
8981 char className[1024];
8982
8983 strcpy(className, _class->fullName);
8984 for(param = _class->templateParams.first; param; param = param->next)
8985 {
8986 {
8987 if(first)
8988 strcat(className, "<");
8989 if(!first)
8990 strcat(className, ", ");
8991 if(lastParam + 1 != p)
8992 {
8993 strcat(className, param->name);
8994 strcat(className, " = ");
8995 }
8996 strcat(className, param->name);
8997 first = 0;
8998 lastParam = p;
8999 }
9000 p++;
9001 }
9002 if(!first)
9003 {
9004 int len = strlen(className);
9005
9006 if(className[len - 1] == '>')
9007 className[len++] = ' ';
9008 className[len++] = '>';
9009 className[len++] = '\0';
9010 }
9011 return __ecereNameSpace__ecere__sys__CopyString(className);
9012 }
9013 else
9014 return __ecereNameSpace__ecere__sys__CopyString(_class->fullName);
9015 }
9016
9017 struct Type * ReplaceThisClassType(struct __ecereNameSpace__ecere__com__Class * _class)
9018 {
9019 struct Type * type;
9020
9021 if(thisClassParams && _class->templateParams.count && !_class->templateClass)
9022 {
9023 unsigned int first = 1;
9024 int p = 0;
9025 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * param;
9026 int lastParam = -1;
9027 char className[1024];
9028
9029 strcpy(className, _class->fullName);
9030 for(param = _class->templateParams.first; param; param = param->next)
9031 {
9032 {
9033 if(first)
9034 strcat(className, "<");
9035 if(!first)
9036 strcat(className, ", ");
9037 if(lastParam + 1 != p)
9038 {
9039 strcat(className, param->name);
9040 strcat(className, " = ");
9041 }
9042 strcat(className, param->name);
9043 first = 0;
9044 lastParam = p;
9045 }
9046 p++;
9047 }
9048 if(!first)
9049 {
9050 int len = strlen(className);
9051
9052 if(className[len - 1] == '>')
9053 className[len++] = ' ';
9054 className[len++] = '>';
9055 className[len++] = '\0';
9056 }
9057 type = MkClassType(className);
9058 }
9059 else
9060 {
9061 type = MkClassType(_class->fullName);
9062 }
9063 return type;
9064 }
9065
9066 static int DeclareMembers(struct External * neededBy, struct __ecereNameSpace__ecere__com__Class * _class, unsigned int isMember)
9067 {
9068 struct __ecereNameSpace__ecere__com__DataMember * topMember = isMember ? (struct __ecereNameSpace__ecere__com__DataMember *)_class : (((void *)0));
9069 struct __ecereNameSpace__ecere__com__DataMember * member;
9070 struct Context * context = isMember ? (((void *)0)) : SetupTemplatesContext(_class);
9071
9072 if(!isMember && (_class->type == 1 || _class->type == 5) && _class->base->type != 1000)
9073 DeclareMembers(neededBy, _class->base, 0);
9074 for(member = isMember ? topMember->members.first : _class->membersAndProperties.first; member; member = member->next)
9075 {
9076 if(!member->isProperty)
9077 {
9078 switch(member->type)
9079 {
9080 case 0:
9081 {
9082 if(!member->dataType && member->dataTypeString)
9083 member->dataType = ProcessTypeString(member->dataTypeString, 0);
9084 if(member->dataType)
9085 DeclareType(neededBy, member->dataType, 1, 0);
9086 break;
9087 }
9088 case 1:
9089 case 2:
9090 {
9091 DeclareMembers(neededBy, (struct __ecereNameSpace__ecere__com__Class *)member, 1);
9092 break;
9093 }
9094 }
9095 }
9096 }
9097 if(context)
9098 FinishTemplatesContext(context);
9099 return topMember ? topMember->memberID : _class->memberID;
9100 }
9101
9102 void ProcessMethodType(struct __ecereNameSpace__ecere__com__Method * method)
9103 {
9104 if(!method->dataType)
9105 {
9106 struct Context * context = SetupTemplatesContext(method->_class);
9107
9108 method->dataType = ProcessTypeString(method->dataTypeString, 0);
9109 FinishTemplatesContext(context);
9110 if(method->type != 1 && method->dataType)
9111 {
9112 if(!method->dataType->__anon1.__anon2.thisClass && !method->dataType->__anon1.__anon2.staticMethod)
9113 {
9114 if(!method->_class->symbol)
9115 method->_class->symbol = FindClass(method->_class->fullName);
9116 method->dataType->__anon1.__anon2.thisClass = method->_class->symbol;
9117 }
9118 }
9119 }
9120 }
9121
9122 void ProcessPropertyType(struct __ecereNameSpace__ecere__com__Property * prop)
9123 {
9124 if(!prop->dataType)
9125 {
9126 struct Context * context = SetupTemplatesContext(prop->_class);
9127
9128 prop->dataType = ProcessTypeString(prop->dataTypeString, 0);
9129 FinishTemplatesContext(context);
9130 }
9131 }
9132
9133 void ReplaceThisClassSpecifiers(struct __ecereNameSpace__ecere__sys__OldList * specs, struct __ecereNameSpace__ecere__com__Class * _class)
9134 {
9135 if(specs != (((void *)0)) && _class)
9136 {
9137 struct Specifier * spec;
9138
9139 for(spec = specs->first; spec; spec = spec->next)
9140 {
9141 if(spec->type == 0 && spec->__anon1.specifier == THISCLASS)
9142 {
9143 spec->type = 1;
9144 spec->__anon1.__anon1.name = ReplaceThisClass(_class);
9145 spec->__anon1.__anon1.symbol = FindClass(spec->__anon1.__anon1.name);
9146 }
9147 }
9148 }
9149 }
9150
9151 static unsigned int ResolveIdWithClass(struct Expression * exp, struct __ecereNameSpace__ecere__com__Class * _class, unsigned int skipIDClassCheck)
9152 {
9153 struct Identifier * id = exp->__anon1.__anon1.identifier;
9154 struct __ecereNameSpace__ecere__com__Method * method = (((void *)0));
9155 struct __ecereNameSpace__ecere__com__Property * prop = (((void *)0));
9156 struct __ecereNameSpace__ecere__com__DataMember * member = (((void *)0));
9157 struct __ecereNameSpace__ecere__com__ClassProperty * classProp = (((void *)0));
9158
9159 if(_class && _class->type == 4)
9160 {
9161 struct __ecereNameSpace__ecere__sys__NamedLink64 * value = (((void *)0));
9162 struct __ecereNameSpace__ecere__com__Class * enumClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "enum");
9163
9164 if(enumClass)
9165 {
9166 struct __ecereNameSpace__ecere__com__Class * baseClass;
9167
9168 for(baseClass = _class; baseClass && baseClass->type == 4; baseClass = baseClass->base)
9169 {
9170 struct __ecereNameSpace__ecere__com__EnumClassData * e = (baseClass ? ((void *)(((char *)baseClass->data) + enumClass->offsetClass)) : (((void *)0)));
9171
9172 for(value = e->values.first; value; value = value->next)
9173 {
9174 if(!strcmp(value->name, id->string))
9175 break;
9176 }
9177 if(value)
9178 {
9179 exp->isConstant = 1;
9180 if(inCompiler || inPreCompiler || inDebugger)
9181 {
9182 char constant[256];
9183
9184 FreeExpContents(exp);
9185 exp->type = 2;
9186 if(!strcmp(baseClass->dataTypeString, "int") || !strcmp(baseClass->dataTypeString, "int64") || !strcmp(baseClass->dataTypeString, "char") || !strcmp(baseClass->dataTypeString, "short"))
9187 sprintf(constant, ((__runtimePlatform == 1) ? "%I64d" : "%lld"), value->data);
9188 else
9189 sprintf(constant, ((__runtimePlatform == 1) ? "0x%I64X" : "0x%llX"), value->data);
9190 exp->__anon1.__anon1.constant = __ecereNameSpace__ecere__sys__CopyString(constant);
9191 }
9192 exp->expType = MkClassType(baseClass->fullName);
9193 break;
9194 }
9195 }
9196 }
9197 if(value)
9198 return 1;
9199 }
9200 if((method = __ecereNameSpace__ecere__com__eClass_FindMethod(_class, id->string, privateModule)))
9201 {
9202 ProcessMethodType(method);
9203 exp->expType = __extension__ ({
9204 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
9205
9206 __ecereInstance1->refCount = 1, __ecereInstance1->kind = 16, __ecereInstance1->__anon1.__anon3.method = method, __ecereInstance1->__anon1.__anon3.methodClass = (skipIDClassCheck || (id && id->_class)) ? _class : (((void *)0)), __ecereInstance1;
9207 });
9208 return 1;
9209 }
9210 else if((prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, id->string, privateModule)))
9211 {
9212 if(!prop->dataType)
9213 ProcessPropertyType(prop);
9214 exp->expType = prop->dataType;
9215 if(prop->dataType)
9216 prop->dataType->refCount++;
9217 return 1;
9218 }
9219 else if((member = __ecereNameSpace__ecere__com__eClass_FindDataMember(_class, id->string, privateModule, (((void *)0)), (((void *)0)))))
9220 {
9221 if(!member->dataType)
9222 member->dataType = ProcessTypeString(member->dataTypeString, 0);
9223 exp->expType = member->dataType;
9224 if(member->dataType)
9225 member->dataType->refCount++;
9226 return 1;
9227 }
9228 else if((classProp = __ecereNameSpace__ecere__com__eClass_FindClassProperty(_class, id->string)))
9229 {
9230 if(!classProp->dataType)
9231 classProp->dataType = ProcessTypeString(classProp->dataTypeString, 0);
9232 if(classProp->constant)
9233 {
9234 FreeExpContents(exp);
9235 exp->isConstant = 1;
9236 if(classProp->dataType->kind == 13 && classProp->dataType->__anon1.type->kind == 1)
9237 {
9238 exp->type = 3;
9239 exp->__anon1.__anon1.constant = QMkString((char *)(uintptr_t)classProp->Get(_class));
9240 }
9241 else
9242 {
9243 char constant[256];
9244
9245 exp->type = 2;
9246 sprintf(constant, "%d", (int)classProp->Get(_class));
9247 exp->__anon1.__anon1.constant = __ecereNameSpace__ecere__sys__CopyString(constant);
9248 }
9249 }
9250 else
9251 {
9252 }
9253 exp->expType = classProp->dataType;
9254 if(classProp->dataType)
9255 classProp->dataType->refCount++;
9256 return 1;
9257 }
9258 return 0;
9259 }
9260
9261 void DeclareProperty(struct External * neededBy, struct __ecereNameSpace__ecere__com__Property * prop, char * setName, char * getName)
9262 {
9263 struct Symbol * symbol = prop->symbol;
9264 unsigned int imported = 0;
9265 unsigned int dllImport = 0;
9266 struct External * structExternal = (((void *)0));
9267 struct External * instExternal = (((void *)0));
9268
9269 strcpy(setName, "__ecereProp_");
9270 FullClassNameCat(setName, prop->_class->fullName, 0);
9271 strcat(setName, "_Set_");
9272 FullClassNameCat(setName, prop->name, 1);
9273 strcpy(getName, "__ecereProp_");
9274 FullClassNameCat(getName, prop->_class->fullName, 0);
9275 strcat(getName, "_Get_");
9276 FullClassNameCat(getName, prop->name, 1);
9277 if(!symbol || symbol->_import)
9278 {
9279 if(!symbol)
9280 {
9281 struct Symbol * classSym;
9282
9283 if(!prop->_class->symbol)
9284 prop->_class->symbol = FindClass(prop->_class->fullName);
9285 classSym = prop->_class->symbol;
9286 if(classSym && !classSym->_import)
9287 {
9288 struct ModuleImport * module;
9289
9290 if(prop->_class->module)
9291 module = FindModule(prop->_class->module);
9292 else
9293 module = mainModule;
9294 classSym->_import = __extension__ ({
9295 struct ClassImport * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_ClassImport);
9296
9297 __ecereInstance1->name = __ecereNameSpace__ecere__sys__CopyString(prop->_class->fullName), __ecereInstance1->isRemote = prop->_class->isRemote, __ecereInstance1;
9298 });
9299 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(&module->classes, classSym->_import);
9300 }
9301 symbol = prop->symbol = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Symbol);
9302 symbol->_import = (struct ClassImport *)__extension__ ({
9303 struct PropertyImport * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_PropertyImport);
9304
9305 __ecereInstance1->name = __ecereNameSpace__ecere__sys__CopyString(prop->name), __ecereInstance1->isVirtual = 0, __ecereInstance1->hasSet = prop->Set ? 1 : 0, __ecereInstance1->hasGet = prop->Get ? 1 : 0, __ecereInstance1;
9306 });
9307 if(classSym)
9308 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(&classSym->_import->properties, symbol->_import);
9309 }
9310 imported = 1;
9311 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)
9312 dllImport = 1;
9313 }
9314 if(!symbol->type)
9315 {
9316 struct Context * context = SetupTemplatesContext(prop->_class);
9317
9318 symbol->type = ProcessTypeString(prop->dataTypeString, 0);
9319 FinishTemplatesContext(context);
9320 }
9321 if((prop->Get && !symbol->__anon2.__anon2.externalGet) || (prop->Set && !symbol->__anon2.__anon2.externalSet))
9322 {
9323 if(prop->_class->type == 0 && prop->_class->structSize)
9324 instExternal = DeclareStruct((((void *)0)), "ecere::com::Instance", 0, 1);
9325 structExternal = DeclareStruct((((void *)0)), prop->_class->fullName, prop->_class->type != 1, 0);
9326 }
9327 if(prop->Get && !symbol->__anon2.__anon2.externalGet)
9328 {
9329 struct Declaration * decl;
9330 struct __ecereNameSpace__ecere__sys__OldList * specifiers, * declarators;
9331 struct Declarator * d;
9332 struct __ecereNameSpace__ecere__sys__OldList * params;
9333 struct Specifier * spec = (((void *)0));
9334 struct External * external;
9335 struct Declarator * typeDecl;
9336 unsigned int simple = 0;
9337 unsigned int needReference;
9338
9339 specifiers = MkList();
9340 declarators = MkList();
9341 params = MkList();
9342 ListAdd(params, MkTypeName(MkListOne(MkSpecifierName(prop->_class->fullName)), MkDeclaratorIdentifier(MkIdentifier("this"))));
9343 d = MkDeclaratorIdentifier(MkIdentifier(getName));
9344 if(dllImport)
9345 d = MkDeclaratorBrackets(MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), d));
9346 {
9347 struct Context * context = SetupTemplatesContext(prop->_class);
9348
9349 typeDecl = SpecDeclFromString(prop->dataTypeString, specifiers, (((void *)0)));
9350 FinishTemplatesContext(context);
9351 }
9352 needReference = !typeDecl || typeDecl->type == 1;
9353 for(spec = (*specifiers).first; spec; spec = spec->next)
9354 {
9355 if(spec->type == 1)
9356 {
9357 struct Symbol * classSym = spec->__anon1.__anon1.symbol;
9358
9359 if(needReference)
9360 {
9361 symbol->_class = classSym->__anon1.registered;
9362 if(classSym->__anon1.registered && classSym->__anon1.registered->type == 1)
9363 simple = 1;
9364 }
9365 break;
9366 }
9367 }
9368 if(!simple)
9369 d = PlugDeclarator(typeDecl, d);
9370 else
9371 {
9372 ListAdd(params, MkTypeName(specifiers, PlugDeclarator(typeDecl, MkDeclaratorIdentifier(MkIdentifier("value")))));
9373 specifiers = MkList();
9374 }
9375 d = MkDeclaratorFunction(d, params);
9376 if(dllImport)
9377 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*specifiers), (((void *)0)), MkSpecifier(EXTERN));
9378 else if(prop->_class->symbol && ((struct Symbol *)prop->_class->symbol)->isStatic)
9379 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*specifiers), (((void *)0)), MkSpecifier(STATIC));
9380 if(simple)
9381 ListAdd(specifiers, MkSpecifier(VOID));
9382 ListAdd(declarators, MkInitDeclarator(d, (((void *)0))));
9383 decl = MkDeclaration(specifiers, declarators);
9384 external = MkExternalDeclaration(decl);
9385 if(structExternal)
9386 __ecereMethod_External_CreateEdge(external, structExternal, 0);
9387 if(instExternal)
9388 __ecereMethod_External_CreateEdge(external, instExternal, 0);
9389 if(spec)
9390 DeclareStruct(external, spec->__anon1.__anon1.name, 0, needReference);
9391 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add((&*ast), external);
9392 external->symbol = symbol;
9393 symbol->__anon2.__anon2.externalGet = external;
9394 ReplaceThisClassSpecifiers(specifiers, prop->_class);
9395 if(typeDecl)
9396 FreeDeclarator(typeDecl);
9397 }
9398 if(prop->Set && !symbol->__anon2.__anon2.externalSet)
9399 {
9400 struct Declaration * decl;
9401 struct __ecereNameSpace__ecere__sys__OldList * specifiers, * declarators;
9402 struct Declarator * d;
9403 struct __ecereNameSpace__ecere__sys__OldList * params;
9404 struct Specifier * spec = (((void *)0));
9405 struct External * external;
9406 struct Declarator * typeDecl;
9407 unsigned int needReference;
9408
9409 declarators = MkList();
9410 params = MkList();
9411 if(!prop->conversion || prop->_class->type == 1)
9412 {
9413 ListAdd(params, MkTypeName(MkListOne(MkSpecifierName(prop->_class->fullName)), MkDeclaratorIdentifier(MkIdentifier("this"))));
9414 }
9415 specifiers = MkList();
9416 {
9417 struct Context * context = SetupTemplatesContext(prop->_class);
9418
9419 typeDecl = d = SpecDeclFromString(prop->dataTypeString, specifiers, MkDeclaratorIdentifier(MkIdentifier("value")));
9420 FinishTemplatesContext(context);
9421 }
9422 if(!strcmp(prop->_class->base->fullName, "eda::Row") || !strcmp(prop->_class->base->fullName, "eda::Id"))
9423 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*specifiers), (((void *)0)), MkSpecifier(CONST));
9424 ListAdd(params, MkTypeName(specifiers, d));
9425 d = MkDeclaratorIdentifier(MkIdentifier(setName));
9426 if(dllImport)
9427 d = MkDeclaratorBrackets(MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), d));
9428 d = MkDeclaratorFunction(d, params);
9429 needReference = !typeDecl || typeDecl->type == 1;
9430 for(spec = (*specifiers).first; spec; spec = spec->next)
9431 {
9432 if(spec->type == 1)
9433 {
9434 struct Symbol * classSym = spec->__anon1.__anon1.symbol;
9435
9436 if(needReference)
9437 symbol->_class = classSym->__anon1.registered;
9438 break;
9439 }
9440 }
9441 ListAdd(declarators, MkInitDeclarator(d, (((void *)0))));
9442 specifiers = MkList();
9443 if(dllImport)
9444 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*specifiers), (((void *)0)), MkSpecifier(EXTERN));
9445 else if(prop->_class->symbol && ((struct Symbol *)prop->_class->symbol)->isStatic)
9446 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*specifiers), (((void *)0)), MkSpecifier(STATIC));
9447 if(!prop->conversion || prop->_class->type == 1)
9448 ListAdd(specifiers, MkSpecifier(VOID));
9449 else
9450 ListAdd(specifiers, MkSpecifierName(prop->_class->fullName));
9451 decl = MkDeclaration(specifiers, declarators);
9452 external = MkExternalDeclaration(decl);
9453 if(structExternal)
9454 __ecereMethod_External_CreateEdge(external, structExternal, 0);
9455 if(instExternal)
9456 __ecereMethod_External_CreateEdge(external, instExternal, 0);
9457 if(spec)
9458 DeclareStruct(external, spec->__anon1.__anon1.name, 0, needReference);
9459 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add((&*ast), external);
9460 external->symbol = symbol;
9461 symbol->__anon2.__anon2.externalSet = external;
9462 ReplaceThisClassSpecifiers(specifiers, prop->_class);
9463 }
9464 if(!symbol->__anon2.__anon2.externalPtr)
9465 {
9466 struct Declaration * decl;
9467 struct External * external;
9468 struct __ecereNameSpace__ecere__sys__OldList * specifiers = MkList();
9469 char propName[1024];
9470
9471 if(imported)
9472 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*specifiers), (((void *)0)), MkSpecifier(EXTERN));
9473 else
9474 {
9475 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*specifiers), (((void *)0)), MkSpecifier(STATIC));
9476 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add((&*specifiers), MkSpecifierExtended(MkExtDeclAttrib(MkAttrib(ATTRIB, MkListOne(MkAttribute(__ecereNameSpace__ecere__sys__CopyString("unused"), (((void *)0))))))));
9477 }
9478 ListAdd(specifiers, MkSpecifierName("Property"));
9479 strcpy(propName, "__ecereProp_");
9480 FullClassNameCat(propName, prop->_class->fullName, 0);
9481 strcat(propName, "_");
9482 FullClassNameCat(propName, prop->name, 1);
9483 {
9484 struct __ecereNameSpace__ecere__sys__OldList * list = MkList();
9485
9486 ListAdd(list, MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier(propName)), (((void *)0))));
9487 if(!imported)
9488 {
9489 strcpy(propName, "__ecerePropM_");
9490 FullClassNameCat(propName, prop->_class->fullName, 0);
9491 strcat(propName, "_");
9492 FullClassNameCat(propName, prop->name, 1);
9493 ListAdd(list, MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier(propName)), (((void *)0))));
9494 }
9495 decl = MkDeclaration(specifiers, list);
9496 }
9497 external = MkExternalDeclaration(decl);
9498 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*ast), curExternal->prev, external);
9499 external->symbol = symbol;
9500 symbol->__anon2.__anon2.externalPtr = external;
9501 }
9502 if(inCompiler && neededBy)
9503 {
9504 if(symbol->__anon2.__anon2.externalPtr)
9505 __ecereMethod_External_CreateUniqueEdge(neededBy, symbol->__anon2.__anon2.externalPtr, 0);
9506 if(symbol->__anon2.__anon2.externalGet)
9507 __ecereMethod_External_CreateUniqueEdge(neededBy, symbol->__anon2.__anon2.externalGet, symbol->__anon2.__anon2.externalGet->type == 0);
9508 if(symbol->__anon2.__anon2.externalSet)
9509 __ecereMethod_External_CreateUniqueEdge(neededBy, symbol->__anon2.__anon2.externalSet, symbol->__anon2.__anon2.externalSet->type == 0);
9510 }
9511 }
9512
9513 static void ProcessDeclarator(struct Declarator *  decl, unsigned int isFunction);
9514
9515 void DeclareMethod(struct External * neededFor, struct __ecereNameSpace__ecere__com__Method * method, const char * name)
9516 {
9517 struct Symbol * symbol = method->symbol;
9518
9519 if(!symbol || (!symbol->__anon2.__anon1.pointerExternal && (!symbol->__anon2.__anon3.methodCodeExternal || method->type == 1)))
9520 {
9521 unsigned int dllImport = 0;
9522
9523 if(!method->dataType)
9524 method->dataType = ProcessTypeString(method->dataTypeString, 0);
9525 {
9526 if(!symbol || method->type == 1)
9527 {
9528 struct Symbol * classSym;
9529
9530 if(!method->_class->symbol)
9531 method->_class->symbol = FindClass(method->_class->fullName);
9532 classSym = method->_class->symbol;
9533 if(!classSym->_import)
9534 {
9535 struct ModuleImport * module;
9536
9537 if(method->_class->module && ((struct __ecereNameSpace__ecere__com__Module *)(((char *)method->_class->module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->name)
9538 module = FindModule(method->_class->module);
9539 else
9540 module = mainModule;
9541 classSym->_import = __extension__ ({
9542 struct ClassImport * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_ClassImport);
9543
9544 __ecereInstance1->name = __ecereNameSpace__ecere__sys__CopyString(method->_class->fullName), __ecereInstance1->isRemote = method->_class->isRemote, __ecereInstance1;
9545 });
9546 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(&module->classes, classSym->_import);
9547 }
9548 if(!symbol)
9549 {
9550 symbol = method->symbol = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Symbol);
9551 }
9552 if(!symbol->_import)
9553 {
9554 symbol->_import = (struct ClassImport *)__extension__ ({
9555 struct MethodImport * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_MethodImport);
9556
9557 __ecereInstance1->name = __ecereNameSpace__ecere__sys__CopyString(method->name), __ecereInstance1->isVirtual = method->type == 1, __ecereInstance1;
9558 });
9559 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(&classSym->_import->methods, symbol->_import);
9560 }
9561 if(!symbol)
9562 {
9563 symbol->type = method->dataType;
9564 if(symbol->type)
9565 symbol->type->refCount++;
9566 }
9567 }
9568 if(!method->dataType->dllExport)
9569 {
9570 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)
9571 dllImport = 1;
9572 }
9573 }
9574 if(inCompiler)
9575 {
9576 struct Declaration * decl;
9577 struct __ecereNameSpace__ecere__sys__OldList * specifiers, * declarators;
9578 struct Declarator * d;
9579 struct Declarator * funcDecl;
9580 struct External * external;
9581
9582 specifiers = MkList();
9583 declarators = MkList();
9584 if(dllImport)
9585 ListAdd(specifiers, MkSpecifier(EXTERN));
9586 else if(method->_class->symbol && ((struct Symbol *)method->_class->symbol)->isStatic)
9587 ListAdd(specifiers, MkSpecifier(STATIC));
9588 if(method->type == 1)
9589 {
9590 ListAdd(specifiers, MkSpecifier(INT));
9591 d = MkDeclaratorIdentifier(MkIdentifier(name));
9592 }
9593 else
9594 {
9595 d = MkDeclaratorIdentifier(MkIdentifier(name));
9596 if(dllImport)
9597 d = MkDeclaratorBrackets(MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), d));
9598 {
9599 struct Context * context = SetupTemplatesContext(method->_class);
9600
9601 d = SpecDeclFromString(method->dataTypeString, specifiers, d);
9602 FinishTemplatesContext(context);
9603 }
9604 funcDecl = GetFuncDecl(d);
9605 if(dllImport)
9606 {
9607 struct Specifier * spec, * next;
9608
9609 for(spec = (*specifiers).first; spec; spec = next)
9610 {
9611 next = spec->next;
9612 if(spec->type == 5)
9613 {
9614 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove((&*specifiers), spec);
9615 FreeSpecifier(spec);
9616 }
9617 }
9618 }
9619 if(method->dataType && !method->dataType->__anon1.__anon2.staticMethod)
9620 {
9621 if(funcDecl && funcDecl->__anon1.function.parameters && (*funcDecl->__anon1.function.parameters).count)
9622 {
9623 struct __ecereNameSpace__ecere__com__Class * _class = method->dataType->__anon1.__anon2.thisClass ? method->dataType->__anon1.__anon2.thisClass->__anon1.registered : method->_class;
9624 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")));
9625 struct TypeName * firstParam = ((struct TypeName *)(*funcDecl->__anon1.function.parameters).first);
9626 struct Specifier * firstSpec = firstParam->qualifiers ? (*firstParam->qualifiers).first : (((void *)0));
9627
9628 if(firstSpec && firstSpec->type == 0 && firstSpec->__anon1.specifier == VOID && !firstParam->declarator)
9629 {
9630 struct TypeName * param = (*funcDecl->__anon1.function.parameters).first;
9631
9632 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove((&*funcDecl->__anon1.function.parameters), param);
9633 FreeTypeName(param);
9634 }
9635 if(!funcDecl->__anon1.function.parameters)
9636 funcDecl->__anon1.function.parameters = MkList();
9637 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*funcDecl->__anon1.function.parameters), (((void *)0)), thisParam);
9638 }
9639 }
9640 }
9641 ProcessDeclarator(d, 1);
9642 ListAdd(declarators, MkInitDeclarator(d, (((void *)0))));
9643 decl = MkDeclaration(specifiers, declarators);
9644 ReplaceThisClassSpecifiers(specifiers, method->_class);
9645 external = MkExternalDeclaration(decl);
9646 external->symbol = symbol;
9647 symbol->__anon2.__anon1.pointerExternal = external;
9648 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add((&*ast), external);
9649 DeclareStruct(external, method->_class->fullName, 1, 1);
9650 if(method->dataType)
9651 DeclareType(external, method->dataType, 1, 1);
9652 }
9653 }
9654 if(inCompiler && neededFor)
9655 {
9656 struct External * external = symbol->__anon2.__anon1.pointerExternal ? symbol->__anon2.__anon1.pointerExternal : symbol->__anon2.__anon3.methodCodeExternal;
9657
9658 __ecereMethod_External_CreateUniqueEdge(neededFor, external, external->type == 0);
9659 }
9660 }
9661
9662 struct __ecereNameSpace__ecere__com__GlobalFunction;
9663
9664 struct __ecereNameSpace__ecere__com__GlobalFunction
9665 {
9666 struct __ecereNameSpace__ecere__com__GlobalFunction * prev;
9667 struct __ecereNameSpace__ecere__com__GlobalFunction * next;
9668 const char *  name;
9669 int (*  function)();
9670 struct __ecereNameSpace__ecere__com__Instance * module;
9671 struct __ecereNameSpace__ecere__com__NameSpace *  nameSpace;
9672 const char *  dataTypeString;
9673 struct Type * dataType;
9674 void *  symbol;
9675 } ecere_gcc_struct;
9676
9677 extern struct __ecereNameSpace__ecere__com__GlobalFunction * __ecereNameSpace__ecere__com__eSystem_FindFunction(struct __ecereNameSpace__ecere__com__Instance * module, const char *  name);
9678
9679 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);
9680
9681 unsigned int DeclareFunction(struct External * neededFor, struct __ecereNameSpace__ecere__com__GlobalFunction * function, char * name)
9682 {
9683 struct Symbol * symbol = function->symbol;
9684
9685 if(!symbol || !symbol->__anon2.__anon1.pointerExternal)
9686 {
9687 unsigned int imported = 0;
9688 unsigned int dllImport = 0;
9689
9690 if(!function->dataType)
9691 {
9692 function->dataType = ProcessTypeString(function->dataTypeString, 0);
9693 if(!function->dataType->__anon1.__anon2.thisClass)
9694 function->dataType->__anon1.__anon2.staticMethod = 1;
9695 }
9696 if(inCompiler)
9697 {
9698 if(!symbol)
9699 {
9700 struct ModuleImport * module = FindModule(function->module);
9701
9702 symbol = function->symbol = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Symbol);
9703 if(module->name)
9704 {
9705 if(!function->dataType->dllExport)
9706 {
9707 symbol->_import = (struct ClassImport *)__extension__ ({
9708 struct FunctionImport * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_FunctionImport);
9709
9710 __ecereInstance1->name = __ecereNameSpace__ecere__sys__CopyString(function->name), __ecereInstance1;
9711 });
9712 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(&module->functions, symbol->_import);
9713 }
9714 }
9715 {
9716 symbol->type = ProcessTypeString(function->dataTypeString, 0);
9717 if(!symbol->type->__anon1.__anon2.thisClass)
9718 symbol->type->__anon1.__anon2.staticMethod = 1;
9719 }
9720 }
9721 imported = symbol->_import ? 1 : 0;
9722 if(imported && function->module != privateModule && ((struct __ecereNameSpace__ecere__com__Module *)(((char *)function->module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->importType != 1)
9723 dllImport = 1;
9724 }
9725 if(inCompiler)
9726 {
9727 {
9728 struct Declaration * decl;
9729 struct __ecereNameSpace__ecere__sys__OldList * specifiers, * declarators;
9730 struct Declarator * d;
9731 struct Declarator * funcDecl;
9732 struct External * external;
9733
9734 specifiers = MkList();
9735 declarators = MkList();
9736 ListAdd(specifiers, MkSpecifier(EXTERN));
9737 d = MkDeclaratorIdentifier(MkIdentifier(imported ? name : function->name));
9738 if(dllImport)
9739 d = MkDeclaratorBrackets(MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), d));
9740 d = SpecDeclFromString(function->dataTypeString, specifiers, d);
9741 if(((struct __ecereNameSpace__ecere__com__Module *)(((char *)function->module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->importType == 1)
9742 {
9743 struct Specifier * spec;
9744
9745 for(spec = (*specifiers).first; spec; spec = spec->next)
9746 if(spec->type == 5 && spec->__anon1.__anon1.extDecl && spec->__anon1.__anon1.extDecl->type == 0 && !strcmp(spec->__anon1.__anon1.extDecl->__anon1.s, "dllexport"))
9747 {
9748 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove((&*specifiers), spec);
9749 FreeSpecifier(spec);
9750 break;
9751 }
9752 }
9753 funcDecl = GetFuncDecl(d);
9754 if(funcDecl && !funcDecl->__anon1.function.parameters)
9755 {
9756 funcDecl->__anon1.function.parameters = MkList();
9757 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*funcDecl->__anon1.function.parameters), (((void *)0)), MkTypeName(MkListOne(MkSpecifier(VOID)), (((void *)0))));
9758 }
9759 ListAdd(declarators, MkInitDeclarator(d, (((void *)0))));
9760 {
9761 struct Context * oldCtx = curContext;
9762
9763 curContext = globalContext;
9764 decl = MkDeclaration(specifiers, declarators);
9765 curContext = oldCtx;
9766 }
9767 external = MkExternalDeclaration(decl);
9768 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add((&*ast), external);
9769 external->symbol = symbol;
9770 symbol->__anon2.__anon1.pointerExternal = external;
9771 DeclareType(external, function->dataType, 1, 1);
9772 }
9773 }
9774 }
9775 if(inCompiler && neededFor && symbol && symbol->__anon2.__anon1.pointerExternal)
9776 __ecereMethod_External_CreateUniqueEdge(neededFor, symbol->__anon2.__anon1.pointerExternal, symbol->__anon2.__anon1.pointerExternal->type == 0);
9777 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;
9778 }
9779
9780 void DeclareFunctionUtil(struct External * neededBy, const char * s)
9781 {
9782 struct __ecereNameSpace__ecere__com__GlobalFunction * function = __ecereNameSpace__ecere__com__eSystem_FindFunction(privateModule, s);
9783
9784 if(function)
9785 {
9786 char name[1024];
9787
9788 name[0] = 0;
9789 if(((struct __ecereNameSpace__ecere__com__Module *)(((char *)function->module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->importType != 1 && (!function->dataType || !function->dataType->dllExport))
9790 strcpy(name, "__ecereFunction_");
9791 FullClassNameCat(name, s, 0);
9792 DeclareFunction(neededBy, function, name);
9793 }
9794 else if(neededBy)
9795 FindSymbol(s, globalContext, globalContext, 0, 0);
9796 }
9797
9798 static void CreateFireWatcher(struct __ecereNameSpace__ecere__com__Property * prop, struct Expression * object, struct Statement * stmt)
9799 {
9800 char propName[1024], propNameM[1024];
9801 char getName[1024], setName[1024];
9802 struct __ecereNameSpace__ecere__sys__OldList * args;
9803
9804 DeclareProperty(curExternal, prop, setName, getName);
9805 strcpy(propName, "__ecereProp_");
9806 FullClassNameCat(propName, prop->_class->fullName, 0);
9807 strcat(propName, "_");
9808 FullClassNameCat(propName, prop->name, 1);
9809 strcpy(propNameM, "__ecerePropM_");
9810 FullClassNameCat(propNameM, prop->_class->fullName, 0);
9811 strcat(propNameM, "_");
9812 FullClassNameCat(propNameM, prop->name, 1);
9813 if(prop->isWatchable)
9814 {
9815 args = MkList();
9816 ListAdd(args, object ? CopyExpression(object) : MkExpIdentifier(MkIdentifier("this")));
9817 ListAdd(args, MkExpIdentifier(MkIdentifier(propName)));
9818 ListAdd(stmt->__anon1.expressions, MkExpCall(MkExpIdentifier(MkIdentifier("ecere::com::eInstance_FireWatchers")), args));
9819 args = MkList();
9820 ListAdd(args, object ? CopyExpression(object) : MkExpIdentifier(MkIdentifier("this")));
9821 ListAdd(args, MkExpIdentifier(MkIdentifier(propNameM)));
9822 ListAdd(stmt->__anon1.expressions, MkExpCall(MkExpIdentifier(MkIdentifier("ecere::com::eInstance_FireWatchers")), args));
9823 DeclareFunctionUtil(curExternal, "eInstance_FireWatchers");
9824 }
9825 {
9826 args = MkList();
9827 ListAdd(args, object ? CopyExpression(object) : MkExpIdentifier(MkIdentifier("this")));
9828 ListAdd(args, MkExpIdentifier(MkIdentifier(propName)));
9829 ListAdd(stmt->__anon1.expressions, MkExpCall(MkExpIdentifier(MkIdentifier("ecere::com::eInstance_FireSelfWatchers")), args));
9830 args = MkList();
9831 ListAdd(args, object ? CopyExpression(object) : MkExpIdentifier(MkIdentifier("this")));
9832 ListAdd(args, MkExpIdentifier(MkIdentifier(propNameM)));
9833 ListAdd(stmt->__anon1.expressions, MkExpCall(MkExpIdentifier(MkIdentifier("ecere::com::eInstance_FireSelfWatchers")), args));
9834 DeclareFunctionUtil(curExternal, "eInstance_FireSelfWatchers");
9835 }
9836 if(curFunction->propSet && !strcmp(curFunction->propSet->string, prop->name) && (!object || (object->type == 0 && !strcmp(object->__anon1.__anon1.identifier->string, "this"))))
9837 curFunction->propSet->fireWatchersDone = 1;
9838 }
9839
9840 struct __ecereNameSpace__ecere__com__SubModule;
9841
9842 struct __ecereNameSpace__ecere__com__SubModule
9843 {
9844 struct __ecereNameSpace__ecere__com__SubModule * prev;
9845 struct __ecereNameSpace__ecere__com__SubModule * next;
9846 struct __ecereNameSpace__ecere__com__Instance * module;
9847 int importMode;
9848 } ecere_gcc_struct;
9849
9850 unsigned int ModuleVisibility(struct __ecereNameSpace__ecere__com__Instance * searchIn, struct __ecereNameSpace__ecere__com__Instance * searchFor)
9851 {
9852 struct __ecereNameSpace__ecere__com__SubModule * subModule;
9853
9854 if(searchFor == searchIn)
9855 return 1;
9856 for(subModule = ((struct __ecereNameSpace__ecere__com__Module *)(((char *)searchIn + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->modules.first; subModule; subModule = subModule->next)
9857 {
9858 if(subModule->importMode == 1 || searchIn == ((struct __ecereNameSpace__ecere__com__Module *)(((char *)searchIn + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application)
9859 {
9860 if(ModuleVisibility(subModule->module, searchFor))
9861 return 1;
9862 }
9863 }
9864 return 0;
9865 }
9866
9867 void ProcessExpressionType(struct Expression *  exp);
9868
9869 static void ReplaceClassMembers(struct Expression * exp, struct __ecereNameSpace__ecere__com__Class * _class)
9870 {
9871 if(exp->type == 0 && exp->__anon1.__anon1.identifier)
9872 {
9873 struct Identifier * id = exp->__anon1.__anon1.identifier;
9874 struct Context * ctx;
9875 struct Symbol * symbol = (((void *)0));
9876
9877 if(!id->_class || !id->_class->__anon1.__anon1.name || strcmp(id->_class->__anon1.__anon1.name, "property"))
9878 {
9879 for(ctx = curContext; ctx != topContext->parent && !symbol; ctx = ctx->parent)
9880 {
9881 symbol = (struct Symbol *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindString(&ctx->symbols, id->string);
9882 if(symbol)
9883 break;
9884 }
9885 }
9886 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))))
9887 {
9888 struct __ecereNameSpace__ecere__com__Property * prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, id->string, privateModule);
9889 struct __ecereNameSpace__ecere__com__Method * method = (((void *)0));
9890 struct __ecereNameSpace__ecere__com__DataMember * member = (((void *)0));
9891 struct __ecereNameSpace__ecere__com__ClassProperty * classProp = (((void *)0));
9892
9893 if(!prop)
9894 {
9895 method = __ecereNameSpace__ecere__com__eClass_FindMethod(_class, id->string, privateModule);
9896 }
9897 if(!prop && !method)
9898 member = __ecereNameSpace__ecere__com__eClass_FindDataMember(_class, id->string, privateModule, (((void *)0)), (((void *)0)));
9899 if(!prop && !method && !member)
9900 {
9901 classProp = __ecereNameSpace__ecere__com__eClass_FindClassProperty(_class, id->string);
9902 }
9903 if(prop || method || member || classProp)
9904 {
9905 exp->type = 8;
9906 exp->__anon1.member.member = id;
9907 exp->__anon1.member.memberType = 0;
9908 exp->__anon1.member.exp = QMkExpId("this");
9909 exp->addedThis = 1;
9910 }
9911 else if(_class && _class->templateParams.first)
9912 {
9913 struct __ecereNameSpace__ecere__com__Class * sClass;
9914
9915 for(sClass = _class; sClass; sClass = sClass->base)
9916 {
9917 if(sClass->templateParams.first)
9918 {
9919 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * param;
9920
9921 for(param = sClass->templateParams.first; param; param = param->next)
9922 {
9923 if(param->type == 2 && !strcmp(param->name, id->string))
9924 {
9925 struct Expression * argExp = GetTemplateArgExpByName(param->name, _class, 2);
9926
9927 if(argExp)
9928 {
9929 struct Declarator * decl;
9930 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
9931
9932 FreeIdentifier(exp->__anon1.member.member);
9933 ProcessExpressionType(argExp);
9934 decl = SpecDeclFromString(param->__anon1.dataTypeString, specs, (((void *)0)));
9935 exp->expType = ProcessType(specs, decl);
9936 exp->type = 5;
9937 exp->__anon1.list = MkListOne(MkExpOp((((void *)0)), '*', MkExpCast(MkTypeName(specs, MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), decl)), MkExpOp((((void *)0)), '&', argExp))));
9938 }
9939 }
9940 }
9941 }
9942 }
9943 }
9944 }
9945 }
9946 }
9947
9948 static void PopulateInstanceProcessMember(struct Instantiation * inst, struct __ecereNameSpace__ecere__sys__OldList * memberList, struct __ecereNameSpace__ecere__com__DataMember * parentDataMember, unsigned int offset)
9949 {
9950 struct __ecereNameSpace__ecere__com__DataMember * dataMember;
9951
9952 for(dataMember = parentDataMember->members.first; dataMember; dataMember = dataMember->next)
9953 {
9954 if(!dataMember->name && (dataMember->type == 2 || dataMember->type == 1))
9955 PopulateInstanceProcessMember(inst, memberList, dataMember, offset + dataMember->offset);
9956 else
9957 {
9958 struct Expression * exp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression);
9959 struct MemberInit * member = MkMemberInit(MkListOne(MkIdentifier(dataMember->name)), MkInitializerAssignment(exp));
9960 struct Type * type;
9961 void * ptr = inst->data + dataMember->offset + offset;
9962 char * result = (((void *)0));
9963
9964 exp->loc = member->loc = inst->loc;
9965 ((struct Identifier *)(*member->identifiers).first)->loc = inst->loc;
9966 if(!dataMember->dataType)
9967 dataMember->dataType = ProcessTypeString(dataMember->dataTypeString, 0);
9968 type = dataMember->dataType;
9969 if(type->kind == 8)
9970 {
9971 struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class->__anon1.registered;
9972
9973 if(_class->type == 4)
9974 {
9975 struct __ecereNameSpace__ecere__com__Class * enumClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "enum");
9976
9977 if(enumClass)
9978 {
9979 struct __ecereNameSpace__ecere__com__EnumClassData * e = (_class ? ((void *)(((char *)_class->data) + enumClass->offsetClass)) : (((void *)0)));
9980 struct __ecereNameSpace__ecere__sys__NamedLink64 * item;
9981
9982 for(item = e->values.first; item; item = item->next)
9983 {
9984 if(item->data == GetEnumValue(_class, ptr))
9985 {
9986 result = item->name;
9987 break;
9988 }
9989 }
9990 if(result)
9991 {
9992 exp->__anon1.__anon1.identifier = MkIdentifier(result);
9993 exp->type = 0;
9994 exp->destType = MkClassType(_class->fullName);
9995 ProcessExpressionType(exp);
9996 }
9997 }
9998 }
9999 if(_class->type == 4 || _class->type == 3 || _class->type == 2)
10000 {
10001 if(!_class->dataType)
10002 _class->dataType = ProcessTypeString(_class->dataTypeString, 0);
10003 type = _class->dataType;
10004 }
10005 }
10006 if(!result)
10007 {
10008 switch(type->kind)
10009 {
10010 case 6:
10011 {
10012 FreeExpContents(exp);
10013 exp->__anon1.__anon1.constant = PrintFloat(*(float *)ptr);
10014 exp->type = 2;
10015 break;
10016 }
10017 case 7:
10018 {
10019 FreeExpContents(exp);
10020 exp->__anon1.__anon1.constant = PrintDouble(*(double *)ptr);
10021 exp->type = 2;
10022 break;
10023 }
10024 case 3:
10025 {
10026 FreeExpContents(exp);
10027 exp->__anon1.__anon1.constant = PrintInt(*(int *)ptr);
10028 exp->type = 2;
10029 break;
10030 }
10031 case 4:
10032 {
10033 FreeExpContents(exp);
10034 exp->__anon1.__anon1.constant = PrintInt64(*(long long *)ptr);
10035 exp->type = 2;
10036 break;
10037 }
10038 case 22:
10039 {
10040 FreeExpContents(exp);
10041 exp->__anon1.__anon1.constant = PrintInt64((long long)*(intptr_t *)ptr);
10042 exp->type = 2;
10043 break;
10044 }
10045 case 23:
10046 {
10047 FreeExpContents(exp);
10048 exp->__anon1.__anon1.constant = PrintInt64((long long)*(ssize_t *)ptr);
10049 exp->type = 2;
10050 break;
10051 }
10052 default:
10053 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Unhandled type populating instance\n", (((void *)0))));
10054 }
10055 }
10056 ListAdd(memberList, member);
10057 }
10058 if(parentDataMember->type == 1)
10059 break;
10060 }
10061 }
10062
10063 void CheckTemplateTypes(struct Expression * exp)
10064 {
10065 struct Expression * nbExp = GetNonBracketsExp(exp);
10066
10067 if(exp->destType && exp->destType->passAsTemplate && exp->expType && exp->expType->kind != 20 && !exp->expType->passAsTemplate && (nbExp == exp || nbExp->type != 11))
10068 {
10069 struct Expression * newExp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression);
10070 struct Context * context;
10071 int kind = exp->expType->kind;
10072
10073 *newExp = *exp;
10074 if(exp->destType)
10075 exp->destType->refCount++;
10076 if(exp->expType)
10077 exp->expType->refCount++;
10078 newExp->prev = (((void *)0));
10079 newExp->next = (((void *)0));
10080 if(exp->expType->kind == 8 && exp->expType->__anon1._class && exp->expType->__anon1._class->__anon1.registered)
10081 {
10082 struct __ecereNameSpace__ecere__com__Class * c = exp->expType->__anon1._class->__anon1.registered;
10083
10084 if(c->type == 2 || c->type == 4 || c->type == 3)
10085 {
10086 if(!c->dataType)
10087 c->dataType = ProcessTypeString(c->dataTypeString, 0);
10088 kind = c->dataType->kind;
10089 }
10090 }
10091 switch(kind)
10092 {
10093 case 7:
10094 if(exp->destType->classObjectType)
10095 {
10096 if(exp->destType)
10097 exp->destType->refCount--;
10098 if(exp->expType)
10099 exp->expType->refCount--;
10100 ((newExp ? (__ecereClass_Expression->Destructor ? __ecereClass_Expression->Destructor((void *)newExp) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(newExp)) : 0), newExp = 0);
10101 }
10102 else
10103 {
10104 struct __ecereNameSpace__ecere__sys__OldList * specs;
10105 struct __ecereNameSpace__ecere__sys__OldList * unionDefs = MkList();
10106 struct __ecereNameSpace__ecere__sys__OldList * statements = MkList();
10107
10108 context = PushContext();
10109 ListAdd(unionDefs, MkClassDefDeclaration(MkStructDeclaration(MkListOne(MkSpecifier(DOUBLE)), MkListOne(MkDeclaratorIdentifier(MkIdentifier("d"))), (((void *)0)))));
10110 ListAdd(unionDefs, MkClassDefDeclaration(MkStructDeclaration(MkListOne(MkSpecifierName("uint64")), MkListOne(MkDeclaratorIdentifier(MkIdentifier("i"))), (((void *)0)))));
10111 specs = MkListOne(MkStructOrUnion(4, (((void *)0)), unionDefs));
10112 exp->type = 23;
10113 exp->__anon1.compound = MkCompoundStmt(MkListOne(MkDeclaration(specs, MkListOne(MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier("__internal_union")), (((void *)0)))))), statements);
10114 ListAdd(statements, MkExpressionStmt(MkListOne(MkExpOp(MkExpMember(MkExpIdentifier(MkIdentifier("__internal_union")), MkIdentifier("d")), '=', newExp))));
10115 ListAdd(statements, MkExpressionStmt(MkListOne(MkExpMember(MkExpIdentifier(MkIdentifier("__internal_union")), MkIdentifier("i")))));
10116 exp->__anon1.compound->__anon1.compound.context = context;
10117 PopContext(context);
10118 }
10119 break;
10120 default:
10121 exp->type = 11;
10122 exp->__anon1.cast.typeName = MkTypeName(MkListOne(MkSpecifierName("uint64")), (((void *)0)));
10123 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))
10124 exp->__anon1.cast.exp = MkExpCast(MkTypeName(MkListOne(MkSpecifierName("uintptr")), (((void *)0))), MkExpBrackets(MkListOne(newExp)));
10125 else
10126 exp->__anon1.cast.exp = MkExpBrackets(MkListOne(newExp));
10127 exp->needCast = 1;
10128 break;
10129 }
10130 }
10131 else if(exp->expType && exp->expType->passAsTemplate && exp->destType && ((unsigned int)((exp->usage & 0x1) >> 0)) && exp->destType->kind != 20 && !exp->destType->passAsTemplate)
10132 {
10133 struct Expression * newExp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression);
10134 struct Context * context;
10135 int kind = exp->expType->kind;
10136
10137 *newExp = *exp;
10138 if(exp->destType)
10139 exp->destType->refCount++;
10140 if(exp->expType)
10141 exp->expType->refCount++;
10142 newExp->prev = (((void *)0));
10143 newExp->next = (((void *)0));
10144 if(exp->expType->kind == 8 && exp->expType->__anon1._class && exp->expType->__anon1._class->__anon1.registered)
10145 {
10146 struct __ecereNameSpace__ecere__com__Class * c = exp->expType->__anon1._class->__anon1.registered;
10147
10148 if(c->type == 2 || c->type == 4 || c->type == 3)
10149 {
10150 if(!c->dataType)
10151 c->dataType = ProcessTypeString(c->dataTypeString, 0);
10152 kind = c->dataType->kind;
10153 }
10154 }
10155 switch(kind)
10156 {
10157 case 7:
10158 if(exp->destType->classObjectType)
10159 {
10160 if(exp->destType)
10161 exp->destType->refCount--;
10162 if(exp->expType)
10163 exp->expType->refCount--;
10164 ((newExp ? (__ecereClass_Expression->Destructor ? __ecereClass_Expression->Destructor((void *)newExp) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(newExp)) : 0), newExp = 0);
10165 }
10166 else
10167 {
10168 struct __ecereNameSpace__ecere__sys__OldList * specs;
10169 struct __ecereNameSpace__ecere__sys__OldList * unionDefs = MkList();
10170 struct __ecereNameSpace__ecere__sys__OldList * statements = MkList();
10171
10172 context = PushContext();
10173 ListAdd(unionDefs, MkClassDefDeclaration(MkStructDeclaration(MkListOne(MkSpecifier(DOUBLE)), MkListOne(MkDeclaratorIdentifier(MkIdentifier("d"))), (((void *)0)))));
10174 ListAdd(unionDefs, MkClassDefDeclaration(MkStructDeclaration(MkListOne(MkSpecifierName("uint64")), MkListOne(MkDeclaratorIdentifier(MkIdentifier("i"))), (((void *)0)))));
10175 specs = MkListOne(MkStructOrUnion(4, (((void *)0)), unionDefs));
10176 exp->type = 23;
10177 exp->__anon1.compound = MkCompoundStmt(MkListOne(MkDeclaration(specs, MkListOne(MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier("__internal_union")), (((void *)0)))))), statements);
10178 ListAdd(statements, MkExpressionStmt(MkListOne(MkExpOp(MkExpMember(MkExpIdentifier(MkIdentifier("__internal_union")), MkIdentifier("i")), '=', newExp))));
10179 ListAdd(statements, MkExpressionStmt(MkListOne(MkExpMember(MkExpIdentifier(MkIdentifier("__internal_union")), MkIdentifier("d")))));
10180 exp->__anon1.compound->__anon1.compound.context = context;
10181 PopContext(context);
10182 }
10183 break;
10184 case 8:
10185 {
10186 if(exp->expType->__anon1._class && exp->expType->__anon1._class->__anon1.registered && exp->expType->__anon1._class->__anon1.registered->type == 1)
10187 {
10188 exp->type = 5;
10189 newExp = MkExpCast(MkTypeName(MkListOne(MkSpecifierName("uintptr")), (((void *)0))), newExp);
10190 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)));
10191 ProcessExpressionType((*exp->__anon1.list).first);
10192 break;
10193 }
10194 else
10195 {
10196 exp->type = 5;
10197 if(__ecereProp_Type_Get_isPointerType(exp->expType))
10198 {
10199 exp->needTemplateCast = 2;
10200 newExp->needCast = 1;
10201 newExp->needTemplateCast = 2;
10202 newExp = MkExpCast(MkTypeName(MkListOne(MkSpecifierName("uintptr")), (((void *)0))), newExp);
10203 }
10204 exp->__anon1.list = MkListOne(MkExpCast(MkTypeName(MkListOne(MkSpecifierName(exp->expType->__anon1._class->string)), (((void *)0))), newExp));
10205 exp->needTemplateCast = 2;
10206 newExp->needCast = 1;
10207 newExp->needTemplateCast = 2;
10208 ProcessExpressionType((*exp->__anon1.list).first);
10209 break;
10210 }
10211 }
10212 default:
10213 {
10214 if(exp->expType->kind == 20)
10215 {
10216 struct Type * type = ProcessTemplateParameterType(exp->expType->__anon1.templateParameter);
10217
10218 if(type)
10219 {
10220 FreeType(exp->destType);
10221 FreeType(exp->expType);
10222 ((newExp ? (__ecereClass_Expression->Destructor ? __ecereClass_Expression->Destructor((void *)newExp) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(newExp)) : 0), newExp = 0);
10223 break;
10224 }
10225 }
10226 {
10227 char typeString[1024];
10228 struct Declarator * decl;
10229 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
10230
10231 typeString[0] = '\0';
10232 PrintType(exp->expType, typeString, 0, 0);
10233 decl = SpecDeclFromString(typeString, specs, (((void *)0)));
10234 exp->type = 11;
10235 exp->__anon1.cast.typeName = MkTypeName(specs, decl);
10236 exp->__anon1.cast.exp = MkExpBrackets(MkListOne(newExp));
10237 exp->__anon1.cast.exp->needCast = 1;
10238 exp->needTemplateCast = 2;
10239 newExp->needTemplateCast = 2;
10240 }
10241 break;
10242 }
10243 }
10244 }
10245 }
10246
10247 static void ProcessInitializer(struct Initializer * init, struct Type * type)
10248 {
10249 switch(init->type)
10250 {
10251 case 0:
10252 if(!init->__anon1.exp || init->__anon1.exp->type != 1 || !init->__anon1.exp->__anon1.instance || init->__anon1.exp->__anon1.instance->_class || !type || type->kind == 8)
10253 {
10254 if(init->__anon1.exp && !init->__anon1.exp->destType)
10255 {
10256 FreeType(init->__anon1.exp->destType);
10257 init->__anon1.exp->destType = type;
10258 if(type)
10259 type->refCount++;
10260 }
10261 if(init->__anon1.exp)
10262 {
10263 ProcessExpressionType(init->__anon1.exp);
10264 init->isConstant = init->__anon1.exp->isConstant;
10265 }
10266 break;
10267 }
10268 else
10269 {
10270 struct Expression * exp = init->__anon1.exp;
10271 struct Instantiation * inst = exp->__anon1.instance;
10272 struct MembersInit * members;
10273
10274 init->type = 1;
10275 init->__anon1.list = MkList();
10276 if(inst->members)
10277 {
10278 for(members = (*inst->members).first; members; members = members->next)
10279 {
10280 if(members->type == 0)
10281 {
10282 struct MemberInit * member;
10283
10284 for(member = (*members->__anon1.dataMembers).first; member; member = member->next)
10285 {
10286 ListAdd(init->__anon1.list, member->initializer);
10287 member->initializer = (((void *)0));
10288 }
10289 }
10290 }
10291 }
10292 FreeExpression(exp);
10293 }
10294 case 1:
10295 {
10296 struct Initializer * i;
10297 struct Type * initializerType = (((void *)0));
10298 struct __ecereNameSpace__ecere__com__Class * curClass = (((void *)0));
10299 struct __ecereNameSpace__ecere__com__DataMember * curMember = (((void *)0));
10300 struct __ecereNameSpace__ecere__com__DataMember * subMemberStack[256];
10301 int subMemberStackPos = 0;
10302
10303 if(type && type->kind == 12)
10304 initializerType = Dereference(type);
10305 else if(type && (type->kind == 9 || type->kind == 10))
10306 initializerType = type->__anon1.__anon1.members.first;
10307 for(i = (*init->__anon1.list).first; i; i = i->next)
10308 {
10309 if(type && type->kind == 8 && type->__anon1._class && type->__anon1._class->__anon1.registered)
10310 {
10311 FindNextDataMember(type->__anon1._class->__anon1.registered, &curClass, &curMember, subMemberStack, &subMemberStackPos);
10312 if(curMember)
10313 {
10314 if(!curMember->dataType)
10315 curMember->dataType = ProcessTypeString(curMember->dataTypeString, 0);
10316 initializerType = curMember->dataType;
10317 }
10318 }
10319 ProcessInitializer(i, initializerType);
10320 if(initializerType && type && (type->kind == 9 || type->kind == 10))
10321 initializerType = initializerType->next;
10322 if(!i->isConstant)
10323 init->isConstant = 0;
10324 }
10325 if(type && type->kind == 12)
10326 FreeType(initializerType);
10327 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))
10328 {
10329 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Assigning list initializer to non list\n", (((void *)0))));
10330 }
10331 break;
10332 }
10333 }
10334 }
10335
10336 void PopulateInstance(struct Instantiation * inst)
10337 {
10338 struct Symbol * classSym = inst->_class->__anon1.__anon1.symbol;
10339 struct __ecereNameSpace__ecere__com__Class * _class = classSym->__anon1.registered;
10340 struct __ecereNameSpace__ecere__com__DataMember * dataMember;
10341 struct __ecereNameSpace__ecere__sys__OldList * memberList = MkList();
10342
10343 if(!inst->members)
10344 inst->members = MkListOne(MkMembersInitList(memberList));
10345 else
10346 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add((&*inst->members), MkMembersInitList(memberList));
10347 for(dataMember = _class->membersAndProperties.first; dataMember; dataMember = dataMember->next)
10348 {
10349 if(!dataMember->isProperty)
10350 {
10351 if(!dataMember->name && (dataMember->type == 2 || dataMember->type == 1))
10352 PopulateInstanceProcessMember(inst, memberList, dataMember, dataMember->offset);
10353 else
10354 {
10355 struct Expression * exp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression);
10356 struct MemberInit * member = MkMemberInit(MkListOne(MkIdentifier(dataMember->name)), MkInitializerAssignment(exp));
10357 struct Type * type;
10358 void * ptr = inst->data + dataMember->offset;
10359 char * result = (((void *)0));
10360
10361 exp->loc = member->loc = inst->loc;
10362 ((struct Identifier *)(*member->identifiers).first)->loc = inst->loc;
10363 if(!dataMember->dataType)
10364 dataMember->dataType = ProcessTypeString(dataMember->dataTypeString, 0);
10365 type = dataMember->dataType;
10366 if(type->kind == 8)
10367 {
10368 struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class->__anon1.registered;
10369
10370 if(_class->type == 4)
10371 {
10372 struct __ecereNameSpace__ecere__com__Class * enumClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "enum");
10373
10374 if(enumClass)
10375 {
10376 struct __ecereNameSpace__ecere__com__EnumClassData * e = (_class ? ((void *)(((char *)_class->data) + enumClass->offsetClass)) : (((void *)0)));
10377 struct __ecereNameSpace__ecere__sys__NamedLink64 * item;
10378
10379 for(item = e->values.first; item; item = item->next)
10380 {
10381 if(item->data == GetEnumValue(_class, ptr))
10382 {
10383 result = item->name;
10384 break;
10385 }
10386 }
10387 }
10388 if(result)
10389 {
10390 exp->__anon1.__anon1.identifier = MkIdentifier(result);
10391 exp->type = 0;
10392 exp->destType = MkClassType(_class->fullName);
10393 ProcessExpressionType(exp);
10394 }
10395 }
10396 if(_class->type == 4 || _class->type == 3 || _class->type == 2)
10397 {
10398 if(!_class->dataType)
10399 _class->dataType = ProcessTypeString(_class->dataTypeString, 0);
10400 type = _class->dataType;
10401 }
10402 }
10403 if(!result)
10404 {
10405 switch(type->kind)
10406 {
10407 case 6:
10408 {
10409 exp->__anon1.__anon1.constant = PrintFloat(*(float *)ptr);
10410 exp->type = 2;
10411 break;
10412 }
10413 case 7:
10414 {
10415 exp->__anon1.__anon1.constant = PrintDouble(*(double *)ptr);
10416 exp->type = 2;
10417 break;
10418 }
10419 case 3:
10420 {
10421 exp->__anon1.__anon1.constant = PrintInt(*(int *)ptr);
10422 exp->type = 2;
10423 break;
10424 }
10425 case 4:
10426 {
10427 exp->__anon1.__anon1.constant = PrintInt64(*(long long *)ptr);
10428 exp->type = 2;
10429 break;
10430 }
10431 case 22:
10432 {
10433 exp->__anon1.__anon1.constant = PrintInt64((long long)*(intptr_t *)ptr);
10434 exp->type = 2;
10435 break;
10436 }
10437 default:
10438 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Unhandled type populating instance\n", (((void *)0))));
10439 }
10440 }
10441 ListAdd(memberList, member);
10442 }
10443 }
10444 }
10445 }
10446
10447 int ComputeTypeSize(struct Type *  type);
10448
10449 void ComputeClassMembers(struct __ecereNameSpace__ecere__com__Class * _class, unsigned int isMember)
10450 {
10451 struct __ecereNameSpace__ecere__com__DataMember * member = isMember ? (struct __ecereNameSpace__ecere__com__DataMember *)_class : (((void *)0));
10452 struct Context * context = isMember ? (((void *)0)) : SetupTemplatesContext(_class);
10453
10454 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))
10455 {
10456 int unionMemberOffset = 0;
10457 int bitFields = 0;
10458
10459 if(member)
10460 {
10461 member->memberOffset = 0;
10462 if(targetBits < sizeof(void *) * 8)
10463 member->structAlignment = 0;
10464 }
10465 else if(targetBits < sizeof(void *) * 8)
10466 _class->structAlignment = 0;
10467 if(!member && ((_class->type == 0 || _class->type == 5) || (_class->type == 1 && _class->memberOffset && _class->memberOffset > _class->base->structSize)))
10468 _class->memberOffset = (_class->base && _class->type == 1) ? _class->base->structSize : 0;
10469 if(!member && _class->destructionWatchOffset)
10470 _class->memberOffset += sizeof(struct __ecereNameSpace__ecere__sys__OldList);
10471 {
10472 struct __ecereNameSpace__ecere__com__DataMember * dataMember;
10473
10474 for(dataMember = member ? member->members.first : _class->membersAndProperties.first; dataMember; dataMember = dataMember->next)
10475 {
10476 if(!dataMember->isProperty)
10477 {
10478 if(dataMember->type == 0 && dataMember->dataTypeString && !dataMember->dataType)
10479 {
10480 dataMember->dataType = ProcessTypeString(dataMember->dataTypeString, 0);
10481 }
10482 }
10483 }
10484 }
10485 {
10486 struct __ecereNameSpace__ecere__com__DataMember * dataMember;
10487
10488 for(dataMember = member ? member->members.first : _class->membersAndProperties.first; dataMember; dataMember = dataMember->next)
10489 {
10490 if(!dataMember->isProperty && (dataMember->type != 0 || dataMember->dataTypeString))
10491 {
10492 if(!isMember && _class->type == 2 && dataMember->dataType)
10493 {
10494 struct __ecereNameSpace__ecere__com__BitMember * bitMember = (struct __ecereNameSpace__ecere__com__BitMember *)dataMember;
10495 uint64 mask = 0;
10496 int d;
10497
10498 ComputeTypeSize(dataMember->dataType);
10499 if(bitMember->pos == -1)
10500 bitMember->pos = _class->memberOffset;
10501 if(!bitMember->size)
10502 bitMember->size = dataMember->dataType->size * 8;
10503 _class->memberOffset = bitMember->pos + bitMember->size;
10504 for(d = 0; d < bitMember->size; d++)
10505 {
10506 if(d)
10507 mask <<= 1;
10508 mask |= 1;
10509 }
10510 bitMember->mask = mask << bitMember->pos;
10511 }
10512 else if(dataMember->type == 0 && dataMember->dataType)
10513 {
10514 int size;
10515 int alignment = 0;
10516
10517 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)))
10518 ComputeTypeSize(dataMember->dataType);
10519 if(dataMember->dataType->bitFieldCount)
10520 {
10521 bitFields += dataMember->dataType->bitFieldCount;
10522 size = 0;
10523 }
10524 else
10525 {
10526 if(bitFields)
10527 {
10528 int size = (bitFields + 7) / 8;
10529
10530 if(isMember)
10531 {
10532 int __simpleStruct0;
10533
10534 if(alignment)
10535 {
10536 short __simpleStruct0;
10537
10538 member->structAlignment = (__simpleStruct0 = member->structAlignment, (__simpleStruct0 > alignment) ? __simpleStruct0 : alignment);
10539 if(member->memberOffset % alignment)
10540 member->memberOffset += alignment - (member->memberOffset % alignment);
10541 }
10542 dataMember->offset = member->memberOffset;
10543 if(member->type == 1)
10544 unionMemberOffset = (__simpleStruct0 = dataMember->dataType->size, (unionMemberOffset > __simpleStruct0) ? unionMemberOffset : __simpleStruct0);
10545 else
10546 {
10547 member->memberOffset += size;
10548 }
10549 }
10550 else
10551 {
10552 if(alignment)
10553 {
10554 short __simpleStruct0;
10555
10556 _class->structAlignment = (__simpleStruct0 = _class->structAlignment, (__simpleStruct0 > alignment) ? __simpleStruct0 : alignment);
10557 if(_class->memberOffset % alignment)
10558 _class->memberOffset += alignment - (_class->memberOffset % alignment);
10559 }
10560 dataMember->offset = _class->memberOffset;
10561 _class->memberOffset += size;
10562 }
10563 bitFields = 0;
10564 }
10565 size = dataMember->dataType->size;
10566 alignment = dataMember->dataType->alignment;
10567 }
10568 if(isMember)
10569 {
10570 int __simpleStruct0;
10571
10572 if(alignment)
10573 {
10574 short __simpleStruct0;
10575
10576 member->structAlignment = (__simpleStruct0 = member->structAlignment, (__simpleStruct0 > alignment) ? __simpleStruct0 : alignment);
10577 if(member->memberOffset % alignment)
10578 member->memberOffset += alignment - (member->memberOffset % alignment);
10579 }
10580 dataMember->offset = member->memberOffset;
10581 if(member->type == 1)
10582 unionMemberOffset = (__simpleStruct0 = dataMember->dataType->size, (unionMemberOffset > __simpleStruct0) ? unionMemberOffset : __simpleStruct0);
10583 else
10584 {
10585 member->memberOffset += size;
10586 }
10587 }
10588 else
10589 {
10590 if(alignment)
10591 {
10592 short __simpleStruct0;
10593
10594 _class->structAlignment = (__simpleStruct0 = _class->structAlignment, (__simpleStruct0 > alignment) ? __simpleStruct0 : alignment);
10595 if(_class->memberOffset % alignment)
10596 _class->memberOffset += alignment - (_class->memberOffset % alignment);
10597 }
10598 dataMember->offset = _class->memberOffset;
10599 _class->memberOffset += size;
10600 }
10601 }
10602 else
10603 {
10604 int alignment;
10605
10606 ComputeClassMembers((struct __ecereNameSpace__ecere__com__Class *)dataMember, 1);
10607 alignment = dataMember->structAlignment;
10608 if(isMember)
10609 {
10610 int __simpleStruct0;
10611
10612 if(alignment)
10613 {
10614 short __simpleStruct0;
10615
10616 if(member->memberOffset % alignment)
10617 member->memberOffset += alignment - (member->memberOffset % alignment);
10618 member->structAlignment = (__simpleStruct0 = member->structAlignment, (__simpleStruct0 > alignment) ? __simpleStruct0 : alignment);
10619 }
10620 dataMember->offset = member->memberOffset;
10621 if(member->type == 1)
10622 unionMemberOffset = (__simpleStruct0 = dataMember->memberOffset, (unionMemberOffset > __simpleStruct0) ? unionMemberOffset : __simpleStruct0);
10623 else
10624 member->memberOffset += dataMember->memberOffset;
10625 }
10626 else
10627 {
10628 if(alignment)
10629 {
10630 short __simpleStruct0;
10631
10632 if(_class->memberOffset % alignment)
10633 _class->memberOffset += alignment - (_class->memberOffset % alignment);
10634 _class->structAlignment = (__simpleStruct0 = _class->structAlignment, (__simpleStruct0 > alignment) ? __simpleStruct0 : alignment);
10635 }
10636 dataMember->offset = _class->memberOffset;
10637 _class->memberOffset += dataMember->memberOffset;
10638 }
10639 }
10640 }
10641 }
10642 if(bitFields)
10643 {
10644 int alignment = 0;
10645 int size = (bitFields + 7) / 8;
10646
10647 if(isMember)
10648 {
10649 int __simpleStruct0;
10650
10651 if(alignment)
10652 {
10653 short __simpleStruct0;
10654
10655 member->structAlignment = (__simpleStruct0 = member->structAlignment, (__simpleStruct0 > alignment) ? __simpleStruct0 : alignment);
10656 if(member->memberOffset % alignment)
10657 member->memberOffset += alignment - (member->memberOffset % alignment);
10658 }
10659 if(member->type == 1)
10660 unionMemberOffset = (__simpleStruct0 = dataMember->dataType->size, (unionMemberOffset > __simpleStruct0) ? unionMemberOffset : __simpleStruct0);
10661 else
10662 {
10663 member->memberOffset += size;
10664 }
10665 }
10666 else
10667 {
10668 if(alignment)
10669 {
10670 short __simpleStruct0;
10671
10672 _class->structAlignment = (__simpleStruct0 = _class->structAlignment, (__simpleStruct0 > alignment) ? __simpleStruct0 : alignment);
10673 if(_class->memberOffset % alignment)
10674 _class->memberOffset += alignment - (_class->memberOffset % alignment);
10675 }
10676 _class->memberOffset += size;
10677 }
10678 bitFields = 0;
10679 }
10680 }
10681 if(member && member->type == 1)
10682 {
10683 member->memberOffset = unionMemberOffset;
10684 }
10685 if(!isMember)
10686 {
10687 if(_class->type != 2)
10688 {
10689 int extra = 0;
10690
10691 if(_class->structAlignment)
10692 {
10693 if(_class->memberOffset % _class->structAlignment)
10694 extra += _class->structAlignment - (_class->memberOffset % _class->structAlignment);
10695 }
10696 _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;
10697 if(!member)
10698 {
10699 struct __ecereNameSpace__ecere__com__Property * prop;
10700
10701 for(prop = _class->membersAndProperties.first; prop; prop = prop->next)
10702 {
10703 if(prop->isProperty && prop->isWatchable)
10704 {
10705 prop->watcherOffset = _class->structSize;
10706 _class->structSize += sizeof(struct __ecereNameSpace__ecere__sys__OldList);
10707 }
10708 }
10709 }
10710 {
10711 struct __ecereNameSpace__ecere__sys__OldLink * derivative;
10712
10713 for(derivative = _class->derivatives.first; derivative; derivative = derivative->next)
10714 {
10715 struct __ecereNameSpace__ecere__com__Class * deriv = derivative->data;
10716
10717 if(deriv->computeSize)
10718 {
10719 deriv->offset = (_class->type == 5 ? _class->memberOffset : _class->structSize);
10720 deriv->memberOffset = 0;
10721 deriv->structSize = deriv->offset;
10722 ComputeClassMembers(deriv, 0);
10723 }
10724 }
10725 }
10726 }
10727 }
10728 }
10729 if(context)
10730 FinishTemplatesContext(context);
10731 }
10732
10733 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)
10734 {
10735 struct __ecereNameSpace__ecere__com__DataMember * topMember = isMember ? (struct __ecereNameSpace__ecere__com__DataMember *)_class : (((void *)0));
10736 unsigned int totalSize = 0;
10737 unsigned int maxSize = 0;
10738 int alignment;
10739 unsigned int size;
10740 struct __ecereNameSpace__ecere__com__DataMember * member;
10741 int anonID = 1;
10742 struct Context * context = isMember ? (((void *)0)) : SetupTemplatesContext(_class);
10743
10744 if(addedPadding)
10745 *addedPadding = 0;
10746 if(!isMember && _class->base)
10747 {
10748 maxSize = _class->structSize;
10749 {
10750 if(_class->type == 1 || _class->type == 5)
10751 AddMembers(neededBy, declarations, _class->base, 0, &totalSize, topClass, (((void *)0)));
10752 else
10753 {
10754 unsigned int baseSize = _class->base->templateClass ? _class->base->templateClass->structSize : _class->base->structSize;
10755
10756 if(maxSize > baseSize)
10757 maxSize -= baseSize;
10758 else
10759 maxSize = 0;
10760 }
10761 }
10762 }
10763 for(member = isMember ? topMember->members.first : _class->membersAndProperties.first; member; member = member->next)
10764 {
10765 if(!member->isProperty)
10766 {
10767 switch(member->type)
10768 {
10769 case 0:
10770 {
10771 if(member->dataTypeString)
10772 {
10773 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList(), * decls = MkList();
10774 struct Declarator * decl;
10775
10776 decl = SpecDeclFromString(member->dataTypeString, specs, MkDeclaratorIdentifier(MkIdentifier(member->name)));
10777 ListAdd(decls, MkStructDeclarator(decl, (((void *)0))));
10778 ListAdd(declarations, MkClassDefDeclaration(MkStructDeclaration(specs, decls, (((void *)0)))));
10779 if(!member->dataType)
10780 member->dataType = ProcessType(specs, decl);
10781 ReplaceThisClassSpecifiers(specs, topClass);
10782 {
10783 struct Type * type = ProcessType(specs, decl);
10784
10785 DeclareType(neededBy, member->dataType, 1, 0);
10786 FreeType(type);
10787 }
10788 ComputeTypeSize(member->dataType);
10789 size = member->dataType->size;
10790 alignment = member->dataType->alignment;
10791 if(alignment)
10792 {
10793 if(totalSize % alignment)
10794 totalSize += alignment - (totalSize % alignment);
10795 }
10796 totalSize += size;
10797 }
10798 break;
10799 }
10800 case 1:
10801 case 2:
10802 {
10803 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList(), * list = MkList();
10804 char id[100];
10805
10806 sprintf(id, "__anon%d", anonID++);
10807 size = 0;
10808 AddMembers(neededBy, list, (struct __ecereNameSpace__ecere__com__Class *)member, 1, &size, topClass, (((void *)0)));
10809 ListAdd(specs, MkStructOrUnion((member->type == 1) ? 4 : 3, (((void *)0)), list));
10810 ListAdd(declarations, MkClassDefDeclaration(MkStructDeclaration(specs, MkListOne(MkDeclaratorIdentifier(MkIdentifier(id))), (((void *)0)))));
10811 alignment = member->structAlignment;
10812 if(alignment)
10813 {
10814 if(totalSize % alignment)
10815 totalSize += alignment - (totalSize % alignment);
10816 }
10817 totalSize += size;
10818 break;
10819 }
10820 }
10821 }
10822 }
10823 if(retSize)
10824 {
10825 unsigned int __simpleStruct0;
10826
10827 if(topMember && topMember->type == 1)
10828 *retSize = (__simpleStruct0 = *retSize, (__simpleStruct0 > totalSize) ? __simpleStruct0 : totalSize);
10829 else
10830 *retSize += totalSize;
10831 }
10832 else if(totalSize < maxSize && _class->type != 1000)
10833 {
10834 int autoPadding = 0;
10835
10836 if(!isMember && _class->structAlignment && totalSize % _class->structAlignment)
10837 autoPadding = _class->structAlignment - (totalSize % _class->structAlignment);
10838 if(totalSize + autoPadding < maxSize)
10839 {
10840 char sizeString[50];
10841
10842 sprintf(sizeString, "%d", maxSize - totalSize);
10843 ListAdd(declarations, MkClassDefDeclaration(MkStructDeclaration(MkListOne(MkSpecifier(CHAR)), MkListOne(MkDeclaratorArray(MkDeclaratorIdentifier(MkIdentifier("__ecere_padding")), MkExpConstant(sizeString))), (((void *)0)))));
10844 if(addedPadding)
10845 *addedPadding = 1;
10846 }
10847 }
10848 if(context)
10849 FinishTemplatesContext(context);
10850 return topMember ? topMember->memberID : _class->memberID;
10851 }
10852
10853 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)
10854 {
10855 if(source && dest)
10856 {
10857 if(warnConst)
10858 CheckConstCompatibility(source, dest, 1);
10859 if(source->kind == 20 && dest->kind != 20)
10860 {
10861 struct Type * type = ProcessTemplateParameterType(source->__anon1.templateParameter);
10862
10863 if(type)
10864 source = type;
10865 }
10866 if(dest->kind == 20 && source->kind != 20)
10867 {
10868 struct Type * type = ProcessTemplateParameterType(dest->__anon1.templateParameter);
10869
10870 if(type)
10871 dest = type;
10872 }
10873 if(dest->classObjectType == 2 && dest->kind != 11)
10874 {
10875 if(source->classObjectType != 3)
10876 return 1;
10877 else
10878 {
10879 if((dest->__anon1._class && strcmp(dest->__anon1._class->string, "class")) || (source->__anon1._class && strcmp(source->__anon1._class->string, "class")))
10880 {
10881 return 1;
10882 }
10883 }
10884 }
10885 else
10886 {
10887 if(source->kind != 11 && source->classObjectType == 3)
10888 return 1;
10889 if(dest->kind != 11 && dest->classObjectType == 3 && source->classObjectType != 2)
10890 return 1;
10891 }
10892 if((dest->kind == 9 && source->kind == 9) || (dest->kind == 10 && source->kind == 10))
10893 {
10894 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))
10895 return 1;
10896 }
10897 if(dest->kind == 14 && source->kind != 0)
10898 return 1;
10899 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))
10900 return 1;
10901 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))
10902 return 1;
10903 if(((source->kind == 8 && dest->kind == 8) || (source->kind == 19 && dest->kind == 19)) && source->__anon1._class)
10904 {
10905 if(source->__anon1._class->__anon1.registered && source->__anon1._class->__anon1.registered->type == 3)
10906 {
10907 if(conversions != (((void *)0)))
10908 {
10909 if(source->__anon1._class->__anon1.registered == dest->__anon1._class->__anon1.registered)
10910 return 1;
10911 }
10912 else
10913 {
10914 struct __ecereNameSpace__ecere__com__Class * sourceBase, * destBase;
10915
10916 for(sourceBase = source->__anon1._class->__anon1.registered; sourceBase && sourceBase->base->type != 1000; sourceBase = sourceBase->base)
10917 ;
10918 for(destBase = dest->__anon1._class->__anon1.registered; destBase && destBase->base->type != 1000; destBase = destBase->base)
10919 ;
10920 if(sourceBase == destBase)
10921 return 1;
10922 }
10923 }
10924 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))
10925 return 1;
10926 else
10927 {
10928 if(enumBaseType && dest->__anon1._class && dest->__anon1._class->__anon1.registered && dest->__anon1._class->__anon1.registered->type == 4 && ((source->__anon1._class && source->__anon1._class->__anon1.registered && source->__anon1._class->__anon1.registered->type != 4) || source->kind == 8))
10929 {
10930 if(__ecereNameSpace__ecere__com__eClass_IsDerived(dest->__anon1._class->__anon1.registered, source->__anon1._class->__anon1.registered))
10931 {
10932 return 1;
10933 }
10934 }
10935 }
10936 }
10937 if(source->kind == 19 && dest->kind == 8 && dest->__anon1._class && !strcmp(dest->__anon1._class->string, "ecere::com::Class"))
10938 return 1;
10939 if(doConversion)
10940 {
10941 if(source->kind == 8)
10942 {
10943 struct __ecereNameSpace__ecere__com__Class * _class;
10944
10945 for(_class = source->__anon1._class ? source->__anon1._class->__anon1.registered : (((void *)0)); _class; _class = _class->base)
10946 {
10947 struct __ecereNameSpace__ecere__com__Property * convert;
10948
10949 for(convert = _class->conversions.first; convert; convert = convert->next)
10950 {
10951 if(convert->memberAccess == 1 || _class->module == privateModule)
10952 {
10953 struct Conversion * after = (conversions != (((void *)0))) ? conversions->last : (((void *)0));
10954
10955 if(!convert->dataType)
10956 convert->dataType = ProcessTypeString(convert->dataTypeString, 0);
10957 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))
10958 {
10959 if(!conversions && !convert->Get)
10960 return 1;
10961 else if(conversions != (((void *)0)))
10962 {
10963 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))
10964 return 1;
10965 else
10966 {
10967 struct Conversion * conv = (conv = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Conversion), conv->convert = convert, conv->isGet = 1, conv);
10968
10969 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert(conversions, after, conv);
10970 return 1;
10971 }
10972 }
10973 }
10974 }
10975 }
10976 }
10977 }
10978 if(dest->kind == 8)
10979 {
10980 struct __ecereNameSpace__ecere__com__Class * _class;
10981
10982 for(_class = dest->__anon1._class ? dest->__anon1._class->__anon1.registered : (((void *)0)); _class; _class = _class->base)
10983 {
10984 struct __ecereNameSpace__ecere__com__Property * convert;
10985
10986 for(convert = _class->conversions.first; convert; convert = convert->next)
10987 {
10988 if(convert->memberAccess == 1 || _class->module == privateModule)
10989 {
10990 struct Type * constType = (((void *)0));
10991 unsigned int success = 0;
10992
10993 if(!convert->dataType)
10994 convert->dataType = ProcessTypeString(convert->dataTypeString, 0);
10995 if(warnConst && convert->dataType->kind == 13 && convert->dataType->__anon1.type && dest->constant)
10996 {
10997 struct Type * ptrType = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
10998
10999 constType = __extension__ ({
11000 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
11001
11002 __ecereInstance1->kind = 13, __ecereInstance1->refCount = 1, __ecereInstance1->__anon1.type = ptrType, __ecereInstance1;
11003 });
11004 CopyTypeInto(ptrType, convert->dataType->__anon1.type);
11005 ptrType->constant = 1;
11006 }
11007 if((constType || convert->dataType != dest) && MatchTypes(source, constType ? constType : convert->dataType, conversions, (((void *)0)), (((void *)0)), 1, 0, 0, 1, warnConst))
11008 {
11009 if(!conversions && !convert->Set)
11010 success = 1;
11011 else if(conversions != (((void *)0)))
11012 {
11013 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))
11014 success = 1;
11015 else
11016 {
11017 struct Conversion * conv = (conv = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Conversion), conv->convert = convert, conv);
11018
11019 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(conversions, conv);
11020 success = 1;
11021 }
11022 }
11023 }
11024 if(constType)
11025 FreeType(constType);
11026 if(success)
11027 return 1;
11028 }
11029 }
11030 }
11031 if(enumBaseType && dest->__anon1._class && dest->__anon1._class->__anon1.registered && dest->__anon1._class->__anon1.registered->type == 4)
11032 {
11033 if(!dest->__anon1._class->__anon1.registered->dataType)
11034 dest->__anon1._class->__anon1.registered->dataType = ProcessTypeString(dest->__anon1._class->__anon1.registered->dataTypeString, 0);
11035 if(dest->__anon1._class->__anon1.registered->dataType->kind == 8 || source->truth || dest->truth)
11036 {
11037 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))
11038 {
11039 return 1;
11040 }
11041 }
11042 }
11043 }
11044 if(source->kind == 8)
11045 {
11046 struct __ecereNameSpace__ecere__com__Class * _class;
11047
11048 for(_class = source->__anon1._class ? source->__anon1._class->__anon1.registered : (((void *)0)); _class; _class = _class->base)
11049 {
11050 struct __ecereNameSpace__ecere__com__Property * convert;
11051
11052 for(convert = _class->conversions.first; convert; convert = convert->next)
11053 {
11054 if(convert->memberAccess == 1 || _class->module == privateModule)
11055 {
11056 struct Conversion * after = (conversions != (((void *)0))) ? conversions->last : (((void *)0));
11057
11058 if(!convert->dataType)
11059 convert->dataType = ProcessTypeString(convert->dataTypeString, 0);
11060 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))
11061 {
11062 if(!conversions && !convert->Get)
11063 return 1;
11064 else if(conversions != (((void *)0)))
11065 {
11066 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))
11067 return 1;
11068 else
11069 {
11070 struct Conversion * conv = (conv = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Conversion), conv->convert = convert, conv->isGet = 1, conv);
11071
11072 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert(conversions, after, conv);
11073 return 1;
11074 }
11075 }
11076 }
11077 }
11078 }
11079 }
11080 if(enumBaseType && source->__anon1._class && source->__anon1._class->__anon1.registered && source->__anon1._class->__anon1.registered->type == 4)
11081 {
11082 if(!source->__anon1._class->__anon1.registered->dataType)
11083 source->__anon1._class->__anon1.registered->dataType = ProcessTypeString(source->__anon1._class->__anon1.registered->dataTypeString, 0);
11084 if(!isConversionExploration || source->__anon1._class->__anon1.registered->dataType->kind == 8 || !strcmp(source->__anon1._class->__anon1.registered->name, "String"))
11085 {
11086 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))
11087 return 1;
11088 else if(MatchTypes(dest, source->__anon1._class->__anon1.registered->dataType, (((void *)0)), (((void *)0)), (((void *)0)), 0, 0, 0, 0, warnConst))
11089 return 1;
11090 }
11091 }
11092 }
11093 }
11094 if(source->kind == 8 || source->kind == 19)
11095 ;
11096 else if(dest->kind == source->kind && (dest->kind != 9 && dest->kind != 10 && dest->kind != 11 && dest->kind != 12 && dest->kind != 13 && dest->kind != 16))
11097 return 1;
11098 else if(dest->kind == 7 && source->kind == 6)
11099 return 1;
11100 else if(dest->kind == 2 && (source->kind == 1 || source->kind == 24))
11101 return 1;
11102 else if(dest->kind == 3 && (source->kind == 2 || source->kind == 1 || source->kind == 24 || source->kind == 23))
11103 return 1;
11104 else if(dest->kind == 4 && (source->kind == 2 || source->kind == 1 || source->kind == 24 || source->kind == 3 || source->kind == 22 || source->kind == 23))
11105 return 1;
11106 else if(dest->kind == 22 && (source->kind == 2 || source->kind == 1 || source->kind == 24 || source->kind == 3 || source->kind == 23 || source->kind == 4))
11107 return 1;
11108 else if(dest->kind == 23 && (source->kind == 2 || source->kind == 1 || source->kind == 24 || source->kind == 3 || source->kind == 4 || source->kind == 22))
11109 return 1;
11110 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))
11111 return 1;
11112 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))
11113 return 1;
11114 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)))
11115 {
11116 struct Type * paramSource, * paramDest;
11117
11118 if(dest->kind == 16)
11119 owningClassDest = dest->__anon1.__anon3.methodClass ? dest->__anon1.__anon3.methodClass : dest->__anon1.__anon3.method->_class;
11120 if(source->kind == 16)
11121 owningClassSource = source->__anon1.__anon3.methodClass ? source->__anon1.__anon3.methodClass : source->__anon1.__anon3.method->_class;
11122 if(dest->kind == 13 && dest->__anon1.type->kind == 11)
11123 dest = dest->__anon1.type;
11124 if(source->kind == 13 && source->__anon1.type->kind == 11)
11125 source = source->__anon1.type;
11126 if(dest->kind == 16)
11127 dest = dest->__anon1.__anon3.method->dataType;
11128 if(source->kind == 16)
11129 source = source->__anon1.__anon3.method->dataType;
11130 paramSource = source->__anon1.__anon2.params.first;
11131 if(paramSource && paramSource->kind == 0)
11132 paramSource = (((void *)0));
11133 paramDest = dest->__anon1.__anon2.params.first;
11134 if(paramDest && paramDest->kind == 0)
11135 paramDest = (((void *)0));
11136 if((dest->__anon1.__anon2.staticMethod || (!dest->__anon1.__anon2.thisClass && !owningClassDest)) && !(source->__anon1.__anon2.staticMethod || (!source->__anon1.__anon2.thisClass && !owningClassSource)))
11137 {
11138 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))))
11139 {
11140 if(paramDest && paramDest->kind == 8)
11141 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "method class must be derived from %s\n", (((void *)0))), paramDest->__anon1._class->string);
11142 else
11143 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "method class should not take an object\n", (((void *)0))));
11144 return 0;
11145 }
11146 paramDest = paramDest->next;
11147 }
11148 else if(!dest->__anon1.__anon2.staticMethod && (dest->__anon1.__anon2.thisClass || owningClassDest))
11149 {
11150 if((source->__anon1.__anon2.staticMethod || (!source->__anon1.__anon2.thisClass && !owningClassSource)))
11151 {
11152 if(dest->__anon1.__anon2.thisClass)
11153 {
11154 if(!paramSource || paramSource->kind != 8 || !__ecereNameSpace__ecere__com__eClass_IsDerived(paramSource->__anon1._class->__anon1.registered, dest->__anon1.__anon2.thisClass->__anon1.registered))
11155 {
11156 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "method class must be derived from %s\n", (((void *)0))), dest->__anon1.__anon2.thisClass->string);
11157 return 0;
11158 }
11159 }
11160 else
11161 {
11162 if(!paramSource || paramSource->kind != 8 || (owningClassDest && !__ecereNameSpace__ecere__com__eClass_IsDerived(paramSource->__anon1._class->__anon1.registered, owningClassDest)))
11163 {
11164 if(owningClassDest)
11165 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "%s expected to be derived from method class\n", (((void *)0))), owningClassDest->fullName);
11166 else
11167 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "overriding class expected to be derived from method class\n", (((void *)0))));
11168 return 0;
11169 }
11170 }
11171 paramSource = paramSource->next;
11172 }
11173 else
11174 {
11175 if(dest->__anon1.__anon2.thisClass)
11176 {
11177 if(!__ecereNameSpace__ecere__com__eClass_IsDerived(source->__anon1.__anon2.thisClass ? source->__anon1.__anon2.thisClass->__anon1.registered : owningClassSource, dest->__anon1.__anon2.thisClass->__anon1.registered))
11178 {
11179 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "method class must be derived from %s\n", (((void *)0))), dest->__anon1.__anon2.thisClass->string);
11180 return 0;
11181 }
11182 }
11183 else
11184 {
11185 if(source->__anon1.__anon2.thisClass && source->__anon1.__anon2.thisClass->__anon1.registered && owningClassDest && !__ecereNameSpace__ecere__com__eClass_IsDerived(source->__anon1.__anon2.thisClass->__anon1.registered, owningClassDest))
11186 {
11187 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "%s expected to be derived from method class\n", (((void *)0))), source->__anon1.__anon2.thisClass->__anon1.registered->fullName);
11188 return 0;
11189 }
11190 }
11191 }
11192 }
11193 if(!MatchTypes(source->__anon1.__anon2.returnType, dest->__anon1.__anon2.returnType, (((void *)0)), (((void *)0)), (((void *)0)), 1, 1, 0, 0, warnConst))
11194 {
11195 Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "incompatible return type for function\n", (((void *)0))));
11196 return 0;
11197 }
11198 else
11199 CheckConstCompatibility(dest->__anon1.__anon2.returnType, source->__anon1.__anon2.returnType, 1);
11200 for(; paramDest; paramDest = paramDest->next)
11201 {
11202 if(!paramSource)
11203 {
11204 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "not enough parameters\n", (((void *)0))));
11205 return 0;
11206 }
11207 {
11208 struct Type * paramDestType = paramDest;
11209 struct Type * paramSourceType = paramSource;
11210 struct Type * type = paramDestType;
11211
11212 if(paramDest->kind == 20 && paramDest->__anon1.templateParameter->type == 0 && owningClassSource && paramSource->kind != 20)
11213 {
11214 int id = 0;
11215 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * curParam = (((void *)0));
11216 struct __ecereNameSpace__ecere__com__Class * sClass;
11217
11218 for(sClass = owningClassSource; sClass; sClass = sClass->base)
11219 {
11220 id = 0;
11221 if(sClass->templateClass)
11222 sClass = sClass->templateClass;
11223 for(curParam = sClass->templateParams.first; curParam; curParam = curParam->next)
11224 {
11225 if(curParam->type == 0 && !strcmp(type->__anon1.templateParameter->identifier->string, curParam->name))
11226 {
11227 for(sClass = sClass->base; sClass; sClass = sClass->base)
11228 {
11229 if(sClass->templateClass)
11230 sClass = sClass->templateClass;
11231 id += sClass->templateParams.count;
11232 }
11233 break;
11234 }
11235 id++;
11236 }
11237 if(curParam)
11238 break;
11239 }
11240 if(curParam)
11241 {
11242 struct __ecereNameSpace__ecere__com__ClassTemplateArgument arg = owningClassSource->templateArgs[id];
11243
11244 paramDestType = type = ProcessTypeString(arg.__anon1.__anon1.dataTypeString, 0);
11245 }
11246 }
11247 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)))
11248 {
11249 char type[1024];
11250
11251 type[0] = 0;
11252 PrintType(paramDest, type, 0, 1);
11253 Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "incompatible parameter %s (expected %s)\n", (((void *)0))), paramSource->name, type);
11254 if(paramDestType != paramDest)
11255 FreeType(paramDestType);
11256 return 0;
11257 }
11258 if(paramDestType != paramDest)
11259 FreeType(paramDestType);
11260 }
11261 paramSource = paramSource->next;
11262 }
11263 if(paramSource)
11264 {
11265 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "too many parameters\n", (((void *)0))));
11266 return 0;
11267 }
11268 return 1;
11269 }
11270 else if((dest->kind == 11 || (dest->kind == 13 && dest->__anon1.type->kind == 11) || dest->kind == 16) && (source->kind == 13 && source->__anon1.type->kind == 0))
11271 {
11272 return 1;
11273 }
11274 else if((dest->kind == 13 || dest->kind == 12) && (source->kind == 12 || source->kind == 13))
11275 {
11276 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))
11277 {
11278 ComputeTypeSize(source->__anon1.type);
11279 ComputeTypeSize(dest->__anon1.type);
11280 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))
11281 return 1;
11282 }
11283 }
11284 }
11285 return 0;
11286 }
11287
11288 void ComputeInstantiation(struct Expression * exp)
11289 {
11290 struct Instantiation * inst = exp->__anon1.instance;
11291 struct MembersInit * members;
11292 struct Symbol * classSym = inst->_class ? inst->_class->__anon1.__anon1.symbol : (((void *)0));
11293 struct __ecereNameSpace__ecere__com__Class * _class = classSym ? classSym->__anon1.registered : (((void *)0));
11294 struct __ecereNameSpace__ecere__com__DataMember * curMember = (((void *)0));
11295 struct __ecereNameSpace__ecere__com__Class * curClass = (((void *)0));
11296 struct __ecereNameSpace__ecere__com__DataMember * subMemberStack[256];
11297 int subMemberStackPos = 0;
11298 uint64 bits = 0;
11299
11300 if(_class && (_class->type == 1 || _class->type == 0 || _class->type == 5))
11301 {
11302 if(inst->data)
11303 return ;
11304 if(_class->type == 0 || _class->type == 5)
11305 {
11306 inst->data = (unsigned char *)__ecereNameSpace__ecere__com__eInstance_New(_class);
11307 if(_class->type == 0)
11308 ((struct __ecereNameSpace__ecere__com__Instance *)(char *)((struct __ecereNameSpace__ecere__com__Instance *)inst->data))->_refCount++;
11309 }
11310 else
11311 inst->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize));
11312 }
11313 if(inst->members)
11314 {
11315 for(members = (*inst->members).first; members; members = members->next)
11316 {
11317 switch(members->type)
11318 {
11319 case 0:
11320 {
11321 if(members->__anon1.dataMembers)
11322 {
11323 struct MemberInit * member;
11324
11325 for(member = (*members->__anon1.dataMembers).first; member; member = member->next)
11326 {
11327 struct Identifier * ident = member->identifiers ? (*member->identifiers).first : (((void *)0));
11328 unsigned int found = 0;
11329 struct __ecereNameSpace__ecere__com__Property * prop = (((void *)0));
11330 struct __ecereNameSpace__ecere__com__DataMember * dataMember = (((void *)0));
11331 unsigned int dataMemberOffset;
11332
11333 if(!ident)
11334 {
11335 __ecereNameSpace__ecere__com__eClass_FindNextMember(_class, &curClass, &curMember, subMemberStack, &subMemberStackPos);
11336 if(curMember)
11337 {
11338 if(curMember->isProperty)
11339 prop = (struct __ecereNameSpace__ecere__com__Property *)curMember;
11340 else
11341 {
11342 dataMember = curMember;
11343 __ecereNameSpace__ecere__com__eClass_FindDataMemberAndOffset(_class, dataMember->name, &dataMemberOffset, privateModule, (((void *)0)), (((void *)0)));
11344 if(_class->type == 0)
11345 dataMemberOffset += _class->base->structSize;
11346 }
11347 found = 1;
11348 }
11349 }
11350 else
11351 {
11352 prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, ident->string, privateModule);
11353 if(prop)
11354 {
11355 found = 1;
11356 if(prop->memberAccess == 1)
11357 {
11358 curMember = (struct __ecereNameSpace__ecere__com__DataMember *)prop;
11359 curClass = prop->_class;
11360 }
11361 }
11362 else
11363 {
11364 struct __ecereNameSpace__ecere__com__DataMember * _subMemberStack[256];
11365 int _subMemberStackPos = 0;
11366
11367 dataMember = __ecereNameSpace__ecere__com__eClass_FindDataMemberAndOffset(_class, ident->string, &dataMemberOffset, privateModule, _subMemberStack, &_subMemberStackPos);
11368 if(dataMember)
11369 {
11370 found = 1;
11371 if(dataMember->memberAccess == 1)
11372 {
11373 curMember = dataMember;
11374 curClass = dataMember->_class;
11375 memcpy(subMemberStack, _subMemberStack, sizeof(struct __ecereNameSpace__ecere__com__DataMember *) * _subMemberStackPos);
11376 subMemberStackPos = _subMemberStackPos;
11377 }
11378 }
11379 }
11380 }
11381 if(found && member->initializer && member->initializer->type == 0)
11382 {
11383 struct Expression * value = member->initializer->__anon1.exp;
11384 struct Type * type = (((void *)0));
11385 unsigned int deepMember = 0;
11386
11387 if(prop)
11388 {
11389 type = prop->dataType;
11390 }
11391 else if(dataMember)
11392 {
11393 if(!dataMember->dataType)
11394 dataMember->dataType = ProcessTypeString(dataMember->dataTypeString, 0);
11395 type = dataMember->dataType;
11396 }
11397 if(ident && ident->next)
11398 {
11399 deepMember = 1;
11400 for(ident = ident->next; ident && type; ident = ident->next)
11401 {
11402 if(type->kind == 8)
11403 {
11404 prop = __ecereNameSpace__ecere__com__eClass_FindProperty(type->__anon1._class->__anon1.registered, ident->string, privateModule);
11405 if(prop)
11406 type = prop->dataType;
11407 else
11408 {
11409 dataMember = __ecereNameSpace__ecere__com__eClass_FindDataMemberAndOffset(type->__anon1._class->__anon1.registered, ident->string, &dataMemberOffset, privateModule, (((void *)0)), (((void *)0)));
11410 if(dataMember)
11411 type = dataMember->dataType;
11412 }
11413 }
11414 else if(type->kind == 9 || type->kind == 10)
11415 {
11416 struct Type * memberType;
11417
11418 for(memberType = type->__anon1.__anon1.members.first; memberType; memberType = memberType->next)
11419 {
11420 if(!strcmp(memberType->name, ident->string))
11421 {
11422 type = memberType;
11423 break;
11424 }
11425 }
11426 }
11427 }
11428 }
11429 if(value)
11430 {
11431 FreeType(value->destType);
11432 value->destType = type;
11433 if(type)
11434 type->refCount++;
11435 ComputeExpression(value);
11436 }
11437 if(!deepMember && type && value && (_class->type == 1 || _class->type == 0 || _class->type == 5))
11438 {
11439 if(type->kind == 8)
11440 {
11441 struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class->__anon1.registered;
11442
11443 if(_class && (_class->type == 2 || _class->type == 3 || _class->type == 4))
11444 {
11445 if(!_class->dataType)
11446 _class->dataType = ProcessTypeString(_class->dataTypeString, 0);
11447 type = _class->dataType;
11448 }
11449 }
11450 if(dataMember)
11451 {
11452 void * ptr = inst->data + dataMemberOffset;
11453
11454 if(value->type == 2)
11455 {
11456 switch(type->kind)
11457 {
11458 case 3:
11459 {
11460 GetInt(value, (int *)ptr);
11461 break;
11462 }
11463 case 4:
11464 {
11465 GetInt64(value, (long long *)ptr);
11466 break;
11467 }
11468 case 22:
11469 {
11470 GetIntPtr(value, (intptr_t *)ptr);
11471 break;
11472 }
11473 case 23:
11474 {
11475 GetIntSize(value, (ssize_t *)ptr);
11476 break;
11477 }
11478 case 6:
11479 {
11480 GetFloat(value, (float *)ptr);
11481 break;
11482 }
11483 case 7:
11484 {
11485 GetDouble(value, (double *)ptr);
11486 break;
11487 }
11488 }
11489 }
11490 else if(value->type == 1)
11491 {
11492 if(type->kind == 8)
11493 {
11494 struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class->__anon1.registered;
11495
11496 if(_class->type == 1)
11497 {
11498 ComputeTypeSize(type);
11499 if(value->__anon1.instance->data)
11500 memcpy(ptr, value->__anon1.instance->data, type->size);
11501 }
11502 }
11503 }
11504 }
11505 else if(prop && prop->Set != (void *)(intptr_t)1)
11506 {
11507 if(value->type == 1 && value->__anon1.instance->data)
11508 {
11509 if(type->kind == 8)
11510 {
11511 struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class->__anon1.registered;
11512
11513 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)))
11514 {
11515 void (* Set)(void *, void *) = (void *)prop->Set;
11516
11517 Set(inst->data, value->__anon1.instance->data);
11518 PopulateInstance(inst);
11519 }
11520 }
11521 }
11522 else if(value->type == 2)
11523 {
11524 switch(type->kind)
11525 {
11526 case 7:
11527 {
11528 void (* Set)(void *, double) = (void *)prop->Set;
11529
11530 Set(inst->data, strtod(value->__anon1.__anon1.constant, (((void *)0))));
11531 break;
11532 }
11533 case 6:
11534 {
11535 void (* Set)(void *, float) = (void *)prop->Set;
11536
11537 Set(inst->data, (float)(strtod(value->__anon1.__anon1.constant, (((void *)0)))));
11538 break;
11539 }
11540 case 3:
11541 {
11542 void (* Set)(void *, int) = (void *)prop->Set;
11543
11544 Set(inst->data, strtol(value->__anon1.__anon1.constant, (((void *)0)), 0));
11545 break;
11546 }
11547 case 4:
11548 {
11549 void (* Set)(void *, long long) = (void *)prop->Set;
11550
11551 Set(inst->data, __ecereNameSpace__ecere__com___strtoi64(value->__anon1.__anon1.constant, (((void *)0)), 0));
11552 break;
11553 }
11554 case 22:
11555 {
11556 void (* Set)(void *, intptr_t) = (void *)prop->Set;
11557
11558 Set(inst->data, (intptr_t)__ecereNameSpace__ecere__com___strtoi64(value->__anon1.__anon1.constant, (((void *)0)), 0));
11559 break;
11560 }
11561 case 23:
11562 {
11563 void (* Set)(void *, ssize_t) = (void *)prop->Set;
11564
11565 Set(inst->data, (ssize_t)__ecereNameSpace__ecere__com___strtoi64(value->__anon1.__anon1.constant, (((void *)0)), 0));
11566 break;
11567 }
11568 }
11569 }
11570 else if(value->type == 3)
11571 {
11572 char temp[1024];
11573
11574 ReadString(temp, value->__anon1.__anon2.string);
11575 ((void (*)(void *, void *))(void *)prop->Set)(inst->data, temp);
11576 }
11577 }
11578 }
11579 else if(!deepMember && type && _class->type == 3)
11580 {
11581 if(prop)
11582 {
11583 if(value->type == 2)
11584 {
11585 if(type->kind == 8)
11586 {
11587 struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class->__anon1.registered;
11588
11589 if(_class->type == 3)
11590 {
11591 if(!_class->dataType)
11592 _class->dataType = ProcessTypeString(_class->dataTypeString, 0);
11593 type = _class->dataType;
11594 }
11595 }
11596 switch(type->kind)
11597 {
11598 case 6:
11599 {
11600 float fValue;
11601 float (* Set)(float) = (void *)prop->Set;
11602
11603 GetFloat(member->initializer->__anon1.exp, &fValue);
11604 exp->__anon1.__anon1.constant = PrintFloat(Set(fValue));
11605 exp->type = 2;
11606 break;
11607 }
11608 case 7:
11609 {
11610 double dValue;
11611 double (* Set)(double) = (void *)prop->Set;
11612
11613 GetDouble(member->initializer->__anon1.exp, &dValue);
11614 exp->__anon1.__anon1.constant = PrintDouble(Set(dValue));
11615 exp->type = 2;
11616 break;
11617 }
11618 }
11619 }
11620 }
11621 }
11622 else if(!deepMember && type && _class->type == 2)
11623 {
11624 if(prop)
11625 {
11626 if(value->type == 1 && value->__anon1.instance->data)
11627 {
11628 unsigned int (* Set)(void *) = (void *)prop->Set;
11629
11630 bits = Set(value->__anon1.instance->data);
11631 }
11632 else if(value->type == 2)
11633 {
11634 }
11635 }
11636 else if(dataMember)
11637 {
11638 struct __ecereNameSpace__ecere__com__BitMember * bitMember = (struct __ecereNameSpace__ecere__com__BitMember *)dataMember;
11639 struct Type * type;
11640 uint64 part = 0;
11641
11642 bits = (bits & ~bitMember->mask);
11643 if(!bitMember->dataType)
11644 bitMember->dataType = ProcessTypeString(bitMember->dataTypeString, 0);
11645 type = bitMember->dataType;
11646 if(type->kind == 8 && type->__anon1._class && type->__anon1._class->__anon1.registered)
11647 {
11648 if(!type->__anon1._class->__anon1.registered->dataType)
11649 type->__anon1._class->__anon1.registered->dataType = ProcessTypeString(type->__anon1._class->__anon1.registered->dataTypeString, 0);
11650 type = type->__anon1._class->__anon1.registered->dataType;
11651 }
11652 switch(type->kind)
11653 {
11654 case 24:
11655 case 1:
11656 {
11657 unsigned char v;
11658
11659 type->isSigned ? GetChar(value, (char *)&v) : GetUChar(value, &v);
11660 part = (uint64)v;
11661 break;
11662 }
11663 case 2:
11664 {
11665 unsigned short v;
11666
11667 type->isSigned ? GetShort(value, (short *)&v) : GetUShort(value, &v);
11668 part = (uint64)v;
11669 break;
11670 }
11671 case 3:
11672 case 5:
11673 {
11674 unsigned int v;
11675
11676 type->isSigned ? GetInt(value, (int *)&v) : GetUInt(value, &v);
11677 part = (uint64)v;
11678 break;
11679 }
11680 case 4:
11681 {
11682 uint64 v;
11683
11684 type->isSigned ? GetInt64(value, (long long *)&v) : GetUInt64(value, &v);
11685 part = v;
11686 break;
11687 }
11688 case 22:
11689 {
11690 uintptr_t v;
11691
11692 type->isSigned ? GetIntPtr(value, (intptr_t *)&v) : GetUIntPtr(value, &v);
11693 part = (uint64)v;
11694 break;
11695 }
11696 case 23:
11697 {
11698 size_t v;
11699
11700 type->isSigned ? GetIntSize(value, (ssize_t *)&v) : GetUIntSize(value, &v);
11701 part = (uint64)v;
11702 break;
11703 }
11704 }
11705 bits |= part << bitMember->pos;
11706 }
11707 }
11708 }
11709 else
11710 {
11711 if(_class && _class->type == 3)
11712 {
11713 ComputeExpression(member->initializer->__anon1.exp);
11714 exp->__anon1.__anon1.constant = member->initializer->__anon1.exp->__anon1.__anon1.constant;
11715 exp->type = 2;
11716 member->initializer->__anon1.exp->__anon1.__anon1.constant = (((void *)0));
11717 }
11718 }
11719 }
11720 }
11721 break;
11722 }
11723 }
11724 }
11725 }
11726 if(_class && _class->type == 2)
11727 {
11728 exp->__anon1.__anon1.constant = PrintHexUInt(bits);
11729 exp->type = 2;
11730 }
11731 if(exp->type != 1)
11732 {
11733 FreeInstance(inst);
11734 }
11735 }
11736
11737 void CallOperator(struct Expression * exp, struct Expression * exp1, struct Expression * exp2, struct Operand * op1, struct Operand * op2)
11738 {
11739 if(exp->__anon1.op.op == SIZEOF)
11740 {
11741 FreeExpContents(exp);
11742 exp->type = 2;
11743 exp->__anon1.__anon1.constant = PrintUInt(ComputeTypeSize(op1->type));
11744 }
11745 else
11746 {
11747 if(!exp->__anon1.op.exp1)
11748 {
11749 switch(exp->__anon1.op.op)
11750 {
11751 case '+':
11752 {
11753 struct Expression * exp2 = exp->__anon1.op.exp2;
11754
11755 exp->__anon1.op.exp2 = (((void *)0));
11756 FreeExpContents(exp);
11757 FreeType(exp->expType);
11758 FreeType(exp->destType);
11759 *exp = *exp2;
11760 ((exp2 ? (__ecereClass_Expression->Destructor ? __ecereClass_Expression->Destructor((void *)exp2) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(exp2)) : 0), exp2 = 0);
11761 break;
11762 }
11763 case '-':
11764 if(op1->ops.Neg)
11765 {
11766 FreeExpContents(exp);
11767 op1->ops.Neg(exp, op1);
11768 }
11769 break;
11770 case '~':
11771 if(op1->ops.BitNot)
11772 {
11773 FreeExpContents(exp);
11774 op1->ops.BitNot(exp, op1);
11775 }
11776 break;
11777 case '!':
11778 if(op1->ops.Not)
11779 {
11780 FreeExpContents(exp);
11781 op1->ops.Not(exp, op1);
11782 }
11783 break;
11784 }
11785 }
11786 else
11787 {
11788 if(op1 && op2 && op1->type && op2->type && op1->kind != op2->kind)
11789 {
11790 if(Promote(op2, op1->kind, op1->type->isSigned))
11791 op2->kind = op1->kind, op2->ops = op1->ops;
11792 else if(Promote(op1, op2->kind, op2->type->isSigned))
11793 op1->kind = op2->kind, op1->ops = op2->ops;
11794 }
11795 switch(exp->__anon1.op.op)
11796 {
11797 case '+':
11798 if(op1->ops.Add)
11799 {
11800 FreeExpContents(exp);
11801 op1->ops.Add(exp, op1, op2);
11802 }
11803 break;
11804 case '-':
11805 if(op1->ops.Sub)
11806 {
11807 FreeExpContents(exp);
11808 op1->ops.Sub(exp, op1, op2);
11809 }
11810 break;
11811 case '*':
11812 if(op1->ops.Mul)
11813 {
11814 FreeExpContents(exp);
11815 op1->ops.Mul(exp, op1, op2);
11816 }
11817 break;
11818 case '/':
11819 if(op1->ops.Div)
11820 {
11821 FreeExpContents(exp);
11822 op1->ops.Div(exp, op1, op2);
11823 }
11824 break;
11825 case '%':
11826 if(op1->ops.Mod)
11827 {
11828 FreeExpContents(exp);
11829 op1->ops.Mod(exp, op1, op2);
11830 }
11831 break;
11832 case '&':
11833 if(exp->__anon1.op.exp2)
11834 {
11835 if(op1->ops.BitAnd)
11836 {
11837 FreeExpContents(exp);
11838 op1->ops.BitAnd(exp, op1, op2);
11839 }
11840 }
11841 break;
11842 case '|':
11843 if(op1->ops.BitOr)
11844 {
11845 FreeExpContents(exp);
11846 op1->ops.BitOr(exp, op1, op2);
11847 }
11848 break;
11849 case '^':
11850 if(op1->ops.BitXor)
11851 {
11852 FreeExpContents(exp);
11853 op1->ops.BitXor(exp, op1, op2);
11854 }
11855 break;
11856 case LEFT_OP:
11857 if(op1->ops.LShift)
11858 {
11859 FreeExpContents(exp);
11860 op1->ops.LShift(exp, op1, op2);
11861 }
11862 break;
11863 case RIGHT_OP:
11864 if(op1->ops.RShift)
11865 {
11866 FreeExpContents(exp);
11867 op1->ops.RShift(exp, op1, op2);
11868 }
11869 break;
11870 case EQ_OP:
11871 if(op1->ops.Equ)
11872 {
11873 FreeExpContents(exp);
11874 op1->ops.Equ(exp, op1, op2);
11875 }
11876 break;
11877 case NE_OP:
11878 if(op1->ops.Nqu)
11879 {
11880 FreeExpContents(exp);
11881 op1->ops.Nqu(exp, op1, op2);
11882 }
11883 break;
11884 case AND_OP:
11885 if(op1->ops.And)
11886 {
11887 FreeExpContents(exp);
11888 op1->ops.And(exp, op1, op2);
11889 }
11890 break;
11891 case OR_OP:
11892 if(op1->ops.Or)
11893 {
11894 FreeExpContents(exp);
11895 op1->ops.Or(exp, op1, op2);
11896 }
11897 break;
11898 case '>':
11899 if(op1->ops.Grt)
11900 {
11901 FreeExpContents(exp);
11902 op1->ops.Grt(exp, op1, op2);
11903 }
11904 break;
11905 case '<':
11906 if(op1->ops.Sma)
11907 {
11908 FreeExpContents(exp);
11909 op1->ops.Sma(exp, op1, op2);
11910 }
11911 break;
11912 case GE_OP:
11913 if(op1->ops.GrtEqu)
11914 {
11915 FreeExpContents(exp);
11916 op1->ops.GrtEqu(exp, op1, op2);
11917 }
11918 break;
11919 case LE_OP:
11920 if(op1->ops.SmaEqu)
11921 {
11922 FreeExpContents(exp);
11923 op1->ops.SmaEqu(exp, op1, op2);
11924 }
11925 break;
11926 }
11927 }
11928 }
11929 }
11930
11931 void ApplyAnyObjectLogic(struct Expression * e)
11932 {
11933 struct Type * destType = e->destType;
11934
11935 if(destType && (destType->classObjectType == 3))
11936 {
11937 if(e && e->expType)
11938 {
11939 struct Type * type = e->expType;
11940 struct __ecereNameSpace__ecere__com__Class * _class = (((void *)0));
11941
11942 if(type->kind == 8 && type->__anon1._class && type->__anon1._class->__anon1.registered)
11943 {
11944 _class = type->__anon1._class->__anon1.registered;
11945 }
11946 else if(type->kind == 19)
11947 {
11948 _class = FindClass("ecere::com::Class")->__anon1.registered;
11949 }
11950 else
11951 {
11952 char string[1024] = "";
11953 struct Symbol * classSym;
11954
11955 PrintTypeNoConst(type, string, 0, 1);
11956 classSym = FindClass(string);
11957 if(classSym)
11958 _class = classSym->__anon1.registered;
11959 }
11960 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)))
11961 {
11962 if(!_class || strcmp(_class->fullName, "char *"))
11963 {
11964 struct Expression * checkedExp = e, * newExp;
11965
11966 while(((checkedExp->type == 5 || checkedExp->type == 32 || checkedExp->type == 23) && checkedExp->__anon1.list) || checkedExp->type == 11)
11967 {
11968 if(checkedExp->type == 5 || checkedExp->type == 32 || checkedExp->type == 23)
11969 {
11970 if(checkedExp->type == 23)
11971 {
11972 checkedExp = (*((struct Statement *)(*checkedExp->__anon1.compound->__anon1.compound.statements).last)->__anon1.expressions).last;
11973 }
11974 else
11975 checkedExp = (*checkedExp->__anon1.list).last;
11976 }
11977 else if(checkedExp->type == 11)
11978 checkedExp = checkedExp->__anon1.cast.exp;
11979 }
11980 if(checkedExp && checkedExp->type == 4 && checkedExp->__anon1.op.op == '*' && !checkedExp->__anon1.op.exp1)
11981 {
11982 newExp = checkedExp->__anon1.op.exp2;
11983 checkedExp->__anon1.op.exp2 = (((void *)0));
11984 FreeExpContents(checkedExp);
11985 if(e->expType && e->expType->passAsTemplate)
11986 {
11987 char size[100];
11988
11989 ComputeTypeSize(e->expType);
11990 sprintf(size, "%d", e->expType->size);
11991 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))))));
11992 }
11993 ReplaceExpContents(checkedExp, newExp);
11994 e->byReference = 1;
11995 }
11996 else if(!e->byReference || (_class && _class->type == 5))
11997 {
11998 struct Expression * checkedExp;
11999
12000 {
12001 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;
12002
12003 if(_class && _class->type != 5 && _class->type != 0 && _class->type != 1 && !hasAddress)
12004 {
12005 struct Context * context = PushContext();
12006 struct Declarator * decl;
12007 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
12008 char typeString[1024];
12009 struct Expression * newExp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression);
12010
12011 typeString[0] = '\0';
12012 *newExp = *e;
12013 newExp->prev = (((void *)0));
12014 newExp->next = (((void *)0));
12015 newExp->expType = (((void *)0));
12016 PrintTypeNoConst(e->expType, typeString, 0, 1);
12017 decl = SpecDeclFromString(typeString, specs, (((void *)0)));
12018 newExp->destType = ProcessType(specs, decl);
12019 curContext = context;
12020 if(curCompound)
12021 {
12022 char name[100];
12023 struct __ecereNameSpace__ecere__sys__OldList * stmts = MkList();
12024
12025 e->type = 23;
12026 sprintf(name, "__internalValue%03X", internalValueCounter++);
12027 if(!curCompound->__anon1.compound.declarations)
12028 curCompound->__anon1.compound.declarations = MkList();
12029 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*curCompound->__anon1.compound.declarations), (((void *)0)), MkDeclaration(specs, MkListOne(MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier(name)), (((void *)0))))));
12030 ListAdd(stmts, MkExpressionStmt(MkListOne(MkExpOp(MkExpIdentifier(MkIdentifier(name)), '=', newExp))));
12031 ListAdd(stmts, MkExpressionStmt(MkListOne(MkExpIdentifier(MkIdentifier(name)))));
12032 e->__anon1.compound = MkCompoundStmt((((void *)0)), stmts);
12033 }
12034 else
12035 printf("libec: compiler error, curCompound is null in ApplyAnyObjectLogic\n");
12036 {
12037 struct Type * type = e->destType;
12038
12039 e->destType = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
12040 CopyTypeInto(e->destType, type);
12041 e->destType->refCount = 1;
12042 e->destType->classObjectType = 0;
12043 FreeType(type);
12044 }
12045 e->__anon1.compound->__anon1.compound.context = context;
12046 PopContext(context);
12047 curContext = context->parent;
12048 }
12049 }
12050 checkedExp = e;
12051 while(((checkedExp->type == 5 || checkedExp->type == 32 || checkedExp->type == 23) && checkedExp->__anon1.list) || checkedExp->type == 11)
12052 {
12053 if(checkedExp->type == 5 || checkedExp->type == 32 || checkedExp->type == 23)
12054 {
12055 if(checkedExp->type == 23)
12056 {
12057 checkedExp = (*((struct Statement *)(*checkedExp->__anon1.compound->__anon1.compound.statements).last)->__anon1.expressions).last;
12058 }
12059 else
12060 checkedExp = (*checkedExp->__anon1.list).last;
12061 }
12062 else if(checkedExp->type == 11)
12063 checkedExp = checkedExp->__anon1.cast.exp;
12064 }
12065 {
12066 struct Expression * operand = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression);
12067
12068 *operand = *checkedExp;
12069 __ecereMethod_Expression_Clear(checkedExp);
12070 checkedExp->destType = ProcessTypeString("void *", 0);
12071 checkedExp->expType = checkedExp->destType;
12072 checkedExp->destType->refCount++;
12073 checkedExp->type = 4;
12074 checkedExp->__anon1.op.op = '&';
12075 checkedExp->__anon1.op.exp1 = (((void *)0));
12076 checkedExp->__anon1.op.exp2 = operand;
12077 }
12078 }
12079 }
12080 }
12081 }
12082 }
12083 {
12084 }
12085 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))))
12086 {
12087 if(e->expType->classObjectType && destType && destType->classObjectType)
12088 {
12089 return ;
12090 }
12091 else
12092 {
12093 struct Expression * thisExp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression);
12094
12095 *thisExp = *e;
12096 thisExp->prev = (((void *)0));
12097 thisExp->next = (((void *)0));
12098 __ecereMethod_Expression_Clear(e);
12099 e->type = 5;
12100 e->__anon1.list = MkListOne(MkExpOp((((void *)0)), '*', thisExp->type == 0 ? thisExp : MkExpBrackets(MkListOne(thisExp))));
12101 if(thisExp->expType->kind == 8 && thisExp->expType->__anon1._class && thisExp->expType->__anon1._class->__anon1.registered && thisExp->expType->__anon1._class->__anon1.registered->type == 5)
12102 ((struct Expression *)(*e->__anon1.list).first)->byReference = 1;
12103 {
12104 e->expType = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
12105 CopyTypeInto(e->expType, thisExp->expType);
12106 e->expType->byReference = 0;
12107 e->expType->refCount = 1;
12108 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))
12109 {
12110 e->expType->classObjectType = 0;
12111 }
12112 }
12113 }
12114 }
12115 else if(destType && e->expType && (e->expType->classObjectType == 3 || e->expType->classObjectType == 2) && !destType->classObjectType && destType->kind != 0)
12116 {
12117 if(destType->kind == 14)
12118 {
12119 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Unspecified type\n", (((void *)0))));
12120 }
12121 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))
12122 {
12123 unsigned int byReference = e->expType->byReference;
12124 struct Expression * thisExp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression);
12125 struct Declarator * decl;
12126 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
12127 char typeString[1024];
12128 struct Type * type;
12129 int backupClassObjectType;
12130 unsigned int backupByReference;
12131
12132 if(e->expType->kind == 8 && e->expType->__anon1._class && e->expType->__anon1._class->__anon1.registered && strcmp(e->expType->__anon1._class->__anon1.registered->name, "class"))
12133 type = e->expType;
12134 else
12135 type = destType;
12136 backupClassObjectType = type->classObjectType;
12137 backupByReference = type->byReference;
12138 type->classObjectType = 0;
12139 type->byReference = 0;
12140 typeString[0] = '\0';
12141 PrintType(type, typeString, 0, 1);
12142 decl = SpecDeclFromString(typeString, specs, (((void *)0)));
12143 type->classObjectType = backupClassObjectType;
12144 type->byReference = backupByReference;
12145 *thisExp = *e;
12146 thisExp->prev = (((void *)0));
12147 thisExp->next = (((void *)0));
12148 __ecereMethod_Expression_Clear(e);
12149 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)))
12150 {
12151 unsigned int passAsTemplate = thisExp->destType->passAsTemplate;
12152 struct Type * t;
12153
12154 destType->refCount++;
12155 e->type = 4;
12156 e->__anon1.op.op = '*';
12157 e->__anon1.op.exp1 = (((void *)0));
12158 e->__anon1.op.exp2 = MkExpCast(MkTypeName(specs, MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), decl)), thisExp);
12159 t = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
12160 CopyTypeInto(t, thisExp->destType);
12161 t->passAsTemplate = 0;
12162 FreeType(thisExp->destType);
12163 thisExp->destType = t;
12164 t = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
12165 CopyTypeInto(t, destType);
12166 t->passAsTemplate = passAsTemplate;
12167 FreeType(destType);
12168 destType = t;
12169 destType->refCount = 0;
12170 e->expType = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
12171 CopyTypeInto(e->expType, type);
12172 if(type->passAsTemplate)
12173 {
12174 e->expType->classObjectType = 0;
12175 e->expType->passAsTemplate = 0;
12176 }
12177 e->expType->byReference = 0;
12178 e->expType->refCount = 1;
12179 }
12180 else
12181 {
12182 e->type = 11;
12183 e->__anon1.cast.typeName = MkTypeName(specs, decl);
12184 e->__anon1.cast.exp = thisExp;
12185 e->byReference = 1;
12186 e->expType = type;
12187 type->refCount++;
12188 }
12189 if(e->destType)
12190 FreeType(e->destType);
12191 e->destType = destType;
12192 destType->refCount++;
12193 }
12194 }
12195 }
12196
12197 void ComputeModuleClasses(struct __ecereNameSpace__ecere__com__Instance * module)
12198 {
12199 struct __ecereNameSpace__ecere__com__Class * _class;
12200 struct __ecereNameSpace__ecere__sys__OldLink * subModule;
12201
12202 for(subModule = ((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->modules.first; subModule; subModule = subModule->next)
12203 ComputeModuleClasses(subModule->data);
12204 for(_class = ((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->classes.first; _class; _class = _class->next)
12205 ComputeClassMembers(_class, 0);
12206 }
12207
12208 int ComputeTypeSize(struct Type * type)
12209 {
12210 unsigned int size = type ? type->size : 0;
12211
12212 if(!size && type && !type->computing)
12213 {
12214 type->computing = 1;
12215 switch(type->kind)
12216 {
12217 case 24:
12218 type->alignment = size = sizeof(char);
12219 break;
12220 case 1:
12221 type->alignment = size = sizeof(char);
12222 break;
12223 case 3:
12224 type->alignment = size = sizeof(int);
12225 break;
12226 case 4:
12227 type->alignment = size = sizeof(long long);
12228 break;
12229 case 22:
12230 type->alignment = size = targetBits / 8;
12231 type->pointerAlignment = 1;
12232 break;
12233 case 23:
12234 type->alignment = size = targetBits / 8;
12235 type->pointerAlignment = 1;
12236 break;
12237 case 5:
12238 type->alignment = size = sizeof(long);
12239 break;
12240 case 2:
12241 type->alignment = size = sizeof(short);
12242 break;
12243 case 6:
12244 type->alignment = size = sizeof(float);
12245 break;
12246 case 7:
12247 type->alignment = size = sizeof(double);
12248 break;
12249 case 8:
12250 {
12251 struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class ? type->__anon1._class->__anon1.registered : (((void *)0));
12252
12253 if(_class && _class->type == 1)
12254 {
12255 ComputeClassMembers(_class, 0);
12256 type->alignment = _class->structAlignment;
12257 type->pointerAlignment = (unsigned int)_class->pointerAlignment;
12258 size = _class->structSize;
12259 if(type->alignment && size % type->alignment)
12260 size += type->alignment - (size % type->alignment);
12261 }
12262 else if(_class && (_class->type == 3 || _class->type == 4 || _class->type == 2))
12263 {
12264 if(!_class->dataType)
12265 _class->dataType = ProcessTypeString(_class->dataTypeString, 0);
12266 size = type->alignment = ComputeTypeSize(_class->dataType);
12267 }
12268 else
12269 {
12270 size = type->alignment = targetBits / 8;
12271 type->pointerAlignment = 1;
12272 }
12273 break;
12274 }
12275 case 13:
12276 case 19:
12277 size = type->alignment = targetBits / 8;
12278 type->pointerAlignment = 1;
12279 break;
12280 case 12:
12281 if(type->__anon1.__anon4.arraySizeExp)
12282 {
12283 ProcessExpressionType(type->__anon1.__anon4.arraySizeExp);
12284 ComputeExpression(type->__anon1.__anon4.arraySizeExp);
12285 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)))
12286 {
12287 struct Location oldLoc = yylloc;
12288 char expression[10240];
12289
12290 expression[0] = '\0';
12291 type->__anon1.__anon4.arraySizeExp->expType = (((void *)0));
12292 yylloc = type->__anon1.__anon4.arraySizeExp->loc;
12293 if(inCompiler)
12294 PrintExpression(type->__anon1.__anon4.arraySizeExp, expression);
12295 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Array size not constant int (%s)\n", (((void *)0))), expression);
12296 yylloc = oldLoc;
12297 }
12298 GetInt(type->__anon1.__anon4.arraySizeExp, &type->__anon1.__anon4.arraySize);
12299 }
12300 else if(type->__anon1.__anon4.enumClass)
12301 {
12302 if(type->__anon1.__anon4.enumClass && type->__anon1.__anon4.enumClass->__anon1.registered && type->__anon1.__anon4.enumClass->__anon1.registered->type == 4)
12303 {
12304 type->__anon1.__anon4.arraySize = (int)__ecereNameSpace__ecere__com__eClass_GetProperty(type->__anon1.__anon4.enumClass->__anon1.registered, "enumSize");
12305 }
12306 else
12307 type->__anon1.__anon4.arraySize = 0;
12308 }
12309 else
12310 {
12311 type->__anon1.__anon4.arraySize = 0;
12312 }
12313 size = ComputeTypeSize(type->__anon1.type) * type->__anon1.__anon4.arraySize;
12314 if(type->__anon1.type)
12315 {
12316 type->alignment = type->__anon1.type->alignment;
12317 type->pointerAlignment = type->__anon1.type->pointerAlignment;
12318 }
12319 break;
12320 case 9:
12321 {
12322 if(!type->__anon1.__anon1.members.first && type->__anon1.__anon1.enumName)
12323 {
12324 struct Symbol * symbol = FindStruct(curContext, type->__anon1.__anon1.enumName);
12325
12326 if(symbol && symbol->type)
12327 {
12328 ComputeTypeSize(symbol->type);
12329 size = symbol->type->size;
12330 }
12331 }
12332 else
12333 {
12334 struct Type * member;
12335
12336 for(member = type->__anon1.__anon1.members.first; member; member = member->next)
12337 {
12338 int __simpleStruct0, __simpleStruct1;
12339 unsigned int addSize = ComputeTypeSize(member);
12340
12341 member->offset = size;
12342 if(member->alignment && size % member->alignment)
12343 member->offset += member->alignment - (size % member->alignment);
12344 size = member->offset;
12345 if(member->pointerAlignment && type->size <= 4)
12346 type->pointerAlignment = 1;
12347 else if(!member->pointerAlignment && member->alignment >= 8)
12348 type->pointerAlignment = 0;
12349 type->alignment = (__simpleStruct0 = type->alignment, __simpleStruct1 = member->alignment, (__simpleStruct0 > __simpleStruct1) ? __simpleStruct0 : __simpleStruct1);
12350 size += addSize;
12351 }
12352 if(type->alignment && size % type->alignment)
12353 size += type->alignment - (size % type->alignment);
12354 }
12355 break;
12356 }
12357 case 10:
12358 {
12359 if(!type->__anon1.__anon1.members.first && type->__anon1.__anon1.enumName)
12360 {
12361 struct Symbol * symbol = FindStruct(curContext, type->__anon1.__anon1.enumName);
12362
12363 if(symbol && symbol->type)
12364 {
12365 ComputeTypeSize(symbol->type);
12366 size = symbol->type->size;
12367 type->alignment = symbol->type->alignment;
12368 }
12369 }
12370 else
12371 {
12372 struct Type * member;
12373
12374 for(member = type->__anon1.__anon1.members.first; member; member = member->next)
12375 {
12376 int __simpleStruct0, __simpleStruct1;
12377 unsigned int addSize = ComputeTypeSize(member);
12378
12379 member->offset = size;
12380 if(member->alignment && size % member->alignment)
12381 member->offset += member->alignment - (size % member->alignment);
12382 size = member->offset;
12383 if(member->pointerAlignment && type->size <= 4)
12384 type->pointerAlignment = 1;
12385 else if(!member->pointerAlignment && member->alignment >= 8)
12386 type->pointerAlignment = 0;
12387 type->alignment = (__simpleStruct0 = type->alignment, __simpleStruct1 = member->alignment, (__simpleStruct0 > __simpleStruct1) ? __simpleStruct0 : __simpleStruct1);
12388 size = ((size > addSize) ? size : addSize);
12389 }
12390 if(type->alignment && size % type->alignment)
12391 size += type->alignment - (size % type->alignment);
12392 }
12393 break;
12394 }
12395 case 20:
12396 {
12397 struct TemplateParameter * param = type->__anon1.templateParameter;
12398 struct Type * baseType = ProcessTemplateParameterType(param);
12399
12400 if(baseType)
12401 {
12402 size = ComputeTypeSize(baseType);
12403 type->alignment = baseType->alignment;
12404 type->pointerAlignment = baseType->pointerAlignment;
12405 }
12406 else
12407 type->alignment = size = sizeof(uint64);
12408 break;
12409 }
12410 case 15:
12411 {
12412 type->alignment = size = sizeof(enum
12413 {
12414 test
12415 });
12416 break;
12417 }
12418 case 21:
12419 {
12420 type->alignment = size = targetBits / 8;
12421 type->pointerAlignment = 1;
12422 break;
12423 }
12424 }
12425 type->size = size;
12426 type->computing = 0;
12427 }
12428 return size;
12429 }
12430
12431 struct External * _DeclareStruct(struct External * neededBy, const char * name, unsigned int skipNoHead, unsigned int needDereference, unsigned int fwdDecl)
12432 {
12433 struct External * external = (((void *)0));
12434 struct Symbol * classSym = FindClass(name);
12435 struct __ecereNameSpace__ecere__sys__OldList * curDeclarations = (((void *)0));
12436
12437 if(!inCompiler || !classSym)
12438 return (((void *)0));
12439 if(classSym->__anon1.registered && (classSym->__anon1.registered->type == 2 || classSym->__anon1.registered->type == 3 || classSym->__anon1.registered->type == 4))
12440 return (((void *)0));
12441 if(!classSym->__anon1.registered || (classSym->__anon1.registered->type == 0 && classSym->__anon1.registered->structSize && classSym->__anon1.registered->base && classSym->__anon1.registered->base->base))
12442 _DeclareStruct(neededBy, "ecere::com::Instance", 0, 1, fwdDecl);
12443 external = classSym->__anon2.__anon1.structExternal;
12444 if(external && external->__anon1.declaration)
12445 {
12446 struct Specifier * spec;
12447
12448 for(spec = external->__anon1.declaration->__anon1.__anon1.specifiers ? (*external->__anon1.declaration->__anon1.__anon1.specifiers).first : (((void *)0)); spec; spec = spec->next)
12449 if(spec->type == 3 || spec->type == 4)
12450 {
12451 curDeclarations = spec->__anon1.__anon2.definitions;
12452 break;
12453 }
12454 }
12455 if(classSym->__anon1.registered && !classSym->declaring && classSym->imported && (!classSym->declaredStructSym || (classSym->__anon1.registered->type == 5 && !skipNoHead && external && !curDeclarations)))
12456 {
12457 struct __ecereNameSpace__ecere__sys__OldList * specifiers, * declarators;
12458 struct __ecereNameSpace__ecere__sys__OldList * declarations = (((void *)0));
12459 char structName[1024];
12460 unsigned int addedPadding = 0;
12461 struct Specifier * curSpec = (((void *)0));
12462
12463 classSym->declaring++;
12464 if(strchr(classSym->string, '<'))
12465 {
12466 if(classSym->__anon1.registered->templateClass)
12467 external = _DeclareStruct(neededBy, classSym->__anon1.registered->templateClass->fullName, skipNoHead, needDereference, fwdDecl);
12468 classSym->declaring--;
12469 return external;
12470 }
12471 structName[0] = 0;
12472 FullClassNameCat(structName, name, 0);
12473 classSym->declaredStructSym = 1;
12474 if(!external || (classSym->__anon1.registered->type == 5 && !skipNoHead && !curDeclarations))
12475 {
12476 unsigned int add = 0;
12477
12478 if(!external)
12479 {
12480 external = MkExternalDeclaration((((void *)0)));
12481 classSym->__anon2.__anon1.structExternal = external;
12482 external->symbol = classSym;
12483 add = 1;
12484 }
12485 if(!skipNoHead)
12486 {
12487 declarations = MkList();
12488 AddMembers(external, declarations, classSym->__anon1.registered, 0, (((void *)0)), classSym->__anon1.registered, &addedPadding);
12489 }
12490 if(external->__anon1.declaration)
12491 {
12492 struct Specifier * spec;
12493
12494 for(spec = external->__anon1.declaration->__anon1.__anon1.specifiers ? (*external->__anon1.declaration->__anon1.__anon1.specifiers).first : (((void *)0)); spec; spec = spec->next)
12495 if(spec->type == 3 || spec->type == 4)
12496 {
12497 curSpec = spec;
12498 curDeclarations = spec->__anon1.__anon2.definitions;
12499 break;
12500 }
12501 }
12502 if(declarations && (!(*declarations).count || ((*declarations).count == 1 && addedPadding)))
12503 {
12504 FreeList(declarations, (void *)(FreeClassDef));
12505 declarations = (((void *)0));
12506 }
12507 if(classSym->__anon1.registered->type != 5 && !declarations)
12508 {
12509 FreeExternal(external);
12510 external = (((void *)0));
12511 classSym->__anon2.__anon1.structExternal = (((void *)0));
12512 }
12513 else
12514 {
12515 if(curSpec)
12516 curSpec->__anon1.__anon2.definitions = declarations;
12517 else
12518 {
12519 specifiers = MkList();
12520 declarators = MkList();
12521 ListAdd(specifiers, MkStructOrUnion(3, MkIdentifier(structName), declarations));
12522 external->__anon1.declaration = MkDeclaration(specifiers, declarators);
12523 }
12524 if(add)
12525 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add((&*ast), external);
12526 }
12527 }
12528 classSym->declaring--;
12529 }
12530 else if(!classSym->declaredStructSym && classSym->__anon2.__anon1.structExternal)
12531 {
12532 classSym->declaredStructSym = 1;
12533 if(classSym->__anon1.registered)
12534 DeclareMembers(classSym->__anon2.__anon1.structExternal, classSym->__anon1.registered, 0);
12535 if(classSym->__anon2.__anon1.structExternal->__anon1.declaration && classSym->__anon2.__anon1.structExternal->__anon1.declaration->__anon1.__anon1.specifiers)
12536 {
12537 struct Specifier * spec;
12538
12539 for(spec = (*classSym->__anon2.__anon1.structExternal->__anon1.declaration->__anon1.__anon1.specifiers).first; spec; spec = spec->next)
12540 {
12541 if(spec->__anon1.__anon2.definitions)
12542 IdentifyAnonStructs(spec->__anon1.__anon2.definitions);
12543 }
12544 }
12545 }
12546 if(inCompiler && neededBy && (external || !classSym->imported))
12547 {
12548 if(!external)
12549 {
12550 classSym->__anon2.__anon1.structExternal = external = MkExternalDeclaration((((void *)0)));
12551 external->symbol = classSym;
12552 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add((&*ast), external);
12553 }
12554 if(reachedPass15 && !external->__anon1.declaration && classSym->__anon1.registered && classSym->__anon1.registered->type == 5)
12555 {
12556 char structName[1024];
12557 struct __ecereNameSpace__ecere__sys__OldList * specifiers, * declarators;
12558
12559 structName[0] = 0;
12560 FullClassNameCat(structName, name, 0);
12561 specifiers = MkList();
12562 declarators = MkList();
12563 ListAdd(specifiers, MkStructOrUnion(3, MkIdentifier(structName), (((void *)0))));
12564 external->__anon1.declaration = MkDeclaration(specifiers, declarators);
12565 }
12566 if(fwdDecl)
12567 {
12568 struct External * e = external->fwdDecl ? external->fwdDecl : external;
12569
12570 if(((struct __ecereNameSpace__ecere__com__LinkList *)(((char *)e->incoming + 0 + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->count)
12571 __ecereMethod_External_CreateUniqueEdge(neededBy, e, !needDereference && !external->fwdDecl);
12572 }
12573 else
12574 __ecereMethod_External_CreateUniqueEdge(neededBy, external, !needDereference);
12575 }
12576 return external;
12577 }
12578
12579 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)
12580 {
12581 struct Identifier * ident = member->identifiers ? (*member->identifiers).first : (((void *)0));
12582 unsigned int found = 0;
12583 struct __ecereNameSpace__ecere__com__DataMember * dataMember = (((void *)0));
12584 struct __ecereNameSpace__ecere__com__Method * method = (((void *)0));
12585 unsigned int freeType = 0;
12586
12587 yylloc = member->loc;
12588 if(!ident)
12589 {
12590 if(curMember)
12591 {
12592 __ecereNameSpace__ecere__com__eClass_FindNextMember(_class, curClass, curMember, subMemberStack, subMemberStackPos);
12593 if(*curMember)
12594 {
12595 found = 1;
12596 dataMember = *curMember;
12597 }
12598 }
12599 }
12600 else
12601 {
12602 struct __ecereNameSpace__ecere__com__DataMember * thisMember = (struct __ecereNameSpace__ecere__com__DataMember *)__ecereNameSpace__ecere__com__eClass_FindProperty(_class, ident->string, privateModule);
12603 struct __ecereNameSpace__ecere__com__DataMember * _subMemberStack[256];
12604 int _subMemberStackPos = 0;
12605
12606 if(!thisMember)
12607 thisMember = __ecereNameSpace__ecere__com__eClass_FindDataMember(_class, ident->string, privateModule, _subMemberStack, &_subMemberStackPos);
12608 if(thisMember)
12609 {
12610 dataMember = thisMember;
12611 if(curMember && thisMember->memberAccess == 1)
12612 {
12613 *curMember = thisMember;
12614 *curClass = thisMember->_class;
12615 memcpy(subMemberStack, _subMemberStack, sizeof(struct __ecereNameSpace__ecere__com__DataMember *) * _subMemberStackPos);
12616 *subMemberStackPos = _subMemberStackPos;
12617 }
12618 found = 1;
12619 }
12620 else
12621 {
12622 method = __ecereNameSpace__ecere__com__eClass_FindMethod(_class, ident->string, privateModule);
12623 if(method && method->type == 1)
12624 found = 1;
12625 else
12626 method = (((void *)0));
12627 }
12628 }
12629 if(found)
12630 {
12631 struct Type * type = (((void *)0));
12632
12633 if(dataMember)
12634 {
12635 if(!dataMember->dataType && dataMember->dataTypeString)
12636 {
12637 struct Context * context = SetupTemplatesContext(_class);
12638
12639 dataMember->dataType = ProcessTypeString(dataMember->dataTypeString, 0);
12640 FinishTemplatesContext(context);
12641 }
12642 type = dataMember->dataType;
12643 }
12644 else if(method)
12645 {
12646 if(!method->dataType)
12647 ProcessMethodType(method);
12648 type = method->dataType;
12649 }
12650 if(ident && ident->next)
12651 {
12652 for(ident = ident->next; ident && type; ident = ident->next)
12653 {
12654 if(type->kind == 8)
12655 {
12656 dataMember = (struct __ecereNameSpace__ecere__com__DataMember *)__ecereNameSpace__ecere__com__eClass_FindProperty(type->__anon1._class->__anon1.registered, ident->string, privateModule);
12657 if(!dataMember)
12658 dataMember = __ecereNameSpace__ecere__com__eClass_FindDataMember(type->__anon1._class->__anon1.registered, ident->string, privateModule, (((void *)0)), (((void *)0)));
12659 if(dataMember)
12660 type = dataMember->dataType;
12661 }
12662 else if(type->kind == 9 || type->kind == 10)
12663 {
12664 struct Type * memberType;
12665
12666 for(memberType = type->__anon1.__anon1.members.first; memberType; memberType = memberType->next)
12667 {
12668 if(!strcmp(memberType->name, ident->string))
12669 {
12670 type = memberType;
12671 break;
12672 }
12673 }
12674 }
12675 }
12676 }
12677 if(type && type->kind == 20 && type->__anon1.templateParameter->type == 0 && _class->templateArgs)
12678 {
12679 int id = 0;
12680 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * curParam = (((void *)0));
12681 struct __ecereNameSpace__ecere__com__Class * sClass;
12682
12683 for(sClass = _class; sClass; sClass = sClass->base)
12684 {
12685 id = 0;
12686 if(sClass->templateClass)
12687 sClass = sClass->templateClass;
12688 for(curParam = sClass->templateParams.first; curParam; curParam = curParam->next)
12689 {
12690 if(curParam->type == 0 && !strcmp(type->__anon1.templateParameter->identifier->string, curParam->name))
12691 {
12692 for(sClass = sClass->base; sClass; sClass = sClass->base)
12693 {
12694 if(sClass->templateClass)
12695 sClass = sClass->templateClass;
12696 id += sClass->templateParams.count;
12697 }
12698 break;
12699 }
12700 id++;
12701 }
12702 if(curParam)
12703 break;
12704 }
12705 if(curParam)
12706 {
12707 struct __ecereNameSpace__ecere__com__ClassTemplateArgument arg = _class->templateArgs[id];
12708
12709 if(arg.__anon1.__anon1.dataTypeString)
12710 {
12711 unsigned int constant = type->constant;
12712
12713 type = ProcessTypeString(arg.__anon1.__anon1.dataTypeString, 0);
12714 if(type->kind == 8 && constant)
12715 type->constant = 1;
12716 else if(type->kind == 13)
12717 {
12718 struct Type * t = type->__anon1.type;
12719
12720 while(t->kind == 13)
12721 t = t->__anon1.type;
12722 if(constant)
12723 t->constant = constant;
12724 }
12725 freeType = 1;
12726 if(type && _class->templateClass)
12727 type->passAsTemplate = 1;
12728 if(type)
12729 {
12730 }
12731 }
12732 }
12733 }
12734 if(type && type->kind == 8 && type->__anon1._class && type->__anon1._class->__anon1.registered && strchr(type->__anon1._class->__anon1.registered->fullName, '<'))
12735 {
12736 struct __ecereNameSpace__ecere__com__Class * expClass = type->__anon1._class->__anon1.registered;
12737 struct __ecereNameSpace__ecere__com__Class * cClass = (((void *)0));
12738 int paramCount = 0;
12739 int lastParam = -1;
12740 char templateString[1024];
12741 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * param;
12742
12743 sprintf(templateString, "%s<", expClass->templateClass->fullName);
12744 for(cClass = expClass; cClass; cClass = cClass->base)
12745 {
12746 int p = 0;
12747
12748 if(cClass->templateClass)
12749 cClass = cClass->templateClass;
12750 for(param = cClass->templateParams.first; param; param = param->next)
12751 {
12752 int id = p;
12753 struct __ecereNameSpace__ecere__com__Class * sClass;
12754 struct __ecereNameSpace__ecere__com__ClassTemplateArgument arg;
12755
12756 for(sClass = cClass->base; sClass; sClass = sClass->base)
12757 {
12758 if(sClass->templateClass)
12759 sClass = sClass->templateClass;
12760 id += sClass->templateParams.count;
12761 }
12762 arg = expClass->templateArgs[id];
12763 for(sClass = _class; sClass; sClass = sClass->base)
12764 {
12765 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * cParam;
12766 int p = 0;
12767 struct __ecereNameSpace__ecere__com__Class * nextClass;
12768
12769 if(sClass->templateClass)
12770 sClass = sClass->templateClass;
12771 for(nextClass = sClass->base; nextClass; nextClass = nextClass->base)
12772 {
12773 if(nextClass->templateClass)
12774 nextClass = nextClass->templateClass;
12775 p += nextClass->templateParams.count;
12776 }
12777 for(cParam = sClass->templateParams.first; cParam; cParam = cParam->next, p++)
12778 {
12779 if(cParam->type == 0 && arg.__anon1.__anon1.dataTypeString && !strcmp(cParam->name, arg.__anon1.__anon1.dataTypeString))
12780 {
12781 if(_class->templateArgs && arg.__anon1.__anon1.dataTypeString && (!param->defaultArg.__anon1.__anon1.dataTypeString || strcmp(arg.__anon1.__anon1.dataTypeString, param->defaultArg.__anon1.__anon1.dataTypeString)))
12782 {
12783 arg.__anon1.__anon1.dataTypeString = _class->templateArgs[p].__anon1.__anon1.dataTypeString;
12784 arg.__anon1.__anon1.dataTypeClass = _class->templateArgs[p].__anon1.__anon1.dataTypeClass;
12785 break;
12786 }
12787 }
12788 }
12789 }
12790 {
12791 char argument[256];
12792
12793 argument[0] = '\0';
12794 switch(param->type)
12795 {
12796 case 2:
12797 {
12798 char expString[1024];
12799 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
12800 struct Declarator * decl = SpecDeclFromString(param->__anon1.dataTypeString, specs, (((void *)0)));
12801 struct Expression * exp;
12802 char * string = PrintHexUInt64(arg.__anon1.expression.__anon1.ui64);
12803
12804 exp = MkExpCast(MkTypeName(specs, decl), MkExpConstant(string));
12805 (__ecereNameSpace__ecere__com__eSystem_Delete(string), string = 0);
12806 ProcessExpressionType(exp);
12807 ComputeExpression(exp);
12808 expString[0] = '\0';
12809 PrintExpression(exp, expString);
12810 strcat(argument, expString);
12811 FreeExpression(exp);
12812 break;
12813 }
12814 case 1:
12815 {
12816 strcat(argument, arg.__anon1.__anon2.__anon1.member->name);
12817 break;
12818 }
12819 case 0:
12820 {
12821 if(arg.__anon1.__anon1.dataTypeString && (!param->defaultArg.__anon1.__anon1.dataTypeString || strcmp(arg.__anon1.__anon1.dataTypeString, param->defaultArg.__anon1.__anon1.dataTypeString)))
12822 strcat(argument, arg.__anon1.__anon1.dataTypeString);
12823 break;
12824 }
12825 }
12826 if(argument[0])
12827 {
12828 if(paramCount)
12829 strcat(templateString, ", ");
12830 if(lastParam != p - 1)
12831 {
12832 strcat(templateString, param->name);
12833 strcat(templateString, " = ");
12834 }
12835 strcat(templateString, argument);
12836 paramCount++;
12837 lastParam = p;
12838 }
12839 p++;
12840 }
12841 }
12842 }
12843 {
12844 int len = strlen(templateString);
12845
12846 if(templateString[len - 1] == '<')
12847 len--;
12848 else
12849 {
12850 if(templateString[len - 1] == '>')
12851 templateString[len++] = ' ';
12852 templateString[len++] = '>';
12853 }
12854 templateString[len++] = '\0';
12855 }
12856 {
12857 struct Context * context = SetupTemplatesContext(_class);
12858
12859 if(freeType)
12860 FreeType(type);
12861 type = ProcessTypeString(templateString, 0);
12862 freeType = 1;
12863 FinishTemplatesContext(context);
12864 }
12865 }
12866 if(method && member->initializer && member->initializer->type == 0 && member->initializer->__anon1.exp)
12867 {
12868 ProcessExpressionType(member->initializer->__anon1.exp);
12869 if(!member->initializer->__anon1.exp->expType)
12870 {
12871 if(inCompiler)
12872 {
12873 char expString[10240];
12874
12875 expString[0] = '\0';
12876 PrintExpression(member->initializer->__anon1.exp, expString);
12877 __ecereNameSpace__ecere__sys__ChangeCh(expString, '\n', ' ');
12878 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "unresolved symbol used as an instance method %s\n", (((void *)0))), expString);
12879 }
12880 }
12881 else if(!MatchTypes(member->initializer->__anon1.exp->expType, type, (((void *)0)), (((void *)0)), _class, 1, 1, 0, 0, 1))
12882 {
12883 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "incompatible instance method %s\n", (((void *)0))), ident->string);
12884 }
12885 }
12886 else if(member->initializer)
12887 {
12888 ProcessInitializer(member->initializer, type);
12889 }
12890 if(freeType)
12891 FreeType(type);
12892 }
12893 else
12894 {
12895 if(_class && _class->type == 3)
12896 {
12897 if(member->initializer)
12898 {
12899 struct Type * type = MkClassType(_class->fullName);
12900
12901 ProcessInitializer(member->initializer, type);
12902 FreeType(type);
12903 }
12904 }
12905 else
12906 {
12907 if(member->initializer)
12908 {
12909 ProcessInitializer(member->initializer, (((void *)0)));
12910 }
12911 if(ident)
12912 {
12913 if(method)
12914 {
12915 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "couldn't find virtual method %s in class %s\n", (((void *)0))), ident->string, _class->fullName);
12916 }
12917 else if(_class)
12918 {
12919 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "couldn't find member %s in class %s\n", (((void *)0))), ident->string, _class->fullName);
12920 if(inCompiler)
12921 __ecereNameSpace__ecere__com__eClass_AddDataMember(_class, ident->string, "int", 0, 0, 1);
12922 }
12923 }
12924 else if(_class)
12925 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "too many initializers for instantiation of class %s\n", (((void *)0))), _class->fullName);
12926 }
12927 }
12928 }
12929
12930 unsigned int MatchWithEnums_NameSpace(struct __ecereNameSpace__ecere__com__NameSpace * nameSpace, struct Expression * sourceExp, struct Type * dest, char * string, struct __ecereNameSpace__ecere__sys__OldList * conversions)
12931 {
12932 struct __ecereNameSpace__ecere__com__BTNamedLink * link;
12933
12934 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)))
12935 {
12936 struct __ecereNameSpace__ecere__com__Class * _class = link->data;
12937
12938 if(_class->type == 4)
12939 {
12940 struct __ecereNameSpace__ecere__sys__OldList converts =
12941 {
12942 0, 0, 0, 0, 0
12943 };
12944 struct Type * type = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
12945
12946 type->kind = 8;
12947 if(!_class->symbol)
12948 _class->symbol = FindClass(_class->fullName);
12949 type->__anon1._class = _class->symbol;
12950 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))
12951 {
12952 struct __ecereNameSpace__ecere__sys__NamedLink64 * value;
12953 struct __ecereNameSpace__ecere__com__Class * enumClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "enum");
12954
12955 if(enumClass)
12956 {
12957 struct __ecereNameSpace__ecere__com__Class * baseClass;
12958
12959 for(baseClass = _class; baseClass && baseClass->type == 4; baseClass = baseClass->base)
12960 {
12961 struct __ecereNameSpace__ecere__com__EnumClassData * e = (baseClass ? ((void *)(((char *)baseClass->data) + enumClass->offsetClass)) : (((void *)0)));
12962
12963 for(value = e->values.first; value; value = value->next)
12964 {
12965 if(!strcmp(value->name, string))
12966 break;
12967 }
12968 if(value)
12969 {
12970 FreeType(sourceExp->expType);
12971 sourceExp->isConstant = 1;
12972 sourceExp->expType = MkClassType(baseClass->fullName);
12973 if(inCompiler || inPreCompiler || inDebugger)
12974 {
12975 char constant[256];
12976
12977 FreeExpContents(sourceExp);
12978 sourceExp->type = 2;
12979 if(!strcmp(baseClass->dataTypeString, "int") || !strcmp(baseClass->dataTypeString, "int64") || !strcmp(baseClass->dataTypeString, "short") || !strcmp(baseClass->dataTypeString, "char"))
12980 sprintf(constant, ((__runtimePlatform == 1) ? "%I64d" : "%lld"), value->data);
12981 else
12982 sprintf(constant, ((__runtimePlatform == 1) ? "0x%I64XLL" : "0x%llXLL"), value->data);
12983 sourceExp->__anon1.__anon1.constant = __ecereNameSpace__ecere__sys__CopyString(constant);
12984 }
12985 while(converts.first)
12986 {
12987 struct Conversion * convert = converts.first;
12988
12989 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove(&converts, convert);
12990 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(conversions, convert);
12991 }
12992 ((type ? (__ecereClass_Type->Destructor ? __ecereClass_Type->Destructor((void *)type) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(type)) : 0), type = 0);
12993 return 1;
12994 }
12995 }
12996 }
12997 }
12998 if(converts.first)
12999 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Free(&converts, (void *)(FreeConvert));
13000 ((type ? (__ecereClass_Type->Destructor ? __ecereClass_Type->Destructor((void *)type) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(type)) : 0), type = 0);
13001 }
13002 }
13003 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)))
13004 if(MatchWithEnums_NameSpace(nameSpace, sourceExp, dest, string, conversions))
13005 return 1;
13006 return 0;
13007 }
13008
13009 void ComputeExpression(struct Expression * exp)
13010 {
13011 switch(exp->type)
13012 {
13013 case 0:
13014 {
13015 struct Identifier * id = exp->__anon1.__anon1.identifier;
13016
13017 if(id && exp->isConstant && !inCompiler && !inPreCompiler && !inDebugger)
13018 {
13019 struct __ecereNameSpace__ecere__com__Class * c = (exp->expType && exp->expType->kind == 8 && exp->expType->__anon1._class) ? exp->expType->__anon1._class->__anon1.registered : (((void *)0));
13020
13021 if(c && c->type == 4)
13022 {
13023 struct __ecereNameSpace__ecere__com__Class * enumClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "enum");
13024
13025 if(enumClass)
13026 {
13027 struct __ecereNameSpace__ecere__sys__NamedLink64 * value;
13028 struct __ecereNameSpace__ecere__com__EnumClassData * e = (c ? ((void *)(((char *)c->data) + enumClass->offsetClass)) : (((void *)0)));
13029
13030 for(value = e->values.first; value; value = value->next)
13031 {
13032 if(!strcmp(value->name, id->string))
13033 break;
13034 }
13035 if(value)
13036 {
13037 const char * dts = c->dataTypeString;
13038
13039 FreeExpContents(exp);
13040 exp->type = 2;
13041 exp->__anon1.__anon1.constant = (dts && (!strcmp(dts, "int") || !strcmp(dts, "int64") || !strcmp(dts, "short") || !strcmp(dts, "char"))) ? PrintInt64(value->data) : PrintUInt64(value->data);
13042 }
13043 }
13044 }
13045 }
13046 break;
13047 }
13048 case 1:
13049 {
13050 ComputeInstantiation(exp);
13051 break;
13052 }
13053 case 4:
13054 {
13055 struct Expression * exp1, * exp2 = (((void *)0));
13056 struct Operand op1 =
13057 {
13058 0, 0, 0,
13059 .__anon1 = {
13060 .c = 0
13061 },
13062 {
13063 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
13064 }
13065 };
13066 struct Operand op2 =
13067 {
13068 0, 0, 0,
13069 .__anon1 = {
13070 .c = 0
13071 },
13072 {
13073 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
13074 }
13075 };
13076
13077 if(exp->__anon1.op.exp2)
13078 {
13079 struct Expression * e = exp->__anon1.op.exp2;
13080
13081 while((e->type == 5 || e->type == 32 || e->type == 23) && e->__anon1.list)
13082 {
13083 if(e->type == 5 || e->type == 32 || e->type == 23)
13084 {
13085 if(e->type == 23)
13086 e = (*((struct Statement *)(*e->__anon1.compound->__anon1.compound.statements).last)->__anon1.expressions).last;
13087 else
13088 e = (*e->__anon1.list).last;
13089 }
13090 }
13091 if(exp->__anon1.op.op == 261 && e && e->expType)
13092 {
13093 if(e->type == 3 && e->__anon1.__anon2.string)
13094 {
13095 char * string = e->__anon1.__anon2.string;
13096 int len = strlen(string);
13097 char * tmp = __ecereNameSpace__ecere__com__eSystem_New(sizeof(char) * (len - 2 + 1));
13098
13099 len = UnescapeString(tmp, string + 1, len - 2);
13100 (__ecereNameSpace__ecere__com__eSystem_Delete(tmp), tmp = 0);
13101 FreeExpContents(exp);
13102 exp->type = 2;
13103 exp->__anon1.__anon1.constant = PrintUInt(len + 1);
13104 }
13105 else
13106 {
13107 struct Type * type = e->expType;
13108
13109 type->refCount++;
13110 FreeExpContents(exp);
13111 exp->type = 2;
13112 exp->__anon1.__anon1.constant = PrintUInt(ComputeTypeSize(type));
13113 FreeType(type);
13114 }
13115 break;
13116 }
13117 else
13118 ComputeExpression(exp->__anon1.op.exp2);
13119 }
13120 if(exp->__anon1.op.exp1)
13121 {
13122 ComputeExpression(exp->__anon1.op.exp1);
13123 exp1 = exp->__anon1.op.exp1;
13124 exp2 = exp->__anon1.op.exp2;
13125 op1 = GetOperand(exp1);
13126 if(op1.type)
13127 op1.type->refCount++;
13128 if(exp2)
13129 {
13130 op2 = GetOperand(exp2);
13131 if(op2.type)
13132 op2.type->refCount++;
13133 }
13134 }
13135 else
13136 {
13137 exp1 = exp->__anon1.op.exp2;
13138 op1 = GetOperand(exp1);
13139 if(op1.type)
13140 op1.type->refCount++;
13141 }
13142 CallOperator(exp, exp1, exp2, &op1, &op2);
13143 if(op1.type)
13144 FreeType(op1.type);
13145 if(op2.type)
13146 FreeType(op2.type);
13147 break;
13148 }
13149 case 5:
13150 case 32:
13151 {
13152 struct Expression * e, * n;
13153
13154 for(e = (*exp->__anon1.list).first; e; e = n)
13155 {
13156 n = e->next;
13157 if(!n)
13158 {
13159 struct __ecereNameSpace__ecere__sys__OldList * list = exp->__anon1.list;
13160 struct Expression * prev = exp->prev;
13161 struct Expression * next = exp->next;
13162
13163 ComputeExpression(e);
13164 FreeType(exp->expType);
13165 FreeType(exp->destType);
13166 *exp = *e;
13167 exp->prev = prev;
13168 exp->next = next;
13169 ((e ? (__ecereClass_Expression->Destructor ? __ecereClass_Expression->Destructor((void *)e) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(e)) : 0), e = 0);
13170 (__ecereNameSpace__ecere__com__eSystem_Delete(list), list = 0);
13171 }
13172 else
13173 {
13174 FreeExpression(e);
13175 }
13176 }
13177 break;
13178 }
13179 case 8:
13180 {
13181 struct Expression * memberExp = exp->__anon1.member.exp;
13182 struct Identifier * memberID = exp->__anon1.member.member;
13183 struct Type * type;
13184
13185 ComputeExpression(exp->__anon1.member.exp);
13186 type = exp->__anon1.member.exp->expType;
13187 if(type)
13188 {
13189 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)));
13190 struct __ecereNameSpace__ecere__com__Property * prop = (((void *)0));
13191 struct __ecereNameSpace__ecere__com__DataMember * member = (((void *)0));
13192 struct __ecereNameSpace__ecere__com__Class * convertTo = (((void *)0));
13193
13194 if(type->kind == 19 && exp->__anon1.member.exp->type == 24)
13195 _class = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "ecere::com::Class");
13196 if(!_class)
13197 {
13198 char string[256];
13199 struct Symbol * classSym;
13200
13201 string[0] = '\0';
13202 PrintTypeNoConst(type, string, 0, 1);
13203 classSym = FindClass(string);
13204 _class = classSym ? classSym->__anon1.registered : (((void *)0));
13205 }
13206 if(exp->__anon1.member.member)
13207 {
13208 prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, exp->__anon1.member.member->string, privateModule);
13209 if(!prop)
13210 member = __ecereNameSpace__ecere__com__eClass_FindDataMember(_class, exp->__anon1.member.member->string, privateModule, (((void *)0)), (((void *)0)));
13211 }
13212 if(!prop && !member && _class && exp->__anon1.member.member)
13213 {
13214 struct Symbol * classSym = FindClass(exp->__anon1.member.member->string);
13215
13216 convertTo = _class;
13217 _class = classSym ? classSym->__anon1.registered : (((void *)0));
13218 prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, convertTo->fullName, privateModule);
13219 }
13220 if(prop)
13221 {
13222 if(prop->compiled)
13223 {
13224 struct Type * type = prop->dataType;
13225
13226 if(_class->type == 3)
13227 {
13228 if(type->kind == 8)
13229 {
13230 struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class->__anon1.registered;
13231
13232 if(_class->type == 3)
13233 {
13234 if(!_class->dataType)
13235 _class->dataType = ProcessTypeString(_class->dataTypeString, 0);
13236 type = _class->dataType;
13237 }
13238 }
13239 switch(type->kind)
13240 {
13241 case 6:
13242 {
13243 float value;
13244 float (* Get)(float) = (void *)prop->Get;
13245
13246 GetFloat(exp->__anon1.member.exp, &value);
13247 exp->__anon1.__anon1.constant = PrintFloat(Get ? Get(value) : value);
13248 exp->type = 2;
13249 break;
13250 }
13251 case 7:
13252 {
13253 double value;
13254 double (* Get)(double);
13255
13256 GetDouble(exp->__anon1.member.exp, &value);
13257 if(convertTo)
13258 Get = (void *)prop->Set;
13259 else
13260 Get = (void *)prop->Get;
13261 exp->__anon1.__anon1.constant = PrintDouble(Get ? Get(value) : value);
13262 exp->type = 2;
13263 break;
13264 }
13265 }
13266 }
13267 else
13268 {
13269 if(convertTo)
13270 {
13271 struct Expression * value = exp->__anon1.member.exp;
13272 struct Type * type;
13273
13274 if(!prop->dataType)
13275 ProcessPropertyType(prop);
13276 type = prop->dataType;
13277 if(!type)
13278 {
13279 }
13280 else if(_class->type == 1)
13281 {
13282 switch(type->kind)
13283 {
13284 case 8:
13285 {
13286 struct __ecereNameSpace__ecere__com__Class * propertyClass = type->__anon1._class->__anon1.registered;
13287
13288 if(propertyClass->type == 1 && value->type == 1)
13289 {
13290 void (* Set)(void *, void *) = (void *)prop->Set;
13291
13292 exp->__anon1.instance = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Instantiation);
13293 exp->__anon1.instance->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize));
13294 exp->__anon1.instance->_class = MkSpecifierName(_class->fullName);
13295 exp->__anon1.instance->loc = exp->loc;
13296 exp->type = 1;
13297 Set(exp->__anon1.instance->data, value->__anon1.instance->data);
13298 PopulateInstance(exp->__anon1.instance);
13299 }
13300 break;
13301 }
13302 case 3:
13303 {
13304 int intValue;
13305 void (* Set)(void *, int) = (void *)prop->Set;
13306
13307 exp->__anon1.instance = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Instantiation);
13308 exp->__anon1.instance->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize));
13309 exp->__anon1.instance->_class = MkSpecifierName(_class->fullName);
13310 exp->__anon1.instance->loc = exp->loc;
13311 exp->type = 1;
13312 GetInt(value, &intValue);
13313 Set(exp->__anon1.instance->data, intValue);
13314 PopulateInstance(exp->__anon1.instance);
13315 break;
13316 }
13317 case 4:
13318 {
13319 long long intValue;
13320 void (* Set)(void *, long long) = (void *)prop->Set;
13321
13322 exp->__anon1.instance = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Instantiation);
13323 exp->__anon1.instance->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize));
13324 exp->__anon1.instance->_class = MkSpecifierName(_class->fullName);
13325 exp->__anon1.instance->loc = exp->loc;
13326 exp->type = 1;
13327 GetInt64(value, &intValue);
13328 Set(exp->__anon1.instance->data, intValue);
13329 PopulateInstance(exp->__anon1.instance);
13330 break;
13331 }
13332 case 22:
13333 {
13334 intptr_t intValue;
13335 void (* Set)(void *, intptr_t) = (void *)prop->Set;
13336
13337 exp->__anon1.instance = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Instantiation);
13338 exp->__anon1.instance->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize));
13339 exp->__anon1.instance->_class = MkSpecifierName(_class->fullName);
13340 exp->__anon1.instance->loc = exp->loc;
13341 exp->type = 1;
13342 GetIntPtr(value, &intValue);
13343 Set(exp->__anon1.instance->data, intValue);
13344 PopulateInstance(exp->__anon1.instance);
13345 break;
13346 }
13347 case 23:
13348 {
13349 ssize_t intValue;
13350 void (* Set)(void *, ssize_t) = (void *)prop->Set;
13351
13352 exp->__anon1.instance = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Instantiation);
13353 exp->__anon1.instance->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize));
13354 exp->__anon1.instance->_class = MkSpecifierName(_class->fullName);
13355 exp->__anon1.instance->loc = exp->loc;
13356 exp->type = 1;
13357 GetIntSize(value, &intValue);
13358 Set(exp->__anon1.instance->data, intValue);
13359 PopulateInstance(exp->__anon1.instance);
13360 break;
13361 }
13362 case 6:
13363 {
13364 float floatValue;
13365 void (* Set)(void *, float) = (void *)prop->Set;
13366
13367 exp->__anon1.instance = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Instantiation);
13368 exp->__anon1.instance->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize));
13369 exp->__anon1.instance->_class = MkSpecifierName(_class->fullName);
13370 exp->__anon1.instance->loc = exp->loc;
13371 exp->type = 1;
13372 GetFloat(value, &floatValue);
13373 Set(exp->__anon1.instance->data, floatValue);
13374 PopulateInstance(exp->__anon1.instance);
13375 break;
13376 }
13377 case 7:
13378 {
13379 double doubleValue;
13380 void (* Set)(void *, double) = (void *)prop->Set;
13381
13382 exp->__anon1.instance = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Instantiation);
13383 exp->__anon1.instance->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize));
13384 exp->__anon1.instance->_class = MkSpecifierName(_class->fullName);
13385 exp->__anon1.instance->loc = exp->loc;
13386 exp->type = 1;
13387 GetDouble(value, &doubleValue);
13388 Set(exp->__anon1.instance->data, doubleValue);
13389 PopulateInstance(exp->__anon1.instance);
13390 break;
13391 }
13392 }
13393 }
13394 else if(_class->type == 2)
13395 {
13396 switch(type->kind)
13397 {
13398 case 8:
13399 {
13400 struct __ecereNameSpace__ecere__com__Class * propertyClass = type->__anon1._class->__anon1.registered;
13401
13402 if(propertyClass->type == 1 && value->__anon1.instance->data)
13403 {
13404 unsigned int (* Set)(void *) = (void *)prop->Set;
13405 unsigned int bits = Set(value->__anon1.instance->data);
13406
13407 exp->__anon1.__anon1.constant = PrintHexUInt(bits);
13408 exp->type = 2;
13409 break;
13410 }
13411 else if(_class->type == 2)
13412 {
13413 unsigned int value;
13414 unsigned int (* Set)(unsigned int) = (void *)prop->Set;
13415 unsigned int bits;
13416
13417 GetUInt(exp->__anon1.member.exp, &value);
13418 bits = Set(value);
13419 exp->__anon1.__anon1.constant = PrintHexUInt(bits);
13420 exp->type = 2;
13421 }
13422 }
13423 }
13424 }
13425 }
13426 else
13427 {
13428 if(_class->type == 2)
13429 {
13430 unsigned int value;
13431
13432 GetUInt(exp->__anon1.member.exp, &value);
13433 switch(type->kind)
13434 {
13435 case 8:
13436 {
13437 struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class->__anon1.registered;
13438
13439 if(_class->type == 1)
13440 {
13441 void (* Get)(unsigned int, void *) = (void *)prop->Get;
13442
13443 exp->__anon1.instance = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Instantiation);
13444 exp->__anon1.instance->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize));
13445 exp->__anon1.instance->_class = MkSpecifierName(_class->fullName);
13446 exp->__anon1.instance->loc = exp->loc;
13447 exp->type = 1;
13448 Get(value, exp->__anon1.instance->data);
13449 PopulateInstance(exp->__anon1.instance);
13450 }
13451 else if(_class->type == 2)
13452 {
13453 unsigned int (* Get)(unsigned int) = (void *)prop->Get;
13454 uint64 bits = Get(value);
13455
13456 exp->__anon1.__anon1.constant = PrintHexUInt64(bits);
13457 exp->type = 2;
13458 }
13459 break;
13460 }
13461 }
13462 }
13463 else if(_class->type == 1)
13464 {
13465 unsigned char * value = (exp->__anon1.member.exp->type == 1) ? exp->__anon1.member.exp->__anon1.instance->data : (((void *)0));
13466
13467 switch(type->kind)
13468 {
13469 case 8:
13470 {
13471 struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class->__anon1.registered;
13472
13473 if(_class->type == 1 && value)
13474 {
13475 void (* Get)(void *, void *) = (void *)prop->Get;
13476
13477 exp->__anon1.instance = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Instantiation);
13478 exp->__anon1.instance->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize));
13479 exp->__anon1.instance->_class = MkSpecifierName(_class->fullName);
13480 exp->__anon1.instance->loc = exp->loc;
13481 exp->type = 1;
13482 Get(value, exp->__anon1.instance->data);
13483 PopulateInstance(exp->__anon1.instance);
13484 }
13485 break;
13486 }
13487 }
13488 }
13489 }
13490 }
13491 }
13492 else
13493 {
13494 exp->isConstant = 0;
13495 }
13496 }
13497 else if(member)
13498 {
13499 }
13500 }
13501 if(exp->type != 8)
13502 {
13503 FreeExpression(memberExp);
13504 FreeIdentifier(memberID);
13505 }
13506 break;
13507 }
13508 case 10:
13509 {
13510 struct Type * type = ProcessType(exp->__anon1.typeName->qualifiers, exp->__anon1.typeName->declarator);
13511
13512 FreeExpContents(exp);
13513 exp->__anon1.__anon1.constant = PrintUInt(ComputeTypeSize(type));
13514 exp->type = 2;
13515 FreeType(type);
13516 break;
13517 }
13518 case 15:
13519 {
13520 struct Symbol * classSym = exp->__anon1._class->__anon1.__anon1.symbol;
13521
13522 if(classSym && classSym->__anon1.registered)
13523 {
13524 if(classSym->__anon1.registered->fixed)
13525 {
13526 FreeSpecifier(exp->__anon1._class);
13527 exp->__anon1.__anon1.constant = PrintUInt(classSym->__anon1.registered->templateClass ? classSym->__anon1.registered->templateClass->structSize : classSym->__anon1.registered->structSize);
13528 exp->type = 2;
13529 }
13530 else
13531 {
13532 char className[1024];
13533
13534 strcpy(className, "__ecereClass_");
13535 FullClassNameCat(className, classSym->string, 1);
13536 DeclareClass(curExternal, classSym, className);
13537 FreeExpContents(exp);
13538 exp->type = 9;
13539 exp->__anon1.member.exp = MkExpIdentifier(MkIdentifier(className));
13540 exp->__anon1.member.member = MkIdentifier("structSize");
13541 }
13542 }
13543 break;
13544 }
13545 case 11:
13546 {
13547 struct Type * type;
13548 struct Expression * e = exp;
13549
13550 if(exp->type == 11)
13551 {
13552 if(exp->__anon1.cast.exp)
13553 ComputeExpression(exp->__anon1.cast.exp);
13554 e = exp->__anon1.cast.exp;
13555 }
13556 if(e && exp->expType)
13557 {
13558 type = exp->expType;
13559 if(type->kind == 8)
13560 {
13561 struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class->__anon1.registered;
13562
13563 if(_class && (_class->type == 3 || _class->type == 2))
13564 {
13565 if(!_class->dataType)
13566 _class->dataType = ProcessTypeString(_class->dataTypeString, 0);
13567 type = _class->dataType;
13568 }
13569 }
13570 switch(type->kind)
13571 {
13572 case 24:
13573 case 1:
13574 if(type->isSigned)
13575 {
13576 char value = 0;
13577
13578 if(GetChar(e, &value))
13579 {
13580 FreeExpContents(exp);
13581 exp->__anon1.__anon1.constant = PrintChar(value);
13582 exp->type = 2;
13583 }
13584 }
13585 else
13586 {
13587 unsigned char value = 0;
13588
13589 if(GetUChar(e, &value))
13590 {
13591 FreeExpContents(exp);
13592 exp->__anon1.__anon1.constant = PrintUChar(value);
13593 exp->type = 2;
13594 }
13595 }
13596 break;
13597 case 2:
13598 if(type->isSigned)
13599 {
13600 short value = 0;
13601
13602 if(GetShort(e, &value))
13603 {
13604 FreeExpContents(exp);
13605 exp->__anon1.__anon1.constant = PrintShort(value);
13606 exp->type = 2;
13607 }
13608 }
13609 else
13610 {
13611 unsigned short value = 0;
13612
13613 if(GetUShort(e, &value))
13614 {
13615 FreeExpContents(exp);
13616 exp->__anon1.__anon1.constant = PrintUShort(value);
13617 exp->type = 2;
13618 }
13619 }
13620 break;
13621 case 3:
13622 if(type->isSigned)
13623 {
13624 int value = 0;
13625
13626 if(GetInt(e, &value))
13627 {
13628 FreeExpContents(exp);
13629 exp->__anon1.__anon1.constant = PrintInt(value);
13630 exp->type = 2;
13631 }
13632 }
13633 else
13634 {
13635 unsigned int value = 0;
13636
13637 if(GetUInt(e, &value))
13638 {
13639 FreeExpContents(exp);
13640 exp->__anon1.__anon1.constant = PrintUInt(value);
13641 exp->type = 2;
13642 }
13643 }
13644 break;
13645 case 4:
13646 if(type->isSigned)
13647 {
13648 long long value = 0;
13649
13650 if(GetInt64(e, &value))
13651 {
13652 FreeExpContents(exp);
13653 exp->__anon1.__anon1.constant = PrintInt64(value);
13654 exp->type = 2;
13655 }
13656 }
13657 else
13658 {
13659 uint64 value = 0;
13660
13661 if(GetUInt64(e, &value))
13662 {
13663 FreeExpContents(exp);
13664 exp->__anon1.__anon1.constant = PrintUInt64(value);
13665 exp->type = 2;
13666 }
13667 }
13668 break;
13669 case 22:
13670 if(type->isSigned)
13671 {
13672 intptr_t value = 0;
13673
13674 if(GetIntPtr(e, &value))
13675 {
13676 FreeExpContents(exp);
13677 exp->__anon1.__anon1.constant = PrintInt64((long long)value);
13678 exp->type = 2;
13679 }
13680 }
13681 else
13682 {
13683 uintptr_t value = 0;
13684
13685 if(GetUIntPtr(e, &value))
13686 {
13687 FreeExpContents(exp);
13688 exp->__anon1.__anon1.constant = PrintUInt64((uint64)value);
13689 exp->type = 2;
13690 }
13691 }
13692 break;
13693 case 23:
13694 if(type->isSigned)
13695 {
13696 ssize_t value = 0;
13697
13698 if(GetIntSize(e, &value))
13699 {
13700 FreeExpContents(exp);
13701 exp->__anon1.__anon1.constant = PrintInt64((long long)value);
13702 exp->type = 2;
13703 }
13704 }
13705 else
13706 {
13707 size_t value = 0;
13708
13709 if(GetUIntSize(e, &value))
13710 {
13711 FreeExpContents(exp);
13712 exp->__anon1.__anon1.constant = PrintUInt64((uint64)value);
13713 exp->type = 2;
13714 }
13715 }
13716 break;
13717 case 6:
13718 {
13719 float value = 0;
13720
13721 if(GetFloat(e, &value))
13722 {
13723 FreeExpContents(exp);
13724 exp->__anon1.__anon1.constant = PrintFloat(value);
13725 exp->type = 2;
13726 }
13727 break;
13728 }
13729 case 7:
13730 {
13731 double value = 0;
13732
13733 if(GetDouble(e, &value))
13734 {
13735 FreeExpContents(exp);
13736 exp->__anon1.__anon1.constant = PrintDouble(value);
13737 exp->type = 2;
13738 }
13739 break;
13740 }
13741 }
13742 }
13743 break;
13744 }
13745 case 12:
13746 {
13747 struct Operand op1 =
13748 {
13749 0, 0, 0,
13750 .__anon1 = {
13751 .c = 0
13752 },
13753 {
13754 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
13755 }
13756 };
13757 struct Operand op2 =
13758 {
13759 0, 0, 0,
13760 .__anon1 = {
13761 .c = 0
13762 },
13763 {
13764 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
13765 }
13766 };
13767 struct Operand op3 =
13768 {
13769 0, 0, 0,
13770 .__anon1 = {
13771 .c = 0
13772 },
13773 {
13774 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
13775 }
13776 };
13777
13778 if(exp->__anon1.cond.exp)
13779 ComputeExpression((*exp->__anon1.cond.exp).last);
13780 if(exp->__anon1.cond.elseExp)
13781 ComputeExpression(exp->__anon1.cond.elseExp);
13782 if(exp->__anon1.cond.cond)
13783 ComputeExpression(exp->__anon1.cond.cond);
13784 op1 = GetOperand(exp->__anon1.cond.cond);
13785 if(op1.type)
13786 op1.type->refCount++;
13787 op2 = GetOperand((*exp->__anon1.cond.exp).last);
13788 if(op2.type)
13789 op2.type->refCount++;
13790 op3 = GetOperand(exp->__anon1.cond.elseExp);
13791 if(op3.type)
13792 op3.type->refCount++;
13793 if(op1.ops.Cond)
13794 {
13795 FreeExpContents(exp);
13796 op1.ops.Cond(exp, &op1, &op2, &op3);
13797 }
13798 if(op1.type)
13799 FreeType(op1.type);
13800 if(op2.type)
13801 FreeType(op2.type);
13802 if(op3.type)
13803 FreeType(op3.type);
13804 break;
13805 }
13806 }
13807 }
13808
13809 unsigned int MatchWithEnums_Module(struct __ecereNameSpace__ecere__com__Instance * mainModule, struct Expression * sourceExp, struct Type * dest, char * string, struct __ecereNameSpace__ecere__sys__OldList * conversions)
13810 {
13811 struct __ecereNameSpace__ecere__com__Instance * module;
13812
13813 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))
13814 return 1;
13815 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))
13816 return 1;
13817 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))
13818 return 1;
13819 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)
13820 {
13821 if(ModuleVisibility(mainModule, module) && MatchWithEnums_NameSpace(&((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->publicNameSpace, sourceExp, dest, string, conversions))
13822 return 1;
13823 }
13824 return 0;
13825 }
13826
13827 unsigned int MatchTypeExpression(struct Expression * sourceExp, struct Type * dest, struct __ecereNameSpace__ecere__sys__OldList * conversions, unsigned int skipUnitBla, unsigned int warnConst)
13828 {
13829 struct Type * source;
13830 struct Type * realDest = dest;
13831 struct Type * backupSourceExpType = (((void *)0));
13832 struct Expression * nbExp = GetNonBracketsExp(sourceExp);
13833 struct Expression * computedExp = nbExp;
13834
13835 dest->refCount++;
13836 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)
13837 {
13838 computedExp = CopyExpression(nbExp);
13839 ComputeExpression(computedExp);
13840 }
13841 source = sourceExp->expType;
13842 if(dest->kind == 13 && sourceExp->type == 2 && !strtoul(sourceExp->__anon1.__anon1.constant, (((void *)0)), 0))
13843 {
13844 if(computedExp != nbExp)
13845 {
13846 FreeExpression(computedExp);
13847 computedExp = nbExp;
13848 }
13849 FreeType(dest);
13850 return 1;
13851 }
13852 if(!skipUnitBla && source && dest && source->kind == 8 && dest->kind == 8)
13853 {
13854 if(source->__anon1._class && source->__anon1._class->__anon1.registered && source->__anon1._class->__anon1.registered->type == 3)
13855 {
13856 struct __ecereNameSpace__ecere__com__Class * sourceBase, * destBase;
13857
13858 for(sourceBase = source->__anon1._class->__anon1.registered; sourceBase && sourceBase->base && sourceBase->base->type != 1000; sourceBase = sourceBase->base)
13859 ;
13860 for(destBase = dest->__anon1._class->__anon1.registered; destBase && destBase->base && destBase->base->type != 1000; destBase = destBase->base)
13861 ;
13862 if(sourceBase == destBase)
13863 {
13864 if(computedExp != nbExp)
13865 {
13866 FreeExpression(computedExp);
13867 computedExp = nbExp;
13868 }
13869 FreeType(dest);
13870 return 1;
13871 }
13872 }
13873 }
13874 if(source)
13875 {
13876 struct __ecereNameSpace__ecere__sys__OldList * specs;
13877 unsigned int flag = 0;
13878 long long value = (((int)0x7fffffff));
13879
13880 source->refCount++;
13881 if(computedExp->type == 2)
13882 {
13883 if(source->isSigned)
13884 value = strtoll(computedExp->__anon1.__anon1.constant, (((void *)0)), 0);
13885 else
13886 value = strtoull(computedExp->__anon1.__anon1.constant, (((void *)0)), 0);
13887 }
13888 else if(computedExp->type == 4 && sourceExp->__anon1.op.op == '-' && !computedExp->__anon1.op.exp1 && computedExp->__anon1.op.exp2 && computedExp->__anon1.op.exp2->type == 2)
13889 {
13890 if(source->isSigned)
13891 value = -strtoll(computedExp->__anon1.op.exp2->__anon1.__anon1.constant, (((void *)0)), 0);
13892 else
13893 value = -strtoull(computedExp->__anon1.op.exp2->__anon1.__anon1.constant, (((void *)0)), 0);
13894 }
13895 if(computedExp != nbExp)
13896 {
13897 FreeExpression(computedExp);
13898 computedExp = nbExp;
13899 }
13900 if(dest->kind != 8 && source->kind == 8 && source->__anon1._class && source->__anon1._class->__anon1.registered && !strcmp(source->__anon1._class->__anon1.registered->fullName, "unichar"))
13901 {
13902 FreeType(source);
13903 source = __extension__ ({
13904 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
13905
13906 __ecereInstance1->kind = 3, __ecereInstance1->isSigned = 0, __ecereInstance1->refCount = 1, __ecereInstance1;
13907 });
13908 }
13909 if(dest->kind == 8)
13910 {
13911 struct __ecereNameSpace__ecere__com__Class * _class = dest->__anon1._class ? dest->__anon1._class->__anon1.registered : (((void *)0));
13912
13913 if(_class && _class->type == 3)
13914 {
13915 if(source->kind != 8)
13916 {
13917 struct Type * tempType = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
13918 struct Type * tempDest, * tempSource;
13919
13920 for(; _class->base->type != 1000; _class = _class->base)
13921 ;
13922 tempSource = dest;
13923 tempDest = tempType;
13924 tempType->kind = 8;
13925 if(!_class->symbol)
13926 _class->symbol = FindClass(_class->fullName);
13927 tempType->__anon1._class = _class->symbol;
13928 tempType->truth = dest->truth;
13929 if(tempType->__anon1._class)
13930 MatchTypes(tempSource, tempDest, conversions, (((void *)0)), (((void *)0)), 1, 1, 0, 0, warnConst);
13931 backupSourceExpType = sourceExp->expType;
13932 if(dest->passAsTemplate)
13933 {
13934 sourceExp->expType = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
13935 CopyTypeInto(sourceExp->expType, dest);
13936 sourceExp->expType->passAsTemplate = 0;
13937 }
13938 else
13939 {
13940 sourceExp->expType = dest;
13941 dest->refCount++;
13942 }
13943 flag = 1;
13944 ((tempType ? (__ecereClass_Type->Destructor ? __ecereClass_Type->Destructor((void *)tempType) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(tempType)) : 0), tempType = 0);
13945 }
13946 }
13947 if(_class && _class->type == 2 && source->kind != 8)
13948 {
13949 if(!dest->__anon1._class->__anon1.registered->dataType)
13950 dest->__anon1._class->__anon1.registered->dataType = ProcessTypeString(dest->__anon1._class->__anon1.registered->dataTypeString, 0);
13951 if(MatchTypes(source, dest->__anon1._class->__anon1.registered->dataType, conversions, (((void *)0)), (((void *)0)), 1, 1, 0, 0, warnConst))
13952 {
13953 FreeType(source);
13954 FreeType(sourceExp->expType);
13955 source = sourceExp->expType = MkClassType(dest->__anon1._class->string);
13956 source->refCount++;
13957 }
13958 }
13959 if(_class && !strcmp(_class->fullName, "ecere::com::Class") && source->kind == 13 && source->__anon1.type && source->__anon1.type->kind == 1 && sourceExp->type == 3)
13960 {
13961 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
13962 struct Declarator * decl;
13963 char string[1024];
13964
13965 ReadString(string, sourceExp->__anon1.__anon2.string);
13966 decl = SpecDeclFromString(string, specs, (((void *)0)));
13967 FreeExpContents(sourceExp);
13968 FreeType(sourceExp->expType);
13969 sourceExp->type = 24;
13970 sourceExp->__anon1._classExp.specifiers = specs;
13971 sourceExp->__anon1._classExp.decl = decl;
13972 sourceExp->expType = dest;
13973 dest->refCount++;
13974 FreeType(source);
13975 FreeType(dest);
13976 if(backupSourceExpType)
13977 FreeType(backupSourceExpType);
13978 return 1;
13979 }
13980 }
13981 else if(source->kind == 8)
13982 {
13983 struct __ecereNameSpace__ecere__com__Class * _class = source->__anon1._class ? source->__anon1._class->__anon1.registered : (((void *)0));
13984
13985 if(_class && (_class->type == 3 || _class->type == 2))
13986 {
13987 if(dest->kind != 8)
13988 {
13989 struct Type * tempType = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
13990 struct Type * tempDest, * tempSource;
13991
13992 if(!source->__anon1._class->__anon1.registered->dataType)
13993 source->__anon1._class->__anon1.registered->dataType = ProcessTypeString(source->__anon1._class->__anon1.registered->dataTypeString, 0);
13994 for(; _class->base->type != 1000; _class = _class->base)
13995 ;
13996 tempDest = source;
13997 tempSource = tempType;
13998 tempType->kind = 8;
13999 tempType->__anon1._class = FindClass(_class->fullName);
14000 tempType->truth = source->truth;
14001 tempType->classObjectType = source->classObjectType;
14002 if(tempType->__anon1._class)
14003 MatchTypes(tempSource, tempDest, conversions, (((void *)0)), (((void *)0)), 1, 1, 0, 0, warnConst);
14004 if(conversions && conversions->last)
14005 {
14006 ((struct Conversion *)conversions->last)->resultType = dest;
14007 dest->refCount++;
14008 }
14009 FreeType(sourceExp->expType);
14010 sourceExp->expType = MkClassType(_class->fullName);
14011 sourceExp->expType->truth = source->truth;
14012 sourceExp->expType->classObjectType = source->classObjectType;
14013 if(!sourceExp->destType)
14014 {
14015 FreeType(sourceExp->destType);
14016 sourceExp->destType = sourceExp->expType;
14017 if(sourceExp->expType)
14018 sourceExp->expType->refCount++;
14019 }
14020 if(!_class->dataType)
14021 _class->dataType = ProcessTypeString(_class->dataTypeString, 0);
14022 FreeType(dest);
14023 dest = MkClassType(source->__anon1._class->string);
14024 dest->truth = source->truth;
14025 dest->classObjectType = source->classObjectType;
14026 FreeType(source);
14027 source = _class->dataType;
14028 source->refCount++;
14029 ((tempType ? (__ecereClass_Type->Destructor ? __ecereClass_Type->Destructor((void *)tempType) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(tempType)) : 0), tempType = 0);
14030 }
14031 }
14032 }
14033 if(!flag)
14034 {
14035 if(MatchTypes(source, dest, conversions, (((void *)0)), (((void *)0)), 1, 1, 0, 0, warnConst))
14036 {
14037 FreeType(source);
14038 FreeType(dest);
14039 return 1;
14040 }
14041 }
14042 if(dest->kind == 8)
14043 {
14044 struct __ecereNameSpace__ecere__com__Class * _class = dest->__anon1._class ? dest->__anon1._class->__anon1.registered : (((void *)0));
14045 unsigned int fittingValue = 0;
14046
14047 if(_class && _class->type == 4)
14048 {
14049 struct __ecereNameSpace__ecere__com__Class * enumClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "enum");
14050 struct __ecereNameSpace__ecere__com__EnumClassData * c = (_class ? ((void *)(((char *)_class->data) + enumClass->offsetClass)) : (((void *)0)));
14051
14052 if(c && value >= 0 && value <= c->largest)
14053 fittingValue = 1;
14054 }
14055 if(_class && !dest->truth && (_class->type == 3 || fittingValue || (_class->type != 1 && !value && source->kind == 3) || _class->type == 2))
14056 {
14057 if(_class->type == 0 || _class->type == 5)
14058 {
14059 struct Expression * newExp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression);
14060
14061 *newExp = *sourceExp;
14062 if(sourceExp->destType)
14063 sourceExp->destType->refCount++;
14064 if(sourceExp->expType)
14065 sourceExp->expType->refCount++;
14066 sourceExp->type = 11;
14067 sourceExp->__anon1.cast.typeName = MkTypeName(MkListOne(MkSpecifier(VOID)), MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), (((void *)0))));
14068 sourceExp->__anon1.cast.exp = newExp;
14069 FreeType(sourceExp->expType);
14070 sourceExp->expType = (((void *)0));
14071 ProcessExpressionType(sourceExp);
14072 if(!inCompiler)
14073 {
14074 FreeType(sourceExp->expType);
14075 sourceExp->expType = dest;
14076 }
14077 FreeType(source);
14078 if(inCompiler)
14079 FreeType(dest);
14080 if(backupSourceExpType)
14081 FreeType(backupSourceExpType);
14082 return 1;
14083 }
14084 if(!_class->dataType)
14085 _class->dataType = ProcessTypeString(_class->dataTypeString, 0);
14086 FreeType(dest);
14087 dest = _class->dataType;
14088 dest->refCount++;
14089 }
14090 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))
14091 {
14092 specs = MkListOne(MkSpecifier(DOUBLE));
14093 }
14094 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))
14095 {
14096 specs = MkListOne(MkSpecifier(FLOAT));
14097 }
14098 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))
14099 {
14100 specs = MkList();
14101 if(!dest->isSigned)
14102 ListAdd(specs, MkSpecifier(UNSIGNED));
14103 ListAdd(specs, MkSpecifier(INT64));
14104 }
14105 else if(dest->kind == 3 && (source->kind == 3 || source->kind == 2 || source->kind == 1 || source->kind == 24 || source->kind == 6 || source->kind == 7))
14106 {
14107 specs = MkList();
14108 if(!dest->isSigned)
14109 ListAdd(specs, MkSpecifier(UNSIGNED));
14110 ListAdd(specs, MkSpecifier(INT));
14111 }
14112 else if(dest->kind == 2 && (source->kind == 2 || source->kind == 1 || source->kind == 24 || source->kind == 3 || source->kind == 6 || source->kind == 7))
14113 {
14114 specs = MkList();
14115 if(!dest->isSigned)
14116 ListAdd(specs, MkSpecifier(UNSIGNED));
14117 ListAdd(specs, MkSpecifier(SHORT));
14118 }
14119 else if(dest->kind == 1 && (source->kind == 1 || source->kind == 24 || source->kind == 2 || source->kind == 3 || source->kind == 6 || source->kind == 7))
14120 {
14121 specs = MkList();
14122 if(!dest->isSigned)
14123 ListAdd(specs, MkSpecifier(UNSIGNED));
14124 ListAdd(specs, MkSpecifier(CHAR));
14125 }
14126 else
14127 {
14128 FreeType(source);
14129 FreeType(dest);
14130 if(backupSourceExpType)
14131 {
14132 if(sourceExp->expType)
14133 FreeType(sourceExp->expType);
14134 sourceExp->expType = backupSourceExpType;
14135 }
14136 return 0;
14137 }
14138 }
14139 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))
14140 {
14141 specs = MkListOne(MkSpecifier(DOUBLE));
14142 }
14143 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))
14144 {
14145 specs = MkListOne(MkSpecifier(FLOAT));
14146 }
14147 else if(dest->kind == 24 && (source->kind == 24 || source->kind == 1 || source->kind == 15 || source->kind == 2 || source->kind == 3) && (value == 1 || value == 0))
14148 {
14149 specs = MkList();
14150 ListAdd(specs, MkSpecifier(BOOL));
14151 }
14152 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)))
14153 {
14154 if(source->kind == 3)
14155 {
14156 FreeType(dest);
14157 FreeType(source);
14158 if(backupSourceExpType)
14159 FreeType(backupSourceExpType);
14160 return 1;
14161 }
14162 else
14163 {
14164 specs = MkList();
14165 if(!dest->isSigned)
14166 ListAdd(specs, MkSpecifier(UNSIGNED));
14167 ListAdd(specs, MkSpecifier(CHAR));
14168 }
14169 }
14170 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)))))
14171 {
14172 if(source->kind == 3)
14173 {
14174 FreeType(dest);
14175 FreeType(source);
14176 if(backupSourceExpType)
14177 FreeType(backupSourceExpType);
14178 return 1;
14179 }
14180 else
14181 {
14182 specs = MkList();
14183 if(!dest->isSigned)
14184 ListAdd(specs, MkSpecifier(UNSIGNED));
14185 ListAdd(specs, MkSpecifier(SHORT));
14186 }
14187 }
14188 else if(dest->kind == 3 && (source->kind == 15 || source->kind == 2 || source->kind == 24 || source->kind == 1 || source->kind == 3))
14189 {
14190 specs = MkList();
14191 if(!dest->isSigned)
14192 ListAdd(specs, MkSpecifier(UNSIGNED));
14193 ListAdd(specs, MkSpecifier(INT));
14194 }
14195 else if(dest->kind == 4 && (source->kind == 15 || source->kind == 2 || source->kind == 24 || source->kind == 1 || source->kind == 3 || source->kind == 4))
14196 {
14197 specs = MkList();
14198 if(!dest->isSigned)
14199 ListAdd(specs, MkSpecifier(UNSIGNED));
14200 ListAdd(specs, MkSpecifier(INT64));
14201 }
14202 else if(dest->kind == 15 && (source->kind == 4 || source->kind == 3 || source->kind == 2 || source->kind == 24 || source->kind == 1))
14203 {
14204 specs = MkListOne(MkEnum(MkIdentifier(dest->__anon1.__anon1.enumName), (((void *)0))));
14205 }
14206 else
14207 {
14208 FreeType(source);
14209 FreeType(dest);
14210 if(backupSourceExpType)
14211 {
14212 if(sourceExp->expType)
14213 FreeType(sourceExp->expType);
14214 sourceExp->expType = backupSourceExpType;
14215 }
14216 return 0;
14217 }
14218 if(!flag && !sourceExp->opDestType)
14219 {
14220 struct Expression * newExp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression);
14221
14222 *newExp = *sourceExp;
14223 newExp->prev = (((void *)0));
14224 newExp->next = (((void *)0));
14225 if(sourceExp->destType)
14226 sourceExp->destType->refCount++;
14227 if(sourceExp->expType)
14228 sourceExp->expType->refCount++;
14229 sourceExp->type = 11;
14230 if(realDest->kind == 8)
14231 {
14232 sourceExp->__anon1.cast.typeName = QMkClass(realDest->__anon1._class->string, (((void *)0)));
14233 FreeList(specs, (void *)(FreeSpecifier));
14234 }
14235 else
14236 sourceExp->__anon1.cast.typeName = MkTypeName(specs, (((void *)0)));
14237 if(newExp->type == 4)
14238 {
14239 sourceExp->__anon1.cast.exp = MkExpBrackets(MkListOne(newExp));
14240 }
14241 else
14242 sourceExp->__anon1.cast.exp = newExp;
14243 FreeType(sourceExp->expType);
14244 sourceExp->expType = (((void *)0));
14245 ProcessExpressionType(sourceExp);
14246 }
14247 else
14248 FreeList(specs, (void *)(FreeSpecifier));
14249 FreeType(dest);
14250 FreeType(source);
14251 if(backupSourceExpType)
14252 FreeType(backupSourceExpType);
14253 return 1;
14254 }
14255 else
14256 {
14257 if(computedExp != nbExp)
14258 {
14259 FreeExpression(computedExp);
14260 computedExp = nbExp;
14261 }
14262 while((sourceExp->type == 5 || sourceExp->type == 32) && sourceExp->__anon1.list)
14263 sourceExp = (*sourceExp->__anon1.list).last;
14264 if(sourceExp->type == 0)
14265 {
14266 struct Identifier * id = sourceExp->__anon1.__anon1.identifier;
14267
14268 if(dest->kind == 8)
14269 {
14270 if(dest->__anon1._class && dest->__anon1._class->__anon1.registered && dest->__anon1._class->__anon1.registered->type == 4)
14271 {
14272 struct __ecereNameSpace__ecere__com__Class * _class = dest->__anon1._class->__anon1.registered;
14273 struct __ecereNameSpace__ecere__com__Class * enumClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "enum");
14274
14275 if(enumClass)
14276 {
14277 for(; _class && _class->type == 4; _class = _class->base)
14278 {
14279 struct __ecereNameSpace__ecere__sys__NamedLink64 * value;
14280 struct __ecereNameSpace__ecere__com__EnumClassData * e = (_class ? ((void *)(((char *)_class->data) + enumClass->offsetClass)) : (((void *)0)));
14281
14282 for(value = e->values.first; value; value = value->next)
14283 {
14284 if(!strcmp(value->name, id->string))
14285 break;
14286 }
14287 if(value)
14288 {
14289 FreeType(sourceExp->expType);
14290 sourceExp->isConstant = 1;
14291 sourceExp->expType = MkClassType(_class->fullName);
14292 if(inCompiler || inPreCompiler || inDebugger)
14293 {
14294 FreeExpContents(sourceExp);
14295 sourceExp->type = 2;
14296 if(_class->dataTypeString && (!strcmp(_class->dataTypeString, "int") || !strcmp(_class->dataTypeString, "int64") || !strcmp(_class->dataTypeString, "short") || !strcmp(_class->dataTypeString, "char")))
14297 sourceExp->__anon1.__anon1.constant = PrintInt64(value->data);
14298 else
14299 sourceExp->__anon1.__anon1.constant = PrintUInt64(value->data);
14300 }
14301 FreeType(dest);
14302 return 1;
14303 }
14304 }
14305 }
14306 }
14307 }
14308 if(dest->classObjectType != 2 && dest->kind == 8 && MatchWithEnums_Module(privateModule, sourceExp, dest, id->string, conversions))
14309 {
14310 FreeType(dest);
14311 return 1;
14312 }
14313 }
14314 FreeType(dest);
14315 }
14316 return 0;
14317 }
14318
14319 static unsigned int CheckExpressionType(struct Expression * exp, struct Type * destType, unsigned int skipUnitBla, unsigned int warnConst)
14320 {
14321 unsigned int result = 1;
14322
14323 if(destType)
14324 {
14325 struct __ecereNameSpace__ecere__sys__OldList converts =
14326 {
14327 0, 0, 0, 0, 0
14328 };
14329 struct Conversion * convert;
14330
14331 if(destType->kind == 0)
14332 return 0;
14333 if(!MatchTypeExpression(exp, destType, &converts, skipUnitBla, warnConst))
14334 result = 0;
14335 if(converts.count)
14336 {
14337 for(convert = converts.first; convert; convert = convert->next)
14338 {
14339 unsigned int empty = !(convert->isGet ? (void *)convert->convert->Get : (void *)convert->convert->Set);
14340
14341 if(!empty)
14342 {
14343 struct Expression * newExp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression);
14344 int objectType = exp->expType ? exp->expType->classObjectType : 0;
14345
14346 *newExp = *exp;
14347 newExp->prev = (((void *)0));
14348 newExp->next = (((void *)0));
14349 newExp->destType = (((void *)0));
14350 if(convert->isGet)
14351 {
14352 exp->type = 8;
14353 exp->addedThis = 1;
14354 exp->__anon1.member.exp = newExp;
14355 FreeType(exp->__anon1.member.exp->expType);
14356 exp->__anon1.member.exp->expType = MkClassType(convert->convert->_class->fullName);
14357 exp->__anon1.member.exp->expType->classObjectType = objectType;
14358 exp->__anon1.member.member = MkIdentifier(convert->convert->dataTypeString);
14359 exp->__anon1.member.memberType = 1;
14360 exp->expType = convert->resultType ? convert->resultType : convert->convert->dataType;
14361 exp->needCast = 1;
14362 if(exp->expType)
14363 exp->expType->refCount++;
14364 ApplyAnyObjectLogic(exp->__anon1.member.exp);
14365 }
14366 else
14367 {
14368 {
14369 exp->type = 8;
14370 exp->addedThis = 1;
14371 exp->__anon1.member.exp = newExp;
14372 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)
14373 {
14374 newExp->byReference = 1;
14375 }
14376 FreeType(exp->__anon1.member.exp->expType);
14377 exp->__anon1.member.exp->expType = (((void *)0));
14378 if(convert->convert->dataType)
14379 {
14380 exp->__anon1.member.exp->expType = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
14381 CopyTypeInto(exp->__anon1.member.exp->expType, convert->convert->dataType);
14382 exp->__anon1.member.exp->expType->refCount = 1;
14383 exp->__anon1.member.exp->expType->classObjectType = objectType;
14384 ApplyAnyObjectLogic(exp->__anon1.member.exp);
14385 }
14386 exp->__anon1.member.member = MkIdentifier(convert->convert->_class->fullName);
14387 exp->__anon1.member.memberType = 4;
14388 exp->expType = convert->resultType ? convert->resultType : MkClassType(convert->convert->_class->fullName);
14389 exp->needCast = 1;
14390 if(convert->resultType)
14391 convert->resultType->refCount++;
14392 }
14393 }
14394 }
14395 else
14396 {
14397 FreeType(exp->expType);
14398 if(convert->isGet)
14399 {
14400 exp->expType = convert->resultType ? convert->resultType : convert->convert->dataType;
14401 if(exp->destType->casted)
14402 exp->needCast = 1;
14403 if(exp->expType)
14404 exp->expType->refCount++;
14405 }
14406 else
14407 {
14408 exp->expType = convert->resultType ? convert->resultType : MkClassType(convert->convert->_class->fullName);
14409 if(exp->destType->casted)
14410 exp->needCast = 1;
14411 if(convert->resultType)
14412 convert->resultType->refCount++;
14413 }
14414 }
14415 }
14416 if(exp->isConstant && inCompiler)
14417 ComputeExpression(exp);
14418 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Free(&converts, (void *)(FreeConvert));
14419 }
14420 if(!result && exp->expType && converts.count)
14421 {
14422 result = MatchTypes(exp->expType, exp->destType, (((void *)0)), (((void *)0)), (((void *)0)), 1, 1, 0, 0, warnConst);
14423 }
14424 if(!result && exp->expType && exp->destType)
14425 {
14426 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))
14427 result = 1;
14428 }
14429 }
14430 return result;
14431 }
14432
14433 static void ProcessFunction(struct FunctionDefinition *  function);
14434
14435 void ProcessInstantiationType(struct Instantiation * inst)
14436 {
14437 yylloc = inst->loc;
14438 if(inst->_class)
14439 {
14440 struct MembersInit * members;
14441 struct Symbol * classSym;
14442 struct __ecereNameSpace__ecere__com__Class * _class;
14443
14444 classSym = inst->_class->__anon1.__anon1.symbol;
14445 _class = classSym ? classSym->__anon1.registered : (((void *)0));
14446 if(!_class || _class->type != 5)
14447 DeclareStruct(curExternal, inst->_class->__anon1.__anon1.name, 0, 1);
14448 afterExternal = afterExternal ? afterExternal : curExternal;
14449 if(inst->exp)
14450 ProcessExpressionType(inst->exp);
14451 inst->isConstant = 1;
14452 if(inst->members)
14453 {
14454 struct __ecereNameSpace__ecere__com__DataMember * curMember = (((void *)0));
14455 struct __ecereNameSpace__ecere__com__Class * curClass = (((void *)0));
14456 struct __ecereNameSpace__ecere__com__DataMember * subMemberStack[256];
14457 int subMemberStackPos = 0;
14458
14459 for(members = (*inst->members).first; members; members = members->next)
14460 {
14461 switch(members->type)
14462 {
14463 case 1:
14464 {
14465 char name[1024];
14466 static unsigned int instMethodID = 0;
14467 struct External * external = curExternal;
14468 struct Context * context = curContext;
14469 struct Declarator * declarator = members->__anon1.function->declarator;
14470 struct Identifier * nameID = GetDeclId(declarator);
14471 char * unmangled = nameID ? nameID->string : (((void *)0));
14472 struct Expression * exp;
14473 struct External * createdExternal = (((void *)0));
14474
14475 if(inCompiler)
14476 {
14477 char number[16];
14478
14479 strcpy(name, "__ecereInstMeth_");
14480 FullClassNameCat(name, _class ? _class->fullName : "_UNKNOWNCLASS", 0);
14481 strcat(name, "_");
14482 strcat(name, nameID->string);
14483 strcat(name, "_");
14484 sprintf(number, "_%08d", instMethodID++);
14485 strcat(name, number);
14486 nameID->string = __ecereNameSpace__ecere__sys__CopyString(name);
14487 }
14488 if(declarator)
14489 {
14490 struct Symbol * symbol = declarator->symbol;
14491 struct __ecereNameSpace__ecere__com__Method * method = __ecereNameSpace__ecere__com__eClass_FindMethod(_class, unmangled, privateModule);
14492
14493 if(method && method->type == 1)
14494 {
14495 symbol->__anon1.method = method;
14496 ProcessMethodType(method);
14497 if(!symbol->type->__anon1.__anon2.thisClass)
14498 {
14499 if(method->dataType->__anon1.__anon2.thisClass && currentClass && __ecereNameSpace__ecere__com__eClass_IsDerived(currentClass, method->dataType->__anon1.__anon2.thisClass->__anon1.registered))
14500 {
14501 if(!currentClass->symbol)
14502 currentClass->symbol = FindClass(currentClass->fullName);
14503 symbol->type->__anon1.__anon2.thisClass = currentClass->symbol;
14504 }
14505 else
14506 {
14507 if(!_class->symbol)
14508 _class->symbol = FindClass(_class->fullName);
14509 symbol->type->__anon1.__anon2.thisClass = _class->symbol;
14510 }
14511 }
14512 DeclareType(curExternal, symbol->type, 1, 1);
14513 }
14514 else if(classSym)
14515 {
14516 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "couldn't find virtual method %s in class %s\n", (((void *)0))), unmangled, classSym->string);
14517 }
14518 }
14519 createdExternal = ProcessClassFunction(classSym ? classSym->__anon1.registered : (((void *)0)), members->__anon1.function, ast, afterExternal, 1);
14520 if(nameID)
14521 {
14522 FreeSpecifier(nameID->_class);
14523 nameID->_class = (((void *)0));
14524 }
14525 curExternal = createdExternal;
14526 if(inCompiler)
14527 {
14528 if(createdExternal->__anon1.function)
14529 ProcessFunction(createdExternal->__anon1.function);
14530 }
14531 else if(declarator)
14532 {
14533 curExternal = declarator->symbol->__anon2.__anon1.pointerExternal;
14534 ProcessFunction((struct FunctionDefinition *)members->__anon1.function);
14535 }
14536 curExternal = external;
14537 curContext = context;
14538 if(inCompiler)
14539 {
14540 FreeClassFunction(members->__anon1.function);
14541 exp = QMkExpId(name);
14542 members->type = 0;
14543 members->__anon1.dataMembers = MkListOne(MkMemberInit(MkListOne(MkIdentifier(unmangled)), MkInitializerAssignment(exp)));
14544 (__ecereNameSpace__ecere__com__eSystem_Delete(unmangled), unmangled = 0);
14545 }
14546 break;
14547 }
14548 case 0:
14549 {
14550 if(members->__anon1.dataMembers && classSym)
14551 {
14552 struct MemberInit * member;
14553 struct Location oldyyloc = yylloc;
14554
14555 for(member = (*members->__anon1.dataMembers).first; member; member = member->next)
14556 {
14557 ProcessMemberInitData(member, classSym->__anon1.registered, &curClass, &curMember, subMemberStack, &subMemberStackPos);
14558 if(member->initializer && !member->initializer->isConstant)
14559 inst->isConstant = 0;
14560 }
14561 yylloc = oldyyloc;
14562 }
14563 break;
14564 }
14565 }
14566 }
14567 }
14568 }
14569 }
14570
14571 static void ProcessClass(struct __ecereNameSpace__ecere__sys__OldList *  definitions, struct Symbol *  symbol);
14572
14573 static void ProcessSpecifier(struct Specifier * spec, unsigned int declareStruct, unsigned int warnClasses)
14574 {
14575 switch(spec->type)
14576 {
14577 case 0:
14578 {
14579 if(spec->__anon1.specifier == THISCLASS)
14580 {
14581 if(thisClass)
14582 {
14583 spec->type = 1;
14584 spec->__anon1.__anon1.name = ReplaceThisClass(thisClass);
14585 spec->__anon1.__anon1.symbol = FindClass(spec->__anon1.__anon1.name);
14586 ProcessSpecifier(spec, declareStruct, 0);
14587 }
14588 }
14589 break;
14590 }
14591 case 1:
14592 {
14593 struct Symbol * symbol = FindType(curContext, spec->__anon1.__anon1.name);
14594
14595 if(symbol)
14596 DeclareType(curExternal, symbol->type, 1, 1);
14597 else if(spec->__anon1.__anon1.symbol)
14598 {
14599 struct __ecereNameSpace__ecere__com__Class * c = spec->__anon1.__anon1.symbol->__anon1.registered;
14600
14601 if(warnClasses && !c)
14602 Compiler_Warning("Undeclared class %s\n", spec->__anon1.__anon1.name);
14603 DeclareStruct(curExternal, spec->__anon1.__anon1.name, c && c->type == 5, declareStruct && c && c->type == 1);
14604 }
14605 break;
14606 }
14607 case 2:
14608 {
14609 struct Enumerator * e;
14610
14611 if(spec->__anon1.__anon2.list)
14612 {
14613 for(e = (*spec->__anon1.__anon2.list).first; e; e = e->next)
14614 {
14615 if(e->exp)
14616 ProcessExpressionType(e->exp);
14617 }
14618 }
14619 if(inCompiler)
14620 break;
14621 }
14622 case 3:
14623 case 4:
14624 {
14625 if(spec->__anon1.__anon2.definitions)
14626 {
14627 struct Symbol * symbol = spec->__anon1.__anon2.id ? FindClass(spec->__anon1.__anon2.id->string) : (((void *)0));
14628
14629 ProcessClass(spec->__anon1.__anon2.definitions, symbol);
14630 }
14631 break;
14632 }
14633 }
14634 }
14635
14636 static void ProcessDeclarator(struct Declarator * decl, unsigned int isFunction)
14637 {
14638 switch(decl->type)
14639 {
14640 case 1:
14641 if(decl->__anon1.identifier->classSym)
14642 {
14643 FreeSpecifier(decl->__anon1.identifier->_class);
14644 decl->__anon1.identifier->_class = (((void *)0));
14645 }
14646 break;
14647 case 3:
14648 if(decl->__anon1.array.exp)
14649 ProcessExpressionType(decl->__anon1.array.exp);
14650 case 0:
14651 case 2:
14652 case 4:
14653 case 5:
14654 case 6:
14655 case 7:
14656 {
14657 struct Identifier * id = (((void *)0));
14658 struct Specifier * classSpec = (((void *)0));
14659
14660 if(decl->type == 4)
14661 {
14662 id = GetDeclId(decl);
14663 if(id && id->_class)
14664 {
14665 classSpec = id->_class;
14666 id->_class = (((void *)0));
14667 }
14668 }
14669 if(decl->declarator)
14670 ProcessDeclarator(decl->declarator, isFunction);
14671 if(decl->type == 4)
14672 {
14673 if(classSpec)
14674 {
14675 struct TypeName * param = (param = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_TypeName), param->qualifiers = MkListOne(classSpec), param->declarator = (((void *)0)), param);
14676
14677 if(!decl->__anon1.function.parameters)
14678 decl->__anon1.function.parameters = MkList();
14679 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*decl->__anon1.function.parameters), (((void *)0)), param);
14680 }
14681 if(decl->__anon1.function.parameters)
14682 {
14683 struct TypeName * param;
14684
14685 for(param = (*decl->__anon1.function.parameters).first; param; param = param->next)
14686 {
14687 if(param->qualifiers)
14688 {
14689 struct Specifier * spec;
14690
14691 for(spec = (*param->qualifiers).first; spec; spec = spec->next)
14692 {
14693 if(spec->type == 0)
14694 {
14695 if(spec->__anon1.specifier == TYPED_OBJECT)
14696 {
14697 struct Declarator * d = param->declarator;
14698 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);
14699
14700 if(!d || d->type != 5)
14701 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*newParam->qualifiers), (((void *)0)), MkSpecifier(CONST));
14702 FreeList(param->qualifiers, (void *)(FreeSpecifier));
14703 param->qualifiers = MkListOne(MkStructOrUnion(3, MkIdentifier("__ecereNameSpace__ecere__com__Class"), (((void *)0))));
14704 param->declarator = MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), MkDeclaratorIdentifier(MkIdentifier("class")));
14705 DeclareStruct(curExternal, "ecere::com::Class", 0, 1);
14706 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*decl->__anon1.function.parameters), param, newParam);
14707 param = newParam;
14708 break;
14709 }
14710 else if(spec->__anon1.specifier == ANY_OBJECT)
14711 {
14712 struct Declarator * d = param->declarator;
14713
14714 FreeList(param->qualifiers, (void *)(FreeSpecifier));
14715 param->qualifiers = MkListOne(MkSpecifier(VOID));
14716 if(!d || d->type != 5)
14717 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*param->qualifiers), (((void *)0)), MkSpecifier(CONST));
14718 param->declarator = MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), d);
14719 break;
14720 }
14721 else if(spec->__anon1.specifier == THISCLASS)
14722 {
14723 if(thisClass)
14724 {
14725 spec->type = 1;
14726 spec->__anon1.__anon1.name = ReplaceThisClass(thisClass);
14727 spec->__anon1.__anon1.symbol = FindClass(spec->__anon1.__anon1.name);
14728 ProcessSpecifier(spec, 0, 0);
14729 }
14730 break;
14731 }
14732 }
14733 else if(spec->type == 1)
14734 {
14735 ProcessSpecifier(spec, isFunction, 1);
14736 }
14737 else if((spec->type == 3 || spec->type == 4) && !spec->__anon1.__anon2.definitions && spec->__anon1.__anon2.id && spec->__anon1.__anon2.id->string)
14738 {
14739 struct Declarator * d = param->declarator;
14740
14741 if(!d || d->type != 5)
14742 DeclareStruct(curExternal, spec->__anon1.__anon2.id->string, 0, 1);
14743 }
14744 }
14745 }
14746 if(param->declarator)
14747 ProcessDeclarator(param->declarator, 0);
14748 }
14749 }
14750 }
14751 break;
14752 }
14753 }
14754 }
14755
14756 static void ProcessDeclaration(struct Declaration * decl, unsigned int warnClasses)
14757 {
14758 yylloc = decl->loc;
14759 switch(decl->type)
14760 {
14761 case 1:
14762 {
14763 unsigned int declareStruct = 0;
14764
14765 if(decl->__anon1.__anon1.declarators)
14766 {
14767 struct InitDeclarator * d;
14768
14769 for(d = (*decl->__anon1.__anon1.declarators).first; d; d = d->next)
14770 {
14771 struct Type * type, * subType;
14772
14773 ProcessDeclarator(d->declarator, 0);
14774 type = ProcessType(decl->__anon1.__anon1.specifiers, d->declarator);
14775 if(d->initializer)
14776 {
14777 ProcessInitializer(d->initializer, type);
14778 if((*decl->__anon1.__anon1.declarators).count == 1 && d->initializer->type == 0 && d->initializer->__anon1.exp->type == 1)
14779 {
14780 if(type->kind == 8 && type->__anon1._class == d->initializer->__anon1.exp->expType->__anon1._class)
14781 {
14782 struct Instantiation * inst = d->initializer->__anon1.exp->__anon1.instance;
14783
14784 inst->exp = MkExpIdentifier(CopyIdentifier(GetDeclId(d->declarator)));
14785 d->initializer->__anon1.exp->__anon1.instance = (((void *)0));
14786 if(decl->__anon1.__anon1.specifiers)
14787 FreeList(decl->__anon1.__anon1.specifiers, (void *)(FreeSpecifier));
14788 FreeList(decl->__anon1.__anon1.declarators, (void *)(FreeInitDeclarator));
14789 d = (((void *)0));
14790 decl->type = 2;
14791 decl->__anon1.inst = inst;
14792 }
14793 }
14794 }
14795 for(subType = type; subType; )
14796 {
14797 if(subType->kind == 8)
14798 {
14799 declareStruct = 1;
14800 break;
14801 }
14802 else if(subType->kind == 13)
14803 break;
14804 else if(subType->kind == 12)
14805 subType = subType->__anon1.__anon4.arrayType;
14806 else
14807 break;
14808 }
14809 FreeType(type);
14810 if(!d)
14811 break;
14812 }
14813 }
14814 if(decl->__anon1.__anon1.specifiers)
14815 {
14816 struct Specifier * s;
14817
14818 for(s = (*decl->__anon1.__anon1.specifiers).first; s; s = s->next)
14819 {
14820 ProcessSpecifier(s, declareStruct, 1);
14821 }
14822 }
14823 break;
14824 }
14825 case 2:
14826 {
14827 ProcessInstantiationType(decl->__anon1.inst);
14828 break;
14829 }
14830 case 0:
14831 {
14832 struct Specifier * spec;
14833 struct Declarator * d;
14834 unsigned int declareStruct = 0;
14835
14836 if(decl->__anon1.__anon1.declarators)
14837 {
14838 for(d = (*decl->__anon1.__anon1.declarators).first; d; d = d->next)
14839 {
14840 struct Type * type = ProcessType(decl->__anon1.__anon1.specifiers, d->declarator);
14841 struct Type * subType;
14842
14843 ProcessDeclarator(d, 0);
14844 for(subType = type; subType; )
14845 {
14846 if(subType->kind == 8)
14847 {
14848 declareStruct = 1;
14849 break;
14850 }
14851 else if(subType->kind == 13)
14852 break;
14853 else if(subType->kind == 12)
14854 subType = subType->__anon1.__anon4.arrayType;
14855 else
14856 break;
14857 }
14858 FreeType(type);
14859 }
14860 }
14861 if(decl->__anon1.__anon1.specifiers)
14862 {
14863 for(spec = (*decl->__anon1.__anon1.specifiers).first; spec; spec = spec->next)
14864 ProcessSpecifier(spec, declareStruct, warnClasses);
14865 }
14866 break;
14867 }
14868 }
14869 }
14870
14871 static void ProcessStatement(struct Statement * stmt)
14872 {
14873 yylloc = stmt->loc;
14874 switch(stmt->type)
14875 {
14876 case 0:
14877 ProcessStatement(stmt->__anon1.labeled.stmt);
14878 break;
14879 case 1:
14880 if(stmt->__anon1.caseStmt.exp)
14881 {
14882 FreeType(stmt->__anon1.caseStmt.exp->destType);
14883 stmt->__anon1.caseStmt.exp->destType = curSwitchType;
14884 if(curSwitchType)
14885 curSwitchType->refCount++;
14886 ProcessExpressionType(stmt->__anon1.caseStmt.exp);
14887 ComputeExpression(stmt->__anon1.caseStmt.exp);
14888 }
14889 if(stmt->__anon1.caseStmt.stmt)
14890 ProcessStatement(stmt->__anon1.caseStmt.stmt);
14891 break;
14892 case 2:
14893 {
14894 if(stmt->__anon1.compound.context)
14895 {
14896 struct Declaration * decl;
14897 struct Statement * s;
14898 struct Statement * prevCompound = curCompound;
14899 struct Context * prevContext = curContext;
14900
14901 if(!stmt->__anon1.compound.isSwitch)
14902 curCompound = stmt;
14903 curContext = stmt->__anon1.compound.context;
14904 if(stmt->__anon1.compound.declarations)
14905 {
14906 for(decl = (*stmt->__anon1.compound.declarations).first; decl; decl = decl->next)
14907 ProcessDeclaration(decl, 1);
14908 }
14909 if(stmt->__anon1.compound.statements)
14910 {
14911 for(s = (*stmt->__anon1.compound.statements).first; s; s = s->next)
14912 ProcessStatement(s);
14913 }
14914 curContext = prevContext;
14915 curCompound = prevCompound;
14916 }
14917 break;
14918 }
14919 case 3:
14920 {
14921 struct Expression * exp;
14922
14923 if(stmt->__anon1.expressions)
14924 {
14925 for(exp = (*stmt->__anon1.expressions).first; exp; exp = exp->next)
14926 ProcessExpressionType(exp);
14927 }
14928 break;
14929 }
14930 case 4:
14931 {
14932 struct Expression * exp;
14933
14934 FreeType(((struct Expression *)(*stmt->__anon1.ifStmt.exp).last)->destType);
14935 ((struct Expression *)(*stmt->__anon1.ifStmt.exp).last)->destType = MkClassType("bool");
14936 ((struct Expression *)(*stmt->__anon1.ifStmt.exp).last)->destType->truth = 1;
14937 for(exp = (*stmt->__anon1.ifStmt.exp).first; exp; exp = exp->next)
14938 {
14939 ProcessExpressionType(exp);
14940 }
14941 if(stmt->__anon1.ifStmt.stmt)
14942 ProcessStatement(stmt->__anon1.ifStmt.stmt);
14943 if(stmt->__anon1.ifStmt.elseStmt)
14944 ProcessStatement(stmt->__anon1.ifStmt.elseStmt);
14945 break;
14946 }
14947 case 5:
14948 {
14949 struct Type * oldSwitchType = curSwitchType;
14950
14951 if(stmt->__anon1.switchStmt.exp)
14952 {
14953 struct Expression * exp;
14954
14955 for(exp = (*stmt->__anon1.switchStmt.exp).first; exp; exp = exp->next)
14956 {
14957 if(!exp->next)
14958 {
14959 ProcessExpressionType(exp);
14960 }
14961 if(!exp->next)
14962 curSwitchType = exp->expType;
14963 }
14964 }
14965 ProcessStatement(stmt->__anon1.switchStmt.stmt);
14966 curSwitchType = oldSwitchType;
14967 break;
14968 }
14969 case 6:
14970 {
14971 if(stmt->__anon1.whileStmt.exp)
14972 {
14973 struct Expression * exp;
14974
14975 FreeType(((struct Expression *)(*stmt->__anon1.whileStmt.exp).last)->destType);
14976 ((struct Expression *)(*stmt->__anon1.whileStmt.exp).last)->destType = MkClassType("bool");
14977 ((struct Expression *)(*stmt->__anon1.whileStmt.exp).last)->destType->truth = 1;
14978 for(exp = (*stmt->__anon1.whileStmt.exp).first; exp; exp = exp->next)
14979 {
14980 ProcessExpressionType(exp);
14981 }
14982 }
14983 if(stmt->__anon1.whileStmt.stmt)
14984 ProcessStatement(stmt->__anon1.whileStmt.stmt);
14985 break;
14986 }
14987 case 7:
14988 {
14989 if(stmt->__anon1.doWhile.exp)
14990 {
14991 struct Expression * exp;
14992
14993 if((*stmt->__anon1.doWhile.exp).last)
14994 {
14995 FreeType(((struct Expression *)(*stmt->__anon1.doWhile.exp).last)->destType);
14996 ((struct Expression *)(*stmt->__anon1.doWhile.exp).last)->destType = MkClassType("bool");
14997 ((struct Expression *)(*stmt->__anon1.doWhile.exp).last)->destType->truth = 1;
14998 }
14999 for(exp = (*stmt->__anon1.doWhile.exp).first; exp; exp = exp->next)
15000 {
15001 ProcessExpressionType(exp);
15002 }
15003 }
15004 if(stmt->__anon1.doWhile.stmt)
15005 ProcessStatement(stmt->__anon1.doWhile.stmt);
15006 break;
15007 }
15008 case 8:
15009 {
15010 struct Expression * exp;
15011
15012 if(stmt->__anon1.forStmt.init)
15013 ProcessStatement(stmt->__anon1.forStmt.init);
15014 if(stmt->__anon1.forStmt.check && stmt->__anon1.forStmt.check->__anon1.expressions)
15015 {
15016 FreeType(((struct Expression *)(*stmt->__anon1.forStmt.check->__anon1.expressions).last)->destType);
15017 ((struct Expression *)(*stmt->__anon1.forStmt.check->__anon1.expressions).last)->destType = MkClassType("bool");
15018 ((struct Expression *)(*stmt->__anon1.forStmt.check->__anon1.expressions).last)->destType->truth = 1;
15019 }
15020 if(stmt->__anon1.forStmt.check)
15021 ProcessStatement(stmt->__anon1.forStmt.check);
15022 if(stmt->__anon1.forStmt.increment)
15023 {
15024 for(exp = (*stmt->__anon1.forStmt.increment).first; exp; exp = exp->next)
15025 ProcessExpressionType(exp);
15026 }
15027 if(stmt->__anon1.forStmt.stmt)
15028 ProcessStatement(stmt->__anon1.forStmt.stmt);
15029 break;
15030 }
15031 case 18:
15032 {
15033 struct Identifier * id = stmt->__anon1.forEachStmt.id;
15034 struct __ecereNameSpace__ecere__sys__OldList * exp = stmt->__anon1.forEachStmt.exp;
15035 struct __ecereNameSpace__ecere__sys__OldList * filter = stmt->__anon1.forEachStmt.filter;
15036 struct Statement * block = stmt->__anon1.forEachStmt.stmt;
15037 char iteratorType[1024];
15038 struct Type * source;
15039 struct Expression * e;
15040 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));
15041 struct Expression * arrayExp;
15042 const char * typeString = (((void *)0));
15043 int builtinCount = 0;
15044
15045 for(e = exp ? (*exp).first : (((void *)0)); e; e = e->next)
15046 {
15047 if(!e->next)
15048 {
15049 FreeType(e->destType);
15050 e->destType = ProcessTypeString("Container", 0);
15051 }
15052 if(!isBuiltin || e->next)
15053 ProcessExpressionType(e);
15054 }
15055 source = (exp && (*exp).last) ? ((struct Expression *)(*exp).last)->expType : (((void *)0));
15056 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)))
15057 {
15058 struct __ecereNameSpace__ecere__com__Class * _class = source ? source->__anon1._class->__anon1.registered : (((void *)0));
15059 struct Symbol * symbol;
15060 struct Expression * expIt = (((void *)0));
15061 unsigned int isMap = 0, isArray = 0, isLinkList = 0, isList = 0, isCustomAVLTree = 0;
15062 struct __ecereNameSpace__ecere__com__Class * arrayClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "Array");
15063 struct __ecereNameSpace__ecere__com__Class * linkListClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "LinkList");
15064 struct __ecereNameSpace__ecere__com__Class * customAVLTreeClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "CustomAVLTree");
15065
15066 if(inCompiler)
15067 {
15068 stmt->type = 2;
15069 stmt->__anon1.compound.context = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Context);
15070 stmt->__anon1.compound.context->parent = curContext;
15071 curContext = stmt->__anon1.compound.context;
15072 }
15073 if(source && __ecereNameSpace__ecere__com__eClass_IsDerived(source->__anon1._class->__anon1.registered, customAVLTreeClass))
15074 {
15075 struct __ecereNameSpace__ecere__com__Class * mapClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "Map");
15076
15077 isCustomAVLTree = 1;
15078 if(__ecereNameSpace__ecere__com__eClass_IsDerived(source->__anon1._class->__anon1.registered, mapClass))
15079 isMap = 1;
15080 }
15081 else if(source && __ecereNameSpace__ecere__com__eClass_IsDerived(source->__anon1._class->__anon1.registered, arrayClass))
15082 isArray = 1;
15083 else if(source && __ecereNameSpace__ecere__com__eClass_IsDerived(source->__anon1._class->__anon1.registered, linkListClass))
15084 {
15085 struct __ecereNameSpace__ecere__com__Class * listClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "List");
15086
15087 isLinkList = 1;
15088 isList = __ecereNameSpace__ecere__com__eClass_IsDerived(source->__anon1._class->__anon1.registered, listClass);
15089 }
15090 if(inCompiler && isArray)
15091 {
15092 struct Declarator * decl;
15093 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
15094
15095 decl = SpecDeclFromString(_class->templateArgs[2].__anon1.__anon1.dataTypeString, specs, MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), MkDeclaratorIdentifier(id)));
15096 stmt->__anon1.compound.declarations = MkListOne(MkDeclaration(specs, MkListOne(MkInitDeclarator(decl, (((void *)0))))));
15097 ListAdd(stmt->__anon1.compound.declarations, MkDeclaration(MkListOne(MkSpecifierName(source->__anon1._class->__anon1.registered->fullName)), MkListOne(MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier("__internalArray")), MkInitializerAssignment(MkExpBrackets(exp))))));
15098 }
15099 else if(isBuiltin)
15100 {
15101 struct Type * type = (((void *)0));
15102 char typeStringBuf[1024];
15103
15104 arrayExp = (((struct Expression *)(*exp).last)->type == 35) ? (struct Expression *)(*exp).last : ((struct Expression *)(*exp).last)->__anon1.cast.exp;
15105 if(((struct Expression *)(*exp).last)->type == 11)
15106 {
15107 struct TypeName * typeName = ((struct Expression *)(*exp).last)->__anon1.cast.typeName;
15108
15109 if(typeName)
15110 arrayExp->destType = ProcessType(typeName->qualifiers, typeName->declarator);
15111 }
15112 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)
15113 {
15114 struct __ecereNameSpace__ecere__com__Class * templateClass = arrayExp->destType->__anon1._class->__anon1.registered;
15115
15116 typeString = templateClass->templateArgs[2].__anon1.__anon1.dataTypeString;
15117 }
15118 else if(arrayExp->__anon1.list)
15119 {
15120 struct Expression * e;
15121
15122 for(e = (*arrayExp->__anon1.list).first; e; e = e->next)
15123 {
15124 ProcessExpressionType(e);
15125 if(e->expType)
15126 {
15127 if(!type)
15128 {
15129 type = e->expType;
15130 type->refCount++;
15131 }
15132 else
15133 {
15134 if(!MatchTypeExpression(e, type, (((void *)0)), 0, 1))
15135 {
15136 FreeType(type);
15137 type = e->expType;
15138 e->expType = (((void *)0));
15139 e = (*arrayExp->__anon1.list).first;
15140 ProcessExpressionType(e);
15141 if(e->expType)
15142 {
15143 if(!MatchTypeExpression(e, type, (((void *)0)), 0, 1))
15144 {
15145 FreeType(e->expType);
15146 e->expType = (((void *)0));
15147 FreeType(type);
15148 type = (((void *)0));
15149 break;
15150 }
15151 }
15152 }
15153 }
15154 if(e->expType)
15155 {
15156 FreeType(e->expType);
15157 e->expType = (((void *)0));
15158 }
15159 }
15160 }
15161 if(type)
15162 {
15163 typeStringBuf[0] = '\0';
15164 PrintType(type, typeStringBuf, 0, 1);
15165 typeString = typeStringBuf;
15166 FreeType(type);
15167 }
15168 }
15169 if(typeString)
15170 {
15171 if(inCompiler)
15172 {
15173 struct __ecereNameSpace__ecere__sys__OldList * initializers = MkList();
15174 struct Declarator * decl;
15175 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
15176
15177 if(arrayExp->__anon1.list)
15178 {
15179 struct Expression * e;
15180
15181 builtinCount = (*arrayExp->__anon1.list).count;
15182 type = ProcessTypeString(typeString, 0);
15183 while((e = (*arrayExp->__anon1.list).first))
15184 {
15185 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove((&*arrayExp->__anon1.list), e);
15186 e->destType = type;
15187 type->refCount++;
15188 ProcessExpressionType(e);
15189 if(inCompiler)
15190 ListAdd(initializers, MkInitializerAssignment(e));
15191 }
15192 FreeType(type);
15193 (__ecereNameSpace__ecere__com__eSystem_Delete(arrayExp->__anon1.list), arrayExp->__anon1.list = 0);
15194 }
15195 decl = SpecDeclFromString(typeString, specs, MkDeclaratorIdentifier(id));
15196 stmt->__anon1.compound.declarations = MkListOne(MkDeclaration(CopyList(specs, (void *)(CopySpecifier)), MkListOne(MkInitDeclarator(MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), decl), (((void *)0))))));
15197 ListAdd(stmt->__anon1.compound.declarations, MkDeclaration(specs, MkListOne(MkInitDeclarator(PlugDeclarator(decl, MkDeclaratorArray(MkDeclaratorIdentifier(MkIdentifier("__internalArray")), (((void *)0)))), MkInitializerList(initializers)))));
15198 FreeList(exp, (void *)(FreeExpression));
15199 }
15200 else if(arrayExp->__anon1.list)
15201 {
15202 struct Expression * e;
15203
15204 type = ProcessTypeString(typeString, 0);
15205 for(e = (*arrayExp->__anon1.list).first; e; e = e->next)
15206 {
15207 e->destType = type;
15208 type->refCount++;
15209 ProcessExpressionType(e);
15210 }
15211 FreeType(type);
15212 }
15213 }
15214 else
15215 {
15216 arrayExp->expType = ProcessTypeString("Container", 0);
15217 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Couldn't determine type of array elements\n", (((void *)0))));
15218 }
15219 }
15220 else if(inCompiler && isLinkList && !isList)
15221 {
15222 struct Declarator * decl;
15223 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
15224
15225 decl = SpecDeclFromString(_class->templateArgs[3].__anon1.__anon1.dataTypeString, specs, MkDeclaratorIdentifier(id));
15226 stmt->__anon1.compound.declarations = MkListOne(MkDeclaration(specs, MkListOne(MkInitDeclarator(decl, (((void *)0))))));
15227 ListAdd(stmt->__anon1.compound.declarations, MkDeclaration(MkListOne(MkSpecifierName(source->__anon1._class->__anon1.registered->fullName)), MkListOne(MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier("__internalLinkList")), MkInitializerAssignment(MkExpBrackets(exp))))));
15228 }
15229 else if(inCompiler && _class->templateArgs)
15230 {
15231 if(isMap)
15232 sprintf(iteratorType, "MapIterator<%s, %s >", _class->templateArgs[5].__anon1.__anon1.dataTypeString, _class->templateArgs[6].__anon1.__anon1.dataTypeString);
15233 else
15234 sprintf(iteratorType, "Iterator<%s, %s >", _class->templateArgs[2].__anon1.__anon1.dataTypeString, _class->templateArgs[1].__anon1.__anon1.dataTypeString);
15235 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)))))))));
15236 }
15237 if(inCompiler)
15238 {
15239 symbol = FindSymbol(id->string, curContext, curContext, 0, 0);
15240 if(block)
15241 {
15242 switch(block->type)
15243 {
15244 case 2:
15245 if(block->__anon1.compound.context)
15246 block->__anon1.compound.context->parent = stmt->__anon1.compound.context;
15247 break;
15248 case 4:
15249 if(block->__anon1.ifStmt.stmt && block->__anon1.ifStmt.stmt->type == 2 && block->__anon1.ifStmt.stmt->__anon1.compound.context)
15250 block->__anon1.ifStmt.stmt->__anon1.compound.context->parent = stmt->__anon1.compound.context;
15251 if(block->__anon1.ifStmt.elseStmt && block->__anon1.ifStmt.elseStmt->type == 2 && block->__anon1.ifStmt.elseStmt->__anon1.compound.context)
15252 block->__anon1.ifStmt.elseStmt->__anon1.compound.context->parent = stmt->__anon1.compound.context;
15253 break;
15254 case 5:
15255 if(block->__anon1.switchStmt.stmt && block->__anon1.switchStmt.stmt->type == 2 && block->__anon1.switchStmt.stmt->__anon1.compound.context)
15256 block->__anon1.switchStmt.stmt->__anon1.compound.context->parent = stmt->__anon1.compound.context;
15257 break;
15258 case 6:
15259 if(block->__anon1.whileStmt.stmt && block->__anon1.whileStmt.stmt->type == 2 && block->__anon1.whileStmt.stmt->__anon1.compound.context)
15260 block->__anon1.whileStmt.stmt->__anon1.compound.context->parent = stmt->__anon1.compound.context;
15261 break;
15262 case 7:
15263 if(block->__anon1.doWhile.stmt && block->__anon1.doWhile.stmt->type == 2 && block->__anon1.doWhile.stmt->__anon1.compound.context)
15264 block->__anon1.doWhile.stmt->__anon1.compound.context->parent = stmt->__anon1.compound.context;
15265 break;
15266 case 8:
15267 if(block->__anon1.forStmt.stmt && block->__anon1.forStmt.stmt->type == 2 && block->__anon1.forStmt.stmt->__anon1.compound.context)
15268 block->__anon1.forStmt.stmt->__anon1.compound.context->parent = stmt->__anon1.compound.context;
15269 break;
15270 case 18:
15271 if(block->__anon1.forEachStmt.stmt && block->__anon1.forEachStmt.stmt->type == 2 && block->__anon1.forEachStmt.stmt->__anon1.compound.context)
15272 block->__anon1.forEachStmt.stmt->__anon1.compound.context->parent = stmt->__anon1.compound.context;
15273 break;
15274 }
15275 }
15276 if(filter)
15277 {
15278 block = MkIfStmt(filter, block, (((void *)0)));
15279 }
15280 if(isArray)
15281 {
15282 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));
15283 ProcessStatement(((struct Statement *)(*stmt->__anon1.compound.statements).first)->__anon1.forStmt.init);
15284 ProcessStatement(((struct Statement *)(*stmt->__anon1.compound.statements).first)->__anon1.forStmt.check);
15285 ProcessExpressionType((*((struct Statement *)(*stmt->__anon1.compound.statements).first)->__anon1.forStmt.increment).first);
15286 }
15287 else if(isBuiltin)
15288 {
15289 char count[128];
15290
15291 sprintf(count, "%d", builtinCount);
15292 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));
15293 ProcessStatement(((struct Statement *)(*stmt->__anon1.compound.statements).first)->__anon1.forStmt.init);
15294 ProcessStatement(((struct Statement *)(*stmt->__anon1.compound.statements).first)->__anon1.forStmt.check);
15295 ProcessExpressionType((*((struct Statement *)(*stmt->__anon1.compound.statements).first)->__anon1.forStmt.increment).first);
15296 }
15297 else if(isLinkList && !isList)
15298 {
15299 struct __ecereNameSpace__ecere__com__Class * typeClass = __ecereNameSpace__ecere__com__eSystem_FindClass(_class->module, _class->templateArgs[3].__anon1.__anon1.dataTypeString);
15300 struct __ecereNameSpace__ecere__com__Class * listItemClass = __ecereNameSpace__ecere__com__eSystem_FindClass(_class->module, "ListItem");
15301
15302 if(typeClass && __ecereNameSpace__ecere__com__eClass_IsDerived(typeClass, listItemClass) && _class->templateArgs[5].__anon1.__anon1.dataTypeString && !strcmp(_class->templateArgs[5].__anon1.__anon1.dataTypeString, "LT::link"))
15303 {
15304 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));
15305 }
15306 else
15307 {
15308 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
15309 struct Declarator * decl = SpecDeclFromString(_class->templateArgs[3].__anon1.__anon1.dataTypeString, specs, (((void *)0)));
15310
15311 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));
15312 }
15313 ProcessStatement(((struct Statement *)(*stmt->__anon1.compound.statements).first)->__anon1.forStmt.init);
15314 ProcessStatement(((struct Statement *)(*stmt->__anon1.compound.statements).first)->__anon1.forStmt.check);
15315 ProcessExpressionType((*((struct Statement *)(*stmt->__anon1.compound.statements).first)->__anon1.forStmt.increment).first);
15316 }
15317 else
15318 {
15319 stmt->__anon1.compound.statements = MkListOne(MkWhileStmt(MkListOne(MkExpCall(MkExpMember(expIt = MkExpIdentifier(CopyIdentifier(id)), MkIdentifier("Next")), (((void *)0)))), block));
15320 }
15321 ProcessExpressionType(expIt);
15322 if((*stmt->__anon1.compound.declarations).first)
15323 ProcessDeclaration((*stmt->__anon1.compound.declarations).first, 1);
15324 if(symbol)
15325 symbol->isIterator = isMap ? 2 : ((isArray || isBuiltin) ? 3 : (isLinkList ? (isList ? 5 : 4) : (isCustomAVLTree ? 6 : 1)));
15326 ProcessStatement(stmt);
15327 }
15328 else
15329 ProcessStatement(stmt->__anon1.forEachStmt.stmt);
15330 if(inCompiler)
15331 curContext = stmt->__anon1.compound.context->parent;
15332 break;
15333 }
15334 else
15335 {
15336 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Expression is not a container\n", (((void *)0))));
15337 }
15338 break;
15339 }
15340 case 9:
15341 break;
15342 case 10:
15343 break;
15344 case 11:
15345 break;
15346 case 12:
15347 {
15348 struct Expression * exp;
15349
15350 if(stmt->__anon1.expressions)
15351 {
15352 for(exp = (*stmt->__anon1.expressions).first; exp; exp = exp->next)
15353 {
15354 if(!exp->next)
15355 {
15356 if(curFunction && !curFunction->type)
15357 curFunction->type = ProcessType(curFunction->specifiers, curFunction->declarator);
15358 FreeType(exp->destType);
15359 exp->destType = (curFunction && curFunction->type && curFunction->type->kind == 11) ? curFunction->type->__anon1.__anon2.returnType : (((void *)0));
15360 if(exp->destType)
15361 exp->destType->refCount++;
15362 }
15363 ProcessExpressionType(exp);
15364 }
15365 }
15366 break;
15367 }
15368 case 14:
15369 {
15370 ProcessDeclaration(stmt->__anon1.decl, 1);
15371 break;
15372 }
15373 case 13:
15374 {
15375 struct AsmField * field;
15376
15377 if(stmt->__anon1.asmStmt.inputFields)
15378 {
15379 for(field = (*stmt->__anon1.asmStmt.inputFields).first; field; field = field->next)
15380 if(field->expression)
15381 ProcessExpressionType(field->expression);
15382 }
15383 if(stmt->__anon1.asmStmt.outputFields)
15384 {
15385 for(field = (*stmt->__anon1.asmStmt.outputFields).first; field; field = field->next)
15386 if(field->expression)
15387 ProcessExpressionType(field->expression);
15388 }
15389 if(stmt->__anon1.asmStmt.clobberedFields)
15390 {
15391 for(field = (*stmt->__anon1.asmStmt.clobberedFields).first; field; field = field->next)
15392 {
15393 if(field->expression)
15394 ProcessExpressionType(field->expression);
15395 }
15396 }
15397 break;
15398 }
15399 case 17:
15400 {
15401 struct PropertyWatch * propWatch;
15402 struct __ecereNameSpace__ecere__sys__OldList * watches = stmt->__anon1._watch.watches;
15403 struct Expression * object = stmt->__anon1._watch.object;
15404 struct Expression * watcher = stmt->__anon1._watch.watcher;
15405
15406 if(watcher)
15407 ProcessExpressionType(watcher);
15408 if(object)
15409 ProcessExpressionType(object);
15410 if(inCompiler)
15411 {
15412 if(watcher || thisClass)
15413 {
15414 struct External * external = curExternal;
15415 struct Context * context = curContext;
15416
15417 stmt->type = 3;
15418 stmt->__anon1.expressions = MkList();
15419 for(propWatch = (*watches).first; propWatch; propWatch = propWatch->next)
15420 {
15421 struct ClassFunction * func;
15422 char watcherName[1024];
15423 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;
15424 struct External * createdExternal;
15425
15426 sprintf(watcherName, "__ecerePropertyWatcher_%d", propWatcherID++);
15427 if(propWatch->deleteWatch)
15428 strcat(watcherName, "_delete");
15429 else
15430 {
15431 struct Identifier * propID;
15432
15433 for(propID = (*propWatch->properties).first; propID; propID = propID->next)
15434 {
15435 strcat(watcherName, "_");
15436 strcat(watcherName, propID->string);
15437 }
15438 }
15439 if(object && object->expType && object->expType->kind == 8 && object->expType->__anon1._class && object->expType->__anon1._class->__anon1.registered)
15440 {
15441 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)));
15442 ProcessClassFunctionBody(func, propWatch->compound);
15443 propWatch->compound = (((void *)0));
15444 createdExternal = ProcessClassFunction(watcherClass, func, ast, curExternal, 1);
15445 FreeClassFunction(func);
15446 curExternal = createdExternal;
15447 ProcessFunction(createdExternal->__anon1.function);
15448 if(propWatch->deleteWatch)
15449 {
15450 struct __ecereNameSpace__ecere__sys__OldList * args = MkList();
15451
15452 ListAdd(args, CopyExpression(object));
15453 ListAdd(args, watcher ? CopyExpression(watcher) : MkExpIdentifier(MkIdentifier("this")));
15454 ListAdd(args, MkExpIdentifier(MkIdentifier(watcherName)));
15455 ListAdd(stmt->__anon1.expressions, MkExpCall(MkExpIdentifier(MkIdentifier("ecere::com::eInstance_WatchDestruction")), args));
15456 }
15457 else
15458 {
15459 struct __ecereNameSpace__ecere__com__Class * _class = object->expType->__anon1._class->__anon1.registered;
15460 struct Identifier * propID;
15461
15462 for(propID = (*propWatch->properties).first; propID; propID = propID->next)
15463 {
15464 char propName[1024];
15465 struct __ecereNameSpace__ecere__com__Property * prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, propID->string, privateModule);
15466
15467 if(prop)
15468 {
15469 char getName[1024], setName[1024];
15470 struct __ecereNameSpace__ecere__sys__OldList * args = MkList();
15471
15472 DeclareProperty(createdExternal, prop, setName, getName);
15473 strcpy(propName, "__ecereProp_");
15474 FullClassNameCat(propName, prop->_class->fullName, 0);
15475 strcat(propName, "_");
15476 FullClassNameCat(propName, prop->name, 1);
15477 ListAdd(args, CopyExpression(object));
15478 ListAdd(args, MkExpIdentifier(MkIdentifier(propName)));
15479 ListAdd(args, watcher ? CopyExpression(watcher) : MkExpIdentifier(MkIdentifier("this")));
15480 ListAdd(args, MkExpCast(MkTypeName(MkListOne(MkSpecifier(VOID)), MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), (((void *)0)))), MkExpIdentifier(MkIdentifier(watcherName))));
15481 ListAdd(stmt->__anon1.expressions, MkExpCall(MkExpIdentifier(MkIdentifier("ecere::com::eInstance_Watch")), args));
15482 __ecereMethod_External_CreateUniqueEdge(external, createdExternal, 1);
15483 }
15484 else
15485 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Property %s not found in class %s\n", (((void *)0))), propID->string, _class->fullName);
15486 }
15487 }
15488 }
15489 else
15490 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Invalid watched object\n", (((void *)0))));
15491 }
15492 curExternal = external;
15493 curContext = context;
15494 if(watcher)
15495 FreeExpression(watcher);
15496 if(object)
15497 FreeExpression(object);
15498 FreeList(watches, (void *)(FreePropertyWatch));
15499 }
15500 else
15501 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "No observer specified and not inside a class\n", (((void *)0))));
15502 }
15503 else
15504 {
15505 for(propWatch = (*watches).first; propWatch; propWatch = propWatch->next)
15506 {
15507 ProcessStatement(propWatch->compound);
15508 }
15509 }
15510 break;
15511 }
15512 case 15:
15513 {
15514 struct __ecereNameSpace__ecere__sys__OldList * watches = stmt->__anon1._watch.watches;
15515 struct Expression * object = stmt->__anon1._watch.object;
15516 struct __ecereNameSpace__ecere__com__Class * _class;
15517
15518 if(object)
15519 ProcessExpressionType(object);
15520 if(inCompiler)
15521 {
15522 _class = object ? ((object->expType && object->expType->kind == 8 && object->expType->__anon1._class) ? object->expType->__anon1._class->__anon1.registered : (((void *)0))) : thisClass;
15523 if(_class)
15524 {
15525 struct Identifier * propID;
15526
15527 stmt->type = 3;
15528 stmt->__anon1.expressions = MkList();
15529 if(!watches && curFunction->propSet && (!object || (object->type == 0 && !strcmp(object->__anon1.__anon1.identifier->string, "this"))))
15530 {
15531 watches = MkListOne(MkIdentifier(curFunction->propSet->string));
15532 }
15533 else if(!watches)
15534 {
15535 }
15536 if(watches)
15537 {
15538 for(propID = (*watches).first; propID; propID = propID->next)
15539 {
15540 struct __ecereNameSpace__ecere__com__Property * prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, propID->string, privateModule);
15541
15542 if(prop)
15543 {
15544 CreateFireWatcher(prop, object, stmt);
15545 }
15546 else
15547 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Property %s not found in class %s\n", (((void *)0))), propID->string, _class->fullName);
15548 }
15549 }
15550 else
15551 {
15552 struct __ecereNameSpace__ecere__com__Property * prop;
15553 struct __ecereNameSpace__ecere__com__Class * base;
15554
15555 for(base = _class; base; base = base->base)
15556 {
15557 for(prop = base->membersAndProperties.first; prop; prop = prop->next)
15558 {
15559 if(prop->isProperty && prop->isWatchable)
15560 {
15561 CreateFireWatcher(prop, object, stmt);
15562 }
15563 }
15564 }
15565 }
15566 if(object)
15567 FreeExpression(object);
15568 FreeList(watches, (void *)(FreeIdentifier));
15569 }
15570 else
15571 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Invalid object specified and not inside a class\n", (((void *)0))));
15572 }
15573 break;
15574 }
15575 case 16:
15576 {
15577 struct __ecereNameSpace__ecere__sys__OldList * watches = stmt->__anon1._watch.watches;
15578 struct Expression * object = stmt->__anon1._watch.object;
15579 struct Expression * watcher = stmt->__anon1._watch.watcher;
15580 struct __ecereNameSpace__ecere__com__Class * _class;
15581
15582 if(object)
15583 ProcessExpressionType(object);
15584 if(watcher)
15585 ProcessExpressionType(watcher);
15586 if(inCompiler)
15587 {
15588 _class = (object && object->expType && object->expType->kind == 8 && object->expType->__anon1._class) ? object->expType->__anon1._class->__anon1.registered : (((void *)0));
15589 if(watcher || thisClass)
15590 {
15591 if(_class)
15592 {
15593 struct Identifier * propID;
15594
15595 stmt->type = 3;
15596 stmt->__anon1.expressions = MkList();
15597 if(!watches)
15598 {
15599 struct __ecereNameSpace__ecere__sys__OldList * args;
15600
15601 args = MkList();
15602 ListAdd(args, CopyExpression(object));
15603 ListAdd(args, MkExpConstant("0"));
15604 ListAdd(args, watcher ? CopyExpression(watcher) : MkExpIdentifier(MkIdentifier("this")));
15605 ListAdd(stmt->__anon1.expressions, MkExpCall(MkExpIdentifier(MkIdentifier("ecere::com::eInstance_StopWatching")), args));
15606 }
15607 else
15608 {
15609 for(propID = (*watches).first; propID; propID = propID->next)
15610 {
15611 char propName[1024];
15612 struct __ecereNameSpace__ecere__com__Property * prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, propID->string, privateModule);
15613
15614 if(prop)
15615 {
15616 char getName[1024], setName[1024];
15617 struct __ecereNameSpace__ecere__sys__OldList * args = MkList();
15618
15619 DeclareProperty(curExternal, prop, setName, getName);
15620 strcpy(propName, "__ecereProp_");
15621 FullClassNameCat(propName, prop->_class->fullName, 0);
15622 strcat(propName, "_");
15623 FullClassNameCat(propName, prop->name, 1);
15624 ListAdd(args, CopyExpression(object));
15625 ListAdd(args, MkExpIdentifier(MkIdentifier(propName)));
15626 ListAdd(args, watcher ? CopyExpression(watcher) : MkExpIdentifier(MkIdentifier("this")));
15627 ListAdd(stmt->__anon1.expressions, MkExpCall(MkExpIdentifier(MkIdentifier("ecere::com::eInstance_StopWatching")), args));
15628 }
15629 else
15630 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Property %s not found in class %s\n", (((void *)0))), propID->string, _class->fullName);
15631 }
15632 }
15633 if(object)
15634 FreeExpression(object);
15635 if(watcher)
15636 FreeExpression(watcher);
15637 FreeList(watches, (void *)(FreeIdentifier));
15638 }
15639 else
15640 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Invalid object specified and not inside a class\n", (((void *)0))));
15641 }
15642 else
15643 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "No observer specified and not inside a class\n", (((void *)0))));
15644 }
15645 break;
15646 }
15647 }
15648 }
15649
15650 void ComputeDataTypes()
15651 {
15652 struct External * external;
15653
15654 currentClass = (((void *)0));
15655 containerClass = __ecereNameSpace__ecere__com__eSystem_FindClass(GetPrivateModule(), "Container");
15656 DeclareStruct((((void *)0)), "ecere::com::Class", 0, 1);
15657 DeclareStruct((((void *)0)), "ecere::com::Instance", 0, 1);
15658 DeclareStruct((((void *)0)), "ecere::com::Property", 0, 1);
15659 DeclareStruct((((void *)0)), "ecere::com::DataMember", 0, 1);
15660 DeclareStruct((((void *)0)), "ecere::com::Method", 0, 1);
15661 DeclareStruct((((void *)0)), "ecere::com::SerialBuffer", 0, 1);
15662 DeclareStruct((((void *)0)), "ecere::com::ClassTemplateArgument", 0, 1);
15663 DeclareFunctionUtil((((void *)0)), "eSystem_New");
15664 DeclareFunctionUtil((((void *)0)), "eSystem_New0");
15665 DeclareFunctionUtil((((void *)0)), "eSystem_Renew");
15666 DeclareFunctionUtil((((void *)0)), "eSystem_Renew0");
15667 DeclareFunctionUtil((((void *)0)), "eSystem_Delete");
15668 DeclareFunctionUtil((((void *)0)), "eClass_GetProperty");
15669 DeclareFunctionUtil((((void *)0)), "eClass_SetProperty");
15670 DeclareFunctionUtil((((void *)0)), "eInstance_FireSelfWatchers");
15671 DeclareFunctionUtil((((void *)0)), "eInstance_SetMethod");
15672 DeclareFunctionUtil((((void *)0)), "eInstance_IncRef");
15673 DeclareFunctionUtil((((void *)0)), "eInstance_StopWatching");
15674 DeclareFunctionUtil((((void *)0)), "eInstance_Watch");
15675 DeclareFunctionUtil((((void *)0)), "eInstance_FireWatchers");
15676 reachedPass15 = 1;
15677 for(external = (*ast).first; external; external = external->next)
15678 {
15679 afterExternal = curExternal = external;
15680 if(external->type == 0)
15681 {
15682 if(memoryGuard)
15683 {
15684 DeclareFunctionUtil(external, "MemoryGuard_PushLoc");
15685 DeclareFunctionUtil(external, "MemoryGuard_PopLoc");
15686 }
15687 currentClass = external->__anon1.function->_class;
15688 ProcessFunction(external->__anon1.function);
15689 }
15690 else if(external->type == 1)
15691 {
15692 if(memoryGuard && external->__anon1.declaration && external->__anon1.declaration->type == 2)
15693 {
15694 DeclareFunctionUtil(external, "MemoryGuard_PushLoc");
15695 DeclareFunctionUtil(external, "MemoryGuard_PopLoc");
15696 }
15697 currentClass = (((void *)0));
15698 if(external->__anon1.declaration)
15699 ProcessDeclaration(external->__anon1.declaration, 1);
15700 }
15701 else if(external->type == 2)
15702 {
15703 struct ClassDefinition * _class = external->__anon1._class;
15704
15705 currentClass = external->symbol->__anon1.registered;
15706 if(memoryGuard)
15707 {
15708 DeclareFunctionUtil(external, "MemoryGuard_PushLoc");
15709 DeclareFunctionUtil(external, "MemoryGuard_PopLoc");
15710 }
15711 if(_class->definitions)
15712 {
15713 ProcessClass(_class->definitions, _class->symbol);
15714 }
15715 if(inCompiler)
15716 {
15717 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove((&*ast), external);
15718 ((external ? (__ecereClass_External->Destructor ? __ecereClass_External->Destructor((void *)external) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(external)) : 0), external = 0);
15719 }
15720 }
15721 else if(external->type == 4)
15722 {
15723 thisNameSpace = external->__anon1.id->string;
15724 }
15725 }
15726 currentClass = (((void *)0));
15727 thisNameSpace = (((void *)0));
15728 curExternal = (((void *)0));
15729 }
15730
15731 void ProcessExpressionType(struct Expression * exp)
15732 {
15733 unsigned int unresolved = 0;
15734 struct Location oldyylloc = yylloc;
15735 unsigned int notByReference = 0;
15736
15737 if(!exp || exp->expType)
15738 return ;
15739 yylloc = exp->loc;
15740 switch(exp->type)
15741 {
15742 case 0:
15743 {
15744 struct Identifier * id = exp->__anon1.__anon1.identifier;
15745
15746 if(!id || !topContext)
15747 return ;
15748 if(id->_class && id->_class->__anon1.__anon1.name)
15749 {
15750 id->classSym = id->_class->__anon1.__anon1.symbol;
15751 }
15752 if(!strcmp(id->string, "__runtimePlatform"))
15753 {
15754 exp->expType = ProcessTypeString("ecere::com::Platform", 1);
15755 break;
15756 }
15757 else if(strstr(id->string, "__ecereClass") == id->string)
15758 {
15759 exp->expType = ProcessTypeString("ecere::com::Class", 1);
15760 break;
15761 }
15762 else if(id->_class && (id->classSym || (id->_class->__anon1.__anon1.name && !strcmp(id->_class->__anon1.__anon1.name, "property"))))
15763 {
15764 ReplaceClassMembers(exp, thisClass);
15765 if(exp->type != 0)
15766 {
15767 ProcessExpressionType(exp);
15768 break;
15769 }
15770 if(id->classSym && ResolveIdWithClass(exp, id->classSym->__anon1.registered, 0))
15771 break;
15772 }
15773 else
15774 {
15775 struct Symbol * symbol = (((void *)0));
15776 unsigned int findInGlobal = 0;
15777
15778 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)
15779 findInGlobal = 1;
15780 else
15781 symbol = FindSymbol(id->string, curContext, topContext, 0, id->_class && id->_class->__anon1.__anon1.name == (((void *)0)));
15782 if(!symbol)
15783 {
15784 if(exp->destType && CheckExpressionType(exp, exp->destType, 0, 0))
15785 break;
15786 else
15787 {
15788 if(thisClass)
15789 {
15790 ReplaceClassMembers(exp, thisClass ? thisClass : currentClass);
15791 if(exp->type != 0)
15792 {
15793 ProcessExpressionType(exp);
15794 break;
15795 }
15796 }
15797 else if(currentClass && !id->_class)
15798 {
15799 if(ResolveIdWithClass(exp, currentClass, 1))
15800 break;
15801 }
15802 symbol = FindSymbol(id->string, topContext->parent, globalContext, 0, id->_class && id->_class->__anon1.__anon1.name == (((void *)0)));
15803 }
15804 }
15805 if(findInGlobal)
15806 symbol = FindSymbol(id->string, curContext, topContext, 0, id->_class && id->_class->__anon1.__anon1.name == (((void *)0)));
15807 if(symbol)
15808 {
15809 struct Type * type = symbol->type;
15810 struct __ecereNameSpace__ecere__com__Class * _class = (type && type->kind == 8 && type->__anon1._class) ? type->__anon1._class->__anon1.registered : (((void *)0));
15811
15812 if(_class && !strcmp(id->string, "this") && !type->classObjectType)
15813 {
15814 struct Context * context = SetupTemplatesContext(_class);
15815
15816 type = ReplaceThisClassType(_class);
15817 FinishTemplatesContext(context);
15818 if(type)
15819 type->refCount = 0;
15820 }
15821 FreeSpecifier(id->_class);
15822 id->_class = (((void *)0));
15823 (__ecereNameSpace__ecere__com__eSystem_Delete(id->string), id->string = 0);
15824 id->string = __ecereNameSpace__ecere__sys__CopyString(symbol->string);
15825 id->classSym = (((void *)0));
15826 exp->expType = type;
15827 if(type)
15828 type->refCount++;
15829 if(type && (type->kind == 15))
15830 exp->isConstant = 1;
15831 if(symbol->isParam || !strcmp(id->string, "this"))
15832 {
15833 if(_class && _class->type == 1 && !type->declaredWithStruct)
15834 exp->byReference = 1;
15835 }
15836 if(symbol->isIterator)
15837 {
15838 if(symbol->isIterator == 3)
15839 {
15840 exp->type = 5;
15841 exp->__anon1.list = MkListOne(MkExpOp((((void *)0)), '*', MkExpIdentifier(exp->__anon1.__anon1.identifier)));
15842 ((struct Expression *)(*exp->__anon1.list).first)->__anon1.op.exp2->expType = exp->expType;
15843 exp->expType = (((void *)0));
15844 ProcessExpressionType(exp);
15845 }
15846 else if(symbol->isIterator != 4)
15847 {
15848 exp->type = 8;
15849 exp->__anon1.member.exp = MkExpIdentifier(exp->__anon1.__anon1.identifier);
15850 exp->__anon1.member.exp->expType = exp->expType;
15851 exp->__anon1.member.member = MkIdentifier("data");
15852 exp->expType = (((void *)0));
15853 ProcessExpressionType(exp);
15854 }
15855 }
15856 break;
15857 }
15858 else
15859 {
15860 struct __ecereNameSpace__ecere__com__DefinedExpression * definedExp = (((void *)0));
15861
15862 if(thisNameSpace && !(id->_class && !id->_class->__anon1.__anon1.name))
15863 {
15864 char name[1024];
15865
15866 strcpy(name, thisNameSpace);
15867 strcat(name, "::");
15868 strcat(name, id->string);
15869 definedExp = __ecereNameSpace__ecere__com__eSystem_FindDefine(privateModule, name);
15870 }
15871 if(!definedExp)
15872 definedExp = __ecereNameSpace__ecere__com__eSystem_FindDefine(privateModule, id->string);
15873 if(definedExp)
15874 {
15875 int c;
15876
15877 for(c = 0; c < definedExpStackPos; c++)
15878 if(definedExpStack[c] == definedExp)
15879 break;
15880 if(c == definedExpStackPos && c < sizeof (definedExpStack) / sizeof(void *))
15881 {
15882 struct Location backupYylloc = yylloc;
15883 struct __ecereNameSpace__ecere__com__Instance * backInput = fileInput;
15884
15885 definedExpStack[definedExpStackPos++] = definedExp;
15886 fileInput = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass___ecereNameSpace__ecere__sys__TempFile);
15887 ((int (*)(struct __ecereNameSpace__ecere__com__Instance *, const void *  buffer, unsigned int size, unsigned int count))__extension__ ({
15888 struct __ecereNameSpace__ecere__com__Instance * __internal_ClassInst = fileInput;
15889
15890 __internal_ClassInst ? __internal_ClassInst->_vTbl : __ecereClass___ecereNameSpace__ecere__sys__File->_vTbl;
15891 })[__ecereVMethodID___ecereNameSpace__ecere__sys__File_Write])(fileInput, definedExp->value, 1, strlen(definedExp->value));
15892 ((unsigned int (*)(struct __ecereNameSpace__ecere__com__Instance *, int pos, int mode))__extension__ ({
15893 struct __ecereNameSpace__ecere__com__Instance * __internal_ClassInst = fileInput;
15894
15895 __internal_ClassInst ? __internal_ClassInst->_vTbl : __ecereClass___ecereNameSpace__ecere__sys__File->_vTbl;
15896 })[__ecereVMethodID___ecereNameSpace__ecere__sys__File_Seek])(fileInput, 0, 0);
15897 echoOn = 0;
15898 parsedExpression = (((void *)0));
15899 resetScanner();
15900 expression_yyparse();
15901 (__ecereNameSpace__ecere__com__eInstance_DecRef(fileInput), fileInput = 0);
15902 if(backInput)
15903 fileInput = backInput;
15904 yylloc = backupYylloc;
15905 if(parsedExpression)
15906 {
15907 FreeIdentifier(id);
15908 exp->type = 5;
15909 exp->__anon1.list = MkListOne(parsedExpression);
15910 ApplyLocation(parsedExpression, &yylloc);
15911 ProcessExpressionType(exp);
15912 definedExpStackPos--;
15913 return ;
15914 }
15915 definedExpStackPos--;
15916 }
15917 else
15918 {
15919 if(inCompiler)
15920 {
15921 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Recursion in defined expression %s\n", (((void *)0))), id->string);
15922 }
15923 }
15924 }
15925 else
15926 {
15927 struct GlobalData * data = (((void *)0));
15928
15929 if(thisNameSpace && !(id->_class && !id->_class->__anon1.__anon1.name))
15930 {
15931 char name[1024];
15932
15933 strcpy(name, thisNameSpace);
15934 strcat(name, "::");
15935 strcat(name, id->string);
15936 data = FindGlobalData(name);
15937 }
15938 if(!data)
15939 data = FindGlobalData(id->string);
15940 if(data)
15941 {
15942 DeclareGlobalData(curExternal, data);
15943 exp->expType = data->dataType;
15944 if(data->dataType)
15945 data->dataType->refCount++;
15946 (__ecereNameSpace__ecere__com__eSystem_Delete(id->string), id->string = 0);
15947 id->string = __ecereNameSpace__ecere__sys__CopyString(data->fullName);
15948 FreeSpecifier(id->_class);
15949 id->_class = (((void *)0));
15950 break;
15951 }
15952 else
15953 {
15954 struct __ecereNameSpace__ecere__com__GlobalFunction * function = (((void *)0));
15955
15956 if(thisNameSpace && !(id->_class && !id->_class->__anon1.__anon1.name))
15957 {
15958 char name[1024];
15959
15960 strcpy(name, thisNameSpace);
15961 strcat(name, "::");
15962 strcat(name, id->string);
15963 function = __ecereNameSpace__ecere__com__eSystem_FindFunction(privateModule, name);
15964 }
15965 if(!function)
15966 function = __ecereNameSpace__ecere__com__eSystem_FindFunction(privateModule, id->string);
15967 if(function)
15968 {
15969 char name[1024];
15970
15971 (__ecereNameSpace__ecere__com__eSystem_Delete(id->string), id->string = 0);
15972 id->string = __ecereNameSpace__ecere__sys__CopyString(function->name);
15973 name[0] = 0;
15974 if(((struct __ecereNameSpace__ecere__com__Module *)(((char *)function->module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->importType != 1 && (!function->dataType || !function->dataType->dllExport))
15975 strcpy(name, "__ecereFunction_");
15976 FullClassNameCat(name, id->string, 0);
15977 if(DeclareFunction(curExternal, function, name))
15978 {
15979 (__ecereNameSpace__ecere__com__eSystem_Delete(id->string), id->string = 0);
15980 id->string = __ecereNameSpace__ecere__sys__CopyString(name);
15981 }
15982 exp->expType = function->dataType;
15983 if(function->dataType)
15984 function->dataType->refCount++;
15985 FreeSpecifier(id->_class);
15986 id->_class = (((void *)0));
15987 break;
15988 }
15989 }
15990 }
15991 }
15992 }
15993 unresolved = 1;
15994 break;
15995 }
15996 case 1:
15997 {
15998 if(!exp->__anon1.instance->_class)
15999 {
16000 if(exp->destType && exp->destType->kind == 8 && exp->destType->__anon1._class)
16001 {
16002 exp->__anon1.instance->_class = MkSpecifierName(exp->destType->__anon1._class->string);
16003 }
16004 }
16005 ProcessInstantiationType(exp->__anon1.instance);
16006 exp->isConstant = exp->__anon1.instance->isConstant;
16007 if(exp->__anon1.instance->_class)
16008 {
16009 exp->expType = MkClassType(exp->__anon1.instance->_class->__anon1.__anon1.name);
16010 }
16011 break;
16012 }
16013 case 2:
16014 {
16015 if(!exp->expType)
16016 {
16017 char * constant = exp->__anon1.__anon1.constant;
16018 struct Type * type = (type = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type), type->refCount = 1, type->constant = 1, type);
16019
16020 exp->expType = type;
16021 if(constant[0] == '\'')
16022 {
16023 if((int)((unsigned char *)constant)[1] > 127)
16024 {
16025 int nb;
16026 unsigned int ch = __ecereNameSpace__ecere__sys__UTF8GetChar(constant + 1, &nb);
16027
16028 if(nb < 2)
16029 ch = constant[1];
16030 (__ecereNameSpace__ecere__com__eSystem_Delete(constant), constant = 0);
16031 exp->__anon1.__anon1.constant = PrintUInt(ch);
16032 type->kind = 8;
16033 type->__anon1._class = FindClass("unichar");
16034 type->isSigned = 0;
16035 }
16036 else
16037 {
16038 type->kind = 1;
16039 type->isSigned = 1;
16040 }
16041 }
16042 else
16043 {
16044 char * dot = strchr(constant, '.');
16045 unsigned int isHex = (constant[0] == '0' && (constant[1] == 'x' || constant[1] == 'X'));
16046 char * exponent;
16047
16048 if(isHex)
16049 {
16050 exponent = strchr(constant, 'p');
16051 if(!exponent)
16052 exponent = strchr(constant, 'P');
16053 }
16054 else
16055 {
16056 exponent = strchr(constant, 'e');
16057 if(!exponent)
16058 exponent = strchr(constant, 'E');
16059 }
16060 if(dot || exponent)
16061 {
16062 if(strchr(constant, 'f') || strchr(constant, 'F'))
16063 type->kind = 6;
16064 else
16065 type->kind = 7;
16066 type->isSigned = 1;
16067 }
16068 else
16069 {
16070 unsigned int isSigned = constant[0] == '-';
16071 char * endP = (((void *)0));
16072 long long i64 = strtoll(constant, &endP, 0);
16073 uint64 ui64 = strtoull(constant, &endP, 0);
16074 unsigned int is64Bit = endP && (!strcmp(endP, "LL") || !strcmp(endP, "ll") || !strcmp(endP, "LLU") || !strcmp(endP, "llu") || !strcmp(endP, "ull") || !strcmp(endP, "ULL"));
16075 unsigned int forceUnsigned = endP && (!strcmp(endP, "U") || !strcmp(endP, "u") || !strcmp(endP, "LLU") || !strcmp(endP, "llu") || !strcmp(endP, "ull") || !strcmp(endP, "ULL"));
16076
16077 if(isSigned)
16078 {
16079 if(i64 < (((int)0x80000000)))
16080 is64Bit = 1;
16081 }
16082 else
16083 {
16084 if(ui64 > (((int)0x7fffffff)))
16085 {
16086 if(ui64 > (0xffffffff))
16087 {
16088 is64Bit = 1;
16089 if(ui64 <= (((long long)0x7fffffffffffffffLL)) && (constant[0] != '0' || !constant[1]))
16090 isSigned = 1;
16091 }
16092 }
16093 else if(constant[0] != '0' || !constant[1])
16094 isSigned = 1;
16095 }
16096 if(forceUnsigned)
16097 isSigned = 0;
16098 type->kind = is64Bit ? 4 : 3;
16099 type->isSigned = isSigned;
16100 }
16101 }
16102 exp->isConstant = 1;
16103 if(exp->destType && exp->destType->kind == 7)
16104 type->kind = 7;
16105 else if(exp->destType && exp->destType->kind == 6)
16106 type->kind = 6;
16107 else if(exp->destType && exp->destType->kind == 4)
16108 type->kind = 4;
16109 }
16110 break;
16111 }
16112 case 3:
16113 {
16114 exp->isConstant = 1;
16115 exp->expType = __extension__ ({
16116 struct Type * __ecereInstance2 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
16117
16118 __ecereInstance2->refCount = 1, __ecereInstance2->kind = 13, __ecereInstance2->__anon1.type = __extension__ ({
16119 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
16120
16121 __ecereInstance1->refCount = 1, __ecereInstance1->kind = exp->__anon1.__anon2.wideString ? 2 : 1, __ecereInstance1->constant = 1, __ecereInstance1->isSigned = exp->__anon1.__anon2.wideString ? 0 : 1, __ecereInstance1;
16122 }), __ecereInstance2;
16123 });
16124 break;
16125 }
16126 case 13:
16127 case 26:
16128 ProcessExpressionType(exp->__anon1._new.size);
16129 exp->expType = __extension__ ({
16130 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
16131
16132 __ecereInstance1->refCount = 1, __ecereInstance1->kind = 13, __ecereInstance1->__anon1.type = ProcessType(exp->__anon1._new.typeName->qualifiers, exp->__anon1._new.typeName->declarator), __ecereInstance1;
16133 });
16134 DeclareType(curExternal, exp->expType->__anon1.type, 1, 0);
16135 break;
16136 case 14:
16137 case 27:
16138 ProcessExpressionType(exp->__anon1._renew.size);
16139 ProcessExpressionType(exp->__anon1._renew.exp);
16140 exp->expType = __extension__ ({
16141 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
16142
16143 __ecereInstance1->refCount = 1, __ecereInstance1->kind = 13, __ecereInstance1->__anon1.type = ProcessType(exp->__anon1._renew.typeName->qualifiers, exp->__anon1._renew.typeName->declarator), __ecereInstance1;
16144 });
16145 DeclareType(curExternal, exp->expType->__anon1.type, 1, 0);
16146 break;
16147 case 4:
16148 {
16149 unsigned int assign = 0, boolResult = 0, boolOps = 0;
16150 struct Type * type1 = (((void *)0)), * type2 = (((void *)0));
16151 unsigned int useDestType = 0, useSideType = 0;
16152 struct Location oldyylloc = yylloc;
16153 unsigned int useSideUnit = 0;
16154 struct __ecereNameSpace__ecere__com__Class * destClass = (exp->destType && exp->destType->kind == 8 && exp->destType->__anon1._class) ? exp->destType->__anon1._class->__anon1.registered : (((void *)0));
16155 struct Type * dummy = (dummy = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type), dummy->count = 1, dummy->refCount = 1, dummy);
16156
16157 switch(exp->__anon1.op.op)
16158 {
16159 case '=':
16160 case MUL_ASSIGN:
16161 case DIV_ASSIGN:
16162 case MOD_ASSIGN:
16163 case ADD_ASSIGN:
16164 case SUB_ASSIGN:
16165 case LEFT_ASSIGN:
16166 case RIGHT_ASSIGN:
16167 case AND_ASSIGN:
16168 case XOR_ASSIGN:
16169 case OR_ASSIGN:
16170 assign = 1;
16171 break;
16172 case '!':
16173 break;
16174 case AND_OP:
16175 case OR_OP:
16176 boolOps = 1;
16177 boolResult = 1;
16178 break;
16179 case EQ_OP:
16180 case '<':
16181 case '>':
16182 case LE_OP:
16183 case GE_OP:
16184 case NE_OP:
16185 boolResult = 1;
16186 useSideType = 1;
16187 break;
16188 case '+':
16189 case '-':
16190 useSideUnit = 1;
16191 useSideType = 1;
16192 useDestType = 1;
16193 break;
16194 case LEFT_OP:
16195 case RIGHT_OP:
16196 break;
16197 case '|':
16198 case '^':
16199 useSideType = 1;
16200 useDestType = 1;
16201 break;
16202 case '/':
16203 case '%':
16204 useSideType = 1;
16205 useDestType = 1;
16206 break;
16207 case '&':
16208 case '*':
16209 if(exp->__anon1.op.exp1)
16210 {
16211 useSideType = 1;
16212 useDestType = 1;
16213 }
16214 break;
16215 }
16216 if(exp->__anon1.op.op == '&')
16217 {
16218 if(!exp->__anon1.op.exp1 && exp->__anon1.op.exp2 && exp->__anon1.op.exp2->type == 0 && exp->__anon1.op.exp2->__anon1.__anon1.identifier)
16219 {
16220 struct Identifier * id = exp->__anon1.op.exp2->__anon1.__anon1.identifier;
16221 struct Symbol * symbol = FindSymbol(id->string, curContext, topContext, 0, id->_class && id->_class->__anon1.__anon1.name == (((void *)0)));
16222
16223 if(symbol && symbol->isIterator == 2)
16224 {
16225 exp->type = 8;
16226 exp->__anon1.member.exp = exp->__anon1.op.exp2;
16227 exp->__anon1.member.member = MkIdentifier("key");
16228 exp->expType = (((void *)0));
16229 exp->__anon1.op.exp2->expType = symbol->type;
16230 symbol->type->refCount++;
16231 ProcessExpressionType(exp);
16232 FreeType(dummy);
16233 break;
16234 }
16235 }
16236 }
16237 if(exp->__anon1.op.exp1)
16238 {
16239 if(exp->__anon1.op.exp2 && useSideUnit && useDestType && destClass && destClass->type == 3 && destClass->base->type != 3)
16240 useDestType = 0;
16241 if(destClass && useDestType && ((destClass->type == 3 && useSideUnit) || destClass->type == 4 || destClass->type == 2))
16242 {
16243 if(exp->__anon1.op.exp1->destType)
16244 FreeType(exp->__anon1.op.exp1->destType);
16245 exp->__anon1.op.exp1->destType = exp->destType;
16246 exp->__anon1.op.exp1->opDestType = 1;
16247 if(exp->destType)
16248 exp->destType->refCount++;
16249 }
16250 else if(!assign)
16251 {
16252 if(exp->__anon1.op.exp1->destType)
16253 FreeType(exp->__anon1.op.exp1->destType);
16254 exp->__anon1.op.exp1->destType = dummy;
16255 dummy->refCount++;
16256 }
16257 if(exp->__anon1.op.exp1->destType && exp->__anon1.op.op != '=')
16258 exp->__anon1.op.exp1->destType->count++;
16259 ProcessExpressionType(exp->__anon1.op.exp1);
16260 if(exp->__anon1.op.exp1->destType && exp->__anon1.op.op != '=')
16261 exp->__anon1.op.exp1->destType->count--;
16262 exp->__anon1.op.exp1->opDestType = 0;
16263 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)
16264 {
16265 exp->__anon1.op.exp2 = MkExpConstant("1");
16266 exp->__anon1.op.op = exp->__anon1.op.op == INC_OP ? ADD_ASSIGN : SUB_ASSIGN;
16267 assign = 1;
16268 }
16269 if(exp->__anon1.op.exp1->destType == dummy)
16270 {
16271 FreeType(dummy);
16272 exp->__anon1.op.exp1->destType = (((void *)0));
16273 }
16274 if(exp->__anon1.op.exp2)
16275 {
16276 if(!assign && exp->__anon1.op.exp1->expType && (exp->__anon1.op.exp1->expType->kind == 1 || exp->__anon1.op.exp1->expType->kind == 2))
16277 {
16278 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);
16279
16280 FreeType(exp->__anon1.op.exp1->expType);
16281 exp->__anon1.op.exp1->expType = type;
16282 }
16283 }
16284 type1 = exp->__anon1.op.exp1->expType;
16285 }
16286 if(exp->__anon1.op.exp2)
16287 {
16288 char expString[10240];
16289
16290 expString[0] = '\0';
16291 if(exp->__anon1.op.exp2->type == 1 && !exp->__anon1.op.exp2->__anon1.instance->_class)
16292 {
16293 if(exp->__anon1.op.exp1)
16294 {
16295 exp->__anon1.op.exp2->destType = exp->__anon1.op.exp1->expType;
16296 if(exp->__anon1.op.exp1->expType)
16297 exp->__anon1.op.exp1->expType->refCount++;
16298 }
16299 else
16300 {
16301 exp->__anon1.op.exp2->destType = exp->destType;
16302 if(!exp->__anon1.op.exp1 || (exp->__anon1.op.op != '&' && exp->__anon1.op.op != '^'))
16303 exp->__anon1.op.exp2->opDestType = 1;
16304 if(exp->destType)
16305 exp->destType->refCount++;
16306 }
16307 if(type1)
16308 type1->refCount++;
16309 exp->expType = type1;
16310 }
16311 else if(assign)
16312 {
16313 if(inCompiler)
16314 PrintExpression(exp->__anon1.op.exp2, expString);
16315 if(type1 && type1->kind == 13)
16316 {
16317 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)
16318 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "operator %s illegal on pointer\n", (((void *)0))), exp->__anon1.op.op);
16319 else if(exp->__anon1.op.op == '=')
16320 {
16321 if(exp->__anon1.op.exp2->destType)
16322 FreeType(exp->__anon1.op.exp2->destType);
16323 exp->__anon1.op.exp2->destType = type1;
16324 if(type1)
16325 type1->refCount++;
16326 }
16327 }
16328 else
16329 {
16330 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)
16331 ;
16332 else
16333 {
16334 if(exp->__anon1.op.exp2->destType)
16335 FreeType(exp->__anon1.op.exp2->destType);
16336 exp->__anon1.op.exp2->destType = type1;
16337 if(type1)
16338 type1->refCount++;
16339 }
16340 }
16341 if(type1)
16342 type1->refCount++;
16343 exp->expType = type1;
16344 }
16345 else if(destClass && ((destClass->type == 3 && useDestType && useSideUnit) || (destClass->type == 4 && useDestType)))
16346 {
16347 if(exp->__anon1.op.exp2->destType)
16348 FreeType(exp->__anon1.op.exp2->destType);
16349 exp->__anon1.op.exp2->destType = exp->destType;
16350 if(exp->__anon1.op.op != '&' && exp->__anon1.op.op != '^')
16351 exp->__anon1.op.exp2->opDestType = 1;
16352 if(exp->destType)
16353 exp->destType->refCount++;
16354 }
16355 else
16356 {
16357 if(exp->__anon1.op.exp2->destType)
16358 FreeType(exp->__anon1.op.exp2->destType);
16359 exp->__anon1.op.exp2->destType = dummy;
16360 dummy->refCount++;
16361 }
16362 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))
16363 {
16364 FreeType(exp->__anon1.op.exp2->destType);
16365 exp->__anon1.op.exp2->destType = type1;
16366 type1->refCount++;
16367 }
16368 if(exp->__anon1.op.exp2->destType && exp->__anon1.op.op != '=')
16369 exp->__anon1.op.exp2->destType->count++;
16370 if(exp->__anon1.op.op == SIZEOF)
16371 {
16372 struct Expression * e = exp->__anon1.op.exp2;
16373
16374 while((e->type == 5 || e->type == 32 || e->type == 23) && e->__anon1.list)
16375 {
16376 if(e->type == 5 || e->type == 32 || e->type == 23)
16377 {
16378 if(e->type == 23)
16379 e = (*((struct Statement *)(*e->__anon1.compound->__anon1.compound.statements).last)->__anon1.expressions).last;
16380 else
16381 e = (*e->__anon1.list).last;
16382 }
16383 }
16384 if(e->type == 11 && e->__anon1.cast.exp)
16385 e->__anon1.cast.exp->needCast = 1;
16386 }
16387 ProcessExpressionType(exp->__anon1.op.exp2);
16388 exp->__anon1.op.exp2->opDestType = 0;
16389 if(exp->__anon1.op.exp2->destType && exp->__anon1.op.op != '=')
16390 exp->__anon1.op.exp2->destType->count--;
16391 if(!assign && (exp->__anon1.op.exp1 || exp->__anon1.op.op == '~'))
16392 {
16393 if(exp->__anon1.op.exp2->expType && (exp->__anon1.op.exp2->expType->kind == 1 || exp->__anon1.op.exp2->expType->kind == 2))
16394 {
16395 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);
16396
16397 FreeType(exp->__anon1.op.exp2->expType);
16398 exp->__anon1.op.exp2->expType = type;
16399 }
16400 }
16401 if(assign && type1 && type1->kind == 13 && exp->__anon1.op.exp2->expType)
16402 {
16403 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)
16404 {
16405 if(exp->__anon1.op.op != '=' && type1->__anon1.type->kind == 0)
16406 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "void *: unknown size\n", (((void *)0))));
16407 }
16408 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)))
16409 {
16410 if(exp->__anon1.op.op == ADD_ASSIGN)
16411 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "cannot add two pointers\n", (((void *)0))));
16412 }
16413 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))
16414 {
16415 if(exp->__anon1.op.op == ADD_ASSIGN)
16416 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "cannot add two pointers\n", (((void *)0))));
16417 }
16418 else if(inCompiler)
16419 {
16420 char type1String[1024];
16421 char type2String[1024];
16422
16423 type1String[0] = '\0';
16424 type2String[0] = '\0';
16425 PrintType(exp->__anon1.op.exp2->expType, type1String, 0, 1);
16426 PrintType(type1, type2String, 0, 1);
16427 __ecereNameSpace__ecere__sys__ChangeCh(expString, '\n', ' ');
16428 Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "incompatible expression %s (%s); expected %s\n", (((void *)0))), expString, type1String, type2String);
16429 }
16430 }
16431 if(exp->__anon1.op.exp2->destType == dummy)
16432 {
16433 FreeType(dummy);
16434 exp->__anon1.op.exp2->destType = (((void *)0));
16435 }
16436 if(exp->__anon1.op.op == '-' && !exp->__anon1.op.exp1 && exp->__anon1.op.exp2->expType && !exp->__anon1.op.exp2->expType->isSigned)
16437 {
16438 type2 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
16439 type2->refCount = 1;
16440 CopyTypeInto(type2, exp->__anon1.op.exp2->expType);
16441 type2->isSigned = 1;
16442 }
16443 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))
16444 {
16445 type2 = __extension__ ({
16446 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
16447
16448 __ecereInstance1->kind = 3, __ecereInstance1;
16449 });
16450 type2->refCount = 1;
16451 type2->isSigned = 1;
16452 }
16453 else
16454 {
16455 type2 = exp->__anon1.op.exp2->expType;
16456 if(type2)
16457 type2->refCount++;
16458 }
16459 }
16460 dummy->kind = 0;
16461 if(exp->__anon1.op.op == SIZEOF)
16462 {
16463 exp->expType = __extension__ ({
16464 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
16465
16466 __ecereInstance1->refCount = 1, __ecereInstance1->kind = 23, __ecereInstance1;
16467 });
16468 exp->isConstant = 1;
16469 }
16470 else if(exp->__anon1.op.op == '*' && !exp->__anon1.op.exp1)
16471 {
16472 exp->expType = Dereference(type2);
16473 if(type2 && type2->kind == 8)
16474 notByReference = 1;
16475 }
16476 else if(exp->__anon1.op.op == '&' && !exp->__anon1.op.exp1)
16477 exp->expType = Reference(type2);
16478 else if(exp->__anon1.op.op == LEFT_OP || exp->__anon1.op.op == RIGHT_OP)
16479 {
16480 if(exp->__anon1.op.exp1->expType)
16481 {
16482 exp->expType = exp->__anon1.op.exp1->expType;
16483 exp->expType->refCount++;
16484 }
16485 }
16486 else if(!assign)
16487 {
16488 if(boolOps)
16489 {
16490 if(exp->__anon1.op.exp1)
16491 {
16492 if(exp->__anon1.op.exp1->destType)
16493 FreeType(exp->__anon1.op.exp1->destType);
16494 exp->__anon1.op.exp1->destType = MkClassType("bool");
16495 exp->__anon1.op.exp1->destType->truth = 1;
16496 if(!exp->__anon1.op.exp1->expType)
16497 ProcessExpressionType(exp->__anon1.op.exp1);
16498 else
16499 CheckExpressionType(exp->__anon1.op.exp1, exp->__anon1.op.exp1->destType, 0, 0);
16500 FreeType(exp->__anon1.op.exp1->expType);
16501 exp->__anon1.op.exp1->expType = MkClassType("bool");
16502 exp->__anon1.op.exp1->expType->truth = 1;
16503 }
16504 if(exp->__anon1.op.exp2)
16505 {
16506 if(exp->__anon1.op.exp2->destType)
16507 FreeType(exp->__anon1.op.exp2->destType);
16508 exp->__anon1.op.exp2->destType = MkClassType("bool");
16509 exp->__anon1.op.exp2->destType->truth = 1;
16510 if(!exp->__anon1.op.exp2->expType)
16511 ProcessExpressionType(exp->__anon1.op.exp2);
16512 else
16513 CheckExpressionType(exp->__anon1.op.exp2, exp->__anon1.op.exp2->destType, 0, 0);
16514 FreeType(exp->__anon1.op.exp2->expType);
16515 exp->__anon1.op.exp2->expType = MkClassType("bool");
16516 exp->__anon1.op.exp2->expType->truth = 1;
16517 }
16518 }
16519 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")))))
16520 {
16521 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"))))
16522 {
16523 if(exp->__anon1.op.op == '-' && ((type1->kind == 8 && type1->__anon1._class->__anon1.registered && type1->__anon1._class->__anon1.registered->type == 4) || (type2->kind == 8 && type2->__anon1._class->__anon1.registered && type2->__anon1._class->__anon1.registered->type == 4)))
16524 {
16525 struct Type * intType;
16526
16527 if(!type1->__anon1._class->__anon1.registered->dataType)
16528 type1->__anon1._class->__anon1.registered->dataType = ProcessTypeString(type1->__anon1._class->__anon1.registered->dataTypeString, 0);
16529 if(!type2->__anon1._class->__anon1.registered->dataType)
16530 type2->__anon1._class->__anon1.registered->dataType = ProcessTypeString(type2->__anon1._class->__anon1.registered->dataTypeString, 0);
16531 intType = ProcessTypeString((type1->__anon1._class->__anon1.registered->dataType->kind == 4 || type2->__anon1._class->__anon1.registered->dataType->kind == 4) ? "int64" : "int", 0);
16532 if(exp->__anon1.op.exp1->destType)
16533 FreeType(exp->__anon1.op.exp1->destType);
16534 if(exp->__anon1.op.exp2->destType)
16535 FreeType(exp->__anon1.op.exp2->destType);
16536 exp->__anon1.op.exp1->destType = intType;
16537 exp->__anon1.op.exp2->destType = intType;
16538 intType->refCount++;
16539 }
16540 else
16541 {
16542 if(exp->__anon1.op.exp2->destType)
16543 FreeType(exp->__anon1.op.exp2->destType);
16544 exp->__anon1.op.exp2->destType = type1;
16545 type1->refCount++;
16546 if(exp->__anon1.op.exp1->destType)
16547 FreeType(exp->__anon1.op.exp1->destType);
16548 exp->__anon1.op.exp1->destType = type2;
16549 type2->refCount++;
16550 }
16551 if(!boolResult && type1->kind == 8 && (!exp->destType || exp->destType->kind != 8) && type1->__anon1._class->__anon1.registered && type1->__anon1._class->__anon1.registered->type == 3 && type2->__anon1._class->__anon1.registered && type2->__anon1._class->__anon1.registered->type == 3 && type1->__anon1._class->__anon1.registered != type2->__anon1._class->__anon1.registered)
16552 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);
16553 if(type1->kind == 13 && type1->__anon1.type->kind == 20 && type2->kind != 13)
16554 {
16555 struct Expression * argExp = GetTemplateArgExp(type1->__anon1.type->__anon1.templateParameter, thisClass, 1);
16556
16557 if(argExp)
16558 {
16559 struct Expression * classExp = MkExpMember(argExp, MkIdentifier("dataTypeClass"));
16560
16561 exp->__anon1.op.exp1 = MkExpBrackets(MkListOne(MkExpCast(MkTypeName(MkListOne(MkSpecifierName("byte")), MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), (((void *)0)))), exp->__anon1.op.exp1)));
16562 ProcessExpressionType(exp->__anon1.op.exp1);
16563 if(type2->kind != 13)
16564 {
16565 ProcessExpressionType(classExp);
16566 exp->__anon1.op.exp2 = MkExpBrackets(MkListOne(MkExpOp(exp->__anon1.op.exp2, '*', MkExpMember(classExp, MkIdentifier("typeSize")))));
16567 if(!exp->__anon1.op.exp2->expType)
16568 {
16569 if(type2)
16570 FreeType(type2);
16571 type2 = exp->__anon1.op.exp2->expType = ProcessTypeString("int", 0);
16572 type2->refCount++;
16573 }
16574 ProcessExpressionType(exp->__anon1.op.exp2);
16575 }
16576 }
16577 }
16578 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)))
16579 {
16580 if(type1->kind != 8 && type1->__anon1.type->kind == 0)
16581 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "void *: unknown size\n", (((void *)0))));
16582 exp->expType = type1;
16583 if(type1)
16584 type1->refCount++;
16585 }
16586 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)))
16587 {
16588 if(type2->kind != 8 && type2->__anon1.type->kind == 0)
16589 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "void *: unknown size\n", (((void *)0))));
16590 exp->expType = type2;
16591 if(type2)
16592 type2->refCount++;
16593 }
16594 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))
16595 {
16596 Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "different levels of indirection\n", (((void *)0))));
16597 }
16598 else
16599 {
16600 unsigned int success = 0;
16601
16602 if(type1->kind == 13 && type2->kind == 13)
16603 {
16604 if(exp->__anon1.op.op == '+')
16605 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "cannot add two pointers\n", (((void *)0))));
16606 else if(exp->__anon1.op.op == '-')
16607 {
16608 if(MatchTypes(type1->__anon1.type, type2->__anon1.type, (((void *)0)), (((void *)0)), (((void *)0)), 0, 0, 0, 0, 0))
16609 {
16610 exp->expType = __extension__ ({
16611 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
16612
16613 __ecereInstance1->kind = 3, __ecereInstance1->refCount = 1, __ecereInstance1;
16614 });
16615 success = 1;
16616 if(type1->__anon1.type->kind == 20)
16617 {
16618 struct Expression * argExp = GetTemplateArgExp(type1->__anon1.type->__anon1.templateParameter, thisClass, 1);
16619
16620 if(argExp)
16621 {
16622 struct Expression * classExp = MkExpMember(argExp, MkIdentifier("dataTypeClass"));
16623
16624 ProcessExpressionType(classExp);
16625 exp->type = 5;
16626 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"))));
16627 ProcessExpressionType(((struct Expression *)(*exp->__anon1.list).first)->__anon1.op.exp2);
16628 FreeType(dummy);
16629 return ;
16630 }
16631 }
16632 }
16633 }
16634 }
16635 if(!success && exp->__anon1.op.exp1->type == 2)
16636 {
16637 if(CheckExpressionType(exp->__anon1.op.exp1, exp->__anon1.op.exp1->destType, 0, 0))
16638 {
16639 if(exp->expType)
16640 FreeType(exp->expType);
16641 exp->expType = exp->__anon1.op.exp1->destType;
16642 if(exp->__anon1.op.exp1->destType)
16643 exp->__anon1.op.exp1->destType->refCount++;
16644 success = 1;
16645 }
16646 else if(CheckExpressionType(exp->__anon1.op.exp2, exp->__anon1.op.exp2->destType, 0, 0))
16647 {
16648 if(exp->expType)
16649 FreeType(exp->expType);
16650 exp->expType = exp->__anon1.op.exp2->destType;
16651 if(exp->__anon1.op.exp2->destType)
16652 exp->__anon1.op.exp2->destType->refCount++;
16653 success = 1;
16654 }
16655 }
16656 else if(!success)
16657 {
16658 if(CheckExpressionType(exp->__anon1.op.exp2, exp->__anon1.op.exp2->destType, 0, 0))
16659 {
16660 if(exp->expType)
16661 FreeType(exp->expType);
16662 exp->expType = exp->__anon1.op.exp2->destType;
16663 if(exp->__anon1.op.exp2->destType)
16664 exp->__anon1.op.exp2->destType->refCount++;
16665 success = 1;
16666 }
16667 else if(CheckExpressionType(exp->__anon1.op.exp1, exp->__anon1.op.exp1->destType, 0, 0))
16668 {
16669 if(exp->expType)
16670 FreeType(exp->expType);
16671 exp->expType = exp->__anon1.op.exp1->destType;
16672 if(exp->__anon1.op.exp1->destType)
16673 exp->__anon1.op.exp1->destType->refCount++;
16674 success = 1;
16675 }
16676 }
16677 if(!success)
16678 {
16679 char expString1[10240];
16680 char expString2[10240];
16681 char type1[1024];
16682 char type2[1024];
16683
16684 expString1[0] = '\0';
16685 expString2[0] = '\0';
16686 type1[0] = '\0';
16687 type2[0] = '\0';
16688 if(inCompiler)
16689 {
16690 PrintExpression(exp->__anon1.op.exp1, expString1);
16691 __ecereNameSpace__ecere__sys__ChangeCh(expString1, '\n', ' ');
16692 PrintExpression(exp->__anon1.op.exp2, expString2);
16693 __ecereNameSpace__ecere__sys__ChangeCh(expString2, '\n', ' ');
16694 PrintType(exp->__anon1.op.exp1->expType, type1, 0, 1);
16695 PrintType(exp->__anon1.op.exp2->expType, type2, 0, 1);
16696 }
16697 Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "incompatible expressions %s (%s) and %s (%s)\n", (((void *)0))), expString1, type1, expString2, type2);
16698 }
16699 }
16700 }
16701 else if(!boolResult && (!useSideUnit) && type2 && type1 && type2->kind == 8 && type1->kind != 8 && type2->__anon1._class && type2->__anon1._class->__anon1.registered && type2->__anon1._class->__anon1.registered->type == 3)
16702 {
16703 if(exp->__anon1.op.exp1->destType)
16704 FreeType(exp->__anon1.op.exp1->destType);
16705 exp->__anon1.op.exp1->destType = type2->__anon1._class->__anon1.registered->dataType;
16706 if(type2->__anon1._class->__anon1.registered->dataType)
16707 type2->__anon1._class->__anon1.registered->dataType->refCount++;
16708 CheckExpressionType(exp->__anon1.op.exp1, exp->__anon1.op.exp1->destType, 0, 0);
16709 exp->expType = type2;
16710 if(type2)
16711 type2->refCount++;
16712 }
16713 else if(!boolResult && (!useSideUnit) && type1 && type2 && type1->kind == 8 && type2->kind != 8 && type1->__anon1._class && type1->__anon1._class->__anon1.registered && type1->__anon1._class->__anon1.registered->type == 3)
16714 {
16715 if(exp->__anon1.op.exp2->destType)
16716 FreeType(exp->__anon1.op.exp2->destType);
16717 exp->__anon1.op.exp2->destType = type1->__anon1._class->__anon1.registered->dataType;
16718 if(type1->__anon1._class->__anon1.registered->dataType)
16719 type1->__anon1._class->__anon1.registered->dataType->refCount++;
16720 CheckExpressionType(exp->__anon1.op.exp2, exp->__anon1.op.exp2->destType, 0, 0);
16721 exp->expType = type1;
16722 if(type1)
16723 type1->refCount++;
16724 }
16725 else if(type1)
16726 {
16727 unsigned int valid = 0;
16728
16729 if(!boolResult && useSideUnit && type1 && type1->kind == 8 && type1->__anon1._class->__anon1.registered && type1->__anon1._class->__anon1.registered->type == 3 && type2 && type2->kind != 8)
16730 {
16731 if(exp->__anon1.op.exp2->destType)
16732 FreeType(exp->__anon1.op.exp2->destType);
16733 if(!type1->__anon1._class->__anon1.registered->dataType)
16734 type1->__anon1._class->__anon1.registered->dataType = ProcessTypeString(type1->__anon1._class->__anon1.registered->dataTypeString, 0);
16735 exp->__anon1.op.exp2->destType = type1->__anon1._class->__anon1.registered->dataType;
16736 exp->__anon1.op.exp2->destType->refCount++;
16737 CheckExpressionType(exp->__anon1.op.exp2, exp->__anon1.op.exp2->destType, 0, 0);
16738 if(type2)
16739 FreeType(type2);
16740 type2 = exp->__anon1.op.exp2->destType;
16741 if(type2)
16742 type2->refCount++;
16743 exp->expType = type2;
16744 type2->refCount++;
16745 }
16746 if(!boolResult && useSideUnit && type2 && type2->kind == 8 && type2->__anon1._class->__anon1.registered && type2->__anon1._class->__anon1.registered->type == 3 && type1 && type1->kind != 8)
16747 {
16748 if(exp->__anon1.op.exp1->destType)
16749 FreeType(exp->__anon1.op.exp1->destType);
16750 if(!type2->__anon1._class->__anon1.registered->dataType)
16751 type2->__anon1._class->__anon1.registered->dataType = ProcessTypeString(type2->__anon1._class->__anon1.registered->dataTypeString, 0);
16752 exp->__anon1.op.exp1->destType = type2->__anon1._class->__anon1.registered->dataType;
16753 exp->__anon1.op.exp1->destType->refCount++;
16754 CheckExpressionType(exp->__anon1.op.exp1, exp->__anon1.op.exp1->destType, 0, 0);
16755 type1 = exp->__anon1.op.exp1->destType;
16756 exp->expType = type1;
16757 type1->refCount++;
16758 }
16759 if(!boolResult || exp->__anon1.op.op == '>' || exp->__anon1.op.op == '<' || exp->__anon1.op.op == GE_OP || exp->__anon1.op.op == LE_OP)
16760 {
16761 unsigned int op1IsEnum = type1 && type1->kind == 8 && type1->__anon1._class && type1->__anon1._class->__anon1.registered && type1->__anon1._class->__anon1.registered->type == 4;
16762 unsigned int op2IsEnum = type2 && type2->kind == 8 && type2->__anon1._class && type2->__anon1._class->__anon1.registered && type2->__anon1._class->__anon1.registered->type == 4;
16763
16764 if(exp->__anon1.op.op == '*' || exp->__anon1.op.op == '/' || exp->__anon1.op.op == '-' || exp->__anon1.op.op == '|' || exp->__anon1.op.op == '^')
16765 {
16766 if(op1IsEnum && exp->__anon1.op.exp2->expType)
16767 {
16768 if(CheckExpressionType(exp->__anon1.op.exp1, exp->__anon1.op.exp2->expType, 0, 0))
16769 {
16770 if(exp->expType)
16771 FreeType(exp->expType);
16772 exp->expType = exp->__anon1.op.exp2->expType;
16773 if(exp->__anon1.op.exp2->expType)
16774 exp->__anon1.op.exp2->expType->refCount++;
16775 valid = 1;
16776 }
16777 }
16778 else if(op2IsEnum && exp->__anon1.op.exp1->expType)
16779 {
16780 if(CheckExpressionType(exp->__anon1.op.exp2, exp->__anon1.op.exp1->expType, 0, 0))
16781 {
16782 if(exp->expType)
16783 FreeType(exp->expType);
16784 exp->expType = exp->__anon1.op.exp1->expType;
16785 if(exp->__anon1.op.exp1->expType)
16786 exp->__anon1.op.exp1->expType->refCount++;
16787 valid = 1;
16788 }
16789 }
16790 }
16791 else
16792 {
16793 if(op1IsEnum && exp->__anon1.op.exp2->expType)
16794 {
16795 if(CheckExpressionType(exp->__anon1.op.exp1, exp->__anon1.op.exp2->expType, 0, 0))
16796 {
16797 if(exp->expType)
16798 FreeType(exp->expType);
16799 exp->expType = exp->__anon1.op.exp1->expType;
16800 if(exp->__anon1.op.exp1->expType)
16801 exp->__anon1.op.exp1->expType->refCount++;
16802 valid = 1;
16803 }
16804 }
16805 else if(op2IsEnum && exp->__anon1.op.exp1->expType)
16806 {
16807 if(CheckExpressionType(exp->__anon1.op.exp2, exp->__anon1.op.exp1->expType, 0, 0))
16808 {
16809 if(exp->expType)
16810 FreeType(exp->expType);
16811 exp->expType = exp->__anon1.op.exp2->expType;
16812 if(exp->__anon1.op.exp2->expType)
16813 exp->__anon1.op.exp2->expType->refCount++;
16814 valid = 1;
16815 }
16816 }
16817 }
16818 }
16819 if(!valid)
16820 {
16821 if(type2 && type2->kind == 8 && type2->__anon1._class && type2->__anon1._class->__anon1.registered && type2->__anon1._class->__anon1.registered->type == 3 && (type1->kind != 8 || !type1->__anon1._class || !type1->__anon1._class->__anon1.registered || type1->__anon1._class->__anon1.registered->type != 3))
16822 {
16823 if(exp->__anon1.op.exp1->destType)
16824 FreeType(exp->__anon1.op.exp1->destType);
16825 exp->__anon1.op.exp1->destType = type2;
16826 type2->refCount++;
16827 if(CheckExpressionType(exp->__anon1.op.exp1, exp->__anon1.op.exp1->destType, 0, 0))
16828 {
16829 if(exp->expType)
16830 FreeType(exp->expType);
16831 exp->expType = exp->__anon1.op.exp1->destType;
16832 if(exp->__anon1.op.exp1->destType)
16833 exp->__anon1.op.exp1->destType->refCount++;
16834 }
16835 }
16836 else
16837 {
16838 if(exp->__anon1.op.exp2->destType)
16839 FreeType(exp->__anon1.op.exp2->destType);
16840 exp->__anon1.op.exp2->destType = type1;
16841 type1->refCount++;
16842 if(CheckExpressionType(exp->__anon1.op.exp2, exp->__anon1.op.exp2->destType, 0, 0))
16843 {
16844 if(exp->expType)
16845 FreeType(exp->expType);
16846 exp->expType = exp->__anon1.op.exp2->destType;
16847 if(exp->__anon1.op.exp2->destType)
16848 exp->__anon1.op.exp2->destType->refCount++;
16849 }
16850 else if(type1 && type2)
16851 {
16852 char expString1[10240];
16853 char expString2[10240];
16854 char type1String[1024];
16855 char type2String[1024];
16856
16857 expString1[0] = '\0';
16858 expString2[0] = '\0';
16859 type1String[0] = '\0';
16860 type2String[0] = '\0';
16861 if(inCompiler)
16862 {
16863 PrintExpression(exp->__anon1.op.exp1, expString1);
16864 __ecereNameSpace__ecere__sys__ChangeCh(expString1, '\n', ' ');
16865 PrintExpression(exp->__anon1.op.exp2, expString2);
16866 __ecereNameSpace__ecere__sys__ChangeCh(expString2, '\n', ' ');
16867 PrintType(exp->__anon1.op.exp1->expType, type1String, 0, 1);
16868 PrintType(exp->__anon1.op.exp2->expType, type2String, 0, 1);
16869 }
16870 Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "incompatible expressions %s (%s) and %s (%s)\n", (((void *)0))), expString1, type1String, expString2, type2String);
16871 if(type1->kind == 8 && type1->__anon1._class && type1->__anon1._class->__anon1.registered && type1->__anon1._class->__anon1.registered->type == 4)
16872 {
16873 exp->expType = exp->__anon1.op.exp1->expType;
16874 if(exp->__anon1.op.exp1->expType)
16875 exp->__anon1.op.exp1->expType->refCount++;
16876 }
16877 else if(type2->kind == 8 && type2->__anon1._class && type2->__anon1._class->__anon1.registered && type2->__anon1._class->__anon1.registered->type == 4)
16878 {
16879 exp->expType = exp->__anon1.op.exp2->expType;
16880 if(exp->__anon1.op.exp2->expType)
16881 exp->__anon1.op.exp2->expType->refCount++;
16882 }
16883 }
16884 }
16885 }
16886 }
16887 else if(type2)
16888 {
16889 if(type2->kind == 8 && type2->__anon1._class && type2->__anon1._class->__anon1.registered && type2->__anon1._class->__anon1.registered->type == 4)
16890 {
16891 struct Type * oldType = exp->__anon1.op.exp1->expType;
16892
16893 exp->__anon1.op.exp1->expType = (((void *)0));
16894 if(CheckExpressionType(exp->__anon1.op.exp1, exp->__anon1.op.exp1->destType, 0, 0))
16895 FreeType(oldType);
16896 else
16897 exp->__anon1.op.exp1->expType = oldType;
16898 }
16899 if(exp->__anon1.op.exp1->destType)
16900 FreeType(exp->__anon1.op.exp1->destType);
16901 exp->__anon1.op.exp1->destType = type2;
16902 type2->refCount++;
16903 if(CheckExpressionType(exp->__anon1.op.exp1, exp->__anon1.op.exp1->destType, 0, 0))
16904 {
16905 if(exp->expType)
16906 FreeType(exp->expType);
16907 exp->expType = exp->__anon1.op.exp1->destType;
16908 if(exp->__anon1.op.exp1->destType)
16909 exp->__anon1.op.exp1->destType->refCount++;
16910 }
16911 }
16912 }
16913 else if(type2 && (!type1 || (type2->kind == 8 && type1->kind != 8)))
16914 {
16915 if(type1 && type2->__anon1._class && type2->__anon1._class->__anon1.registered && type2->__anon1._class->__anon1.registered->type == 3)
16916 {
16917 if(exp->__anon1.op.exp1->destType)
16918 FreeType(exp->__anon1.op.exp1->destType);
16919 exp->__anon1.op.exp1->destType = type2->__anon1._class->__anon1.registered->dataType;
16920 if(type2->__anon1._class->__anon1.registered->dataType)
16921 type2->__anon1._class->__anon1.registered->dataType->refCount++;
16922 CheckExpressionType(exp->__anon1.op.exp1, exp->__anon1.op.exp1->destType, 0, 0);
16923 }
16924 if(exp->__anon1.op.op == '!')
16925 {
16926 exp->expType = MkClassType("bool");
16927 exp->expType->truth = 1;
16928 }
16929 else
16930 {
16931 exp->expType = type2;
16932 if(type2)
16933 type2->refCount++;
16934 }
16935 }
16936 else if(type1 && (!type2 || (type1->kind == 8 && type2->kind != 8)))
16937 {
16938 if(type2 && type1->__anon1._class && type1->__anon1._class->__anon1.registered && type1->__anon1._class->__anon1.registered->type == 3)
16939 {
16940 if(exp->__anon1.op.exp2->destType)
16941 FreeType(exp->__anon1.op.exp2->destType);
16942 exp->__anon1.op.exp2->destType = type1->__anon1._class->__anon1.registered->dataType;
16943 if(type1->__anon1._class->__anon1.registered->dataType)
16944 type1->__anon1._class->__anon1.registered->dataType->refCount++;
16945 CheckExpressionType(exp->__anon1.op.exp2, exp->__anon1.op.exp2->destType, 0, 0);
16946 }
16947 exp->expType = type1;
16948 if(type1)
16949 type1->refCount++;
16950 }
16951 }
16952 yylloc = exp->loc;
16953 if(exp->__anon1.op.exp1 && !exp->__anon1.op.exp1->expType)
16954 {
16955 char expString[10000];
16956
16957 expString[0] = '\0';
16958 if(inCompiler)
16959 {
16960 PrintExpression(exp->__anon1.op.exp1, expString);
16961 __ecereNameSpace__ecere__sys__ChangeCh(expString, '\n', ' ');
16962 }
16963 if(expString[0])
16964 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "couldn't determine type of %s\n", (((void *)0))), expString);
16965 }
16966 if(exp->__anon1.op.exp2 && !exp->__anon1.op.exp2->expType)
16967 {
16968 char expString[10240];
16969
16970 expString[0] = '\0';
16971 if(inCompiler)
16972 {
16973 PrintExpression(exp->__anon1.op.exp2, expString);
16974 __ecereNameSpace__ecere__sys__ChangeCh(expString, '\n', ' ');
16975 }
16976 if(expString[0])
16977 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "couldn't determine type of %s\n", (((void *)0))), expString);
16978 }
16979 if(boolResult)
16980 {
16981 FreeType(exp->expType);
16982 exp->expType = MkClassType("bool");
16983 exp->expType->truth = 1;
16984 }
16985 if(exp->__anon1.op.op != SIZEOF)
16986 exp->isConstant = (!exp->__anon1.op.exp1 || exp->__anon1.op.exp1->isConstant) && (!exp->__anon1.op.exp2 || exp->__anon1.op.exp2->isConstant);
16987 if(exp->__anon1.op.op == SIZEOF && exp->__anon1.op.exp2->expType)
16988 {
16989 DeclareType(curExternal, exp->__anon1.op.exp2->expType, 1, 0);
16990 }
16991 if(exp->__anon1.op.op == DELETE && exp->__anon1.op.exp2 && exp->__anon1.op.exp2->expType && __ecereProp_Type_Get_specConst(exp->__anon1.op.exp2->expType))
16992 Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "deleting const qualified object\n", (((void *)0))));
16993 yylloc = oldyylloc;
16994 FreeType(dummy);
16995 if(type2)
16996 FreeType(type2);
16997 break;
16998 }
16999 case 5:
17000 case 32:
17001 {
17002 struct Expression * e;
17003
17004 exp->isConstant = 1;
17005 for(e = (*exp->__anon1.list).first; e; e = e->next)
17006 {
17007 if(!e->next)
17008 {
17009 FreeType(e->destType);
17010 e->opDestType = exp->opDestType;
17011 e->destType = exp->destType;
17012 if(e->destType)
17013 {
17014 exp->destType->refCount++;
17015 }
17016 }
17017 ProcessExpressionType(e);
17018 if(!exp->expType && !e->next)
17019 {
17020 exp->expType = e->expType;
17021 if(e->expType)
17022 e->expType->refCount++;
17023 }
17024 if(!e->isConstant)
17025 exp->isConstant = 0;
17026 }
17027 e = (*exp->__anon1.list).first;
17028 if(!e->next && e->type == 8)
17029 {
17030 struct Expression * next = exp->next, * prev = exp->prev;
17031
17032 FreeType(exp->expType);
17033 FreeType(exp->destType);
17034 (__ecereNameSpace__ecere__com__eSystem_Delete(exp->__anon1.list), exp->__anon1.list = 0);
17035 *exp = *e;
17036 exp->prev = prev;
17037 exp->next = next;
17038 ((e ? (__ecereClass_Expression->Destructor ? __ecereClass_Expression->Destructor((void *)e) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(e)) : 0), e = 0);
17039 ProcessExpressionType(exp);
17040 }
17041 break;
17042 }
17043 case 6:
17044 {
17045 struct Expression * e;
17046
17047 exp->isConstant = 1;
17048 ProcessExpressionType(exp->__anon1.index.exp);
17049 if(!exp->__anon1.index.exp->isConstant)
17050 exp->isConstant = 0;
17051 if(exp->__anon1.index.exp->expType)
17052 {
17053 struct Type * source = exp->__anon1.index.exp->expType;
17054
17055 if(source->kind == 8 && source->__anon1._class && source->__anon1._class->__anon1.registered)
17056 {
17057 struct __ecereNameSpace__ecere__com__Class * _class = source->__anon1._class->__anon1.registered;
17058 struct __ecereNameSpace__ecere__com__Class * c = _class->templateClass ? _class->templateClass : _class;
17059
17060 if(_class != containerClass && __ecereNameSpace__ecere__com__eClass_IsDerived(c, containerClass) && _class->templateArgs)
17061 {
17062 exp->expType = ProcessTypeString(_class->templateArgs[2].__anon1.__anon1.dataTypeString, 0);
17063 if(exp->__anon1.index.index && (*exp->__anon1.index.index).last)
17064 {
17065 struct Type * type = ProcessTypeString(_class->templateArgs[1].__anon1.__anon1.dataTypeString, 0);
17066
17067 if(type->kind == 8)
17068 type->constant = 1;
17069 else if(type->kind == 13)
17070 {
17071 struct Type * t = type;
17072
17073 while(t->kind == 13)
17074 t = t->__anon1.type;
17075 t->constant = 1;
17076 }
17077 ((struct Expression *)(*exp->__anon1.index.index).last)->destType = type;
17078 }
17079 }
17080 }
17081 }
17082 for(e = (*exp->__anon1.index.index).first; e; e = e->next)
17083 {
17084 if(!e->next && exp->__anon1.index.exp->expType && exp->__anon1.index.exp->expType->kind == 12 && exp->__anon1.index.exp->expType->__anon1.__anon4.enumClass)
17085 {
17086 if(e->destType)
17087 FreeType(e->destType);
17088 e->destType = MkClassType(exp->__anon1.index.exp->expType->__anon1.__anon4.enumClass->string);
17089 }
17090 ProcessExpressionType(e);
17091 if(!e->next)
17092 {
17093 }
17094 if(!e->isConstant)
17095 exp->isConstant = 0;
17096 }
17097 if(!exp->expType)
17098 exp->expType = Dereference(exp->__anon1.index.exp->expType);
17099 if(exp->expType)
17100 DeclareType(curExternal, exp->expType, 1, 0);
17101 break;
17102 }
17103 case 7:
17104 {
17105 struct Expression * e;
17106 struct Type * functionType;
17107 struct Type * methodType = (((void *)0));
17108 char name[1024];
17109
17110 name[0] = '\0';
17111 if(inCompiler)
17112 {
17113 PrintExpression(exp->__anon1.call.exp, name);
17114 if(exp->__anon1.call.exp->expType && !exp->__anon1.call.exp->expType->__anon1.__anon2.returnType)
17115 {
17116 PrintExpression(exp->__anon1.call.exp, name);
17117 }
17118 }
17119 if(exp->__anon1.call.exp->type == 0)
17120 {
17121 struct Expression * idExp = exp->__anon1.call.exp;
17122 struct Identifier * id = idExp->__anon1.__anon1.identifier;
17123
17124 if(!strcmp(id->string, "__builtin_frame_address"))
17125 {
17126 exp->expType = ProcessTypeString("void *", 1);
17127 if(exp->__anon1.call.arguments && (*exp->__anon1.call.arguments).first)
17128 ProcessExpressionType((*exp->__anon1.call.arguments).first);
17129 break;
17130 }
17131 else if(!strcmp(id->string, "__ENDIAN_PAD"))
17132 {
17133 exp->expType = ProcessTypeString("int", 1);
17134 if(exp->__anon1.call.arguments && (*exp->__anon1.call.arguments).first)
17135 ProcessExpressionType((*exp->__anon1.call.arguments).first);
17136 break;
17137 }
17138 else if(!strcmp(id->string, "Max") || !strcmp(id->string, "Min") || !strcmp(id->string, "Sgn") || !strcmp(id->string, "Abs"))
17139 {
17140 struct Expression * a = (((void *)0));
17141 struct Expression * b = (((void *)0));
17142 struct Expression * tempExp1 = (((void *)0)), * tempExp2 = (((void *)0));
17143
17144 if((!strcmp(id->string, "Max") || !strcmp(id->string, "Min")) && (*exp->__anon1.call.arguments).count == 2)
17145 {
17146 a = (*exp->__anon1.call.arguments).first;
17147 b = (*exp->__anon1.call.arguments).last;
17148 tempExp1 = a;
17149 tempExp2 = b;
17150 }
17151 else if((*exp->__anon1.call.arguments).count == 1)
17152 {
17153 a = (*exp->__anon1.call.arguments).first;
17154 tempExp1 = a;
17155 }
17156 if(a)
17157 {
17158 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Clear((&*exp->__anon1.call.arguments));
17159 idExp->__anon1.__anon1.identifier = (((void *)0));
17160 FreeExpContents(exp);
17161 ProcessExpressionType(a);
17162 if(b)
17163 ProcessExpressionType(b);
17164 exp->type = 5;
17165 exp->__anon1.list = MkList();
17166 if(a->expType && (!b || b->expType))
17167 {
17168 if((!a->isConstant && a->type != 0) || (b && !b->isConstant && b->type != 0))
17169 {
17170 if(inCompiler)
17171 {
17172 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
17173 struct __ecereNameSpace__ecere__sys__OldList * decls = MkList();
17174 struct Declaration * decl;
17175 char temp1[1024], temp2[1024];
17176
17177 GetTypeSpecs(a->expType, specs);
17178 if(a && !a->isConstant && a->type != 0)
17179 {
17180 sprintf(temp1, "__simpleStruct%d", curContext->simpleID++);
17181 ListAdd(decls, MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier(temp1)), (((void *)0))));
17182 tempExp1 = QMkExpId(temp1);
17183 tempExp1->expType = a->expType;
17184 if(a->expType)
17185 a->expType->refCount++;
17186 ListAdd(exp->__anon1.list, MkExpOp(CopyExpression(tempExp1), '=', a));
17187 }
17188 if(b && !b->isConstant && b->type != 0)
17189 {
17190 sprintf(temp2, "__simpleStruct%d", curContext->simpleID++);
17191 ListAdd(decls, MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier(temp2)), (((void *)0))));
17192 tempExp2 = QMkExpId(temp2);
17193 tempExp2->expType = b->expType;
17194 if(b->expType)
17195 b->expType->refCount++;
17196 ListAdd(exp->__anon1.list, MkExpOp(CopyExpression(tempExp2), '=', b));
17197 }
17198 decl = MkDeclaration(specs, decls);
17199 if(!curCompound->__anon1.compound.declarations)
17200 curCompound->__anon1.compound.declarations = MkList();
17201 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*curCompound->__anon1.compound.declarations), (((void *)0)), decl);
17202 }
17203 }
17204 }
17205 if(!strcmp(id->string, "Max") || !strcmp(id->string, "Min"))
17206 {
17207 int op = (!strcmp(id->string, "Max")) ? '>' : '<';
17208
17209 ListAdd(exp->__anon1.list, MkExpCondition(MkExpBrackets(MkListOne(MkExpOp(CopyExpression(tempExp1), op, CopyExpression(tempExp2)))), MkListOne(CopyExpression(tempExp1)), CopyExpression(tempExp2)));
17210 exp->expType = a->expType;
17211 if(a->expType)
17212 a->expType->refCount++;
17213 }
17214 else if(!strcmp(id->string, "Abs"))
17215 {
17216 ListAdd(exp->__anon1.list, MkExpCondition(MkExpBrackets(MkListOne(MkExpOp(CopyExpression(tempExp1), '<', MkExpConstant("0")))), MkListOne(MkExpOp((((void *)0)), '-', CopyExpression(tempExp1))), CopyExpression(tempExp1)));
17217 exp->expType = a->expType;
17218 if(a->expType)
17219 a->expType->refCount++;
17220 }
17221 else if(!strcmp(id->string, "Sgn"))
17222 {
17223 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"))))));
17224 exp->expType = ProcessTypeString("int", 0);
17225 }
17226 FreeExpression(tempExp1);
17227 if(tempExp2)
17228 FreeExpression(tempExp2);
17229 FreeIdentifier(id);
17230 break;
17231 }
17232 }
17233 }
17234 {
17235 struct Type * dummy = (dummy = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type), dummy->count = 1, dummy->refCount = 1, dummy);
17236
17237 if(!exp->__anon1.call.exp->destType)
17238 {
17239 exp->__anon1.call.exp->destType = dummy;
17240 dummy->refCount++;
17241 }
17242 ProcessExpressionType(exp->__anon1.call.exp);
17243 if(exp->__anon1.call.exp->destType == dummy)
17244 {
17245 FreeType(dummy);
17246 exp->__anon1.call.exp->destType = (((void *)0));
17247 }
17248 FreeType(dummy);
17249 }
17250 functionType = exp->__anon1.call.exp->expType;
17251 if(functionType && functionType->kind == 16)
17252 {
17253 methodType = functionType;
17254 functionType = methodType->__anon1.__anon3.method->dataType;
17255 if(exp->__anon1.call.exp->expType->__anon1.__anon3.usedClass)
17256 {
17257 char typeString[1024];
17258
17259 typeString[0] = '\0';
17260 {
17261 struct Symbol * back = functionType->__anon1.__anon2.thisClass;
17262
17263 functionType->__anon1.__anon2.thisClass = (((void *)0));
17264 PrintType(functionType, typeString, 1, 1);
17265 functionType->__anon1.__anon2.thisClass = back;
17266 }
17267 if(strstr(typeString, "thisclass"))
17268 {
17269 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
17270 struct Declarator * decl;
17271
17272 {
17273 struct Context * context = SetupTemplatesContext(exp->__anon1.call.exp->expType->__anon1.__anon3.usedClass);
17274
17275 decl = SpecDeclFromString(typeString, specs, (((void *)0)));
17276 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))
17277 thisClassParams = 0;
17278 ReplaceThisClassSpecifiers(specs, exp->__anon1.call.exp->expType->__anon1.__anon3.usedClass);
17279 {
17280 struct __ecereNameSpace__ecere__com__Class * backupThisClass = thisClass;
17281
17282 thisClass = exp->__anon1.call.exp->expType->__anon1.__anon3.usedClass;
17283 ProcessDeclarator(decl, 1);
17284 thisClass = backupThisClass;
17285 }
17286 thisClassParams = 1;
17287 functionType = ProcessType(specs, decl);
17288 functionType->refCount = 0;
17289 FinishTemplatesContext(context);
17290 {
17291 struct Type * p, * op;
17292
17293 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)
17294 {
17295 if(op->kind == 21)
17296 p->thisClassFrom = methodType->__anon1.__anon3.method->_class;
17297 }
17298 }
17299 if(methodType->__anon1.__anon3.method->dataType->__anon1.__anon2.returnType->kind == 21)
17300 {
17301 functionType->__anon1.__anon2.returnType->thisClassFrom = methodType->__anon1.__anon3.method->_class;
17302 }
17303 }
17304 FreeList(specs, (void *)(FreeSpecifier));
17305 FreeDeclarator(decl);
17306 }
17307 }
17308 }
17309 if(functionType && functionType->kind == 13 && functionType->__anon1.type && functionType->__anon1.type->kind == 11)
17310 {
17311 struct Type * type = functionType->__anon1.type;
17312
17313 if(!functionType->refCount)
17314 {
17315 functionType->__anon1.type = (((void *)0));
17316 FreeType(functionType);
17317 }
17318 functionType = type;
17319 }
17320 if(functionType && functionType->kind != 11)
17321 {
17322 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "called object %s is not a function\n", (((void *)0))), name);
17323 }
17324 else if(functionType)
17325 {
17326 unsigned int emptyParams = 0, noParams = 0;
17327 struct Expression * e = exp->__anon1.call.arguments ? (*exp->__anon1.call.arguments).first : (((void *)0));
17328 struct Type * type = functionType->__anon1.__anon2.params.first;
17329 struct Expression * memberExp = (exp->__anon1.call.exp->type == 8) ? exp->__anon1.call.exp : (((void *)0));
17330 int extra = 0;
17331 struct Location oldyylloc = yylloc;
17332
17333 if(!type)
17334 emptyParams = 1;
17335 if(functionType->extraParam && e && functionType->__anon1.__anon2.thisClass)
17336 {
17337 e->destType = MkClassType(functionType->__anon1.__anon2.thisClass->string);
17338 e = e->next;
17339 }
17340 if(!functionType->__anon1.__anon2.staticMethod && !functionType->extraParam)
17341 {
17342 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)
17343 {
17344 type = MkClassType(memberExp->__anon1.member.exp->expType->__anon1._class->string);
17345 if(e)
17346 {
17347 e->destType = type;
17348 e = e->next;
17349 type = functionType->__anon1.__anon2.params.first;
17350 }
17351 else
17352 type->refCount = 0;
17353 }
17354 else if(!memberExp && (functionType->__anon1.__anon2.thisClass || (methodType && methodType->__anon1.__anon3.methodClass)))
17355 {
17356 type = MkClassType(functionType->__anon1.__anon2.thisClass ? functionType->__anon1.__anon2.thisClass->string : (methodType ? methodType->__anon1.__anon3.methodClass->fullName : (((void *)0))));
17357 type->byReference = functionType->byReference;
17358 type->typedByReference = functionType->typedByReference;
17359 if(e)
17360 {
17361 if(e->next && type->kind == 8 && (functionType && functionType->__anon1.__anon2.thisClass) && functionType->classObjectType == 2)
17362 e = e->next;
17363 e->destType = type;
17364 e = e->next;
17365 type = functionType->__anon1.__anon2.params.first;
17366 }
17367 else
17368 type->refCount = 0;
17369 }
17370 }
17371 if(type && type->kind == 0)
17372 {
17373 noParams = 1;
17374 if(!type->refCount)
17375 FreeType(type);
17376 type = (((void *)0));
17377 }
17378 for(; e; e = e->next)
17379 {
17380 if(!type && !emptyParams)
17381 {
17382 yylloc = e->loc;
17383 if(methodType && methodType->__anon1.__anon3.methodClass)
17384 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);
17385 else
17386 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);
17387 break;
17388 }
17389 if(methodType && type && type->kind == 20 && type->__anon1.templateParameter->type == 0)
17390 {
17391 struct Type * templatedType = (((void *)0));
17392 struct __ecereNameSpace__ecere__com__Class * _class = methodType->__anon1.__anon3.usedClass;
17393 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * curParam = (((void *)0));
17394 int id = 0;
17395
17396 if(_class && _class->templateArgs)
17397 {
17398 struct __ecereNameSpace__ecere__com__Class * sClass;
17399
17400 for(sClass = _class; sClass; sClass = sClass->base)
17401 {
17402 if(sClass->templateClass)
17403 sClass = sClass->templateClass;
17404 id = 0;
17405 for(curParam = sClass->templateParams.first; curParam; curParam = curParam->next)
17406 {
17407 if(curParam->type == 0 && !strcmp(type->__anon1.templateParameter->identifier->string, curParam->name))
17408 {
17409 struct __ecereNameSpace__ecere__com__Class * nextClass;
17410
17411 for(nextClass = sClass->base; nextClass; nextClass = nextClass->base)
17412 {
17413 if(nextClass->templateClass)
17414 nextClass = nextClass->templateClass;
17415 id += nextClass->templateParams.count;
17416 }
17417 break;
17418 }
17419 id++;
17420 }
17421 if(curParam)
17422 break;
17423 }
17424 }
17425 if(curParam && _class->templateArgs[id].__anon1.__anon1.dataTypeString)
17426 {
17427 unsigned int constant = type->constant;
17428 struct __ecereNameSpace__ecere__com__ClassTemplateArgument arg = _class->templateArgs[id];
17429
17430 {
17431 struct Context * context = SetupTemplatesContext(_class);
17432
17433 templatedType = ProcessTypeString(arg.__anon1.__anon1.dataTypeString, 0);
17434 FinishTemplatesContext(context);
17435 }
17436 if(templatedType->kind == 8 && constant)
17437 templatedType->constant = 1;
17438 else if(templatedType->kind == 13)
17439 {
17440 struct Type * t = templatedType->__anon1.type;
17441
17442 while(t->kind == 13)
17443 t = t->__anon1.type;
17444 if(constant)
17445 t->constant = constant;
17446 }
17447 e->destType = templatedType;
17448 if(templatedType)
17449 {
17450 templatedType->passAsTemplate = 1;
17451 }
17452 }
17453 else
17454 {
17455 e->destType = type;
17456 if(type)
17457 type->refCount++;
17458 }
17459 }
17460 else
17461 {
17462 if(type && type->kind == 14 && type->prev && type->prev->kind == 8 && type->prev->classObjectType)
17463 {
17464 e->destType = type->prev;
17465 e->destType->refCount++;
17466 }
17467 else
17468 {
17469 e->destType = type;
17470 if(type)
17471 type->refCount++;
17472 }
17473 }
17474 if(type && type->kind != 14)
17475 {
17476 struct Type * next = type->next;
17477
17478 if(!type->refCount)
17479 FreeType(type);
17480 type = next;
17481 }
17482 }
17483 if(type && type->kind != 14)
17484 {
17485 if(methodType && methodType->__anon1.__anon3.methodClass)
17486 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);
17487 else
17488 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);
17489 }
17490 yylloc = oldyylloc;
17491 if(type && !type->refCount)
17492 FreeType(type);
17493 }
17494 else
17495 {
17496 functionType = __extension__ ({
17497 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
17498
17499 __ecereInstance1->refCount = 0, __ecereInstance1->kind = 11, __ecereInstance1;
17500 });
17501 if(exp->__anon1.call.exp->type == 0)
17502 {
17503 char * string = exp->__anon1.call.exp->__anon1.__anon1.identifier->string;
17504
17505 if(inCompiler)
17506 {
17507 struct Symbol * symbol;
17508 struct Location oldyylloc = yylloc;
17509
17510 yylloc = exp->__anon1.call.exp->__anon1.__anon1.identifier->loc;
17511 if(strstr(string, "__builtin_") == string)
17512 {
17513 if(exp->destType)
17514 {
17515 functionType->__anon1.__anon2.returnType = exp->destType;
17516 exp->destType->refCount++;
17517 }
17518 }
17519 else
17520 Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "%s undefined; assuming extern returning int\n", (((void *)0))), string);
17521 symbol = __extension__ ({
17522 struct Symbol * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Symbol);
17523
17524 __ecereInstance1->string = __ecereNameSpace__ecere__sys__CopyString(string), __ecereInstance1->type = ProcessTypeString("int()", 1), __ecereInstance1;
17525 });
17526 __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Add(&globalContext->symbols, (struct __ecereNameSpace__ecere__sys__BTNode *)symbol);
17527 if(strstr(symbol->string, "::"))
17528 globalContext->hasNameSpace = 1;
17529 yylloc = oldyylloc;
17530 }
17531 }
17532 else if(exp->__anon1.call.exp->type == 8)
17533 {
17534 }
17535 else
17536 Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "callable object undefined; extern assuming returning int\n", (((void *)0))));
17537 if(!functionType->__anon1.__anon2.returnType)
17538 {
17539 functionType->__anon1.__anon2.returnType = __extension__ ({
17540 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
17541
17542 __ecereInstance1->refCount = 1, __ecereInstance1->kind = 3, __ecereInstance1;
17543 });
17544 }
17545 }
17546 if(functionType && functionType->kind == 11)
17547 {
17548 exp->expType = functionType->__anon1.__anon2.returnType;
17549 if(functionType->__anon1.__anon2.returnType)
17550 functionType->__anon1.__anon2.returnType->refCount++;
17551 if(!functionType->refCount)
17552 FreeType(functionType);
17553 }
17554 if(exp->__anon1.call.arguments)
17555 {
17556 for(e = (*exp->__anon1.call.arguments).first; e; e = e->next)
17557 ProcessExpressionType(e);
17558 }
17559 break;
17560 }
17561 case 8:
17562 {
17563 struct Type * type;
17564 struct Location oldyylloc = yylloc;
17565 unsigned int thisPtr;
17566 struct Expression * checkExp = exp->__anon1.member.exp;
17567
17568 while(checkExp)
17569 {
17570 if(checkExp->type == 11)
17571 checkExp = checkExp->__anon1.cast.exp;
17572 else if(checkExp->type == 5)
17573 checkExp = checkExp->__anon1.list ? (*checkExp->__anon1.list).first : (((void *)0));
17574 else
17575 break;
17576 }
17577 thisPtr = (checkExp && checkExp->type == 0 && !strcmp(checkExp->__anon1.__anon1.identifier->string, "this"));
17578 exp->thisPtr = thisPtr;
17579 if(exp->__anon1.member.member && exp->__anon1.member.member->_class && exp->__anon1.member.member->_class->__anon1.__anon1.name)
17580 {
17581 exp->__anon1.member.member->classSym = exp->__anon1.member.member->_class->__anon1.__anon1.symbol;
17582 }
17583 ProcessExpressionType(exp->__anon1.member.exp);
17584 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)
17585 {
17586 exp->isConstant = 0;
17587 }
17588 else
17589 exp->isConstant = exp->__anon1.member.exp->isConstant;
17590 type = exp->__anon1.member.exp->expType;
17591 yylloc = exp->loc;
17592 if(type && (type->kind == 20))
17593 {
17594 struct __ecereNameSpace__ecere__com__Class * _class = thisClass ? thisClass : currentClass;
17595 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * param = (((void *)0));
17596
17597 if(_class)
17598 {
17599 for(param = _class->templateParams.first; param; param = param->next)
17600 {
17601 if(param->type == 1 && exp->__anon1.member.member && exp->__anon1.member.member->string && !strcmp(param->name, exp->__anon1.member.member->string))
17602 break;
17603 }
17604 }
17605 if(param && param->defaultArg.__anon1.__anon2.__anon1.member)
17606 {
17607 struct Expression * argExp = GetTemplateArgExpByName(param->name, thisClass, 1);
17608
17609 if(argExp)
17610 {
17611 struct Expression * expMember = exp->__anon1.member.exp;
17612 struct Declarator * decl;
17613 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
17614 char thisClassTypeString[1024];
17615
17616 FreeIdentifier(exp->__anon1.member.member);
17617 ProcessExpressionType(argExp);
17618 {
17619 char * colon = strstr(param->defaultArg.__anon1.__anon2.memberString, "::");
17620
17621 if(colon)
17622 {
17623 memcpy(thisClassTypeString, param->defaultArg.__anon1.__anon2.memberString, colon - param->defaultArg.__anon1.__anon2.memberString);
17624 thisClassTypeString[colon - param->defaultArg.__anon1.__anon2.memberString] = '\0';
17625 }
17626 else
17627 strcpy(thisClassTypeString, _class->fullName);
17628 }
17629 decl = SpecDeclFromString(param->defaultArg.__anon1.__anon2.__anon1.member->dataTypeString, specs, (((void *)0)));
17630 exp->expType = ProcessType(specs, decl);
17631 if(exp->expType->kind == 8 && exp->expType->__anon1._class && exp->expType->__anon1._class->__anon1.registered && exp->expType->__anon1._class->__anon1.registered->templateClass)
17632 {
17633 struct __ecereNameSpace__ecere__com__Class * expClass = exp->expType->__anon1._class->__anon1.registered;
17634 struct __ecereNameSpace__ecere__com__Class * cClass = (((void *)0));
17635 int paramCount = 0;
17636 int lastParam = -1;
17637 char templateString[1024];
17638 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * param;
17639
17640 sprintf(templateString, "%s<", expClass->templateClass->fullName);
17641 for(cClass = expClass; cClass; cClass = cClass->base)
17642 {
17643 int p = 0;
17644
17645 for(param = cClass->templateParams.first; param; param = param->next)
17646 {
17647 int id = p;
17648 struct __ecereNameSpace__ecere__com__Class * sClass;
17649 struct __ecereNameSpace__ecere__com__ClassTemplateArgument arg;
17650
17651 for(sClass = cClass->base; sClass; sClass = sClass->base)
17652 id += sClass->templateParams.count;
17653 arg = expClass->templateArgs[id];
17654 for(sClass = _class; sClass; sClass = sClass->base)
17655 {
17656 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * cParam;
17657 int p = 0;
17658 struct __ecereNameSpace__ecere__com__Class * nextClass;
17659
17660 for(nextClass = sClass->base; nextClass; nextClass = nextClass->base)
17661 p += nextClass->templateParams.count;
17662 for(cParam = sClass->templateParams.first; cParam; cParam = cParam->next, p++)
17663 {
17664 if(cParam->type == 0 && arg.__anon1.__anon1.dataTypeString && !strcmp(cParam->name, arg.__anon1.__anon1.dataTypeString))
17665 {
17666 if(_class->templateArgs && arg.__anon1.__anon1.dataTypeString && (!param->defaultArg.__anon1.__anon1.dataTypeString || strcmp(arg.__anon1.__anon1.dataTypeString, param->defaultArg.__anon1.__anon1.dataTypeString)))
17667 {
17668 arg.__anon1.__anon1.dataTypeString = _class->templateArgs[p].__anon1.__anon1.dataTypeString;
17669 arg.__anon1.__anon1.dataTypeClass = _class->templateArgs[p].__anon1.__anon1.dataTypeClass;
17670 break;
17671 }
17672 }
17673 }
17674 }
17675 {
17676 char argument[256];
17677
17678 argument[0] = '\0';
17679 switch(param->type)
17680 {
17681 case 2:
17682 {
17683 char expString[1024];
17684 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
17685 struct Declarator * decl = SpecDeclFromString(param->__anon1.dataTypeString, specs, (((void *)0)));
17686 struct Expression * exp;
17687 char * string = PrintHexUInt64(arg.__anon1.expression.__anon1.ui64);
17688
17689 exp = MkExpCast(MkTypeName(specs, decl), MkExpConstant(string));
17690 (__ecereNameSpace__ecere__com__eSystem_Delete(string), string = 0);
17691 ProcessExpressionType(exp);
17692 ComputeExpression(exp);
17693 expString[0] = '\0';
17694 PrintExpression(exp, expString);
17695 strcat(argument, expString);
17696 FreeExpression(exp);
17697 break;
17698 }
17699 case 1:
17700 {
17701 strcat(argument, arg.__anon1.__anon2.__anon1.member->name);
17702 break;
17703 }
17704 case 0:
17705 {
17706 if(arg.__anon1.__anon1.dataTypeString && (!param->defaultArg.__anon1.__anon1.dataTypeString || strcmp(arg.__anon1.__anon1.dataTypeString, param->defaultArg.__anon1.__anon1.dataTypeString)))
17707 {
17708 if(!strcmp(arg.__anon1.__anon1.dataTypeString, "thisclass"))
17709 strcat(argument, thisClassTypeString);
17710 else
17711 strcat(argument, arg.__anon1.__anon1.dataTypeString);
17712 }
17713 break;
17714 }
17715 }
17716 if(argument[0])
17717 {
17718 if(paramCount)
17719 strcat(templateString, ", ");
17720 if(lastParam != p - 1)
17721 {
17722 strcat(templateString, param->name);
17723 strcat(templateString, " = ");
17724 }
17725 strcat(templateString, argument);
17726 paramCount++;
17727 lastParam = p;
17728 }
17729 p++;
17730 }
17731 }
17732 }
17733 {
17734 int len = strlen(templateString);
17735
17736 if(templateString[len - 1] == '>')
17737 templateString[len++] = ' ';
17738 templateString[len++] = '>';
17739 templateString[len++] = '\0';
17740 }
17741 {
17742 struct Context * context = SetupTemplatesContext(_class);
17743
17744 FreeType(exp->expType);
17745 exp->expType = ProcessTypeString(templateString, 0);
17746 FinishTemplatesContext(context);
17747 }
17748 }
17749 if(!__ecereProp_Type_Get_isPointerType(expMember->expType))
17750 expMember = MkExpCast(MkTypeName(MkListOne(MkSpecifierName("uintptr")), (((void *)0))), expMember);
17751 exp->type = 5;
17752 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")))))))));
17753 }
17754 }
17755 else if(type->__anon1.templateParameter && type->__anon1.templateParameter->type == 0 && (type->__anon1.templateParameter->__anon1.dataType || type->__anon1.templateParameter->dataTypeString))
17756 {
17757 type = ProcessTemplateParameterType(type->__anon1.templateParameter);
17758 }
17759 }
17760 if(type && (type->kind == 20))
17761 ;
17762 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)))
17763 {
17764 struct Identifier * id = exp->__anon1.member.member;
17765 int typeKind = type->kind;
17766 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));
17767
17768 if(typeKind == 19 && exp->__anon1.member.exp->type == 24)
17769 {
17770 _class = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "ecere::com::Class");
17771 typeKind = 8;
17772 }
17773 if(id)
17774 {
17775 if(typeKind == 3 || typeKind == 15)
17776 _class = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "int");
17777 else if(!_class)
17778 {
17779 if(type->kind == 8 && type->__anon1._class && type->__anon1._class->__anon1.registered)
17780 {
17781 _class = type->__anon1._class->__anon1.registered;
17782 }
17783 else if((type->kind == 12 || type->kind == 13) && type->__anon1.type && type->__anon1.type->kind == 1)
17784 {
17785 _class = FindClass("char *")->__anon1.registered;
17786 }
17787 else if(type->kind == 13)
17788 {
17789 _class = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "uintptr");
17790 FreeType(exp->expType);
17791 exp->expType = ProcessTypeString("uintptr", 0);
17792 exp->byReference = 1;
17793 }
17794 else
17795 {
17796 char string[1024] = "";
17797 struct Symbol * classSym;
17798
17799 PrintTypeNoConst(type, string, 0, 1);
17800 classSym = FindClass(string);
17801 if(classSym)
17802 _class = classSym->__anon1.registered;
17803 }
17804 }
17805 }
17806 if(_class && id)
17807 {
17808 struct __ecereNameSpace__ecere__com__Property * prop = (((void *)0));
17809 struct __ecereNameSpace__ecere__com__Method * method = (((void *)0));
17810 struct __ecereNameSpace__ecere__com__DataMember * member = (((void *)0));
17811 struct __ecereNameSpace__ecere__com__Property * revConvert = (((void *)0));
17812 struct __ecereNameSpace__ecere__com__ClassProperty * classProp = (((void *)0));
17813
17814 if(id && id->_class && id->_class->__anon1.__anon1.name && !strcmp(id->_class->__anon1.__anon1.name, "property"))
17815 exp->__anon1.member.memberType = 1;
17816 if(id && id->_class && type->__anon1._class && !__ecereNameSpace__ecere__com__eClass_IsDerived(type->__anon1._class->__anon1.registered, _class))
17817 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "invalid class specifier %s for object of class %s\n", (((void *)0))), _class->fullName, type->__anon1._class->string);
17818 if(typeKind != 19)
17819 {
17820 if((exp->__anon1.member.memberType == 0 && thisPtr) || exp->__anon1.member.memberType == 3)
17821 {
17822 member = __ecereNameSpace__ecere__com__eClass_FindDataMember(_class, id->string, privateModule, (((void *)0)), (((void *)0)));
17823 if(member && member->_class != (_class->templateClass ? _class->templateClass : _class) && exp->__anon1.member.memberType != 3)
17824 {
17825 prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, id->string, privateModule);
17826 if(prop)
17827 member = (((void *)0));
17828 }
17829 if(!member && !prop)
17830 prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, id->string, privateModule);
17831 if((member && member->_class == (_class->templateClass ? _class->templateClass : _class)) || (prop && prop->_class == (_class->templateClass ? _class->templateClass : _class)))
17832 exp->__anon1.member.thisPtr = 1;
17833 }
17834 else
17835 {
17836 unsigned int useMemberForNonConst = 0;
17837
17838 if(!id->classSym)
17839 {
17840 prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, id->string, (((void *)0)));
17841 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);
17842 if(useMemberForNonConst || !id->_class || !id->_class->__anon1.__anon1.name || strcmp(id->_class->__anon1.__anon1.name, "property"))
17843 member = __ecereNameSpace__ecere__com__eClass_FindDataMember(_class, id->string, (((void *)0)), (((void *)0)), (((void *)0)));
17844 }
17845 if((!prop || useMemberForNonConst) && !member)
17846 {
17847 method = useMemberForNonConst ? (((void *)0)) : __ecereNameSpace__ecere__com__eClass_FindMethod(_class, id->string, (((void *)0)));
17848 if(!method)
17849 {
17850 prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, id->string, privateModule);
17851 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);
17852 if(useMemberForNonConst || !id->_class || !id->_class->__anon1.__anon1.name || strcmp(id->_class->__anon1.__anon1.name, "property"))
17853 member = __ecereNameSpace__ecere__com__eClass_FindDataMember(_class, id->string, privateModule, (((void *)0)), (((void *)0)));
17854 }
17855 }
17856 if(member && prop)
17857 {
17858 if(useMemberForNonConst || (member->_class != prop->_class && !id->_class && __ecereNameSpace__ecere__com__eClass_IsDerived(member->_class, prop->_class)))
17859 prop = (((void *)0));
17860 else
17861 member = (((void *)0));
17862 }
17863 }
17864 }
17865 if(!prop && !member && !method)
17866 method = __ecereNameSpace__ecere__com__eClass_FindMethod(_class, id->string, privateModule);
17867 if(!prop && !member && !method)
17868 {
17869 if(typeKind == 19)
17870 {
17871 classProp = __ecereNameSpace__ecere__com__eClass_FindClassProperty(type->__anon1._class->__anon1.registered, exp->__anon1.member.member->string);
17872 if(classProp)
17873 {
17874 exp->__anon1.member.memberType = 5;
17875 exp->expType = ProcessTypeString(classProp->dataTypeString, 0);
17876 }
17877 else
17878 {
17879 char structName[1024];
17880 struct Identifier * id = exp->__anon1.member.member;
17881 struct Expression * classExp = exp->__anon1.member.exp;
17882
17883 type->refCount++;
17884 FreeType(classExp->expType);
17885 classExp->expType = ProcessTypeString("ecere::com::Class", 0);
17886 strcpy(structName, "__ecereClassData_");
17887 FullClassNameCat(structName, type->__anon1._class->string, 0);
17888 exp->type = 9;
17889 exp->__anon1.member.member = id;
17890 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"))))))));
17891 FreeType(type);
17892 ProcessExpressionType(exp);
17893 return ;
17894 }
17895 }
17896 else
17897 {
17898 struct Symbol * classSym = FindClass(id->string);
17899
17900 if(classSym)
17901 {
17902 struct __ecereNameSpace__ecere__com__Class * convertClass = classSym->__anon1.registered;
17903
17904 if(convertClass)
17905 revConvert = __ecereNameSpace__ecere__com__eClass_FindProperty(convertClass, _class->fullName, privateModule);
17906 }
17907 }
17908 }
17909 if(exp->__anon1.member.exp->destType)
17910 FreeType(exp->__anon1.member.exp->destType);
17911 {
17912 if(method && !method->_class->symbol)
17913 method->_class->symbol = FindClass(method->_class->fullName);
17914 if(prop && !prop->_class->symbol)
17915 prop->_class->symbol = FindClass(prop->_class->fullName);
17916 exp->__anon1.member.exp->destType = __extension__ ({
17917 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
17918
17919 __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;
17920 });
17921 }
17922 if(prop)
17923 {
17924 exp->__anon1.member.memberType = 1;
17925 if(!prop->dataType)
17926 ProcessPropertyType(prop);
17927 exp->expType = prop->dataType;
17928 if(!strcmp(_class->base->fullName, "eda::Row") && !exp->expType->constant && !exp->destType)
17929 {
17930 struct Type * type = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
17931
17932 CopyTypeInto(type, exp->expType);
17933 type->refCount = 1;
17934 type->constant = 1;
17935 exp->expType = type;
17936 }
17937 else if(prop->dataType)
17938 prop->dataType->refCount++;
17939 }
17940 else if(member)
17941 {
17942 if(exp->__anon1.member.exp->expType->classObjectType == 2 && !strcmp(exp->__anon1.member.member->string, "_class"))
17943 {
17944 FreeExpContents(exp);
17945 exp->type = 0;
17946 exp->__anon1.__anon1.identifier = MkIdentifier("class");
17947 ProcessExpressionType(exp);
17948 return ;
17949 }
17950 exp->__anon1.member.memberType = 3;
17951 DeclareStruct(curExternal, _class->fullName, 0, 1);
17952 if(member->_class != _class)
17953 DeclareStruct(curExternal, member->_class->fullName, 0, 1);
17954 if(!member->dataType)
17955 {
17956 struct Context * context = SetupTemplatesContext(_class);
17957
17958 member->dataType = ProcessTypeString(member->dataTypeString, 0);
17959 FinishTemplatesContext(context);
17960 }
17961 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)
17962 member->dataType->bitMemberSize = ((struct __ecereNameSpace__ecere__com__BitMember *)member)->size;
17963 exp->expType = member->dataType;
17964 if(member->dataType)
17965 member->dataType->refCount++;
17966 }
17967 else if(revConvert)
17968 {
17969 exp->__anon1.member.memberType = 4;
17970 exp->expType = MkClassType(revConvert->_class->fullName);
17971 }
17972 else if(method)
17973 {
17974 {
17975 exp->__anon1.member.memberType = 2;
17976 }
17977 if(!method->dataType)
17978 ProcessMethodType(method);
17979 exp->expType = __extension__ ({
17980 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
17981
17982 __ecereInstance1->refCount = 1, __ecereInstance1->kind = 16, __ecereInstance1->__anon1.__anon3.method = method, __ecereInstance1;
17983 });
17984 exp->expType->__anon1.__anon3.methodClass = (id && id->_class) ? _class : (((void *)0));
17985 exp->expType->__anon1.__anon3.usedClass = _class;
17986 }
17987 else if(!classProp)
17988 {
17989 if(exp->__anon1.member.exp->expType->classObjectType == 2 && !strcmp(exp->__anon1.member.member->string, "_class"))
17990 {
17991 FreeExpContents(exp);
17992 exp->type = 0;
17993 exp->__anon1.__anon1.identifier = MkIdentifier("class");
17994 FreeType(exp->expType);
17995 exp->expType = MkClassType("ecere::com::Class");
17996 return ;
17997 }
17998 yylloc = exp->__anon1.member.member->loc;
17999 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "couldn't find member %s in class %s\n", (((void *)0))), id->string, _class->fullName);
18000 if(inCompiler)
18001 __ecereNameSpace__ecere__com__eClass_AddDataMember(_class, id->string, "int", 0, 0, 1);
18002 }
18003 if(_class && exp->expType)
18004 {
18005 struct __ecereNameSpace__ecere__com__Class * tClass;
18006
18007 tClass = type->__anon1._class && type->__anon1._class->__anon1.registered ? type->__anon1._class->__anon1.registered : _class;
18008 while(tClass && !tClass->templateClass)
18009 tClass = tClass->base;
18010 if(tClass && exp->expType->kind == 20 && exp->expType->__anon1.templateParameter->type == 0)
18011 {
18012 int id = 0;
18013 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * curParam = (((void *)0));
18014 struct __ecereNameSpace__ecere__com__Class * sClass;
18015
18016 for(sClass = tClass; sClass; sClass = sClass->base)
18017 {
18018 id = 0;
18019 if(sClass->templateClass)
18020 sClass = sClass->templateClass;
18021 for(curParam = sClass->templateParams.first; curParam; curParam = curParam->next)
18022 {
18023 if(curParam->type == 0 && !strcmp(exp->expType->__anon1.templateParameter->identifier->string, curParam->name))
18024 {
18025 for(sClass = sClass->base; sClass; sClass = sClass->base)
18026 id += sClass->templateParams.count;
18027 break;
18028 }
18029 id++;
18030 }
18031 if(curParam)
18032 break;
18033 }
18034 if(curParam && tClass->templateArgs[id].__anon1.__anon1.dataTypeString)
18035 {
18036 struct __ecereNameSpace__ecere__com__ClassTemplateArgument arg = tClass->templateArgs[id];
18037 struct Context * context = SetupTemplatesContext(tClass);
18038 unsigned int constant = exp->expType->constant;
18039 unsigned int passAsTemplate = 0;
18040 struct __ecereNameSpace__ecere__com__Class * thisClassFrom = (((void *)0));
18041 struct Type * t = ProcessTypeString(exp->expType->__anon1.templateParameter->dataTypeString, 0);
18042
18043 if(t && t->kind == 8 && t->__anon1._class)
18044 thisClassFrom = t->__anon1._class->__anon1.registered;
18045 else
18046 thisClassFrom = __ecereNameSpace__ecere__com__eSystem_FindClass(GetPrivateModule(), "class");
18047 FreeType(t);
18048 passAsTemplate = tClass->templateClass && (exp->expType->kind != 20 || (!exp->expType->__anon1.templateParameter || (!exp->expType->__anon1.templateParameter->dataTypeString && !exp->expType->__anon1.templateParameter->__anon1.dataType)));
18049 FreeType(exp->expType);
18050 exp->expType = ProcessTypeString(arg.__anon1.__anon1.dataTypeString, 0);
18051 exp->expType->thisClassFrom = thisClassFrom;
18052 if(exp->expType->kind == 8 && constant)
18053 exp->expType->constant = 1;
18054 else if(exp->expType->kind == 13)
18055 {
18056 struct Type * t = exp->expType->__anon1.type;
18057
18058 while(t->kind == 13)
18059 t = t->__anon1.type;
18060 if(constant)
18061 t->constant = constant;
18062 }
18063 if(exp->expType)
18064 {
18065 if(exp->expType->kind == 21)
18066 {
18067 FreeType(exp->expType);
18068 exp->expType = ReplaceThisClassType(_class);
18069 }
18070 if(passAsTemplate)
18071 exp->expType->passAsTemplate = 1;
18072 if(!exp->destType)
18073 {
18074 exp->destType = ProcessTypeString(arg.__anon1.__anon1.dataTypeString, 0);
18075 if(exp->destType->kind == 8 && constant)
18076 exp->destType->constant = 1;
18077 else if(exp->destType->kind == 13)
18078 {
18079 struct Type * t = exp->destType->__anon1.type;
18080
18081 while(t->kind == 13)
18082 t = t->__anon1.type;
18083 if(constant)
18084 t->constant = constant;
18085 }
18086 if(exp->destType->kind == 21)
18087 {
18088 FreeType(exp->destType);
18089 exp->destType = ReplaceThisClassType(_class);
18090 }
18091 }
18092 }
18093 FinishTemplatesContext(context);
18094 }
18095 }
18096 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)
18097 {
18098 int id = 0;
18099 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * curParam = (((void *)0));
18100 struct __ecereNameSpace__ecere__com__Class * sClass;
18101
18102 for(sClass = tClass; sClass; sClass = sClass->base)
18103 {
18104 id = 0;
18105 if(sClass->templateClass)
18106 sClass = sClass->templateClass;
18107 for(curParam = sClass->templateParams.first; curParam; curParam = curParam->next)
18108 {
18109 if(curParam->type == 0 && !strcmp(exp->expType->__anon1.type->__anon1.templateParameter->identifier->string, curParam->name))
18110 {
18111 for(sClass = sClass->base; sClass; sClass = sClass->base)
18112 id += sClass->templateParams.count;
18113 break;
18114 }
18115 id++;
18116 }
18117 if(curParam)
18118 break;
18119 }
18120 if(curParam)
18121 {
18122 struct __ecereNameSpace__ecere__com__ClassTemplateArgument arg = tClass->templateArgs[id];
18123 struct Context * context = SetupTemplatesContext(tClass);
18124 struct Type * basicType;
18125
18126 basicType = ProcessTypeString(arg.__anon1.__anon1.dataTypeString, 0);
18127 if(basicType)
18128 {
18129 if(basicType->kind == 21)
18130 {
18131 FreeType(basicType);
18132 basicType = ReplaceThisClassType(_class);
18133 }
18134 FreeType(exp->expType);
18135 exp->expType = __extension__ ({
18136 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
18137
18138 __ecereInstance1->refCount = 1, __ecereInstance1->kind = 13, __ecereInstance1->__anon1.type = basicType, __ecereInstance1;
18139 });
18140 if(!exp->destType)
18141 {
18142 exp->destType = exp->expType;
18143 exp->destType->refCount++;
18144 }
18145 {
18146 struct Expression * newExp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression);
18147 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
18148 struct Declarator * decl;
18149
18150 decl = SpecDeclFromString(arg.__anon1.__anon1.dataTypeString, specs, (((void *)0)));
18151 *newExp = *exp;
18152 if(exp->destType)
18153 exp->destType->refCount++;
18154 if(exp->expType)
18155 exp->expType->refCount++;
18156 exp->type = 11;
18157 exp->__anon1.cast.typeName = MkTypeName(specs, MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), decl));
18158 exp->__anon1.cast.exp = newExp;
18159 }
18160 }
18161 FinishTemplatesContext(context);
18162 }
18163 }
18164 else if(tClass && exp->expType->kind == 8 && exp->expType->__anon1._class && strchr(exp->expType->__anon1._class->string, '<'))
18165 {
18166 struct __ecereNameSpace__ecere__com__Class * expClass = exp->expType->__anon1._class->__anon1.registered;
18167
18168 if(expClass)
18169 {
18170 struct __ecereNameSpace__ecere__com__Class * cClass = (((void *)0));
18171 int p = 0;
18172 int paramCount = 0;
18173 int lastParam = -1;
18174 char templateString[1024];
18175 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * param;
18176
18177 sprintf(templateString, "%s<", expClass->templateClass->fullName);
18178 while(cClass != expClass)
18179 {
18180 struct __ecereNameSpace__ecere__com__Class * sClass;
18181
18182 for(sClass = expClass; sClass && sClass->base != cClass; sClass = sClass->base)
18183 ;
18184 cClass = sClass;
18185 for(param = cClass->templateParams.first; param; param = param->next)
18186 {
18187 struct __ecereNameSpace__ecere__com__Class * cClassCur = (((void *)0));
18188 int cp = 0;
18189 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * paramCur = (((void *)0));
18190 struct __ecereNameSpace__ecere__com__ClassTemplateArgument arg;
18191
18192 while(cClassCur != tClass && !paramCur)
18193 {
18194 struct __ecereNameSpace__ecere__com__Class * sClassCur;
18195
18196 for(sClassCur = tClass; sClassCur && sClassCur->base != cClassCur; sClassCur = sClassCur->base)
18197 ;
18198 cClassCur = sClassCur;
18199 for(paramCur = cClassCur->templateParams.first; paramCur; paramCur = paramCur->next)
18200 {
18201 if(!strcmp(paramCur->name, param->name))
18202 {
18203 break;
18204 }
18205 cp++;
18206 }
18207 }
18208 if(paramCur && paramCur->type == 0)
18209 arg = tClass->templateArgs[cp];
18210 else
18211 arg = expClass->templateArgs[p];
18212 {
18213 char argument[256];
18214
18215 argument[0] = '\0';
18216 switch(param->type)
18217 {
18218 case 2:
18219 {
18220 char expString[1024];
18221 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
18222 struct Declarator * decl = SpecDeclFromString(param->__anon1.dataTypeString, specs, (((void *)0)));
18223 struct Expression * exp;
18224 char * string = PrintHexUInt64(arg.__anon1.expression.__anon1.ui64);
18225
18226 exp = MkExpCast(MkTypeName(specs, decl), MkExpConstant(string));
18227 (__ecereNameSpace__ecere__com__eSystem_Delete(string), string = 0);
18228 ProcessExpressionType(exp);
18229 ComputeExpression(exp);
18230 expString[0] = '\0';
18231 PrintExpression(exp, expString);
18232 strcat(argument, expString);
18233 FreeExpression(exp);
18234 break;
18235 }
18236 case 1:
18237 {
18238 strcat(argument, arg.__anon1.__anon2.__anon1.member->name);
18239 break;
18240 }
18241 case 0:
18242 {
18243 if(arg.__anon1.__anon1.dataTypeString && (!param->defaultArg.__anon1.__anon1.dataTypeString || strcmp(arg.__anon1.__anon1.dataTypeString, param->defaultArg.__anon1.__anon1.dataTypeString)))
18244 strcat(argument, arg.__anon1.__anon1.dataTypeString);
18245 break;
18246 }
18247 }
18248 if(argument[0])
18249 {
18250 if(paramCount)
18251 strcat(templateString, ", ");
18252 if(lastParam != p - 1)
18253 {
18254 strcat(templateString, param->name);
18255 strcat(templateString, " = ");
18256 }
18257 strcat(templateString, argument);
18258 paramCount++;
18259 lastParam = p;
18260 }
18261 }
18262 p++;
18263 }
18264 }
18265 {
18266 int len = strlen(templateString);
18267
18268 if(templateString[len - 1] == '>')
18269 templateString[len++] = ' ';
18270 templateString[len++] = '>';
18271 templateString[len++] = '\0';
18272 }
18273 FreeType(exp->expType);
18274 {
18275 struct Context * context = SetupTemplatesContext(tClass);
18276
18277 exp->expType = ProcessTypeString(templateString, 0);
18278 FinishTemplatesContext(context);
18279 }
18280 }
18281 }
18282 }
18283 }
18284 else
18285 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)");
18286 }
18287 else if(type && (type->kind == 9 || type->kind == 10))
18288 {
18289 struct Type * memberType = exp->__anon1.member.member ? FindMember(type, exp->__anon1.member.member->string) : (((void *)0));
18290
18291 if(memberType)
18292 {
18293 exp->expType = memberType;
18294 if(memberType)
18295 memberType->refCount++;
18296 }
18297 }
18298 else
18299 {
18300 char expString[10240];
18301
18302 expString[0] = '\0';
18303 if(inCompiler)
18304 {
18305 PrintExpression(exp, expString);
18306 __ecereNameSpace__ecere__sys__ChangeCh(expString, '\n', ' ');
18307 }
18308 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "member operator on non-structure type expression %s\n", (((void *)0))), expString);
18309 }
18310 if(exp->expType && exp->expType->kind == 21 && (!exp->destType || exp->destType->kind != 21))
18311 {
18312 if(type && (type->kind == 8 || type->kind == 19 || type->kind == 3 || type->kind == 15))
18313 {
18314 struct Identifier * id = exp->__anon1.member.member;
18315 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));
18316
18317 if(_class)
18318 {
18319 FreeType(exp->expType);
18320 exp->expType = ReplaceThisClassType(_class);
18321 }
18322 }
18323 }
18324 yylloc = oldyylloc;
18325 break;
18326 }
18327 case 9:
18328 {
18329 struct Type * destType = exp->destType;
18330
18331 if(exp->__anon1.member.member && exp->__anon1.member.member->_class && exp->__anon1.member.member->_class->__anon1.__anon1.name)
18332 {
18333 exp->__anon1.member.member->classSym = exp->__anon1.member.member->_class->__anon1.__anon1.symbol;
18334 }
18335 exp->__anon1.member.exp = MkExpBrackets(MkListOne(MkExpOp((((void *)0)), '*', exp->__anon1.member.exp)));
18336 exp->type = 8;
18337 if(destType)
18338 destType->count++;
18339 ProcessExpressionType(exp);
18340 if(destType)
18341 destType->count--;
18342 break;
18343 }
18344 case 15:
18345 {
18346 struct Symbol * classSym = exp->__anon1._class->__anon1.__anon1.symbol;
18347
18348 if(classSym && classSym->__anon1.registered)
18349 {
18350 if(classSym->__anon1.registered->type == 5 || (classSym->__anon1.registered->fixed && classSym->__anon1.registered->structSize))
18351 {
18352 char name[1024];
18353 struct __ecereNameSpace__ecere__com__Class * b = classSym->__anon1.registered;
18354
18355 name[0] = '\0';
18356 DeclareStruct(curExternal, classSym->string, 0, 1);
18357 FreeSpecifier(exp->__anon1._class);
18358 FullClassNameCat(name, classSym->string, 0);
18359 if(b->offset == 0)
18360 {
18361 exp->type = 10;
18362 exp->__anon1.typeName = MkTypeName(MkListOne(MkStructOrUnion(3, MkIdentifier(name), (((void *)0)))), (((void *)0)));
18363 }
18364 else
18365 {
18366 struct Expression * e;
18367
18368 exp->type = 4;
18369 if(b->structSize == b->offset)
18370 exp->__anon1.op.exp1 = MkExpConstant("0");
18371 else
18372 exp->__anon1.op.exp1 = MkExpTypeSize(MkTypeName(MkListOne(MkStructOrUnion(3, MkIdentifier(name), (((void *)0)))), (((void *)0))));
18373 exp->__anon1.op.op = '+';
18374 e = exp;
18375 while(b->offset != 0)
18376 {
18377 struct Symbol * sym;
18378 struct Expression * typeSize;
18379
18380 b = b->base;
18381 sym = FindClass(b->fullName);
18382 name[0] = '\0';
18383 DeclareStruct(curExternal, sym->string, 0, 1);
18384 FullClassNameCat(name, sym->string, 0);
18385 if(b->structSize == b->offset)
18386 typeSize = MkExpConstant("0");
18387 else
18388 typeSize = MkExpTypeSize(MkTypeName(MkListOne(MkStructOrUnion(3, MkIdentifier(name), (((void *)0)))), (((void *)0))));
18389 e->__anon1.op.exp2 = b->offset ? MkExpOp(typeSize, '+', (((void *)0))) : typeSize;
18390 e = e->__anon1.op.exp2;
18391 }
18392 }
18393 }
18394 else
18395 {
18396 if(classSym->__anon1.registered->fixed && !classSym->__anon1.registered->structSize)
18397 {
18398 FreeSpecifier(exp->__anon1._class);
18399 exp->__anon1.__anon1.constant = PrintUInt(classSym->__anon1.registered->templateClass ? classSym->__anon1.registered->templateClass->structSize : classSym->__anon1.registered->structSize);
18400 exp->type = 2;
18401 }
18402 else
18403 {
18404 char className[1024];
18405
18406 strcpy(className, "__ecereClass_");
18407 FullClassNameCat(className, classSym->string, 1);
18408 DeclareClass(curExternal, classSym, className);
18409 FreeExpContents(exp);
18410 exp->type = 9;
18411 exp->__anon1.member.exp = MkExpIdentifier(MkIdentifier(className));
18412 exp->__anon1.member.member = MkIdentifier("structSize");
18413 }
18414 }
18415 }
18416 exp->expType = __extension__ ({
18417 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
18418
18419 __ecereInstance1->refCount = 1, __ecereInstance1->kind = 23, __ecereInstance1;
18420 });
18421 break;
18422 }
18423 case 10:
18424 {
18425 struct Type * type = ProcessType(exp->__anon1.typeName->qualifiers, exp->__anon1.typeName->declarator);
18426
18427 exp->expType = __extension__ ({
18428 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
18429
18430 __ecereInstance1->refCount = 1, __ecereInstance1->kind = 23, __ecereInstance1;
18431 });
18432 exp->isConstant = 1;
18433 DeclareType(curExternal, type, 1, 0);
18434 FreeType(type);
18435 break;
18436 }
18437 case 11:
18438 {
18439 struct Type * type = ProcessType(exp->__anon1.cast.typeName->qualifiers, exp->__anon1.cast.typeName->declarator);
18440
18441 type->count = 1;
18442 FreeType(exp->__anon1.cast.exp->destType);
18443 exp->__anon1.cast.exp->destType = type;
18444 type->refCount++;
18445 type->casted = 1;
18446 ProcessExpressionType(exp->__anon1.cast.exp);
18447 type->casted = 0;
18448 type->count = 0;
18449 exp->expType = type;
18450 if(!exp->__anon1.cast.exp->needCast && !NeedCast(exp->__anon1.cast.exp->expType, type))
18451 {
18452 void * prev = exp->prev, * next = exp->next;
18453 struct Type * expType = exp->__anon1.cast.exp->destType;
18454 struct Expression * castExp = exp->__anon1.cast.exp;
18455 struct Type * destType = exp->destType;
18456
18457 if(expType)
18458 expType->refCount++;
18459 FreeType(exp->expType);
18460 FreeTypeName(exp->__anon1.cast.typeName);
18461 *exp = *castExp;
18462 FreeType(exp->expType);
18463 FreeType(exp->destType);
18464 exp->expType = expType;
18465 exp->destType = destType;
18466 ((castExp ? (__ecereClass_Expression->Destructor ? __ecereClass_Expression->Destructor((void *)castExp) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(castExp)) : 0), castExp = 0);
18467 exp->prev = prev;
18468 exp->next = next;
18469 }
18470 else
18471 {
18472 exp->isConstant = exp->__anon1.cast.exp->isConstant;
18473 }
18474 break;
18475 }
18476 case 33:
18477 {
18478 struct Type * type = ProcessType(exp->__anon1.initializer.typeName->qualifiers, exp->__anon1.initializer.typeName->declarator);
18479
18480 exp->expType = type;
18481 break;
18482 }
18483 case 34:
18484 {
18485 struct Type * type = ProcessType(exp->__anon1.vaArg.typeName->qualifiers, exp->__anon1.vaArg.typeName->declarator);
18486
18487 ProcessExpressionType(exp->__anon1.vaArg.exp);
18488 exp->expType = type;
18489 break;
18490 }
18491 case 12:
18492 {
18493 struct Expression * e;
18494 struct Type * t = exp->destType;
18495
18496 if(t && !exp->destType->casted)
18497 {
18498 t = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
18499 CopyTypeInto(t, exp->destType);
18500 t->count = 0;
18501 }
18502 else if(t)
18503 t->refCount++;
18504 exp->isConstant = 1;
18505 FreeType(exp->__anon1.cond.cond->destType);
18506 exp->__anon1.cond.cond->destType = MkClassType("bool");
18507 exp->__anon1.cond.cond->destType->truth = 1;
18508 ProcessExpressionType(exp->__anon1.cond.cond);
18509 if(!exp->__anon1.cond.cond->isConstant)
18510 exp->isConstant = 0;
18511 for(e = (*exp->__anon1.cond.exp).first; e; e = e->next)
18512 {
18513 if(!e->next)
18514 {
18515 FreeType(e->destType);
18516 e->destType = t;
18517 if(e->destType)
18518 e->destType->refCount++;
18519 }
18520 ProcessExpressionType(e);
18521 if(!e->next)
18522 {
18523 exp->expType = e->expType;
18524 if(e->expType)
18525 e->expType->refCount++;
18526 }
18527 if(!e->isConstant)
18528 exp->isConstant = 0;
18529 }
18530 FreeType(exp->__anon1.cond.elseExp->destType);
18531 exp->__anon1.cond.elseExp->destType = t ? t : exp->expType;
18532 if(exp->__anon1.cond.elseExp->destType)
18533 exp->__anon1.cond.elseExp->destType->refCount++;
18534 ProcessExpressionType(exp->__anon1.cond.elseExp);
18535 if(!exp->__anon1.cond.elseExp->isConstant)
18536 exp->isConstant = 0;
18537 FreeType(t);
18538 break;
18539 }
18540 case 23:
18541 {
18542 if(exp->__anon1.compound && exp->__anon1.compound->__anon1.compound.statements && (*exp->__anon1.compound->__anon1.compound.statements).last)
18543 {
18544 struct Statement * last = (*exp->__anon1.compound->__anon1.compound.statements).last;
18545
18546 if(last->type == 3 && last->__anon1.expressions && (*last->__anon1.expressions).last)
18547 {
18548 ((struct Expression *)(*last->__anon1.expressions).last)->destType = exp->destType;
18549 if(exp->destType)
18550 exp->destType->refCount++;
18551 }
18552 ProcessStatement(exp->__anon1.compound);
18553 exp->expType = (last->__anon1.expressions && (*last->__anon1.expressions).last) ? ((struct Expression *)(*last->__anon1.expressions).last)->expType : (((void *)0));
18554 if(exp->expType)
18555 exp->expType->refCount++;
18556 }
18557 break;
18558 }
18559 case 24:
18560 {
18561 struct Specifier * spec = (*exp->__anon1._classExp.specifiers).first;
18562
18563 if(spec && spec->type == 1)
18564 {
18565 exp->expType = MkClassType(spec->__anon1.__anon1.name);
18566 exp->expType->kind = 19;
18567 exp->byReference = 1;
18568 }
18569 else
18570 {
18571 exp->expType = MkClassType("ecere::com::Class");
18572 exp->byReference = 1;
18573 }
18574 break;
18575 }
18576 case 25:
18577 {
18578 struct __ecereNameSpace__ecere__com__Class * _class = thisClass ? thisClass : currentClass;
18579
18580 if(_class)
18581 {
18582 struct Identifier * id = exp->__anon1.classData.id;
18583 char structName[1024];
18584 struct Expression * classExp;
18585
18586 strcpy(structName, "__ecereClassData_");
18587 FullClassNameCat(structName, _class->fullName, 0);
18588 exp->type = 9;
18589 exp->__anon1.member.member = id;
18590 if(curCompound && FindSymbol("this", curContext, curCompound->__anon1.compound.context, 0, 0))
18591 classExp = MkExpMember(MkExpIdentifier(MkIdentifier("this")), MkIdentifier("_class"));
18592 else
18593 classExp = MkExpIdentifier(MkIdentifier("class"));
18594 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"))))))));
18595 ProcessExpressionType(exp);
18596 return ;
18597 }
18598 break;
18599 }
18600 case 35:
18601 {
18602 struct Type * type = (((void *)0));
18603 const char * typeString = (((void *)0));
18604 char typeStringBuf[1024];
18605
18606 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))
18607 {
18608 struct __ecereNameSpace__ecere__com__Class * templateClass = exp->destType->__anon1._class->__anon1.registered;
18609
18610 typeString = templateClass->templateArgs[2].__anon1.__anon1.dataTypeString;
18611 }
18612 else if(exp->__anon1.list)
18613 {
18614 struct Expression * e;
18615
18616 for(e = (*exp->__anon1.list).first; e; e = e->next)
18617 {
18618 ProcessExpressionType(e);
18619 if(e->expType)
18620 {
18621 if(!type)
18622 {
18623 type = e->expType;
18624 type->refCount++;
18625 }
18626 else
18627 {
18628 if(!MatchTypeExpression(e, type, (((void *)0)), 0, 1))
18629 {
18630 FreeType(type);
18631 type = e->expType;
18632 e->expType = (((void *)0));
18633 e = (*exp->__anon1.list).first;
18634 ProcessExpressionType(e);
18635 if(e->expType)
18636 {
18637 if(!MatchTypeExpression(e, type, (((void *)0)), 0, 1))
18638 {
18639 FreeType(e->expType);
18640 e->expType = (((void *)0));
18641 FreeType(type);
18642 type = (((void *)0));
18643 break;
18644 }
18645 }
18646 }
18647 }
18648 if(e->expType)
18649 {
18650 FreeType(e->expType);
18651 e->expType = (((void *)0));
18652 }
18653 }
18654 }
18655 if(type)
18656 {
18657 typeStringBuf[0] = '\0';
18658 PrintTypeNoConst(type, typeStringBuf, 0, 1);
18659 typeString = typeStringBuf;
18660 FreeType(type);
18661 type = (((void *)0));
18662 }
18663 }
18664 if(typeString)
18665 {
18666 char templateString[1024];
18667 struct __ecereNameSpace__ecere__sys__OldList * initializers = MkList();
18668 struct __ecereNameSpace__ecere__sys__OldList * structInitializers = MkList();
18669 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
18670 struct Expression * expExt;
18671 struct Declarator * decl = SpecDeclFromString(typeString, specs, (((void *)0)));
18672
18673 sprintf(templateString, "Container<%s>", typeString);
18674 if(exp->__anon1.list)
18675 {
18676 struct Expression * e;
18677
18678 type = ProcessTypeString(typeString, 0);
18679 while((e = (*exp->__anon1.list).first))
18680 {
18681 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove((&*exp->__anon1.list), e);
18682 e->destType = type;
18683 type->refCount++;
18684 ProcessExpressionType(e);
18685 ListAdd(initializers, MkInitializerAssignment(e));
18686 }
18687 FreeType(type);
18688 (__ecereNameSpace__ecere__com__eSystem_Delete(exp->__anon1.list), exp->__anon1.list = 0);
18689 }
18690 DeclareStruct(curExternal, "ecere::com::BuiltInContainer", 0, 1);
18691 ListAdd(structInitializers, MkInitializerAssignment(MkExpMember(MkExpClass(MkListOne(MkSpecifierName("BuiltInContainer")), (((void *)0))), MkIdentifier("_vTbl"))));
18692 ProcessExpressionType(((struct Initializer *)(*structInitializers).last)->__anon1.exp);
18693 ListAdd(structInitializers, MkInitializerAssignment(MkExpClass(MkListOne(MkSpecifierName("BuiltInContainer")), (((void *)0)))));
18694 ProcessExpressionType(((struct Initializer *)(*structInitializers).last)->__anon1.exp);
18695 ListAdd(structInitializers, MkInitializerAssignment(MkExpConstant("0")));
18696 ProcessExpressionType(((struct Initializer *)(*structInitializers).last)->__anon1.exp);
18697 ListAdd(structInitializers, MkInitializerAssignment(MkExpExtensionInitializer(MkTypeName(specs, MkDeclaratorArray(decl, (((void *)0)))), MkInitializerList(initializers))));
18698 ProcessExpressionType(((struct Initializer *)(*structInitializers).last)->__anon1.exp);
18699 ListAdd(structInitializers, MkInitializerAssignment(__extension__ ({
18700 struct Expression * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression);
18701
18702 __ecereInstance1->type = 2, __ecereInstance1->__anon1.__anon1.constant = __ecereNameSpace__ecere__com__PrintString(__ecereClass_int, (void *)&(*initializers).count, (void *)0), __ecereInstance1;
18703 })));
18704 ProcessExpressionType(((struct Initializer *)(*structInitializers).last)->__anon1.exp);
18705 ListAdd(structInitializers, MkInitializerAssignment(MkExpClass(CopyList(specs, (void *)(CopySpecifier)), CopyDeclarator(decl))));
18706 ProcessExpressionType(((struct Initializer *)(*structInitializers).last)->__anon1.exp);
18707 exp->expType = ProcessTypeString(templateString, 0);
18708 exp->type = 5;
18709 exp->__anon1.list = MkListOne(MkExpCast(MkTypeName(MkListOne(MkSpecifierName(templateString)), (((void *)0))), MkExpOp((((void *)0)), '&', expExt = MkExpExtensionInitializer(MkTypeName(MkListOne(MkSpecifierName("BuiltInContainer")), (((void *)0))), MkInitializerList(structInitializers)))));
18710 ProcessExpressionType(expExt);
18711 }
18712 else
18713 {
18714 exp->expType = ProcessTypeString("Container", 0);
18715 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Couldn't determine type of array elements\n", (((void *)0))));
18716 }
18717 break;
18718 }
18719 }
18720 if(exp->expType && exp->expType->kind == 21 && thisClass && (!exp->destType || exp->destType->kind != 21))
18721 {
18722 FreeType(exp->expType);
18723 exp->expType = ReplaceThisClassType(thisClass);
18724 }
18725 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)
18726 {
18727 struct Symbol * symbol = FindSymbol(exp->expType->__anon1.__anon1.enumName, curContext, globalContext, 1, 0);
18728
18729 if(symbol)
18730 {
18731 if(exp->expType->kind != 15)
18732 {
18733 struct Type * member;
18734 char * enumName = __ecereNameSpace__ecere__sys__CopyString(exp->expType->__anon1.__anon1.enumName);
18735
18736 FreeType(exp->expType);
18737 exp->expType = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
18738 exp->expType->kind = symbol->type->kind;
18739 exp->expType->refCount++;
18740 exp->expType->__anon1.__anon1.enumName = enumName;
18741 exp->expType->__anon1.__anon1.members = symbol->type->__anon1.__anon1.members;
18742 for(member = symbol->type->__anon1.__anon1.members.first; member; member = member->next)
18743 member->refCount++;
18744 }
18745 else
18746 {
18747 struct __ecereNameSpace__ecere__sys__NamedLink64 * member;
18748
18749 for(member = symbol->type->__anon1.__anon1.members.first; member; member = member->next)
18750 {
18751 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);
18752
18753 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(&exp->expType->__anon1.__anon1.members, value);
18754 }
18755 }
18756 }
18757 }
18758 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)))
18759 {
18760 exp->byReference = 1;
18761 }
18762 yylloc = exp->loc;
18763 if(exp->destType && (exp->destType->kind == 18))
18764 ;
18765 else if(exp->destType && !exp->destType->keepCast)
18766 {
18767 if(!exp->needTemplateCast && exp->expType && (exp->expType->kind == 20 || exp->expType->passAsTemplate))
18768 exp->needTemplateCast = 1;
18769 if(exp->destType->kind == 0)
18770 ;
18771 else if(!CheckExpressionType(exp, exp->destType, 0, !exp->destType->casted))
18772 {
18773 unsigned int invalidCast = 0;
18774
18775 if(inCompiler && exp->destType->count && exp->expType)
18776 {
18777 struct __ecereNameSpace__ecere__com__Class * c1 = (exp->expType->kind == 8 && exp->expType->__anon1._class) ? exp->expType->__anon1._class->__anon1.registered : (((void *)0));
18778 struct __ecereNameSpace__ecere__com__Class * c2 = (exp->destType->kind == 8 && exp->destType->__anon1._class) ? exp->destType->__anon1._class->__anon1.registered : (((void *)0));
18779
18780 if(c1 && c1->type != 1)
18781 c1 = (((void *)0));
18782 if(c2 && c2->type != 1)
18783 c2 = (((void *)0));
18784 if((c1 && !exp->expType->byReference && !c2 && !__ecereProp_Type_Get_isPointerType(exp->destType)) || (c2 && !exp->destType->byReference && !c1 && !__ecereProp_Type_Get_isPointerType(exp->expType)))
18785 invalidCast = 1;
18786 }
18787 if(!exp->destType->count || unresolved || invalidCast)
18788 {
18789 if(!exp->expType)
18790 {
18791 yylloc = exp->loc;
18792 if(exp->destType->kind != 14)
18793 {
18794 char type2[1024];
18795
18796 type2[0] = '\0';
18797 if(inCompiler)
18798 {
18799 char expString[10240];
18800
18801 expString[0] = '\0';
18802 PrintType(exp->destType, type2, 0, 1);
18803 if(inCompiler)
18804 {
18805 PrintExpression(exp, expString);
18806 __ecereNameSpace__ecere__sys__ChangeCh(expString, '\n', ' ');
18807 }
18808 if(unresolved)
18809 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "unresolved identifier %s; expected %s\n", (((void *)0))), expString, type2);
18810 else if(exp->type != 16)
18811 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "couldn't determine type of %s; expected %s\n", (((void *)0))), expString, type2);
18812 }
18813 }
18814 else
18815 {
18816 char expString[10240];
18817
18818 expString[0] = '\0';
18819 if(inCompiler)
18820 {
18821 PrintExpression(exp, expString);
18822 __ecereNameSpace__ecere__sys__ChangeCh(expString, '\n', ' ');
18823 }
18824 if(unresolved)
18825 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "unresolved identifier %s\n", (((void *)0))), expString);
18826 else if(exp->type != 16)
18827 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "couldn't determine type of %s\n", (((void *)0))), expString);
18828 }
18829 }
18830 else
18831 {
18832 char type1[1024];
18833 char type2[1024];
18834
18835 type1[0] = '\0';
18836 type2[0] = '\0';
18837 if(inCompiler)
18838 {
18839 PrintType(exp->expType, type1, 0, 1);
18840 PrintType(exp->destType, type2, 0, 1);
18841 }
18842 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)))
18843 ;
18844 else
18845 {
18846 struct Expression * nbExp = GetNonBracketsExp(exp);
18847 unsigned int skipWarning = 0;
18848 int kind = exp->destType->kind;
18849
18850 if(nbExp->type == 12 && nbExp->destType && !nbExp->destType->casted && nbExp->destType->kind == exp->destType->kind)
18851 skipWarning = 1;
18852 if((kind == 1 || kind == 2) && exp->destType->isSigned == exp->expType->signedBeforePromotion && nbExp->type == 4 && nbExp->__anon1.op.exp1 && nbExp->__anon1.op.exp2)
18853 {
18854 int op = nbExp->__anon1.op.op;
18855 struct Expression * nbExp1, * nbExp2;
18856 int from;
18857
18858 switch(op)
18859 {
18860 case '%':
18861 case '/':
18862 nbExp1 = GetNonBracketsExp(nbExp->__anon1.op.exp1);
18863 from = nbExp1->expType->promotedFrom;
18864 if(from == 1 || (kind == 2 && from == 2))
18865 skipWarning = 1;
18866 break;
18867 case LEFT_OP:
18868 case RIGHT_OP:
18869 nbExp1 = GetNonBracketsExp(nbExp->__anon1.op.exp1);
18870 nbExp2 = GetNonBracketsExp(nbExp->__anon1.op.exp2);
18871 from = nbExp1->expType->promotedFrom;
18872 if(op == RIGHT_OP && (from == 1 || (kind == 2 && from == 2)))
18873 skipWarning = 1;
18874 else if(nbExp2->isConstant && nbExp2->type == 2 && (nbExp->__anon1.op.op == RIGHT_OP || nbExp1->expType->bitMemberSize))
18875 {
18876 int n = strtol(nbExp2->__anon1.__anon1.constant, (((void *)0)), 0);
18877 int s = from == 1 ? 8 : 16;
18878
18879 if(nbExp1->expType->bitMemberSize && nbExp1->expType->bitMemberSize < s)
18880 s = nbExp1->expType->bitMemberSize;
18881 if(nbExp->__anon1.op.op == RIGHT_OP)
18882 s -= n;
18883 else
18884 s += n;
18885 if(s <= (kind == 1 ? 8 : 16))
18886 skipWarning = 1;
18887 }
18888 break;
18889 case '-':
18890 if(!exp->destType->isSigned)
18891 {
18892 nbExp1 = GetNonBracketsExp(nbExp->__anon1.op.exp1);
18893 nbExp2 = GetNonBracketsExp(nbExp->__anon1.op.exp2);
18894 from = nbExp2->expType->promotedFrom;
18895 if((from == 1 || from == 2) && nbExp1->isConstant && nbExp1->type == 2)
18896 {
18897 int n = strtol(nbExp1->__anon1.__anon1.constant, (((void *)0)), 0);
18898
18899 if(n == (from == 1 ? 255 : 65535))
18900 skipWarning = 1;
18901 }
18902 }
18903 break;
18904 case '|':
18905 {
18906 int kind1, kind2;
18907
18908 nbExp1 = GetNonBracketsExp(nbExp->__anon1.op.exp1);
18909 nbExp2 = GetNonBracketsExp(nbExp->__anon1.op.exp2);
18910 kind1 = nbExp1->expType->promotedFrom ? nbExp1->expType->promotedFrom : nbExp1->expType->kind;
18911 kind2 = nbExp2->expType->promotedFrom ? nbExp2->expType->promotedFrom : nbExp2->expType->kind;
18912 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)))
18913 skipWarning = 1;
18914 break;
18915 }
18916 case '&':
18917 {
18918 int kind1, kind2;
18919
18920 nbExp1 = GetNonBracketsExp(nbExp->__anon1.op.exp1);
18921 nbExp2 = GetNonBracketsExp(nbExp->__anon1.op.exp2);
18922 kind1 = nbExp1->expType->promotedFrom ? nbExp1->expType->promotedFrom : nbExp1->expType->kind;
18923 kind2 = nbExp2->expType->promotedFrom ? nbExp2->expType->promotedFrom : nbExp2->expType->kind;
18924 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)))
18925 skipWarning = 1;
18926 break;
18927 }
18928 }
18929 }
18930 if(!skipWarning)
18931 {
18932 char expString[10240];
18933
18934 expString[0] = '\0';
18935 if(inCompiler)
18936 {
18937 PrintExpression(exp, expString);
18938 __ecereNameSpace__ecere__sys__ChangeCh(expString, '\n', ' ');
18939 }
18940 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")))
18941 {
18942 if(invalidCast)
18943 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "incompatible expression %s (%s); expected %s\n", (((void *)0))), expString, type1, type2);
18944 else
18945 Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "incompatible expression %s (%s); expected %s\n", (((void *)0))), expString, type1, type2);
18946 }
18947 }
18948 if(!inCompiler)
18949 {
18950 FreeType(exp->expType);
18951 exp->destType->refCount++;
18952 exp->expType = exp->destType;
18953 }
18954 }
18955 }
18956 }
18957 }
18958 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))
18959 {
18960 struct Expression * nbExp = GetNonBracketsExp(exp);
18961
18962 if(nbExp->type != 11 || !IsVoidPtrCast(nbExp->__anon1.cast.typeName))
18963 {
18964 struct Expression * e = MoveExpContents(exp);
18965
18966 exp->__anon1.cast.exp = MkExpBrackets(MkListOne(e));
18967 exp->type = 11;
18968 exp->__anon1.cast.exp->destType = exp->destType;
18969 if(exp->destType)
18970 exp->destType->refCount++;
18971 exp->__anon1.cast.typeName = MkTypeName(MkListOne(MkSpecifier(VOID)), MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), (((void *)0))));
18972 }
18973 }
18974 }
18975 else if(unresolved)
18976 {
18977 if(exp->__anon1.__anon1.identifier->_class && exp->__anon1.__anon1.identifier->_class->__anon1.__anon1.name)
18978 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);
18979 else if(exp->__anon1.__anon1.identifier->string && exp->__anon1.__anon1.identifier->string[0])
18980 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "unresolved identifier %s\n", (((void *)0))), exp->__anon1.__anon1.identifier->string);
18981 }
18982 else if(!exp->expType && exp->type != 16)
18983 {
18984 char expString[10240];
18985
18986 expString[0] = '\0';
18987 if(inCompiler)
18988 {
18989 PrintExpression(exp, expString);
18990 __ecereNameSpace__ecere__sys__ChangeCh(expString, '\n', ' ');
18991 }
18992 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "couldn't determine type of %s\n", (((void *)0))), expString);
18993 }
18994 if(inCompiler)
18995 ApplyAnyObjectLogic(exp);
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 = oldyylloc;
19001 }
19002
19003 static void ProcessFunction(struct FunctionDefinition * function)
19004 {
19005 struct Identifier * id = GetDeclId(function->declarator);
19006 struct Symbol * symbol = function->declarator ? function->declarator->symbol : (((void *)0));
19007 struct Type * type = symbol ? symbol->type : (((void *)0));
19008 struct __ecereNameSpace__ecere__com__Class * oldThisClass = thisClass;
19009 struct Context * oldTopContext = topContext;
19010
19011 yylloc = function->loc;
19012 if(type && type->__anon1.__anon2.thisClass)
19013 {
19014 struct Symbol * classSym = type->__anon1.__anon2.thisClass;
19015 struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1.__anon2.thisClass->__anon1.registered;
19016 char className[1024];
19017 char structName[1024];
19018 struct Declarator * funcDecl;
19019 struct Symbol * thisSymbol;
19020 unsigned int typedObject = 0;
19021
19022 if(_class && !_class->base)
19023 {
19024 _class = currentClass;
19025 if(_class && !_class->symbol)
19026 _class->symbol = FindClass(_class->fullName);
19027 classSym = _class ? _class->symbol : (((void *)0));
19028 typedObject = 1;
19029 }
19030 thisClass = _class;
19031 if(inCompiler && _class)
19032 {
19033 if(type->kind == 11)
19034 {
19035 if(symbol->type->__anon1.__anon2.params.count == 1 && ((struct Type *)symbol->type->__anon1.__anon2.params.first)->kind == 0)
19036 {
19037 struct Type * param = symbol->type->__anon1.__anon2.params.first;
19038
19039 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove(&symbol->type->__anon1.__anon2.params, param);
19040 FreeType(param);
19041 }
19042 if(type->classObjectType != 1)
19043 {
19044 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert(&symbol->type->__anon1.__anon2.params, (((void *)0)), MkClassType(_class->fullName));
19045 symbol->type->__anon1.__anon2.staticMethod = 1;
19046 symbol->type->__anon1.__anon2.thisClass = (((void *)0));
19047 symbol->type->extraParam = 0;
19048 }
19049 }
19050 strcpy(className, "__ecereClass_");
19051 FullClassNameCat(className, _class->fullName, 1);
19052 structName[0] = 0;
19053 FullClassNameCat(structName, _class->fullName, 0);
19054 funcDecl = GetFuncDecl(function->declarator);
19055 if(funcDecl)
19056 {
19057 if(funcDecl->__anon1.function.parameters && (*funcDecl->__anon1.function.parameters).count == 1)
19058 {
19059 struct TypeName * param = (*funcDecl->__anon1.function.parameters).first;
19060
19061 if(param->qualifiers && (*param->qualifiers).count == 1 && ((struct Specifier *)(*param->qualifiers).first)->__anon1.specifier == VOID && !param->declarator)
19062 {
19063 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove((&*funcDecl->__anon1.function.parameters), param);
19064 FreeTypeName(param);
19065 }
19066 }
19067 if(!function->propertyNoThis)
19068 {
19069 struct TypeName * thisParam = (((void *)0));
19070
19071 if(type->classObjectType != 1)
19072 {
19073 thisParam = QMkClass(_class->fullName, MkDeclaratorIdentifier(MkIdentifier("this")));
19074 if(!funcDecl->__anon1.function.parameters)
19075 funcDecl->__anon1.function.parameters = MkList();
19076 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*funcDecl->__anon1.function.parameters), (((void *)0)), thisParam);
19077 }
19078 if(typedObject)
19079 {
19080 if(type->classObjectType != 1)
19081 {
19082 if(type->byReference || _class->type == 3 || _class->type == 1000 || _class->type == 4 || _class->type == 2)
19083 thisParam->declarator = MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), thisParam->declarator);
19084 }
19085 thisParam = __extension__ ({
19086 struct TypeName * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_TypeName);
19087
19088 __ecereInstance1->declarator = MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), MkDeclaratorIdentifier(MkIdentifier("class"))), __ecereInstance1->qualifiers = MkListOne(MkStructOrUnion(3, MkIdentifier("__ecereNameSpace__ecere__com__Class"), (((void *)0)))), __ecereInstance1;
19089 });
19090 DeclareStruct(curExternal, "ecere::com::Class", 0, 1);
19091 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*funcDecl->__anon1.function.parameters), (((void *)0)), thisParam);
19092 }
19093 }
19094 }
19095 if(symbol && symbol->__anon2.__anon1.pointerExternal && symbol->__anon2.__anon1.pointerExternal->type == 1)
19096 {
19097 struct InitDeclarator * initDecl = (*symbol->__anon2.__anon1.pointerExternal->__anon1.declaration->__anon1.__anon1.declarators).first;
19098
19099 funcDecl = GetFuncDecl(initDecl->declarator);
19100 if(funcDecl)
19101 {
19102 if(funcDecl->__anon1.function.parameters && (*funcDecl->__anon1.function.parameters).count == 1)
19103 {
19104 struct TypeName * param = (*funcDecl->__anon1.function.parameters).first;
19105
19106 if(param->qualifiers && (*param->qualifiers).count == 1 && ((struct Specifier *)(*param->qualifiers).first)->__anon1.specifier == VOID && !param->declarator)
19107 {
19108 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove((&*funcDecl->__anon1.function.parameters), param);
19109 FreeTypeName(param);
19110 }
19111 }
19112 if(type->classObjectType != 1)
19113 {
19114 if((_class->type != 2 && _class->type != 3 && _class->type != 4) || function != (struct FunctionDefinition *)symbol->__anon2.__anon2.externalSet)
19115 {
19116 struct TypeName * thisParam = QMkClass(_class->fullName, MkDeclaratorIdentifier(MkIdentifier("this")));
19117
19118 if(!funcDecl->__anon1.function.parameters)
19119 funcDecl->__anon1.function.parameters = MkList();
19120 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*funcDecl->__anon1.function.parameters), (((void *)0)), thisParam);
19121 }
19122 }
19123 }
19124 }
19125 }
19126 if(function->body)
19127 {
19128 if(type->classObjectType != 1)
19129 {
19130 thisSymbol = __extension__ ({
19131 struct Symbol * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Symbol);
19132
19133 __ecereInstance1->string = __ecereNameSpace__ecere__sys__CopyString("this"), __ecereInstance1->type = classSym ? MkClassType(classSym->string) : (((void *)0)), __ecereInstance1;
19134 });
19135 __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Add(&function->body->__anon1.compound.context->symbols, (struct __ecereNameSpace__ecere__sys__BTNode *)thisSymbol);
19136 if(typedObject && thisSymbol->type)
19137 {
19138 thisSymbol->type->classObjectType = 2;
19139 thisSymbol->type->byReference = type->byReference;
19140 thisSymbol->type->typedByReference = type->byReference;
19141 }
19142 }
19143 }
19144 if(inCompiler && _class && _class->type == 0 && type->classObjectType != 1)
19145 {
19146 struct __ecereNameSpace__ecere__com__DataMember * member = (((void *)0));
19147
19148 {
19149 struct __ecereNameSpace__ecere__com__Class * base;
19150
19151 for(base = _class; base && base->type != 1000; base = base->next)
19152 {
19153 for(member = base->membersAndProperties.first; member; member = member->next)
19154 if(!member->isProperty)
19155 break;
19156 if(member)
19157 break;
19158 }
19159 }
19160 for(member = _class->membersAndProperties.first; member; member = member->next)
19161 if(!member->isProperty)
19162 break;
19163 if(member)
19164 {
19165 char pointerName[1024];
19166 struct Declaration * decl;
19167 struct Initializer * initializer;
19168 struct Expression * exp, * bytePtr;
19169
19170 strcpy(pointerName, "__ecerePointer_");
19171 FullClassNameCat(pointerName, _class->fullName, 0);
19172 {
19173 char className[1024];
19174
19175 strcpy(className, "__ecereClass_");
19176 FullClassNameCat(className, classSym->string, 1);
19177 DeclareClass(curExternal, classSym, className);
19178 }
19179 bytePtr = QBrackets(MkExpCast(QMkType("char", QMkPtrDecl((((void *)0)))), QMkExpId("this")));
19180 if(_class->fixed)
19181 {
19182 struct Expression * e;
19183
19184 if(_class->offset && _class->offset == (_class->base->type == 5 ? _class->base->memberOffset : _class->base->structSize))
19185 {
19186 e = MkExpClassSize(MkSpecifierName(_class->base->fullName));
19187 ProcessExpressionType(e);
19188 }
19189 else
19190 {
19191 char string[256];
19192
19193 sprintf(string, "%d", _class->offset);
19194 e = MkExpConstant(string);
19195 }
19196 exp = QBrackets(MkExpOp(bytePtr, '+', e));
19197 }
19198 else
19199 {
19200 exp = QBrackets(MkExpOp(bytePtr, '+', MkExpPointer(QMkExpId(className), MkIdentifier("offset"))));
19201 }
19202 exp = QBrackets(QMkExpCond(QMkExpId("this"), exp, MkExpConstant("0")));
19203 exp->expType = __extension__ ({
19204 struct Type * __ecereInstance2 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
19205
19206 __ecereInstance2->refCount = 1, __ecereInstance2->kind = 13, __ecereInstance2->__anon1.type = __extension__ ({
19207 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
19208
19209 __ecereInstance1->refCount = 1, __ecereInstance1->kind = 0, __ecereInstance1;
19210 }), __ecereInstance2;
19211 });
19212 if(function->body)
19213 {
19214 yylloc = function->body->loc;
19215 initializer = MkInitializerAssignment(MkExpCast(MkTypeName(MkListOne(MkStructOrUnion(3, MkIdentifier(structName), (((void *)0)))), MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), (((void *)0)))), exp));
19216 {
19217 struct Context * prevContext = curContext;
19218 struct __ecereNameSpace__ecere__sys__OldList * list;
19219
19220 curContext = function->body->__anon1.compound.context;
19221 decl = MkDeclaration((list = MkListOne(MkStructOrUnion(3, MkIdentifier(structName), (((void *)0))))), MkListOne(MkInitDeclarator(QMkPtrDecl(pointerName), initializer)));
19222 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*list), (((void *)0)), MkSpecifierExtended(MkExtDeclAttrib(MkAttrib(ATTRIB, MkListOne(MkAttribute(__ecereNameSpace__ecere__sys__CopyString("unused"), (((void *)0))))))));
19223 curContext = prevContext;
19224 }
19225 decl->symbol = (((void *)0));
19226 if(!function->body->__anon1.compound.declarations)
19227 function->body->__anon1.compound.declarations = MkList();
19228 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*function->body->__anon1.compound.declarations), (((void *)0)), decl);
19229 }
19230 }
19231 }
19232 }
19233 else
19234 thisClass = (((void *)0));
19235 if(id)
19236 {
19237 FreeSpecifier(id->_class);
19238 id->_class = (((void *)0));
19239 if(symbol && symbol->__anon2.__anon1.pointerExternal && symbol->__anon2.__anon1.pointerExternal->type == 1)
19240 {
19241 struct InitDeclarator * initDecl = (*symbol->__anon2.__anon1.pointerExternal->__anon1.declaration->__anon1.__anon1.declarators).first;
19242
19243 id = GetDeclId(initDecl->declarator);
19244 FreeSpecifier(id->_class);
19245 id->_class = (((void *)0));
19246 }
19247 }
19248 if(function->body)
19249 topContext = function->body->__anon1.compound.context;
19250 {
19251 struct FunctionDefinition * oldFunction = curFunction;
19252
19253 curFunction = function;
19254 if(function->body)
19255 ProcessStatement(function->body);
19256 if(inCompiler && function->propSet && !function->propSet->fireWatchersDone)
19257 {
19258 struct Statement * prevCompound = curCompound;
19259 struct Context * prevContext = curContext;
19260 struct Statement * fireWatchers = MkFireWatchersStmt((((void *)0)), (((void *)0)));
19261
19262 if(!function->body->__anon1.compound.statements)
19263 function->body->__anon1.compound.statements = MkList();
19264 ListAdd(function->body->__anon1.compound.statements, fireWatchers);
19265 curCompound = function->body;
19266 curContext = function->body->__anon1.compound.context;
19267 ProcessStatement(fireWatchers);
19268 curContext = prevContext;
19269 curCompound = prevCompound;
19270 }
19271 curFunction = oldFunction;
19272 }
19273 if(function->declarator)
19274 {
19275 ProcessDeclarator(function->declarator, 1);
19276 }
19277 topContext = oldTopContext;
19278 thisClass = oldThisClass;
19279 }
19280
19281 static void ProcessClass(struct __ecereNameSpace__ecere__sys__OldList * definitions, struct Symbol * symbol)
19282 {
19283 struct ClassDef * def;
19284 struct External * external = curExternal;
19285 struct __ecereNameSpace__ecere__com__Class * regClass = symbol ? symbol->__anon1.registered : (((void *)0));
19286
19287 for(def = definitions->first; def; def = def->next)
19288 {
19289 if(def->type == 0)
19290 {
19291 if(def->__anon1.function->declarator)
19292 curExternal = def->__anon1.function->declarator->symbol->__anon2.__anon1.pointerExternal;
19293 else
19294 curExternal = external;
19295 ProcessFunction((struct FunctionDefinition *)def->__anon1.function);
19296 }
19297 else if(def->type == 2)
19298 {
19299 if(def->__anon1.decl->type == 2)
19300 {
19301 thisClass = regClass;
19302 ProcessInstantiationType(def->__anon1.decl->__anon1.inst);
19303 thisClass = (((void *)0));
19304 }
19305 else
19306 {
19307 struct __ecereNameSpace__ecere__com__Class * backThisClass = thisClass;
19308
19309 if(regClass)
19310 thisClass = regClass;
19311 ProcessDeclaration(def->__anon1.decl, symbol ? 1 : 0);
19312 thisClass = backThisClass;
19313 }
19314 }
19315 else if(def->type == 1 && def->__anon1.defProperties)
19316 {
19317 struct MemberInit * defProperty;
19318 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);
19319
19320 __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Add(&globalContext->symbols, (struct __ecereNameSpace__ecere__sys__BTNode *)thisSymbol);
19321 for(defProperty = (*def->__anon1.defProperties).first; defProperty; defProperty = defProperty->next)
19322 {
19323 thisClass = regClass;
19324 ProcessMemberInitData(defProperty, regClass, (((void *)0)), (((void *)0)), (((void *)0)), (((void *)0)));
19325 thisClass = (((void *)0));
19326 }
19327 __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Remove(&globalContext->symbols, (struct __ecereNameSpace__ecere__sys__BTNode *)thisSymbol);
19328 FreeSymbol(thisSymbol);
19329 }
19330 else if(def->type == 3 && def->__anon1.propertyDef)
19331 {
19332 struct PropertyDef * prop = def->__anon1.propertyDef;
19333
19334 thisClass = regClass;
19335 if(prop->setStmt)
19336 {
19337 if(regClass)
19338 {
19339 struct Symbol * thisSymbol = (thisSymbol = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Symbol), thisSymbol->string = __ecereNameSpace__ecere__sys__CopyString("this"), thisSymbol->type = MkClassType(regClass->fullName), thisSymbol);
19340
19341 __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Add(&prop->setStmt->__anon1.compound.context->symbols, (struct __ecereNameSpace__ecere__sys__BTNode *)thisSymbol);
19342 }
19343 curExternal = prop->symbol ? prop->symbol->__anon2.__anon2.externalSet : (((void *)0));
19344 ProcessStatement(prop->setStmt);
19345 }
19346 if(prop->getStmt)
19347 {
19348 if(regClass)
19349 {
19350 struct Symbol * thisSymbol = (thisSymbol = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Symbol), thisSymbol->string = __ecereNameSpace__ecere__sys__CopyString("this"), thisSymbol->type = MkClassType(regClass->fullName), thisSymbol);
19351
19352 __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Add(&prop->getStmt->__anon1.compound.context->symbols, (struct __ecereNameSpace__ecere__sys__BTNode *)thisSymbol);
19353 }
19354 curExternal = prop->symbol ? prop->symbol->__anon2.__anon2.externalGet : (((void *)0));
19355 ProcessStatement(prop->getStmt);
19356 }
19357 if(prop->issetStmt)
19358 {
19359 if(regClass)
19360 {
19361 struct Symbol * thisSymbol = (thisSymbol = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Symbol), thisSymbol->string = __ecereNameSpace__ecere__sys__CopyString("this"), thisSymbol->type = MkClassType(regClass->fullName), thisSymbol);
19362
19363 __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Add(&prop->issetStmt->__anon1.compound.context->symbols, (struct __ecereNameSpace__ecere__sys__BTNode *)thisSymbol);
19364 }
19365 curExternal = prop->symbol ? prop->symbol->__anon2.__anon2.externalIsSet : (((void *)0));
19366 ProcessStatement(prop->issetStmt);
19367 }
19368 thisClass = (((void *)0));
19369 }
19370 else if(def->type == 4 && def->__anon1.propertyWatch)
19371 {
19372 struct PropertyWatch * propertyWatch = def->__anon1.propertyWatch;
19373
19374 thisClass = regClass;
19375 if(propertyWatch->compound)
19376 {
19377 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);
19378
19379 __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Add(&propertyWatch->compound->__anon1.compound.context->symbols, (struct __ecereNameSpace__ecere__sys__BTNode *)thisSymbol);
19380 curExternal = (((void *)0));
19381 ProcessStatement(propertyWatch->compound);
19382 }
19383 thisClass = (((void *)0));
19384 }
19385 }
19386 }
19387
19388 void __ecereRegisterModule_pass15(struct __ecereNameSpace__ecere__com__Instance * module)
19389 {
19390 struct __ecereNameSpace__ecere__com__Class __attribute__((unused)) * class;
19391
19392 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("SetYydebug", "void SetYydebug(bool b)", SetYydebug, module, 1);
19393 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("SetThisClass", "void SetThisClass(ecere::com::Class c)", SetThisClass, module, 1);
19394 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetThisClass", "ecere::com::Class GetThisClass(void)", GetThisClass, module, 1);
19395 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintExpression", "void PrintExpression(Expression exp, char * string)", PrintExpression, module, 1);
19396 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ProcessTemplateParameterType", "Type ProcessTemplateParameterType(TemplateParameter param)", ProcessTemplateParameterType, module, 2);
19397 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("NeedCast", "bool NeedCast(Type type1, Type type2)", NeedCast, module, 2);
19398 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintInt", "char * PrintInt(int64 result)", PrintInt, module, 1);
19399 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintUInt", "char * PrintUInt(uint64 result)", PrintUInt, module, 1);
19400 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintInt64", "char * PrintInt64(int64 result)", PrintInt64, module, 1);
19401 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintUInt64", "char * PrintUInt64(uint64 result)", PrintUInt64, module, 1);
19402 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintHexUInt", "char * PrintHexUInt(uint64 result)", PrintHexUInt, module, 1);
19403 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintHexUInt64", "char * PrintHexUInt64(uint64 result)", PrintHexUInt64, module, 1);
19404 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintShort", "char * PrintShort(short result)", PrintShort, module, 1);
19405 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintUShort", "char * PrintUShort(uint16 result)", PrintUShort, module, 1);
19406 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintChar", "char * PrintChar(char result)", PrintChar, module, 1);
19407 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintUChar", "char * PrintUChar(byte result)", PrintUChar, module, 1);
19408 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintFloat", "char * PrintFloat(float result)", PrintFloat, module, 1);
19409 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintDouble", "char * PrintDouble(double result)", PrintDouble, module, 1);
19410 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpInt", "bool GetOpInt(Operand op2, int * value2)", GetOpInt, module, 1);
19411 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetInt", "bool GetInt(Expression exp, int * value2)", GetInt, module, 1);
19412 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpUInt", "bool GetOpUInt(Operand op2, uint * value2)", GetOpUInt, module, 1);
19413 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetUInt", "bool GetUInt(Expression exp, uint * value2)", GetUInt, module, 1);
19414 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpInt64", "bool GetOpInt64(Operand op2, int64 * value2)", GetOpInt64, module, 1);
19415 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetInt64", "bool GetInt64(Expression exp, int64 * value2)", GetInt64, module, 1);
19416 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpUInt64", "bool GetOpUInt64(Operand op2, uint64 * value2)", GetOpUInt64, module, 1);
19417 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetUInt64", "bool GetUInt64(Expression exp, uint64 * value2)", GetUInt64, module, 1);
19418 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpIntPtr", "bool GetOpIntPtr(Operand op2, intptr * value2)", GetOpIntPtr, module, 1);
19419 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetIntPtr", "bool GetIntPtr(Expression exp, intptr * value2)", GetIntPtr, module, 1);
19420 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpUIntPtr", "bool GetOpUIntPtr(Operand op2, uintptr * value2)", GetOpUIntPtr, module, 1);
19421 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetUIntPtr", "bool GetUIntPtr(Expression exp, uintptr * value2)", GetUIntPtr, module, 1);
19422 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpIntSize", "bool GetOpIntSize(Operand op2, intsize * value2)", GetOpIntSize, module, 1);
19423 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetIntSize", "bool GetIntSize(Expression exp, intsize * value2)", GetIntSize, module, 1);
19424 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpUIntSize", "bool GetOpUIntSize(Operand op2, uintsize * value2)", GetOpUIntSize, module, 1);
19425 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetUIntSize", "bool GetUIntSize(Expression exp, uintsize * value2)", GetUIntSize, module, 1);
19426 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpShort", "bool GetOpShort(Operand op2, short * value2)", GetOpShort, module, 1);
19427 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetShort", "bool GetShort(Expression exp, short * value2)", GetShort, module, 1);
19428 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpUShort", "bool GetOpUShort(Operand op2, uint16 * value2)", GetOpUShort, module, 1);
19429 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetUShort", "bool GetUShort(Expression exp, uint16 * value2)", GetUShort, module, 1);
19430 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpChar", "bool GetOpChar(Operand op2, char * value2)", GetOpChar, module, 1);
19431 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetChar", "bool GetChar(Expression exp, char * value2)", GetChar, module, 1);
19432 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpUChar", "bool GetOpUChar(Operand op2, byte * value2)", GetOpUChar, module, 1);
19433 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetUChar", "bool GetUChar(Expression exp, byte * value2)", GetUChar, module, 1);
19434 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpFloat", "bool GetOpFloat(Operand op2, float * value2)", GetOpFloat, module, 1);
19435 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetFloat", "bool GetFloat(Expression exp, float * value2)", GetFloat, module, 1);
19436 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpDouble", "bool GetOpDouble(Operand op2, double * value2)", GetOpDouble, module, 1);
19437 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetDouble", "bool GetDouble(Expression exp, double * value2)", GetDouble, module, 1);
19438 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ComputeClassMembers", "void ComputeClassMembers(ecere::com::Class _class, bool isMember)", ComputeClassMembers, module, 2);
19439 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ComputeModuleClasses", "void ComputeModuleClasses(ecere::com::Module module)", ComputeModuleClasses, module, 1);
19440 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ComputeTypeSize", "int ComputeTypeSize(Type type)", ComputeTypeSize, module, 1);
19441 __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);
19442 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("DeclareStruct", "External DeclareStruct(External neededBy, const char * name, bool skipNoHead, bool needDereference)", DeclareStruct, module, 2);
19443 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("_DeclareStruct", "External _DeclareStruct(External neededBy, const char * name, bool skipNoHead, bool needDereference, bool fwdDecl)", _DeclareStruct, module, 2);
19444 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("DeclareProperty", "void DeclareProperty(External neededBy, ecere::com::Property prop, char * setName, char * getName)", DeclareProperty, module, 2);
19445 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("Dereference", "Type Dereference(Type source)", Dereference, module, 1);
19446 __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);
19447 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ProcessInstantiationType", "void ProcessInstantiationType(Instantiation inst)", ProcessInstantiationType, module, 2);
19448 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("DeclareType", "void DeclareType(External neededFor, Type type, bool needDereference, bool forFunctionDef)", DeclareType, module, 2);
19449 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("DeclareTypeForwardDeclare", "void DeclareTypeForwardDeclare(External neededFor, Type type, bool needDereference, bool forFunctionDef)", DeclareTypeForwardDeclare, module, 2);
19450 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("FindTemplateArg", "ecere::com::ClassTemplateArgument * FindTemplateArg(ecere::com::Class _class, TemplateParameter param)", FindTemplateArg, module, 2);
19451 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("SetupTemplatesContext", "Context SetupTemplatesContext(ecere::com::Class _class)", SetupTemplatesContext, module, 1);
19452 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("FinishTemplatesContext", "void FinishTemplatesContext(Context context)", FinishTemplatesContext, module, 1);
19453 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ProcessMethodType", "void ProcessMethodType(ecere::com::Method method)", ProcessMethodType, module, 1);
19454 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ProcessPropertyType", "void ProcessPropertyType(ecere::com::Property prop)", ProcessPropertyType, module, 1);
19455 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("DeclareMethod", "void DeclareMethod(External neededFor, ecere::com::Method method, const char * name)", DeclareMethod, module, 1);
19456 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ReplaceThisClass", "char * ReplaceThisClass(ecere::com::Class _class)", ReplaceThisClass, module, 2);
19457 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ReplaceThisClassType", "Type ReplaceThisClassType(ecere::com::Class _class)", ReplaceThisClassType, module, 2);
19458 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ReplaceThisClassSpecifiers", "void ReplaceThisClassSpecifiers(ecere::sys::OldList specs, ecere::com::Class _class)", ReplaceThisClassSpecifiers, module, 2);
19459 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("DeclareFunction", "bool DeclareFunction(External neededFor, ecere::com::GlobalFunction function, char * name)", DeclareFunction, module, 2);
19460 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("DeclareGlobalData", "void DeclareGlobalData(External neededFor, GlobalData data)", DeclareGlobalData, module, 2);
19461 class = __ecereNameSpace__ecere__com__eSystem_RegisterClass(5, "Conversion", 0, sizeof(struct Conversion), 0, (void *)0, (void *)0, module, 2, 1);
19462 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)
19463 __ecereClass_Conversion = class;
19464 __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);
19465 __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);
19466 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ModuleVisibility", "bool ModuleVisibility(ecere::com::Module searchIn, ecere::com::Module searchFor)", ModuleVisibility, module, 1);
19467 __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);
19468 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("MatchTypeExpression", "bool MatchTypeExpression(Expression sourceExp, Type dest, ecere::sys::OldList conversions, bool skipUnitBla, bool warnConst)", MatchTypeExpression, module, 2);
19469 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ReadString", "void ReadString(char * output, char * string)", ReadString, module, 1);
19470 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("UnescapeString", "int UnescapeString(char * d, char * s, int len)", UnescapeString, module, 1);
19471 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("OffsetEscapedString", "char * OffsetEscapedString(char * s, int len, int offset)", OffsetEscapedString, module, 1);
19472 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOperand", "Operand GetOperand(Expression exp)", GetOperand, module, 1);
19473 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PopulateInstance", "void PopulateInstance(Instantiation inst)", PopulateInstance, module, 1);
19474 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ComputeInstantiation", "void ComputeInstantiation(Expression exp)", ComputeInstantiation, module, 1);
19475 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("CallOperator", "void CallOperator(Expression exp, Expression exp1, Expression exp2, Operand op1, Operand op2)", CallOperator, module, 1);
19476 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ComputeExpression", "void ComputeExpression(Expression exp)", ComputeExpression, module, 1);
19477 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("CheckTemplateTypes", "void CheckTemplateTypes(Expression exp)", CheckTemplateTypes, module, 1);
19478 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("FindSymbol", "Symbol FindSymbol(const char * name, Context startContext, Context endContext, bool isStruct, bool globalNameSpace)", FindSymbol, module, 1);
19479 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintType", "void PrintType(Type type, char * string, bool printName, bool fullName)", PrintType, module, 1);
19480 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintTypeNoConst", "void PrintTypeNoConst(Type type, char * string, bool printName, bool fullName)", PrintTypeNoConst, module, 1);
19481 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("FindMemberAndOffset", "Type FindMemberAndOffset(Type type, char * string, uint * offset)", FindMemberAndOffset, module, 1);
19482 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetParseError", "bool GetParseError(void)", GetParseError, module, 1);
19483 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ParseExpressionString", "Expression ParseExpressionString(char * expression)", ParseExpressionString, module, 1);
19484 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ReplaceExpContents", "void ReplaceExpContents(Expression checkedExp, Expression newExp)", ReplaceExpContents, module, 1);
19485 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ApplyAnyObjectLogic", "void ApplyAnyObjectLogic(Expression e)", ApplyAnyObjectLogic, module, 1);
19486 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ApplyLocation", "void ApplyLocation(Expression exp, Location loc)", ApplyLocation, module, 1);
19487 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ProcessExpressionType", "void ProcessExpressionType(Expression exp)", ProcessExpressionType, module, 1);
19488 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("DeclareFunctionUtil", "void DeclareFunctionUtil(External neededBy, const String s)", DeclareFunctionUtil, module, 1);
19489 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ComputeDataTypes", "void ComputeDataTypes(void)", ComputeDataTypes, module, 1);
19490 }
19491