be8261f55dfd63aa29f5cf843c39005d1f9084a3
[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 ? __extension__ ({
8308 void * __ecerePtrToDelete = (newExp);
8309
8310 __ecereClass_Expression->Destructor ? __ecereClass_Expression->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete);
8311 }) : 0), newExp = 0);
8312 checkedExp->prev = prev;
8313 checkedExp->next = next;
8314 }
8315
8316 void FinishTemplatesContext(struct Context * context)
8317 {
8318 PopContext(context);
8319 FreeContext(context);
8320 ((context ? __extension__ ({
8321 void * __ecerePtrToDelete = (context);
8322
8323 __ecereClass_Context->Destructor ? __ecereClass_Context->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete);
8324 }) : 0), context = 0);
8325 }
8326
8327 static __attribute__((unused)) void UnusedFunction()
8328 {
8329 int a;
8330
8331 ((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);
8332 }
8333
8334 struct Expression * ParseExpressionString(char * expression)
8335 {
8336 parseError = 0;
8337 fileInput = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass___ecereNameSpace__ecere__sys__TempFile);
8338 ((int (*)(struct __ecereNameSpace__ecere__com__Instance *, const void *  buffer, unsigned int size, unsigned int count))__extension__ ({
8339 struct __ecereNameSpace__ecere__com__Instance * __internal_ClassInst = fileInput;
8340
8341 __internal_ClassInst ? __internal_ClassInst->_vTbl : __ecereClass___ecereNameSpace__ecere__sys__File->_vTbl;
8342 })[__ecereVMethodID___ecereNameSpace__ecere__sys__File_Write])(fileInput, expression, 1, strlen(expression));
8343 ((unsigned int (*)(struct __ecereNameSpace__ecere__com__Instance *, int pos, int mode))__extension__ ({
8344 struct __ecereNameSpace__ecere__com__Instance * __internal_ClassInst = fileInput;
8345
8346 __internal_ClassInst ? __internal_ClassInst->_vTbl : __ecereClass___ecereNameSpace__ecere__sys__File->_vTbl;
8347 })[__ecereVMethodID___ecereNameSpace__ecere__sys__File_Seek])(fileInput, 0, 0);
8348 echoOn = 0;
8349 parsedExpression = (((void *)0));
8350 resetScanner();
8351 expression_yyparse();
8352 (__ecereNameSpace__ecere__com__eInstance_DecRef(fileInput), fileInput = 0);
8353 return parsedExpression;
8354 }
8355
8356 struct __ecereNameSpace__ecere__com__Module
8357 {
8358 struct __ecereNameSpace__ecere__com__Instance * application;
8359 struct __ecereNameSpace__ecere__sys__OldList classes;
8360 struct __ecereNameSpace__ecere__sys__OldList defines;
8361 struct __ecereNameSpace__ecere__sys__OldList functions;
8362 struct __ecereNameSpace__ecere__sys__OldList modules;
8363 struct __ecereNameSpace__ecere__com__Instance * prev;
8364 struct __ecereNameSpace__ecere__com__Instance * next;
8365 const char *  name;
8366 void *  library;
8367 void *  Unload;
8368 int importType;
8369 int origImportType;
8370 struct __ecereNameSpace__ecere__com__NameSpace privateNameSpace;
8371 struct __ecereNameSpace__ecere__com__NameSpace publicNameSpace;
8372 } ecere_gcc_struct;
8373
8374 static struct GlobalData * FindGlobalData(char * name)
8375 {
8376 int start = 0, c;
8377 struct __ecereNameSpace__ecere__com__NameSpace * nameSpace;
8378
8379 nameSpace = globalData;
8380 for(c = 0; name[c]; c++)
8381 {
8382 if(name[c] == '.' || (name[c] == ':' && name[c + 1] == ':'))
8383 {
8384 struct __ecereNameSpace__ecere__com__NameSpace * newSpace;
8385 char * spaceName = __ecereNameSpace__ecere__com__eSystem_New(sizeof(char) * (c - start + 1));
8386
8387 strncpy(spaceName, name + start, c - start);
8388 spaceName[c - start] = '\0';
8389 newSpace = (struct __ecereNameSpace__ecere__com__NameSpace *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindString(&(*nameSpace).nameSpaces, spaceName);
8390 (__ecereNameSpace__ecere__com__eSystem_Delete(spaceName), spaceName = 0);
8391 if(!newSpace)
8392 return (((void *)0));
8393 nameSpace = newSpace;
8394 if(name[c] == ':')
8395 c++;
8396 start = c + 1;
8397 }
8398 }
8399 if(c - start)
8400 {
8401 return ScanGlobalData(nameSpace, name + start);
8402 }
8403 return (((void *)0));
8404 }
8405
8406 static struct Symbol * FindWithNameSpace(struct __ecereNameSpace__ecere__sys__BinaryTree * tree, const char * name)
8407 {
8408 int c;
8409 char nameSpace[1024];
8410 const char * namePart;
8411 unsigned int gotColon = 0;
8412
8413 nameSpace[0] = '\0';
8414 for(c = strlen(name) - 1; c >= 0; c--)
8415 if(name[c] == ':')
8416 {
8417 gotColon = 1;
8418 break;
8419 }
8420 namePart = name + c + 1;
8421 while(c >= 0 && name[c] == ':')
8422 c--;
8423 if(c >= 0)
8424 {
8425 struct Symbol * symbol = (struct Symbol *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindString(tree, name);
8426
8427 if(symbol)
8428 return symbol;
8429 memcpy(nameSpace, name, c + 1);
8430 nameSpace[c + 1] = 0;
8431 return ScanWithNameSpace(tree, nameSpace, namePart);
8432 }
8433 else if(gotColon)
8434 {
8435 struct Symbol * symbol = (struct Symbol *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindString(tree, namePart);
8436
8437 return symbol;
8438 }
8439 else
8440 {
8441 struct Symbol * symbol = (struct Symbol *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindString(tree, namePart);
8442
8443 if(symbol)
8444 return symbol;
8445 return ScanWithNameSpace(tree, "", namePart);
8446 }
8447 return (((void *)0));
8448 }
8449
8450 static void PrintArraySize(struct Type * arrayType, char * string)
8451 {
8452 char size[256];
8453
8454 size[0] = '\0';
8455 strcat(size, "[");
8456 if(arrayType->__anon1.__anon4.enumClass)
8457 strcat(size, arrayType->__anon1.__anon4.enumClass->string);
8458 else if(arrayType->__anon1.__anon4.arraySizeExp)
8459 PrintExpression(arrayType->__anon1.__anon4.arraySizeExp, size);
8460 strcat(size, "]");
8461 strcat(string, size);
8462 }
8463
8464 void __ecereUnregisterModule_pass15(struct __ecereNameSpace__ecere__com__Instance * module)
8465 {
8466
8467 }
8468
8469 static void PostPrintType(struct Type * type, char * string, unsigned int fullName)
8470 {
8471 if(type->kind == 13 && (type->__anon1.type->kind == 12 || type->__anon1.type->kind == 11 || type->__anon1.type->kind == 16))
8472 strcat(string, ")");
8473 if(type->kind == 12)
8474 PrintArraySize(type, string);
8475 else if(type->kind == 11)
8476 {
8477 struct Type * param;
8478
8479 strcat(string, "(");
8480 for(param = type->__anon1.__anon2.params.first; param; param = param->next)
8481 {
8482 PrintType(param, string, 1, fullName);
8483 if(param->next)
8484 strcat(string, ", ");
8485 }
8486 strcat(string, ")");
8487 }
8488 if(type->kind == 12 || type->kind == 13 || type->kind == 11 || type->kind == 16)
8489 PostPrintType(type->kind == 16 ? type->__anon1.__anon3.method->dataType : type->__anon1.type, string, fullName);
8490 }
8491
8492 static void _PrintType(struct Type * type, char * string, unsigned int printName, unsigned int fullName, unsigned int printConst)
8493 {
8494 PrePrintType(type, string, fullName, (((void *)0)), printConst);
8495 if(type->__anon1.__anon2.thisClass || (printName && type->name && type->name[0]))
8496 strcat(string, " ");
8497 if((type->__anon1.__anon2.thisClass || type->__anon1.__anon2.staticMethod))
8498 {
8499 struct Symbol * _class = type->__anon1.__anon2.thisClass;
8500
8501 if((type->classObjectType == 2 || type->classObjectType == 1) || (_class && !strcmp(_class->string, "class")))
8502 {
8503 if(type->classObjectType == 1)
8504 strcat(string, "class");
8505 else
8506 strcat(string, type->byReference ? "typed_object&" : "typed_object");
8507 }
8508 else if(_class && _class->string)
8509 {
8510 char * s = _class->string;
8511
8512 if(fullName)
8513 strcat(string, s);
8514 else
8515 {
8516 char * name = __ecereNameSpace__ecere__sys__RSearchString(s, "::", strlen(s), 1, 0);
8517
8518 if(name)
8519 name += 2;
8520 else
8521 name = s;
8522 strcat(string, name);
8523 }
8524 }
8525 strcat(string, "::");
8526 }
8527 if(printName && type->name)
8528 PrintName(type, string, fullName);
8529 PostPrintType(type, string, fullName);
8530 if(type->bitFieldCount)
8531 {
8532 char count[100];
8533
8534 sprintf(count, ":%d", type->bitFieldCount);
8535 strcat(string, count);
8536 }
8537 }
8538
8539 struct Conversion;
8540
8541 struct Conversion
8542 {
8543 struct Conversion * prev, * next;
8544 struct __ecereNameSpace__ecere__com__Property * convert;
8545 unsigned int isGet;
8546 struct Type * resultType;
8547 } ecere_gcc_struct;
8548
8549 static void FreeConvert(struct Conversion * convert)
8550 {
8551 if(convert->resultType)
8552 FreeType(convert->resultType);
8553 }
8554
8555 struct Enumerator;
8556
8557 struct Enumerator
8558 {
8559 struct Enumerator * prev;
8560 struct Enumerator * next;
8561 struct Location loc;
8562 struct Identifier * id;
8563 struct Expression * exp;
8564 } ecere_gcc_struct;
8565
8566 struct AsmField;
8567
8568 struct AsmField
8569 {
8570 struct AsmField * prev;
8571 struct AsmField * next;
8572 struct Location loc;
8573 char *  command;
8574 struct Expression * expression;
8575 struct Identifier * symbolic;
8576 } ecere_gcc_struct;
8577
8578 struct ClassDefinition;
8579
8580 struct Context
8581 {
8582 struct Context * parent;
8583 struct __ecereNameSpace__ecere__sys__BinaryTree types;
8584 struct __ecereNameSpace__ecere__sys__BinaryTree classes;
8585 struct __ecereNameSpace__ecere__sys__BinaryTree symbols;
8586 struct __ecereNameSpace__ecere__sys__BinaryTree structSymbols;
8587 int nextID;
8588 int simpleID;
8589 struct __ecereNameSpace__ecere__sys__BinaryTree templateTypes;
8590 struct ClassDefinition * classDef;
8591 unsigned int templateTypesOnly;
8592 unsigned int hasNameSpace;
8593 } ecere_gcc_struct;
8594
8595 struct External
8596 {
8597 struct External * prev;
8598 struct External * next;
8599 struct Location loc;
8600 int type;
8601 struct Symbol * symbol;
8602 union
8603 {
8604 struct FunctionDefinition * function;
8605 struct ClassDefinition * _class;
8606 struct Declaration * declaration;
8607 char *  importString;
8608 struct Identifier * id;
8609 struct DBTableDef * table;
8610 } ecere_gcc_struct __anon1;
8611 int importType;
8612 struct External * fwdDecl;
8613 struct __ecereNameSpace__ecere__com__Instance * outgoing;
8614 struct __ecereNameSpace__ecere__com__Instance * incoming;
8615 int nonBreakableIncoming;
8616 } ecere_gcc_struct;
8617
8618 struct ClassDefinition
8619 {
8620 struct ClassDefinition * prev;
8621 struct ClassDefinition * next;
8622 struct Location loc;
8623 struct Specifier * _class;
8624 struct __ecereNameSpace__ecere__sys__OldList *  baseSpecs;
8625 struct __ecereNameSpace__ecere__sys__OldList *  definitions;
8626 struct Symbol * symbol;
8627 struct Location blockStart;
8628 struct Location nameLoc;
8629 int declMode;
8630 unsigned int deleteWatchable;
8631 } ecere_gcc_struct;
8632
8633 void __ecereMethod_External_CreateUniqueEdge(struct External * this, struct External * from, unsigned int soft);
8634
8635 void __ecereMethod_External_CreateEdge(struct External * this, struct External * from, unsigned int soft);
8636
8637 void DeclareGlobalData(struct External * neededFor, struct GlobalData * data)
8638 {
8639 struct Symbol * symbol = data->symbol;
8640
8641 if(!symbol || !symbol->__anon2.__anon1.pointerExternal)
8642 {
8643 if(inCompiler)
8644 {
8645 if(!symbol)
8646 symbol = data->symbol = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Symbol);
8647 }
8648 if(!data->dataType)
8649 data->dataType = ProcessTypeString(data->dataTypeString, 0);
8650 if(inCompiler)
8651 {
8652 struct Declaration * decl;
8653 struct __ecereNameSpace__ecere__sys__OldList * specifiers, * declarators;
8654 struct Declarator * d;
8655 struct External * external;
8656
8657 specifiers = MkList();
8658 declarators = MkList();
8659 ListAdd(specifiers, MkSpecifier(EXTERN));
8660 d = MkDeclaratorIdentifier(MkIdentifier(data->fullName));
8661 d = SpecDeclFromString(data->dataTypeString, specifiers, d);
8662 ListAdd(declarators, MkInitDeclarator(d, (((void *)0))));
8663 decl = MkDeclaration(specifiers, declarators);
8664 external = MkExternalDeclaration(decl);
8665 if(curExternal)
8666 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*ast), curExternal->prev, external);
8667 external->symbol = symbol;
8668 symbol->__anon2.__anon1.pointerExternal = external;
8669 DeclareType(external, data->dataType, 1, 1);
8670 }
8671 }
8672 if(inCompiler && neededFor && symbol && symbol->__anon2.__anon1.pointerExternal)
8673 __ecereMethod_External_CreateUniqueEdge(neededFor, symbol->__anon2.__anon1.pointerExternal, 0);
8674 }
8675
8676 struct Symbol * FindSymbol(const char * name, struct Context * startContext, struct Context * endContext, unsigned int isStruct, unsigned int globalNameSpace)
8677 {
8678 struct Context * ctx;
8679 struct Symbol * symbol = (((void *)0));
8680
8681 for(ctx = startContext; ctx && !symbol; ctx = ctx->parent)
8682 {
8683 if(ctx == globalContext && !globalNameSpace && ctx->hasNameSpace)
8684 {
8685 symbol = (((void *)0));
8686 if(thisNameSpace)
8687 {
8688 char curName[1024];
8689
8690 strcpy(curName, thisNameSpace);
8691 strcat(curName, "::");
8692 strcat(curName, name);
8693 symbol = FindWithNameSpace(isStruct ? &ctx->structSymbols : &ctx->symbols, curName);
8694 }
8695 if(!symbol)
8696 symbol = FindWithNameSpace(isStruct ? &ctx->structSymbols : &ctx->symbols, name);
8697 }
8698 else
8699 symbol = (struct Symbol *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindString((isStruct ? &ctx->structSymbols : &ctx->symbols), name);
8700 if(symbol || ctx == endContext)
8701 break;
8702 }
8703 if(inCompiler && symbol && ctx == globalContext && symbol->__anon2.__anon1.pointerExternal && curExternal && symbol->__anon2.__anon1.pointerExternal != curExternal)
8704 __ecereMethod_External_CreateUniqueEdge(curExternal, symbol->__anon2.__anon1.pointerExternal, symbol->__anon2.__anon1.pointerExternal->type == 0);
8705 return symbol;
8706 }
8707
8708 struct PropertyDef;
8709
8710 struct ClassDef
8711 {
8712 struct ClassDef * prev;
8713 struct ClassDef * next;
8714 struct Location loc;
8715 int type;
8716 union
8717 {
8718 struct Declaration * decl;
8719 struct ClassFunction * function;
8720 struct __ecereNameSpace__ecere__sys__OldList *  defProperties;
8721 struct PropertyDef * propertyDef;
8722 struct PropertyWatch * propertyWatch;
8723 char *  designer;
8724 struct Identifier * defaultProperty;
8725 struct
8726 {
8727 struct Identifier * id;
8728 struct Initializer * initializer;
8729 } ecere_gcc_struct __anon1;
8730 } ecere_gcc_struct __anon1;
8731 int memberAccess;
8732 void *  object;
8733 } ecere_gcc_struct;
8734
8735 struct PropertyDef
8736 {
8737 struct PropertyDef * prev;
8738 struct PropertyDef * next;
8739 struct Location loc;
8740 struct __ecereNameSpace__ecere__sys__OldList *  specifiers;
8741 struct Declarator * declarator;
8742 struct Identifier * id;
8743 struct Statement * getStmt;
8744 struct Statement * setStmt;
8745 struct Statement * issetStmt;
8746 struct Symbol * symbol;
8747 struct Expression * category;
8748 struct
8749 {
8750 unsigned int conversion : 1;
8751 unsigned int isWatchable : 1;
8752 unsigned int isDBProp : 1;
8753 } ecere_gcc_struct __anon1;
8754 } ecere_gcc_struct;
8755
8756 static void IdentifyAnonStructs(struct __ecereNameSpace__ecere__sys__OldList * definitions)
8757 {
8758 struct ClassDef * def;
8759 int anonID = 1;
8760
8761 for(def = (*definitions).first; def; def = def->next)
8762 {
8763 if(def->type == 2)
8764 {
8765 struct Declaration * decl = def->__anon1.decl;
8766
8767 if(decl && decl->__anon1.__anon1.specifiers)
8768 {
8769 struct Specifier * spec;
8770 unsigned int isStruct = 0;
8771
8772 for(spec = (*decl->__anon1.__anon1.specifiers).first; spec; spec = spec->next)
8773 {
8774 if(spec->type == 3 || spec->type == 4)
8775 {
8776 if(spec->__anon1.__anon2.definitions)
8777 IdentifyAnonStructs(spec->__anon1.__anon2.definitions);
8778 isStruct = 1;
8779 }
8780 }
8781 if(isStruct)
8782 {
8783 struct Declarator * d = (((void *)0));
8784
8785 if(decl->__anon1.__anon1.declarators)
8786 {
8787 for(d = (*decl->__anon1.__anon1.declarators).first; d; d = d->next)
8788 {
8789 struct Identifier * idDecl = GetDeclId(d);
8790
8791 if(idDecl)
8792 break;
8793 }
8794 }
8795 if(!d)
8796 {
8797 char id[100];
8798
8799 sprintf(id, "__anon%d", anonID++);
8800 if(!decl->__anon1.__anon1.declarators)
8801 decl->__anon1.__anon1.declarators = MkList();
8802 ListAdd(decl->__anon1.__anon1.declarators, MkDeclaratorIdentifier(MkIdentifier(id)));
8803 }
8804 }
8805 }
8806 }
8807 }
8808 }
8809
8810 struct MemberInit;
8811
8812 typedef union YYSTYPE
8813 {
8814 int specifierType;
8815 int i;
8816 int declMode;
8817 struct Identifier * id;
8818 struct Expression * exp;
8819 struct Specifier * specifier;
8820 struct __ecereNameSpace__ecere__sys__OldList * list;
8821 struct Enumerator * enumerator;
8822 struct Declarator * declarator;
8823 struct Pointer * pointer;
8824 struct Initializer * initializer;
8825 struct InitDeclarator * initDeclarator;
8826 struct TypeName * typeName;
8827 struct Declaration * declaration;
8828 struct Statement * stmt;
8829 struct FunctionDefinition * function;
8830 struct External * external;
8831 struct Context * context;
8832 struct AsmField * asmField;
8833 struct Attrib * attrib;
8834 struct ExtDecl * extDecl;
8835 struct Attribute * attribute;
8836 struct Instantiation * instance;
8837 struct MembersInit * membersInit;
8838 struct MemberInit * memberInit;
8839 struct ClassFunction * classFunction;
8840 struct ClassDefinition * _class;
8841 struct ClassDef * classDef;
8842 struct PropertyDef * prop;
8843 char * string;
8844 struct Symbol * symbol;
8845 struct PropertyWatch * propertyWatch;
8846 struct TemplateParameter * templateParameter;
8847 struct TemplateArgument * templateArgument;
8848 struct TemplateDatatype * templateDatatype;
8849 struct DBTableEntry * dbtableEntry;
8850 struct DBIndexItem * dbindexItem;
8851 struct DBTableDef * dbtableDef;
8852 } ecere_gcc_struct YYSTYPE;
8853
8854 extern YYSTYPE yylval;
8855
8856 struct MemberInit
8857 {
8858 struct MemberInit * prev;
8859 struct MemberInit * next;
8860 struct Location loc;
8861 struct Location realLoc;
8862 struct __ecereNameSpace__ecere__sys__OldList *  identifiers;
8863 struct Initializer * initializer;
8864 unsigned int used;
8865 unsigned int variable;
8866 unsigned int takeOutExp;
8867 } ecere_gcc_struct;
8868
8869 extern struct MemberInit * MkMemberInit(struct __ecereNameSpace__ecere__sys__OldList * ids, struct Initializer * initializer);
8870
8871 struct __ecereNameSpace__ecere__com__ClassTemplateParameter;
8872
8873 struct __ecereNameSpace__ecere__com__ClassTemplateParameter
8874 {
8875 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * prev;
8876 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * next;
8877 const char *  name;
8878 int type;
8879 union
8880 {
8881 const char *  dataTypeString;
8882 int memberType;
8883 } ecere_gcc_struct __anon1;
8884 struct __ecereNameSpace__ecere__com__ClassTemplateArgument defaultArg;
8885 void *  param;
8886 } ecere_gcc_struct;
8887
8888 struct __ecereNameSpace__ecere__com__ClassTemplateArgument * FindTemplateArg(struct __ecereNameSpace__ecere__com__Class * _class, struct TemplateParameter * param)
8889 {
8890 struct __ecereNameSpace__ecere__com__ClassTemplateArgument * arg = (((void *)0));
8891 int id = 0;
8892 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * curParam = (((void *)0));
8893 struct __ecereNameSpace__ecere__com__Class * sClass;
8894
8895 for(sClass = _class; sClass; sClass = sClass->base)
8896 {
8897 id = 0;
8898 if(sClass->templateClass)
8899 sClass = sClass->templateClass;
8900 for(curParam = sClass->templateParams.first; curParam; curParam = curParam->next)
8901 {
8902 if(curParam->type == 0 && !strcmp(param->identifier->string, curParam->name))
8903 {
8904 for(sClass = sClass->base; sClass; sClass = sClass->base)
8905 {
8906 if(sClass->templateClass)
8907 sClass = sClass->templateClass;
8908 id += sClass->templateParams.count;
8909 }
8910 break;
8911 }
8912 id++;
8913 }
8914 if(curParam)
8915 break;
8916 }
8917 if(curParam)
8918 {
8919 arg = &_class->templateArgs[id];
8920 if(arg && param->type == 0)
8921 (*arg).__anon1.__anon1.dataTypeClass = __ecereNameSpace__ecere__com__eSystem_FindClass(_class->module, (*arg).__anon1.__anon1.dataTypeString);
8922 }
8923 return arg;
8924 }
8925
8926 struct Context * SetupTemplatesContext(struct __ecereNameSpace__ecere__com__Class * _class)
8927 {
8928 struct Context * context = PushContext();
8929
8930 context->templateTypesOnly = 1;
8931 if(_class->symbol && ((struct Symbol *)_class->symbol)->templateParams)
8932 {
8933 struct TemplateParameter * param = (*((struct Symbol *)_class->symbol)->templateParams).first;
8934
8935 for(; param; param = param->next)
8936 {
8937 if(param->type == 0 && param->identifier)
8938 {
8939 struct TemplatedType * type = (type = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_TemplatedType), type->key = (uintptr_t)param->identifier->string, type->param = param, type);
8940
8941 __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Add(&curContext->templateTypes, (struct __ecereNameSpace__ecere__sys__BTNode *)type);
8942 }
8943 }
8944 }
8945 else if(_class)
8946 {
8947 struct __ecereNameSpace__ecere__com__Class * sClass;
8948
8949 for(sClass = _class; sClass; sClass = sClass->base)
8950 {
8951 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * p;
8952
8953 for(p = sClass->templateParams.first; p; p = p->next)
8954 {
8955 if(p->type == 0)
8956 {
8957 struct TemplateParameter * param = p->param;
8958 struct TemplatedType * type;
8959
8960 if(!param)
8961 {
8962 p->param = param = __extension__ ({
8963 struct TemplateParameter * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_TemplateParameter);
8964
8965 __ecereInstance1->identifier = MkIdentifier(p->name), __ecereInstance1->type = p->type, __ecereInstance1->dataTypeString = p->__anon1.dataTypeString, __ecereInstance1;
8966 });
8967 }
8968 type = __extension__ ({
8969 struct TemplatedType * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_TemplatedType);
8970
8971 __ecereInstance1->key = (uintptr_t)p->name, __ecereInstance1->param = param, __ecereInstance1;
8972 });
8973 __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Add(&curContext->templateTypes, (struct __ecereNameSpace__ecere__sys__BTNode *)type);
8974 }
8975 }
8976 }
8977 }
8978 return context;
8979 }
8980
8981 char * ReplaceThisClass(struct __ecereNameSpace__ecere__com__Class * _class)
8982 {
8983 if(thisClassParams && _class->templateParams.count && !_class->templateClass)
8984 {
8985 unsigned int first = 1;
8986 int p = 0;
8987 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * param;
8988 int lastParam = -1;
8989 char className[1024];
8990
8991 strcpy(className, _class->fullName);
8992 for(param = _class->templateParams.first; param; param = param->next)
8993 {
8994 {
8995 if(first)
8996 strcat(className, "<");
8997 if(!first)
8998 strcat(className, ", ");
8999 if(lastParam + 1 != p)
9000 {
9001 strcat(className, param->name);
9002 strcat(className, " = ");
9003 }
9004 strcat(className, param->name);
9005 first = 0;
9006 lastParam = p;
9007 }
9008 p++;
9009 }
9010 if(!first)
9011 {
9012 int len = strlen(className);
9013
9014 if(className[len - 1] == '>')
9015 className[len++] = ' ';
9016 className[len++] = '>';
9017 className[len++] = '\0';
9018 }
9019 return __ecereNameSpace__ecere__sys__CopyString(className);
9020 }
9021 else
9022 return __ecereNameSpace__ecere__sys__CopyString(_class->fullName);
9023 }
9024
9025 struct Type * ReplaceThisClassType(struct __ecereNameSpace__ecere__com__Class * _class)
9026 {
9027 struct Type * type;
9028
9029 if(thisClassParams && _class->templateParams.count && !_class->templateClass)
9030 {
9031 unsigned int first = 1;
9032 int p = 0;
9033 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * param;
9034 int lastParam = -1;
9035 char className[1024];
9036
9037 strcpy(className, _class->fullName);
9038 for(param = _class->templateParams.first; param; param = param->next)
9039 {
9040 {
9041 if(first)
9042 strcat(className, "<");
9043 if(!first)
9044 strcat(className, ", ");
9045 if(lastParam + 1 != p)
9046 {
9047 strcat(className, param->name);
9048 strcat(className, " = ");
9049 }
9050 strcat(className, param->name);
9051 first = 0;
9052 lastParam = p;
9053 }
9054 p++;
9055 }
9056 if(!first)
9057 {
9058 int len = strlen(className);
9059
9060 if(className[len - 1] == '>')
9061 className[len++] = ' ';
9062 className[len++] = '>';
9063 className[len++] = '\0';
9064 }
9065 type = MkClassType(className);
9066 }
9067 else
9068 {
9069 type = MkClassType(_class->fullName);
9070 }
9071 return type;
9072 }
9073
9074 static int DeclareMembers(struct External * neededBy, struct __ecereNameSpace__ecere__com__Class * _class, unsigned int isMember)
9075 {
9076 struct __ecereNameSpace__ecere__com__DataMember * topMember = isMember ? (struct __ecereNameSpace__ecere__com__DataMember *)_class : (((void *)0));
9077 struct __ecereNameSpace__ecere__com__DataMember * member;
9078 struct Context * context = isMember ? (((void *)0)) : SetupTemplatesContext(_class);
9079
9080 if(!isMember && (_class->type == 1 || _class->type == 5) && _class->base->type != 1000)
9081 DeclareMembers(neededBy, _class->base, 0);
9082 for(member = isMember ? topMember->members.first : _class->membersAndProperties.first; member; member = member->next)
9083 {
9084 if(!member->isProperty)
9085 {
9086 switch(member->type)
9087 {
9088 case 0:
9089 {
9090 if(!member->dataType && member->dataTypeString)
9091 member->dataType = ProcessTypeString(member->dataTypeString, 0);
9092 if(member->dataType)
9093 DeclareType(neededBy, member->dataType, 1, 0);
9094 break;
9095 }
9096 case 1:
9097 case 2:
9098 {
9099 DeclareMembers(neededBy, (struct __ecereNameSpace__ecere__com__Class *)member, 1);
9100 break;
9101 }
9102 }
9103 }
9104 }
9105 if(context)
9106 FinishTemplatesContext(context);
9107 return topMember ? topMember->memberID : _class->memberID;
9108 }
9109
9110 void ProcessMethodType(struct __ecereNameSpace__ecere__com__Method * method)
9111 {
9112 if(!method->dataType)
9113 {
9114 struct Context * context = SetupTemplatesContext(method->_class);
9115
9116 method->dataType = ProcessTypeString(method->dataTypeString, 0);
9117 FinishTemplatesContext(context);
9118 if(method->type != 1 && method->dataType)
9119 {
9120 if(!method->dataType->__anon1.__anon2.thisClass && !method->dataType->__anon1.__anon2.staticMethod)
9121 {
9122 if(!method->_class->symbol)
9123 method->_class->symbol = FindClass(method->_class->fullName);
9124 method->dataType->__anon1.__anon2.thisClass = method->_class->symbol;
9125 }
9126 }
9127 }
9128 }
9129
9130 void ProcessPropertyType(struct __ecereNameSpace__ecere__com__Property * prop)
9131 {
9132 if(!prop->dataType)
9133 {
9134 struct Context * context = SetupTemplatesContext(prop->_class);
9135
9136 prop->dataType = ProcessTypeString(prop->dataTypeString, 0);
9137 FinishTemplatesContext(context);
9138 }
9139 }
9140
9141 void ReplaceThisClassSpecifiers(struct __ecereNameSpace__ecere__sys__OldList * specs, struct __ecereNameSpace__ecere__com__Class * _class)
9142 {
9143 if(specs != (((void *)0)) && _class)
9144 {
9145 struct Specifier * spec;
9146
9147 for(spec = specs->first; spec; spec = spec->next)
9148 {
9149 if(spec->type == 0 && spec->__anon1.specifier == THISCLASS)
9150 {
9151 spec->type = 1;
9152 spec->__anon1.__anon1.name = ReplaceThisClass(_class);
9153 spec->__anon1.__anon1.symbol = FindClass(spec->__anon1.__anon1.name);
9154 }
9155 }
9156 }
9157 }
9158
9159 static unsigned int ResolveIdWithClass(struct Expression * exp, struct __ecereNameSpace__ecere__com__Class * _class, unsigned int skipIDClassCheck)
9160 {
9161 struct Identifier * id = exp->__anon1.__anon1.identifier;
9162 struct __ecereNameSpace__ecere__com__Method * method = (((void *)0));
9163 struct __ecereNameSpace__ecere__com__Property * prop = (((void *)0));
9164 struct __ecereNameSpace__ecere__com__DataMember * member = (((void *)0));
9165 struct __ecereNameSpace__ecere__com__ClassProperty * classProp = (((void *)0));
9166
9167 if(_class && _class->type == 4)
9168 {
9169 struct __ecereNameSpace__ecere__sys__NamedLink64 * value = (((void *)0));
9170 struct __ecereNameSpace__ecere__com__Class * enumClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "enum");
9171
9172 if(enumClass)
9173 {
9174 struct __ecereNameSpace__ecere__com__Class * baseClass;
9175
9176 for(baseClass = _class; baseClass && baseClass->type == 4; baseClass = baseClass->base)
9177 {
9178 struct __ecereNameSpace__ecere__com__EnumClassData * e = (baseClass ? ((void *)(((char *)baseClass->data) + enumClass->offsetClass)) : (((void *)0)));
9179
9180 for(value = e->values.first; value; value = value->next)
9181 {
9182 if(!strcmp(value->name, id->string))
9183 break;
9184 }
9185 if(value)
9186 {
9187 exp->isConstant = 1;
9188 if(inCompiler || inPreCompiler || inDebugger)
9189 {
9190 char constant[256];
9191
9192 FreeExpContents(exp);
9193 exp->type = 2;
9194 if(!strcmp(baseClass->dataTypeString, "int") || !strcmp(baseClass->dataTypeString, "int64") || !strcmp(baseClass->dataTypeString, "char") || !strcmp(baseClass->dataTypeString, "short"))
9195 sprintf(constant, ((__runtimePlatform == 1) ? "%I64d" : "%lld"), value->data);
9196 else
9197 sprintf(constant, ((__runtimePlatform == 1) ? "0x%I64X" : "0x%llX"), value->data);
9198 exp->__anon1.__anon1.constant = __ecereNameSpace__ecere__sys__CopyString(constant);
9199 }
9200 exp->expType = MkClassType(baseClass->fullName);
9201 break;
9202 }
9203 }
9204 }
9205 if(value)
9206 return 1;
9207 }
9208 if((method = __ecereNameSpace__ecere__com__eClass_FindMethod(_class, id->string, privateModule)))
9209 {
9210 ProcessMethodType(method);
9211 exp->expType = __extension__ ({
9212 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
9213
9214 __ecereInstance1->refCount = 1, __ecereInstance1->kind = 16, __ecereInstance1->__anon1.__anon3.method = method, __ecereInstance1->__anon1.__anon3.methodClass = (skipIDClassCheck || (id && id->_class)) ? _class : (((void *)0)), __ecereInstance1;
9215 });
9216 return 1;
9217 }
9218 else if((prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, id->string, privateModule)))
9219 {
9220 if(!prop->dataType)
9221 ProcessPropertyType(prop);
9222 exp->expType = prop->dataType;
9223 if(prop->dataType)
9224 prop->dataType->refCount++;
9225 return 1;
9226 }
9227 else if((member = __ecereNameSpace__ecere__com__eClass_FindDataMember(_class, id->string, privateModule, (((void *)0)), (((void *)0)))))
9228 {
9229 if(!member->dataType)
9230 member->dataType = ProcessTypeString(member->dataTypeString, 0);
9231 exp->expType = member->dataType;
9232 if(member->dataType)
9233 member->dataType->refCount++;
9234 return 1;
9235 }
9236 else if((classProp = __ecereNameSpace__ecere__com__eClass_FindClassProperty(_class, id->string)))
9237 {
9238 if(!classProp->dataType)
9239 classProp->dataType = ProcessTypeString(classProp->dataTypeString, 0);
9240 if(classProp->constant)
9241 {
9242 FreeExpContents(exp);
9243 exp->isConstant = 1;
9244 if(classProp->dataType->kind == 13 && classProp->dataType->__anon1.type->kind == 1)
9245 {
9246 exp->type = 3;
9247 exp->__anon1.__anon1.constant = QMkString((char *)(uintptr_t)classProp->Get(_class));
9248 }
9249 else
9250 {
9251 char constant[256];
9252
9253 exp->type = 2;
9254 sprintf(constant, "%d", (int)classProp->Get(_class));
9255 exp->__anon1.__anon1.constant = __ecereNameSpace__ecere__sys__CopyString(constant);
9256 }
9257 }
9258 else
9259 {
9260 }
9261 exp->expType = classProp->dataType;
9262 if(classProp->dataType)
9263 classProp->dataType->refCount++;
9264 return 1;
9265 }
9266 return 0;
9267 }
9268
9269 void DeclareProperty(struct External * neededBy, struct __ecereNameSpace__ecere__com__Property * prop, char * setName, char * getName)
9270 {
9271 struct Symbol * symbol = prop->symbol;
9272 unsigned int imported = 0;
9273 unsigned int dllImport = 0;
9274 struct External * structExternal = (((void *)0));
9275 struct External * instExternal = (((void *)0));
9276
9277 strcpy(setName, "__ecereProp_");
9278 FullClassNameCat(setName, prop->_class->fullName, 0);
9279 strcat(setName, "_Set_");
9280 FullClassNameCat(setName, prop->name, 1);
9281 strcpy(getName, "__ecereProp_");
9282 FullClassNameCat(getName, prop->_class->fullName, 0);
9283 strcat(getName, "_Get_");
9284 FullClassNameCat(getName, prop->name, 1);
9285 if(!symbol || symbol->_import)
9286 {
9287 if(!symbol)
9288 {
9289 struct Symbol * classSym;
9290
9291 if(!prop->_class->symbol)
9292 prop->_class->symbol = FindClass(prop->_class->fullName);
9293 classSym = prop->_class->symbol;
9294 if(classSym && !classSym->_import)
9295 {
9296 struct ModuleImport * module;
9297
9298 if(prop->_class->module)
9299 module = FindModule(prop->_class->module);
9300 else
9301 module = mainModule;
9302 classSym->_import = __extension__ ({
9303 struct ClassImport * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_ClassImport);
9304
9305 __ecereInstance1->name = __ecereNameSpace__ecere__sys__CopyString(prop->_class->fullName), __ecereInstance1->isRemote = prop->_class->isRemote, __ecereInstance1;
9306 });
9307 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(&module->classes, classSym->_import);
9308 }
9309 symbol = prop->symbol = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Symbol);
9310 symbol->_import = (struct ClassImport *)__extension__ ({
9311 struct PropertyImport * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_PropertyImport);
9312
9313 __ecereInstance1->name = __ecereNameSpace__ecere__sys__CopyString(prop->name), __ecereInstance1->isVirtual = 0, __ecereInstance1->hasSet = prop->Set ? 1 : 0, __ecereInstance1->hasGet = prop->Get ? 1 : 0, __ecereInstance1;
9314 });
9315 if(classSym)
9316 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(&classSym->_import->properties, symbol->_import);
9317 }
9318 imported = 1;
9319 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)
9320 dllImport = 1;
9321 }
9322 if(!symbol->type)
9323 {
9324 struct Context * context = SetupTemplatesContext(prop->_class);
9325
9326 symbol->type = ProcessTypeString(prop->dataTypeString, 0);
9327 FinishTemplatesContext(context);
9328 }
9329 if((prop->Get && !symbol->__anon2.__anon2.externalGet) || (prop->Set && !symbol->__anon2.__anon2.externalSet))
9330 {
9331 if(prop->_class->type == 0 && prop->_class->structSize)
9332 instExternal = DeclareStruct((((void *)0)), "ecere::com::Instance", 0, 1);
9333 structExternal = DeclareStruct((((void *)0)), prop->_class->fullName, prop->_class->type != 1, 0);
9334 }
9335 if(prop->Get && !symbol->__anon2.__anon2.externalGet)
9336 {
9337 struct Declaration * decl;
9338 struct __ecereNameSpace__ecere__sys__OldList * specifiers, * declarators;
9339 struct Declarator * d;
9340 struct __ecereNameSpace__ecere__sys__OldList * params;
9341 struct Specifier * spec = (((void *)0));
9342 struct External * external;
9343 struct Declarator * typeDecl;
9344 unsigned int simple = 0;
9345 unsigned int needReference;
9346
9347 specifiers = MkList();
9348 declarators = MkList();
9349 params = MkList();
9350 ListAdd(params, MkTypeName(MkListOne(MkSpecifierName(prop->_class->fullName)), MkDeclaratorIdentifier(MkIdentifier("this"))));
9351 d = MkDeclaratorIdentifier(MkIdentifier(getName));
9352 if(dllImport)
9353 d = MkDeclaratorBrackets(MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), d));
9354 {
9355 struct Context * context = SetupTemplatesContext(prop->_class);
9356
9357 typeDecl = SpecDeclFromString(prop->dataTypeString, specifiers, (((void *)0)));
9358 FinishTemplatesContext(context);
9359 }
9360 needReference = !typeDecl || typeDecl->type == 1;
9361 for(spec = (*specifiers).first; spec; spec = spec->next)
9362 {
9363 if(spec->type == 1)
9364 {
9365 struct Symbol * classSym = spec->__anon1.__anon1.symbol;
9366
9367 if(needReference)
9368 {
9369 symbol->_class = classSym->__anon1.registered;
9370 if(classSym->__anon1.registered && classSym->__anon1.registered->type == 1)
9371 simple = 1;
9372 }
9373 break;
9374 }
9375 }
9376 if(!simple)
9377 d = PlugDeclarator(typeDecl, d);
9378 else
9379 {
9380 ListAdd(params, MkTypeName(specifiers, PlugDeclarator(typeDecl, MkDeclaratorIdentifier(MkIdentifier("value")))));
9381 specifiers = MkList();
9382 }
9383 d = MkDeclaratorFunction(d, params);
9384 if(dllImport)
9385 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*specifiers), (((void *)0)), MkSpecifier(EXTERN));
9386 else if(prop->_class->symbol && ((struct Symbol *)prop->_class->symbol)->isStatic)
9387 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*specifiers), (((void *)0)), MkSpecifier(STATIC));
9388 if(simple)
9389 ListAdd(specifiers, MkSpecifier(VOID));
9390 ListAdd(declarators, MkInitDeclarator(d, (((void *)0))));
9391 decl = MkDeclaration(specifiers, declarators);
9392 external = MkExternalDeclaration(decl);
9393 if(structExternal)
9394 __ecereMethod_External_CreateEdge(external, structExternal, 0);
9395 if(instExternal)
9396 __ecereMethod_External_CreateEdge(external, instExternal, 0);
9397 if(spec)
9398 DeclareStruct(external, spec->__anon1.__anon1.name, 0, needReference);
9399 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add((&*ast), external);
9400 external->symbol = symbol;
9401 symbol->__anon2.__anon2.externalGet = external;
9402 ReplaceThisClassSpecifiers(specifiers, prop->_class);
9403 if(typeDecl)
9404 FreeDeclarator(typeDecl);
9405 }
9406 if(prop->Set && !symbol->__anon2.__anon2.externalSet)
9407 {
9408 struct Declaration * decl;
9409 struct __ecereNameSpace__ecere__sys__OldList * specifiers, * declarators;
9410 struct Declarator * d;
9411 struct __ecereNameSpace__ecere__sys__OldList * params;
9412 struct Specifier * spec = (((void *)0));
9413 struct External * external;
9414 struct Declarator * typeDecl;
9415 unsigned int needReference;
9416
9417 declarators = MkList();
9418 params = MkList();
9419 if(!prop->conversion || prop->_class->type == 1)
9420 {
9421 ListAdd(params, MkTypeName(MkListOne(MkSpecifierName(prop->_class->fullName)), MkDeclaratorIdentifier(MkIdentifier("this"))));
9422 }
9423 specifiers = MkList();
9424 {
9425 struct Context * context = SetupTemplatesContext(prop->_class);
9426
9427 typeDecl = d = SpecDeclFromString(prop->dataTypeString, specifiers, MkDeclaratorIdentifier(MkIdentifier("value")));
9428 FinishTemplatesContext(context);
9429 }
9430 if(!strcmp(prop->_class->base->fullName, "eda::Row") || !strcmp(prop->_class->base->fullName, "eda::Id"))
9431 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*specifiers), (((void *)0)), MkSpecifier(CONST));
9432 ListAdd(params, MkTypeName(specifiers, d));
9433 d = MkDeclaratorIdentifier(MkIdentifier(setName));
9434 if(dllImport)
9435 d = MkDeclaratorBrackets(MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), d));
9436 d = MkDeclaratorFunction(d, params);
9437 needReference = !typeDecl || typeDecl->type == 1;
9438 for(spec = (*specifiers).first; spec; spec = spec->next)
9439 {
9440 if(spec->type == 1)
9441 {
9442 struct Symbol * classSym = spec->__anon1.__anon1.symbol;
9443
9444 if(needReference)
9445 symbol->_class = classSym->__anon1.registered;
9446 break;
9447 }
9448 }
9449 ListAdd(declarators, MkInitDeclarator(d, (((void *)0))));
9450 specifiers = MkList();
9451 if(dllImport)
9452 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*specifiers), (((void *)0)), MkSpecifier(EXTERN));
9453 else if(prop->_class->symbol && ((struct Symbol *)prop->_class->symbol)->isStatic)
9454 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*specifiers), (((void *)0)), MkSpecifier(STATIC));
9455 if(!prop->conversion || prop->_class->type == 1)
9456 ListAdd(specifiers, MkSpecifier(VOID));
9457 else
9458 ListAdd(specifiers, MkSpecifierName(prop->_class->fullName));
9459 decl = MkDeclaration(specifiers, declarators);
9460 external = MkExternalDeclaration(decl);
9461 if(structExternal)
9462 __ecereMethod_External_CreateEdge(external, structExternal, 0);
9463 if(instExternal)
9464 __ecereMethod_External_CreateEdge(external, instExternal, 0);
9465 if(spec)
9466 DeclareStruct(external, spec->__anon1.__anon1.name, 0, needReference);
9467 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add((&*ast), external);
9468 external->symbol = symbol;
9469 symbol->__anon2.__anon2.externalSet = external;
9470 ReplaceThisClassSpecifiers(specifiers, prop->_class);
9471 }
9472 if(!symbol->__anon2.__anon2.externalPtr)
9473 {
9474 struct Declaration * decl;
9475 struct External * external;
9476 struct __ecereNameSpace__ecere__sys__OldList * specifiers = MkList();
9477 char propName[1024];
9478
9479 if(imported)
9480 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*specifiers), (((void *)0)), MkSpecifier(EXTERN));
9481 else
9482 {
9483 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*specifiers), (((void *)0)), MkSpecifier(STATIC));
9484 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add((&*specifiers), MkSpecifierExtended(MkExtDeclAttrib(MkAttrib(ATTRIB, MkListOne(MkAttribute(__ecereNameSpace__ecere__sys__CopyString("unused"), (((void *)0))))))));
9485 }
9486 ListAdd(specifiers, MkSpecifierName("Property"));
9487 strcpy(propName, "__ecereProp_");
9488 FullClassNameCat(propName, prop->_class->fullName, 0);
9489 strcat(propName, "_");
9490 FullClassNameCat(propName, prop->name, 1);
9491 {
9492 struct __ecereNameSpace__ecere__sys__OldList * list = MkList();
9493
9494 ListAdd(list, MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier(propName)), (((void *)0))));
9495 if(!imported)
9496 {
9497 strcpy(propName, "__ecerePropM_");
9498 FullClassNameCat(propName, prop->_class->fullName, 0);
9499 strcat(propName, "_");
9500 FullClassNameCat(propName, prop->name, 1);
9501 ListAdd(list, MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier(propName)), (((void *)0))));
9502 }
9503 decl = MkDeclaration(specifiers, list);
9504 }
9505 external = MkExternalDeclaration(decl);
9506 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*ast), curExternal->prev, external);
9507 external->symbol = symbol;
9508 symbol->__anon2.__anon2.externalPtr = external;
9509 }
9510 if(inCompiler && neededBy)
9511 {
9512 if(symbol->__anon2.__anon2.externalPtr)
9513 __ecereMethod_External_CreateUniqueEdge(neededBy, symbol->__anon2.__anon2.externalPtr, 0);
9514 if(symbol->__anon2.__anon2.externalGet)
9515 __ecereMethod_External_CreateUniqueEdge(neededBy, symbol->__anon2.__anon2.externalGet, symbol->__anon2.__anon2.externalGet->type == 0);
9516 if(symbol->__anon2.__anon2.externalSet)
9517 __ecereMethod_External_CreateUniqueEdge(neededBy, symbol->__anon2.__anon2.externalSet, symbol->__anon2.__anon2.externalSet->type == 0);
9518 }
9519 }
9520
9521 static void ProcessDeclarator(struct Declarator *  decl, unsigned int isFunction);
9522
9523 void DeclareMethod(struct External * neededFor, struct __ecereNameSpace__ecere__com__Method * method, const char * name)
9524 {
9525 struct Symbol * symbol = method->symbol;
9526
9527 if(!symbol || (!symbol->__anon2.__anon1.pointerExternal && (!symbol->__anon2.__anon3.methodCodeExternal || method->type == 1)))
9528 {
9529 unsigned int dllImport = 0;
9530
9531 if(!method->dataType)
9532 method->dataType = ProcessTypeString(method->dataTypeString, 0);
9533 {
9534 if(!symbol || method->type == 1)
9535 {
9536 struct Symbol * classSym;
9537
9538 if(!method->_class->symbol)
9539 method->_class->symbol = FindClass(method->_class->fullName);
9540 classSym = method->_class->symbol;
9541 if(!classSym->_import)
9542 {
9543 struct ModuleImport * module;
9544
9545 if(method->_class->module && ((struct __ecereNameSpace__ecere__com__Module *)(((char *)method->_class->module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->name)
9546 module = FindModule(method->_class->module);
9547 else
9548 module = mainModule;
9549 classSym->_import = __extension__ ({
9550 struct ClassImport * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_ClassImport);
9551
9552 __ecereInstance1->name = __ecereNameSpace__ecere__sys__CopyString(method->_class->fullName), __ecereInstance1->isRemote = method->_class->isRemote, __ecereInstance1;
9553 });
9554 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(&module->classes, classSym->_import);
9555 }
9556 if(!symbol)
9557 {
9558 symbol = method->symbol = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Symbol);
9559 }
9560 if(!symbol->_import)
9561 {
9562 symbol->_import = (struct ClassImport *)__extension__ ({
9563 struct MethodImport * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_MethodImport);
9564
9565 __ecereInstance1->name = __ecereNameSpace__ecere__sys__CopyString(method->name), __ecereInstance1->isVirtual = method->type == 1, __ecereInstance1;
9566 });
9567 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(&classSym->_import->methods, symbol->_import);
9568 }
9569 if(!symbol)
9570 {
9571 symbol->type = method->dataType;
9572 if(symbol->type)
9573 symbol->type->refCount++;
9574 }
9575 }
9576 if(!method->dataType->dllExport)
9577 {
9578 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)
9579 dllImport = 1;
9580 }
9581 }
9582 if(inCompiler)
9583 {
9584 struct Declaration * decl;
9585 struct __ecereNameSpace__ecere__sys__OldList * specifiers, * declarators;
9586 struct Declarator * d;
9587 struct Declarator * funcDecl;
9588 struct External * external;
9589
9590 specifiers = MkList();
9591 declarators = MkList();
9592 if(dllImport)
9593 ListAdd(specifiers, MkSpecifier(EXTERN));
9594 else if(method->_class->symbol && ((struct Symbol *)method->_class->symbol)->isStatic)
9595 ListAdd(specifiers, MkSpecifier(STATIC));
9596 if(method->type == 1)
9597 {
9598 ListAdd(specifiers, MkSpecifier(INT));
9599 d = MkDeclaratorIdentifier(MkIdentifier(name));
9600 }
9601 else
9602 {
9603 d = MkDeclaratorIdentifier(MkIdentifier(name));
9604 if(dllImport)
9605 d = MkDeclaratorBrackets(MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), d));
9606 {
9607 struct Context * context = SetupTemplatesContext(method->_class);
9608
9609 d = SpecDeclFromString(method->dataTypeString, specifiers, d);
9610 FinishTemplatesContext(context);
9611 }
9612 funcDecl = GetFuncDecl(d);
9613 if(dllImport)
9614 {
9615 struct Specifier * spec, * next;
9616
9617 for(spec = (*specifiers).first; spec; spec = next)
9618 {
9619 next = spec->next;
9620 if(spec->type == 5)
9621 {
9622 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove((&*specifiers), spec);
9623 FreeSpecifier(spec);
9624 }
9625 }
9626 }
9627 if(method->dataType && !method->dataType->__anon1.__anon2.staticMethod)
9628 {
9629 if(funcDecl && funcDecl->__anon1.function.parameters && (*funcDecl->__anon1.function.parameters).count)
9630 {
9631 struct __ecereNameSpace__ecere__com__Class * _class = method->dataType->__anon1.__anon2.thisClass ? method->dataType->__anon1.__anon2.thisClass->__anon1.registered : method->_class;
9632 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")));
9633 struct TypeName * firstParam = ((struct TypeName *)(*funcDecl->__anon1.function.parameters).first);
9634 struct Specifier * firstSpec = firstParam->qualifiers ? (*firstParam->qualifiers).first : (((void *)0));
9635
9636 if(firstSpec && firstSpec->type == 0 && firstSpec->__anon1.specifier == VOID && !firstParam->declarator)
9637 {
9638 struct TypeName * param = (*funcDecl->__anon1.function.parameters).first;
9639
9640 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove((&*funcDecl->__anon1.function.parameters), param);
9641 FreeTypeName(param);
9642 }
9643 if(!funcDecl->__anon1.function.parameters)
9644 funcDecl->__anon1.function.parameters = MkList();
9645 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*funcDecl->__anon1.function.parameters), (((void *)0)), thisParam);
9646 }
9647 }
9648 }
9649 ProcessDeclarator(d, 1);
9650 ListAdd(declarators, MkInitDeclarator(d, (((void *)0))));
9651 decl = MkDeclaration(specifiers, declarators);
9652 ReplaceThisClassSpecifiers(specifiers, method->_class);
9653 external = MkExternalDeclaration(decl);
9654 external->symbol = symbol;
9655 symbol->__anon2.__anon1.pointerExternal = external;
9656 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add((&*ast), external);
9657 DeclareStruct(external, method->_class->fullName, 1, 1);
9658 if(method->dataType)
9659 DeclareType(external, method->dataType, 1, 1);
9660 }
9661 }
9662 if(inCompiler && neededFor)
9663 {
9664 struct External * external = symbol->__anon2.__anon1.pointerExternal ? symbol->__anon2.__anon1.pointerExternal : symbol->__anon2.__anon3.methodCodeExternal;
9665
9666 __ecereMethod_External_CreateUniqueEdge(neededFor, external, external->type == 0);
9667 }
9668 }
9669
9670 struct __ecereNameSpace__ecere__com__GlobalFunction;
9671
9672 struct __ecereNameSpace__ecere__com__GlobalFunction
9673 {
9674 struct __ecereNameSpace__ecere__com__GlobalFunction * prev;
9675 struct __ecereNameSpace__ecere__com__GlobalFunction * next;
9676 const char *  name;
9677 int (*  function)();
9678 struct __ecereNameSpace__ecere__com__Instance * module;
9679 struct __ecereNameSpace__ecere__com__NameSpace *  nameSpace;
9680 const char *  dataTypeString;
9681 struct Type * dataType;
9682 void *  symbol;
9683 } ecere_gcc_struct;
9684
9685 extern struct __ecereNameSpace__ecere__com__GlobalFunction * __ecereNameSpace__ecere__com__eSystem_FindFunction(struct __ecereNameSpace__ecere__com__Instance * module, const char *  name);
9686
9687 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);
9688
9689 unsigned int DeclareFunction(struct External * neededFor, struct __ecereNameSpace__ecere__com__GlobalFunction * function, char * name)
9690 {
9691 struct Symbol * symbol = function->symbol;
9692
9693 if(!symbol || !symbol->__anon2.__anon1.pointerExternal)
9694 {
9695 unsigned int imported = 0;
9696 unsigned int dllImport = 0;
9697
9698 if(!function->dataType)
9699 {
9700 function->dataType = ProcessTypeString(function->dataTypeString, 0);
9701 if(!function->dataType->__anon1.__anon2.thisClass)
9702 function->dataType->__anon1.__anon2.staticMethod = 1;
9703 }
9704 if(inCompiler)
9705 {
9706 if(!symbol)
9707 {
9708 struct ModuleImport * module = FindModule(function->module);
9709
9710 symbol = function->symbol = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Symbol);
9711 if(module->name)
9712 {
9713 if(!function->dataType->dllExport)
9714 {
9715 symbol->_import = (struct ClassImport *)__extension__ ({
9716 struct FunctionImport * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_FunctionImport);
9717
9718 __ecereInstance1->name = __ecereNameSpace__ecere__sys__CopyString(function->name), __ecereInstance1;
9719 });
9720 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(&module->functions, symbol->_import);
9721 }
9722 }
9723 {
9724 symbol->type = ProcessTypeString(function->dataTypeString, 0);
9725 if(!symbol->type->__anon1.__anon2.thisClass)
9726 symbol->type->__anon1.__anon2.staticMethod = 1;
9727 }
9728 }
9729 imported = symbol->_import ? 1 : 0;
9730 if(imported && function->module != privateModule && ((struct __ecereNameSpace__ecere__com__Module *)(((char *)function->module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->importType != 1)
9731 dllImport = 1;
9732 }
9733 if(inCompiler)
9734 {
9735 {
9736 struct Declaration * decl;
9737 struct __ecereNameSpace__ecere__sys__OldList * specifiers, * declarators;
9738 struct Declarator * d;
9739 struct Declarator * funcDecl;
9740 struct External * external;
9741
9742 specifiers = MkList();
9743 declarators = MkList();
9744 ListAdd(specifiers, MkSpecifier(EXTERN));
9745 d = MkDeclaratorIdentifier(MkIdentifier(imported ? name : function->name));
9746 if(dllImport)
9747 d = MkDeclaratorBrackets(MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), d));
9748 d = SpecDeclFromString(function->dataTypeString, specifiers, d);
9749 if(((struct __ecereNameSpace__ecere__com__Module *)(((char *)function->module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->importType == 1)
9750 {
9751 struct Specifier * spec;
9752
9753 for(spec = (*specifiers).first; spec; spec = spec->next)
9754 if(spec->type == 5 && spec->__anon1.__anon1.extDecl && spec->__anon1.__anon1.extDecl->type == 0 && !strcmp(spec->__anon1.__anon1.extDecl->__anon1.s, "dllexport"))
9755 {
9756 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove((&*specifiers), spec);
9757 FreeSpecifier(spec);
9758 break;
9759 }
9760 }
9761 funcDecl = GetFuncDecl(d);
9762 if(funcDecl && !funcDecl->__anon1.function.parameters)
9763 {
9764 funcDecl->__anon1.function.parameters = MkList();
9765 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*funcDecl->__anon1.function.parameters), (((void *)0)), MkTypeName(MkListOne(MkSpecifier(VOID)), (((void *)0))));
9766 }
9767 ListAdd(declarators, MkInitDeclarator(d, (((void *)0))));
9768 {
9769 struct Context * oldCtx = curContext;
9770
9771 curContext = globalContext;
9772 decl = MkDeclaration(specifiers, declarators);
9773 curContext = oldCtx;
9774 }
9775 external = MkExternalDeclaration(decl);
9776 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add((&*ast), external);
9777 external->symbol = symbol;
9778 symbol->__anon2.__anon1.pointerExternal = external;
9779 DeclareType(external, function->dataType, 1, 1);
9780 }
9781 }
9782 }
9783 if(inCompiler && neededFor && symbol && symbol->__anon2.__anon1.pointerExternal)
9784 __ecereMethod_External_CreateUniqueEdge(neededFor, symbol->__anon2.__anon1.pointerExternal, symbol->__anon2.__anon1.pointerExternal->type == 0);
9785 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;
9786 }
9787
9788 void DeclareFunctionUtil(struct External * neededBy, const char * s)
9789 {
9790 struct __ecereNameSpace__ecere__com__GlobalFunction * function = __ecereNameSpace__ecere__com__eSystem_FindFunction(privateModule, s);
9791
9792 if(function)
9793 {
9794 char name[1024];
9795
9796 name[0] = 0;
9797 if(((struct __ecereNameSpace__ecere__com__Module *)(((char *)function->module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->importType != 1 && (!function->dataType || !function->dataType->dllExport))
9798 strcpy(name, "__ecereFunction_");
9799 FullClassNameCat(name, s, 0);
9800 DeclareFunction(neededBy, function, name);
9801 }
9802 else if(neededBy)
9803 FindSymbol(s, globalContext, globalContext, 0, 0);
9804 }
9805
9806 static void CreateFireWatcher(struct __ecereNameSpace__ecere__com__Property * prop, struct Expression * object, struct Statement * stmt)
9807 {
9808 char propName[1024], propNameM[1024];
9809 char getName[1024], setName[1024];
9810 struct __ecereNameSpace__ecere__sys__OldList * args;
9811
9812 DeclareProperty(curExternal, prop, setName, getName);
9813 strcpy(propName, "__ecereProp_");
9814 FullClassNameCat(propName, prop->_class->fullName, 0);
9815 strcat(propName, "_");
9816 FullClassNameCat(propName, prop->name, 1);
9817 strcpy(propNameM, "__ecerePropM_");
9818 FullClassNameCat(propNameM, prop->_class->fullName, 0);
9819 strcat(propNameM, "_");
9820 FullClassNameCat(propNameM, prop->name, 1);
9821 if(prop->isWatchable)
9822 {
9823 args = MkList();
9824 ListAdd(args, object ? CopyExpression(object) : MkExpIdentifier(MkIdentifier("this")));
9825 ListAdd(args, MkExpIdentifier(MkIdentifier(propName)));
9826 ListAdd(stmt->__anon1.expressions, MkExpCall(MkExpIdentifier(MkIdentifier("ecere::com::eInstance_FireWatchers")), args));
9827 args = MkList();
9828 ListAdd(args, object ? CopyExpression(object) : MkExpIdentifier(MkIdentifier("this")));
9829 ListAdd(args, MkExpIdentifier(MkIdentifier(propNameM)));
9830 ListAdd(stmt->__anon1.expressions, MkExpCall(MkExpIdentifier(MkIdentifier("ecere::com::eInstance_FireWatchers")), args));
9831 DeclareFunctionUtil(curExternal, "eInstance_FireWatchers");
9832 }
9833 {
9834 args = MkList();
9835 ListAdd(args, object ? CopyExpression(object) : MkExpIdentifier(MkIdentifier("this")));
9836 ListAdd(args, MkExpIdentifier(MkIdentifier(propName)));
9837 ListAdd(stmt->__anon1.expressions, MkExpCall(MkExpIdentifier(MkIdentifier("ecere::com::eInstance_FireSelfWatchers")), args));
9838 args = MkList();
9839 ListAdd(args, object ? CopyExpression(object) : MkExpIdentifier(MkIdentifier("this")));
9840 ListAdd(args, MkExpIdentifier(MkIdentifier(propNameM)));
9841 ListAdd(stmt->__anon1.expressions, MkExpCall(MkExpIdentifier(MkIdentifier("ecere::com::eInstance_FireSelfWatchers")), args));
9842 DeclareFunctionUtil(curExternal, "eInstance_FireSelfWatchers");
9843 }
9844 if(curFunction->propSet && !strcmp(curFunction->propSet->string, prop->name) && (!object || (object->type == 0 && !strcmp(object->__anon1.__anon1.identifier->string, "this"))))
9845 curFunction->propSet->fireWatchersDone = 1;
9846 }
9847
9848 struct __ecereNameSpace__ecere__com__SubModule;
9849
9850 struct __ecereNameSpace__ecere__com__SubModule
9851 {
9852 struct __ecereNameSpace__ecere__com__SubModule * prev;
9853 struct __ecereNameSpace__ecere__com__SubModule * next;
9854 struct __ecereNameSpace__ecere__com__Instance * module;
9855 int importMode;
9856 } ecere_gcc_struct;
9857
9858 unsigned int ModuleVisibility(struct __ecereNameSpace__ecere__com__Instance * searchIn, struct __ecereNameSpace__ecere__com__Instance * searchFor)
9859 {
9860 struct __ecereNameSpace__ecere__com__SubModule * subModule;
9861
9862 if(searchFor == searchIn)
9863 return 1;
9864 for(subModule = ((struct __ecereNameSpace__ecere__com__Module *)(((char *)searchIn + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->modules.first; subModule; subModule = subModule->next)
9865 {
9866 if(subModule->importMode == 1 || searchIn == ((struct __ecereNameSpace__ecere__com__Module *)(((char *)searchIn + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application)
9867 {
9868 if(ModuleVisibility(subModule->module, searchFor))
9869 return 1;
9870 }
9871 }
9872 return 0;
9873 }
9874
9875 void ProcessExpressionType(struct Expression *  exp);
9876
9877 static void ReplaceClassMembers(struct Expression * exp, struct __ecereNameSpace__ecere__com__Class * _class)
9878 {
9879 if(exp->type == 0 && exp->__anon1.__anon1.identifier)
9880 {
9881 struct Identifier * id = exp->__anon1.__anon1.identifier;
9882 struct Context * ctx;
9883 struct Symbol * symbol = (((void *)0));
9884
9885 if(!id->_class || !id->_class->__anon1.__anon1.name || strcmp(id->_class->__anon1.__anon1.name, "property"))
9886 {
9887 for(ctx = curContext; ctx != topContext->parent && !symbol; ctx = ctx->parent)
9888 {
9889 symbol = (struct Symbol *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindString(&ctx->symbols, id->string);
9890 if(symbol)
9891 break;
9892 }
9893 }
9894 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))))
9895 {
9896 struct __ecereNameSpace__ecere__com__Property * prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, id->string, privateModule);
9897 struct __ecereNameSpace__ecere__com__Method * method = (((void *)0));
9898 struct __ecereNameSpace__ecere__com__DataMember * member = (((void *)0));
9899 struct __ecereNameSpace__ecere__com__ClassProperty * classProp = (((void *)0));
9900
9901 if(!prop)
9902 {
9903 method = __ecereNameSpace__ecere__com__eClass_FindMethod(_class, id->string, privateModule);
9904 }
9905 if(!prop && !method)
9906 member = __ecereNameSpace__ecere__com__eClass_FindDataMember(_class, id->string, privateModule, (((void *)0)), (((void *)0)));
9907 if(!prop && !method && !member)
9908 {
9909 classProp = __ecereNameSpace__ecere__com__eClass_FindClassProperty(_class, id->string);
9910 }
9911 if(prop || method || member || classProp)
9912 {
9913 exp->type = 8;
9914 exp->__anon1.member.member = id;
9915 exp->__anon1.member.memberType = 0;
9916 exp->__anon1.member.exp = QMkExpId("this");
9917 exp->addedThis = 1;
9918 }
9919 else if(_class && _class->templateParams.first)
9920 {
9921 struct __ecereNameSpace__ecere__com__Class * sClass;
9922
9923 for(sClass = _class; sClass; sClass = sClass->base)
9924 {
9925 if(sClass->templateParams.first)
9926 {
9927 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * param;
9928
9929 for(param = sClass->templateParams.first; param; param = param->next)
9930 {
9931 if(param->type == 2 && !strcmp(param->name, id->string))
9932 {
9933 struct Expression * argExp = GetTemplateArgExpByName(param->name, _class, 2);
9934
9935 if(argExp)
9936 {
9937 struct Declarator * decl;
9938 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
9939
9940 FreeIdentifier(exp->__anon1.member.member);
9941 ProcessExpressionType(argExp);
9942 decl = SpecDeclFromString(param->__anon1.dataTypeString, specs, (((void *)0)));
9943 exp->expType = ProcessType(specs, decl);
9944 exp->type = 5;
9945 exp->__anon1.list = MkListOne(MkExpOp((((void *)0)), '*', MkExpCast(MkTypeName(specs, MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), decl)), MkExpOp((((void *)0)), '&', argExp))));
9946 }
9947 }
9948 }
9949 }
9950 }
9951 }
9952 }
9953 }
9954 }
9955
9956 static void PopulateInstanceProcessMember(struct Instantiation * inst, struct __ecereNameSpace__ecere__sys__OldList * memberList, struct __ecereNameSpace__ecere__com__DataMember * parentDataMember, unsigned int offset)
9957 {
9958 struct __ecereNameSpace__ecere__com__DataMember * dataMember;
9959
9960 for(dataMember = parentDataMember->members.first; dataMember; dataMember = dataMember->next)
9961 {
9962 if(!dataMember->name && (dataMember->type == 2 || dataMember->type == 1))
9963 PopulateInstanceProcessMember(inst, memberList, dataMember, offset + dataMember->offset);
9964 else
9965 {
9966 struct Expression * exp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression);
9967 struct MemberInit * member = MkMemberInit(MkListOne(MkIdentifier(dataMember->name)), MkInitializerAssignment(exp));
9968 struct Type * type;
9969 void * ptr = inst->data + dataMember->offset + offset;
9970 char * result = (((void *)0));
9971
9972 exp->loc = member->loc = inst->loc;
9973 ((struct Identifier *)(*member->identifiers).first)->loc = inst->loc;
9974 if(!dataMember->dataType)
9975 dataMember->dataType = ProcessTypeString(dataMember->dataTypeString, 0);
9976 type = dataMember->dataType;
9977 if(type->kind == 8)
9978 {
9979 struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class->__anon1.registered;
9980
9981 if(_class->type == 4)
9982 {
9983 struct __ecereNameSpace__ecere__com__Class * enumClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "enum");
9984
9985 if(enumClass)
9986 {
9987 struct __ecereNameSpace__ecere__com__EnumClassData * e = (_class ? ((void *)(((char *)_class->data) + enumClass->offsetClass)) : (((void *)0)));
9988 struct __ecereNameSpace__ecere__sys__NamedLink64 * item;
9989
9990 for(item = e->values.first; item; item = item->next)
9991 {
9992 if(item->data == GetEnumValue(_class, ptr))
9993 {
9994 result = item->name;
9995 break;
9996 }
9997 }
9998 if(result)
9999 {
10000 exp->__anon1.__anon1.identifier = MkIdentifier(result);
10001 exp->type = 0;
10002 exp->destType = MkClassType(_class->fullName);
10003 ProcessExpressionType(exp);
10004 }
10005 }
10006 }
10007 if(_class->type == 4 || _class->type == 3 || _class->type == 2)
10008 {
10009 if(!_class->dataType)
10010 _class->dataType = ProcessTypeString(_class->dataTypeString, 0);
10011 type = _class->dataType;
10012 }
10013 }
10014 if(!result)
10015 {
10016 switch(type->kind)
10017 {
10018 case 6:
10019 {
10020 FreeExpContents(exp);
10021 exp->__anon1.__anon1.constant = PrintFloat(*(float *)ptr);
10022 exp->type = 2;
10023 break;
10024 }
10025 case 7:
10026 {
10027 FreeExpContents(exp);
10028 exp->__anon1.__anon1.constant = PrintDouble(*(double *)ptr);
10029 exp->type = 2;
10030 break;
10031 }
10032 case 3:
10033 {
10034 FreeExpContents(exp);
10035 exp->__anon1.__anon1.constant = PrintInt(*(int *)ptr);
10036 exp->type = 2;
10037 break;
10038 }
10039 case 4:
10040 {
10041 FreeExpContents(exp);
10042 exp->__anon1.__anon1.constant = PrintInt64(*(long long *)ptr);
10043 exp->type = 2;
10044 break;
10045 }
10046 case 22:
10047 {
10048 FreeExpContents(exp);
10049 exp->__anon1.__anon1.constant = PrintInt64((long long)*(intptr_t *)ptr);
10050 exp->type = 2;
10051 break;
10052 }
10053 case 23:
10054 {
10055 FreeExpContents(exp);
10056 exp->__anon1.__anon1.constant = PrintInt64((long long)*(ssize_t *)ptr);
10057 exp->type = 2;
10058 break;
10059 }
10060 default:
10061 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Unhandled type populating instance\n", (((void *)0))));
10062 }
10063 }
10064 ListAdd(memberList, member);
10065 }
10066 if(parentDataMember->type == 1)
10067 break;
10068 }
10069 }
10070
10071 void CheckTemplateTypes(struct Expression * exp)
10072 {
10073 struct Expression * nbExp = GetNonBracketsExp(exp);
10074
10075 if(exp->destType && exp->destType->passAsTemplate && exp->expType && exp->expType->kind != 20 && !exp->expType->passAsTemplate && (nbExp == exp || nbExp->type != 11))
10076 {
10077 struct Expression * newExp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression);
10078 struct Context * context;
10079 int kind = exp->expType->kind;
10080
10081 *newExp = *exp;
10082 if(exp->destType)
10083 exp->destType->refCount++;
10084 if(exp->expType)
10085 exp->expType->refCount++;
10086 newExp->prev = (((void *)0));
10087 newExp->next = (((void *)0));
10088 if(exp->expType->kind == 8 && exp->expType->__anon1._class && exp->expType->__anon1._class->__anon1.registered)
10089 {
10090 struct __ecereNameSpace__ecere__com__Class * c = exp->expType->__anon1._class->__anon1.registered;
10091
10092 if(c->type == 2 || c->type == 4 || c->type == 3)
10093 {
10094 if(!c->dataType)
10095 c->dataType = ProcessTypeString(c->dataTypeString, 0);
10096 kind = c->dataType->kind;
10097 }
10098 }
10099 switch(kind)
10100 {
10101 case 7:
10102 if(exp->destType->classObjectType)
10103 {
10104 if(exp->destType)
10105 exp->destType->refCount--;
10106 if(exp->expType)
10107 exp->expType->refCount--;
10108 ((newExp ? __extension__ ({
10109 void * __ecerePtrToDelete = (newExp);
10110
10111 __ecereClass_Expression->Destructor ? __ecereClass_Expression->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete);
10112 }) : 0), newExp = 0);
10113 }
10114 else
10115 {
10116 struct __ecereNameSpace__ecere__sys__OldList * specs;
10117 struct __ecereNameSpace__ecere__sys__OldList * unionDefs = MkList();
10118 struct __ecereNameSpace__ecere__sys__OldList * statements = MkList();
10119
10120 context = PushContext();
10121 ListAdd(unionDefs, MkClassDefDeclaration(MkStructDeclaration(MkListOne(MkSpecifier(DOUBLE)), MkListOne(MkDeclaratorIdentifier(MkIdentifier("d"))), (((void *)0)))));
10122 ListAdd(unionDefs, MkClassDefDeclaration(MkStructDeclaration(MkListOne(MkSpecifierName("uint64")), MkListOne(MkDeclaratorIdentifier(MkIdentifier("i"))), (((void *)0)))));
10123 specs = MkListOne(MkStructOrUnion(4, (((void *)0)), unionDefs));
10124 exp->type = 23;
10125 exp->__anon1.compound = MkCompoundStmt(MkListOne(MkDeclaration(specs, MkListOne(MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier("__internal_union")), (((void *)0)))))), statements);
10126 ListAdd(statements, MkExpressionStmt(MkListOne(MkExpOp(MkExpMember(MkExpIdentifier(MkIdentifier("__internal_union")), MkIdentifier("d")), '=', newExp))));
10127 ListAdd(statements, MkExpressionStmt(MkListOne(MkExpMember(MkExpIdentifier(MkIdentifier("__internal_union")), MkIdentifier("i")))));
10128 exp->__anon1.compound->__anon1.compound.context = context;
10129 PopContext(context);
10130 }
10131 break;
10132 default:
10133 exp->type = 11;
10134 exp->__anon1.cast.typeName = MkTypeName(MkListOne(MkSpecifierName("uint64")), (((void *)0)));
10135 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))
10136 exp->__anon1.cast.exp = MkExpCast(MkTypeName(MkListOne(MkSpecifierName("uintptr")), (((void *)0))), MkExpBrackets(MkListOne(newExp)));
10137 else
10138 exp->__anon1.cast.exp = MkExpBrackets(MkListOne(newExp));
10139 exp->needCast = 1;
10140 break;
10141 }
10142 }
10143 else if(exp->expType && exp->expType->passAsTemplate && exp->destType && ((unsigned int)((exp->usage & 0x1) >> 0)) && exp->destType->kind != 20 && !exp->destType->passAsTemplate)
10144 {
10145 struct Expression * newExp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression);
10146 struct Context * context;
10147 int kind = exp->expType->kind;
10148
10149 *newExp = *exp;
10150 if(exp->destType)
10151 exp->destType->refCount++;
10152 if(exp->expType)
10153 exp->expType->refCount++;
10154 newExp->prev = (((void *)0));
10155 newExp->next = (((void *)0));
10156 if(exp->expType->kind == 8 && exp->expType->__anon1._class && exp->expType->__anon1._class->__anon1.registered)
10157 {
10158 struct __ecereNameSpace__ecere__com__Class * c = exp->expType->__anon1._class->__anon1.registered;
10159
10160 if(c->type == 2 || c->type == 4 || c->type == 3)
10161 {
10162 if(!c->dataType)
10163 c->dataType = ProcessTypeString(c->dataTypeString, 0);
10164 kind = c->dataType->kind;
10165 }
10166 }
10167 switch(kind)
10168 {
10169 case 7:
10170 if(exp->destType->classObjectType)
10171 {
10172 if(exp->destType)
10173 exp->destType->refCount--;
10174 if(exp->expType)
10175 exp->expType->refCount--;
10176 ((newExp ? __extension__ ({
10177 void * __ecerePtrToDelete = (newExp);
10178
10179 __ecereClass_Expression->Destructor ? __ecereClass_Expression->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete);
10180 }) : 0), newExp = 0);
10181 }
10182 else
10183 {
10184 struct __ecereNameSpace__ecere__sys__OldList * specs;
10185 struct __ecereNameSpace__ecere__sys__OldList * unionDefs = MkList();
10186 struct __ecereNameSpace__ecere__sys__OldList * statements = MkList();
10187
10188 context = PushContext();
10189 ListAdd(unionDefs, MkClassDefDeclaration(MkStructDeclaration(MkListOne(MkSpecifier(DOUBLE)), MkListOne(MkDeclaratorIdentifier(MkIdentifier("d"))), (((void *)0)))));
10190 ListAdd(unionDefs, MkClassDefDeclaration(MkStructDeclaration(MkListOne(MkSpecifierName("uint64")), MkListOne(MkDeclaratorIdentifier(MkIdentifier("i"))), (((void *)0)))));
10191 specs = MkListOne(MkStructOrUnion(4, (((void *)0)), unionDefs));
10192 exp->type = 23;
10193 exp->__anon1.compound = MkCompoundStmt(MkListOne(MkDeclaration(specs, MkListOne(MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier("__internal_union")), (((void *)0)))))), statements);
10194 ListAdd(statements, MkExpressionStmt(MkListOne(MkExpOp(MkExpMember(MkExpIdentifier(MkIdentifier("__internal_union")), MkIdentifier("i")), '=', newExp))));
10195 ListAdd(statements, MkExpressionStmt(MkListOne(MkExpMember(MkExpIdentifier(MkIdentifier("__internal_union")), MkIdentifier("d")))));
10196 exp->__anon1.compound->__anon1.compound.context = context;
10197 PopContext(context);
10198 }
10199 break;
10200 case 8:
10201 {
10202 if(exp->expType->__anon1._class && exp->expType->__anon1._class->__anon1.registered && exp->expType->__anon1._class->__anon1.registered->type == 1)
10203 {
10204 exp->type = 5;
10205 newExp = MkExpCast(MkTypeName(MkListOne(MkSpecifierName("uintptr")), (((void *)0))), newExp);
10206 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)));
10207 ProcessExpressionType((*exp->__anon1.list).first);
10208 break;
10209 }
10210 else
10211 {
10212 exp->type = 5;
10213 if(__ecereProp_Type_Get_isPointerType(exp->expType))
10214 {
10215 exp->needTemplateCast = 2;
10216 newExp->needCast = 1;
10217 newExp->needTemplateCast = 2;
10218 newExp = MkExpCast(MkTypeName(MkListOne(MkSpecifierName("uintptr")), (((void *)0))), newExp);
10219 }
10220 exp->__anon1.list = MkListOne(MkExpCast(MkTypeName(MkListOne(MkSpecifierName(exp->expType->__anon1._class->string)), (((void *)0))), newExp));
10221 exp->needTemplateCast = 2;
10222 newExp->needCast = 1;
10223 newExp->needTemplateCast = 2;
10224 ProcessExpressionType((*exp->__anon1.list).first);
10225 break;
10226 }
10227 }
10228 default:
10229 {
10230 if(exp->expType->kind == 20)
10231 {
10232 struct Type * type = ProcessTemplateParameterType(exp->expType->__anon1.templateParameter);
10233
10234 if(type)
10235 {
10236 FreeType(exp->destType);
10237 FreeType(exp->expType);
10238 ((newExp ? __extension__ ({
10239 void * __ecerePtrToDelete = (newExp);
10240
10241 __ecereClass_Expression->Destructor ? __ecereClass_Expression->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete);
10242 }) : 0), newExp = 0);
10243 break;
10244 }
10245 }
10246 {
10247 char typeString[1024];
10248 struct Declarator * decl;
10249 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
10250
10251 typeString[0] = '\0';
10252 PrintType(exp->expType, typeString, 0, 0);
10253 decl = SpecDeclFromString(typeString, specs, (((void *)0)));
10254 exp->type = 11;
10255 exp->__anon1.cast.typeName = MkTypeName(specs, decl);
10256 exp->__anon1.cast.exp = MkExpBrackets(MkListOne(newExp));
10257 exp->__anon1.cast.exp->needCast = 1;
10258 exp->needTemplateCast = 2;
10259 newExp->needTemplateCast = 2;
10260 }
10261 break;
10262 }
10263 }
10264 }
10265 }
10266
10267 static void ProcessInitializer(struct Initializer * init, struct Type * type)
10268 {
10269 switch(init->type)
10270 {
10271 case 0:
10272 if(!init->__anon1.exp || init->__anon1.exp->type != 1 || !init->__anon1.exp->__anon1.instance || init->__anon1.exp->__anon1.instance->_class || !type || type->kind == 8)
10273 {
10274 if(init->__anon1.exp && !init->__anon1.exp->destType)
10275 {
10276 FreeType(init->__anon1.exp->destType);
10277 init->__anon1.exp->destType = type;
10278 if(type)
10279 type->refCount++;
10280 }
10281 if(init->__anon1.exp)
10282 {
10283 ProcessExpressionType(init->__anon1.exp);
10284 init->isConstant = init->__anon1.exp->isConstant;
10285 }
10286 break;
10287 }
10288 else
10289 {
10290 struct Expression * exp = init->__anon1.exp;
10291 struct Instantiation * inst = exp->__anon1.instance;
10292 struct MembersInit * members;
10293
10294 init->type = 1;
10295 init->__anon1.list = MkList();
10296 if(inst->members)
10297 {
10298 for(members = (*inst->members).first; members; members = members->next)
10299 {
10300 if(members->type == 0)
10301 {
10302 struct MemberInit * member;
10303
10304 for(member = (*members->__anon1.dataMembers).first; member; member = member->next)
10305 {
10306 ListAdd(init->__anon1.list, member->initializer);
10307 member->initializer = (((void *)0));
10308 }
10309 }
10310 }
10311 }
10312 FreeExpression(exp);
10313 }
10314 case 1:
10315 {
10316 struct Initializer * i;
10317 struct Type * initializerType = (((void *)0));
10318 struct __ecereNameSpace__ecere__com__Class * curClass = (((void *)0));
10319 struct __ecereNameSpace__ecere__com__DataMember * curMember = (((void *)0));
10320 struct __ecereNameSpace__ecere__com__DataMember * subMemberStack[256];
10321 int subMemberStackPos = 0;
10322
10323 if(type && type->kind == 12)
10324 initializerType = Dereference(type);
10325 else if(type && (type->kind == 9 || type->kind == 10))
10326 initializerType = type->__anon1.__anon1.members.first;
10327 for(i = (*init->__anon1.list).first; i; i = i->next)
10328 {
10329 if(type && type->kind == 8 && type->__anon1._class && type->__anon1._class->__anon1.registered)
10330 {
10331 FindNextDataMember(type->__anon1._class->__anon1.registered, &curClass, &curMember, subMemberStack, &subMemberStackPos);
10332 if(curMember)
10333 {
10334 if(!curMember->dataType)
10335 curMember->dataType = ProcessTypeString(curMember->dataTypeString, 0);
10336 initializerType = curMember->dataType;
10337 }
10338 }
10339 ProcessInitializer(i, initializerType);
10340 if(initializerType && type && (type->kind == 9 || type->kind == 10))
10341 initializerType = initializerType->next;
10342 if(!i->isConstant)
10343 init->isConstant = 0;
10344 }
10345 if(type && type->kind == 12)
10346 FreeType(initializerType);
10347 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))
10348 {
10349 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Assigning list initializer to non list\n", (((void *)0))));
10350 }
10351 break;
10352 }
10353 }
10354 }
10355
10356 void PopulateInstance(struct Instantiation * inst)
10357 {
10358 struct Symbol * classSym = inst->_class->__anon1.__anon1.symbol;
10359 struct __ecereNameSpace__ecere__com__Class * _class = classSym->__anon1.registered;
10360 struct __ecereNameSpace__ecere__com__DataMember * dataMember;
10361 struct __ecereNameSpace__ecere__sys__OldList * memberList = MkList();
10362
10363 if(!inst->members)
10364 inst->members = MkListOne(MkMembersInitList(memberList));
10365 else
10366 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add((&*inst->members), MkMembersInitList(memberList));
10367 for(dataMember = _class->membersAndProperties.first; dataMember; dataMember = dataMember->next)
10368 {
10369 if(!dataMember->isProperty)
10370 {
10371 if(!dataMember->name && (dataMember->type == 2 || dataMember->type == 1))
10372 PopulateInstanceProcessMember(inst, memberList, dataMember, dataMember->offset);
10373 else
10374 {
10375 struct Expression * exp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression);
10376 struct MemberInit * member = MkMemberInit(MkListOne(MkIdentifier(dataMember->name)), MkInitializerAssignment(exp));
10377 struct Type * type;
10378 void * ptr = inst->data + dataMember->offset;
10379 char * result = (((void *)0));
10380
10381 exp->loc = member->loc = inst->loc;
10382 ((struct Identifier *)(*member->identifiers).first)->loc = inst->loc;
10383 if(!dataMember->dataType)
10384 dataMember->dataType = ProcessTypeString(dataMember->dataTypeString, 0);
10385 type = dataMember->dataType;
10386 if(type->kind == 8)
10387 {
10388 struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class->__anon1.registered;
10389
10390 if(_class->type == 4)
10391 {
10392 struct __ecereNameSpace__ecere__com__Class * enumClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "enum");
10393
10394 if(enumClass)
10395 {
10396 struct __ecereNameSpace__ecere__com__EnumClassData * e = (_class ? ((void *)(((char *)_class->data) + enumClass->offsetClass)) : (((void *)0)));
10397 struct __ecereNameSpace__ecere__sys__NamedLink64 * item;
10398
10399 for(item = e->values.first; item; item = item->next)
10400 {
10401 if(item->data == GetEnumValue(_class, ptr))
10402 {
10403 result = item->name;
10404 break;
10405 }
10406 }
10407 }
10408 if(result)
10409 {
10410 exp->__anon1.__anon1.identifier = MkIdentifier(result);
10411 exp->type = 0;
10412 exp->destType = MkClassType(_class->fullName);
10413 ProcessExpressionType(exp);
10414 }
10415 }
10416 if(_class->type == 4 || _class->type == 3 || _class->type == 2)
10417 {
10418 if(!_class->dataType)
10419 _class->dataType = ProcessTypeString(_class->dataTypeString, 0);
10420 type = _class->dataType;
10421 }
10422 }
10423 if(!result)
10424 {
10425 switch(type->kind)
10426 {
10427 case 6:
10428 {
10429 exp->__anon1.__anon1.constant = PrintFloat(*(float *)ptr);
10430 exp->type = 2;
10431 break;
10432 }
10433 case 7:
10434 {
10435 exp->__anon1.__anon1.constant = PrintDouble(*(double *)ptr);
10436 exp->type = 2;
10437 break;
10438 }
10439 case 3:
10440 {
10441 exp->__anon1.__anon1.constant = PrintInt(*(int *)ptr);
10442 exp->type = 2;
10443 break;
10444 }
10445 case 4:
10446 {
10447 exp->__anon1.__anon1.constant = PrintInt64(*(long long *)ptr);
10448 exp->type = 2;
10449 break;
10450 }
10451 case 22:
10452 {
10453 exp->__anon1.__anon1.constant = PrintInt64((long long)*(intptr_t *)ptr);
10454 exp->type = 2;
10455 break;
10456 }
10457 default:
10458 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Unhandled type populating instance\n", (((void *)0))));
10459 }
10460 }
10461 ListAdd(memberList, member);
10462 }
10463 }
10464 }
10465 }
10466
10467 int ComputeTypeSize(struct Type *  type);
10468
10469 void ComputeClassMembers(struct __ecereNameSpace__ecere__com__Class * _class, unsigned int isMember)
10470 {
10471 struct __ecereNameSpace__ecere__com__DataMember * member = isMember ? (struct __ecereNameSpace__ecere__com__DataMember *)_class : (((void *)0));
10472 struct Context * context = isMember ? (((void *)0)) : SetupTemplatesContext(_class);
10473
10474 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))
10475 {
10476 int unionMemberOffset = 0;
10477 int bitFields = 0;
10478
10479 if(member)
10480 {
10481 member->memberOffset = 0;
10482 if(targetBits < sizeof(void *) * 8)
10483 member->structAlignment = 0;
10484 }
10485 else if(targetBits < sizeof(void *) * 8)
10486 _class->structAlignment = 0;
10487 if(!member && ((_class->type == 0 || _class->type == 5) || (_class->type == 1 && _class->memberOffset && _class->memberOffset > _class->base->structSize)))
10488 _class->memberOffset = (_class->base && _class->type == 1) ? _class->base->structSize : 0;
10489 if(!member && _class->destructionWatchOffset)
10490 _class->memberOffset += sizeof(struct __ecereNameSpace__ecere__sys__OldList);
10491 {
10492 struct __ecereNameSpace__ecere__com__DataMember * dataMember;
10493
10494 for(dataMember = member ? member->members.first : _class->membersAndProperties.first; dataMember; dataMember = dataMember->next)
10495 {
10496 if(!dataMember->isProperty)
10497 {
10498 if(dataMember->type == 0 && dataMember->dataTypeString && !dataMember->dataType)
10499 {
10500 dataMember->dataType = ProcessTypeString(dataMember->dataTypeString, 0);
10501 }
10502 }
10503 }
10504 }
10505 {
10506 struct __ecereNameSpace__ecere__com__DataMember * dataMember;
10507
10508 for(dataMember = member ? member->members.first : _class->membersAndProperties.first; dataMember; dataMember = dataMember->next)
10509 {
10510 if(!dataMember->isProperty && (dataMember->type != 0 || dataMember->dataTypeString))
10511 {
10512 if(!isMember && _class->type == 2 && dataMember->dataType)
10513 {
10514 struct __ecereNameSpace__ecere__com__BitMember * bitMember = (struct __ecereNameSpace__ecere__com__BitMember *)dataMember;
10515 uint64 mask = 0;
10516 int d;
10517
10518 ComputeTypeSize(dataMember->dataType);
10519 if(bitMember->pos == -1)
10520 bitMember->pos = _class->memberOffset;
10521 if(!bitMember->size)
10522 bitMember->size = dataMember->dataType->size * 8;
10523 _class->memberOffset = bitMember->pos + bitMember->size;
10524 for(d = 0; d < bitMember->size; d++)
10525 {
10526 if(d)
10527 mask <<= 1;
10528 mask |= 1;
10529 }
10530 bitMember->mask = mask << bitMember->pos;
10531 }
10532 else if(dataMember->type == 0 && dataMember->dataType)
10533 {
10534 int size;
10535 int alignment = 0;
10536
10537 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)))
10538 ComputeTypeSize(dataMember->dataType);
10539 if(dataMember->dataType->bitFieldCount)
10540 {
10541 bitFields += dataMember->dataType->bitFieldCount;
10542 size = 0;
10543 }
10544 else
10545 {
10546 if(bitFields)
10547 {
10548 int size = (bitFields + 7) / 8;
10549
10550 if(isMember)
10551 {
10552 int __simpleStruct0;
10553
10554 if(alignment)
10555 {
10556 short __simpleStruct0;
10557
10558 member->structAlignment = (__simpleStruct0 = member->structAlignment, (__simpleStruct0 > alignment) ? __simpleStruct0 : alignment);
10559 if(member->memberOffset % alignment)
10560 member->memberOffset += alignment - (member->memberOffset % alignment);
10561 }
10562 dataMember->offset = member->memberOffset;
10563 if(member->type == 1)
10564 unionMemberOffset = (__simpleStruct0 = dataMember->dataType->size, (unionMemberOffset > __simpleStruct0) ? unionMemberOffset : __simpleStruct0);
10565 else
10566 {
10567 member->memberOffset += size;
10568 }
10569 }
10570 else
10571 {
10572 if(alignment)
10573 {
10574 short __simpleStruct0;
10575
10576 _class->structAlignment = (__simpleStruct0 = _class->structAlignment, (__simpleStruct0 > alignment) ? __simpleStruct0 : alignment);
10577 if(_class->memberOffset % alignment)
10578 _class->memberOffset += alignment - (_class->memberOffset % alignment);
10579 }
10580 dataMember->offset = _class->memberOffset;
10581 _class->memberOffset += size;
10582 }
10583 bitFields = 0;
10584 }
10585 size = dataMember->dataType->size;
10586 alignment = dataMember->dataType->alignment;
10587 }
10588 if(isMember)
10589 {
10590 int __simpleStruct0;
10591
10592 if(alignment)
10593 {
10594 short __simpleStruct0;
10595
10596 member->structAlignment = (__simpleStruct0 = member->structAlignment, (__simpleStruct0 > alignment) ? __simpleStruct0 : alignment);
10597 if(member->memberOffset % alignment)
10598 member->memberOffset += alignment - (member->memberOffset % alignment);
10599 }
10600 dataMember->offset = member->memberOffset;
10601 if(member->type == 1)
10602 unionMemberOffset = (__simpleStruct0 = dataMember->dataType->size, (unionMemberOffset > __simpleStruct0) ? unionMemberOffset : __simpleStruct0);
10603 else
10604 {
10605 member->memberOffset += size;
10606 }
10607 }
10608 else
10609 {
10610 if(alignment)
10611 {
10612 short __simpleStruct0;
10613
10614 _class->structAlignment = (__simpleStruct0 = _class->structAlignment, (__simpleStruct0 > alignment) ? __simpleStruct0 : alignment);
10615 if(_class->memberOffset % alignment)
10616 _class->memberOffset += alignment - (_class->memberOffset % alignment);
10617 }
10618 dataMember->offset = _class->memberOffset;
10619 _class->memberOffset += size;
10620 }
10621 }
10622 else
10623 {
10624 int alignment;
10625
10626 ComputeClassMembers((struct __ecereNameSpace__ecere__com__Class *)dataMember, 1);
10627 alignment = dataMember->structAlignment;
10628 if(isMember)
10629 {
10630 int __simpleStruct0;
10631
10632 if(alignment)
10633 {
10634 short __simpleStruct0;
10635
10636 if(member->memberOffset % alignment)
10637 member->memberOffset += alignment - (member->memberOffset % alignment);
10638 member->structAlignment = (__simpleStruct0 = member->structAlignment, (__simpleStruct0 > alignment) ? __simpleStruct0 : alignment);
10639 }
10640 dataMember->offset = member->memberOffset;
10641 if(member->type == 1)
10642 unionMemberOffset = (__simpleStruct0 = dataMember->memberOffset, (unionMemberOffset > __simpleStruct0) ? unionMemberOffset : __simpleStruct0);
10643 else
10644 member->memberOffset += dataMember->memberOffset;
10645 }
10646 else
10647 {
10648 if(alignment)
10649 {
10650 short __simpleStruct0;
10651
10652 if(_class->memberOffset % alignment)
10653 _class->memberOffset += alignment - (_class->memberOffset % alignment);
10654 _class->structAlignment = (__simpleStruct0 = _class->structAlignment, (__simpleStruct0 > alignment) ? __simpleStruct0 : alignment);
10655 }
10656 dataMember->offset = _class->memberOffset;
10657 _class->memberOffset += dataMember->memberOffset;
10658 }
10659 }
10660 }
10661 }
10662 if(bitFields)
10663 {
10664 int alignment = 0;
10665 int size = (bitFields + 7) / 8;
10666
10667 if(isMember)
10668 {
10669 int __simpleStruct0;
10670
10671 if(alignment)
10672 {
10673 short __simpleStruct0;
10674
10675 member->structAlignment = (__simpleStruct0 = member->structAlignment, (__simpleStruct0 > alignment) ? __simpleStruct0 : alignment);
10676 if(member->memberOffset % alignment)
10677 member->memberOffset += alignment - (member->memberOffset % alignment);
10678 }
10679 if(member->type == 1)
10680 unionMemberOffset = (__simpleStruct0 = dataMember->dataType->size, (unionMemberOffset > __simpleStruct0) ? unionMemberOffset : __simpleStruct0);
10681 else
10682 {
10683 member->memberOffset += size;
10684 }
10685 }
10686 else
10687 {
10688 if(alignment)
10689 {
10690 short __simpleStruct0;
10691
10692 _class->structAlignment = (__simpleStruct0 = _class->structAlignment, (__simpleStruct0 > alignment) ? __simpleStruct0 : alignment);
10693 if(_class->memberOffset % alignment)
10694 _class->memberOffset += alignment - (_class->memberOffset % alignment);
10695 }
10696 _class->memberOffset += size;
10697 }
10698 bitFields = 0;
10699 }
10700 }
10701 if(member && member->type == 1)
10702 {
10703 member->memberOffset = unionMemberOffset;
10704 }
10705 if(!isMember)
10706 {
10707 if(_class->type != 2)
10708 {
10709 int extra = 0;
10710
10711 if(_class->structAlignment)
10712 {
10713 if(_class->memberOffset % _class->structAlignment)
10714 extra += _class->structAlignment - (_class->memberOffset % _class->structAlignment);
10715 }
10716 _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;
10717 if(!member)
10718 {
10719 struct __ecereNameSpace__ecere__com__Property * prop;
10720
10721 for(prop = _class->membersAndProperties.first; prop; prop = prop->next)
10722 {
10723 if(prop->isProperty && prop->isWatchable)
10724 {
10725 prop->watcherOffset = _class->structSize;
10726 _class->structSize += sizeof(struct __ecereNameSpace__ecere__sys__OldList);
10727 }
10728 }
10729 }
10730 {
10731 struct __ecereNameSpace__ecere__sys__OldLink * derivative;
10732
10733 for(derivative = _class->derivatives.first; derivative; derivative = derivative->next)
10734 {
10735 struct __ecereNameSpace__ecere__com__Class * deriv = derivative->data;
10736
10737 if(deriv->computeSize)
10738 {
10739 deriv->offset = (_class->type == 5 ? _class->memberOffset : _class->structSize);
10740 deriv->memberOffset = 0;
10741 deriv->structSize = deriv->offset;
10742 ComputeClassMembers(deriv, 0);
10743 }
10744 }
10745 }
10746 }
10747 }
10748 }
10749 if(context)
10750 FinishTemplatesContext(context);
10751 }
10752
10753 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)
10754 {
10755 struct __ecereNameSpace__ecere__com__DataMember * topMember = isMember ? (struct __ecereNameSpace__ecere__com__DataMember *)_class : (((void *)0));
10756 unsigned int totalSize = 0;
10757 unsigned int maxSize = 0;
10758 int alignment;
10759 unsigned int size;
10760 struct __ecereNameSpace__ecere__com__DataMember * member;
10761 int anonID = 1;
10762 struct Context * context = isMember ? (((void *)0)) : SetupTemplatesContext(_class);
10763
10764 if(addedPadding)
10765 *addedPadding = 0;
10766 if(!isMember && _class->base)
10767 {
10768 maxSize = _class->structSize;
10769 {
10770 if(_class->type == 1 || _class->type == 5)
10771 AddMembers(neededBy, declarations, _class->base, 0, &totalSize, topClass, (((void *)0)));
10772 else
10773 {
10774 unsigned int baseSize = _class->base->templateClass ? _class->base->templateClass->structSize : _class->base->structSize;
10775
10776 if(maxSize > baseSize)
10777 maxSize -= baseSize;
10778 else
10779 maxSize = 0;
10780 }
10781 }
10782 }
10783 for(member = isMember ? topMember->members.first : _class->membersAndProperties.first; member; member = member->next)
10784 {
10785 if(!member->isProperty)
10786 {
10787 switch(member->type)
10788 {
10789 case 0:
10790 {
10791 if(member->dataTypeString)
10792 {
10793 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList(), * decls = MkList();
10794 struct Declarator * decl;
10795
10796 decl = SpecDeclFromString(member->dataTypeString, specs, MkDeclaratorIdentifier(MkIdentifier(member->name)));
10797 ListAdd(decls, MkStructDeclarator(decl, (((void *)0))));
10798 ListAdd(declarations, MkClassDefDeclaration(MkStructDeclaration(specs, decls, (((void *)0)))));
10799 if(!member->dataType)
10800 member->dataType = ProcessType(specs, decl);
10801 ReplaceThisClassSpecifiers(specs, topClass);
10802 {
10803 struct Type * type = ProcessType(specs, decl);
10804
10805 DeclareType(neededBy, member->dataType, 1, 0);
10806 FreeType(type);
10807 }
10808 ComputeTypeSize(member->dataType);
10809 size = member->dataType->size;
10810 alignment = member->dataType->alignment;
10811 if(alignment)
10812 {
10813 if(totalSize % alignment)
10814 totalSize += alignment - (totalSize % alignment);
10815 }
10816 totalSize += size;
10817 }
10818 break;
10819 }
10820 case 1:
10821 case 2:
10822 {
10823 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList(), * list = MkList();
10824 char id[100];
10825
10826 sprintf(id, "__anon%d", anonID++);
10827 size = 0;
10828 AddMembers(neededBy, list, (struct __ecereNameSpace__ecere__com__Class *)member, 1, &size, topClass, (((void *)0)));
10829 ListAdd(specs, MkStructOrUnion((member->type == 1) ? 4 : 3, (((void *)0)), list));
10830 ListAdd(declarations, MkClassDefDeclaration(MkStructDeclaration(specs, MkListOne(MkDeclaratorIdentifier(MkIdentifier(id))), (((void *)0)))));
10831 alignment = member->structAlignment;
10832 if(alignment)
10833 {
10834 if(totalSize % alignment)
10835 totalSize += alignment - (totalSize % alignment);
10836 }
10837 totalSize += size;
10838 break;
10839 }
10840 }
10841 }
10842 }
10843 if(retSize)
10844 {
10845 unsigned int __simpleStruct0;
10846
10847 if(topMember && topMember->type == 1)
10848 *retSize = (__simpleStruct0 = *retSize, (__simpleStruct0 > totalSize) ? __simpleStruct0 : totalSize);
10849 else
10850 *retSize += totalSize;
10851 }
10852 else if(totalSize < maxSize && _class->type != 1000)
10853 {
10854 int autoPadding = 0;
10855
10856 if(!isMember && _class->structAlignment && totalSize % _class->structAlignment)
10857 autoPadding = _class->structAlignment - (totalSize % _class->structAlignment);
10858 if(totalSize + autoPadding < maxSize)
10859 {
10860 char sizeString[50];
10861
10862 sprintf(sizeString, "%d", maxSize - totalSize);
10863 ListAdd(declarations, MkClassDefDeclaration(MkStructDeclaration(MkListOne(MkSpecifier(CHAR)), MkListOne(MkDeclaratorArray(MkDeclaratorIdentifier(MkIdentifier("__ecere_padding")), MkExpConstant(sizeString))), (((void *)0)))));
10864 if(addedPadding)
10865 *addedPadding = 1;
10866 }
10867 }
10868 if(context)
10869 FinishTemplatesContext(context);
10870 return topMember ? topMember->memberID : _class->memberID;
10871 }
10872
10873 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)
10874 {
10875 if(source && dest)
10876 {
10877 if(warnConst)
10878 CheckConstCompatibility(source, dest, 1);
10879 if(source->kind == 20 && dest->kind != 20)
10880 {
10881 struct Type * type = ProcessTemplateParameterType(source->__anon1.templateParameter);
10882
10883 if(type)
10884 source = type;
10885 }
10886 if(dest->kind == 20 && source->kind != 20)
10887 {
10888 struct Type * type = ProcessTemplateParameterType(dest->__anon1.templateParameter);
10889
10890 if(type)
10891 dest = type;
10892 }
10893 if(dest->classObjectType == 2 && dest->kind != 11)
10894 {
10895 if(source->classObjectType != 3)
10896 return 1;
10897 else
10898 {
10899 if((dest->__anon1._class && strcmp(dest->__anon1._class->string, "class")) || (source->__anon1._class && strcmp(source->__anon1._class->string, "class")))
10900 {
10901 return 1;
10902 }
10903 }
10904 }
10905 else
10906 {
10907 if(source->kind != 11 && source->classObjectType == 3)
10908 return 1;
10909 if(dest->kind != 11 && dest->classObjectType == 3 && source->classObjectType != 2)
10910 return 1;
10911 }
10912 if((dest->kind == 9 && source->kind == 9) || (dest->kind == 10 && source->kind == 10))
10913 {
10914 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))
10915 return 1;
10916 }
10917 if(dest->kind == 14 && source->kind != 0)
10918 return 1;
10919 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))
10920 return 1;
10921 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))
10922 return 1;
10923 if(((source->kind == 8 && dest->kind == 8) || (source->kind == 19 && dest->kind == 19)) && source->__anon1._class)
10924 {
10925 if(source->__anon1._class->__anon1.registered && source->__anon1._class->__anon1.registered->type == 3)
10926 {
10927 if(conversions != (((void *)0)))
10928 {
10929 if(source->__anon1._class->__anon1.registered == dest->__anon1._class->__anon1.registered)
10930 return 1;
10931 }
10932 else
10933 {
10934 struct __ecereNameSpace__ecere__com__Class * sourceBase, * destBase;
10935
10936 for(sourceBase = source->__anon1._class->__anon1.registered; sourceBase && sourceBase->base->type != 1000; sourceBase = sourceBase->base)
10937 ;
10938 for(destBase = dest->__anon1._class->__anon1.registered; destBase && destBase->base->type != 1000; destBase = destBase->base)
10939 ;
10940 if(sourceBase == destBase)
10941 return 1;
10942 }
10943 }
10944 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))
10945 return 1;
10946 else
10947 {
10948 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))
10949 {
10950 if(__ecereNameSpace__ecere__com__eClass_IsDerived(dest->__anon1._class->__anon1.registered, source->__anon1._class->__anon1.registered))
10951 {
10952 return 1;
10953 }
10954 }
10955 }
10956 }
10957 if(source->kind == 19 && dest->kind == 8 && dest->__anon1._class && !strcmp(dest->__anon1._class->string, "ecere::com::Class"))
10958 return 1;
10959 if(doConversion)
10960 {
10961 if(source->kind == 8)
10962 {
10963 struct __ecereNameSpace__ecere__com__Class * _class;
10964
10965 for(_class = source->__anon1._class ? source->__anon1._class->__anon1.registered : (((void *)0)); _class; _class = _class->base)
10966 {
10967 struct __ecereNameSpace__ecere__com__Property * convert;
10968
10969 for(convert = _class->conversions.first; convert; convert = convert->next)
10970 {
10971 if(convert->memberAccess == 1 || _class->module == privateModule)
10972 {
10973 struct Conversion * after = (conversions != (((void *)0))) ? conversions->last : (((void *)0));
10974
10975 if(!convert->dataType)
10976 convert->dataType = ProcessTypeString(convert->dataTypeString, 0);
10977 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))
10978 {
10979 if(!conversions && !convert->Get)
10980 return 1;
10981 else if(conversions != (((void *)0)))
10982 {
10983 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))
10984 return 1;
10985 else
10986 {
10987 struct Conversion * conv = (conv = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Conversion), conv->convert = convert, conv->isGet = 1, conv);
10988
10989 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert(conversions, after, conv);
10990 return 1;
10991 }
10992 }
10993 }
10994 }
10995 }
10996 }
10997 }
10998 if(dest->kind == 8)
10999 {
11000 struct __ecereNameSpace__ecere__com__Class * _class;
11001
11002 for(_class = dest->__anon1._class ? dest->__anon1._class->__anon1.registered : (((void *)0)); _class; _class = _class->base)
11003 {
11004 struct __ecereNameSpace__ecere__com__Property * convert;
11005
11006 for(convert = _class->conversions.first; convert; convert = convert->next)
11007 {
11008 if(convert->memberAccess == 1 || _class->module == privateModule)
11009 {
11010 struct Type * constType = (((void *)0));
11011 unsigned int success = 0;
11012
11013 if(!convert->dataType)
11014 convert->dataType = ProcessTypeString(convert->dataTypeString, 0);
11015 if(warnConst && convert->dataType->kind == 13 && convert->dataType->__anon1.type && dest->constant)
11016 {
11017 struct Type * ptrType = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
11018
11019 constType = __extension__ ({
11020 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
11021
11022 __ecereInstance1->kind = 13, __ecereInstance1->refCount = 1, __ecereInstance1->__anon1.type = ptrType, __ecereInstance1;
11023 });
11024 CopyTypeInto(ptrType, convert->dataType->__anon1.type);
11025 ptrType->constant = 1;
11026 }
11027 if((constType || convert->dataType != dest) && MatchTypes(source, constType ? constType : convert->dataType, conversions, (((void *)0)), (((void *)0)), 1, 0, 0, 1, warnConst))
11028 {
11029 if(!conversions && !convert->Set)
11030 success = 1;
11031 else if(conversions != (((void *)0)))
11032 {
11033 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))
11034 success = 1;
11035 else
11036 {
11037 struct Conversion * conv = (conv = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Conversion), conv->convert = convert, conv);
11038
11039 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(conversions, conv);
11040 success = 1;
11041 }
11042 }
11043 }
11044 if(constType)
11045 FreeType(constType);
11046 if(success)
11047 return 1;
11048 }
11049 }
11050 }
11051 if(enumBaseType && dest->__anon1._class && dest->__anon1._class->__anon1.registered && dest->__anon1._class->__anon1.registered->type == 4)
11052 {
11053 if(!dest->__anon1._class->__anon1.registered->dataType)
11054 dest->__anon1._class->__anon1.registered->dataType = ProcessTypeString(dest->__anon1._class->__anon1.registered->dataTypeString, 0);
11055 if(dest->__anon1._class->__anon1.registered->dataType->kind == 8 || source->truth || dest->truth)
11056 {
11057 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))
11058 {
11059 return 1;
11060 }
11061 }
11062 }
11063 }
11064 if(source->kind == 8)
11065 {
11066 struct __ecereNameSpace__ecere__com__Class * _class;
11067
11068 for(_class = source->__anon1._class ? source->__anon1._class->__anon1.registered : (((void *)0)); _class; _class = _class->base)
11069 {
11070 struct __ecereNameSpace__ecere__com__Property * convert;
11071
11072 for(convert = _class->conversions.first; convert; convert = convert->next)
11073 {
11074 if(convert->memberAccess == 1 || _class->module == privateModule)
11075 {
11076 struct Conversion * after = (conversions != (((void *)0))) ? conversions->last : (((void *)0));
11077
11078 if(!convert->dataType)
11079 convert->dataType = ProcessTypeString(convert->dataTypeString, 0);
11080 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))
11081 {
11082 if(!conversions && !convert->Get)
11083 return 1;
11084 else if(conversions != (((void *)0)))
11085 {
11086 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))
11087 return 1;
11088 else
11089 {
11090 struct Conversion * conv = (conv = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Conversion), conv->convert = convert, conv->isGet = 1, conv);
11091
11092 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert(conversions, after, conv);
11093 return 1;
11094 }
11095 }
11096 }
11097 }
11098 }
11099 }
11100 if(enumBaseType && source->__anon1._class && source->__anon1._class->__anon1.registered && source->__anon1._class->__anon1.registered->type == 4)
11101 {
11102 if(!source->__anon1._class->__anon1.registered->dataType)
11103 source->__anon1._class->__anon1.registered->dataType = ProcessTypeString(source->__anon1._class->__anon1.registered->dataTypeString, 0);
11104 if(!isConversionExploration || source->__anon1._class->__anon1.registered->dataType->kind == 8 || !strcmp(source->__anon1._class->__anon1.registered->name, "String"))
11105 {
11106 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))
11107 return 1;
11108 else if(MatchTypes(dest, source->__anon1._class->__anon1.registered->dataType, (((void *)0)), (((void *)0)), (((void *)0)), 0, 0, 0, 0, warnConst))
11109 return 1;
11110 }
11111 }
11112 }
11113 }
11114 if(source->kind == 8 || source->kind == 19)
11115 ;
11116 else if(dest->kind == source->kind && (dest->kind != 9 && dest->kind != 10 && dest->kind != 11 && dest->kind != 12 && dest->kind != 13 && dest->kind != 16))
11117 return 1;
11118 else if(dest->kind == 7 && source->kind == 6)
11119 return 1;
11120 else if(dest->kind == 2 && (source->kind == 1 || source->kind == 24))
11121 return 1;
11122 else if(dest->kind == 3 && (source->kind == 2 || source->kind == 1 || source->kind == 24 || source->kind == 23))
11123 return 1;
11124 else if(dest->kind == 4 && (source->kind == 2 || source->kind == 1 || source->kind == 24 || source->kind == 3 || source->kind == 22 || source->kind == 23))
11125 return 1;
11126 else if(dest->kind == 22 && (source->kind == 2 || source->kind == 1 || source->kind == 24 || source->kind == 3 || source->kind == 23 || source->kind == 4))
11127 return 1;
11128 else if(dest->kind == 23 && (source->kind == 2 || source->kind == 1 || source->kind == 24 || source->kind == 3 || source->kind == 4 || source->kind == 22))
11129 return 1;
11130 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))
11131 return 1;
11132 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))
11133 return 1;
11134 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)))
11135 {
11136 struct Type * paramSource, * paramDest;
11137
11138 if(dest->kind == 16)
11139 owningClassDest = dest->__anon1.__anon3.methodClass ? dest->__anon1.__anon3.methodClass : dest->__anon1.__anon3.method->_class;
11140 if(source->kind == 16)
11141 owningClassSource = source->__anon1.__anon3.methodClass ? source->__anon1.__anon3.methodClass : source->__anon1.__anon3.method->_class;
11142 if(dest->kind == 13 && dest->__anon1.type->kind == 11)
11143 dest = dest->__anon1.type;
11144 if(source->kind == 13 && source->__anon1.type->kind == 11)
11145 source = source->__anon1.type;
11146 if(dest->kind == 16)
11147 dest = dest->__anon1.__anon3.method->dataType;
11148 if(source->kind == 16)
11149 source = source->__anon1.__anon3.method->dataType;
11150 paramSource = source->__anon1.__anon2.params.first;
11151 if(paramSource && paramSource->kind == 0)
11152 paramSource = (((void *)0));
11153 paramDest = dest->__anon1.__anon2.params.first;
11154 if(paramDest && paramDest->kind == 0)
11155 paramDest = (((void *)0));
11156 if((dest->__anon1.__anon2.staticMethod || (!dest->__anon1.__anon2.thisClass && !owningClassDest)) && !(source->__anon1.__anon2.staticMethod || (!source->__anon1.__anon2.thisClass && !owningClassSource)))
11157 {
11158 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))))
11159 {
11160 if(paramDest && paramDest->kind == 8)
11161 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "method class must be derived from %s\n", (((void *)0))), paramDest->__anon1._class->string);
11162 else
11163 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "method class should not take an object\n", (((void *)0))));
11164 return 0;
11165 }
11166 paramDest = paramDest->next;
11167 }
11168 else if(!dest->__anon1.__anon2.staticMethod && (dest->__anon1.__anon2.thisClass || owningClassDest))
11169 {
11170 if((source->__anon1.__anon2.staticMethod || (!source->__anon1.__anon2.thisClass && !owningClassSource)))
11171 {
11172 if(dest->__anon1.__anon2.thisClass)
11173 {
11174 if(!paramSource || paramSource->kind != 8 || !__ecereNameSpace__ecere__com__eClass_IsDerived(paramSource->__anon1._class->__anon1.registered, dest->__anon1.__anon2.thisClass->__anon1.registered))
11175 {
11176 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "method class must be derived from %s\n", (((void *)0))), dest->__anon1.__anon2.thisClass->string);
11177 return 0;
11178 }
11179 }
11180 else
11181 {
11182 if(!paramSource || paramSource->kind != 8 || (owningClassDest && !__ecereNameSpace__ecere__com__eClass_IsDerived(paramSource->__anon1._class->__anon1.registered, owningClassDest)))
11183 {
11184 if(owningClassDest)
11185 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "%s expected to be derived from method class\n", (((void *)0))), owningClassDest->fullName);
11186 else
11187 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "overriding class expected to be derived from method class\n", (((void *)0))));
11188 return 0;
11189 }
11190 }
11191 paramSource = paramSource->next;
11192 }
11193 else
11194 {
11195 if(dest->__anon1.__anon2.thisClass)
11196 {
11197 if(!__ecereNameSpace__ecere__com__eClass_IsDerived(source->__anon1.__anon2.thisClass ? source->__anon1.__anon2.thisClass->__anon1.registered : owningClassSource, dest->__anon1.__anon2.thisClass->__anon1.registered))
11198 {
11199 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "method class must be derived from %s\n", (((void *)0))), dest->__anon1.__anon2.thisClass->string);
11200 return 0;
11201 }
11202 }
11203 else
11204 {
11205 if(source->__anon1.__anon2.thisClass && source->__anon1.__anon2.thisClass->__anon1.registered && owningClassDest && !__ecereNameSpace__ecere__com__eClass_IsDerived(source->__anon1.__anon2.thisClass->__anon1.registered, owningClassDest))
11206 {
11207 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "%s expected to be derived from method class\n", (((void *)0))), source->__anon1.__anon2.thisClass->__anon1.registered->fullName);
11208 return 0;
11209 }
11210 }
11211 }
11212 }
11213 if(!MatchTypes(source->__anon1.__anon2.returnType, dest->__anon1.__anon2.returnType, (((void *)0)), (((void *)0)), (((void *)0)), 1, 1, 0, 0, warnConst))
11214 {
11215 Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "incompatible return type for function\n", (((void *)0))));
11216 return 0;
11217 }
11218 else
11219 CheckConstCompatibility(dest->__anon1.__anon2.returnType, source->__anon1.__anon2.returnType, 1);
11220 for(; paramDest; paramDest = paramDest->next)
11221 {
11222 if(!paramSource)
11223 {
11224 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "not enough parameters\n", (((void *)0))));
11225 return 0;
11226 }
11227 {
11228 struct Type * paramDestType = paramDest;
11229 struct Type * paramSourceType = paramSource;
11230 struct Type * type = paramDestType;
11231
11232 if(paramDest->kind == 20 && paramDest->__anon1.templateParameter->type == 0 && owningClassSource && paramSource->kind != 20)
11233 {
11234 int id = 0;
11235 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * curParam = (((void *)0));
11236 struct __ecereNameSpace__ecere__com__Class * sClass;
11237
11238 for(sClass = owningClassSource; sClass; sClass = sClass->base)
11239 {
11240 id = 0;
11241 if(sClass->templateClass)
11242 sClass = sClass->templateClass;
11243 for(curParam = sClass->templateParams.first; curParam; curParam = curParam->next)
11244 {
11245 if(curParam->type == 0 && !strcmp(type->__anon1.templateParameter->identifier->string, curParam->name))
11246 {
11247 for(sClass = sClass->base; sClass; sClass = sClass->base)
11248 {
11249 if(sClass->templateClass)
11250 sClass = sClass->templateClass;
11251 id += sClass->templateParams.count;
11252 }
11253 break;
11254 }
11255 id++;
11256 }
11257 if(curParam)
11258 break;
11259 }
11260 if(curParam)
11261 {
11262 struct __ecereNameSpace__ecere__com__ClassTemplateArgument arg = owningClassSource->templateArgs[id];
11263
11264 paramDestType = type = ProcessTypeString(arg.__anon1.__anon1.dataTypeString, 0);
11265 }
11266 }
11267 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)))
11268 {
11269 char type[1024];
11270
11271 type[0] = 0;
11272 PrintType(paramDest, type, 0, 1);
11273 Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "incompatible parameter %s (expected %s)\n", (((void *)0))), paramSource->name, type);
11274 if(paramDestType != paramDest)
11275 FreeType(paramDestType);
11276 return 0;
11277 }
11278 if(paramDestType != paramDest)
11279 FreeType(paramDestType);
11280 }
11281 paramSource = paramSource->next;
11282 }
11283 if(paramSource)
11284 {
11285 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "too many parameters\n", (((void *)0))));
11286 return 0;
11287 }
11288 return 1;
11289 }
11290 else if((dest->kind == 11 || (dest->kind == 13 && dest->__anon1.type->kind == 11) || dest->kind == 16) && (source->kind == 13 && source->__anon1.type->kind == 0))
11291 {
11292 return 1;
11293 }
11294 else if((dest->kind == 13 || dest->kind == 12) && (source->kind == 12 || source->kind == 13))
11295 {
11296 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))
11297 {
11298 ComputeTypeSize(source->__anon1.type);
11299 ComputeTypeSize(dest->__anon1.type);
11300 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))
11301 return 1;
11302 }
11303 }
11304 }
11305 return 0;
11306 }
11307
11308 void ComputeInstantiation(struct Expression * exp)
11309 {
11310 struct Instantiation * inst = exp->__anon1.instance;
11311 struct MembersInit * members;
11312 struct Symbol * classSym = inst->_class ? inst->_class->__anon1.__anon1.symbol : (((void *)0));
11313 struct __ecereNameSpace__ecere__com__Class * _class = classSym ? classSym->__anon1.registered : (((void *)0));
11314 struct __ecereNameSpace__ecere__com__DataMember * curMember = (((void *)0));
11315 struct __ecereNameSpace__ecere__com__Class * curClass = (((void *)0));
11316 struct __ecereNameSpace__ecere__com__DataMember * subMemberStack[256];
11317 int subMemberStackPos = 0;
11318 uint64 bits = 0;
11319
11320 if(_class && (_class->type == 1 || _class->type == 0 || _class->type == 5))
11321 {
11322 if(inst->data)
11323 return ;
11324 if(_class->type == 0 || _class->type == 5)
11325 {
11326 inst->data = (unsigned char *)__ecereNameSpace__ecere__com__eInstance_New(_class);
11327 if(_class->type == 0)
11328 ((struct __ecereNameSpace__ecere__com__Instance *)(char *)((struct __ecereNameSpace__ecere__com__Instance *)inst->data))->_refCount++;
11329 }
11330 else
11331 inst->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize));
11332 }
11333 if(inst->members)
11334 {
11335 for(members = (*inst->members).first; members; members = members->next)
11336 {
11337 switch(members->type)
11338 {
11339 case 0:
11340 {
11341 if(members->__anon1.dataMembers)
11342 {
11343 struct MemberInit * member;
11344
11345 for(member = (*members->__anon1.dataMembers).first; member; member = member->next)
11346 {
11347 struct Identifier * ident = member->identifiers ? (*member->identifiers).first : (((void *)0));
11348 unsigned int found = 0;
11349 struct __ecereNameSpace__ecere__com__Property * prop = (((void *)0));
11350 struct __ecereNameSpace__ecere__com__DataMember * dataMember = (((void *)0));
11351 unsigned int dataMemberOffset;
11352
11353 if(!ident)
11354 {
11355 __ecereNameSpace__ecere__com__eClass_FindNextMember(_class, &curClass, &curMember, subMemberStack, &subMemberStackPos);
11356 if(curMember)
11357 {
11358 if(curMember->isProperty)
11359 prop = (struct __ecereNameSpace__ecere__com__Property *)curMember;
11360 else
11361 {
11362 dataMember = curMember;
11363 __ecereNameSpace__ecere__com__eClass_FindDataMemberAndOffset(_class, dataMember->name, &dataMemberOffset, privateModule, (((void *)0)), (((void *)0)));
11364 if(_class->type == 0)
11365 dataMemberOffset += _class->base->structSize;
11366 }
11367 found = 1;
11368 }
11369 }
11370 else
11371 {
11372 prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, ident->string, privateModule);
11373 if(prop)
11374 {
11375 found = 1;
11376 if(prop->memberAccess == 1)
11377 {
11378 curMember = (struct __ecereNameSpace__ecere__com__DataMember *)prop;
11379 curClass = prop->_class;
11380 }
11381 }
11382 else
11383 {
11384 struct __ecereNameSpace__ecere__com__DataMember * _subMemberStack[256];
11385 int _subMemberStackPos = 0;
11386
11387 dataMember = __ecereNameSpace__ecere__com__eClass_FindDataMemberAndOffset(_class, ident->string, &dataMemberOffset, privateModule, _subMemberStack, &_subMemberStackPos);
11388 if(dataMember)
11389 {
11390 found = 1;
11391 if(dataMember->memberAccess == 1)
11392 {
11393 curMember = dataMember;
11394 curClass = dataMember->_class;
11395 memcpy(subMemberStack, _subMemberStack, sizeof(struct __ecereNameSpace__ecere__com__DataMember *) * _subMemberStackPos);
11396 subMemberStackPos = _subMemberStackPos;
11397 }
11398 }
11399 }
11400 }
11401 if(found && member->initializer && member->initializer->type == 0)
11402 {
11403 struct Expression * value = member->initializer->__anon1.exp;
11404 struct Type * type = (((void *)0));
11405 unsigned int deepMember = 0;
11406
11407 if(prop)
11408 {
11409 type = prop->dataType;
11410 }
11411 else if(dataMember)
11412 {
11413 if(!dataMember->dataType)
11414 dataMember->dataType = ProcessTypeString(dataMember->dataTypeString, 0);
11415 type = dataMember->dataType;
11416 }
11417 if(ident && ident->next)
11418 {
11419 deepMember = 1;
11420 for(ident = ident->next; ident && type; ident = ident->next)
11421 {
11422 if(type->kind == 8)
11423 {
11424 prop = __ecereNameSpace__ecere__com__eClass_FindProperty(type->__anon1._class->__anon1.registered, ident->string, privateModule);
11425 if(prop)
11426 type = prop->dataType;
11427 else
11428 {
11429 dataMember = __ecereNameSpace__ecere__com__eClass_FindDataMemberAndOffset(type->__anon1._class->__anon1.registered, ident->string, &dataMemberOffset, privateModule, (((void *)0)), (((void *)0)));
11430 if(dataMember)
11431 type = dataMember->dataType;
11432 }
11433 }
11434 else if(type->kind == 9 || type->kind == 10)
11435 {
11436 struct Type * memberType;
11437
11438 for(memberType = type->__anon1.__anon1.members.first; memberType; memberType = memberType->next)
11439 {
11440 if(!strcmp(memberType->name, ident->string))
11441 {
11442 type = memberType;
11443 break;
11444 }
11445 }
11446 }
11447 }
11448 }
11449 if(value)
11450 {
11451 FreeType(value->destType);
11452 value->destType = type;
11453 if(type)
11454 type->refCount++;
11455 ComputeExpression(value);
11456 }
11457 if(!deepMember && type && value && (_class->type == 1 || _class->type == 0 || _class->type == 5))
11458 {
11459 if(type->kind == 8)
11460 {
11461 struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class->__anon1.registered;
11462
11463 if(_class && (_class->type == 2 || _class->type == 3 || _class->type == 4))
11464 {
11465 if(!_class->dataType)
11466 _class->dataType = ProcessTypeString(_class->dataTypeString, 0);
11467 type = _class->dataType;
11468 }
11469 }
11470 if(dataMember)
11471 {
11472 void * ptr = inst->data + dataMemberOffset;
11473
11474 if(value->type == 2)
11475 {
11476 switch(type->kind)
11477 {
11478 case 3:
11479 {
11480 GetInt(value, (int *)ptr);
11481 break;
11482 }
11483 case 4:
11484 {
11485 GetInt64(value, (long long *)ptr);
11486 break;
11487 }
11488 case 22:
11489 {
11490 GetIntPtr(value, (intptr_t *)ptr);
11491 break;
11492 }
11493 case 23:
11494 {
11495 GetIntSize(value, (ssize_t *)ptr);
11496 break;
11497 }
11498 case 6:
11499 {
11500 GetFloat(value, (float *)ptr);
11501 break;
11502 }
11503 case 7:
11504 {
11505 GetDouble(value, (double *)ptr);
11506 break;
11507 }
11508 }
11509 }
11510 else if(value->type == 1)
11511 {
11512 if(type->kind == 8)
11513 {
11514 struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class->__anon1.registered;
11515
11516 if(_class->type == 1)
11517 {
11518 ComputeTypeSize(type);
11519 if(value->__anon1.instance->data)
11520 memcpy(ptr, value->__anon1.instance->data, type->size);
11521 }
11522 }
11523 }
11524 }
11525 else if(prop && prop->Set != (void *)(intptr_t)1)
11526 {
11527 if(value->type == 1 && value->__anon1.instance->data)
11528 {
11529 if(type->kind == 8)
11530 {
11531 struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class->__anon1.registered;
11532
11533 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)))
11534 {
11535 void (* Set)(void *, void *) = (void *)prop->Set;
11536
11537 Set(inst->data, value->__anon1.instance->data);
11538 PopulateInstance(inst);
11539 }
11540 }
11541 }
11542 else if(value->type == 2)
11543 {
11544 switch(type->kind)
11545 {
11546 case 7:
11547 {
11548 void (* Set)(void *, double) = (void *)prop->Set;
11549
11550 Set(inst->data, strtod(value->__anon1.__anon1.constant, (((void *)0))));
11551 break;
11552 }
11553 case 6:
11554 {
11555 void (* Set)(void *, float) = (void *)prop->Set;
11556
11557 Set(inst->data, (float)(strtod(value->__anon1.__anon1.constant, (((void *)0)))));
11558 break;
11559 }
11560 case 3:
11561 {
11562 void (* Set)(void *, int) = (void *)prop->Set;
11563
11564 Set(inst->data, strtol(value->__anon1.__anon1.constant, (((void *)0)), 0));
11565 break;
11566 }
11567 case 4:
11568 {
11569 void (* Set)(void *, long long) = (void *)prop->Set;
11570
11571 Set(inst->data, __ecereNameSpace__ecere__com___strtoi64(value->__anon1.__anon1.constant, (((void *)0)), 0));
11572 break;
11573 }
11574 case 22:
11575 {
11576 void (* Set)(void *, intptr_t) = (void *)prop->Set;
11577
11578 Set(inst->data, (intptr_t)__ecereNameSpace__ecere__com___strtoi64(value->__anon1.__anon1.constant, (((void *)0)), 0));
11579 break;
11580 }
11581 case 23:
11582 {
11583 void (* Set)(void *, ssize_t) = (void *)prop->Set;
11584
11585 Set(inst->data, (ssize_t)__ecereNameSpace__ecere__com___strtoi64(value->__anon1.__anon1.constant, (((void *)0)), 0));
11586 break;
11587 }
11588 }
11589 }
11590 else if(value->type == 3)
11591 {
11592 char temp[1024];
11593
11594 ReadString(temp, value->__anon1.__anon2.string);
11595 ((void (*)(void *, void *))(void *)prop->Set)(inst->data, temp);
11596 }
11597 }
11598 }
11599 else if(!deepMember && type && _class->type == 3)
11600 {
11601 if(prop)
11602 {
11603 if(value->type == 2)
11604 {
11605 if(type->kind == 8)
11606 {
11607 struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class->__anon1.registered;
11608
11609 if(_class->type == 3)
11610 {
11611 if(!_class->dataType)
11612 _class->dataType = ProcessTypeString(_class->dataTypeString, 0);
11613 type = _class->dataType;
11614 }
11615 }
11616 switch(type->kind)
11617 {
11618 case 6:
11619 {
11620 float fValue;
11621 float (* Set)(float) = (void *)prop->Set;
11622
11623 GetFloat(member->initializer->__anon1.exp, &fValue);
11624 exp->__anon1.__anon1.constant = PrintFloat(Set(fValue));
11625 exp->type = 2;
11626 break;
11627 }
11628 case 7:
11629 {
11630 double dValue;
11631 double (* Set)(double) = (void *)prop->Set;
11632
11633 GetDouble(member->initializer->__anon1.exp, &dValue);
11634 exp->__anon1.__anon1.constant = PrintDouble(Set(dValue));
11635 exp->type = 2;
11636 break;
11637 }
11638 }
11639 }
11640 }
11641 }
11642 else if(!deepMember && type && _class->type == 2)
11643 {
11644 if(prop)
11645 {
11646 if(value->type == 1 && value->__anon1.instance->data)
11647 {
11648 unsigned int (* Set)(void *) = (void *)prop->Set;
11649
11650 bits = Set(value->__anon1.instance->data);
11651 }
11652 else if(value->type == 2)
11653 {
11654 }
11655 }
11656 else if(dataMember)
11657 {
11658 struct __ecereNameSpace__ecere__com__BitMember * bitMember = (struct __ecereNameSpace__ecere__com__BitMember *)dataMember;
11659 struct Type * type;
11660 uint64 part = 0;
11661
11662 bits = (bits & ~bitMember->mask);
11663 if(!bitMember->dataType)
11664 bitMember->dataType = ProcessTypeString(bitMember->dataTypeString, 0);
11665 type = bitMember->dataType;
11666 if(type->kind == 8 && type->__anon1._class && type->__anon1._class->__anon1.registered)
11667 {
11668 if(!type->__anon1._class->__anon1.registered->dataType)
11669 type->__anon1._class->__anon1.registered->dataType = ProcessTypeString(type->__anon1._class->__anon1.registered->dataTypeString, 0);
11670 type = type->__anon1._class->__anon1.registered->dataType;
11671 }
11672 switch(type->kind)
11673 {
11674 case 24:
11675 case 1:
11676 {
11677 unsigned char v;
11678
11679 type->isSigned ? GetChar(value, (char *)&v) : GetUChar(value, &v);
11680 part = (uint64)v;
11681 break;
11682 }
11683 case 2:
11684 {
11685 unsigned short v;
11686
11687 type->isSigned ? GetShort(value, (short *)&v) : GetUShort(value, &v);
11688 part = (uint64)v;
11689 break;
11690 }
11691 case 3:
11692 case 5:
11693 {
11694 unsigned int v;
11695
11696 type->isSigned ? GetInt(value, (int *)&v) : GetUInt(value, &v);
11697 part = (uint64)v;
11698 break;
11699 }
11700 case 4:
11701 {
11702 uint64 v;
11703
11704 type->isSigned ? GetInt64(value, (long long *)&v) : GetUInt64(value, &v);
11705 part = v;
11706 break;
11707 }
11708 case 22:
11709 {
11710 uintptr_t v;
11711
11712 type->isSigned ? GetIntPtr(value, (intptr_t *)&v) : GetUIntPtr(value, &v);
11713 part = (uint64)v;
11714 break;
11715 }
11716 case 23:
11717 {
11718 size_t v;
11719
11720 type->isSigned ? GetIntSize(value, (ssize_t *)&v) : GetUIntSize(value, &v);
11721 part = (uint64)v;
11722 break;
11723 }
11724 }
11725 bits |= part << bitMember->pos;
11726 }
11727 }
11728 }
11729 else
11730 {
11731 if(_class && _class->type == 3)
11732 {
11733 ComputeExpression(member->initializer->__anon1.exp);
11734 exp->__anon1.__anon1.constant = member->initializer->__anon1.exp->__anon1.__anon1.constant;
11735 exp->type = 2;
11736 member->initializer->__anon1.exp->__anon1.__anon1.constant = (((void *)0));
11737 }
11738 }
11739 }
11740 }
11741 break;
11742 }
11743 }
11744 }
11745 }
11746 if(_class && _class->type == 2)
11747 {
11748 exp->__anon1.__anon1.constant = PrintHexUInt(bits);
11749 exp->type = 2;
11750 }
11751 if(exp->type != 1)
11752 {
11753 FreeInstance(inst);
11754 }
11755 }
11756
11757 void CallOperator(struct Expression * exp, struct Expression * exp1, struct Expression * exp2, struct Operand * op1, struct Operand * op2)
11758 {
11759 if(exp->__anon1.op.op == SIZEOF)
11760 {
11761 FreeExpContents(exp);
11762 exp->type = 2;
11763 exp->__anon1.__anon1.constant = PrintUInt(ComputeTypeSize(op1->type));
11764 }
11765 else
11766 {
11767 if(!exp->__anon1.op.exp1)
11768 {
11769 switch(exp->__anon1.op.op)
11770 {
11771 case '+':
11772 {
11773 struct Expression * exp2 = exp->__anon1.op.exp2;
11774
11775 exp->__anon1.op.exp2 = (((void *)0));
11776 FreeExpContents(exp);
11777 FreeType(exp->expType);
11778 FreeType(exp->destType);
11779 *exp = *exp2;
11780 ((exp2 ? __extension__ ({
11781 void * __ecerePtrToDelete = (exp2);
11782
11783 __ecereClass_Expression->Destructor ? __ecereClass_Expression->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete);
11784 }) : 0), exp2 = 0);
11785 break;
11786 }
11787 case '-':
11788 if(op1->ops.Neg)
11789 {
11790 FreeExpContents(exp);
11791 op1->ops.Neg(exp, op1);
11792 }
11793 break;
11794 case '~':
11795 if(op1->ops.BitNot)
11796 {
11797 FreeExpContents(exp);
11798 op1->ops.BitNot(exp, op1);
11799 }
11800 break;
11801 case '!':
11802 if(op1->ops.Not)
11803 {
11804 FreeExpContents(exp);
11805 op1->ops.Not(exp, op1);
11806 }
11807 break;
11808 }
11809 }
11810 else
11811 {
11812 if(op1 && op2 && op1->type && op2->type && op1->kind != op2->kind)
11813 {
11814 if(Promote(op2, op1->kind, op1->type->isSigned))
11815 op2->kind = op1->kind, op2->ops = op1->ops;
11816 else if(Promote(op1, op2->kind, op2->type->isSigned))
11817 op1->kind = op2->kind, op1->ops = op2->ops;
11818 }
11819 switch(exp->__anon1.op.op)
11820 {
11821 case '+':
11822 if(op1->ops.Add)
11823 {
11824 FreeExpContents(exp);
11825 op1->ops.Add(exp, op1, op2);
11826 }
11827 break;
11828 case '-':
11829 if(op1->ops.Sub)
11830 {
11831 FreeExpContents(exp);
11832 op1->ops.Sub(exp, op1, op2);
11833 }
11834 break;
11835 case '*':
11836 if(op1->ops.Mul)
11837 {
11838 FreeExpContents(exp);
11839 op1->ops.Mul(exp, op1, op2);
11840 }
11841 break;
11842 case '/':
11843 if(op1->ops.Div)
11844 {
11845 FreeExpContents(exp);
11846 op1->ops.Div(exp, op1, op2);
11847 }
11848 break;
11849 case '%':
11850 if(op1->ops.Mod)
11851 {
11852 FreeExpContents(exp);
11853 op1->ops.Mod(exp, op1, op2);
11854 }
11855 break;
11856 case '&':
11857 if(exp->__anon1.op.exp2)
11858 {
11859 if(op1->ops.BitAnd)
11860 {
11861 FreeExpContents(exp);
11862 op1->ops.BitAnd(exp, op1, op2);
11863 }
11864 }
11865 break;
11866 case '|':
11867 if(op1->ops.BitOr)
11868 {
11869 FreeExpContents(exp);
11870 op1->ops.BitOr(exp, op1, op2);
11871 }
11872 break;
11873 case '^':
11874 if(op1->ops.BitXor)
11875 {
11876 FreeExpContents(exp);
11877 op1->ops.BitXor(exp, op1, op2);
11878 }
11879 break;
11880 case LEFT_OP:
11881 if(op1->ops.LShift)
11882 {
11883 FreeExpContents(exp);
11884 op1->ops.LShift(exp, op1, op2);
11885 }
11886 break;
11887 case RIGHT_OP:
11888 if(op1->ops.RShift)
11889 {
11890 FreeExpContents(exp);
11891 op1->ops.RShift(exp, op1, op2);
11892 }
11893 break;
11894 case EQ_OP:
11895 if(op1->ops.Equ)
11896 {
11897 FreeExpContents(exp);
11898 op1->ops.Equ(exp, op1, op2);
11899 }
11900 break;
11901 case NE_OP:
11902 if(op1->ops.Nqu)
11903 {
11904 FreeExpContents(exp);
11905 op1->ops.Nqu(exp, op1, op2);
11906 }
11907 break;
11908 case AND_OP:
11909 if(op1->ops.And)
11910 {
11911 FreeExpContents(exp);
11912 op1->ops.And(exp, op1, op2);
11913 }
11914 break;
11915 case OR_OP:
11916 if(op1->ops.Or)
11917 {
11918 FreeExpContents(exp);
11919 op1->ops.Or(exp, op1, op2);
11920 }
11921 break;
11922 case '>':
11923 if(op1->ops.Grt)
11924 {
11925 FreeExpContents(exp);
11926 op1->ops.Grt(exp, op1, op2);
11927 }
11928 break;
11929 case '<':
11930 if(op1->ops.Sma)
11931 {
11932 FreeExpContents(exp);
11933 op1->ops.Sma(exp, op1, op2);
11934 }
11935 break;
11936 case GE_OP:
11937 if(op1->ops.GrtEqu)
11938 {
11939 FreeExpContents(exp);
11940 op1->ops.GrtEqu(exp, op1, op2);
11941 }
11942 break;
11943 case LE_OP:
11944 if(op1->ops.SmaEqu)
11945 {
11946 FreeExpContents(exp);
11947 op1->ops.SmaEqu(exp, op1, op2);
11948 }
11949 break;
11950 }
11951 }
11952 }
11953 }
11954
11955 void ApplyAnyObjectLogic(struct Expression * e)
11956 {
11957 struct Type * destType = e->destType;
11958
11959 if(destType && (destType->classObjectType == 3))
11960 {
11961 if(e && e->expType)
11962 {
11963 struct Type * type = e->expType;
11964 struct __ecereNameSpace__ecere__com__Class * _class = (((void *)0));
11965
11966 if(type->kind == 8 && type->__anon1._class && type->__anon1._class->__anon1.registered)
11967 {
11968 _class = type->__anon1._class->__anon1.registered;
11969 }
11970 else if(type->kind == 19)
11971 {
11972 _class = FindClass("ecere::com::Class")->__anon1.registered;
11973 }
11974 else
11975 {
11976 char string[1024] = "";
11977 struct Symbol * classSym;
11978
11979 PrintTypeNoConst(type, string, 0, 1);
11980 classSym = FindClass(string);
11981 if(classSym)
11982 _class = classSym->__anon1.registered;
11983 }
11984 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)))
11985 {
11986 if(!_class || strcmp(_class->fullName, "char *"))
11987 {
11988 struct Expression * checkedExp = e, * newExp;
11989
11990 while(((checkedExp->type == 5 || checkedExp->type == 32 || checkedExp->type == 23) && checkedExp->__anon1.list) || checkedExp->type == 11)
11991 {
11992 if(checkedExp->type == 5 || checkedExp->type == 32 || checkedExp->type == 23)
11993 {
11994 if(checkedExp->type == 23)
11995 {
11996 checkedExp = (*((struct Statement *)(*checkedExp->__anon1.compound->__anon1.compound.statements).last)->__anon1.expressions).last;
11997 }
11998 else
11999 checkedExp = (*checkedExp->__anon1.list).last;
12000 }
12001 else if(checkedExp->type == 11)
12002 checkedExp = checkedExp->__anon1.cast.exp;
12003 }
12004 if(checkedExp && checkedExp->type == 4 && checkedExp->__anon1.op.op == '*' && !checkedExp->__anon1.op.exp1)
12005 {
12006 newExp = checkedExp->__anon1.op.exp2;
12007 checkedExp->__anon1.op.exp2 = (((void *)0));
12008 FreeExpContents(checkedExp);
12009 if(e->expType && e->expType->passAsTemplate)
12010 {
12011 char size[100];
12012
12013 ComputeTypeSize(e->expType);
12014 sprintf(size, "%d", e->expType->size);
12015 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))))));
12016 }
12017 ReplaceExpContents(checkedExp, newExp);
12018 e->byReference = 1;
12019 }
12020 else if(!e->byReference || (_class && _class->type == 5))
12021 {
12022 struct Expression * checkedExp;
12023
12024 {
12025 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;
12026
12027 if(_class && _class->type != 5 && _class->type != 0 && _class->type != 1 && !hasAddress)
12028 {
12029 struct Context * context = PushContext();
12030 struct Declarator * decl;
12031 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
12032 char typeString[1024];
12033 struct Expression * newExp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression);
12034
12035 typeString[0] = '\0';
12036 *newExp = *e;
12037 newExp->prev = (((void *)0));
12038 newExp->next = (((void *)0));
12039 newExp->expType = (((void *)0));
12040 PrintTypeNoConst(e->expType, typeString, 0, 1);
12041 decl = SpecDeclFromString(typeString, specs, (((void *)0)));
12042 newExp->destType = ProcessType(specs, decl);
12043 curContext = context;
12044 if(curCompound)
12045 {
12046 char name[100];
12047 struct __ecereNameSpace__ecere__sys__OldList * stmts = MkList();
12048
12049 e->type = 23;
12050 sprintf(name, "__internalValue%03X", internalValueCounter++);
12051 if(!curCompound->__anon1.compound.declarations)
12052 curCompound->__anon1.compound.declarations = MkList();
12053 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*curCompound->__anon1.compound.declarations), (((void *)0)), MkDeclaration(specs, MkListOne(MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier(name)), (((void *)0))))));
12054 ListAdd(stmts, MkExpressionStmt(MkListOne(MkExpOp(MkExpIdentifier(MkIdentifier(name)), '=', newExp))));
12055 ListAdd(stmts, MkExpressionStmt(MkListOne(MkExpIdentifier(MkIdentifier(name)))));
12056 e->__anon1.compound = MkCompoundStmt((((void *)0)), stmts);
12057 }
12058 else
12059 printf("libec: compiler error, curCompound is null in ApplyAnyObjectLogic\n");
12060 {
12061 struct Type * type = e->destType;
12062
12063 e->destType = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
12064 CopyTypeInto(e->destType, type);
12065 e->destType->refCount = 1;
12066 e->destType->classObjectType = 0;
12067 FreeType(type);
12068 }
12069 e->__anon1.compound->__anon1.compound.context = context;
12070 PopContext(context);
12071 curContext = context->parent;
12072 }
12073 }
12074 checkedExp = e;
12075 while(((checkedExp->type == 5 || checkedExp->type == 32 || checkedExp->type == 23) && checkedExp->__anon1.list) || checkedExp->type == 11)
12076 {
12077 if(checkedExp->type == 5 || checkedExp->type == 32 || checkedExp->type == 23)
12078 {
12079 if(checkedExp->type == 23)
12080 {
12081 checkedExp = (*((struct Statement *)(*checkedExp->__anon1.compound->__anon1.compound.statements).last)->__anon1.expressions).last;
12082 }
12083 else
12084 checkedExp = (*checkedExp->__anon1.list).last;
12085 }
12086 else if(checkedExp->type == 11)
12087 checkedExp = checkedExp->__anon1.cast.exp;
12088 }
12089 {
12090 struct Expression * operand = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression);
12091
12092 *operand = *checkedExp;
12093 __ecereMethod_Expression_Clear(checkedExp);
12094 checkedExp->destType = ProcessTypeString("void *", 0);
12095 checkedExp->expType = checkedExp->destType;
12096 checkedExp->destType->refCount++;
12097 checkedExp->type = 4;
12098 checkedExp->__anon1.op.op = '&';
12099 checkedExp->__anon1.op.exp1 = (((void *)0));
12100 checkedExp->__anon1.op.exp2 = operand;
12101 }
12102 }
12103 }
12104 }
12105 }
12106 }
12107 {
12108 }
12109 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))))
12110 {
12111 if(e->expType->classObjectType && destType && destType->classObjectType)
12112 {
12113 return ;
12114 }
12115 else
12116 {
12117 struct Expression * thisExp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression);
12118
12119 *thisExp = *e;
12120 thisExp->prev = (((void *)0));
12121 thisExp->next = (((void *)0));
12122 __ecereMethod_Expression_Clear(e);
12123 e->type = 5;
12124 e->__anon1.list = MkListOne(MkExpOp((((void *)0)), '*', thisExp->type == 0 ? thisExp : MkExpBrackets(MkListOne(thisExp))));
12125 if(thisExp->expType->kind == 8 && thisExp->expType->__anon1._class && thisExp->expType->__anon1._class->__anon1.registered && thisExp->expType->__anon1._class->__anon1.registered->type == 5)
12126 ((struct Expression *)(*e->__anon1.list).first)->byReference = 1;
12127 {
12128 e->expType = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
12129 CopyTypeInto(e->expType, thisExp->expType);
12130 e->expType->byReference = 0;
12131 e->expType->refCount = 1;
12132 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))
12133 {
12134 e->expType->classObjectType = 0;
12135 }
12136 }
12137 }
12138 }
12139 else if(destType && e->expType && (e->expType->classObjectType == 3 || e->expType->classObjectType == 2) && !destType->classObjectType && destType->kind != 0)
12140 {
12141 if(destType->kind == 14)
12142 {
12143 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Unspecified type\n", (((void *)0))));
12144 }
12145 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))
12146 {
12147 unsigned int byReference = e->expType->byReference;
12148 struct Expression * thisExp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression);
12149 struct Declarator * decl;
12150 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
12151 char typeString[1024];
12152 struct Type * type;
12153 int backupClassObjectType;
12154 unsigned int backupByReference;
12155
12156 if(e->expType->kind == 8 && e->expType->__anon1._class && e->expType->__anon1._class->__anon1.registered && strcmp(e->expType->__anon1._class->__anon1.registered->name, "class"))
12157 type = e->expType;
12158 else
12159 type = destType;
12160 backupClassObjectType = type->classObjectType;
12161 backupByReference = type->byReference;
12162 type->classObjectType = 0;
12163 type->byReference = 0;
12164 typeString[0] = '\0';
12165 PrintType(type, typeString, 0, 1);
12166 decl = SpecDeclFromString(typeString, specs, (((void *)0)));
12167 type->classObjectType = backupClassObjectType;
12168 type->byReference = backupByReference;
12169 *thisExp = *e;
12170 thisExp->prev = (((void *)0));
12171 thisExp->next = (((void *)0));
12172 __ecereMethod_Expression_Clear(e);
12173 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)))
12174 {
12175 unsigned int passAsTemplate = thisExp->destType->passAsTemplate;
12176 struct Type * t;
12177
12178 destType->refCount++;
12179 e->type = 4;
12180 e->__anon1.op.op = '*';
12181 e->__anon1.op.exp1 = (((void *)0));
12182 e->__anon1.op.exp2 = MkExpCast(MkTypeName(specs, MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), decl)), thisExp);
12183 t = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
12184 CopyTypeInto(t, thisExp->destType);
12185 t->passAsTemplate = 0;
12186 FreeType(thisExp->destType);
12187 thisExp->destType = t;
12188 t = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
12189 CopyTypeInto(t, destType);
12190 t->passAsTemplate = passAsTemplate;
12191 FreeType(destType);
12192 destType = t;
12193 destType->refCount = 0;
12194 e->expType = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
12195 CopyTypeInto(e->expType, type);
12196 if(type->passAsTemplate)
12197 {
12198 e->expType->classObjectType = 0;
12199 e->expType->passAsTemplate = 0;
12200 }
12201 e->expType->byReference = 0;
12202 e->expType->refCount = 1;
12203 }
12204 else
12205 {
12206 e->type = 11;
12207 e->__anon1.cast.typeName = MkTypeName(specs, decl);
12208 e->__anon1.cast.exp = thisExp;
12209 e->byReference = 1;
12210 e->expType = type;
12211 type->refCount++;
12212 }
12213 if(e->destType)
12214 FreeType(e->destType);
12215 e->destType = destType;
12216 destType->refCount++;
12217 }
12218 }
12219 }
12220
12221 void ComputeModuleClasses(struct __ecereNameSpace__ecere__com__Instance * module)
12222 {
12223 struct __ecereNameSpace__ecere__com__Class * _class;
12224 struct __ecereNameSpace__ecere__sys__OldLink * subModule;
12225
12226 for(subModule = ((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->modules.first; subModule; subModule = subModule->next)
12227 ComputeModuleClasses(subModule->data);
12228 for(_class = ((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->classes.first; _class; _class = _class->next)
12229 ComputeClassMembers(_class, 0);
12230 }
12231
12232 int ComputeTypeSize(struct Type * type)
12233 {
12234 unsigned int size = type ? type->size : 0;
12235
12236 if(!size && type && !type->computing)
12237 {
12238 type->computing = 1;
12239 switch(type->kind)
12240 {
12241 case 24:
12242 type->alignment = size = sizeof(char);
12243 break;
12244 case 1:
12245 type->alignment = size = sizeof(char);
12246 break;
12247 case 3:
12248 type->alignment = size = sizeof(int);
12249 break;
12250 case 4:
12251 type->alignment = size = sizeof(long long);
12252 break;
12253 case 22:
12254 type->alignment = size = targetBits / 8;
12255 type->pointerAlignment = 1;
12256 break;
12257 case 23:
12258 type->alignment = size = targetBits / 8;
12259 type->pointerAlignment = 1;
12260 break;
12261 case 5:
12262 type->alignment = size = sizeof(long);
12263 break;
12264 case 2:
12265 type->alignment = size = sizeof(short);
12266 break;
12267 case 6:
12268 type->alignment = size = sizeof(float);
12269 break;
12270 case 7:
12271 type->alignment = size = sizeof(double);
12272 break;
12273 case 8:
12274 {
12275 struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class ? type->__anon1._class->__anon1.registered : (((void *)0));
12276
12277 if(_class && _class->type == 1)
12278 {
12279 ComputeClassMembers(_class, 0);
12280 type->alignment = _class->structAlignment;
12281 type->pointerAlignment = (unsigned int)_class->pointerAlignment;
12282 size = _class->structSize;
12283 if(type->alignment && size % type->alignment)
12284 size += type->alignment - (size % type->alignment);
12285 }
12286 else if(_class && (_class->type == 3 || _class->type == 4 || _class->type == 2))
12287 {
12288 if(!_class->dataType)
12289 _class->dataType = ProcessTypeString(_class->dataTypeString, 0);
12290 size = type->alignment = ComputeTypeSize(_class->dataType);
12291 }
12292 else
12293 {
12294 size = type->alignment = targetBits / 8;
12295 type->pointerAlignment = 1;
12296 }
12297 break;
12298 }
12299 case 13:
12300 case 19:
12301 size = type->alignment = targetBits / 8;
12302 type->pointerAlignment = 1;
12303 break;
12304 case 12:
12305 if(type->__anon1.__anon4.arraySizeExp)
12306 {
12307 ProcessExpressionType(type->__anon1.__anon4.arraySizeExp);
12308 ComputeExpression(type->__anon1.__anon4.arraySizeExp);
12309 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)))
12310 {
12311 struct Location oldLoc = yylloc;
12312 char expression[10240];
12313
12314 expression[0] = '\0';
12315 type->__anon1.__anon4.arraySizeExp->expType = (((void *)0));
12316 yylloc = type->__anon1.__anon4.arraySizeExp->loc;
12317 if(inCompiler)
12318 PrintExpression(type->__anon1.__anon4.arraySizeExp, expression);
12319 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Array size not constant int (%s)\n", (((void *)0))), expression);
12320 yylloc = oldLoc;
12321 }
12322 GetInt(type->__anon1.__anon4.arraySizeExp, &type->__anon1.__anon4.arraySize);
12323 }
12324 else if(type->__anon1.__anon4.enumClass)
12325 {
12326 if(type->__anon1.__anon4.enumClass && type->__anon1.__anon4.enumClass->__anon1.registered && type->__anon1.__anon4.enumClass->__anon1.registered->type == 4)
12327 {
12328 type->__anon1.__anon4.arraySize = (int)__ecereNameSpace__ecere__com__eClass_GetProperty(type->__anon1.__anon4.enumClass->__anon1.registered, "enumSize");
12329 }
12330 else
12331 type->__anon1.__anon4.arraySize = 0;
12332 }
12333 else
12334 {
12335 type->__anon1.__anon4.arraySize = 0;
12336 }
12337 size = ComputeTypeSize(type->__anon1.type) * type->__anon1.__anon4.arraySize;
12338 if(type->__anon1.type)
12339 {
12340 type->alignment = type->__anon1.type->alignment;
12341 type->pointerAlignment = type->__anon1.type->pointerAlignment;
12342 }
12343 break;
12344 case 9:
12345 {
12346 if(!type->__anon1.__anon1.members.first && type->__anon1.__anon1.enumName)
12347 {
12348 struct Symbol * symbol = FindStruct(curContext, type->__anon1.__anon1.enumName);
12349
12350 if(symbol && symbol->type)
12351 {
12352 ComputeTypeSize(symbol->type);
12353 size = symbol->type->size;
12354 }
12355 }
12356 else
12357 {
12358 struct Type * member;
12359
12360 for(member = type->__anon1.__anon1.members.first; member; member = member->next)
12361 {
12362 int __simpleStruct0, __simpleStruct1;
12363 unsigned int addSize = ComputeTypeSize(member);
12364
12365 member->offset = size;
12366 if(member->alignment && size % member->alignment)
12367 member->offset += member->alignment - (size % member->alignment);
12368 size = member->offset;
12369 if(member->pointerAlignment && type->size <= 4)
12370 type->pointerAlignment = 1;
12371 else if(!member->pointerAlignment && member->alignment >= 8)
12372 type->pointerAlignment = 0;
12373 type->alignment = (__simpleStruct0 = type->alignment, __simpleStruct1 = member->alignment, (__simpleStruct0 > __simpleStruct1) ? __simpleStruct0 : __simpleStruct1);
12374 size += addSize;
12375 }
12376 if(type->alignment && size % type->alignment)
12377 size += type->alignment - (size % type->alignment);
12378 }
12379 break;
12380 }
12381 case 10:
12382 {
12383 if(!type->__anon1.__anon1.members.first && type->__anon1.__anon1.enumName)
12384 {
12385 struct Symbol * symbol = FindStruct(curContext, type->__anon1.__anon1.enumName);
12386
12387 if(symbol && symbol->type)
12388 {
12389 ComputeTypeSize(symbol->type);
12390 size = symbol->type->size;
12391 type->alignment = symbol->type->alignment;
12392 }
12393 }
12394 else
12395 {
12396 struct Type * member;
12397
12398 for(member = type->__anon1.__anon1.members.first; member; member = member->next)
12399 {
12400 int __simpleStruct0, __simpleStruct1;
12401 unsigned int addSize = ComputeTypeSize(member);
12402
12403 member->offset = size;
12404 if(member->alignment && size % member->alignment)
12405 member->offset += member->alignment - (size % member->alignment);
12406 size = member->offset;
12407 if(member->pointerAlignment && type->size <= 4)
12408 type->pointerAlignment = 1;
12409 else if(!member->pointerAlignment && member->alignment >= 8)
12410 type->pointerAlignment = 0;
12411 type->alignment = (__simpleStruct0 = type->alignment, __simpleStruct1 = member->alignment, (__simpleStruct0 > __simpleStruct1) ? __simpleStruct0 : __simpleStruct1);
12412 size = ((size > addSize) ? size : addSize);
12413 }
12414 if(type->alignment && size % type->alignment)
12415 size += type->alignment - (size % type->alignment);
12416 }
12417 break;
12418 }
12419 case 20:
12420 {
12421 struct TemplateParameter * param = type->__anon1.templateParameter;
12422 struct Type * baseType = ProcessTemplateParameterType(param);
12423
12424 if(baseType)
12425 {
12426 size = ComputeTypeSize(baseType);
12427 type->alignment = baseType->alignment;
12428 type->pointerAlignment = baseType->pointerAlignment;
12429 }
12430 else
12431 type->alignment = size = sizeof(uint64);
12432 break;
12433 }
12434 case 15:
12435 {
12436 type->alignment = size = sizeof(enum
12437 {
12438 test
12439 });
12440 break;
12441 }
12442 case 21:
12443 {
12444 type->alignment = size = targetBits / 8;
12445 type->pointerAlignment = 1;
12446 break;
12447 }
12448 }
12449 type->size = size;
12450 type->computing = 0;
12451 }
12452 return size;
12453 }
12454
12455 struct External * _DeclareStruct(struct External * neededBy, const char * name, unsigned int skipNoHead, unsigned int needDereference, unsigned int fwdDecl)
12456 {
12457 struct External * external = (((void *)0));
12458 struct Symbol * classSym = FindClass(name);
12459 struct __ecereNameSpace__ecere__sys__OldList * curDeclarations = (((void *)0));
12460
12461 if(!inCompiler || !classSym)
12462 return (((void *)0));
12463 if(classSym->__anon1.registered && (classSym->__anon1.registered->type == 2 || classSym->__anon1.registered->type == 3 || classSym->__anon1.registered->type == 4))
12464 return (((void *)0));
12465 if(!classSym->__anon1.registered || (classSym->__anon1.registered->type == 0 && classSym->__anon1.registered->structSize && classSym->__anon1.registered->base && classSym->__anon1.registered->base->base))
12466 _DeclareStruct(neededBy, "ecere::com::Instance", 0, 1, fwdDecl);
12467 external = classSym->__anon2.__anon1.structExternal;
12468 if(external && external->__anon1.declaration)
12469 {
12470 struct Specifier * spec;
12471
12472 for(spec = external->__anon1.declaration->__anon1.__anon1.specifiers ? (*external->__anon1.declaration->__anon1.__anon1.specifiers).first : (((void *)0)); spec; spec = spec->next)
12473 if(spec->type == 3 || spec->type == 4)
12474 {
12475 curDeclarations = spec->__anon1.__anon2.definitions;
12476 break;
12477 }
12478 }
12479 if(classSym->__anon1.registered && !classSym->declaring && classSym->imported && (!classSym->declaredStructSym || (classSym->__anon1.registered->type == 5 && !skipNoHead && external && !curDeclarations)))
12480 {
12481 struct __ecereNameSpace__ecere__sys__OldList * specifiers, * declarators;
12482 struct __ecereNameSpace__ecere__sys__OldList * declarations = (((void *)0));
12483 char structName[1024];
12484 unsigned int addedPadding = 0;
12485 struct Specifier * curSpec = (((void *)0));
12486
12487 classSym->declaring++;
12488 if(strchr(classSym->string, '<'))
12489 {
12490 if(classSym->__anon1.registered->templateClass)
12491 external = _DeclareStruct(neededBy, classSym->__anon1.registered->templateClass->fullName, skipNoHead, needDereference, fwdDecl);
12492 classSym->declaring--;
12493 return external;
12494 }
12495 structName[0] = 0;
12496 FullClassNameCat(structName, name, 0);
12497 classSym->declaredStructSym = 1;
12498 if(!external || (classSym->__anon1.registered->type == 5 && !skipNoHead && !curDeclarations))
12499 {
12500 unsigned int add = 0;
12501
12502 if(!external)
12503 {
12504 external = MkExternalDeclaration((((void *)0)));
12505 classSym->__anon2.__anon1.structExternal = external;
12506 external->symbol = classSym;
12507 add = 1;
12508 }
12509 if(!skipNoHead)
12510 {
12511 declarations = MkList();
12512 AddMembers(external, declarations, classSym->__anon1.registered, 0, (((void *)0)), classSym->__anon1.registered, &addedPadding);
12513 }
12514 if(external->__anon1.declaration)
12515 {
12516 struct Specifier * spec;
12517
12518 for(spec = external->__anon1.declaration->__anon1.__anon1.specifiers ? (*external->__anon1.declaration->__anon1.__anon1.specifiers).first : (((void *)0)); spec; spec = spec->next)
12519 if(spec->type == 3 || spec->type == 4)
12520 {
12521 curSpec = spec;
12522 curDeclarations = spec->__anon1.__anon2.definitions;
12523 break;
12524 }
12525 }
12526 if(declarations && (!(*declarations).count || ((*declarations).count == 1 && addedPadding)))
12527 {
12528 FreeList(declarations, (void *)(FreeClassDef));
12529 declarations = (((void *)0));
12530 }
12531 if(classSym->__anon1.registered->type != 5 && !declarations)
12532 {
12533 FreeExternal(external);
12534 external = (((void *)0));
12535 classSym->__anon2.__anon1.structExternal = (((void *)0));
12536 }
12537 else
12538 {
12539 if(curSpec)
12540 curSpec->__anon1.__anon2.definitions = declarations;
12541 else
12542 {
12543 specifiers = MkList();
12544 declarators = MkList();
12545 ListAdd(specifiers, MkStructOrUnion(3, MkIdentifier(structName), declarations));
12546 external->__anon1.declaration = MkDeclaration(specifiers, declarators);
12547 }
12548 if(add)
12549 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add((&*ast), external);
12550 }
12551 }
12552 classSym->declaring--;
12553 }
12554 else if(!classSym->declaredStructSym && classSym->__anon2.__anon1.structExternal)
12555 {
12556 classSym->declaredStructSym = 1;
12557 if(classSym->__anon1.registered)
12558 DeclareMembers(classSym->__anon2.__anon1.structExternal, classSym->__anon1.registered, 0);
12559 if(classSym->__anon2.__anon1.structExternal->__anon1.declaration && classSym->__anon2.__anon1.structExternal->__anon1.declaration->__anon1.__anon1.specifiers)
12560 {
12561 struct Specifier * spec;
12562
12563 for(spec = (*classSym->__anon2.__anon1.structExternal->__anon1.declaration->__anon1.__anon1.specifiers).first; spec; spec = spec->next)
12564 {
12565 if(spec->__anon1.__anon2.definitions)
12566 IdentifyAnonStructs(spec->__anon1.__anon2.definitions);
12567 }
12568 }
12569 }
12570 if(inCompiler && neededBy && (external || !classSym->imported))
12571 {
12572 if(!external)
12573 {
12574 classSym->__anon2.__anon1.structExternal = external = MkExternalDeclaration((((void *)0)));
12575 external->symbol = classSym;
12576 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add((&*ast), external);
12577 }
12578 if(reachedPass15 && !external->__anon1.declaration && classSym->__anon1.registered && classSym->__anon1.registered->type == 5)
12579 {
12580 char structName[1024];
12581 struct __ecereNameSpace__ecere__sys__OldList * specifiers, * declarators;
12582
12583 structName[0] = 0;
12584 FullClassNameCat(structName, name, 0);
12585 specifiers = MkList();
12586 declarators = MkList();
12587 ListAdd(specifiers, MkStructOrUnion(3, MkIdentifier(structName), (((void *)0))));
12588 external->__anon1.declaration = MkDeclaration(specifiers, declarators);
12589 }
12590 if(fwdDecl)
12591 {
12592 struct External * e = external->fwdDecl ? external->fwdDecl : external;
12593
12594 if(((struct __ecereNameSpace__ecere__com__LinkList *)(((char *)e->incoming + 0 + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->count)
12595 __ecereMethod_External_CreateUniqueEdge(neededBy, e, !needDereference && !external->fwdDecl);
12596 }
12597 else
12598 __ecereMethod_External_CreateUniqueEdge(neededBy, external, !needDereference);
12599 }
12600 return external;
12601 }
12602
12603 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)
12604 {
12605 struct Identifier * ident = member->identifiers ? (*member->identifiers).first : (((void *)0));
12606 unsigned int found = 0;
12607 struct __ecereNameSpace__ecere__com__DataMember * dataMember = (((void *)0));
12608 struct __ecereNameSpace__ecere__com__Method * method = (((void *)0));
12609 unsigned int freeType = 0;
12610
12611 yylloc = member->loc;
12612 if(!ident)
12613 {
12614 if(curMember)
12615 {
12616 __ecereNameSpace__ecere__com__eClass_FindNextMember(_class, curClass, curMember, subMemberStack, subMemberStackPos);
12617 if(*curMember)
12618 {
12619 found = 1;
12620 dataMember = *curMember;
12621 }
12622 }
12623 }
12624 else
12625 {
12626 struct __ecereNameSpace__ecere__com__DataMember * thisMember = (struct __ecereNameSpace__ecere__com__DataMember *)__ecereNameSpace__ecere__com__eClass_FindProperty(_class, ident->string, privateModule);
12627 struct __ecereNameSpace__ecere__com__DataMember * _subMemberStack[256];
12628 int _subMemberStackPos = 0;
12629
12630 if(!thisMember)
12631 thisMember = __ecereNameSpace__ecere__com__eClass_FindDataMember(_class, ident->string, privateModule, _subMemberStack, &_subMemberStackPos);
12632 if(thisMember)
12633 {
12634 dataMember = thisMember;
12635 if(curMember && thisMember->memberAccess == 1)
12636 {
12637 *curMember = thisMember;
12638 *curClass = thisMember->_class;
12639 memcpy(subMemberStack, _subMemberStack, sizeof(struct __ecereNameSpace__ecere__com__DataMember *) * _subMemberStackPos);
12640 *subMemberStackPos = _subMemberStackPos;
12641 }
12642 found = 1;
12643 }
12644 else
12645 {
12646 method = __ecereNameSpace__ecere__com__eClass_FindMethod(_class, ident->string, privateModule);
12647 if(method && method->type == 1)
12648 found = 1;
12649 else
12650 method = (((void *)0));
12651 }
12652 }
12653 if(found)
12654 {
12655 struct Type * type = (((void *)0));
12656
12657 if(dataMember)
12658 {
12659 if(!dataMember->dataType && dataMember->dataTypeString)
12660 {
12661 struct Context * context = SetupTemplatesContext(_class);
12662
12663 dataMember->dataType = ProcessTypeString(dataMember->dataTypeString, 0);
12664 FinishTemplatesContext(context);
12665 }
12666 type = dataMember->dataType;
12667 }
12668 else if(method)
12669 {
12670 if(!method->dataType)
12671 ProcessMethodType(method);
12672 type = method->dataType;
12673 }
12674 if(ident && ident->next)
12675 {
12676 for(ident = ident->next; ident && type; ident = ident->next)
12677 {
12678 if(type->kind == 8)
12679 {
12680 dataMember = (struct __ecereNameSpace__ecere__com__DataMember *)__ecereNameSpace__ecere__com__eClass_FindProperty(type->__anon1._class->__anon1.registered, ident->string, privateModule);
12681 if(!dataMember)
12682 dataMember = __ecereNameSpace__ecere__com__eClass_FindDataMember(type->__anon1._class->__anon1.registered, ident->string, privateModule, (((void *)0)), (((void *)0)));
12683 if(dataMember)
12684 type = dataMember->dataType;
12685 }
12686 else if(type->kind == 9 || type->kind == 10)
12687 {
12688 struct Type * memberType;
12689
12690 for(memberType = type->__anon1.__anon1.members.first; memberType; memberType = memberType->next)
12691 {
12692 if(!strcmp(memberType->name, ident->string))
12693 {
12694 type = memberType;
12695 break;
12696 }
12697 }
12698 }
12699 }
12700 }
12701 if(type && type->kind == 20 && type->__anon1.templateParameter->type == 0 && _class->templateArgs)
12702 {
12703 int id = 0;
12704 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * curParam = (((void *)0));
12705 struct __ecereNameSpace__ecere__com__Class * sClass;
12706
12707 for(sClass = _class; sClass; sClass = sClass->base)
12708 {
12709 id = 0;
12710 if(sClass->templateClass)
12711 sClass = sClass->templateClass;
12712 for(curParam = sClass->templateParams.first; curParam; curParam = curParam->next)
12713 {
12714 if(curParam->type == 0 && !strcmp(type->__anon1.templateParameter->identifier->string, curParam->name))
12715 {
12716 for(sClass = sClass->base; sClass; sClass = sClass->base)
12717 {
12718 if(sClass->templateClass)
12719 sClass = sClass->templateClass;
12720 id += sClass->templateParams.count;
12721 }
12722 break;
12723 }
12724 id++;
12725 }
12726 if(curParam)
12727 break;
12728 }
12729 if(curParam)
12730 {
12731 struct __ecereNameSpace__ecere__com__ClassTemplateArgument arg = _class->templateArgs[id];
12732
12733 if(arg.__anon1.__anon1.dataTypeString)
12734 {
12735 unsigned int constant = type->constant;
12736
12737 type = ProcessTypeString(arg.__anon1.__anon1.dataTypeString, 0);
12738 if(type->kind == 8 && constant)
12739 type->constant = 1;
12740 else if(type->kind == 13)
12741 {
12742 struct Type * t = type->__anon1.type;
12743
12744 while(t->kind == 13)
12745 t = t->__anon1.type;
12746 if(constant)
12747 t->constant = constant;
12748 }
12749 freeType = 1;
12750 if(type && _class->templateClass)
12751 type->passAsTemplate = 1;
12752 if(type)
12753 {
12754 }
12755 }
12756 }
12757 }
12758 if(type && type->kind == 8 && type->__anon1._class && type->__anon1._class->__anon1.registered && strchr(type->__anon1._class->__anon1.registered->fullName, '<'))
12759 {
12760 struct __ecereNameSpace__ecere__com__Class * expClass = type->__anon1._class->__anon1.registered;
12761 struct __ecereNameSpace__ecere__com__Class * cClass = (((void *)0));
12762 int paramCount = 0;
12763 int lastParam = -1;
12764 char templateString[1024];
12765 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * param;
12766
12767 sprintf(templateString, "%s<", expClass->templateClass->fullName);
12768 for(cClass = expClass; cClass; cClass = cClass->base)
12769 {
12770 int p = 0;
12771
12772 if(cClass->templateClass)
12773 cClass = cClass->templateClass;
12774 for(param = cClass->templateParams.first; param; param = param->next)
12775 {
12776 int id = p;
12777 struct __ecereNameSpace__ecere__com__Class * sClass;
12778 struct __ecereNameSpace__ecere__com__ClassTemplateArgument arg;
12779
12780 for(sClass = cClass->base; sClass; sClass = sClass->base)
12781 {
12782 if(sClass->templateClass)
12783 sClass = sClass->templateClass;
12784 id += sClass->templateParams.count;
12785 }
12786 arg = expClass->templateArgs[id];
12787 for(sClass = _class; sClass; sClass = sClass->base)
12788 {
12789 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * cParam;
12790 int p = 0;
12791 struct __ecereNameSpace__ecere__com__Class * nextClass;
12792
12793 if(sClass->templateClass)
12794 sClass = sClass->templateClass;
12795 for(nextClass = sClass->base; nextClass; nextClass = nextClass->base)
12796 {
12797 if(nextClass->templateClass)
12798 nextClass = nextClass->templateClass;
12799 p += nextClass->templateParams.count;
12800 }
12801 for(cParam = sClass->templateParams.first; cParam; cParam = cParam->next, p++)
12802 {
12803 if(cParam->type == 0 && arg.__anon1.__anon1.dataTypeString && !strcmp(cParam->name, arg.__anon1.__anon1.dataTypeString))
12804 {
12805 if(_class->templateArgs && arg.__anon1.__anon1.dataTypeString && (!param->defaultArg.__anon1.__anon1.dataTypeString || strcmp(arg.__anon1.__anon1.dataTypeString, param->defaultArg.__anon1.__anon1.dataTypeString)))
12806 {
12807 arg.__anon1.__anon1.dataTypeString = _class->templateArgs[p].__anon1.__anon1.dataTypeString;
12808 arg.__anon1.__anon1.dataTypeClass = _class->templateArgs[p].__anon1.__anon1.dataTypeClass;
12809 break;
12810 }
12811 }
12812 }
12813 }
12814 {
12815 char argument[256];
12816
12817 argument[0] = '\0';
12818 switch(param->type)
12819 {
12820 case 2:
12821 {
12822 char expString[1024];
12823 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
12824 struct Declarator * decl = SpecDeclFromString(param->__anon1.dataTypeString, specs, (((void *)0)));
12825 struct Expression * exp;
12826 char * string = PrintHexUInt64(arg.__anon1.expression.__anon1.ui64);
12827
12828 exp = MkExpCast(MkTypeName(specs, decl), MkExpConstant(string));
12829 (__ecereNameSpace__ecere__com__eSystem_Delete(string), string = 0);
12830 ProcessExpressionType(exp);
12831 ComputeExpression(exp);
12832 expString[0] = '\0';
12833 PrintExpression(exp, expString);
12834 strcat(argument, expString);
12835 FreeExpression(exp);
12836 break;
12837 }
12838 case 1:
12839 {
12840 strcat(argument, arg.__anon1.__anon2.__anon1.member->name);
12841 break;
12842 }
12843 case 0:
12844 {
12845 if(arg.__anon1.__anon1.dataTypeString && (!param->defaultArg.__anon1.__anon1.dataTypeString || strcmp(arg.__anon1.__anon1.dataTypeString, param->defaultArg.__anon1.__anon1.dataTypeString)))
12846 strcat(argument, arg.__anon1.__anon1.dataTypeString);
12847 break;
12848 }
12849 }
12850 if(argument[0])
12851 {
12852 if(paramCount)
12853 strcat(templateString, ", ");
12854 if(lastParam != p - 1)
12855 {
12856 strcat(templateString, param->name);
12857 strcat(templateString, " = ");
12858 }
12859 strcat(templateString, argument);
12860 paramCount++;
12861 lastParam = p;
12862 }
12863 p++;
12864 }
12865 }
12866 }
12867 {
12868 int len = strlen(templateString);
12869
12870 if(templateString[len - 1] == '<')
12871 len--;
12872 else
12873 {
12874 if(templateString[len - 1] == '>')
12875 templateString[len++] = ' ';
12876 templateString[len++] = '>';
12877 }
12878 templateString[len++] = '\0';
12879 }
12880 {
12881 struct Context * context = SetupTemplatesContext(_class);
12882
12883 if(freeType)
12884 FreeType(type);
12885 type = ProcessTypeString(templateString, 0);
12886 freeType = 1;
12887 FinishTemplatesContext(context);
12888 }
12889 }
12890 if(method && member->initializer && member->initializer->type == 0 && member->initializer->__anon1.exp)
12891 {
12892 ProcessExpressionType(member->initializer->__anon1.exp);
12893 if(!member->initializer->__anon1.exp->expType)
12894 {
12895 if(inCompiler)
12896 {
12897 char expString[10240];
12898
12899 expString[0] = '\0';
12900 PrintExpression(member->initializer->__anon1.exp, expString);
12901 __ecereNameSpace__ecere__sys__ChangeCh(expString, '\n', ' ');
12902 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "unresolved symbol used as an instance method %s\n", (((void *)0))), expString);
12903 }
12904 }
12905 else if(!MatchTypes(member->initializer->__anon1.exp->expType, type, (((void *)0)), (((void *)0)), _class, 1, 1, 0, 0, 1))
12906 {
12907 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "incompatible instance method %s\n", (((void *)0))), ident->string);
12908 }
12909 }
12910 else if(member->initializer)
12911 {
12912 ProcessInitializer(member->initializer, type);
12913 }
12914 if(freeType)
12915 FreeType(type);
12916 }
12917 else
12918 {
12919 if(_class && _class->type == 3)
12920 {
12921 if(member->initializer)
12922 {
12923 struct Type * type = MkClassType(_class->fullName);
12924
12925 ProcessInitializer(member->initializer, type);
12926 FreeType(type);
12927 }
12928 }
12929 else
12930 {
12931 if(member->initializer)
12932 {
12933 ProcessInitializer(member->initializer, (((void *)0)));
12934 }
12935 if(ident)
12936 {
12937 if(method)
12938 {
12939 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "couldn't find virtual method %s in class %s\n", (((void *)0))), ident->string, _class->fullName);
12940 }
12941 else if(_class)
12942 {
12943 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "couldn't find member %s in class %s\n", (((void *)0))), ident->string, _class->fullName);
12944 if(inCompiler)
12945 __ecereNameSpace__ecere__com__eClass_AddDataMember(_class, ident->string, "int", 0, 0, 1);
12946 }
12947 }
12948 else if(_class)
12949 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "too many initializers for instantiation of class %s\n", (((void *)0))), _class->fullName);
12950 }
12951 }
12952 }
12953
12954 unsigned int MatchWithEnums_NameSpace(struct __ecereNameSpace__ecere__com__NameSpace * nameSpace, struct Expression * sourceExp, struct Type * dest, char * string, struct __ecereNameSpace__ecere__sys__OldList * conversions)
12955 {
12956 struct __ecereNameSpace__ecere__com__BTNamedLink * link;
12957
12958 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)))
12959 {
12960 struct __ecereNameSpace__ecere__com__Class * _class = link->data;
12961
12962 if(_class->type == 4)
12963 {
12964 struct __ecereNameSpace__ecere__sys__OldList converts =
12965 {
12966 0, 0, 0, 0, 0
12967 };
12968 struct Type * type = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
12969
12970 type->kind = 8;
12971 if(!_class->symbol)
12972 _class->symbol = FindClass(_class->fullName);
12973 type->__anon1._class = _class->symbol;
12974 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))
12975 {
12976 struct __ecereNameSpace__ecere__sys__NamedLink64 * value;
12977 struct __ecereNameSpace__ecere__com__Class * enumClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "enum");
12978
12979 if(enumClass)
12980 {
12981 struct __ecereNameSpace__ecere__com__Class * baseClass;
12982
12983 for(baseClass = _class; baseClass && baseClass->type == 4; baseClass = baseClass->base)
12984 {
12985 struct __ecereNameSpace__ecere__com__EnumClassData * e = (baseClass ? ((void *)(((char *)baseClass->data) + enumClass->offsetClass)) : (((void *)0)));
12986
12987 for(value = e->values.first; value; value = value->next)
12988 {
12989 if(!strcmp(value->name, string))
12990 break;
12991 }
12992 if(value)
12993 {
12994 FreeType(sourceExp->expType);
12995 sourceExp->isConstant = 1;
12996 sourceExp->expType = MkClassType(baseClass->fullName);
12997 if(inCompiler || inPreCompiler || inDebugger)
12998 {
12999 char constant[256];
13000
13001 FreeExpContents(sourceExp);
13002 sourceExp->type = 2;
13003 if(!strcmp(baseClass->dataTypeString, "int") || !strcmp(baseClass->dataTypeString, "int64") || !strcmp(baseClass->dataTypeString, "short") || !strcmp(baseClass->dataTypeString, "char"))
13004 sprintf(constant, ((__runtimePlatform == 1) ? "%I64d" : "%lld"), value->data);
13005 else
13006 sprintf(constant, ((__runtimePlatform == 1) ? "0x%I64XLL" : "0x%llXLL"), value->data);
13007 sourceExp->__anon1.__anon1.constant = __ecereNameSpace__ecere__sys__CopyString(constant);
13008 }
13009 while(converts.first)
13010 {
13011 struct Conversion * convert = converts.first;
13012
13013 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove(&converts, convert);
13014 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(conversions, convert);
13015 }
13016 ((type ? __extension__ ({
13017 void * __ecerePtrToDelete = (type);
13018
13019 __ecereClass_Type->Destructor ? __ecereClass_Type->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete);
13020 }) : 0), type = 0);
13021 return 1;
13022 }
13023 }
13024 }
13025 }
13026 if(converts.first)
13027 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Free(&converts, (void *)(FreeConvert));
13028 ((type ? __extension__ ({
13029 void * __ecerePtrToDelete = (type);
13030
13031 __ecereClass_Type->Destructor ? __ecereClass_Type->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete);
13032 }) : 0), type = 0);
13033 }
13034 }
13035 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)))
13036 if(MatchWithEnums_NameSpace(nameSpace, sourceExp, dest, string, conversions))
13037 return 1;
13038 return 0;
13039 }
13040
13041 void ComputeExpression(struct Expression * exp)
13042 {
13043 switch(exp->type)
13044 {
13045 case 0:
13046 {
13047 struct Identifier * id = exp->__anon1.__anon1.identifier;
13048
13049 if(id && exp->isConstant && !inCompiler && !inPreCompiler && !inDebugger)
13050 {
13051 struct __ecereNameSpace__ecere__com__Class * c = (exp->expType && exp->expType->kind == 8 && exp->expType->__anon1._class) ? exp->expType->__anon1._class->__anon1.registered : (((void *)0));
13052
13053 if(c && c->type == 4)
13054 {
13055 struct __ecereNameSpace__ecere__com__Class * enumClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "enum");
13056
13057 if(enumClass)
13058 {
13059 struct __ecereNameSpace__ecere__sys__NamedLink64 * value;
13060 struct __ecereNameSpace__ecere__com__EnumClassData * e = (c ? ((void *)(((char *)c->data) + enumClass->offsetClass)) : (((void *)0)));
13061
13062 for(value = e->values.first; value; value = value->next)
13063 {
13064 if(!strcmp(value->name, id->string))
13065 break;
13066 }
13067 if(value)
13068 {
13069 const char * dts = c->dataTypeString;
13070
13071 FreeExpContents(exp);
13072 exp->type = 2;
13073 exp->__anon1.__anon1.constant = (dts && (!strcmp(dts, "int") || !strcmp(dts, "int64") || !strcmp(dts, "short") || !strcmp(dts, "char"))) ? PrintInt64(value->data) : PrintUInt64(value->data);
13074 }
13075 }
13076 }
13077 }
13078 break;
13079 }
13080 case 1:
13081 {
13082 ComputeInstantiation(exp);
13083 break;
13084 }
13085 case 4:
13086 {
13087 struct Expression * exp1, * exp2 = (((void *)0));
13088 struct Operand op1 =
13089 {
13090 0, 0, 0,
13091 .__anon1 = {
13092 .c = 0
13093 },
13094 {
13095 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
13096 }
13097 };
13098 struct Operand op2 =
13099 {
13100 0, 0, 0,
13101 .__anon1 = {
13102 .c = 0
13103 },
13104 {
13105 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
13106 }
13107 };
13108
13109 if(exp->__anon1.op.exp2)
13110 {
13111 struct Expression * e = exp->__anon1.op.exp2;
13112
13113 while((e->type == 5 || e->type == 32 || e->type == 23) && e->__anon1.list)
13114 {
13115 if(e->type == 5 || e->type == 32 || e->type == 23)
13116 {
13117 if(e->type == 23)
13118 e = (*((struct Statement *)(*e->__anon1.compound->__anon1.compound.statements).last)->__anon1.expressions).last;
13119 else
13120 e = (*e->__anon1.list).last;
13121 }
13122 }
13123 if(exp->__anon1.op.op == 261 && e && e->expType)
13124 {
13125 if(e->type == 3 && e->__anon1.__anon2.string)
13126 {
13127 char * string = e->__anon1.__anon2.string;
13128 int len = strlen(string);
13129 char * tmp = __ecereNameSpace__ecere__com__eSystem_New(sizeof(char) * (len - 2 + 1));
13130
13131 len = UnescapeString(tmp, string + 1, len - 2);
13132 (__ecereNameSpace__ecere__com__eSystem_Delete(tmp), tmp = 0);
13133 FreeExpContents(exp);
13134 exp->type = 2;
13135 exp->__anon1.__anon1.constant = PrintUInt(len + 1);
13136 }
13137 else
13138 {
13139 struct Type * type = e->expType;
13140
13141 type->refCount++;
13142 FreeExpContents(exp);
13143 exp->type = 2;
13144 exp->__anon1.__anon1.constant = PrintUInt(ComputeTypeSize(type));
13145 FreeType(type);
13146 }
13147 break;
13148 }
13149 else
13150 ComputeExpression(exp->__anon1.op.exp2);
13151 }
13152 if(exp->__anon1.op.exp1)
13153 {
13154 ComputeExpression(exp->__anon1.op.exp1);
13155 exp1 = exp->__anon1.op.exp1;
13156 exp2 = exp->__anon1.op.exp2;
13157 op1 = GetOperand(exp1);
13158 if(op1.type)
13159 op1.type->refCount++;
13160 if(exp2)
13161 {
13162 op2 = GetOperand(exp2);
13163 if(op2.type)
13164 op2.type->refCount++;
13165 }
13166 }
13167 else
13168 {
13169 exp1 = exp->__anon1.op.exp2;
13170 op1 = GetOperand(exp1);
13171 if(op1.type)
13172 op1.type->refCount++;
13173 }
13174 CallOperator(exp, exp1, exp2, &op1, &op2);
13175 if(op1.type)
13176 FreeType(op1.type);
13177 if(op2.type)
13178 FreeType(op2.type);
13179 break;
13180 }
13181 case 5:
13182 case 32:
13183 {
13184 struct Expression * e, * n;
13185
13186 for(e = (*exp->__anon1.list).first; e; e = n)
13187 {
13188 n = e->next;
13189 if(!n)
13190 {
13191 struct __ecereNameSpace__ecere__sys__OldList * list = exp->__anon1.list;
13192 struct Expression * prev = exp->prev;
13193 struct Expression * next = exp->next;
13194
13195 ComputeExpression(e);
13196 FreeType(exp->expType);
13197 FreeType(exp->destType);
13198 *exp = *e;
13199 exp->prev = prev;
13200 exp->next = next;
13201 ((e ? __extension__ ({
13202 void * __ecerePtrToDelete = (e);
13203
13204 __ecereClass_Expression->Destructor ? __ecereClass_Expression->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete);
13205 }) : 0), e = 0);
13206 (__ecereNameSpace__ecere__com__eSystem_Delete(list), list = 0);
13207 }
13208 else
13209 {
13210 FreeExpression(e);
13211 }
13212 }
13213 break;
13214 }
13215 case 8:
13216 {
13217 struct Expression * memberExp = exp->__anon1.member.exp;
13218 struct Identifier * memberID = exp->__anon1.member.member;
13219 struct Type * type;
13220
13221 ComputeExpression(exp->__anon1.member.exp);
13222 type = exp->__anon1.member.exp->expType;
13223 if(type)
13224 {
13225 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)));
13226 struct __ecereNameSpace__ecere__com__Property * prop = (((void *)0));
13227 struct __ecereNameSpace__ecere__com__DataMember * member = (((void *)0));
13228 struct __ecereNameSpace__ecere__com__Class * convertTo = (((void *)0));
13229
13230 if(type->kind == 19 && exp->__anon1.member.exp->type == 24)
13231 _class = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "ecere::com::Class");
13232 if(!_class)
13233 {
13234 char string[256];
13235 struct Symbol * classSym;
13236
13237 string[0] = '\0';
13238 PrintTypeNoConst(type, string, 0, 1);
13239 classSym = FindClass(string);
13240 _class = classSym ? classSym->__anon1.registered : (((void *)0));
13241 }
13242 if(exp->__anon1.member.member)
13243 {
13244 prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, exp->__anon1.member.member->string, privateModule);
13245 if(!prop)
13246 member = __ecereNameSpace__ecere__com__eClass_FindDataMember(_class, exp->__anon1.member.member->string, privateModule, (((void *)0)), (((void *)0)));
13247 }
13248 if(!prop && !member && _class && exp->__anon1.member.member)
13249 {
13250 struct Symbol * classSym = FindClass(exp->__anon1.member.member->string);
13251
13252 convertTo = _class;
13253 _class = classSym ? classSym->__anon1.registered : (((void *)0));
13254 prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, convertTo->fullName, privateModule);
13255 }
13256 if(prop)
13257 {
13258 if(prop->compiled)
13259 {
13260 struct Type * type = prop->dataType;
13261
13262 if(_class->type == 3)
13263 {
13264 if(type->kind == 8)
13265 {
13266 struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class->__anon1.registered;
13267
13268 if(_class->type == 3)
13269 {
13270 if(!_class->dataType)
13271 _class->dataType = ProcessTypeString(_class->dataTypeString, 0);
13272 type = _class->dataType;
13273 }
13274 }
13275 switch(type->kind)
13276 {
13277 case 6:
13278 {
13279 float value;
13280 float (* Get)(float) = (void *)prop->Get;
13281
13282 GetFloat(exp->__anon1.member.exp, &value);
13283 exp->__anon1.__anon1.constant = PrintFloat(Get ? Get(value) : value);
13284 exp->type = 2;
13285 break;
13286 }
13287 case 7:
13288 {
13289 double value;
13290 double (* Get)(double);
13291
13292 GetDouble(exp->__anon1.member.exp, &value);
13293 if(convertTo)
13294 Get = (void *)prop->Set;
13295 else
13296 Get = (void *)prop->Get;
13297 exp->__anon1.__anon1.constant = PrintDouble(Get ? Get(value) : value);
13298 exp->type = 2;
13299 break;
13300 }
13301 }
13302 }
13303 else
13304 {
13305 if(convertTo)
13306 {
13307 struct Expression * value = exp->__anon1.member.exp;
13308 struct Type * type;
13309
13310 if(!prop->dataType)
13311 ProcessPropertyType(prop);
13312 type = prop->dataType;
13313 if(!type)
13314 {
13315 }
13316 else if(_class->type == 1)
13317 {
13318 switch(type->kind)
13319 {
13320 case 8:
13321 {
13322 struct __ecereNameSpace__ecere__com__Class * propertyClass = type->__anon1._class->__anon1.registered;
13323
13324 if(propertyClass->type == 1 && value->type == 1)
13325 {
13326 void (* Set)(void *, void *) = (void *)prop->Set;
13327
13328 exp->__anon1.instance = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Instantiation);
13329 exp->__anon1.instance->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize));
13330 exp->__anon1.instance->_class = MkSpecifierName(_class->fullName);
13331 exp->__anon1.instance->loc = exp->loc;
13332 exp->type = 1;
13333 Set(exp->__anon1.instance->data, value->__anon1.instance->data);
13334 PopulateInstance(exp->__anon1.instance);
13335 }
13336 break;
13337 }
13338 case 3:
13339 {
13340 int intValue;
13341 void (* Set)(void *, int) = (void *)prop->Set;
13342
13343 exp->__anon1.instance = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Instantiation);
13344 exp->__anon1.instance->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize));
13345 exp->__anon1.instance->_class = MkSpecifierName(_class->fullName);
13346 exp->__anon1.instance->loc = exp->loc;
13347 exp->type = 1;
13348 GetInt(value, &intValue);
13349 Set(exp->__anon1.instance->data, intValue);
13350 PopulateInstance(exp->__anon1.instance);
13351 break;
13352 }
13353 case 4:
13354 {
13355 long long intValue;
13356 void (* Set)(void *, long long) = (void *)prop->Set;
13357
13358 exp->__anon1.instance = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Instantiation);
13359 exp->__anon1.instance->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize));
13360 exp->__anon1.instance->_class = MkSpecifierName(_class->fullName);
13361 exp->__anon1.instance->loc = exp->loc;
13362 exp->type = 1;
13363 GetInt64(value, &intValue);
13364 Set(exp->__anon1.instance->data, intValue);
13365 PopulateInstance(exp->__anon1.instance);
13366 break;
13367 }
13368 case 22:
13369 {
13370 intptr_t intValue;
13371 void (* Set)(void *, intptr_t) = (void *)prop->Set;
13372
13373 exp->__anon1.instance = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Instantiation);
13374 exp->__anon1.instance->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize));
13375 exp->__anon1.instance->_class = MkSpecifierName(_class->fullName);
13376 exp->__anon1.instance->loc = exp->loc;
13377 exp->type = 1;
13378 GetIntPtr(value, &intValue);
13379 Set(exp->__anon1.instance->data, intValue);
13380 PopulateInstance(exp->__anon1.instance);
13381 break;
13382 }
13383 case 23:
13384 {
13385 ssize_t intValue;
13386 void (* Set)(void *, ssize_t) = (void *)prop->Set;
13387
13388 exp->__anon1.instance = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Instantiation);
13389 exp->__anon1.instance->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize));
13390 exp->__anon1.instance->_class = MkSpecifierName(_class->fullName);
13391 exp->__anon1.instance->loc = exp->loc;
13392 exp->type = 1;
13393 GetIntSize(value, &intValue);
13394 Set(exp->__anon1.instance->data, intValue);
13395 PopulateInstance(exp->__anon1.instance);
13396 break;
13397 }
13398 case 6:
13399 {
13400 float floatValue;
13401 void (* Set)(void *, float) = (void *)prop->Set;
13402
13403 exp->__anon1.instance = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Instantiation);
13404 exp->__anon1.instance->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize));
13405 exp->__anon1.instance->_class = MkSpecifierName(_class->fullName);
13406 exp->__anon1.instance->loc = exp->loc;
13407 exp->type = 1;
13408 GetFloat(value, &floatValue);
13409 Set(exp->__anon1.instance->data, floatValue);
13410 PopulateInstance(exp->__anon1.instance);
13411 break;
13412 }
13413 case 7:
13414 {
13415 double doubleValue;
13416 void (* Set)(void *, double) = (void *)prop->Set;
13417
13418 exp->__anon1.instance = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Instantiation);
13419 exp->__anon1.instance->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize));
13420 exp->__anon1.instance->_class = MkSpecifierName(_class->fullName);
13421 exp->__anon1.instance->loc = exp->loc;
13422 exp->type = 1;
13423 GetDouble(value, &doubleValue);
13424 Set(exp->__anon1.instance->data, doubleValue);
13425 PopulateInstance(exp->__anon1.instance);
13426 break;
13427 }
13428 }
13429 }
13430 else if(_class->type == 2)
13431 {
13432 switch(type->kind)
13433 {
13434 case 8:
13435 {
13436 struct __ecereNameSpace__ecere__com__Class * propertyClass = type->__anon1._class->__anon1.registered;
13437
13438 if(propertyClass->type == 1 && value->__anon1.instance->data)
13439 {
13440 unsigned int (* Set)(void *) = (void *)prop->Set;
13441 unsigned int bits = Set(value->__anon1.instance->data);
13442
13443 exp->__anon1.__anon1.constant = PrintHexUInt(bits);
13444 exp->type = 2;
13445 break;
13446 }
13447 else if(_class->type == 2)
13448 {
13449 unsigned int value;
13450 unsigned int (* Set)(unsigned int) = (void *)prop->Set;
13451 unsigned int bits;
13452
13453 GetUInt(exp->__anon1.member.exp, &value);
13454 bits = Set(value);
13455 exp->__anon1.__anon1.constant = PrintHexUInt(bits);
13456 exp->type = 2;
13457 }
13458 }
13459 }
13460 }
13461 }
13462 else
13463 {
13464 if(_class->type == 2)
13465 {
13466 unsigned int value;
13467
13468 GetUInt(exp->__anon1.member.exp, &value);
13469 switch(type->kind)
13470 {
13471 case 8:
13472 {
13473 struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class->__anon1.registered;
13474
13475 if(_class->type == 1)
13476 {
13477 void (* Get)(unsigned int, void *) = (void *)prop->Get;
13478
13479 exp->__anon1.instance = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Instantiation);
13480 exp->__anon1.instance->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize));
13481 exp->__anon1.instance->_class = MkSpecifierName(_class->fullName);
13482 exp->__anon1.instance->loc = exp->loc;
13483 exp->type = 1;
13484 Get(value, exp->__anon1.instance->data);
13485 PopulateInstance(exp->__anon1.instance);
13486 }
13487 else if(_class->type == 2)
13488 {
13489 unsigned int (* Get)(unsigned int) = (void *)prop->Get;
13490 uint64 bits = Get(value);
13491
13492 exp->__anon1.__anon1.constant = PrintHexUInt64(bits);
13493 exp->type = 2;
13494 }
13495 break;
13496 }
13497 }
13498 }
13499 else if(_class->type == 1)
13500 {
13501 unsigned char * value = (exp->__anon1.member.exp->type == 1) ? exp->__anon1.member.exp->__anon1.instance->data : (((void *)0));
13502
13503 switch(type->kind)
13504 {
13505 case 8:
13506 {
13507 struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class->__anon1.registered;
13508
13509 if(_class->type == 1 && value)
13510 {
13511 void (* Get)(void *, void *) = (void *)prop->Get;
13512
13513 exp->__anon1.instance = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Instantiation);
13514 exp->__anon1.instance->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize));
13515 exp->__anon1.instance->_class = MkSpecifierName(_class->fullName);
13516 exp->__anon1.instance->loc = exp->loc;
13517 exp->type = 1;
13518 Get(value, exp->__anon1.instance->data);
13519 PopulateInstance(exp->__anon1.instance);
13520 }
13521 break;
13522 }
13523 }
13524 }
13525 }
13526 }
13527 }
13528 else
13529 {
13530 exp->isConstant = 0;
13531 }
13532 }
13533 else if(member)
13534 {
13535 }
13536 }
13537 if(exp->type != 8)
13538 {
13539 FreeExpression(memberExp);
13540 FreeIdentifier(memberID);
13541 }
13542 break;
13543 }
13544 case 10:
13545 {
13546 struct Type * type = ProcessType(exp->__anon1.typeName->qualifiers, exp->__anon1.typeName->declarator);
13547
13548 FreeExpContents(exp);
13549 exp->__anon1.__anon1.constant = PrintUInt(ComputeTypeSize(type));
13550 exp->type = 2;
13551 FreeType(type);
13552 break;
13553 }
13554 case 15:
13555 {
13556 struct Symbol * classSym = exp->__anon1._class->__anon1.__anon1.symbol;
13557
13558 if(classSym && classSym->__anon1.registered)
13559 {
13560 if(classSym->__anon1.registered->fixed)
13561 {
13562 FreeSpecifier(exp->__anon1._class);
13563 exp->__anon1.__anon1.constant = PrintUInt(classSym->__anon1.registered->templateClass ? classSym->__anon1.registered->templateClass->structSize : classSym->__anon1.registered->structSize);
13564 exp->type = 2;
13565 }
13566 else
13567 {
13568 char className[1024];
13569
13570 strcpy(className, "__ecereClass_");
13571 FullClassNameCat(className, classSym->string, 1);
13572 DeclareClass(curExternal, classSym, className);
13573 FreeExpContents(exp);
13574 exp->type = 9;
13575 exp->__anon1.member.exp = MkExpIdentifier(MkIdentifier(className));
13576 exp->__anon1.member.member = MkIdentifier("structSize");
13577 }
13578 }
13579 break;
13580 }
13581 case 11:
13582 {
13583 struct Type * type;
13584 struct Expression * e = exp;
13585
13586 if(exp->type == 11)
13587 {
13588 if(exp->__anon1.cast.exp)
13589 ComputeExpression(exp->__anon1.cast.exp);
13590 e = exp->__anon1.cast.exp;
13591 }
13592 if(e && exp->expType)
13593 {
13594 type = exp->expType;
13595 if(type->kind == 8)
13596 {
13597 struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class->__anon1.registered;
13598
13599 if(_class && (_class->type == 3 || _class->type == 2))
13600 {
13601 if(!_class->dataType)
13602 _class->dataType = ProcessTypeString(_class->dataTypeString, 0);
13603 type = _class->dataType;
13604 }
13605 }
13606 switch(type->kind)
13607 {
13608 case 24:
13609 case 1:
13610 if(type->isSigned)
13611 {
13612 char value = 0;
13613
13614 if(GetChar(e, &value))
13615 {
13616 FreeExpContents(exp);
13617 exp->__anon1.__anon1.constant = PrintChar(value);
13618 exp->type = 2;
13619 }
13620 }
13621 else
13622 {
13623 unsigned char value = 0;
13624
13625 if(GetUChar(e, &value))
13626 {
13627 FreeExpContents(exp);
13628 exp->__anon1.__anon1.constant = PrintUChar(value);
13629 exp->type = 2;
13630 }
13631 }
13632 break;
13633 case 2:
13634 if(type->isSigned)
13635 {
13636 short value = 0;
13637
13638 if(GetShort(e, &value))
13639 {
13640 FreeExpContents(exp);
13641 exp->__anon1.__anon1.constant = PrintShort(value);
13642 exp->type = 2;
13643 }
13644 }
13645 else
13646 {
13647 unsigned short value = 0;
13648
13649 if(GetUShort(e, &value))
13650 {
13651 FreeExpContents(exp);
13652 exp->__anon1.__anon1.constant = PrintUShort(value);
13653 exp->type = 2;
13654 }
13655 }
13656 break;
13657 case 3:
13658 if(type->isSigned)
13659 {
13660 int value = 0;
13661
13662 if(GetInt(e, &value))
13663 {
13664 FreeExpContents(exp);
13665 exp->__anon1.__anon1.constant = PrintInt(value);
13666 exp->type = 2;
13667 }
13668 }
13669 else
13670 {
13671 unsigned int value = 0;
13672
13673 if(GetUInt(e, &value))
13674 {
13675 FreeExpContents(exp);
13676 exp->__anon1.__anon1.constant = PrintUInt(value);
13677 exp->type = 2;
13678 }
13679 }
13680 break;
13681 case 4:
13682 if(type->isSigned)
13683 {
13684 long long value = 0;
13685
13686 if(GetInt64(e, &value))
13687 {
13688 FreeExpContents(exp);
13689 exp->__anon1.__anon1.constant = PrintInt64(value);
13690 exp->type = 2;
13691 }
13692 }
13693 else
13694 {
13695 uint64 value = 0;
13696
13697 if(GetUInt64(e, &value))
13698 {
13699 FreeExpContents(exp);
13700 exp->__anon1.__anon1.constant = PrintUInt64(value);
13701 exp->type = 2;
13702 }
13703 }
13704 break;
13705 case 22:
13706 if(type->isSigned)
13707 {
13708 intptr_t value = 0;
13709
13710 if(GetIntPtr(e, &value))
13711 {
13712 FreeExpContents(exp);
13713 exp->__anon1.__anon1.constant = PrintInt64((long long)value);
13714 exp->type = 2;
13715 }
13716 }
13717 else
13718 {
13719 uintptr_t value = 0;
13720
13721 if(GetUIntPtr(e, &value))
13722 {
13723 FreeExpContents(exp);
13724 exp->__anon1.__anon1.constant = PrintUInt64((uint64)value);
13725 exp->type = 2;
13726 }
13727 }
13728 break;
13729 case 23:
13730 if(type->isSigned)
13731 {
13732 ssize_t value = 0;
13733
13734 if(GetIntSize(e, &value))
13735 {
13736 FreeExpContents(exp);
13737 exp->__anon1.__anon1.constant = PrintInt64((long long)value);
13738 exp->type = 2;
13739 }
13740 }
13741 else
13742 {
13743 size_t value = 0;
13744
13745 if(GetUIntSize(e, &value))
13746 {
13747 FreeExpContents(exp);
13748 exp->__anon1.__anon1.constant = PrintUInt64((uint64)value);
13749 exp->type = 2;
13750 }
13751 }
13752 break;
13753 case 6:
13754 {
13755 float value = 0;
13756
13757 if(GetFloat(e, &value))
13758 {
13759 FreeExpContents(exp);
13760 exp->__anon1.__anon1.constant = PrintFloat(value);
13761 exp->type = 2;
13762 }
13763 break;
13764 }
13765 case 7:
13766 {
13767 double value = 0;
13768
13769 if(GetDouble(e, &value))
13770 {
13771 FreeExpContents(exp);
13772 exp->__anon1.__anon1.constant = PrintDouble(value);
13773 exp->type = 2;
13774 }
13775 break;
13776 }
13777 }
13778 }
13779 break;
13780 }
13781 case 12:
13782 {
13783 struct Operand op1 =
13784 {
13785 0, 0, 0,
13786 .__anon1 = {
13787 .c = 0
13788 },
13789 {
13790 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
13791 }
13792 };
13793 struct Operand op2 =
13794 {
13795 0, 0, 0,
13796 .__anon1 = {
13797 .c = 0
13798 },
13799 {
13800 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
13801 }
13802 };
13803 struct Operand op3 =
13804 {
13805 0, 0, 0,
13806 .__anon1 = {
13807 .c = 0
13808 },
13809 {
13810 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
13811 }
13812 };
13813
13814 if(exp->__anon1.cond.exp)
13815 ComputeExpression((*exp->__anon1.cond.exp).last);
13816 if(exp->__anon1.cond.elseExp)
13817 ComputeExpression(exp->__anon1.cond.elseExp);
13818 if(exp->__anon1.cond.cond)
13819 ComputeExpression(exp->__anon1.cond.cond);
13820 op1 = GetOperand(exp->__anon1.cond.cond);
13821 if(op1.type)
13822 op1.type->refCount++;
13823 op2 = GetOperand((*exp->__anon1.cond.exp).last);
13824 if(op2.type)
13825 op2.type->refCount++;
13826 op3 = GetOperand(exp->__anon1.cond.elseExp);
13827 if(op3.type)
13828 op3.type->refCount++;
13829 if(op1.ops.Cond)
13830 {
13831 FreeExpContents(exp);
13832 op1.ops.Cond(exp, &op1, &op2, &op3);
13833 }
13834 if(op1.type)
13835 FreeType(op1.type);
13836 if(op2.type)
13837 FreeType(op2.type);
13838 if(op3.type)
13839 FreeType(op3.type);
13840 break;
13841 }
13842 }
13843 }
13844
13845 unsigned int MatchWithEnums_Module(struct __ecereNameSpace__ecere__com__Instance * mainModule, struct Expression * sourceExp, struct Type * dest, char * string, struct __ecereNameSpace__ecere__sys__OldList * conversions)
13846 {
13847 struct __ecereNameSpace__ecere__com__Instance * module;
13848
13849 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))
13850 return 1;
13851 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))
13852 return 1;
13853 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))
13854 return 1;
13855 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)
13856 {
13857 if(ModuleVisibility(mainModule, module) && MatchWithEnums_NameSpace(&((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->publicNameSpace, sourceExp, dest, string, conversions))
13858 return 1;
13859 }
13860 return 0;
13861 }
13862
13863 unsigned int MatchTypeExpression(struct Expression * sourceExp, struct Type * dest, struct __ecereNameSpace__ecere__sys__OldList * conversions, unsigned int skipUnitBla, unsigned int warnConst)
13864 {
13865 struct Type * source;
13866 struct Type * realDest = dest;
13867 struct Type * backupSourceExpType = (((void *)0));
13868 struct Expression * nbExp = GetNonBracketsExp(sourceExp);
13869 struct Expression * computedExp = nbExp;
13870
13871 dest->refCount++;
13872 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)
13873 {
13874 computedExp = CopyExpression(nbExp);
13875 ComputeExpression(computedExp);
13876 }
13877 source = sourceExp->expType;
13878 if(dest->kind == 13 && sourceExp->type == 2 && !strtoul(sourceExp->__anon1.__anon1.constant, (((void *)0)), 0))
13879 {
13880 if(computedExp != nbExp)
13881 {
13882 FreeExpression(computedExp);
13883 computedExp = nbExp;
13884 }
13885 FreeType(dest);
13886 return 1;
13887 }
13888 if(!skipUnitBla && source && dest && source->kind == 8 && dest->kind == 8)
13889 {
13890 if(source->__anon1._class && source->__anon1._class->__anon1.registered && source->__anon1._class->__anon1.registered->type == 3)
13891 {
13892 struct __ecereNameSpace__ecere__com__Class * sourceBase, * destBase;
13893
13894 for(sourceBase = source->__anon1._class->__anon1.registered; sourceBase && sourceBase->base && sourceBase->base->type != 1000; sourceBase = sourceBase->base)
13895 ;
13896 for(destBase = dest->__anon1._class->__anon1.registered; destBase && destBase->base && destBase->base->type != 1000; destBase = destBase->base)
13897 ;
13898 if(sourceBase == destBase)
13899 {
13900 if(computedExp != nbExp)
13901 {
13902 FreeExpression(computedExp);
13903 computedExp = nbExp;
13904 }
13905 FreeType(dest);
13906 return 1;
13907 }
13908 }
13909 }
13910 if(source)
13911 {
13912 struct __ecereNameSpace__ecere__sys__OldList * specs;
13913 unsigned int flag = 0;
13914 long long value = (((int)0x7fffffff));
13915
13916 source->refCount++;
13917 if(computedExp->type == 2)
13918 {
13919 if(source->isSigned)
13920 value = strtoll(computedExp->__anon1.__anon1.constant, (((void *)0)), 0);
13921 else
13922 value = strtoull(computedExp->__anon1.__anon1.constant, (((void *)0)), 0);
13923 }
13924 else if(computedExp->type == 4 && sourceExp->__anon1.op.op == '-' && !computedExp->__anon1.op.exp1 && computedExp->__anon1.op.exp2 && computedExp->__anon1.op.exp2->type == 2)
13925 {
13926 if(source->isSigned)
13927 value = -strtoll(computedExp->__anon1.op.exp2->__anon1.__anon1.constant, (((void *)0)), 0);
13928 else
13929 value = -strtoull(computedExp->__anon1.op.exp2->__anon1.__anon1.constant, (((void *)0)), 0);
13930 }
13931 if(computedExp != nbExp)
13932 {
13933 FreeExpression(computedExp);
13934 computedExp = nbExp;
13935 }
13936 if(dest->kind != 8 && source->kind == 8 && source->__anon1._class && source->__anon1._class->__anon1.registered && !strcmp(source->__anon1._class->__anon1.registered->fullName, "unichar"))
13937 {
13938 FreeType(source);
13939 source = __extension__ ({
13940 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
13941
13942 __ecereInstance1->kind = 3, __ecereInstance1->isSigned = 0, __ecereInstance1->refCount = 1, __ecereInstance1;
13943 });
13944 }
13945 if(dest->kind == 8)
13946 {
13947 struct __ecereNameSpace__ecere__com__Class * _class = dest->__anon1._class ? dest->__anon1._class->__anon1.registered : (((void *)0));
13948
13949 if(_class && _class->type == 3)
13950 {
13951 if(source->kind != 8)
13952 {
13953 struct Type * tempType = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
13954 struct Type * tempDest, * tempSource;
13955
13956 for(; _class->base->type != 1000; _class = _class->base)
13957 ;
13958 tempSource = dest;
13959 tempDest = tempType;
13960 tempType->kind = 8;
13961 if(!_class->symbol)
13962 _class->symbol = FindClass(_class->fullName);
13963 tempType->__anon1._class = _class->symbol;
13964 tempType->truth = dest->truth;
13965 if(tempType->__anon1._class)
13966 MatchTypes(tempSource, tempDest, conversions, (((void *)0)), (((void *)0)), 1, 1, 0, 0, warnConst);
13967 backupSourceExpType = sourceExp->expType;
13968 if(dest->passAsTemplate)
13969 {
13970 sourceExp->expType = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
13971 CopyTypeInto(sourceExp->expType, dest);
13972 sourceExp->expType->passAsTemplate = 0;
13973 }
13974 else
13975 {
13976 sourceExp->expType = dest;
13977 dest->refCount++;
13978 }
13979 flag = 1;
13980 ((tempType ? __extension__ ({
13981 void * __ecerePtrToDelete = (tempType);
13982
13983 __ecereClass_Type->Destructor ? __ecereClass_Type->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete);
13984 }) : 0), tempType = 0);
13985 }
13986 }
13987 if(_class && _class->type == 2 && source->kind != 8)
13988 {
13989 if(!dest->__anon1._class->__anon1.registered->dataType)
13990 dest->__anon1._class->__anon1.registered->dataType = ProcessTypeString(dest->__anon1._class->__anon1.registered->dataTypeString, 0);
13991 if(MatchTypes(source, dest->__anon1._class->__anon1.registered->dataType, conversions, (((void *)0)), (((void *)0)), 1, 1, 0, 0, warnConst))
13992 {
13993 FreeType(source);
13994 FreeType(sourceExp->expType);
13995 source = sourceExp->expType = MkClassType(dest->__anon1._class->string);
13996 source->refCount++;
13997 }
13998 }
13999 if(_class && !strcmp(_class->fullName, "ecere::com::Class") && source->kind == 13 && source->__anon1.type && source->__anon1.type->kind == 1 && sourceExp->type == 3)
14000 {
14001 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
14002 struct Declarator * decl;
14003 char string[1024];
14004
14005 ReadString(string, sourceExp->__anon1.__anon2.string);
14006 decl = SpecDeclFromString(string, specs, (((void *)0)));
14007 FreeExpContents(sourceExp);
14008 FreeType(sourceExp->expType);
14009 sourceExp->type = 24;
14010 sourceExp->__anon1._classExp.specifiers = specs;
14011 sourceExp->__anon1._classExp.decl = decl;
14012 sourceExp->expType = dest;
14013 dest->refCount++;
14014 FreeType(source);
14015 FreeType(dest);
14016 if(backupSourceExpType)
14017 FreeType(backupSourceExpType);
14018 return 1;
14019 }
14020 }
14021 else if(source->kind == 8)
14022 {
14023 struct __ecereNameSpace__ecere__com__Class * _class = source->__anon1._class ? source->__anon1._class->__anon1.registered : (((void *)0));
14024
14025 if(_class && (_class->type == 3 || _class->type == 2))
14026 {
14027 if(dest->kind != 8)
14028 {
14029 struct Type * tempType = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
14030 struct Type * tempDest, * tempSource;
14031
14032 if(!source->__anon1._class->__anon1.registered->dataType)
14033 source->__anon1._class->__anon1.registered->dataType = ProcessTypeString(source->__anon1._class->__anon1.registered->dataTypeString, 0);
14034 for(; _class->base->type != 1000; _class = _class->base)
14035 ;
14036 tempDest = source;
14037 tempSource = tempType;
14038 tempType->kind = 8;
14039 tempType->__anon1._class = FindClass(_class->fullName);
14040 tempType->truth = source->truth;
14041 tempType->classObjectType = source->classObjectType;
14042 if(tempType->__anon1._class)
14043 MatchTypes(tempSource, tempDest, conversions, (((void *)0)), (((void *)0)), 1, 1, 0, 0, warnConst);
14044 if(conversions && conversions->last)
14045 {
14046 ((struct Conversion *)conversions->last)->resultType = dest;
14047 dest->refCount++;
14048 }
14049 FreeType(sourceExp->expType);
14050 sourceExp->expType = MkClassType(_class->fullName);
14051 sourceExp->expType->truth = source->truth;
14052 sourceExp->expType->classObjectType = source->classObjectType;
14053 if(!sourceExp->destType)
14054 {
14055 FreeType(sourceExp->destType);
14056 sourceExp->destType = sourceExp->expType;
14057 if(sourceExp->expType)
14058 sourceExp->expType->refCount++;
14059 }
14060 if(!_class->dataType)
14061 _class->dataType = ProcessTypeString(_class->dataTypeString, 0);
14062 FreeType(dest);
14063 dest = MkClassType(source->__anon1._class->string);
14064 dest->truth = source->truth;
14065 dest->classObjectType = source->classObjectType;
14066 FreeType(source);
14067 source = _class->dataType;
14068 source->refCount++;
14069 ((tempType ? __extension__ ({
14070 void * __ecerePtrToDelete = (tempType);
14071
14072 __ecereClass_Type->Destructor ? __ecereClass_Type->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete);
14073 }) : 0), tempType = 0);
14074 }
14075 }
14076 }
14077 if(!flag)
14078 {
14079 if(MatchTypes(source, dest, conversions, (((void *)0)), (((void *)0)), 1, 1, 0, 0, warnConst))
14080 {
14081 FreeType(source);
14082 FreeType(dest);
14083 return 1;
14084 }
14085 }
14086 if(dest->kind == 8)
14087 {
14088 struct __ecereNameSpace__ecere__com__Class * _class = dest->__anon1._class ? dest->__anon1._class->__anon1.registered : (((void *)0));
14089 unsigned int fittingValue = 0;
14090
14091 if(_class && _class->type == 4)
14092 {
14093 struct __ecereNameSpace__ecere__com__Class * enumClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "enum");
14094 struct __ecereNameSpace__ecere__com__EnumClassData * c = (_class ? ((void *)(((char *)_class->data) + enumClass->offsetClass)) : (((void *)0)));
14095
14096 if(c && value >= 0 && value <= c->largest)
14097 fittingValue = 1;
14098 }
14099 if(_class && !dest->truth && (_class->type == 3 || fittingValue || (_class->type != 1 && !value && source->kind == 3) || _class->type == 2))
14100 {
14101 if(_class->type == 0 || _class->type == 5)
14102 {
14103 struct Expression * newExp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression);
14104
14105 *newExp = *sourceExp;
14106 if(sourceExp->destType)
14107 sourceExp->destType->refCount++;
14108 if(sourceExp->expType)
14109 sourceExp->expType->refCount++;
14110 sourceExp->type = 11;
14111 sourceExp->__anon1.cast.typeName = MkTypeName(MkListOne(MkSpecifier(VOID)), MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), (((void *)0))));
14112 sourceExp->__anon1.cast.exp = newExp;
14113 FreeType(sourceExp->expType);
14114 sourceExp->expType = (((void *)0));
14115 ProcessExpressionType(sourceExp);
14116 if(!inCompiler)
14117 {
14118 FreeType(sourceExp->expType);
14119 sourceExp->expType = dest;
14120 }
14121 FreeType(source);
14122 if(inCompiler)
14123 FreeType(dest);
14124 if(backupSourceExpType)
14125 FreeType(backupSourceExpType);
14126 return 1;
14127 }
14128 if(!_class->dataType)
14129 _class->dataType = ProcessTypeString(_class->dataTypeString, 0);
14130 FreeType(dest);
14131 dest = _class->dataType;
14132 dest->refCount++;
14133 }
14134 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))
14135 {
14136 specs = MkListOne(MkSpecifier(DOUBLE));
14137 }
14138 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))
14139 {
14140 specs = MkListOne(MkSpecifier(FLOAT));
14141 }
14142 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))
14143 {
14144 specs = MkList();
14145 if(!dest->isSigned)
14146 ListAdd(specs, MkSpecifier(UNSIGNED));
14147 ListAdd(specs, MkSpecifier(INT64));
14148 }
14149 else if(dest->kind == 3 && (source->kind == 3 || source->kind == 2 || source->kind == 1 || source->kind == 24 || source->kind == 6 || source->kind == 7))
14150 {
14151 specs = MkList();
14152 if(!dest->isSigned)
14153 ListAdd(specs, MkSpecifier(UNSIGNED));
14154 ListAdd(specs, MkSpecifier(INT));
14155 }
14156 else if(dest->kind == 2 && (source->kind == 2 || source->kind == 1 || source->kind == 24 || source->kind == 3 || source->kind == 6 || source->kind == 7))
14157 {
14158 specs = MkList();
14159 if(!dest->isSigned)
14160 ListAdd(specs, MkSpecifier(UNSIGNED));
14161 ListAdd(specs, MkSpecifier(SHORT));
14162 }
14163 else if(dest->kind == 1 && (source->kind == 1 || source->kind == 24 || source->kind == 2 || source->kind == 3 || source->kind == 6 || source->kind == 7))
14164 {
14165 specs = MkList();
14166 if(!dest->isSigned)
14167 ListAdd(specs, MkSpecifier(UNSIGNED));
14168 ListAdd(specs, MkSpecifier(CHAR));
14169 }
14170 else
14171 {
14172 FreeType(source);
14173 FreeType(dest);
14174 if(backupSourceExpType)
14175 {
14176 if(sourceExp->expType)
14177 FreeType(sourceExp->expType);
14178 sourceExp->expType = backupSourceExpType;
14179 }
14180 return 0;
14181 }
14182 }
14183 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))
14184 {
14185 specs = MkListOne(MkSpecifier(DOUBLE));
14186 }
14187 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))
14188 {
14189 specs = MkListOne(MkSpecifier(FLOAT));
14190 }
14191 else if(dest->kind == 24 && (source->kind == 24 || source->kind == 1 || source->kind == 15 || source->kind == 2 || source->kind == 3) && (value == 1 || value == 0))
14192 {
14193 specs = MkList();
14194 ListAdd(specs, MkSpecifier(BOOL));
14195 }
14196 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)))
14197 {
14198 if(source->kind == 3)
14199 {
14200 FreeType(dest);
14201 FreeType(source);
14202 if(backupSourceExpType)
14203 FreeType(backupSourceExpType);
14204 return 1;
14205 }
14206 else
14207 {
14208 specs = MkList();
14209 if(!dest->isSigned)
14210 ListAdd(specs, MkSpecifier(UNSIGNED));
14211 ListAdd(specs, MkSpecifier(CHAR));
14212 }
14213 }
14214 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)))))
14215 {
14216 if(source->kind == 3)
14217 {
14218 FreeType(dest);
14219 FreeType(source);
14220 if(backupSourceExpType)
14221 FreeType(backupSourceExpType);
14222 return 1;
14223 }
14224 else
14225 {
14226 specs = MkList();
14227 if(!dest->isSigned)
14228 ListAdd(specs, MkSpecifier(UNSIGNED));
14229 ListAdd(specs, MkSpecifier(SHORT));
14230 }
14231 }
14232 else if(dest->kind == 3 && (source->kind == 15 || source->kind == 2 || source->kind == 24 || source->kind == 1 || source->kind == 3))
14233 {
14234 specs = MkList();
14235 if(!dest->isSigned)
14236 ListAdd(specs, MkSpecifier(UNSIGNED));
14237 ListAdd(specs, MkSpecifier(INT));
14238 }
14239 else if(dest->kind == 4 && (source->kind == 15 || source->kind == 2 || source->kind == 24 || source->kind == 1 || source->kind == 3 || source->kind == 4))
14240 {
14241 specs = MkList();
14242 if(!dest->isSigned)
14243 ListAdd(specs, MkSpecifier(UNSIGNED));
14244 ListAdd(specs, MkSpecifier(INT64));
14245 }
14246 else if(dest->kind == 15 && (source->kind == 4 || source->kind == 3 || source->kind == 2 || source->kind == 24 || source->kind == 1))
14247 {
14248 specs = MkListOne(MkEnum(MkIdentifier(dest->__anon1.__anon1.enumName), (((void *)0))));
14249 }
14250 else
14251 {
14252 FreeType(source);
14253 FreeType(dest);
14254 if(backupSourceExpType)
14255 {
14256 if(sourceExp->expType)
14257 FreeType(sourceExp->expType);
14258 sourceExp->expType = backupSourceExpType;
14259 }
14260 return 0;
14261 }
14262 if(!flag && !sourceExp->opDestType)
14263 {
14264 struct Expression * newExp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression);
14265
14266 *newExp = *sourceExp;
14267 newExp->prev = (((void *)0));
14268 newExp->next = (((void *)0));
14269 if(sourceExp->destType)
14270 sourceExp->destType->refCount++;
14271 if(sourceExp->expType)
14272 sourceExp->expType->refCount++;
14273 sourceExp->type = 11;
14274 if(realDest->kind == 8)
14275 {
14276 sourceExp->__anon1.cast.typeName = QMkClass(realDest->__anon1._class->string, (((void *)0)));
14277 FreeList(specs, (void *)(FreeSpecifier));
14278 }
14279 else
14280 sourceExp->__anon1.cast.typeName = MkTypeName(specs, (((void *)0)));
14281 if(newExp->type == 4)
14282 {
14283 sourceExp->__anon1.cast.exp = MkExpBrackets(MkListOne(newExp));
14284 }
14285 else
14286 sourceExp->__anon1.cast.exp = newExp;
14287 FreeType(sourceExp->expType);
14288 sourceExp->expType = (((void *)0));
14289 ProcessExpressionType(sourceExp);
14290 }
14291 else
14292 FreeList(specs, (void *)(FreeSpecifier));
14293 FreeType(dest);
14294 FreeType(source);
14295 if(backupSourceExpType)
14296 FreeType(backupSourceExpType);
14297 return 1;
14298 }
14299 else
14300 {
14301 if(computedExp != nbExp)
14302 {
14303 FreeExpression(computedExp);
14304 computedExp = nbExp;
14305 }
14306 while((sourceExp->type == 5 || sourceExp->type == 32) && sourceExp->__anon1.list)
14307 sourceExp = (*sourceExp->__anon1.list).last;
14308 if(sourceExp->type == 0)
14309 {
14310 struct Identifier * id = sourceExp->__anon1.__anon1.identifier;
14311
14312 if(dest->kind == 8)
14313 {
14314 if(dest->__anon1._class && dest->__anon1._class->__anon1.registered && dest->__anon1._class->__anon1.registered->type == 4)
14315 {
14316 struct __ecereNameSpace__ecere__com__Class * _class = dest->__anon1._class->__anon1.registered;
14317 struct __ecereNameSpace__ecere__com__Class * enumClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "enum");
14318
14319 if(enumClass)
14320 {
14321 for(; _class && _class->type == 4; _class = _class->base)
14322 {
14323 struct __ecereNameSpace__ecere__sys__NamedLink64 * value;
14324 struct __ecereNameSpace__ecere__com__EnumClassData * e = (_class ? ((void *)(((char *)_class->data) + enumClass->offsetClass)) : (((void *)0)));
14325
14326 for(value = e->values.first; value; value = value->next)
14327 {
14328 if(!strcmp(value->name, id->string))
14329 break;
14330 }
14331 if(value)
14332 {
14333 FreeType(sourceExp->expType);
14334 sourceExp->isConstant = 1;
14335 sourceExp->expType = MkClassType(_class->fullName);
14336 if(inCompiler || inPreCompiler || inDebugger)
14337 {
14338 FreeExpContents(sourceExp);
14339 sourceExp->type = 2;
14340 if(_class->dataTypeString && (!strcmp(_class->dataTypeString, "int") || !strcmp(_class->dataTypeString, "int64") || !strcmp(_class->dataTypeString, "short") || !strcmp(_class->dataTypeString, "char")))
14341 sourceExp->__anon1.__anon1.constant = PrintInt64(value->data);
14342 else
14343 sourceExp->__anon1.__anon1.constant = PrintUInt64(value->data);
14344 }
14345 FreeType(dest);
14346 return 1;
14347 }
14348 }
14349 }
14350 }
14351 }
14352 if(dest->classObjectType != 2 && dest->kind == 8 && MatchWithEnums_Module(privateModule, sourceExp, dest, id->string, conversions))
14353 {
14354 FreeType(dest);
14355 return 1;
14356 }
14357 }
14358 FreeType(dest);
14359 }
14360 return 0;
14361 }
14362
14363 static unsigned int CheckExpressionType(struct Expression * exp, struct Type * destType, unsigned int skipUnitBla, unsigned int warnConst)
14364 {
14365 unsigned int result = 1;
14366
14367 if(destType)
14368 {
14369 struct __ecereNameSpace__ecere__sys__OldList converts =
14370 {
14371 0, 0, 0, 0, 0
14372 };
14373 struct Conversion * convert;
14374
14375 if(destType->kind == 0)
14376 return 0;
14377 if(!MatchTypeExpression(exp, destType, &converts, skipUnitBla, warnConst))
14378 result = 0;
14379 if(converts.count)
14380 {
14381 for(convert = converts.first; convert; convert = convert->next)
14382 {
14383 unsigned int empty = !(convert->isGet ? (void *)convert->convert->Get : (void *)convert->convert->Set);
14384
14385 if(!empty)
14386 {
14387 struct Expression * newExp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression);
14388 int objectType = exp->expType ? exp->expType->classObjectType : 0;
14389
14390 *newExp = *exp;
14391 newExp->prev = (((void *)0));
14392 newExp->next = (((void *)0));
14393 newExp->destType = (((void *)0));
14394 if(convert->isGet)
14395 {
14396 exp->type = 8;
14397 exp->addedThis = 1;
14398 exp->__anon1.member.exp = newExp;
14399 FreeType(exp->__anon1.member.exp->expType);
14400 exp->__anon1.member.exp->expType = MkClassType(convert->convert->_class->fullName);
14401 exp->__anon1.member.exp->expType->classObjectType = objectType;
14402 exp->__anon1.member.member = MkIdentifier(convert->convert->dataTypeString);
14403 exp->__anon1.member.memberType = 1;
14404 exp->expType = convert->resultType ? convert->resultType : convert->convert->dataType;
14405 exp->needCast = 1;
14406 if(exp->expType)
14407 exp->expType->refCount++;
14408 ApplyAnyObjectLogic(exp->__anon1.member.exp);
14409 }
14410 else
14411 {
14412 {
14413 exp->type = 8;
14414 exp->addedThis = 1;
14415 exp->__anon1.member.exp = newExp;
14416 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)
14417 {
14418 newExp->byReference = 1;
14419 }
14420 FreeType(exp->__anon1.member.exp->expType);
14421 exp->__anon1.member.exp->expType = (((void *)0));
14422 if(convert->convert->dataType)
14423 {
14424 exp->__anon1.member.exp->expType = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
14425 CopyTypeInto(exp->__anon1.member.exp->expType, convert->convert->dataType);
14426 exp->__anon1.member.exp->expType->refCount = 1;
14427 exp->__anon1.member.exp->expType->classObjectType = objectType;
14428 ApplyAnyObjectLogic(exp->__anon1.member.exp);
14429 }
14430 exp->__anon1.member.member = MkIdentifier(convert->convert->_class->fullName);
14431 exp->__anon1.member.memberType = 4;
14432 exp->expType = convert->resultType ? convert->resultType : MkClassType(convert->convert->_class->fullName);
14433 exp->needCast = 1;
14434 if(convert->resultType)
14435 convert->resultType->refCount++;
14436 }
14437 }
14438 }
14439 else
14440 {
14441 FreeType(exp->expType);
14442 if(convert->isGet)
14443 {
14444 exp->expType = convert->resultType ? convert->resultType : convert->convert->dataType;
14445 if(exp->destType->casted)
14446 exp->needCast = 1;
14447 if(exp->expType)
14448 exp->expType->refCount++;
14449 }
14450 else
14451 {
14452 exp->expType = convert->resultType ? convert->resultType : MkClassType(convert->convert->_class->fullName);
14453 if(exp->destType->casted)
14454 exp->needCast = 1;
14455 if(convert->resultType)
14456 convert->resultType->refCount++;
14457 }
14458 }
14459 }
14460 if(exp->isConstant && inCompiler)
14461 ComputeExpression(exp);
14462 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Free(&converts, (void *)(FreeConvert));
14463 }
14464 if(!result && exp->expType && converts.count)
14465 {
14466 result = MatchTypes(exp->expType, exp->destType, (((void *)0)), (((void *)0)), (((void *)0)), 1, 1, 0, 0, warnConst);
14467 }
14468 if(!result && exp->expType && exp->destType)
14469 {
14470 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))
14471 result = 1;
14472 }
14473 }
14474 return result;
14475 }
14476
14477 static void ProcessFunction(struct FunctionDefinition *  function);
14478
14479 void ProcessInstantiationType(struct Instantiation * inst)
14480 {
14481 yylloc = inst->loc;
14482 if(inst->_class)
14483 {
14484 struct MembersInit * members;
14485 struct Symbol * classSym;
14486 struct __ecereNameSpace__ecere__com__Class * _class;
14487
14488 classSym = inst->_class->__anon1.__anon1.symbol;
14489 _class = classSym ? classSym->__anon1.registered : (((void *)0));
14490 if(!_class || _class->type != 5)
14491 DeclareStruct(curExternal, inst->_class->__anon1.__anon1.name, 0, 1);
14492 afterExternal = afterExternal ? afterExternal : curExternal;
14493 if(inst->exp)
14494 ProcessExpressionType(inst->exp);
14495 inst->isConstant = 1;
14496 if(inst->members)
14497 {
14498 struct __ecereNameSpace__ecere__com__DataMember * curMember = (((void *)0));
14499 struct __ecereNameSpace__ecere__com__Class * curClass = (((void *)0));
14500 struct __ecereNameSpace__ecere__com__DataMember * subMemberStack[256];
14501 int subMemberStackPos = 0;
14502
14503 for(members = (*inst->members).first; members; members = members->next)
14504 {
14505 switch(members->type)
14506 {
14507 case 1:
14508 {
14509 char name[1024];
14510 static unsigned int instMethodID = 0;
14511 struct External * external = curExternal;
14512 struct Context * context = curContext;
14513 struct Declarator * declarator = members->__anon1.function->declarator;
14514 struct Identifier * nameID = GetDeclId(declarator);
14515 char * unmangled = nameID ? nameID->string : (((void *)0));
14516 struct Expression * exp;
14517 struct External * createdExternal = (((void *)0));
14518
14519 if(inCompiler)
14520 {
14521 char number[16];
14522
14523 strcpy(name, "__ecereInstMeth_");
14524 FullClassNameCat(name, _class ? _class->fullName : "_UNKNOWNCLASS", 0);
14525 strcat(name, "_");
14526 strcat(name, nameID->string);
14527 strcat(name, "_");
14528 sprintf(number, "_%08d", instMethodID++);
14529 strcat(name, number);
14530 nameID->string = __ecereNameSpace__ecere__sys__CopyString(name);
14531 }
14532 if(declarator)
14533 {
14534 struct Symbol * symbol = declarator->symbol;
14535 struct __ecereNameSpace__ecere__com__Method * method = __ecereNameSpace__ecere__com__eClass_FindMethod(_class, unmangled, privateModule);
14536
14537 if(method && method->type == 1)
14538 {
14539 symbol->__anon1.method = method;
14540 ProcessMethodType(method);
14541 if(!symbol->type->__anon1.__anon2.thisClass)
14542 {
14543 if(method->dataType->__anon1.__anon2.thisClass && currentClass && __ecereNameSpace__ecere__com__eClass_IsDerived(currentClass, method->dataType->__anon1.__anon2.thisClass->__anon1.registered))
14544 {
14545 if(!currentClass->symbol)
14546 currentClass->symbol = FindClass(currentClass->fullName);
14547 symbol->type->__anon1.__anon2.thisClass = currentClass->symbol;
14548 }
14549 else
14550 {
14551 if(!_class->symbol)
14552 _class->symbol = FindClass(_class->fullName);
14553 symbol->type->__anon1.__anon2.thisClass = _class->symbol;
14554 }
14555 }
14556 DeclareType(curExternal, symbol->type, 1, 1);
14557 }
14558 else if(classSym)
14559 {
14560 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "couldn't find virtual method %s in class %s\n", (((void *)0))), unmangled, classSym->string);
14561 }
14562 }
14563 createdExternal = ProcessClassFunction(classSym ? classSym->__anon1.registered : (((void *)0)), members->__anon1.function, ast, afterExternal, 1);
14564 if(nameID)
14565 {
14566 FreeSpecifier(nameID->_class);
14567 nameID->_class = (((void *)0));
14568 }
14569 curExternal = createdExternal;
14570 if(inCompiler)
14571 {
14572 if(createdExternal->__anon1.function)
14573 ProcessFunction(createdExternal->__anon1.function);
14574 }
14575 else if(declarator)
14576 {
14577 curExternal = declarator->symbol->__anon2.__anon1.pointerExternal;
14578 ProcessFunction((struct FunctionDefinition *)members->__anon1.function);
14579 }
14580 curExternal = external;
14581 curContext = context;
14582 if(inCompiler)
14583 {
14584 FreeClassFunction(members->__anon1.function);
14585 exp = QMkExpId(name);
14586 members->type = 0;
14587 members->__anon1.dataMembers = MkListOne(MkMemberInit(MkListOne(MkIdentifier(unmangled)), MkInitializerAssignment(exp)));
14588 (__ecereNameSpace__ecere__com__eSystem_Delete(unmangled), unmangled = 0);
14589 }
14590 break;
14591 }
14592 case 0:
14593 {
14594 if(members->__anon1.dataMembers && classSym)
14595 {
14596 struct MemberInit * member;
14597 struct Location oldyyloc = yylloc;
14598
14599 for(member = (*members->__anon1.dataMembers).first; member; member = member->next)
14600 {
14601 ProcessMemberInitData(member, classSym->__anon1.registered, &curClass, &curMember, subMemberStack, &subMemberStackPos);
14602 if(member->initializer && !member->initializer->isConstant)
14603 inst->isConstant = 0;
14604 }
14605 yylloc = oldyyloc;
14606 }
14607 break;
14608 }
14609 }
14610 }
14611 }
14612 }
14613 }
14614
14615 static void ProcessClass(struct __ecereNameSpace__ecere__sys__OldList *  definitions, struct Symbol *  symbol);
14616
14617 static void ProcessSpecifier(struct Specifier * spec, unsigned int declareStruct, unsigned int warnClasses)
14618 {
14619 switch(spec->type)
14620 {
14621 case 0:
14622 {
14623 if(spec->__anon1.specifier == THISCLASS)
14624 {
14625 if(thisClass)
14626 {
14627 spec->type = 1;
14628 spec->__anon1.__anon1.name = ReplaceThisClass(thisClass);
14629 spec->__anon1.__anon1.symbol = FindClass(spec->__anon1.__anon1.name);
14630 ProcessSpecifier(spec, declareStruct, 0);
14631 }
14632 }
14633 break;
14634 }
14635 case 1:
14636 {
14637 struct Symbol * symbol = FindType(curContext, spec->__anon1.__anon1.name);
14638
14639 if(symbol)
14640 DeclareType(curExternal, symbol->type, 1, 1);
14641 else if(spec->__anon1.__anon1.symbol)
14642 {
14643 struct __ecereNameSpace__ecere__com__Class * c = spec->__anon1.__anon1.symbol->__anon1.registered;
14644
14645 if(warnClasses && !c)
14646 Compiler_Warning("Undeclared class %s\n", spec->__anon1.__anon1.name);
14647 DeclareStruct(curExternal, spec->__anon1.__anon1.name, c && c->type == 5, declareStruct && c && c->type == 1);
14648 }
14649 break;
14650 }
14651 case 2:
14652 {
14653 struct Enumerator * e;
14654
14655 if(spec->__anon1.__anon2.list)
14656 {
14657 for(e = (*spec->__anon1.__anon2.list).first; e; e = e->next)
14658 {
14659 if(e->exp)
14660 ProcessExpressionType(e->exp);
14661 }
14662 }
14663 if(inCompiler)
14664 break;
14665 }
14666 case 3:
14667 case 4:
14668 {
14669 if(spec->__anon1.__anon2.definitions)
14670 {
14671 struct Symbol * symbol = spec->__anon1.__anon2.id ? FindClass(spec->__anon1.__anon2.id->string) : (((void *)0));
14672
14673 ProcessClass(spec->__anon1.__anon2.definitions, symbol);
14674 }
14675 break;
14676 }
14677 }
14678 }
14679
14680 static void ProcessDeclarator(struct Declarator * decl, unsigned int isFunction)
14681 {
14682 switch(decl->type)
14683 {
14684 case 1:
14685 if(decl->__anon1.identifier->classSym)
14686 {
14687 FreeSpecifier(decl->__anon1.identifier->_class);
14688 decl->__anon1.identifier->_class = (((void *)0));
14689 }
14690 break;
14691 case 3:
14692 if(decl->__anon1.array.exp)
14693 ProcessExpressionType(decl->__anon1.array.exp);
14694 case 0:
14695 case 2:
14696 case 4:
14697 case 5:
14698 case 6:
14699 case 7:
14700 {
14701 struct Identifier * id = (((void *)0));
14702 struct Specifier * classSpec = (((void *)0));
14703
14704 if(decl->type == 4)
14705 {
14706 id = GetDeclId(decl);
14707 if(id && id->_class)
14708 {
14709 classSpec = id->_class;
14710 id->_class = (((void *)0));
14711 }
14712 }
14713 if(decl->declarator)
14714 ProcessDeclarator(decl->declarator, isFunction);
14715 if(decl->type == 4)
14716 {
14717 if(classSpec)
14718 {
14719 struct TypeName * param = (param = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_TypeName), param->qualifiers = MkListOne(classSpec), param->declarator = (((void *)0)), param);
14720
14721 if(!decl->__anon1.function.parameters)
14722 decl->__anon1.function.parameters = MkList();
14723 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*decl->__anon1.function.parameters), (((void *)0)), param);
14724 }
14725 if(decl->__anon1.function.parameters)
14726 {
14727 struct TypeName * param;
14728
14729 for(param = (*decl->__anon1.function.parameters).first; param; param = param->next)
14730 {
14731 if(param->qualifiers)
14732 {
14733 struct Specifier * spec;
14734
14735 for(spec = (*param->qualifiers).first; spec; spec = spec->next)
14736 {
14737 if(spec->type == 0)
14738 {
14739 if(spec->__anon1.specifier == TYPED_OBJECT)
14740 {
14741 struct Declarator * d = param->declarator;
14742 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);
14743
14744 if(!d || d->type != 5)
14745 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*newParam->qualifiers), (((void *)0)), MkSpecifier(CONST));
14746 FreeList(param->qualifiers, (void *)(FreeSpecifier));
14747 param->qualifiers = MkListOne(MkStructOrUnion(3, MkIdentifier("__ecereNameSpace__ecere__com__Class"), (((void *)0))));
14748 param->declarator = MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), MkDeclaratorIdentifier(MkIdentifier("class")));
14749 DeclareStruct(curExternal, "ecere::com::Class", 0, 1);
14750 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*decl->__anon1.function.parameters), param, newParam);
14751 param = newParam;
14752 break;
14753 }
14754 else if(spec->__anon1.specifier == ANY_OBJECT)
14755 {
14756 struct Declarator * d = param->declarator;
14757
14758 FreeList(param->qualifiers, (void *)(FreeSpecifier));
14759 param->qualifiers = MkListOne(MkSpecifier(VOID));
14760 if(!d || d->type != 5)
14761 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*param->qualifiers), (((void *)0)), MkSpecifier(CONST));
14762 param->declarator = MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), d);
14763 break;
14764 }
14765 else if(spec->__anon1.specifier == THISCLASS)
14766 {
14767 if(thisClass)
14768 {
14769 spec->type = 1;
14770 spec->__anon1.__anon1.name = ReplaceThisClass(thisClass);
14771 spec->__anon1.__anon1.symbol = FindClass(spec->__anon1.__anon1.name);
14772 ProcessSpecifier(spec, 0, 0);
14773 }
14774 break;
14775 }
14776 }
14777 else if(spec->type == 1)
14778 {
14779 ProcessSpecifier(spec, isFunction, 1);
14780 }
14781 else if((spec->type == 3 || spec->type == 4) && !spec->__anon1.__anon2.definitions && spec->__anon1.__anon2.id && spec->__anon1.__anon2.id->string)
14782 {
14783 struct Declarator * d = param->declarator;
14784
14785 if(!d || d->type != 5)
14786 DeclareStruct(curExternal, spec->__anon1.__anon2.id->string, 0, 1);
14787 }
14788 }
14789 }
14790 if(param->declarator)
14791 ProcessDeclarator(param->declarator, 0);
14792 }
14793 }
14794 }
14795 break;
14796 }
14797 }
14798 }
14799
14800 static void ProcessDeclaration(struct Declaration * decl, unsigned int warnClasses)
14801 {
14802 yylloc = decl->loc;
14803 switch(decl->type)
14804 {
14805 case 1:
14806 {
14807 unsigned int declareStruct = 0;
14808
14809 if(decl->__anon1.__anon1.declarators)
14810 {
14811 struct InitDeclarator * d;
14812
14813 for(d = (*decl->__anon1.__anon1.declarators).first; d; d = d->next)
14814 {
14815 struct Type * type, * subType;
14816
14817 ProcessDeclarator(d->declarator, 0);
14818 type = ProcessType(decl->__anon1.__anon1.specifiers, d->declarator);
14819 if(d->initializer)
14820 {
14821 ProcessInitializer(d->initializer, type);
14822 if((*decl->__anon1.__anon1.declarators).count == 1 && d->initializer->type == 0 && d->initializer->__anon1.exp->type == 1)
14823 {
14824 if(type->kind == 8 && type->__anon1._class == d->initializer->__anon1.exp->expType->__anon1._class)
14825 {
14826 struct Instantiation * inst = d->initializer->__anon1.exp->__anon1.instance;
14827
14828 inst->exp = MkExpIdentifier(CopyIdentifier(GetDeclId(d->declarator)));
14829 d->initializer->__anon1.exp->__anon1.instance = (((void *)0));
14830 if(decl->__anon1.__anon1.specifiers)
14831 FreeList(decl->__anon1.__anon1.specifiers, (void *)(FreeSpecifier));
14832 FreeList(decl->__anon1.__anon1.declarators, (void *)(FreeInitDeclarator));
14833 d = (((void *)0));
14834 decl->type = 2;
14835 decl->__anon1.inst = inst;
14836 }
14837 }
14838 }
14839 for(subType = type; subType; )
14840 {
14841 if(subType->kind == 8)
14842 {
14843 declareStruct = 1;
14844 break;
14845 }
14846 else if(subType->kind == 13)
14847 break;
14848 else if(subType->kind == 12)
14849 subType = subType->__anon1.__anon4.arrayType;
14850 else
14851 break;
14852 }
14853 FreeType(type);
14854 if(!d)
14855 break;
14856 }
14857 }
14858 if(decl->__anon1.__anon1.specifiers)
14859 {
14860 struct Specifier * s;
14861
14862 for(s = (*decl->__anon1.__anon1.specifiers).first; s; s = s->next)
14863 {
14864 ProcessSpecifier(s, declareStruct, 1);
14865 }
14866 }
14867 break;
14868 }
14869 case 2:
14870 {
14871 ProcessInstantiationType(decl->__anon1.inst);
14872 break;
14873 }
14874 case 0:
14875 {
14876 struct Specifier * spec;
14877 struct Declarator * d;
14878 unsigned int declareStruct = 0;
14879
14880 if(decl->__anon1.__anon1.declarators)
14881 {
14882 for(d = (*decl->__anon1.__anon1.declarators).first; d; d = d->next)
14883 {
14884 struct Type * type = ProcessType(decl->__anon1.__anon1.specifiers, d->declarator);
14885 struct Type * subType;
14886
14887 ProcessDeclarator(d, 0);
14888 for(subType = type; subType; )
14889 {
14890 if(subType->kind == 8)
14891 {
14892 declareStruct = 1;
14893 break;
14894 }
14895 else if(subType->kind == 13)
14896 break;
14897 else if(subType->kind == 12)
14898 subType = subType->__anon1.__anon4.arrayType;
14899 else
14900 break;
14901 }
14902 FreeType(type);
14903 }
14904 }
14905 if(decl->__anon1.__anon1.specifiers)
14906 {
14907 for(spec = (*decl->__anon1.__anon1.specifiers).first; spec; spec = spec->next)
14908 ProcessSpecifier(spec, declareStruct, warnClasses);
14909 }
14910 break;
14911 }
14912 }
14913 }
14914
14915 static void ProcessStatement(struct Statement * stmt)
14916 {
14917 yylloc = stmt->loc;
14918 switch(stmt->type)
14919 {
14920 case 0:
14921 ProcessStatement(stmt->__anon1.labeled.stmt);
14922 break;
14923 case 1:
14924 if(stmt->__anon1.caseStmt.exp)
14925 {
14926 FreeType(stmt->__anon1.caseStmt.exp->destType);
14927 stmt->__anon1.caseStmt.exp->destType = curSwitchType;
14928 if(curSwitchType)
14929 curSwitchType->refCount++;
14930 ProcessExpressionType(stmt->__anon1.caseStmt.exp);
14931 ComputeExpression(stmt->__anon1.caseStmt.exp);
14932 }
14933 if(stmt->__anon1.caseStmt.stmt)
14934 ProcessStatement(stmt->__anon1.caseStmt.stmt);
14935 break;
14936 case 2:
14937 {
14938 if(stmt->__anon1.compound.context)
14939 {
14940 struct Declaration * decl;
14941 struct Statement * s;
14942 struct Statement * prevCompound = curCompound;
14943 struct Context * prevContext = curContext;
14944
14945 if(!stmt->__anon1.compound.isSwitch)
14946 curCompound = stmt;
14947 curContext = stmt->__anon1.compound.context;
14948 if(stmt->__anon1.compound.declarations)
14949 {
14950 for(decl = (*stmt->__anon1.compound.declarations).first; decl; decl = decl->next)
14951 ProcessDeclaration(decl, 1);
14952 }
14953 if(stmt->__anon1.compound.statements)
14954 {
14955 for(s = (*stmt->__anon1.compound.statements).first; s; s = s->next)
14956 ProcessStatement(s);
14957 }
14958 curContext = prevContext;
14959 curCompound = prevCompound;
14960 }
14961 break;
14962 }
14963 case 3:
14964 {
14965 struct Expression * exp;
14966
14967 if(stmt->__anon1.expressions)
14968 {
14969 for(exp = (*stmt->__anon1.expressions).first; exp; exp = exp->next)
14970 ProcessExpressionType(exp);
14971 }
14972 break;
14973 }
14974 case 4:
14975 {
14976 struct Expression * exp;
14977
14978 FreeType(((struct Expression *)(*stmt->__anon1.ifStmt.exp).last)->destType);
14979 ((struct Expression *)(*stmt->__anon1.ifStmt.exp).last)->destType = MkClassType("bool");
14980 ((struct Expression *)(*stmt->__anon1.ifStmt.exp).last)->destType->truth = 1;
14981 for(exp = (*stmt->__anon1.ifStmt.exp).first; exp; exp = exp->next)
14982 {
14983 ProcessExpressionType(exp);
14984 }
14985 if(stmt->__anon1.ifStmt.stmt)
14986 ProcessStatement(stmt->__anon1.ifStmt.stmt);
14987 if(stmt->__anon1.ifStmt.elseStmt)
14988 ProcessStatement(stmt->__anon1.ifStmt.elseStmt);
14989 break;
14990 }
14991 case 5:
14992 {
14993 struct Type * oldSwitchType = curSwitchType;
14994
14995 if(stmt->__anon1.switchStmt.exp)
14996 {
14997 struct Expression * exp;
14998
14999 for(exp = (*stmt->__anon1.switchStmt.exp).first; exp; exp = exp->next)
15000 {
15001 if(!exp->next)
15002 {
15003 ProcessExpressionType(exp);
15004 }
15005 if(!exp->next)
15006 curSwitchType = exp->expType;
15007 }
15008 }
15009 ProcessStatement(stmt->__anon1.switchStmt.stmt);
15010 curSwitchType = oldSwitchType;
15011 break;
15012 }
15013 case 6:
15014 {
15015 if(stmt->__anon1.whileStmt.exp)
15016 {
15017 struct Expression * exp;
15018
15019 FreeType(((struct Expression *)(*stmt->__anon1.whileStmt.exp).last)->destType);
15020 ((struct Expression *)(*stmt->__anon1.whileStmt.exp).last)->destType = MkClassType("bool");
15021 ((struct Expression *)(*stmt->__anon1.whileStmt.exp).last)->destType->truth = 1;
15022 for(exp = (*stmt->__anon1.whileStmt.exp).first; exp; exp = exp->next)
15023 {
15024 ProcessExpressionType(exp);
15025 }
15026 }
15027 if(stmt->__anon1.whileStmt.stmt)
15028 ProcessStatement(stmt->__anon1.whileStmt.stmt);
15029 break;
15030 }
15031 case 7:
15032 {
15033 if(stmt->__anon1.doWhile.exp)
15034 {
15035 struct Expression * exp;
15036
15037 if((*stmt->__anon1.doWhile.exp).last)
15038 {
15039 FreeType(((struct Expression *)(*stmt->__anon1.doWhile.exp).last)->destType);
15040 ((struct Expression *)(*stmt->__anon1.doWhile.exp).last)->destType = MkClassType("bool");
15041 ((struct Expression *)(*stmt->__anon1.doWhile.exp).last)->destType->truth = 1;
15042 }
15043 for(exp = (*stmt->__anon1.doWhile.exp).first; exp; exp = exp->next)
15044 {
15045 ProcessExpressionType(exp);
15046 }
15047 }
15048 if(stmt->__anon1.doWhile.stmt)
15049 ProcessStatement(stmt->__anon1.doWhile.stmt);
15050 break;
15051 }
15052 case 8:
15053 {
15054 struct Expression * exp;
15055
15056 if(stmt->__anon1.forStmt.init)
15057 ProcessStatement(stmt->__anon1.forStmt.init);
15058 if(stmt->__anon1.forStmt.check && stmt->__anon1.forStmt.check->__anon1.expressions)
15059 {
15060 FreeType(((struct Expression *)(*stmt->__anon1.forStmt.check->__anon1.expressions).last)->destType);
15061 ((struct Expression *)(*stmt->__anon1.forStmt.check->__anon1.expressions).last)->destType = MkClassType("bool");
15062 ((struct Expression *)(*stmt->__anon1.forStmt.check->__anon1.expressions).last)->destType->truth = 1;
15063 }
15064 if(stmt->__anon1.forStmt.check)
15065 ProcessStatement(stmt->__anon1.forStmt.check);
15066 if(stmt->__anon1.forStmt.increment)
15067 {
15068 for(exp = (*stmt->__anon1.forStmt.increment).first; exp; exp = exp->next)
15069 ProcessExpressionType(exp);
15070 }
15071 if(stmt->__anon1.forStmt.stmt)
15072 ProcessStatement(stmt->__anon1.forStmt.stmt);
15073 break;
15074 }
15075 case 18:
15076 {
15077 struct Identifier * id = stmt->__anon1.forEachStmt.id;
15078 struct __ecereNameSpace__ecere__sys__OldList * exp = stmt->__anon1.forEachStmt.exp;
15079 struct __ecereNameSpace__ecere__sys__OldList * filter = stmt->__anon1.forEachStmt.filter;
15080 struct Statement * block = stmt->__anon1.forEachStmt.stmt;
15081 char iteratorType[1024];
15082 struct Type * source;
15083 struct Expression * e;
15084 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));
15085 struct Expression * arrayExp;
15086 const char * typeString = (((void *)0));
15087 int builtinCount = 0;
15088
15089 for(e = exp ? (*exp).first : (((void *)0)); e; e = e->next)
15090 {
15091 if(!e->next)
15092 {
15093 FreeType(e->destType);
15094 e->destType = ProcessTypeString("Container", 0);
15095 }
15096 if(!isBuiltin || e->next)
15097 ProcessExpressionType(e);
15098 }
15099 source = (exp && (*exp).last) ? ((struct Expression *)(*exp).last)->expType : (((void *)0));
15100 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)))
15101 {
15102 struct __ecereNameSpace__ecere__com__Class * _class = source ? source->__anon1._class->__anon1.registered : (((void *)0));
15103 struct Symbol * symbol;
15104 struct Expression * expIt = (((void *)0));
15105 unsigned int isMap = 0, isArray = 0, isLinkList = 0, isList = 0, isCustomAVLTree = 0;
15106 struct __ecereNameSpace__ecere__com__Class * arrayClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "Array");
15107 struct __ecereNameSpace__ecere__com__Class * linkListClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "LinkList");
15108 struct __ecereNameSpace__ecere__com__Class * customAVLTreeClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "CustomAVLTree");
15109
15110 if(inCompiler)
15111 {
15112 stmt->type = 2;
15113 stmt->__anon1.compound.context = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Context);
15114 stmt->__anon1.compound.context->parent = curContext;
15115 curContext = stmt->__anon1.compound.context;
15116 }
15117 if(source && __ecereNameSpace__ecere__com__eClass_IsDerived(source->__anon1._class->__anon1.registered, customAVLTreeClass))
15118 {
15119 struct __ecereNameSpace__ecere__com__Class * mapClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "Map");
15120
15121 isCustomAVLTree = 1;
15122 if(__ecereNameSpace__ecere__com__eClass_IsDerived(source->__anon1._class->__anon1.registered, mapClass))
15123 isMap = 1;
15124 }
15125 else if(source && __ecereNameSpace__ecere__com__eClass_IsDerived(source->__anon1._class->__anon1.registered, arrayClass))
15126 isArray = 1;
15127 else if(source && __ecereNameSpace__ecere__com__eClass_IsDerived(source->__anon1._class->__anon1.registered, linkListClass))
15128 {
15129 struct __ecereNameSpace__ecere__com__Class * listClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "List");
15130
15131 isLinkList = 1;
15132 isList = __ecereNameSpace__ecere__com__eClass_IsDerived(source->__anon1._class->__anon1.registered, listClass);
15133 }
15134 if(inCompiler && isArray)
15135 {
15136 struct Declarator * decl;
15137 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
15138
15139 decl = SpecDeclFromString(_class->templateArgs[2].__anon1.__anon1.dataTypeString, specs, MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), MkDeclaratorIdentifier(id)));
15140 stmt->__anon1.compound.declarations = MkListOne(MkDeclaration(specs, MkListOne(MkInitDeclarator(decl, (((void *)0))))));
15141 ListAdd(stmt->__anon1.compound.declarations, MkDeclaration(MkListOne(MkSpecifierName(source->__anon1._class->__anon1.registered->fullName)), MkListOne(MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier("__internalArray")), MkInitializerAssignment(MkExpBrackets(exp))))));
15142 }
15143 else if(isBuiltin)
15144 {
15145 struct Type * type = (((void *)0));
15146 char typeStringBuf[1024];
15147
15148 arrayExp = (((struct Expression *)(*exp).last)->type == 35) ? (struct Expression *)(*exp).last : ((struct Expression *)(*exp).last)->__anon1.cast.exp;
15149 if(((struct Expression *)(*exp).last)->type == 11)
15150 {
15151 struct TypeName * typeName = ((struct Expression *)(*exp).last)->__anon1.cast.typeName;
15152
15153 if(typeName)
15154 arrayExp->destType = ProcessType(typeName->qualifiers, typeName->declarator);
15155 }
15156 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)
15157 {
15158 struct __ecereNameSpace__ecere__com__Class * templateClass = arrayExp->destType->__anon1._class->__anon1.registered;
15159
15160 typeString = templateClass->templateArgs[2].__anon1.__anon1.dataTypeString;
15161 }
15162 else if(arrayExp->__anon1.list)
15163 {
15164 struct Expression * e;
15165
15166 for(e = (*arrayExp->__anon1.list).first; e; e = e->next)
15167 {
15168 ProcessExpressionType(e);
15169 if(e->expType)
15170 {
15171 if(!type)
15172 {
15173 type = e->expType;
15174 type->refCount++;
15175 }
15176 else
15177 {
15178 if(!MatchTypeExpression(e, type, (((void *)0)), 0, 1))
15179 {
15180 FreeType(type);
15181 type = e->expType;
15182 e->expType = (((void *)0));
15183 e = (*arrayExp->__anon1.list).first;
15184 ProcessExpressionType(e);
15185 if(e->expType)
15186 {
15187 if(!MatchTypeExpression(e, type, (((void *)0)), 0, 1))
15188 {
15189 FreeType(e->expType);
15190 e->expType = (((void *)0));
15191 FreeType(type);
15192 type = (((void *)0));
15193 break;
15194 }
15195 }
15196 }
15197 }
15198 if(e->expType)
15199 {
15200 FreeType(e->expType);
15201 e->expType = (((void *)0));
15202 }
15203 }
15204 }
15205 if(type)
15206 {
15207 typeStringBuf[0] = '\0';
15208 PrintType(type, typeStringBuf, 0, 1);
15209 typeString = typeStringBuf;
15210 FreeType(type);
15211 }
15212 }
15213 if(typeString)
15214 {
15215 if(inCompiler)
15216 {
15217 struct __ecereNameSpace__ecere__sys__OldList * initializers = MkList();
15218 struct Declarator * decl;
15219 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
15220
15221 if(arrayExp->__anon1.list)
15222 {
15223 struct Expression * e;
15224
15225 builtinCount = (*arrayExp->__anon1.list).count;
15226 type = ProcessTypeString(typeString, 0);
15227 while((e = (*arrayExp->__anon1.list).first))
15228 {
15229 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove((&*arrayExp->__anon1.list), e);
15230 e->destType = type;
15231 type->refCount++;
15232 ProcessExpressionType(e);
15233 if(inCompiler)
15234 ListAdd(initializers, MkInitializerAssignment(e));
15235 }
15236 FreeType(type);
15237 (__ecereNameSpace__ecere__com__eSystem_Delete(arrayExp->__anon1.list), arrayExp->__anon1.list = 0);
15238 }
15239 decl = SpecDeclFromString(typeString, specs, MkDeclaratorIdentifier(id));
15240 stmt->__anon1.compound.declarations = MkListOne(MkDeclaration(CopyList(specs, (void *)(CopySpecifier)), MkListOne(MkInitDeclarator(MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), decl), (((void *)0))))));
15241 ListAdd(stmt->__anon1.compound.declarations, MkDeclaration(specs, MkListOne(MkInitDeclarator(PlugDeclarator(decl, MkDeclaratorArray(MkDeclaratorIdentifier(MkIdentifier("__internalArray")), (((void *)0)))), MkInitializerList(initializers)))));
15242 FreeList(exp, (void *)(FreeExpression));
15243 }
15244 else if(arrayExp->__anon1.list)
15245 {
15246 struct Expression * e;
15247
15248 type = ProcessTypeString(typeString, 0);
15249 for(e = (*arrayExp->__anon1.list).first; e; e = e->next)
15250 {
15251 e->destType = type;
15252 type->refCount++;
15253 ProcessExpressionType(e);
15254 }
15255 FreeType(type);
15256 }
15257 }
15258 else
15259 {
15260 arrayExp->expType = ProcessTypeString("Container", 0);
15261 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Couldn't determine type of array elements\n", (((void *)0))));
15262 }
15263 }
15264 else if(inCompiler && isLinkList && !isList)
15265 {
15266 struct Declarator * decl;
15267 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
15268
15269 decl = SpecDeclFromString(_class->templateArgs[3].__anon1.__anon1.dataTypeString, specs, MkDeclaratorIdentifier(id));
15270 stmt->__anon1.compound.declarations = MkListOne(MkDeclaration(specs, MkListOne(MkInitDeclarator(decl, (((void *)0))))));
15271 ListAdd(stmt->__anon1.compound.declarations, MkDeclaration(MkListOne(MkSpecifierName(source->__anon1._class->__anon1.registered->fullName)), MkListOne(MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier("__internalLinkList")), MkInitializerAssignment(MkExpBrackets(exp))))));
15272 }
15273 else if(inCompiler && _class->templateArgs)
15274 {
15275 if(isMap)
15276 sprintf(iteratorType, "MapIterator<%s, %s >", _class->templateArgs[5].__anon1.__anon1.dataTypeString, _class->templateArgs[6].__anon1.__anon1.dataTypeString);
15277 else
15278 sprintf(iteratorType, "Iterator<%s, %s >", _class->templateArgs[2].__anon1.__anon1.dataTypeString, _class->templateArgs[1].__anon1.__anon1.dataTypeString);
15279 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)))))))));
15280 }
15281 if(inCompiler)
15282 {
15283 symbol = FindSymbol(id->string, curContext, curContext, 0, 0);
15284 if(block)
15285 {
15286 switch(block->type)
15287 {
15288 case 2:
15289 if(block->__anon1.compound.context)
15290 block->__anon1.compound.context->parent = stmt->__anon1.compound.context;
15291 break;
15292 case 4:
15293 if(block->__anon1.ifStmt.stmt && block->__anon1.ifStmt.stmt->type == 2 && block->__anon1.ifStmt.stmt->__anon1.compound.context)
15294 block->__anon1.ifStmt.stmt->__anon1.compound.context->parent = stmt->__anon1.compound.context;
15295 if(block->__anon1.ifStmt.elseStmt && block->__anon1.ifStmt.elseStmt->type == 2 && block->__anon1.ifStmt.elseStmt->__anon1.compound.context)
15296 block->__anon1.ifStmt.elseStmt->__anon1.compound.context->parent = stmt->__anon1.compound.context;
15297 break;
15298 case 5:
15299 if(block->__anon1.switchStmt.stmt && block->__anon1.switchStmt.stmt->type == 2 && block->__anon1.switchStmt.stmt->__anon1.compound.context)
15300 block->__anon1.switchStmt.stmt->__anon1.compound.context->parent = stmt->__anon1.compound.context;
15301 break;
15302 case 6:
15303 if(block->__anon1.whileStmt.stmt && block->__anon1.whileStmt.stmt->type == 2 && block->__anon1.whileStmt.stmt->__anon1.compound.context)
15304 block->__anon1.whileStmt.stmt->__anon1.compound.context->parent = stmt->__anon1.compound.context;
15305 break;
15306 case 7:
15307 if(block->__anon1.doWhile.stmt && block->__anon1.doWhile.stmt->type == 2 && block->__anon1.doWhile.stmt->__anon1.compound.context)
15308 block->__anon1.doWhile.stmt->__anon1.compound.context->parent = stmt->__anon1.compound.context;
15309 break;
15310 case 8:
15311 if(block->__anon1.forStmt.stmt && block->__anon1.forStmt.stmt->type == 2 && block->__anon1.forStmt.stmt->__anon1.compound.context)
15312 block->__anon1.forStmt.stmt->__anon1.compound.context->parent = stmt->__anon1.compound.context;
15313 break;
15314 case 18:
15315 if(block->__anon1.forEachStmt.stmt && block->__anon1.forEachStmt.stmt->type == 2 && block->__anon1.forEachStmt.stmt->__anon1.compound.context)
15316 block->__anon1.forEachStmt.stmt->__anon1.compound.context->parent = stmt->__anon1.compound.context;
15317 break;
15318 }
15319 }
15320 if(filter)
15321 {
15322 block = MkIfStmt(filter, block, (((void *)0)));
15323 }
15324 if(isArray)
15325 {
15326 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));
15327 ProcessStatement(((struct Statement *)(*stmt->__anon1.compound.statements).first)->__anon1.forStmt.init);
15328 ProcessStatement(((struct Statement *)(*stmt->__anon1.compound.statements).first)->__anon1.forStmt.check);
15329 ProcessExpressionType((*((struct Statement *)(*stmt->__anon1.compound.statements).first)->__anon1.forStmt.increment).first);
15330 }
15331 else if(isBuiltin)
15332 {
15333 char count[128];
15334
15335 sprintf(count, "%d", builtinCount);
15336 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));
15337 ProcessStatement(((struct Statement *)(*stmt->__anon1.compound.statements).first)->__anon1.forStmt.init);
15338 ProcessStatement(((struct Statement *)(*stmt->__anon1.compound.statements).first)->__anon1.forStmt.check);
15339 ProcessExpressionType((*((struct Statement *)(*stmt->__anon1.compound.statements).first)->__anon1.forStmt.increment).first);
15340 }
15341 else if(isLinkList && !isList)
15342 {
15343 struct __ecereNameSpace__ecere__com__Class * typeClass = __ecereNameSpace__ecere__com__eSystem_FindClass(_class->module, _class->templateArgs[3].__anon1.__anon1.dataTypeString);
15344 struct __ecereNameSpace__ecere__com__Class * listItemClass = __ecereNameSpace__ecere__com__eSystem_FindClass(_class->module, "ListItem");
15345
15346 if(typeClass && __ecereNameSpace__ecere__com__eClass_IsDerived(typeClass, listItemClass) && _class->templateArgs[5].__anon1.__anon1.dataTypeString && !strcmp(_class->templateArgs[5].__anon1.__anon1.dataTypeString, "LT::link"))
15347 {
15348 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));
15349 }
15350 else
15351 {
15352 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
15353 struct Declarator * decl = SpecDeclFromString(_class->templateArgs[3].__anon1.__anon1.dataTypeString, specs, (((void *)0)));
15354
15355 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));
15356 }
15357 ProcessStatement(((struct Statement *)(*stmt->__anon1.compound.statements).first)->__anon1.forStmt.init);
15358 ProcessStatement(((struct Statement *)(*stmt->__anon1.compound.statements).first)->__anon1.forStmt.check);
15359 ProcessExpressionType((*((struct Statement *)(*stmt->__anon1.compound.statements).first)->__anon1.forStmt.increment).first);
15360 }
15361 else
15362 {
15363 stmt->__anon1.compound.statements = MkListOne(MkWhileStmt(MkListOne(MkExpCall(MkExpMember(expIt = MkExpIdentifier(CopyIdentifier(id)), MkIdentifier("Next")), (((void *)0)))), block));
15364 }
15365 ProcessExpressionType(expIt);
15366 if((*stmt->__anon1.compound.declarations).first)
15367 ProcessDeclaration((*stmt->__anon1.compound.declarations).first, 1);
15368 if(symbol)
15369 symbol->isIterator = isMap ? 2 : ((isArray || isBuiltin) ? 3 : (isLinkList ? (isList ? 5 : 4) : (isCustomAVLTree ? 6 : 1)));
15370 ProcessStatement(stmt);
15371 }
15372 else
15373 ProcessStatement(stmt->__anon1.forEachStmt.stmt);
15374 if(inCompiler)
15375 curContext = stmt->__anon1.compound.context->parent;
15376 break;
15377 }
15378 else
15379 {
15380 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Expression is not a container\n", (((void *)0))));
15381 }
15382 break;
15383 }
15384 case 9:
15385 break;
15386 case 10:
15387 break;
15388 case 11:
15389 break;
15390 case 12:
15391 {
15392 struct Expression * exp;
15393
15394 if(stmt->__anon1.expressions)
15395 {
15396 for(exp = (*stmt->__anon1.expressions).first; exp; exp = exp->next)
15397 {
15398 if(!exp->next)
15399 {
15400 if(curFunction && !curFunction->type)
15401 curFunction->type = ProcessType(curFunction->specifiers, curFunction->declarator);
15402 FreeType(exp->destType);
15403 exp->destType = (curFunction && curFunction->type && curFunction->type->kind == 11) ? curFunction->type->__anon1.__anon2.returnType : (((void *)0));
15404 if(exp->destType)
15405 exp->destType->refCount++;
15406 }
15407 ProcessExpressionType(exp);
15408 }
15409 }
15410 break;
15411 }
15412 case 14:
15413 {
15414 ProcessDeclaration(stmt->__anon1.decl, 1);
15415 break;
15416 }
15417 case 13:
15418 {
15419 struct AsmField * field;
15420
15421 if(stmt->__anon1.asmStmt.inputFields)
15422 {
15423 for(field = (*stmt->__anon1.asmStmt.inputFields).first; field; field = field->next)
15424 if(field->expression)
15425 ProcessExpressionType(field->expression);
15426 }
15427 if(stmt->__anon1.asmStmt.outputFields)
15428 {
15429 for(field = (*stmt->__anon1.asmStmt.outputFields).first; field; field = field->next)
15430 if(field->expression)
15431 ProcessExpressionType(field->expression);
15432 }
15433 if(stmt->__anon1.asmStmt.clobberedFields)
15434 {
15435 for(field = (*stmt->__anon1.asmStmt.clobberedFields).first; field; field = field->next)
15436 {
15437 if(field->expression)
15438 ProcessExpressionType(field->expression);
15439 }
15440 }
15441 break;
15442 }
15443 case 17:
15444 {
15445 struct PropertyWatch * propWatch;
15446 struct __ecereNameSpace__ecere__sys__OldList * watches = stmt->__anon1._watch.watches;
15447 struct Expression * object = stmt->__anon1._watch.object;
15448 struct Expression * watcher = stmt->__anon1._watch.watcher;
15449
15450 if(watcher)
15451 ProcessExpressionType(watcher);
15452 if(object)
15453 ProcessExpressionType(object);
15454 if(inCompiler)
15455 {
15456 if(watcher || thisClass)
15457 {
15458 struct External * external = curExternal;
15459 struct Context * context = curContext;
15460
15461 stmt->type = 3;
15462 stmt->__anon1.expressions = MkList();
15463 for(propWatch = (*watches).first; propWatch; propWatch = propWatch->next)
15464 {
15465 struct ClassFunction * func;
15466 char watcherName[1024];
15467 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;
15468 struct External * createdExternal;
15469
15470 sprintf(watcherName, "__ecerePropertyWatcher_%d", propWatcherID++);
15471 if(propWatch->deleteWatch)
15472 strcat(watcherName, "_delete");
15473 else
15474 {
15475 struct Identifier * propID;
15476
15477 for(propID = (*propWatch->properties).first; propID; propID = propID->next)
15478 {
15479 strcat(watcherName, "_");
15480 strcat(watcherName, propID->string);
15481 }
15482 }
15483 if(object && object->expType && object->expType->kind == 8 && object->expType->__anon1._class && object->expType->__anon1._class->__anon1.registered)
15484 {
15485 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)));
15486 ProcessClassFunctionBody(func, propWatch->compound);
15487 propWatch->compound = (((void *)0));
15488 createdExternal = ProcessClassFunction(watcherClass, func, ast, curExternal, 1);
15489 FreeClassFunction(func);
15490 curExternal = createdExternal;
15491 ProcessFunction(createdExternal->__anon1.function);
15492 if(propWatch->deleteWatch)
15493 {
15494 struct __ecereNameSpace__ecere__sys__OldList * args = MkList();
15495
15496 ListAdd(args, CopyExpression(object));
15497 ListAdd(args, watcher ? CopyExpression(watcher) : MkExpIdentifier(MkIdentifier("this")));
15498 ListAdd(args, MkExpIdentifier(MkIdentifier(watcherName)));
15499 ListAdd(stmt->__anon1.expressions, MkExpCall(MkExpIdentifier(MkIdentifier("ecere::com::eInstance_WatchDestruction")), args));
15500 }
15501 else
15502 {
15503 struct __ecereNameSpace__ecere__com__Class * _class = object->expType->__anon1._class->__anon1.registered;
15504 struct Identifier * propID;
15505
15506 for(propID = (*propWatch->properties).first; propID; propID = propID->next)
15507 {
15508 char propName[1024];
15509 struct __ecereNameSpace__ecere__com__Property * prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, propID->string, privateModule);
15510
15511 if(prop)
15512 {
15513 char getName[1024], setName[1024];
15514 struct __ecereNameSpace__ecere__sys__OldList * args = MkList();
15515
15516 DeclareProperty(createdExternal, prop, setName, getName);
15517 strcpy(propName, "__ecereProp_");
15518 FullClassNameCat(propName, prop->_class->fullName, 0);
15519 strcat(propName, "_");
15520 FullClassNameCat(propName, prop->name, 1);
15521 ListAdd(args, CopyExpression(object));
15522 ListAdd(args, MkExpIdentifier(MkIdentifier(propName)));
15523 ListAdd(args, watcher ? CopyExpression(watcher) : MkExpIdentifier(MkIdentifier("this")));
15524 ListAdd(args, MkExpCast(MkTypeName(MkListOne(MkSpecifier(VOID)), MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), (((void *)0)))), MkExpIdentifier(MkIdentifier(watcherName))));
15525 ListAdd(stmt->__anon1.expressions, MkExpCall(MkExpIdentifier(MkIdentifier("ecere::com::eInstance_Watch")), args));
15526 __ecereMethod_External_CreateUniqueEdge(external, createdExternal, 1);
15527 }
15528 else
15529 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Property %s not found in class %s\n", (((void *)0))), propID->string, _class->fullName);
15530 }
15531 }
15532 }
15533 else
15534 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Invalid watched object\n", (((void *)0))));
15535 }
15536 curExternal = external;
15537 curContext = context;
15538 if(watcher)
15539 FreeExpression(watcher);
15540 if(object)
15541 FreeExpression(object);
15542 FreeList(watches, (void *)(FreePropertyWatch));
15543 }
15544 else
15545 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "No observer specified and not inside a class\n", (((void *)0))));
15546 }
15547 else
15548 {
15549 for(propWatch = (*watches).first; propWatch; propWatch = propWatch->next)
15550 {
15551 ProcessStatement(propWatch->compound);
15552 }
15553 }
15554 break;
15555 }
15556 case 15:
15557 {
15558 struct __ecereNameSpace__ecere__sys__OldList * watches = stmt->__anon1._watch.watches;
15559 struct Expression * object = stmt->__anon1._watch.object;
15560 struct __ecereNameSpace__ecere__com__Class * _class;
15561
15562 if(object)
15563 ProcessExpressionType(object);
15564 if(inCompiler)
15565 {
15566 _class = object ? ((object->expType && object->expType->kind == 8 && object->expType->__anon1._class) ? object->expType->__anon1._class->__anon1.registered : (((void *)0))) : thisClass;
15567 if(_class)
15568 {
15569 struct Identifier * propID;
15570
15571 stmt->type = 3;
15572 stmt->__anon1.expressions = MkList();
15573 if(!watches && curFunction->propSet && (!object || (object->type == 0 && !strcmp(object->__anon1.__anon1.identifier->string, "this"))))
15574 {
15575 watches = MkListOne(MkIdentifier(curFunction->propSet->string));
15576 }
15577 else if(!watches)
15578 {
15579 }
15580 if(watches)
15581 {
15582 for(propID = (*watches).first; propID; propID = propID->next)
15583 {
15584 struct __ecereNameSpace__ecere__com__Property * prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, propID->string, privateModule);
15585
15586 if(prop)
15587 {
15588 CreateFireWatcher(prop, object, stmt);
15589 }
15590 else
15591 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Property %s not found in class %s\n", (((void *)0))), propID->string, _class->fullName);
15592 }
15593 }
15594 else
15595 {
15596 struct __ecereNameSpace__ecere__com__Property * prop;
15597 struct __ecereNameSpace__ecere__com__Class * base;
15598
15599 for(base = _class; base; base = base->base)
15600 {
15601 for(prop = base->membersAndProperties.first; prop; prop = prop->next)
15602 {
15603 if(prop->isProperty && prop->isWatchable)
15604 {
15605 CreateFireWatcher(prop, object, stmt);
15606 }
15607 }
15608 }
15609 }
15610 if(object)
15611 FreeExpression(object);
15612 FreeList(watches, (void *)(FreeIdentifier));
15613 }
15614 else
15615 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Invalid object specified and not inside a class\n", (((void *)0))));
15616 }
15617 break;
15618 }
15619 case 16:
15620 {
15621 struct __ecereNameSpace__ecere__sys__OldList * watches = stmt->__anon1._watch.watches;
15622 struct Expression * object = stmt->__anon1._watch.object;
15623 struct Expression * watcher = stmt->__anon1._watch.watcher;
15624 struct __ecereNameSpace__ecere__com__Class * _class;
15625
15626 if(object)
15627 ProcessExpressionType(object);
15628 if(watcher)
15629 ProcessExpressionType(watcher);
15630 if(inCompiler)
15631 {
15632 _class = (object && object->expType && object->expType->kind == 8 && object->expType->__anon1._class) ? object->expType->__anon1._class->__anon1.registered : (((void *)0));
15633 if(watcher || thisClass)
15634 {
15635 if(_class)
15636 {
15637 struct Identifier * propID;
15638
15639 stmt->type = 3;
15640 stmt->__anon1.expressions = MkList();
15641 if(!watches)
15642 {
15643 struct __ecereNameSpace__ecere__sys__OldList * args;
15644
15645 args = MkList();
15646 ListAdd(args, CopyExpression(object));
15647 ListAdd(args, MkExpConstant("0"));
15648 ListAdd(args, watcher ? CopyExpression(watcher) : MkExpIdentifier(MkIdentifier("this")));
15649 ListAdd(stmt->__anon1.expressions, MkExpCall(MkExpIdentifier(MkIdentifier("ecere::com::eInstance_StopWatching")), args));
15650 }
15651 else
15652 {
15653 for(propID = (*watches).first; propID; propID = propID->next)
15654 {
15655 char propName[1024];
15656 struct __ecereNameSpace__ecere__com__Property * prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, propID->string, privateModule);
15657
15658 if(prop)
15659 {
15660 char getName[1024], setName[1024];
15661 struct __ecereNameSpace__ecere__sys__OldList * args = MkList();
15662
15663 DeclareProperty(curExternal, prop, setName, getName);
15664 strcpy(propName, "__ecereProp_");
15665 FullClassNameCat(propName, prop->_class->fullName, 0);
15666 strcat(propName, "_");
15667 FullClassNameCat(propName, prop->name, 1);
15668 ListAdd(args, CopyExpression(object));
15669 ListAdd(args, MkExpIdentifier(MkIdentifier(propName)));
15670 ListAdd(args, watcher ? CopyExpression(watcher) : MkExpIdentifier(MkIdentifier("this")));
15671 ListAdd(stmt->__anon1.expressions, MkExpCall(MkExpIdentifier(MkIdentifier("ecere::com::eInstance_StopWatching")), args));
15672 }
15673 else
15674 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Property %s not found in class %s\n", (((void *)0))), propID->string, _class->fullName);
15675 }
15676 }
15677 if(object)
15678 FreeExpression(object);
15679 if(watcher)
15680 FreeExpression(watcher);
15681 FreeList(watches, (void *)(FreeIdentifier));
15682 }
15683 else
15684 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Invalid object specified and not inside a class\n", (((void *)0))));
15685 }
15686 else
15687 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "No observer specified and not inside a class\n", (((void *)0))));
15688 }
15689 break;
15690 }
15691 }
15692 }
15693
15694 void ComputeDataTypes()
15695 {
15696 struct External * external;
15697
15698 currentClass = (((void *)0));
15699 containerClass = __ecereNameSpace__ecere__com__eSystem_FindClass(GetPrivateModule(), "Container");
15700 DeclareStruct((((void *)0)), "ecere::com::Class", 0, 1);
15701 DeclareStruct((((void *)0)), "ecere::com::Instance", 0, 1);
15702 DeclareStruct((((void *)0)), "ecere::com::Property", 0, 1);
15703 DeclareStruct((((void *)0)), "ecere::com::DataMember", 0, 1);
15704 DeclareStruct((((void *)0)), "ecere::com::Method", 0, 1);
15705 DeclareStruct((((void *)0)), "ecere::com::SerialBuffer", 0, 1);
15706 DeclareStruct((((void *)0)), "ecere::com::ClassTemplateArgument", 0, 1);
15707 DeclareFunctionUtil((((void *)0)), "eSystem_New");
15708 DeclareFunctionUtil((((void *)0)), "eSystem_New0");
15709 DeclareFunctionUtil((((void *)0)), "eSystem_Renew");
15710 DeclareFunctionUtil((((void *)0)), "eSystem_Renew0");
15711 DeclareFunctionUtil((((void *)0)), "eSystem_Delete");
15712 DeclareFunctionUtil((((void *)0)), "eClass_GetProperty");
15713 DeclareFunctionUtil((((void *)0)), "eClass_SetProperty");
15714 DeclareFunctionUtil((((void *)0)), "eInstance_FireSelfWatchers");
15715 DeclareFunctionUtil((((void *)0)), "eInstance_SetMethod");
15716 DeclareFunctionUtil((((void *)0)), "eInstance_IncRef");
15717 DeclareFunctionUtil((((void *)0)), "eInstance_StopWatching");
15718 DeclareFunctionUtil((((void *)0)), "eInstance_Watch");
15719 DeclareFunctionUtil((((void *)0)), "eInstance_FireWatchers");
15720 reachedPass15 = 1;
15721 for(external = (*ast).first; external; external = external->next)
15722 {
15723 afterExternal = curExternal = external;
15724 if(external->type == 0)
15725 {
15726 if(memoryGuard)
15727 {
15728 DeclareFunctionUtil(external, "MemoryGuard_PushLoc");
15729 DeclareFunctionUtil(external, "MemoryGuard_PopLoc");
15730 }
15731 currentClass = external->__anon1.function->_class;
15732 ProcessFunction(external->__anon1.function);
15733 }
15734 else if(external->type == 1)
15735 {
15736 if(memoryGuard && external->__anon1.declaration && external->__anon1.declaration->type == 2)
15737 {
15738 DeclareFunctionUtil(external, "MemoryGuard_PushLoc");
15739 DeclareFunctionUtil(external, "MemoryGuard_PopLoc");
15740 }
15741 currentClass = (((void *)0));
15742 if(external->__anon1.declaration)
15743 ProcessDeclaration(external->__anon1.declaration, 1);
15744 }
15745 else if(external->type == 2)
15746 {
15747 struct ClassDefinition * _class = external->__anon1._class;
15748
15749 currentClass = external->symbol->__anon1.registered;
15750 if(memoryGuard)
15751 {
15752 DeclareFunctionUtil(external, "MemoryGuard_PushLoc");
15753 DeclareFunctionUtil(external, "MemoryGuard_PopLoc");
15754 }
15755 if(_class->definitions)
15756 {
15757 ProcessClass(_class->definitions, _class->symbol);
15758 }
15759 if(inCompiler)
15760 {
15761 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove((&*ast), external);
15762 ((external ? __extension__ ({
15763 void * __ecerePtrToDelete = (external);
15764
15765 __ecereClass_External->Destructor ? __ecereClass_External->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete);
15766 }) : 0), external = 0);
15767 }
15768 }
15769 else if(external->type == 4)
15770 {
15771 thisNameSpace = external->__anon1.id->string;
15772 }
15773 }
15774 currentClass = (((void *)0));
15775 thisNameSpace = (((void *)0));
15776 curExternal = (((void *)0));
15777 }
15778
15779 void ProcessExpressionType(struct Expression * exp)
15780 {
15781 unsigned int unresolved = 0;
15782 struct Location oldyylloc = yylloc;
15783 unsigned int notByReference = 0;
15784
15785 if(!exp || exp->expType)
15786 return ;
15787 yylloc = exp->loc;
15788 switch(exp->type)
15789 {
15790 case 0:
15791 {
15792 struct Identifier * id = exp->__anon1.__anon1.identifier;
15793
15794 if(!id || !topContext)
15795 return ;
15796 if(id->_class && id->_class->__anon1.__anon1.name)
15797 {
15798 id->classSym = id->_class->__anon1.__anon1.symbol;
15799 }
15800 if(!strcmp(id->string, "__runtimePlatform"))
15801 {
15802 exp->expType = ProcessTypeString("ecere::com::Platform", 1);
15803 break;
15804 }
15805 else if(strstr(id->string, "__ecereClass") == id->string)
15806 {
15807 exp->expType = ProcessTypeString("ecere::com::Class", 1);
15808 break;
15809 }
15810 else if(id->_class && (id->classSym || (id->_class->__anon1.__anon1.name && !strcmp(id->_class->__anon1.__anon1.name, "property"))))
15811 {
15812 ReplaceClassMembers(exp, thisClass);
15813 if(exp->type != 0)
15814 {
15815 ProcessExpressionType(exp);
15816 break;
15817 }
15818 if(id->classSym && ResolveIdWithClass(exp, id->classSym->__anon1.registered, 0))
15819 break;
15820 }
15821 else
15822 {
15823 struct Symbol * symbol = (((void *)0));
15824 unsigned int findInGlobal = 0;
15825
15826 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)
15827 findInGlobal = 1;
15828 else
15829 symbol = FindSymbol(id->string, curContext, topContext, 0, id->_class && id->_class->__anon1.__anon1.name == (((void *)0)));
15830 if(!symbol)
15831 {
15832 if(exp->destType && CheckExpressionType(exp, exp->destType, 0, 0))
15833 break;
15834 else
15835 {
15836 if(thisClass)
15837 {
15838 ReplaceClassMembers(exp, thisClass ? thisClass : currentClass);
15839 if(exp->type != 0)
15840 {
15841 ProcessExpressionType(exp);
15842 break;
15843 }
15844 }
15845 else if(currentClass && !id->_class)
15846 {
15847 if(ResolveIdWithClass(exp, currentClass, 1))
15848 break;
15849 }
15850 symbol = FindSymbol(id->string, topContext->parent, globalContext, 0, id->_class && id->_class->__anon1.__anon1.name == (((void *)0)));
15851 }
15852 }
15853 if(findInGlobal)
15854 symbol = FindSymbol(id->string, curContext, topContext, 0, id->_class && id->_class->__anon1.__anon1.name == (((void *)0)));
15855 if(symbol)
15856 {
15857 struct Type * type = symbol->type;
15858 struct __ecereNameSpace__ecere__com__Class * _class = (type && type->kind == 8 && type->__anon1._class) ? type->__anon1._class->__anon1.registered : (((void *)0));
15859
15860 if(_class && !strcmp(id->string, "this") && !type->classObjectType)
15861 {
15862 struct Context * context = SetupTemplatesContext(_class);
15863
15864 type = ReplaceThisClassType(_class);
15865 FinishTemplatesContext(context);
15866 if(type)
15867 type->refCount = 0;
15868 }
15869 FreeSpecifier(id->_class);
15870 id->_class = (((void *)0));
15871 (__ecereNameSpace__ecere__com__eSystem_Delete(id->string), id->string = 0);
15872 id->string = __ecereNameSpace__ecere__sys__CopyString(symbol->string);
15873 id->classSym = (((void *)0));
15874 exp->expType = type;
15875 if(type)
15876 type->refCount++;
15877 if(type && (type->kind == 15))
15878 exp->isConstant = 1;
15879 if(symbol->isParam || !strcmp(id->string, "this"))
15880 {
15881 if(_class && _class->type == 1 && !type->declaredWithStruct)
15882 exp->byReference = 1;
15883 }
15884 if(symbol->isIterator)
15885 {
15886 if(symbol->isIterator == 3)
15887 {
15888 exp->type = 5;
15889 exp->__anon1.list = MkListOne(MkExpOp((((void *)0)), '*', MkExpIdentifier(exp->__anon1.__anon1.identifier)));
15890 ((struct Expression *)(*exp->__anon1.list).first)->__anon1.op.exp2->expType = exp->expType;
15891 exp->expType = (((void *)0));
15892 ProcessExpressionType(exp);
15893 }
15894 else if(symbol->isIterator != 4)
15895 {
15896 exp->type = 8;
15897 exp->__anon1.member.exp = MkExpIdentifier(exp->__anon1.__anon1.identifier);
15898 exp->__anon1.member.exp->expType = exp->expType;
15899 exp->__anon1.member.member = MkIdentifier("data");
15900 exp->expType = (((void *)0));
15901 ProcessExpressionType(exp);
15902 }
15903 }
15904 break;
15905 }
15906 else
15907 {
15908 struct __ecereNameSpace__ecere__com__DefinedExpression * definedExp = (((void *)0));
15909
15910 if(thisNameSpace && !(id->_class && !id->_class->__anon1.__anon1.name))
15911 {
15912 char name[1024];
15913
15914 strcpy(name, thisNameSpace);
15915 strcat(name, "::");
15916 strcat(name, id->string);
15917 definedExp = __ecereNameSpace__ecere__com__eSystem_FindDefine(privateModule, name);
15918 }
15919 if(!definedExp)
15920 definedExp = __ecereNameSpace__ecere__com__eSystem_FindDefine(privateModule, id->string);
15921 if(definedExp)
15922 {
15923 int c;
15924
15925 for(c = 0; c < definedExpStackPos; c++)
15926 if(definedExpStack[c] == definedExp)
15927 break;
15928 if(c == definedExpStackPos && c < sizeof (definedExpStack) / sizeof(void *))
15929 {
15930 struct Location backupYylloc = yylloc;
15931 struct __ecereNameSpace__ecere__com__Instance * backInput = fileInput;
15932
15933 definedExpStack[definedExpStackPos++] = definedExp;
15934 fileInput = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass___ecereNameSpace__ecere__sys__TempFile);
15935 ((int (*)(struct __ecereNameSpace__ecere__com__Instance *, const void *  buffer, unsigned int size, unsigned int count))__extension__ ({
15936 struct __ecereNameSpace__ecere__com__Instance * __internal_ClassInst = fileInput;
15937
15938 __internal_ClassInst ? __internal_ClassInst->_vTbl : __ecereClass___ecereNameSpace__ecere__sys__File->_vTbl;
15939 })[__ecereVMethodID___ecereNameSpace__ecere__sys__File_Write])(fileInput, definedExp->value, 1, strlen(definedExp->value));
15940 ((unsigned int (*)(struct __ecereNameSpace__ecere__com__Instance *, int pos, int mode))__extension__ ({
15941 struct __ecereNameSpace__ecere__com__Instance * __internal_ClassInst = fileInput;
15942
15943 __internal_ClassInst ? __internal_ClassInst->_vTbl : __ecereClass___ecereNameSpace__ecere__sys__File->_vTbl;
15944 })[__ecereVMethodID___ecereNameSpace__ecere__sys__File_Seek])(fileInput, 0, 0);
15945 echoOn = 0;
15946 parsedExpression = (((void *)0));
15947 resetScanner();
15948 expression_yyparse();
15949 (__ecereNameSpace__ecere__com__eInstance_DecRef(fileInput), fileInput = 0);
15950 if(backInput)
15951 fileInput = backInput;
15952 yylloc = backupYylloc;
15953 if(parsedExpression)
15954 {
15955 FreeIdentifier(id);
15956 exp->type = 5;
15957 exp->__anon1.list = MkListOne(parsedExpression);
15958 ApplyLocation(parsedExpression, &yylloc);
15959 ProcessExpressionType(exp);
15960 definedExpStackPos--;
15961 return ;
15962 }
15963 definedExpStackPos--;
15964 }
15965 else
15966 {
15967 if(inCompiler)
15968 {
15969 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Recursion in defined expression %s\n", (((void *)0))), id->string);
15970 }
15971 }
15972 }
15973 else
15974 {
15975 struct GlobalData * data = (((void *)0));
15976
15977 if(thisNameSpace && !(id->_class && !id->_class->__anon1.__anon1.name))
15978 {
15979 char name[1024];
15980
15981 strcpy(name, thisNameSpace);
15982 strcat(name, "::");
15983 strcat(name, id->string);
15984 data = FindGlobalData(name);
15985 }
15986 if(!data)
15987 data = FindGlobalData(id->string);
15988 if(data)
15989 {
15990 DeclareGlobalData(curExternal, data);
15991 exp->expType = data->dataType;
15992 if(data->dataType)
15993 data->dataType->refCount++;
15994 (__ecereNameSpace__ecere__com__eSystem_Delete(id->string), id->string = 0);
15995 id->string = __ecereNameSpace__ecere__sys__CopyString(data->fullName);
15996 FreeSpecifier(id->_class);
15997 id->_class = (((void *)0));
15998 break;
15999 }
16000 else
16001 {
16002 struct __ecereNameSpace__ecere__com__GlobalFunction * function = (((void *)0));
16003
16004 if(thisNameSpace && !(id->_class && !id->_class->__anon1.__anon1.name))
16005 {
16006 char name[1024];
16007
16008 strcpy(name, thisNameSpace);
16009 strcat(name, "::");
16010 strcat(name, id->string);
16011 function = __ecereNameSpace__ecere__com__eSystem_FindFunction(privateModule, name);
16012 }
16013 if(!function)
16014 function = __ecereNameSpace__ecere__com__eSystem_FindFunction(privateModule, id->string);
16015 if(function)
16016 {
16017 char name[1024];
16018
16019 (__ecereNameSpace__ecere__com__eSystem_Delete(id->string), id->string = 0);
16020 id->string = __ecereNameSpace__ecere__sys__CopyString(function->name);
16021 name[0] = 0;
16022 if(((struct __ecereNameSpace__ecere__com__Module *)(((char *)function->module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->importType != 1 && (!function->dataType || !function->dataType->dllExport))
16023 strcpy(name, "__ecereFunction_");
16024 FullClassNameCat(name, id->string, 0);
16025 if(DeclareFunction(curExternal, function, name))
16026 {
16027 (__ecereNameSpace__ecere__com__eSystem_Delete(id->string), id->string = 0);
16028 id->string = __ecereNameSpace__ecere__sys__CopyString(name);
16029 }
16030 exp->expType = function->dataType;
16031 if(function->dataType)
16032 function->dataType->refCount++;
16033 FreeSpecifier(id->_class);
16034 id->_class = (((void *)0));
16035 break;
16036 }
16037 }
16038 }
16039 }
16040 }
16041 unresolved = 1;
16042 break;
16043 }
16044 case 1:
16045 {
16046 if(!exp->__anon1.instance->_class)
16047 {
16048 if(exp->destType && exp->destType->kind == 8 && exp->destType->__anon1._class)
16049 {
16050 exp->__anon1.instance->_class = MkSpecifierName(exp->destType->__anon1._class->string);
16051 }
16052 }
16053 ProcessInstantiationType(exp->__anon1.instance);
16054 exp->isConstant = exp->__anon1.instance->isConstant;
16055 if(exp->__anon1.instance->_class)
16056 {
16057 exp->expType = MkClassType(exp->__anon1.instance->_class->__anon1.__anon1.name);
16058 }
16059 break;
16060 }
16061 case 2:
16062 {
16063 if(!exp->expType)
16064 {
16065 char * constant = exp->__anon1.__anon1.constant;
16066 struct Type * type = (type = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type), type->refCount = 1, type->constant = 1, type);
16067
16068 exp->expType = type;
16069 if(constant[0] == '\'')
16070 {
16071 if((int)((unsigned char *)constant)[1] > 127)
16072 {
16073 int nb;
16074 unsigned int ch = __ecereNameSpace__ecere__sys__UTF8GetChar(constant + 1, &nb);
16075
16076 if(nb < 2)
16077 ch = constant[1];
16078 (__ecereNameSpace__ecere__com__eSystem_Delete(constant), constant = 0);
16079 exp->__anon1.__anon1.constant = PrintUInt(ch);
16080 type->kind = 8;
16081 type->__anon1._class = FindClass("unichar");
16082 type->isSigned = 0;
16083 }
16084 else
16085 {
16086 type->kind = 1;
16087 type->isSigned = 1;
16088 }
16089 }
16090 else
16091 {
16092 char * dot = strchr(constant, '.');
16093 unsigned int isHex = (constant[0] == '0' && (constant[1] == 'x' || constant[1] == 'X'));
16094 char * exponent;
16095
16096 if(isHex)
16097 {
16098 exponent = strchr(constant, 'p');
16099 if(!exponent)
16100 exponent = strchr(constant, 'P');
16101 }
16102 else
16103 {
16104 exponent = strchr(constant, 'e');
16105 if(!exponent)
16106 exponent = strchr(constant, 'E');
16107 }
16108 if(dot || exponent)
16109 {
16110 if(strchr(constant, 'f') || strchr(constant, 'F'))
16111 type->kind = 6;
16112 else
16113 type->kind = 7;
16114 type->isSigned = 1;
16115 }
16116 else
16117 {
16118 unsigned int isSigned = constant[0] == '-';
16119 char * endP = (((void *)0));
16120 long long i64 = strtoll(constant, &endP, 0);
16121 uint64 ui64 = strtoull(constant, &endP, 0);
16122 unsigned int is64Bit = endP && (!strcmp(endP, "LL") || !strcmp(endP, "ll") || !strcmp(endP, "LLU") || !strcmp(endP, "llu") || !strcmp(endP, "ull") || !strcmp(endP, "ULL"));
16123 unsigned int forceUnsigned = endP && (!strcmp(endP, "U") || !strcmp(endP, "u") || !strcmp(endP, "LLU") || !strcmp(endP, "llu") || !strcmp(endP, "ull") || !strcmp(endP, "ULL"));
16124
16125 if(isSigned)
16126 {
16127 if(i64 < (((int)0x80000000)))
16128 is64Bit = 1;
16129 }
16130 else
16131 {
16132 if(ui64 > (((int)0x7fffffff)))
16133 {
16134 if(ui64 > (0xffffffff))
16135 {
16136 is64Bit = 1;
16137 if(ui64 <= (((long long)0x7fffffffffffffffLL)) && (constant[0] != '0' || !constant[1]))
16138 isSigned = 1;
16139 }
16140 }
16141 else if(constant[0] != '0' || !constant[1])
16142 isSigned = 1;
16143 }
16144 if(forceUnsigned)
16145 isSigned = 0;
16146 type->kind = is64Bit ? 4 : 3;
16147 type->isSigned = isSigned;
16148 }
16149 }
16150 exp->isConstant = 1;
16151 if(exp->destType && exp->destType->kind == 7)
16152 type->kind = 7;
16153 else if(exp->destType && exp->destType->kind == 6)
16154 type->kind = 6;
16155 else if(exp->destType && exp->destType->kind == 4)
16156 type->kind = 4;
16157 }
16158 break;
16159 }
16160 case 3:
16161 {
16162 exp->isConstant = 1;
16163 exp->expType = __extension__ ({
16164 struct Type * __ecereInstance2 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
16165
16166 __ecereInstance2->refCount = 1, __ecereInstance2->kind = 13, __ecereInstance2->__anon1.type = __extension__ ({
16167 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
16168
16169 __ecereInstance1->refCount = 1, __ecereInstance1->kind = exp->__anon1.__anon2.wideString ? 2 : 1, __ecereInstance1->constant = 1, __ecereInstance1->isSigned = exp->__anon1.__anon2.wideString ? 0 : 1, __ecereInstance1;
16170 }), __ecereInstance2;
16171 });
16172 break;
16173 }
16174 case 13:
16175 case 26:
16176 ProcessExpressionType(exp->__anon1._new.size);
16177 exp->expType = __extension__ ({
16178 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
16179
16180 __ecereInstance1->refCount = 1, __ecereInstance1->kind = 13, __ecereInstance1->__anon1.type = ProcessType(exp->__anon1._new.typeName->qualifiers, exp->__anon1._new.typeName->declarator), __ecereInstance1;
16181 });
16182 DeclareType(curExternal, exp->expType->__anon1.type, 1, 0);
16183 break;
16184 case 14:
16185 case 27:
16186 ProcessExpressionType(exp->__anon1._renew.size);
16187 ProcessExpressionType(exp->__anon1._renew.exp);
16188 exp->expType = __extension__ ({
16189 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
16190
16191 __ecereInstance1->refCount = 1, __ecereInstance1->kind = 13, __ecereInstance1->__anon1.type = ProcessType(exp->__anon1._renew.typeName->qualifiers, exp->__anon1._renew.typeName->declarator), __ecereInstance1;
16192 });
16193 DeclareType(curExternal, exp->expType->__anon1.type, 1, 0);
16194 break;
16195 case 4:
16196 {
16197 unsigned int assign = 0, boolResult = 0, boolOps = 0;
16198 struct Type * type1 = (((void *)0)), * type2 = (((void *)0));
16199 unsigned int useDestType = 0, useSideType = 0;
16200 struct Location oldyylloc = yylloc;
16201 unsigned int useSideUnit = 0;
16202 struct __ecereNameSpace__ecere__com__Class * destClass = (exp->destType && exp->destType->kind == 8 && exp->destType->__anon1._class) ? exp->destType->__anon1._class->__anon1.registered : (((void *)0));
16203 struct Type * dummy = (dummy = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type), dummy->count = 1, dummy->refCount = 1, dummy);
16204
16205 switch(exp->__anon1.op.op)
16206 {
16207 case '=':
16208 case MUL_ASSIGN:
16209 case DIV_ASSIGN:
16210 case MOD_ASSIGN:
16211 case ADD_ASSIGN:
16212 case SUB_ASSIGN:
16213 case LEFT_ASSIGN:
16214 case RIGHT_ASSIGN:
16215 case AND_ASSIGN:
16216 case XOR_ASSIGN:
16217 case OR_ASSIGN:
16218 assign = 1;
16219 break;
16220 case '!':
16221 break;
16222 case AND_OP:
16223 case OR_OP:
16224 boolOps = 1;
16225 boolResult = 1;
16226 break;
16227 case EQ_OP:
16228 case '<':
16229 case '>':
16230 case LE_OP:
16231 case GE_OP:
16232 case NE_OP:
16233 boolResult = 1;
16234 useSideType = 1;
16235 break;
16236 case '+':
16237 case '-':
16238 useSideUnit = 1;
16239 useSideType = 1;
16240 useDestType = 1;
16241 break;
16242 case LEFT_OP:
16243 case RIGHT_OP:
16244 break;
16245 case '|':
16246 case '^':
16247 useSideType = 1;
16248 useDestType = 1;
16249 break;
16250 case '/':
16251 case '%':
16252 useSideType = 1;
16253 useDestType = 1;
16254 break;
16255 case '&':
16256 case '*':
16257 if(exp->__anon1.op.exp1)
16258 {
16259 useSideType = 1;
16260 useDestType = 1;
16261 }
16262 break;
16263 }
16264 if(exp->__anon1.op.op == '&')
16265 {
16266 if(!exp->__anon1.op.exp1 && exp->__anon1.op.exp2 && exp->__anon1.op.exp2->type == 0 && exp->__anon1.op.exp2->__anon1.__anon1.identifier)
16267 {
16268 struct Identifier * id = exp->__anon1.op.exp2->__anon1.__anon1.identifier;
16269 struct Symbol * symbol = FindSymbol(id->string, curContext, topContext, 0, id->_class && id->_class->__anon1.__anon1.name == (((void *)0)));
16270
16271 if(symbol && symbol->isIterator == 2)
16272 {
16273 exp->type = 8;
16274 exp->__anon1.member.exp = exp->__anon1.op.exp2;
16275 exp->__anon1.member.member = MkIdentifier("key");
16276 exp->expType = (((void *)0));
16277 exp->__anon1.op.exp2->expType = symbol->type;
16278 symbol->type->refCount++;
16279 ProcessExpressionType(exp);
16280 FreeType(dummy);
16281 break;
16282 }
16283 }
16284 }
16285 if(exp->__anon1.op.exp1)
16286 {
16287 if(exp->__anon1.op.exp2 && useSideUnit && useDestType && destClass && destClass->type == 3 && destClass->base->type != 3)
16288 useDestType = 0;
16289 if(destClass && useDestType && ((destClass->type == 3 && useSideUnit) || destClass->type == 4 || destClass->type == 2))
16290 {
16291 if(exp->__anon1.op.exp1->destType)
16292 FreeType(exp->__anon1.op.exp1->destType);
16293 exp->__anon1.op.exp1->destType = exp->destType;
16294 exp->__anon1.op.exp1->opDestType = 1;
16295 if(exp->destType)
16296 exp->destType->refCount++;
16297 }
16298 else if(!assign)
16299 {
16300 if(exp->__anon1.op.exp1->destType)
16301 FreeType(exp->__anon1.op.exp1->destType);
16302 exp->__anon1.op.exp1->destType = dummy;
16303 dummy->refCount++;
16304 }
16305 if(exp->__anon1.op.exp1->destType && exp->__anon1.op.op != '=')
16306 exp->__anon1.op.exp1->destType->count++;
16307 ProcessExpressionType(exp->__anon1.op.exp1);
16308 if(exp->__anon1.op.exp1->destType && exp->__anon1.op.op != '=')
16309 exp->__anon1.op.exp1->destType->count--;
16310 exp->__anon1.op.exp1->opDestType = 0;
16311 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)
16312 {
16313 exp->__anon1.op.exp2 = MkExpConstant("1");
16314 exp->__anon1.op.op = exp->__anon1.op.op == INC_OP ? ADD_ASSIGN : SUB_ASSIGN;
16315 assign = 1;
16316 }
16317 if(exp->__anon1.op.exp1->destType == dummy)
16318 {
16319 FreeType(dummy);
16320 exp->__anon1.op.exp1->destType = (((void *)0));
16321 }
16322 if(exp->__anon1.op.exp2)
16323 {
16324 if(!assign && exp->__anon1.op.exp1->expType && (exp->__anon1.op.exp1->expType->kind == 1 || exp->__anon1.op.exp1->expType->kind == 2))
16325 {
16326 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);
16327
16328 FreeType(exp->__anon1.op.exp1->expType);
16329 exp->__anon1.op.exp1->expType = type;
16330 }
16331 }
16332 type1 = exp->__anon1.op.exp1->expType;
16333 }
16334 if(exp->__anon1.op.exp2)
16335 {
16336 char expString[10240];
16337
16338 expString[0] = '\0';
16339 if(exp->__anon1.op.exp2->type == 1 && !exp->__anon1.op.exp2->__anon1.instance->_class)
16340 {
16341 if(exp->__anon1.op.exp1)
16342 {
16343 exp->__anon1.op.exp2->destType = exp->__anon1.op.exp1->expType;
16344 if(exp->__anon1.op.exp1->expType)
16345 exp->__anon1.op.exp1->expType->refCount++;
16346 }
16347 else
16348 {
16349 exp->__anon1.op.exp2->destType = exp->destType;
16350 if(!exp->__anon1.op.exp1 || (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 if(type1)
16356 type1->refCount++;
16357 exp->expType = type1;
16358 }
16359 else if(assign)
16360 {
16361 if(inCompiler)
16362 PrintExpression(exp->__anon1.op.exp2, expString);
16363 if(type1 && type1->kind == 13)
16364 {
16365 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)
16366 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "operator %s illegal on pointer\n", (((void *)0))), exp->__anon1.op.op);
16367 else if(exp->__anon1.op.op == '=')
16368 {
16369 if(exp->__anon1.op.exp2->destType)
16370 FreeType(exp->__anon1.op.exp2->destType);
16371 exp->__anon1.op.exp2->destType = type1;
16372 if(type1)
16373 type1->refCount++;
16374 }
16375 }
16376 else
16377 {
16378 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)
16379 ;
16380 else
16381 {
16382 if(exp->__anon1.op.exp2->destType)
16383 FreeType(exp->__anon1.op.exp2->destType);
16384 exp->__anon1.op.exp2->destType = type1;
16385 if(type1)
16386 type1->refCount++;
16387 }
16388 }
16389 if(type1)
16390 type1->refCount++;
16391 exp->expType = type1;
16392 }
16393 else if(destClass && ((destClass->type == 3 && useDestType && useSideUnit) || (destClass->type == 4 && useDestType)))
16394 {
16395 if(exp->__anon1.op.exp2->destType)
16396 FreeType(exp->__anon1.op.exp2->destType);
16397 exp->__anon1.op.exp2->destType = exp->destType;
16398 if(exp->__anon1.op.op != '&' && exp->__anon1.op.op != '^')
16399 exp->__anon1.op.exp2->opDestType = 1;
16400 if(exp->destType)
16401 exp->destType->refCount++;
16402 }
16403 else
16404 {
16405 if(exp->__anon1.op.exp2->destType)
16406 FreeType(exp->__anon1.op.exp2->destType);
16407 exp->__anon1.op.exp2->destType = dummy;
16408 dummy->refCount++;
16409 }
16410 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))
16411 {
16412 FreeType(exp->__anon1.op.exp2->destType);
16413 exp->__anon1.op.exp2->destType = type1;
16414 type1->refCount++;
16415 }
16416 if(exp->__anon1.op.exp2->destType && exp->__anon1.op.op != '=')
16417 exp->__anon1.op.exp2->destType->count++;
16418 if(exp->__anon1.op.op == SIZEOF)
16419 {
16420 struct Expression * e = exp->__anon1.op.exp2;
16421
16422 while((e->type == 5 || e->type == 32 || e->type == 23) && e->__anon1.list)
16423 {
16424 if(e->type == 5 || e->type == 32 || e->type == 23)
16425 {
16426 if(e->type == 23)
16427 e = (*((struct Statement *)(*e->__anon1.compound->__anon1.compound.statements).last)->__anon1.expressions).last;
16428 else
16429 e = (*e->__anon1.list).last;
16430 }
16431 }
16432 if(e->type == 11 && e->__anon1.cast.exp)
16433 e->__anon1.cast.exp->needCast = 1;
16434 }
16435 ProcessExpressionType(exp->__anon1.op.exp2);
16436 exp->__anon1.op.exp2->opDestType = 0;
16437 if(exp->__anon1.op.exp2->destType && exp->__anon1.op.op != '=')
16438 exp->__anon1.op.exp2->destType->count--;
16439 if(!assign && (exp->__anon1.op.exp1 || exp->__anon1.op.op == '~'))
16440 {
16441 if(exp->__anon1.op.exp2->expType && (exp->__anon1.op.exp2->expType->kind == 1 || exp->__anon1.op.exp2->expType->kind == 2))
16442 {
16443 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);
16444
16445 FreeType(exp->__anon1.op.exp2->expType);
16446 exp->__anon1.op.exp2->expType = type;
16447 }
16448 }
16449 if(assign && type1 && type1->kind == 13 && exp->__anon1.op.exp2->expType)
16450 {
16451 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)
16452 {
16453 if(exp->__anon1.op.op != '=' && type1->__anon1.type->kind == 0)
16454 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "void *: unknown size\n", (((void *)0))));
16455 }
16456 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)))
16457 {
16458 if(exp->__anon1.op.op == ADD_ASSIGN)
16459 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "cannot add two pointers\n", (((void *)0))));
16460 }
16461 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))
16462 {
16463 if(exp->__anon1.op.op == ADD_ASSIGN)
16464 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "cannot add two pointers\n", (((void *)0))));
16465 }
16466 else if(inCompiler)
16467 {
16468 char type1String[1024];
16469 char type2String[1024];
16470
16471 type1String[0] = '\0';
16472 type2String[0] = '\0';
16473 PrintType(exp->__anon1.op.exp2->expType, type1String, 0, 1);
16474 PrintType(type1, type2String, 0, 1);
16475 __ecereNameSpace__ecere__sys__ChangeCh(expString, '\n', ' ');
16476 Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "incompatible expression %s (%s); expected %s\n", (((void *)0))), expString, type1String, type2String);
16477 }
16478 }
16479 if(exp->__anon1.op.exp2->destType == dummy)
16480 {
16481 FreeType(dummy);
16482 exp->__anon1.op.exp2->destType = (((void *)0));
16483 }
16484 if(exp->__anon1.op.op == '-' && !exp->__anon1.op.exp1 && exp->__anon1.op.exp2->expType && !exp->__anon1.op.exp2->expType->isSigned)
16485 {
16486 type2 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
16487 type2->refCount = 1;
16488 CopyTypeInto(type2, exp->__anon1.op.exp2->expType);
16489 type2->isSigned = 1;
16490 }
16491 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))
16492 {
16493 type2 = __extension__ ({
16494 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
16495
16496 __ecereInstance1->kind = 3, __ecereInstance1;
16497 });
16498 type2->refCount = 1;
16499 type2->isSigned = 1;
16500 }
16501 else
16502 {
16503 type2 = exp->__anon1.op.exp2->expType;
16504 if(type2)
16505 type2->refCount++;
16506 }
16507 }
16508 dummy->kind = 0;
16509 if(exp->__anon1.op.op == SIZEOF)
16510 {
16511 exp->expType = __extension__ ({
16512 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
16513
16514 __ecereInstance1->refCount = 1, __ecereInstance1->kind = 23, __ecereInstance1;
16515 });
16516 exp->isConstant = 1;
16517 }
16518 else if(exp->__anon1.op.op == '*' && !exp->__anon1.op.exp1)
16519 {
16520 exp->expType = Dereference(type2);
16521 if(type2 && type2->kind == 8)
16522 notByReference = 1;
16523 }
16524 else if(exp->__anon1.op.op == '&' && !exp->__anon1.op.exp1)
16525 exp->expType = Reference(type2);
16526 else if(exp->__anon1.op.op == LEFT_OP || exp->__anon1.op.op == RIGHT_OP)
16527 {
16528 if(exp->__anon1.op.exp1->expType)
16529 {
16530 exp->expType = exp->__anon1.op.exp1->expType;
16531 exp->expType->refCount++;
16532 }
16533 }
16534 else if(!assign)
16535 {
16536 if(boolOps)
16537 {
16538 if(exp->__anon1.op.exp1)
16539 {
16540 if(exp->__anon1.op.exp1->destType)
16541 FreeType(exp->__anon1.op.exp1->destType);
16542 exp->__anon1.op.exp1->destType = MkClassType("bool");
16543 exp->__anon1.op.exp1->destType->truth = 1;
16544 if(!exp->__anon1.op.exp1->expType)
16545 ProcessExpressionType(exp->__anon1.op.exp1);
16546 else
16547 CheckExpressionType(exp->__anon1.op.exp1, exp->__anon1.op.exp1->destType, 0, 0);
16548 FreeType(exp->__anon1.op.exp1->expType);
16549 exp->__anon1.op.exp1->expType = MkClassType("bool");
16550 exp->__anon1.op.exp1->expType->truth = 1;
16551 }
16552 if(exp->__anon1.op.exp2)
16553 {
16554 if(exp->__anon1.op.exp2->destType)
16555 FreeType(exp->__anon1.op.exp2->destType);
16556 exp->__anon1.op.exp2->destType = MkClassType("bool");
16557 exp->__anon1.op.exp2->destType->truth = 1;
16558 if(!exp->__anon1.op.exp2->expType)
16559 ProcessExpressionType(exp->__anon1.op.exp2);
16560 else
16561 CheckExpressionType(exp->__anon1.op.exp2, exp->__anon1.op.exp2->destType, 0, 0);
16562 FreeType(exp->__anon1.op.exp2->expType);
16563 exp->__anon1.op.exp2->expType = MkClassType("bool");
16564 exp->__anon1.op.exp2->expType->truth = 1;
16565 }
16566 }
16567 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")))))
16568 {
16569 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"))))
16570 {
16571 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)))
16572 {
16573 struct Type * intType;
16574
16575 if(!type1->__anon1._class->__anon1.registered->dataType)
16576 type1->__anon1._class->__anon1.registered->dataType = ProcessTypeString(type1->__anon1._class->__anon1.registered->dataTypeString, 0);
16577 if(!type2->__anon1._class->__anon1.registered->dataType)
16578 type2->__anon1._class->__anon1.registered->dataType = ProcessTypeString(type2->__anon1._class->__anon1.registered->dataTypeString, 0);
16579 intType = ProcessTypeString((type1->__anon1._class->__anon1.registered->dataType->kind == 4 || type2->__anon1._class->__anon1.registered->dataType->kind == 4) ? "int64" : "int", 0);
16580 if(exp->__anon1.op.exp1->destType)
16581 FreeType(exp->__anon1.op.exp1->destType);
16582 if(exp->__anon1.op.exp2->destType)
16583 FreeType(exp->__anon1.op.exp2->destType);
16584 exp->__anon1.op.exp1->destType = intType;
16585 exp->__anon1.op.exp2->destType = intType;
16586 intType->refCount++;
16587 }
16588 else
16589 {
16590 if(exp->__anon1.op.exp2->destType)
16591 FreeType(exp->__anon1.op.exp2->destType);
16592 exp->__anon1.op.exp2->destType = type1;
16593 type1->refCount++;
16594 if(exp->__anon1.op.exp1->destType)
16595 FreeType(exp->__anon1.op.exp1->destType);
16596 exp->__anon1.op.exp1->destType = type2;
16597 type2->refCount++;
16598 }
16599 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)
16600 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);
16601 if(type1->kind == 13 && type1->__anon1.type->kind == 20 && type2->kind != 13)
16602 {
16603 struct Expression * argExp = GetTemplateArgExp(type1->__anon1.type->__anon1.templateParameter, thisClass, 1);
16604
16605 if(argExp)
16606 {
16607 struct Expression * classExp = MkExpMember(argExp, MkIdentifier("dataTypeClass"));
16608
16609 exp->__anon1.op.exp1 = MkExpBrackets(MkListOne(MkExpCast(MkTypeName(MkListOne(MkSpecifierName("byte")), MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), (((void *)0)))), exp->__anon1.op.exp1)));
16610 ProcessExpressionType(exp->__anon1.op.exp1);
16611 if(type2->kind != 13)
16612 {
16613 ProcessExpressionType(classExp);
16614 exp->__anon1.op.exp2 = MkExpBrackets(MkListOne(MkExpOp(exp->__anon1.op.exp2, '*', MkExpMember(classExp, MkIdentifier("typeSize")))));
16615 if(!exp->__anon1.op.exp2->expType)
16616 {
16617 if(type2)
16618 FreeType(type2);
16619 type2 = exp->__anon1.op.exp2->expType = ProcessTypeString("int", 0);
16620 type2->refCount++;
16621 }
16622 ProcessExpressionType(exp->__anon1.op.exp2);
16623 }
16624 }
16625 }
16626 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)))
16627 {
16628 if(type1->kind != 8 && type1->__anon1.type->kind == 0)
16629 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "void *: unknown size\n", (((void *)0))));
16630 exp->expType = type1;
16631 if(type1)
16632 type1->refCount++;
16633 }
16634 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)))
16635 {
16636 if(type2->kind != 8 && type2->__anon1.type->kind == 0)
16637 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "void *: unknown size\n", (((void *)0))));
16638 exp->expType = type2;
16639 if(type2)
16640 type2->refCount++;
16641 }
16642 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))
16643 {
16644 Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "different levels of indirection\n", (((void *)0))));
16645 }
16646 else
16647 {
16648 unsigned int success = 0;
16649
16650 if(type1->kind == 13 && type2->kind == 13)
16651 {
16652 if(exp->__anon1.op.op == '+')
16653 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "cannot add two pointers\n", (((void *)0))));
16654 else if(exp->__anon1.op.op == '-')
16655 {
16656 if(MatchTypes(type1->__anon1.type, type2->__anon1.type, (((void *)0)), (((void *)0)), (((void *)0)), 0, 0, 0, 0, 0))
16657 {
16658 exp->expType = __extension__ ({
16659 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
16660
16661 __ecereInstance1->kind = 3, __ecereInstance1->refCount = 1, __ecereInstance1;
16662 });
16663 success = 1;
16664 if(type1->__anon1.type->kind == 20)
16665 {
16666 struct Expression * argExp = GetTemplateArgExp(type1->__anon1.type->__anon1.templateParameter, thisClass, 1);
16667
16668 if(argExp)
16669 {
16670 struct Expression * classExp = MkExpMember(argExp, MkIdentifier("dataTypeClass"));
16671
16672 ProcessExpressionType(classExp);
16673 exp->type = 5;
16674 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"))));
16675 ProcessExpressionType(((struct Expression *)(*exp->__anon1.list).first)->__anon1.op.exp2);
16676 FreeType(dummy);
16677 return ;
16678 }
16679 }
16680 }
16681 }
16682 }
16683 if(!success && exp->__anon1.op.exp1->type == 2)
16684 {
16685 if(CheckExpressionType(exp->__anon1.op.exp1, exp->__anon1.op.exp1->destType, 0, 0))
16686 {
16687 if(exp->expType)
16688 FreeType(exp->expType);
16689 exp->expType = exp->__anon1.op.exp1->destType;
16690 if(exp->__anon1.op.exp1->destType)
16691 exp->__anon1.op.exp1->destType->refCount++;
16692 success = 1;
16693 }
16694 else if(CheckExpressionType(exp->__anon1.op.exp2, exp->__anon1.op.exp2->destType, 0, 0))
16695 {
16696 if(exp->expType)
16697 FreeType(exp->expType);
16698 exp->expType = exp->__anon1.op.exp2->destType;
16699 if(exp->__anon1.op.exp2->destType)
16700 exp->__anon1.op.exp2->destType->refCount++;
16701 success = 1;
16702 }
16703 }
16704 else if(!success)
16705 {
16706 if(CheckExpressionType(exp->__anon1.op.exp2, exp->__anon1.op.exp2->destType, 0, 0))
16707 {
16708 if(exp->expType)
16709 FreeType(exp->expType);
16710 exp->expType = exp->__anon1.op.exp2->destType;
16711 if(exp->__anon1.op.exp2->destType)
16712 exp->__anon1.op.exp2->destType->refCount++;
16713 success = 1;
16714 }
16715 else if(CheckExpressionType(exp->__anon1.op.exp1, exp->__anon1.op.exp1->destType, 0, 0))
16716 {
16717 if(exp->expType)
16718 FreeType(exp->expType);
16719 exp->expType = exp->__anon1.op.exp1->destType;
16720 if(exp->__anon1.op.exp1->destType)
16721 exp->__anon1.op.exp1->destType->refCount++;
16722 success = 1;
16723 }
16724 }
16725 if(!success)
16726 {
16727 char expString1[10240];
16728 char expString2[10240];
16729 char type1[1024];
16730 char type2[1024];
16731
16732 expString1[0] = '\0';
16733 expString2[0] = '\0';
16734 type1[0] = '\0';
16735 type2[0] = '\0';
16736 if(inCompiler)
16737 {
16738 PrintExpression(exp->__anon1.op.exp1, expString1);
16739 __ecereNameSpace__ecere__sys__ChangeCh(expString1, '\n', ' ');
16740 PrintExpression(exp->__anon1.op.exp2, expString2);
16741 __ecereNameSpace__ecere__sys__ChangeCh(expString2, '\n', ' ');
16742 PrintType(exp->__anon1.op.exp1->expType, type1, 0, 1);
16743 PrintType(exp->__anon1.op.exp2->expType, type2, 0, 1);
16744 }
16745 Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "incompatible expressions %s (%s) and %s (%s)\n", (((void *)0))), expString1, type1, expString2, type2);
16746 }
16747 }
16748 }
16749 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)
16750 {
16751 if(exp->__anon1.op.exp1->destType)
16752 FreeType(exp->__anon1.op.exp1->destType);
16753 exp->__anon1.op.exp1->destType = type2->__anon1._class->__anon1.registered->dataType;
16754 if(type2->__anon1._class->__anon1.registered->dataType)
16755 type2->__anon1._class->__anon1.registered->dataType->refCount++;
16756 CheckExpressionType(exp->__anon1.op.exp1, exp->__anon1.op.exp1->destType, 0, 0);
16757 exp->expType = type2;
16758 if(type2)
16759 type2->refCount++;
16760 }
16761 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)
16762 {
16763 if(exp->__anon1.op.exp2->destType)
16764 FreeType(exp->__anon1.op.exp2->destType);
16765 exp->__anon1.op.exp2->destType = type1->__anon1._class->__anon1.registered->dataType;
16766 if(type1->__anon1._class->__anon1.registered->dataType)
16767 type1->__anon1._class->__anon1.registered->dataType->refCount++;
16768 CheckExpressionType(exp->__anon1.op.exp2, exp->__anon1.op.exp2->destType, 0, 0);
16769 exp->expType = type1;
16770 if(type1)
16771 type1->refCount++;
16772 }
16773 else if(type1)
16774 {
16775 unsigned int valid = 0;
16776
16777 if(!boolResult && useSideUnit && type1 && type1->kind == 8 && type1->__anon1._class->__anon1.registered && type1->__anon1._class->__anon1.registered->type == 3 && type2 && type2->kind != 8)
16778 {
16779 if(exp->__anon1.op.exp2->destType)
16780 FreeType(exp->__anon1.op.exp2->destType);
16781 if(!type1->__anon1._class->__anon1.registered->dataType)
16782 type1->__anon1._class->__anon1.registered->dataType = ProcessTypeString(type1->__anon1._class->__anon1.registered->dataTypeString, 0);
16783 exp->__anon1.op.exp2->destType = type1->__anon1._class->__anon1.registered->dataType;
16784 exp->__anon1.op.exp2->destType->refCount++;
16785 CheckExpressionType(exp->__anon1.op.exp2, exp->__anon1.op.exp2->destType, 0, 0);
16786 if(type2)
16787 FreeType(type2);
16788 type2 = exp->__anon1.op.exp2->destType;
16789 if(type2)
16790 type2->refCount++;
16791 exp->expType = type2;
16792 type2->refCount++;
16793 }
16794 if(!boolResult && useSideUnit && type2 && type2->kind == 8 && type2->__anon1._class->__anon1.registered && type2->__anon1._class->__anon1.registered->type == 3 && type1 && type1->kind != 8)
16795 {
16796 if(exp->__anon1.op.exp1->destType)
16797 FreeType(exp->__anon1.op.exp1->destType);
16798 if(!type2->__anon1._class->__anon1.registered->dataType)
16799 type2->__anon1._class->__anon1.registered->dataType = ProcessTypeString(type2->__anon1._class->__anon1.registered->dataTypeString, 0);
16800 exp->__anon1.op.exp1->destType = type2->__anon1._class->__anon1.registered->dataType;
16801 exp->__anon1.op.exp1->destType->refCount++;
16802 CheckExpressionType(exp->__anon1.op.exp1, exp->__anon1.op.exp1->destType, 0, 0);
16803 type1 = exp->__anon1.op.exp1->destType;
16804 exp->expType = type1;
16805 type1->refCount++;
16806 }
16807 if(!boolResult || exp->__anon1.op.op == '>' || exp->__anon1.op.op == '<' || exp->__anon1.op.op == GE_OP || exp->__anon1.op.op == LE_OP)
16808 {
16809 unsigned int op1IsEnum = type1 && type1->kind == 8 && type1->__anon1._class && type1->__anon1._class->__anon1.registered && type1->__anon1._class->__anon1.registered->type == 4;
16810 unsigned int op2IsEnum = type2 && type2->kind == 8 && type2->__anon1._class && type2->__anon1._class->__anon1.registered && type2->__anon1._class->__anon1.registered->type == 4;
16811
16812 if(exp->__anon1.op.op == '*' || exp->__anon1.op.op == '/' || exp->__anon1.op.op == '-' || exp->__anon1.op.op == '|' || exp->__anon1.op.op == '^')
16813 {
16814 if(op1IsEnum && exp->__anon1.op.exp2->expType)
16815 {
16816 if(CheckExpressionType(exp->__anon1.op.exp1, exp->__anon1.op.exp2->expType, 0, 0))
16817 {
16818 if(exp->expType)
16819 FreeType(exp->expType);
16820 exp->expType = exp->__anon1.op.exp2->expType;
16821 if(exp->__anon1.op.exp2->expType)
16822 exp->__anon1.op.exp2->expType->refCount++;
16823 valid = 1;
16824 }
16825 }
16826 else if(op2IsEnum && exp->__anon1.op.exp1->expType)
16827 {
16828 if(CheckExpressionType(exp->__anon1.op.exp2, exp->__anon1.op.exp1->expType, 0, 0))
16829 {
16830 if(exp->expType)
16831 FreeType(exp->expType);
16832 exp->expType = exp->__anon1.op.exp1->expType;
16833 if(exp->__anon1.op.exp1->expType)
16834 exp->__anon1.op.exp1->expType->refCount++;
16835 valid = 1;
16836 }
16837 }
16838 }
16839 else
16840 {
16841 if(op1IsEnum && exp->__anon1.op.exp2->expType)
16842 {
16843 if(CheckExpressionType(exp->__anon1.op.exp1, exp->__anon1.op.exp2->expType, 0, 0))
16844 {
16845 if(exp->expType)
16846 FreeType(exp->expType);
16847 exp->expType = exp->__anon1.op.exp1->expType;
16848 if(exp->__anon1.op.exp1->expType)
16849 exp->__anon1.op.exp1->expType->refCount++;
16850 valid = 1;
16851 }
16852 }
16853 else if(op2IsEnum && exp->__anon1.op.exp1->expType)
16854 {
16855 if(CheckExpressionType(exp->__anon1.op.exp2, exp->__anon1.op.exp1->expType, 0, 0))
16856 {
16857 if(exp->expType)
16858 FreeType(exp->expType);
16859 exp->expType = exp->__anon1.op.exp2->expType;
16860 if(exp->__anon1.op.exp2->expType)
16861 exp->__anon1.op.exp2->expType->refCount++;
16862 valid = 1;
16863 }
16864 }
16865 }
16866 }
16867 if(!valid)
16868 {
16869 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))
16870 {
16871 if(exp->__anon1.op.exp1->destType)
16872 FreeType(exp->__anon1.op.exp1->destType);
16873 exp->__anon1.op.exp1->destType = type2;
16874 type2->refCount++;
16875 if(CheckExpressionType(exp->__anon1.op.exp1, exp->__anon1.op.exp1->destType, 0, 0))
16876 {
16877 if(exp->expType)
16878 FreeType(exp->expType);
16879 exp->expType = exp->__anon1.op.exp1->destType;
16880 if(exp->__anon1.op.exp1->destType)
16881 exp->__anon1.op.exp1->destType->refCount++;
16882 }
16883 }
16884 else
16885 {
16886 if(exp->__anon1.op.exp2->destType)
16887 FreeType(exp->__anon1.op.exp2->destType);
16888 exp->__anon1.op.exp2->destType = type1;
16889 type1->refCount++;
16890 if(CheckExpressionType(exp->__anon1.op.exp2, exp->__anon1.op.exp2->destType, 0, 0))
16891 {
16892 if(exp->expType)
16893 FreeType(exp->expType);
16894 exp->expType = exp->__anon1.op.exp2->destType;
16895 if(exp->__anon1.op.exp2->destType)
16896 exp->__anon1.op.exp2->destType->refCount++;
16897 }
16898 else if(type1 && type2)
16899 {
16900 char expString1[10240];
16901 char expString2[10240];
16902 char type1String[1024];
16903 char type2String[1024];
16904
16905 expString1[0] = '\0';
16906 expString2[0] = '\0';
16907 type1String[0] = '\0';
16908 type2String[0] = '\0';
16909 if(inCompiler)
16910 {
16911 PrintExpression(exp->__anon1.op.exp1, expString1);
16912 __ecereNameSpace__ecere__sys__ChangeCh(expString1, '\n', ' ');
16913 PrintExpression(exp->__anon1.op.exp2, expString2);
16914 __ecereNameSpace__ecere__sys__ChangeCh(expString2, '\n', ' ');
16915 PrintType(exp->__anon1.op.exp1->expType, type1String, 0, 1);
16916 PrintType(exp->__anon1.op.exp2->expType, type2String, 0, 1);
16917 }
16918 Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "incompatible expressions %s (%s) and %s (%s)\n", (((void *)0))), expString1, type1String, expString2, type2String);
16919 if(type1->kind == 8 && type1->__anon1._class && type1->__anon1._class->__anon1.registered && type1->__anon1._class->__anon1.registered->type == 4)
16920 {
16921 exp->expType = exp->__anon1.op.exp1->expType;
16922 if(exp->__anon1.op.exp1->expType)
16923 exp->__anon1.op.exp1->expType->refCount++;
16924 }
16925 else if(type2->kind == 8 && type2->__anon1._class && type2->__anon1._class->__anon1.registered && type2->__anon1._class->__anon1.registered->type == 4)
16926 {
16927 exp->expType = exp->__anon1.op.exp2->expType;
16928 if(exp->__anon1.op.exp2->expType)
16929 exp->__anon1.op.exp2->expType->refCount++;
16930 }
16931 }
16932 }
16933 }
16934 }
16935 else if(type2)
16936 {
16937 if(type2->kind == 8 && type2->__anon1._class && type2->__anon1._class->__anon1.registered && type2->__anon1._class->__anon1.registered->type == 4)
16938 {
16939 struct Type * oldType = exp->__anon1.op.exp1->expType;
16940
16941 exp->__anon1.op.exp1->expType = (((void *)0));
16942 if(CheckExpressionType(exp->__anon1.op.exp1, exp->__anon1.op.exp1->destType, 0, 0))
16943 FreeType(oldType);
16944 else
16945 exp->__anon1.op.exp1->expType = oldType;
16946 }
16947 if(exp->__anon1.op.exp1->destType)
16948 FreeType(exp->__anon1.op.exp1->destType);
16949 exp->__anon1.op.exp1->destType = type2;
16950 type2->refCount++;
16951 if(CheckExpressionType(exp->__anon1.op.exp1, exp->__anon1.op.exp1->destType, 0, 0))
16952 {
16953 if(exp->expType)
16954 FreeType(exp->expType);
16955 exp->expType = exp->__anon1.op.exp1->destType;
16956 if(exp->__anon1.op.exp1->destType)
16957 exp->__anon1.op.exp1->destType->refCount++;
16958 }
16959 }
16960 }
16961 else if(type2 && (!type1 || (type2->kind == 8 && type1->kind != 8)))
16962 {
16963 if(type1 && type2->__anon1._class && type2->__anon1._class->__anon1.registered && type2->__anon1._class->__anon1.registered->type == 3)
16964 {
16965 if(exp->__anon1.op.exp1->destType)
16966 FreeType(exp->__anon1.op.exp1->destType);
16967 exp->__anon1.op.exp1->destType = type2->__anon1._class->__anon1.registered->dataType;
16968 if(type2->__anon1._class->__anon1.registered->dataType)
16969 type2->__anon1._class->__anon1.registered->dataType->refCount++;
16970 CheckExpressionType(exp->__anon1.op.exp1, exp->__anon1.op.exp1->destType, 0, 0);
16971 }
16972 if(exp->__anon1.op.op == '!')
16973 {
16974 exp->expType = MkClassType("bool");
16975 exp->expType->truth = 1;
16976 }
16977 else
16978 {
16979 exp->expType = type2;
16980 if(type2)
16981 type2->refCount++;
16982 }
16983 }
16984 else if(type1 && (!type2 || (type1->kind == 8 && type2->kind != 8)))
16985 {
16986 if(type2 && type1->__anon1._class && type1->__anon1._class->__anon1.registered && type1->__anon1._class->__anon1.registered->type == 3)
16987 {
16988 if(exp->__anon1.op.exp2->destType)
16989 FreeType(exp->__anon1.op.exp2->destType);
16990 exp->__anon1.op.exp2->destType = type1->__anon1._class->__anon1.registered->dataType;
16991 if(type1->__anon1._class->__anon1.registered->dataType)
16992 type1->__anon1._class->__anon1.registered->dataType->refCount++;
16993 CheckExpressionType(exp->__anon1.op.exp2, exp->__anon1.op.exp2->destType, 0, 0);
16994 }
16995 exp->expType = type1;
16996 if(type1)
16997 type1->refCount++;
16998 }
16999 }
17000 yylloc = exp->loc;
17001 if(exp->__anon1.op.exp1 && !exp->__anon1.op.exp1->expType)
17002 {
17003 char expString[10000];
17004
17005 expString[0] = '\0';
17006 if(inCompiler)
17007 {
17008 PrintExpression(exp->__anon1.op.exp1, expString);
17009 __ecereNameSpace__ecere__sys__ChangeCh(expString, '\n', ' ');
17010 }
17011 if(expString[0])
17012 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "couldn't determine type of %s\n", (((void *)0))), expString);
17013 }
17014 if(exp->__anon1.op.exp2 && !exp->__anon1.op.exp2->expType)
17015 {
17016 char expString[10240];
17017
17018 expString[0] = '\0';
17019 if(inCompiler)
17020 {
17021 PrintExpression(exp->__anon1.op.exp2, expString);
17022 __ecereNameSpace__ecere__sys__ChangeCh(expString, '\n', ' ');
17023 }
17024 if(expString[0])
17025 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "couldn't determine type of %s\n", (((void *)0))), expString);
17026 }
17027 if(boolResult)
17028 {
17029 FreeType(exp->expType);
17030 exp->expType = MkClassType("bool");
17031 exp->expType->truth = 1;
17032 }
17033 if(exp->__anon1.op.op != SIZEOF)
17034 exp->isConstant = (!exp->__anon1.op.exp1 || exp->__anon1.op.exp1->isConstant) && (!exp->__anon1.op.exp2 || exp->__anon1.op.exp2->isConstant);
17035 if(exp->__anon1.op.op == SIZEOF && exp->__anon1.op.exp2->expType)
17036 {
17037 DeclareType(curExternal, exp->__anon1.op.exp2->expType, 1, 0);
17038 }
17039 if(exp->__anon1.op.op == DELETE && exp->__anon1.op.exp2 && exp->__anon1.op.exp2->expType && __ecereProp_Type_Get_specConst(exp->__anon1.op.exp2->expType))
17040 Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "deleting const qualified object\n", (((void *)0))));
17041 yylloc = oldyylloc;
17042 FreeType(dummy);
17043 if(type2)
17044 FreeType(type2);
17045 break;
17046 }
17047 case 5:
17048 case 32:
17049 {
17050 struct Expression * e;
17051
17052 exp->isConstant = 1;
17053 for(e = (*exp->__anon1.list).first; e; e = e->next)
17054 {
17055 if(!e->next)
17056 {
17057 FreeType(e->destType);
17058 e->opDestType = exp->opDestType;
17059 e->destType = exp->destType;
17060 if(e->destType)
17061 {
17062 exp->destType->refCount++;
17063 }
17064 }
17065 ProcessExpressionType(e);
17066 if(!exp->expType && !e->next)
17067 {
17068 exp->expType = e->expType;
17069 if(e->expType)
17070 e->expType->refCount++;
17071 }
17072 if(!e->isConstant)
17073 exp->isConstant = 0;
17074 }
17075 e = (*exp->__anon1.list).first;
17076 if(!e->next && e->type == 8)
17077 {
17078 struct Expression * next = exp->next, * prev = exp->prev;
17079
17080 FreeType(exp->expType);
17081 FreeType(exp->destType);
17082 (__ecereNameSpace__ecere__com__eSystem_Delete(exp->__anon1.list), exp->__anon1.list = 0);
17083 *exp = *e;
17084 exp->prev = prev;
17085 exp->next = next;
17086 ((e ? __extension__ ({
17087 void * __ecerePtrToDelete = (e);
17088
17089 __ecereClass_Expression->Destructor ? __ecereClass_Expression->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete);
17090 }) : 0), e = 0);
17091 ProcessExpressionType(exp);
17092 }
17093 break;
17094 }
17095 case 6:
17096 {
17097 struct Expression * e;
17098
17099 exp->isConstant = 1;
17100 ProcessExpressionType(exp->__anon1.index.exp);
17101 if(!exp->__anon1.index.exp->isConstant)
17102 exp->isConstant = 0;
17103 if(exp->__anon1.index.exp->expType)
17104 {
17105 struct Type * source = exp->__anon1.index.exp->expType;
17106
17107 if(source->kind == 8 && source->__anon1._class && source->__anon1._class->__anon1.registered)
17108 {
17109 struct __ecereNameSpace__ecere__com__Class * _class = source->__anon1._class->__anon1.registered;
17110 struct __ecereNameSpace__ecere__com__Class * c = _class->templateClass ? _class->templateClass : _class;
17111
17112 if(_class != containerClass && __ecereNameSpace__ecere__com__eClass_IsDerived(c, containerClass) && _class->templateArgs)
17113 {
17114 exp->expType = ProcessTypeString(_class->templateArgs[2].__anon1.__anon1.dataTypeString, 0);
17115 if(exp->__anon1.index.index && (*exp->__anon1.index.index).last)
17116 {
17117 struct Type * type = ProcessTypeString(_class->templateArgs[1].__anon1.__anon1.dataTypeString, 0);
17118
17119 if(type->kind == 8)
17120 type->constant = 1;
17121 else if(type->kind == 13)
17122 {
17123 struct Type * t = type;
17124
17125 while(t->kind == 13)
17126 t = t->__anon1.type;
17127 t->constant = 1;
17128 }
17129 ((struct Expression *)(*exp->__anon1.index.index).last)->destType = type;
17130 }
17131 }
17132 }
17133 }
17134 for(e = (*exp->__anon1.index.index).first; e; e = e->next)
17135 {
17136 if(!e->next && exp->__anon1.index.exp->expType && exp->__anon1.index.exp->expType->kind == 12 && exp->__anon1.index.exp->expType->__anon1.__anon4.enumClass)
17137 {
17138 if(e->destType)
17139 FreeType(e->destType);
17140 e->destType = MkClassType(exp->__anon1.index.exp->expType->__anon1.__anon4.enumClass->string);
17141 }
17142 ProcessExpressionType(e);
17143 if(!e->next)
17144 {
17145 }
17146 if(!e->isConstant)
17147 exp->isConstant = 0;
17148 }
17149 if(!exp->expType)
17150 exp->expType = Dereference(exp->__anon1.index.exp->expType);
17151 if(exp->expType)
17152 DeclareType(curExternal, exp->expType, 1, 0);
17153 break;
17154 }
17155 case 7:
17156 {
17157 struct Expression * e;
17158 struct Type * functionType;
17159 struct Type * methodType = (((void *)0));
17160 char name[1024];
17161
17162 name[0] = '\0';
17163 if(inCompiler)
17164 {
17165 PrintExpression(exp->__anon1.call.exp, name);
17166 if(exp->__anon1.call.exp->expType && !exp->__anon1.call.exp->expType->__anon1.__anon2.returnType)
17167 {
17168 PrintExpression(exp->__anon1.call.exp, name);
17169 }
17170 }
17171 if(exp->__anon1.call.exp->type == 0)
17172 {
17173 struct Expression * idExp = exp->__anon1.call.exp;
17174 struct Identifier * id = idExp->__anon1.__anon1.identifier;
17175
17176 if(!strcmp(id->string, "__builtin_frame_address"))
17177 {
17178 exp->expType = ProcessTypeString("void *", 1);
17179 if(exp->__anon1.call.arguments && (*exp->__anon1.call.arguments).first)
17180 ProcessExpressionType((*exp->__anon1.call.arguments).first);
17181 break;
17182 }
17183 else if(!strcmp(id->string, "__ENDIAN_PAD"))
17184 {
17185 exp->expType = ProcessTypeString("int", 1);
17186 if(exp->__anon1.call.arguments && (*exp->__anon1.call.arguments).first)
17187 ProcessExpressionType((*exp->__anon1.call.arguments).first);
17188 break;
17189 }
17190 else if(!strcmp(id->string, "Max") || !strcmp(id->string, "Min") || !strcmp(id->string, "Sgn") || !strcmp(id->string, "Abs"))
17191 {
17192 struct Expression * a = (((void *)0));
17193 struct Expression * b = (((void *)0));
17194 struct Expression * tempExp1 = (((void *)0)), * tempExp2 = (((void *)0));
17195
17196 if((!strcmp(id->string, "Max") || !strcmp(id->string, "Min")) && (*exp->__anon1.call.arguments).count == 2)
17197 {
17198 a = (*exp->__anon1.call.arguments).first;
17199 b = (*exp->__anon1.call.arguments).last;
17200 tempExp1 = a;
17201 tempExp2 = b;
17202 }
17203 else if((*exp->__anon1.call.arguments).count == 1)
17204 {
17205 a = (*exp->__anon1.call.arguments).first;
17206 tempExp1 = a;
17207 }
17208 if(a)
17209 {
17210 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Clear((&*exp->__anon1.call.arguments));
17211 idExp->__anon1.__anon1.identifier = (((void *)0));
17212 FreeExpContents(exp);
17213 ProcessExpressionType(a);
17214 if(b)
17215 ProcessExpressionType(b);
17216 exp->type = 5;
17217 exp->__anon1.list = MkList();
17218 if(a->expType && (!b || b->expType))
17219 {
17220 if((!a->isConstant && a->type != 0) || (b && !b->isConstant && b->type != 0))
17221 {
17222 if(inCompiler)
17223 {
17224 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
17225 struct __ecereNameSpace__ecere__sys__OldList * decls = MkList();
17226 struct Declaration * decl;
17227 char temp1[1024], temp2[1024];
17228
17229 GetTypeSpecs(a->expType, specs);
17230 if(a && !a->isConstant && a->type != 0)
17231 {
17232 sprintf(temp1, "__simpleStruct%d", curContext->simpleID++);
17233 ListAdd(decls, MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier(temp1)), (((void *)0))));
17234 tempExp1 = QMkExpId(temp1);
17235 tempExp1->expType = a->expType;
17236 if(a->expType)
17237 a->expType->refCount++;
17238 ListAdd(exp->__anon1.list, MkExpOp(CopyExpression(tempExp1), '=', a));
17239 }
17240 if(b && !b->isConstant && b->type != 0)
17241 {
17242 sprintf(temp2, "__simpleStruct%d", curContext->simpleID++);
17243 ListAdd(decls, MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier(temp2)), (((void *)0))));
17244 tempExp2 = QMkExpId(temp2);
17245 tempExp2->expType = b->expType;
17246 if(b->expType)
17247 b->expType->refCount++;
17248 ListAdd(exp->__anon1.list, MkExpOp(CopyExpression(tempExp2), '=', b));
17249 }
17250 decl = MkDeclaration(specs, decls);
17251 if(!curCompound->__anon1.compound.declarations)
17252 curCompound->__anon1.compound.declarations = MkList();
17253 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*curCompound->__anon1.compound.declarations), (((void *)0)), decl);
17254 }
17255 }
17256 }
17257 if(!strcmp(id->string, "Max") || !strcmp(id->string, "Min"))
17258 {
17259 int op = (!strcmp(id->string, "Max")) ? '>' : '<';
17260
17261 ListAdd(exp->__anon1.list, MkExpCondition(MkExpBrackets(MkListOne(MkExpOp(CopyExpression(tempExp1), op, CopyExpression(tempExp2)))), MkListOne(CopyExpression(tempExp1)), CopyExpression(tempExp2)));
17262 exp->expType = a->expType;
17263 if(a->expType)
17264 a->expType->refCount++;
17265 }
17266 else if(!strcmp(id->string, "Abs"))
17267 {
17268 ListAdd(exp->__anon1.list, MkExpCondition(MkExpBrackets(MkListOne(MkExpOp(CopyExpression(tempExp1), '<', MkExpConstant("0")))), MkListOne(MkExpOp((((void *)0)), '-', CopyExpression(tempExp1))), CopyExpression(tempExp1)));
17269 exp->expType = a->expType;
17270 if(a->expType)
17271 a->expType->refCount++;
17272 }
17273 else if(!strcmp(id->string, "Sgn"))
17274 {
17275 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"))))));
17276 exp->expType = ProcessTypeString("int", 0);
17277 }
17278 FreeExpression(tempExp1);
17279 if(tempExp2)
17280 FreeExpression(tempExp2);
17281 FreeIdentifier(id);
17282 break;
17283 }
17284 }
17285 }
17286 {
17287 struct Type * dummy = (dummy = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type), dummy->count = 1, dummy->refCount = 1, dummy);
17288
17289 if(!exp->__anon1.call.exp->destType)
17290 {
17291 exp->__anon1.call.exp->destType = dummy;
17292 dummy->refCount++;
17293 }
17294 ProcessExpressionType(exp->__anon1.call.exp);
17295 if(exp->__anon1.call.exp->destType == dummy)
17296 {
17297 FreeType(dummy);
17298 exp->__anon1.call.exp->destType = (((void *)0));
17299 }
17300 FreeType(dummy);
17301 }
17302 functionType = exp->__anon1.call.exp->expType;
17303 if(functionType && functionType->kind == 16)
17304 {
17305 methodType = functionType;
17306 functionType = methodType->__anon1.__anon3.method->dataType;
17307 if(exp->__anon1.call.exp->expType->__anon1.__anon3.usedClass)
17308 {
17309 char typeString[1024];
17310
17311 typeString[0] = '\0';
17312 {
17313 struct Symbol * back = functionType->__anon1.__anon2.thisClass;
17314
17315 functionType->__anon1.__anon2.thisClass = (((void *)0));
17316 PrintType(functionType, typeString, 1, 1);
17317 functionType->__anon1.__anon2.thisClass = back;
17318 }
17319 if(strstr(typeString, "thisclass"))
17320 {
17321 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
17322 struct Declarator * decl;
17323
17324 {
17325 struct Context * context = SetupTemplatesContext(exp->__anon1.call.exp->expType->__anon1.__anon3.usedClass);
17326
17327 decl = SpecDeclFromString(typeString, specs, (((void *)0)));
17328 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))
17329 thisClassParams = 0;
17330 ReplaceThisClassSpecifiers(specs, exp->__anon1.call.exp->expType->__anon1.__anon3.usedClass);
17331 {
17332 struct __ecereNameSpace__ecere__com__Class * backupThisClass = thisClass;
17333
17334 thisClass = exp->__anon1.call.exp->expType->__anon1.__anon3.usedClass;
17335 ProcessDeclarator(decl, 1);
17336 thisClass = backupThisClass;
17337 }
17338 thisClassParams = 1;
17339 functionType = ProcessType(specs, decl);
17340 functionType->refCount = 0;
17341 FinishTemplatesContext(context);
17342 {
17343 struct Type * p, * op;
17344
17345 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)
17346 {
17347 if(op->kind == 21)
17348 p->thisClassFrom = methodType->__anon1.__anon3.method->_class;
17349 }
17350 }
17351 if(methodType->__anon1.__anon3.method->dataType->__anon1.__anon2.returnType->kind == 21)
17352 {
17353 functionType->__anon1.__anon2.returnType->thisClassFrom = methodType->__anon1.__anon3.method->_class;
17354 }
17355 }
17356 FreeList(specs, (void *)(FreeSpecifier));
17357 FreeDeclarator(decl);
17358 }
17359 }
17360 }
17361 if(functionType && functionType->kind == 13 && functionType->__anon1.type && functionType->__anon1.type->kind == 11)
17362 {
17363 struct Type * type = functionType->__anon1.type;
17364
17365 if(!functionType->refCount)
17366 {
17367 functionType->__anon1.type = (((void *)0));
17368 FreeType(functionType);
17369 }
17370 functionType = type;
17371 }
17372 if(functionType && functionType->kind != 11)
17373 {
17374 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "called object %s is not a function\n", (((void *)0))), name);
17375 }
17376 else if(functionType)
17377 {
17378 unsigned int emptyParams = 0, noParams = 0;
17379 struct Expression * e = exp->__anon1.call.arguments ? (*exp->__anon1.call.arguments).first : (((void *)0));
17380 struct Type * type = functionType->__anon1.__anon2.params.first;
17381 struct Expression * memberExp = (exp->__anon1.call.exp->type == 8) ? exp->__anon1.call.exp : (((void *)0));
17382 int extra = 0;
17383 struct Location oldyylloc = yylloc;
17384
17385 if(!type)
17386 emptyParams = 1;
17387 if(functionType->extraParam && e && functionType->__anon1.__anon2.thisClass)
17388 {
17389 e->destType = MkClassType(functionType->__anon1.__anon2.thisClass->string);
17390 e = e->next;
17391 }
17392 if(!functionType->__anon1.__anon2.staticMethod && !functionType->extraParam)
17393 {
17394 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)
17395 {
17396 type = MkClassType(memberExp->__anon1.member.exp->expType->__anon1._class->string);
17397 if(e)
17398 {
17399 e->destType = type;
17400 e = e->next;
17401 type = functionType->__anon1.__anon2.params.first;
17402 }
17403 else
17404 type->refCount = 0;
17405 }
17406 else if(!memberExp && (functionType->__anon1.__anon2.thisClass || (methodType && methodType->__anon1.__anon3.methodClass)))
17407 {
17408 type = MkClassType(functionType->__anon1.__anon2.thisClass ? functionType->__anon1.__anon2.thisClass->string : (methodType ? methodType->__anon1.__anon3.methodClass->fullName : (((void *)0))));
17409 type->byReference = functionType->byReference;
17410 type->typedByReference = functionType->typedByReference;
17411 if(e)
17412 {
17413 if(e->next && type->kind == 8 && (functionType && functionType->__anon1.__anon2.thisClass) && functionType->classObjectType == 2)
17414 e = e->next;
17415 e->destType = type;
17416 e = e->next;
17417 type = functionType->__anon1.__anon2.params.first;
17418 }
17419 else
17420 type->refCount = 0;
17421 }
17422 }
17423 if(type && type->kind == 0)
17424 {
17425 noParams = 1;
17426 if(!type->refCount)
17427 FreeType(type);
17428 type = (((void *)0));
17429 }
17430 for(; e; e = e->next)
17431 {
17432 if(!type && !emptyParams)
17433 {
17434 yylloc = e->loc;
17435 if(methodType && methodType->__anon1.__anon3.methodClass)
17436 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);
17437 else
17438 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);
17439 break;
17440 }
17441 if(methodType && type && type->kind == 20 && type->__anon1.templateParameter->type == 0)
17442 {
17443 struct Type * templatedType = (((void *)0));
17444 struct __ecereNameSpace__ecere__com__Class * _class = methodType->__anon1.__anon3.usedClass;
17445 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * curParam = (((void *)0));
17446 int id = 0;
17447
17448 if(_class && _class->templateArgs)
17449 {
17450 struct __ecereNameSpace__ecere__com__Class * sClass;
17451
17452 for(sClass = _class; sClass; sClass = sClass->base)
17453 {
17454 if(sClass->templateClass)
17455 sClass = sClass->templateClass;
17456 id = 0;
17457 for(curParam = sClass->templateParams.first; curParam; curParam = curParam->next)
17458 {
17459 if(curParam->type == 0 && !strcmp(type->__anon1.templateParameter->identifier->string, curParam->name))
17460 {
17461 struct __ecereNameSpace__ecere__com__Class * nextClass;
17462
17463 for(nextClass = sClass->base; nextClass; nextClass = nextClass->base)
17464 {
17465 if(nextClass->templateClass)
17466 nextClass = nextClass->templateClass;
17467 id += nextClass->templateParams.count;
17468 }
17469 break;
17470 }
17471 id++;
17472 }
17473 if(curParam)
17474 break;
17475 }
17476 }
17477 if(curParam && _class->templateArgs[id].__anon1.__anon1.dataTypeString)
17478 {
17479 unsigned int constant = type->constant;
17480 struct __ecereNameSpace__ecere__com__ClassTemplateArgument arg = _class->templateArgs[id];
17481
17482 {
17483 struct Context * context = SetupTemplatesContext(_class);
17484
17485 templatedType = ProcessTypeString(arg.__anon1.__anon1.dataTypeString, 0);
17486 FinishTemplatesContext(context);
17487 }
17488 if(templatedType->kind == 8 && constant)
17489 templatedType->constant = 1;
17490 else if(templatedType->kind == 13)
17491 {
17492 struct Type * t = templatedType->__anon1.type;
17493
17494 while(t->kind == 13)
17495 t = t->__anon1.type;
17496 if(constant)
17497 t->constant = constant;
17498 }
17499 e->destType = templatedType;
17500 if(templatedType)
17501 {
17502 templatedType->passAsTemplate = 1;
17503 }
17504 }
17505 else
17506 {
17507 e->destType = type;
17508 if(type)
17509 type->refCount++;
17510 }
17511 }
17512 else
17513 {
17514 if(type && type->kind == 14 && type->prev && type->prev->kind == 8 && type->prev->classObjectType)
17515 {
17516 e->destType = type->prev;
17517 e->destType->refCount++;
17518 }
17519 else
17520 {
17521 e->destType = type;
17522 if(type)
17523 type->refCount++;
17524 }
17525 }
17526 if(type && type->kind != 14)
17527 {
17528 struct Type * next = type->next;
17529
17530 if(!type->refCount)
17531 FreeType(type);
17532 type = next;
17533 }
17534 }
17535 if(type && type->kind != 14)
17536 {
17537 if(methodType && methodType->__anon1.__anon3.methodClass)
17538 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);
17539 else
17540 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);
17541 }
17542 yylloc = oldyylloc;
17543 if(type && !type->refCount)
17544 FreeType(type);
17545 }
17546 else
17547 {
17548 functionType = __extension__ ({
17549 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
17550
17551 __ecereInstance1->refCount = 0, __ecereInstance1->kind = 11, __ecereInstance1;
17552 });
17553 if(exp->__anon1.call.exp->type == 0)
17554 {
17555 char * string = exp->__anon1.call.exp->__anon1.__anon1.identifier->string;
17556
17557 if(inCompiler)
17558 {
17559 struct Symbol * symbol;
17560 struct Location oldyylloc = yylloc;
17561
17562 yylloc = exp->__anon1.call.exp->__anon1.__anon1.identifier->loc;
17563 if(strstr(string, "__builtin_") == string)
17564 {
17565 if(exp->destType)
17566 {
17567 functionType->__anon1.__anon2.returnType = exp->destType;
17568 exp->destType->refCount++;
17569 }
17570 }
17571 else
17572 Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "%s undefined; assuming extern returning int\n", (((void *)0))), string);
17573 symbol = __extension__ ({
17574 struct Symbol * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Symbol);
17575
17576 __ecereInstance1->string = __ecereNameSpace__ecere__sys__CopyString(string), __ecereInstance1->type = ProcessTypeString("int()", 1), __ecereInstance1;
17577 });
17578 __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Add(&globalContext->symbols, (struct __ecereNameSpace__ecere__sys__BTNode *)symbol);
17579 if(strstr(symbol->string, "::"))
17580 globalContext->hasNameSpace = 1;
17581 yylloc = oldyylloc;
17582 }
17583 }
17584 else if(exp->__anon1.call.exp->type == 8)
17585 {
17586 }
17587 else
17588 Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "callable object undefined; extern assuming returning int\n", (((void *)0))));
17589 if(!functionType->__anon1.__anon2.returnType)
17590 {
17591 functionType->__anon1.__anon2.returnType = __extension__ ({
17592 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
17593
17594 __ecereInstance1->refCount = 1, __ecereInstance1->kind = 3, __ecereInstance1;
17595 });
17596 }
17597 }
17598 if(functionType && functionType->kind == 11)
17599 {
17600 exp->expType = functionType->__anon1.__anon2.returnType;
17601 if(functionType->__anon1.__anon2.returnType)
17602 functionType->__anon1.__anon2.returnType->refCount++;
17603 if(!functionType->refCount)
17604 FreeType(functionType);
17605 }
17606 if(exp->__anon1.call.arguments)
17607 {
17608 for(e = (*exp->__anon1.call.arguments).first; e; e = e->next)
17609 ProcessExpressionType(e);
17610 }
17611 break;
17612 }
17613 case 8:
17614 {
17615 struct Type * type;
17616 struct Location oldyylloc = yylloc;
17617 unsigned int thisPtr;
17618 struct Expression * checkExp = exp->__anon1.member.exp;
17619
17620 while(checkExp)
17621 {
17622 if(checkExp->type == 11)
17623 checkExp = checkExp->__anon1.cast.exp;
17624 else if(checkExp->type == 5)
17625 checkExp = checkExp->__anon1.list ? (*checkExp->__anon1.list).first : (((void *)0));
17626 else
17627 break;
17628 }
17629 thisPtr = (checkExp && checkExp->type == 0 && !strcmp(checkExp->__anon1.__anon1.identifier->string, "this"));
17630 exp->thisPtr = thisPtr;
17631 if(exp->__anon1.member.member && exp->__anon1.member.member->_class && exp->__anon1.member.member->_class->__anon1.__anon1.name)
17632 {
17633 exp->__anon1.member.member->classSym = exp->__anon1.member.member->_class->__anon1.__anon1.symbol;
17634 }
17635 ProcessExpressionType(exp->__anon1.member.exp);
17636 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)
17637 {
17638 exp->isConstant = 0;
17639 }
17640 else
17641 exp->isConstant = exp->__anon1.member.exp->isConstant;
17642 type = exp->__anon1.member.exp->expType;
17643 yylloc = exp->loc;
17644 if(type && (type->kind == 20))
17645 {
17646 struct __ecereNameSpace__ecere__com__Class * _class = thisClass ? thisClass : currentClass;
17647 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * param = (((void *)0));
17648
17649 if(_class)
17650 {
17651 for(param = _class->templateParams.first; param; param = param->next)
17652 {
17653 if(param->type == 1 && exp->__anon1.member.member && exp->__anon1.member.member->string && !strcmp(param->name, exp->__anon1.member.member->string))
17654 break;
17655 }
17656 }
17657 if(param && param->defaultArg.__anon1.__anon2.__anon1.member)
17658 {
17659 struct Expression * argExp = GetTemplateArgExpByName(param->name, thisClass, 1);
17660
17661 if(argExp)
17662 {
17663 struct Expression * expMember = exp->__anon1.member.exp;
17664 struct Declarator * decl;
17665 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
17666 char thisClassTypeString[1024];
17667
17668 FreeIdentifier(exp->__anon1.member.member);
17669 ProcessExpressionType(argExp);
17670 {
17671 char * colon = strstr(param->defaultArg.__anon1.__anon2.memberString, "::");
17672
17673 if(colon)
17674 {
17675 memcpy(thisClassTypeString, param->defaultArg.__anon1.__anon2.memberString, colon - param->defaultArg.__anon1.__anon2.memberString);
17676 thisClassTypeString[colon - param->defaultArg.__anon1.__anon2.memberString] = '\0';
17677 }
17678 else
17679 strcpy(thisClassTypeString, _class->fullName);
17680 }
17681 decl = SpecDeclFromString(param->defaultArg.__anon1.__anon2.__anon1.member->dataTypeString, specs, (((void *)0)));
17682 exp->expType = ProcessType(specs, decl);
17683 if(exp->expType->kind == 8 && exp->expType->__anon1._class && exp->expType->__anon1._class->__anon1.registered && exp->expType->__anon1._class->__anon1.registered->templateClass)
17684 {
17685 struct __ecereNameSpace__ecere__com__Class * expClass = exp->expType->__anon1._class->__anon1.registered;
17686 struct __ecereNameSpace__ecere__com__Class * cClass = (((void *)0));
17687 int paramCount = 0;
17688 int lastParam = -1;
17689 char templateString[1024];
17690 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * param;
17691
17692 sprintf(templateString, "%s<", expClass->templateClass->fullName);
17693 for(cClass = expClass; cClass; cClass = cClass->base)
17694 {
17695 int p = 0;
17696
17697 for(param = cClass->templateParams.first; param; param = param->next)
17698 {
17699 int id = p;
17700 struct __ecereNameSpace__ecere__com__Class * sClass;
17701 struct __ecereNameSpace__ecere__com__ClassTemplateArgument arg;
17702
17703 for(sClass = cClass->base; sClass; sClass = sClass->base)
17704 id += sClass->templateParams.count;
17705 arg = expClass->templateArgs[id];
17706 for(sClass = _class; sClass; sClass = sClass->base)
17707 {
17708 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * cParam;
17709 int p = 0;
17710 struct __ecereNameSpace__ecere__com__Class * nextClass;
17711
17712 for(nextClass = sClass->base; nextClass; nextClass = nextClass->base)
17713 p += nextClass->templateParams.count;
17714 for(cParam = sClass->templateParams.first; cParam; cParam = cParam->next, p++)
17715 {
17716 if(cParam->type == 0 && arg.__anon1.__anon1.dataTypeString && !strcmp(cParam->name, arg.__anon1.__anon1.dataTypeString))
17717 {
17718 if(_class->templateArgs && arg.__anon1.__anon1.dataTypeString && (!param->defaultArg.__anon1.__anon1.dataTypeString || strcmp(arg.__anon1.__anon1.dataTypeString, param->defaultArg.__anon1.__anon1.dataTypeString)))
17719 {
17720 arg.__anon1.__anon1.dataTypeString = _class->templateArgs[p].__anon1.__anon1.dataTypeString;
17721 arg.__anon1.__anon1.dataTypeClass = _class->templateArgs[p].__anon1.__anon1.dataTypeClass;
17722 break;
17723 }
17724 }
17725 }
17726 }
17727 {
17728 char argument[256];
17729
17730 argument[0] = '\0';
17731 switch(param->type)
17732 {
17733 case 2:
17734 {
17735 char expString[1024];
17736 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
17737 struct Declarator * decl = SpecDeclFromString(param->__anon1.dataTypeString, specs, (((void *)0)));
17738 struct Expression * exp;
17739 char * string = PrintHexUInt64(arg.__anon1.expression.__anon1.ui64);
17740
17741 exp = MkExpCast(MkTypeName(specs, decl), MkExpConstant(string));
17742 (__ecereNameSpace__ecere__com__eSystem_Delete(string), string = 0);
17743 ProcessExpressionType(exp);
17744 ComputeExpression(exp);
17745 expString[0] = '\0';
17746 PrintExpression(exp, expString);
17747 strcat(argument, expString);
17748 FreeExpression(exp);
17749 break;
17750 }
17751 case 1:
17752 {
17753 strcat(argument, arg.__anon1.__anon2.__anon1.member->name);
17754 break;
17755 }
17756 case 0:
17757 {
17758 if(arg.__anon1.__anon1.dataTypeString && (!param->defaultArg.__anon1.__anon1.dataTypeString || strcmp(arg.__anon1.__anon1.dataTypeString, param->defaultArg.__anon1.__anon1.dataTypeString)))
17759 {
17760 if(!strcmp(arg.__anon1.__anon1.dataTypeString, "thisclass"))
17761 strcat(argument, thisClassTypeString);
17762 else
17763 strcat(argument, arg.__anon1.__anon1.dataTypeString);
17764 }
17765 break;
17766 }
17767 }
17768 if(argument[0])
17769 {
17770 if(paramCount)
17771 strcat(templateString, ", ");
17772 if(lastParam != p - 1)
17773 {
17774 strcat(templateString, param->name);
17775 strcat(templateString, " = ");
17776 }
17777 strcat(templateString, argument);
17778 paramCount++;
17779 lastParam = p;
17780 }
17781 p++;
17782 }
17783 }
17784 }
17785 {
17786 int len = strlen(templateString);
17787
17788 if(templateString[len - 1] == '>')
17789 templateString[len++] = ' ';
17790 templateString[len++] = '>';
17791 templateString[len++] = '\0';
17792 }
17793 {
17794 struct Context * context = SetupTemplatesContext(_class);
17795
17796 FreeType(exp->expType);
17797 exp->expType = ProcessTypeString(templateString, 0);
17798 FinishTemplatesContext(context);
17799 }
17800 }
17801 if(!__ecereProp_Type_Get_isPointerType(expMember->expType))
17802 expMember = MkExpCast(MkTypeName(MkListOne(MkSpecifierName("uintptr")), (((void *)0))), expMember);
17803 exp->type = 5;
17804 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")))))))));
17805 }
17806 }
17807 else if(type->__anon1.templateParameter && type->__anon1.templateParameter->type == 0 && (type->__anon1.templateParameter->__anon1.dataType || type->__anon1.templateParameter->dataTypeString))
17808 {
17809 type = ProcessTemplateParameterType(type->__anon1.templateParameter);
17810 }
17811 }
17812 if(type && (type->kind == 20))
17813 ;
17814 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)))
17815 {
17816 struct Identifier * id = exp->__anon1.member.member;
17817 int typeKind = type->kind;
17818 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));
17819
17820 if(typeKind == 19 && exp->__anon1.member.exp->type == 24)
17821 {
17822 _class = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "ecere::com::Class");
17823 typeKind = 8;
17824 }
17825 if(id)
17826 {
17827 if(typeKind == 3 || typeKind == 15)
17828 _class = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "int");
17829 else if(!_class)
17830 {
17831 if(type->kind == 8 && type->__anon1._class && type->__anon1._class->__anon1.registered)
17832 {
17833 _class = type->__anon1._class->__anon1.registered;
17834 }
17835 else if((type->kind == 12 || type->kind == 13) && type->__anon1.type && type->__anon1.type->kind == 1)
17836 {
17837 _class = FindClass("char *")->__anon1.registered;
17838 }
17839 else if(type->kind == 13)
17840 {
17841 _class = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "uintptr");
17842 FreeType(exp->expType);
17843 exp->expType = ProcessTypeString("uintptr", 0);
17844 exp->byReference = 1;
17845 }
17846 else
17847 {
17848 char string[1024] = "";
17849 struct Symbol * classSym;
17850
17851 PrintTypeNoConst(type, string, 0, 1);
17852 classSym = FindClass(string);
17853 if(classSym)
17854 _class = classSym->__anon1.registered;
17855 }
17856 }
17857 }
17858 if(_class && id)
17859 {
17860 struct __ecereNameSpace__ecere__com__Property * prop = (((void *)0));
17861 struct __ecereNameSpace__ecere__com__Method * method = (((void *)0));
17862 struct __ecereNameSpace__ecere__com__DataMember * member = (((void *)0));
17863 struct __ecereNameSpace__ecere__com__Property * revConvert = (((void *)0));
17864 struct __ecereNameSpace__ecere__com__ClassProperty * classProp = (((void *)0));
17865
17866 if(id && id->_class && id->_class->__anon1.__anon1.name && !strcmp(id->_class->__anon1.__anon1.name, "property"))
17867 exp->__anon1.member.memberType = 1;
17868 if(id && id->_class && type->__anon1._class && !__ecereNameSpace__ecere__com__eClass_IsDerived(type->__anon1._class->__anon1.registered, _class))
17869 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "invalid class specifier %s for object of class %s\n", (((void *)0))), _class->fullName, type->__anon1._class->string);
17870 if(typeKind != 19)
17871 {
17872 if((exp->__anon1.member.memberType == 0 && thisPtr) || exp->__anon1.member.memberType == 3)
17873 {
17874 member = __ecereNameSpace__ecere__com__eClass_FindDataMember(_class, id->string, privateModule, (((void *)0)), (((void *)0)));
17875 if(member && member->_class != (_class->templateClass ? _class->templateClass : _class) && exp->__anon1.member.memberType != 3)
17876 {
17877 prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, id->string, privateModule);
17878 if(prop)
17879 member = (((void *)0));
17880 }
17881 if(!member && !prop)
17882 prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, id->string, privateModule);
17883 if((member && member->_class == (_class->templateClass ? _class->templateClass : _class)) || (prop && prop->_class == (_class->templateClass ? _class->templateClass : _class)))
17884 exp->__anon1.member.thisPtr = 1;
17885 }
17886 else
17887 {
17888 unsigned int useMemberForNonConst = 0;
17889
17890 if(!id->classSym)
17891 {
17892 prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, id->string, (((void *)0)));
17893 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);
17894 if(useMemberForNonConst || !id->_class || !id->_class->__anon1.__anon1.name || strcmp(id->_class->__anon1.__anon1.name, "property"))
17895 member = __ecereNameSpace__ecere__com__eClass_FindDataMember(_class, id->string, (((void *)0)), (((void *)0)), (((void *)0)));
17896 }
17897 if((!prop || useMemberForNonConst) && !member)
17898 {
17899 method = useMemberForNonConst ? (((void *)0)) : __ecereNameSpace__ecere__com__eClass_FindMethod(_class, id->string, (((void *)0)));
17900 if(!method)
17901 {
17902 prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, id->string, privateModule);
17903 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);
17904 if(useMemberForNonConst || !id->_class || !id->_class->__anon1.__anon1.name || strcmp(id->_class->__anon1.__anon1.name, "property"))
17905 member = __ecereNameSpace__ecere__com__eClass_FindDataMember(_class, id->string, privateModule, (((void *)0)), (((void *)0)));
17906 }
17907 }
17908 if(member && prop)
17909 {
17910 if(useMemberForNonConst || (member->_class != prop->_class && !id->_class && __ecereNameSpace__ecere__com__eClass_IsDerived(member->_class, prop->_class)))
17911 prop = (((void *)0));
17912 else
17913 member = (((void *)0));
17914 }
17915 }
17916 }
17917 if(!prop && !member && !method)
17918 method = __ecereNameSpace__ecere__com__eClass_FindMethod(_class, id->string, privateModule);
17919 if(!prop && !member && !method)
17920 {
17921 if(typeKind == 19)
17922 {
17923 classProp = __ecereNameSpace__ecere__com__eClass_FindClassProperty(type->__anon1._class->__anon1.registered, exp->__anon1.member.member->string);
17924 if(classProp)
17925 {
17926 exp->__anon1.member.memberType = 5;
17927 exp->expType = ProcessTypeString(classProp->dataTypeString, 0);
17928 }
17929 else
17930 {
17931 char structName[1024];
17932 struct Identifier * id = exp->__anon1.member.member;
17933 struct Expression * classExp = exp->__anon1.member.exp;
17934
17935 type->refCount++;
17936 FreeType(classExp->expType);
17937 classExp->expType = ProcessTypeString("ecere::com::Class", 0);
17938 strcpy(structName, "__ecereClassData_");
17939 FullClassNameCat(structName, type->__anon1._class->string, 0);
17940 exp->type = 9;
17941 exp->__anon1.member.member = id;
17942 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"))))))));
17943 FreeType(type);
17944 ProcessExpressionType(exp);
17945 return ;
17946 }
17947 }
17948 else
17949 {
17950 struct Symbol * classSym = FindClass(id->string);
17951
17952 if(classSym)
17953 {
17954 struct __ecereNameSpace__ecere__com__Class * convertClass = classSym->__anon1.registered;
17955
17956 if(convertClass)
17957 revConvert = __ecereNameSpace__ecere__com__eClass_FindProperty(convertClass, _class->fullName, privateModule);
17958 }
17959 }
17960 }
17961 if(exp->__anon1.member.exp->destType)
17962 FreeType(exp->__anon1.member.exp->destType);
17963 {
17964 if(method && !method->_class->symbol)
17965 method->_class->symbol = FindClass(method->_class->fullName);
17966 if(prop && !prop->_class->symbol)
17967 prop->_class->symbol = FindClass(prop->_class->fullName);
17968 exp->__anon1.member.exp->destType = __extension__ ({
17969 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
17970
17971 __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;
17972 });
17973 }
17974 if(prop)
17975 {
17976 exp->__anon1.member.memberType = 1;
17977 if(!prop->dataType)
17978 ProcessPropertyType(prop);
17979 exp->expType = prop->dataType;
17980 if(!strcmp(_class->base->fullName, "eda::Row") && !exp->expType->constant && !exp->destType)
17981 {
17982 struct Type * type = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
17983
17984 CopyTypeInto(type, exp->expType);
17985 type->refCount = 1;
17986 type->constant = 1;
17987 exp->expType = type;
17988 }
17989 else if(prop->dataType)
17990 prop->dataType->refCount++;
17991 }
17992 else if(member)
17993 {
17994 if(exp->__anon1.member.exp->expType->classObjectType == 2 && !strcmp(exp->__anon1.member.member->string, "_class"))
17995 {
17996 FreeExpContents(exp);
17997 exp->type = 0;
17998 exp->__anon1.__anon1.identifier = MkIdentifier("class");
17999 ProcessExpressionType(exp);
18000 return ;
18001 }
18002 exp->__anon1.member.memberType = 3;
18003 DeclareStruct(curExternal, _class->fullName, 0, 1);
18004 if(member->_class != _class)
18005 DeclareStruct(curExternal, member->_class->fullName, 0, 1);
18006 if(!member->dataType)
18007 {
18008 struct Context * context = SetupTemplatesContext(_class);
18009
18010 member->dataType = ProcessTypeString(member->dataTypeString, 0);
18011 FinishTemplatesContext(context);
18012 }
18013 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)
18014 member->dataType->bitMemberSize = ((struct __ecereNameSpace__ecere__com__BitMember *)member)->size;
18015 exp->expType = member->dataType;
18016 if(member->dataType)
18017 member->dataType->refCount++;
18018 }
18019 else if(revConvert)
18020 {
18021 exp->__anon1.member.memberType = 4;
18022 exp->expType = MkClassType(revConvert->_class->fullName);
18023 }
18024 else if(method)
18025 {
18026 {
18027 exp->__anon1.member.memberType = 2;
18028 }
18029 if(!method->dataType)
18030 ProcessMethodType(method);
18031 exp->expType = __extension__ ({
18032 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
18033
18034 __ecereInstance1->refCount = 1, __ecereInstance1->kind = 16, __ecereInstance1->__anon1.__anon3.method = method, __ecereInstance1;
18035 });
18036 exp->expType->__anon1.__anon3.methodClass = (id && id->_class) ? _class : (((void *)0));
18037 exp->expType->__anon1.__anon3.usedClass = _class;
18038 }
18039 else if(!classProp)
18040 {
18041 if(exp->__anon1.member.exp->expType->classObjectType == 2 && !strcmp(exp->__anon1.member.member->string, "_class"))
18042 {
18043 FreeExpContents(exp);
18044 exp->type = 0;
18045 exp->__anon1.__anon1.identifier = MkIdentifier("class");
18046 FreeType(exp->expType);
18047 exp->expType = MkClassType("ecere::com::Class");
18048 return ;
18049 }
18050 yylloc = exp->__anon1.member.member->loc;
18051 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "couldn't find member %s in class %s\n", (((void *)0))), id->string, _class->fullName);
18052 if(inCompiler)
18053 __ecereNameSpace__ecere__com__eClass_AddDataMember(_class, id->string, "int", 0, 0, 1);
18054 }
18055 if(_class && exp->expType)
18056 {
18057 struct __ecereNameSpace__ecere__com__Class * tClass;
18058
18059 tClass = type->__anon1._class && type->__anon1._class->__anon1.registered ? type->__anon1._class->__anon1.registered : _class;
18060 while(tClass && !tClass->templateClass)
18061 tClass = tClass->base;
18062 if(tClass && exp->expType->kind == 20 && exp->expType->__anon1.templateParameter->type == 0)
18063 {
18064 int id = 0;
18065 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * curParam = (((void *)0));
18066 struct __ecereNameSpace__ecere__com__Class * sClass;
18067
18068 for(sClass = tClass; sClass; sClass = sClass->base)
18069 {
18070 id = 0;
18071 if(sClass->templateClass)
18072 sClass = sClass->templateClass;
18073 for(curParam = sClass->templateParams.first; curParam; curParam = curParam->next)
18074 {
18075 if(curParam->type == 0 && !strcmp(exp->expType->__anon1.templateParameter->identifier->string, curParam->name))
18076 {
18077 for(sClass = sClass->base; sClass; sClass = sClass->base)
18078 id += sClass->templateParams.count;
18079 break;
18080 }
18081 id++;
18082 }
18083 if(curParam)
18084 break;
18085 }
18086 if(curParam && tClass->templateArgs[id].__anon1.__anon1.dataTypeString)
18087 {
18088 struct __ecereNameSpace__ecere__com__ClassTemplateArgument arg = tClass->templateArgs[id];
18089 struct Context * context = SetupTemplatesContext(tClass);
18090 unsigned int constant = exp->expType->constant;
18091 unsigned int passAsTemplate = 0;
18092 struct __ecereNameSpace__ecere__com__Class * thisClassFrom = (((void *)0));
18093 struct Type * t = ProcessTypeString(exp->expType->__anon1.templateParameter->dataTypeString, 0);
18094
18095 if(t && t->kind == 8 && t->__anon1._class)
18096 thisClassFrom = t->__anon1._class->__anon1.registered;
18097 else
18098 thisClassFrom = __ecereNameSpace__ecere__com__eSystem_FindClass(GetPrivateModule(), "class");
18099 FreeType(t);
18100 passAsTemplate = tClass->templateClass && (exp->expType->kind != 20 || (!exp->expType->__anon1.templateParameter || (!exp->expType->__anon1.templateParameter->dataTypeString && !exp->expType->__anon1.templateParameter->__anon1.dataType)));
18101 FreeType(exp->expType);
18102 exp->expType = ProcessTypeString(arg.__anon1.__anon1.dataTypeString, 0);
18103 exp->expType->thisClassFrom = thisClassFrom;
18104 if(exp->expType->kind == 8 && constant)
18105 exp->expType->constant = 1;
18106 else if(exp->expType->kind == 13)
18107 {
18108 struct Type * t = exp->expType->__anon1.type;
18109
18110 while(t->kind == 13)
18111 t = t->__anon1.type;
18112 if(constant)
18113 t->constant = constant;
18114 }
18115 if(exp->expType)
18116 {
18117 if(exp->expType->kind == 21)
18118 {
18119 FreeType(exp->expType);
18120 exp->expType = ReplaceThisClassType(_class);
18121 }
18122 if(passAsTemplate)
18123 exp->expType->passAsTemplate = 1;
18124 if(!exp->destType)
18125 {
18126 exp->destType = ProcessTypeString(arg.__anon1.__anon1.dataTypeString, 0);
18127 if(exp->destType->kind == 8 && constant)
18128 exp->destType->constant = 1;
18129 else if(exp->destType->kind == 13)
18130 {
18131 struct Type * t = exp->destType->__anon1.type;
18132
18133 while(t->kind == 13)
18134 t = t->__anon1.type;
18135 if(constant)
18136 t->constant = constant;
18137 }
18138 if(exp->destType->kind == 21)
18139 {
18140 FreeType(exp->destType);
18141 exp->destType = ReplaceThisClassType(_class);
18142 }
18143 }
18144 }
18145 FinishTemplatesContext(context);
18146 }
18147 }
18148 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)
18149 {
18150 int id = 0;
18151 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * curParam = (((void *)0));
18152 struct __ecereNameSpace__ecere__com__Class * sClass;
18153
18154 for(sClass = tClass; sClass; sClass = sClass->base)
18155 {
18156 id = 0;
18157 if(sClass->templateClass)
18158 sClass = sClass->templateClass;
18159 for(curParam = sClass->templateParams.first; curParam; curParam = curParam->next)
18160 {
18161 if(curParam->type == 0 && !strcmp(exp->expType->__anon1.type->__anon1.templateParameter->identifier->string, curParam->name))
18162 {
18163 for(sClass = sClass->base; sClass; sClass = sClass->base)
18164 id += sClass->templateParams.count;
18165 break;
18166 }
18167 id++;
18168 }
18169 if(curParam)
18170 break;
18171 }
18172 if(curParam)
18173 {
18174 struct __ecereNameSpace__ecere__com__ClassTemplateArgument arg = tClass->templateArgs[id];
18175 struct Context * context = SetupTemplatesContext(tClass);
18176 struct Type * basicType;
18177
18178 basicType = ProcessTypeString(arg.__anon1.__anon1.dataTypeString, 0);
18179 if(basicType)
18180 {
18181 if(basicType->kind == 21)
18182 {
18183 FreeType(basicType);
18184 basicType = ReplaceThisClassType(_class);
18185 }
18186 FreeType(exp->expType);
18187 exp->expType = __extension__ ({
18188 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
18189
18190 __ecereInstance1->refCount = 1, __ecereInstance1->kind = 13, __ecereInstance1->__anon1.type = basicType, __ecereInstance1;
18191 });
18192 if(!exp->destType)
18193 {
18194 exp->destType = exp->expType;
18195 exp->destType->refCount++;
18196 }
18197 {
18198 struct Expression * newExp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression);
18199 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
18200 struct Declarator * decl;
18201
18202 decl = SpecDeclFromString(arg.__anon1.__anon1.dataTypeString, specs, (((void *)0)));
18203 *newExp = *exp;
18204 if(exp->destType)
18205 exp->destType->refCount++;
18206 if(exp->expType)
18207 exp->expType->refCount++;
18208 exp->type = 11;
18209 exp->__anon1.cast.typeName = MkTypeName(specs, MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), decl));
18210 exp->__anon1.cast.exp = newExp;
18211 }
18212 }
18213 FinishTemplatesContext(context);
18214 }
18215 }
18216 else if(tClass && exp->expType->kind == 8 && exp->expType->__anon1._class && strchr(exp->expType->__anon1._class->string, '<'))
18217 {
18218 struct __ecereNameSpace__ecere__com__Class * expClass = exp->expType->__anon1._class->__anon1.registered;
18219
18220 if(expClass)
18221 {
18222 struct __ecereNameSpace__ecere__com__Class * cClass = (((void *)0));
18223 int p = 0;
18224 int paramCount = 0;
18225 int lastParam = -1;
18226 char templateString[1024];
18227 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * param;
18228
18229 sprintf(templateString, "%s<", expClass->templateClass->fullName);
18230 while(cClass != expClass)
18231 {
18232 struct __ecereNameSpace__ecere__com__Class * sClass;
18233
18234 for(sClass = expClass; sClass && sClass->base != cClass; sClass = sClass->base)
18235 ;
18236 cClass = sClass;
18237 for(param = cClass->templateParams.first; param; param = param->next)
18238 {
18239 struct __ecereNameSpace__ecere__com__Class * cClassCur = (((void *)0));
18240 int cp = 0;
18241 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * paramCur = (((void *)0));
18242 struct __ecereNameSpace__ecere__com__ClassTemplateArgument arg;
18243
18244 while(cClassCur != tClass && !paramCur)
18245 {
18246 struct __ecereNameSpace__ecere__com__Class * sClassCur;
18247
18248 for(sClassCur = tClass; sClassCur && sClassCur->base != cClassCur; sClassCur = sClassCur->base)
18249 ;
18250 cClassCur = sClassCur;
18251 for(paramCur = cClassCur->templateParams.first; paramCur; paramCur = paramCur->next)
18252 {
18253 if(!strcmp(paramCur->name, param->name))
18254 {
18255 break;
18256 }
18257 cp++;
18258 }
18259 }
18260 if(paramCur && paramCur->type == 0)
18261 arg = tClass->templateArgs[cp];
18262 else
18263 arg = expClass->templateArgs[p];
18264 {
18265 char argument[256];
18266
18267 argument[0] = '\0';
18268 switch(param->type)
18269 {
18270 case 2:
18271 {
18272 char expString[1024];
18273 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
18274 struct Declarator * decl = SpecDeclFromString(param->__anon1.dataTypeString, specs, (((void *)0)));
18275 struct Expression * exp;
18276 char * string = PrintHexUInt64(arg.__anon1.expression.__anon1.ui64);
18277
18278 exp = MkExpCast(MkTypeName(specs, decl), MkExpConstant(string));
18279 (__ecereNameSpace__ecere__com__eSystem_Delete(string), string = 0);
18280 ProcessExpressionType(exp);
18281 ComputeExpression(exp);
18282 expString[0] = '\0';
18283 PrintExpression(exp, expString);
18284 strcat(argument, expString);
18285 FreeExpression(exp);
18286 break;
18287 }
18288 case 1:
18289 {
18290 strcat(argument, arg.__anon1.__anon2.__anon1.member->name);
18291 break;
18292 }
18293 case 0:
18294 {
18295 if(arg.__anon1.__anon1.dataTypeString && (!param->defaultArg.__anon1.__anon1.dataTypeString || strcmp(arg.__anon1.__anon1.dataTypeString, param->defaultArg.__anon1.__anon1.dataTypeString)))
18296 strcat(argument, arg.__anon1.__anon1.dataTypeString);
18297 break;
18298 }
18299 }
18300 if(argument[0])
18301 {
18302 if(paramCount)
18303 strcat(templateString, ", ");
18304 if(lastParam != p - 1)
18305 {
18306 strcat(templateString, param->name);
18307 strcat(templateString, " = ");
18308 }
18309 strcat(templateString, argument);
18310 paramCount++;
18311 lastParam = p;
18312 }
18313 }
18314 p++;
18315 }
18316 }
18317 {
18318 int len = strlen(templateString);
18319
18320 if(templateString[len - 1] == '>')
18321 templateString[len++] = ' ';
18322 templateString[len++] = '>';
18323 templateString[len++] = '\0';
18324 }
18325 FreeType(exp->expType);
18326 {
18327 struct Context * context = SetupTemplatesContext(tClass);
18328
18329 exp->expType = ProcessTypeString(templateString, 0);
18330 FinishTemplatesContext(context);
18331 }
18332 }
18333 }
18334 }
18335 }
18336 else
18337 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)");
18338 }
18339 else if(type && (type->kind == 9 || type->kind == 10))
18340 {
18341 struct Type * memberType = exp->__anon1.member.member ? FindMember(type, exp->__anon1.member.member->string) : (((void *)0));
18342
18343 if(memberType)
18344 {
18345 exp->expType = memberType;
18346 if(memberType)
18347 memberType->refCount++;
18348 }
18349 }
18350 else
18351 {
18352 char expString[10240];
18353
18354 expString[0] = '\0';
18355 if(inCompiler)
18356 {
18357 PrintExpression(exp, expString);
18358 __ecereNameSpace__ecere__sys__ChangeCh(expString, '\n', ' ');
18359 }
18360 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "member operator on non-structure type expression %s\n", (((void *)0))), expString);
18361 }
18362 if(exp->expType && exp->expType->kind == 21 && (!exp->destType || exp->destType->kind != 21))
18363 {
18364 if(type && (type->kind == 8 || type->kind == 19 || type->kind == 3 || type->kind == 15))
18365 {
18366 struct Identifier * id = exp->__anon1.member.member;
18367 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));
18368
18369 if(_class)
18370 {
18371 FreeType(exp->expType);
18372 exp->expType = ReplaceThisClassType(_class);
18373 }
18374 }
18375 }
18376 yylloc = oldyylloc;
18377 break;
18378 }
18379 case 9:
18380 {
18381 struct Type * destType = exp->destType;
18382
18383 if(exp->__anon1.member.member && exp->__anon1.member.member->_class && exp->__anon1.member.member->_class->__anon1.__anon1.name)
18384 {
18385 exp->__anon1.member.member->classSym = exp->__anon1.member.member->_class->__anon1.__anon1.symbol;
18386 }
18387 exp->__anon1.member.exp = MkExpBrackets(MkListOne(MkExpOp((((void *)0)), '*', exp->__anon1.member.exp)));
18388 exp->type = 8;
18389 if(destType)
18390 destType->count++;
18391 ProcessExpressionType(exp);
18392 if(destType)
18393 destType->count--;
18394 break;
18395 }
18396 case 15:
18397 {
18398 struct Symbol * classSym = exp->__anon1._class->__anon1.__anon1.symbol;
18399
18400 if(classSym && classSym->__anon1.registered)
18401 {
18402 if(classSym->__anon1.registered->type == 5 || (classSym->__anon1.registered->fixed && classSym->__anon1.registered->structSize))
18403 {
18404 char name[1024];
18405 struct __ecereNameSpace__ecere__com__Class * b = classSym->__anon1.registered;
18406
18407 name[0] = '\0';
18408 DeclareStruct(curExternal, classSym->string, 0, 1);
18409 FreeSpecifier(exp->__anon1._class);
18410 FullClassNameCat(name, classSym->string, 0);
18411 if(b->offset == 0)
18412 {
18413 exp->type = 10;
18414 exp->__anon1.typeName = MkTypeName(MkListOne(MkStructOrUnion(3, MkIdentifier(name), (((void *)0)))), (((void *)0)));
18415 }
18416 else
18417 {
18418 struct Expression * e;
18419
18420 exp->type = 4;
18421 if(b->structSize == b->offset)
18422 exp->__anon1.op.exp1 = MkExpConstant("0");
18423 else
18424 exp->__anon1.op.exp1 = MkExpTypeSize(MkTypeName(MkListOne(MkStructOrUnion(3, MkIdentifier(name), (((void *)0)))), (((void *)0))));
18425 exp->__anon1.op.op = '+';
18426 e = exp;
18427 while(b->offset != 0)
18428 {
18429 struct Symbol * sym;
18430 struct Expression * typeSize;
18431
18432 b = b->base;
18433 sym = FindClass(b->fullName);
18434 name[0] = '\0';
18435 DeclareStruct(curExternal, sym->string, 0, 1);
18436 FullClassNameCat(name, sym->string, 0);
18437 if(b->structSize == b->offset)
18438 typeSize = MkExpConstant("0");
18439 else
18440 typeSize = MkExpTypeSize(MkTypeName(MkListOne(MkStructOrUnion(3, MkIdentifier(name), (((void *)0)))), (((void *)0))));
18441 e->__anon1.op.exp2 = b->offset ? MkExpOp(typeSize, '+', (((void *)0))) : typeSize;
18442 e = e->__anon1.op.exp2;
18443 }
18444 }
18445 }
18446 else
18447 {
18448 if(classSym->__anon1.registered->fixed && !classSym->__anon1.registered->structSize)
18449 {
18450 FreeSpecifier(exp->__anon1._class);
18451 exp->__anon1.__anon1.constant = PrintUInt(classSym->__anon1.registered->templateClass ? classSym->__anon1.registered->templateClass->structSize : classSym->__anon1.registered->structSize);
18452 exp->type = 2;
18453 }
18454 else
18455 {
18456 char className[1024];
18457
18458 strcpy(className, "__ecereClass_");
18459 FullClassNameCat(className, classSym->string, 1);
18460 DeclareClass(curExternal, classSym, className);
18461 FreeExpContents(exp);
18462 exp->type = 9;
18463 exp->__anon1.member.exp = MkExpIdentifier(MkIdentifier(className));
18464 exp->__anon1.member.member = MkIdentifier("structSize");
18465 }
18466 }
18467 }
18468 exp->expType = __extension__ ({
18469 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
18470
18471 __ecereInstance1->refCount = 1, __ecereInstance1->kind = 23, __ecereInstance1;
18472 });
18473 break;
18474 }
18475 case 10:
18476 {
18477 struct Type * type = ProcessType(exp->__anon1.typeName->qualifiers, exp->__anon1.typeName->declarator);
18478
18479 exp->expType = __extension__ ({
18480 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
18481
18482 __ecereInstance1->refCount = 1, __ecereInstance1->kind = 23, __ecereInstance1;
18483 });
18484 exp->isConstant = 1;
18485 DeclareType(curExternal, type, 1, 0);
18486 FreeType(type);
18487 break;
18488 }
18489 case 11:
18490 {
18491 struct Type * type = ProcessType(exp->__anon1.cast.typeName->qualifiers, exp->__anon1.cast.typeName->declarator);
18492
18493 type->count = 1;
18494 FreeType(exp->__anon1.cast.exp->destType);
18495 exp->__anon1.cast.exp->destType = type;
18496 type->refCount++;
18497 type->casted = 1;
18498 ProcessExpressionType(exp->__anon1.cast.exp);
18499 type->casted = 0;
18500 type->count = 0;
18501 exp->expType = type;
18502 if(!exp->__anon1.cast.exp->needCast && !NeedCast(exp->__anon1.cast.exp->expType, type))
18503 {
18504 void * prev = exp->prev, * next = exp->next;
18505 struct Type * expType = exp->__anon1.cast.exp->destType;
18506 struct Expression * castExp = exp->__anon1.cast.exp;
18507 struct Type * destType = exp->destType;
18508
18509 if(expType)
18510 expType->refCount++;
18511 FreeType(exp->expType);
18512 FreeTypeName(exp->__anon1.cast.typeName);
18513 *exp = *castExp;
18514 FreeType(exp->expType);
18515 FreeType(exp->destType);
18516 exp->expType = expType;
18517 exp->destType = destType;
18518 ((castExp ? __extension__ ({
18519 void * __ecerePtrToDelete = (castExp);
18520
18521 __ecereClass_Expression->Destructor ? __ecereClass_Expression->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete);
18522 }) : 0), castExp = 0);
18523 exp->prev = prev;
18524 exp->next = next;
18525 }
18526 else
18527 {
18528 exp->isConstant = exp->__anon1.cast.exp->isConstant;
18529 }
18530 break;
18531 }
18532 case 33:
18533 {
18534 struct Type * type = ProcessType(exp->__anon1.initializer.typeName->qualifiers, exp->__anon1.initializer.typeName->declarator);
18535
18536 exp->expType = type;
18537 break;
18538 }
18539 case 34:
18540 {
18541 struct Type * type = ProcessType(exp->__anon1.vaArg.typeName->qualifiers, exp->__anon1.vaArg.typeName->declarator);
18542
18543 ProcessExpressionType(exp->__anon1.vaArg.exp);
18544 exp->expType = type;
18545 break;
18546 }
18547 case 12:
18548 {
18549 struct Expression * e;
18550 struct Type * t = exp->destType;
18551
18552 if(t && !exp->destType->casted)
18553 {
18554 t = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
18555 CopyTypeInto(t, exp->destType);
18556 t->count = 0;
18557 }
18558 else if(t)
18559 t->refCount++;
18560 exp->isConstant = 1;
18561 FreeType(exp->__anon1.cond.cond->destType);
18562 exp->__anon1.cond.cond->destType = MkClassType("bool");
18563 exp->__anon1.cond.cond->destType->truth = 1;
18564 ProcessExpressionType(exp->__anon1.cond.cond);
18565 if(!exp->__anon1.cond.cond->isConstant)
18566 exp->isConstant = 0;
18567 for(e = (*exp->__anon1.cond.exp).first; e; e = e->next)
18568 {
18569 if(!e->next)
18570 {
18571 FreeType(e->destType);
18572 e->destType = t;
18573 if(e->destType)
18574 e->destType->refCount++;
18575 }
18576 ProcessExpressionType(e);
18577 if(!e->next)
18578 {
18579 exp->expType = e->expType;
18580 if(e->expType)
18581 e->expType->refCount++;
18582 }
18583 if(!e->isConstant)
18584 exp->isConstant = 0;
18585 }
18586 FreeType(exp->__anon1.cond.elseExp->destType);
18587 exp->__anon1.cond.elseExp->destType = t ? t : exp->expType;
18588 if(exp->__anon1.cond.elseExp->destType)
18589 exp->__anon1.cond.elseExp->destType->refCount++;
18590 ProcessExpressionType(exp->__anon1.cond.elseExp);
18591 if(!exp->__anon1.cond.elseExp->isConstant)
18592 exp->isConstant = 0;
18593 FreeType(t);
18594 break;
18595 }
18596 case 23:
18597 {
18598 if(exp->__anon1.compound && exp->__anon1.compound->__anon1.compound.statements && (*exp->__anon1.compound->__anon1.compound.statements).last)
18599 {
18600 struct Statement * last = (*exp->__anon1.compound->__anon1.compound.statements).last;
18601
18602 if(last->type == 3 && last->__anon1.expressions && (*last->__anon1.expressions).last)
18603 {
18604 ((struct Expression *)(*last->__anon1.expressions).last)->destType = exp->destType;
18605 if(exp->destType)
18606 exp->destType->refCount++;
18607 }
18608 ProcessStatement(exp->__anon1.compound);
18609 exp->expType = (last->__anon1.expressions && (*last->__anon1.expressions).last) ? ((struct Expression *)(*last->__anon1.expressions).last)->expType : (((void *)0));
18610 if(exp->expType)
18611 exp->expType->refCount++;
18612 }
18613 break;
18614 }
18615 case 24:
18616 {
18617 struct Specifier * spec = (*exp->__anon1._classExp.specifiers).first;
18618
18619 if(spec && spec->type == 1)
18620 {
18621 exp->expType = MkClassType(spec->__anon1.__anon1.name);
18622 exp->expType->kind = 19;
18623 exp->byReference = 1;
18624 }
18625 else
18626 {
18627 exp->expType = MkClassType("ecere::com::Class");
18628 exp->byReference = 1;
18629 }
18630 break;
18631 }
18632 case 25:
18633 {
18634 struct __ecereNameSpace__ecere__com__Class * _class = thisClass ? thisClass : currentClass;
18635
18636 if(_class)
18637 {
18638 struct Identifier * id = exp->__anon1.classData.id;
18639 char structName[1024];
18640 struct Expression * classExp;
18641
18642 strcpy(structName, "__ecereClassData_");
18643 FullClassNameCat(structName, _class->fullName, 0);
18644 exp->type = 9;
18645 exp->__anon1.member.member = id;
18646 if(curCompound && FindSymbol("this", curContext, curCompound->__anon1.compound.context, 0, 0))
18647 classExp = MkExpMember(MkExpIdentifier(MkIdentifier("this")), MkIdentifier("_class"));
18648 else
18649 classExp = MkExpIdentifier(MkIdentifier("class"));
18650 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"))))))));
18651 ProcessExpressionType(exp);
18652 return ;
18653 }
18654 break;
18655 }
18656 case 35:
18657 {
18658 struct Type * type = (((void *)0));
18659 const char * typeString = (((void *)0));
18660 char typeStringBuf[1024];
18661
18662 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))
18663 {
18664 struct __ecereNameSpace__ecere__com__Class * templateClass = exp->destType->__anon1._class->__anon1.registered;
18665
18666 typeString = templateClass->templateArgs[2].__anon1.__anon1.dataTypeString;
18667 }
18668 else if(exp->__anon1.list)
18669 {
18670 struct Expression * e;
18671
18672 for(e = (*exp->__anon1.list).first; e; e = e->next)
18673 {
18674 ProcessExpressionType(e);
18675 if(e->expType)
18676 {
18677 if(!type)
18678 {
18679 type = e->expType;
18680 type->refCount++;
18681 }
18682 else
18683 {
18684 if(!MatchTypeExpression(e, type, (((void *)0)), 0, 1))
18685 {
18686 FreeType(type);
18687 type = e->expType;
18688 e->expType = (((void *)0));
18689 e = (*exp->__anon1.list).first;
18690 ProcessExpressionType(e);
18691 if(e->expType)
18692 {
18693 if(!MatchTypeExpression(e, type, (((void *)0)), 0, 1))
18694 {
18695 FreeType(e->expType);
18696 e->expType = (((void *)0));
18697 FreeType(type);
18698 type = (((void *)0));
18699 break;
18700 }
18701 }
18702 }
18703 }
18704 if(e->expType)
18705 {
18706 FreeType(e->expType);
18707 e->expType = (((void *)0));
18708 }
18709 }
18710 }
18711 if(type)
18712 {
18713 typeStringBuf[0] = '\0';
18714 PrintTypeNoConst(type, typeStringBuf, 0, 1);
18715 typeString = typeStringBuf;
18716 FreeType(type);
18717 type = (((void *)0));
18718 }
18719 }
18720 if(typeString)
18721 {
18722 char templateString[1024];
18723 struct __ecereNameSpace__ecere__sys__OldList * initializers = MkList();
18724 struct __ecereNameSpace__ecere__sys__OldList * structInitializers = MkList();
18725 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
18726 struct Expression * expExt;
18727 struct Declarator * decl = SpecDeclFromString(typeString, specs, (((void *)0)));
18728
18729 sprintf(templateString, "Container<%s>", typeString);
18730 if(exp->__anon1.list)
18731 {
18732 struct Expression * e;
18733
18734 type = ProcessTypeString(typeString, 0);
18735 while((e = (*exp->__anon1.list).first))
18736 {
18737 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove((&*exp->__anon1.list), e);
18738 e->destType = type;
18739 type->refCount++;
18740 ProcessExpressionType(e);
18741 ListAdd(initializers, MkInitializerAssignment(e));
18742 }
18743 FreeType(type);
18744 (__ecereNameSpace__ecere__com__eSystem_Delete(exp->__anon1.list), exp->__anon1.list = 0);
18745 }
18746 DeclareStruct(curExternal, "ecere::com::BuiltInContainer", 0, 1);
18747 ListAdd(structInitializers, MkInitializerAssignment(MkExpMember(MkExpClass(MkListOne(MkSpecifierName("BuiltInContainer")), (((void *)0))), MkIdentifier("_vTbl"))));
18748 ProcessExpressionType(((struct Initializer *)(*structInitializers).last)->__anon1.exp);
18749 ListAdd(structInitializers, MkInitializerAssignment(MkExpClass(MkListOne(MkSpecifierName("BuiltInContainer")), (((void *)0)))));
18750 ProcessExpressionType(((struct Initializer *)(*structInitializers).last)->__anon1.exp);
18751 ListAdd(structInitializers, MkInitializerAssignment(MkExpConstant("0")));
18752 ProcessExpressionType(((struct Initializer *)(*structInitializers).last)->__anon1.exp);
18753 ListAdd(structInitializers, MkInitializerAssignment(MkExpExtensionInitializer(MkTypeName(specs, MkDeclaratorArray(decl, (((void *)0)))), MkInitializerList(initializers))));
18754 ProcessExpressionType(((struct Initializer *)(*structInitializers).last)->__anon1.exp);
18755 ListAdd(structInitializers, MkInitializerAssignment(__extension__ ({
18756 struct Expression * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression);
18757
18758 __ecereInstance1->type = 2, __ecereInstance1->__anon1.__anon1.constant = __ecereNameSpace__ecere__com__PrintString(__ecereClass_int, (void *)&(*initializers).count, (void *)0), __ecereInstance1;
18759 })));
18760 ProcessExpressionType(((struct Initializer *)(*structInitializers).last)->__anon1.exp);
18761 ListAdd(structInitializers, MkInitializerAssignment(MkExpClass(CopyList(specs, (void *)(CopySpecifier)), CopyDeclarator(decl))));
18762 ProcessExpressionType(((struct Initializer *)(*structInitializers).last)->__anon1.exp);
18763 exp->expType = ProcessTypeString(templateString, 0);
18764 exp->type = 5;
18765 exp->__anon1.list = MkListOne(MkExpCast(MkTypeName(MkListOne(MkSpecifierName(templateString)), (((void *)0))), MkExpOp((((void *)0)), '&', expExt = MkExpExtensionInitializer(MkTypeName(MkListOne(MkSpecifierName("BuiltInContainer")), (((void *)0))), MkInitializerList(structInitializers)))));
18766 ProcessExpressionType(expExt);
18767 }
18768 else
18769 {
18770 exp->expType = ProcessTypeString("Container", 0);
18771 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Couldn't determine type of array elements\n", (((void *)0))));
18772 }
18773 break;
18774 }
18775 }
18776 if(exp->expType && exp->expType->kind == 21 && thisClass && (!exp->destType || exp->destType->kind != 21))
18777 {
18778 FreeType(exp->expType);
18779 exp->expType = ReplaceThisClassType(thisClass);
18780 }
18781 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)
18782 {
18783 struct Symbol * symbol = FindSymbol(exp->expType->__anon1.__anon1.enumName, curContext, globalContext, 1, 0);
18784
18785 if(symbol)
18786 {
18787 if(exp->expType->kind != 15)
18788 {
18789 struct Type * member;
18790 char * enumName = __ecereNameSpace__ecere__sys__CopyString(exp->expType->__anon1.__anon1.enumName);
18791
18792 FreeType(exp->expType);
18793 exp->expType = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
18794 exp->expType->kind = symbol->type->kind;
18795 exp->expType->refCount++;
18796 exp->expType->__anon1.__anon1.enumName = enumName;
18797 exp->expType->__anon1.__anon1.members = symbol->type->__anon1.__anon1.members;
18798 for(member = symbol->type->__anon1.__anon1.members.first; member; member = member->next)
18799 member->refCount++;
18800 }
18801 else
18802 {
18803 struct __ecereNameSpace__ecere__sys__NamedLink64 * member;
18804
18805 for(member = symbol->type->__anon1.__anon1.members.first; member; member = member->next)
18806 {
18807 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);
18808
18809 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(&exp->expType->__anon1.__anon1.members, value);
18810 }
18811 }
18812 }
18813 }
18814 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)))
18815 {
18816 exp->byReference = 1;
18817 }
18818 yylloc = exp->loc;
18819 if(exp->destType && (exp->destType->kind == 18))
18820 ;
18821 else if(exp->destType && !exp->destType->keepCast)
18822 {
18823 if(!exp->needTemplateCast && exp->expType && (exp->expType->kind == 20 || exp->expType->passAsTemplate))
18824 exp->needTemplateCast = 1;
18825 if(exp->destType->kind == 0)
18826 ;
18827 else if(!CheckExpressionType(exp, exp->destType, 0, !exp->destType->casted))
18828 {
18829 unsigned int invalidCast = 0;
18830
18831 if(inCompiler && exp->destType->count && exp->expType)
18832 {
18833 struct __ecereNameSpace__ecere__com__Class * c1 = (exp->expType->kind == 8 && exp->expType->__anon1._class) ? exp->expType->__anon1._class->__anon1.registered : (((void *)0));
18834 struct __ecereNameSpace__ecere__com__Class * c2 = (exp->destType->kind == 8 && exp->destType->__anon1._class) ? exp->destType->__anon1._class->__anon1.registered : (((void *)0));
18835
18836 if(c1 && c1->type != 1)
18837 c1 = (((void *)0));
18838 if(c2 && c2->type != 1)
18839 c2 = (((void *)0));
18840 if((c1 && !exp->expType->byReference && !c2 && !__ecereProp_Type_Get_isPointerType(exp->destType)) || (c2 && !exp->destType->byReference && !c1 && !__ecereProp_Type_Get_isPointerType(exp->expType)))
18841 invalidCast = 1;
18842 }
18843 if(!exp->destType->count || unresolved || invalidCast)
18844 {
18845 if(!exp->expType)
18846 {
18847 yylloc = exp->loc;
18848 if(exp->destType->kind != 14)
18849 {
18850 char type2[1024];
18851
18852 type2[0] = '\0';
18853 if(inCompiler)
18854 {
18855 char expString[10240];
18856
18857 expString[0] = '\0';
18858 PrintType(exp->destType, type2, 0, 1);
18859 if(inCompiler)
18860 {
18861 PrintExpression(exp, expString);
18862 __ecereNameSpace__ecere__sys__ChangeCh(expString, '\n', ' ');
18863 }
18864 if(unresolved)
18865 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "unresolved identifier %s; expected %s\n", (((void *)0))), expString, type2);
18866 else if(exp->type != 16)
18867 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "couldn't determine type of %s; expected %s\n", (((void *)0))), expString, type2);
18868 }
18869 }
18870 else
18871 {
18872 char expString[10240];
18873
18874 expString[0] = '\0';
18875 if(inCompiler)
18876 {
18877 PrintExpression(exp, expString);
18878 __ecereNameSpace__ecere__sys__ChangeCh(expString, '\n', ' ');
18879 }
18880 if(unresolved)
18881 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "unresolved identifier %s\n", (((void *)0))), expString);
18882 else if(exp->type != 16)
18883 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "couldn't determine type of %s\n", (((void *)0))), expString);
18884 }
18885 }
18886 else
18887 {
18888 char type1[1024];
18889 char type2[1024];
18890
18891 type1[0] = '\0';
18892 type2[0] = '\0';
18893 if(inCompiler)
18894 {
18895 PrintType(exp->expType, type1, 0, 1);
18896 PrintType(exp->destType, type2, 0, 1);
18897 }
18898 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)))
18899 ;
18900 else
18901 {
18902 struct Expression * nbExp = GetNonBracketsExp(exp);
18903 unsigned int skipWarning = 0;
18904 int kind = exp->destType->kind;
18905
18906 if(nbExp->type == 12 && nbExp->destType && !nbExp->destType->casted && nbExp->destType->kind == exp->destType->kind)
18907 skipWarning = 1;
18908 if((kind == 1 || kind == 2) && exp->destType->isSigned == exp->expType->signedBeforePromotion && nbExp->type == 4 && nbExp->__anon1.op.exp1 && nbExp->__anon1.op.exp2)
18909 {
18910 int op = nbExp->__anon1.op.op;
18911 struct Expression * nbExp1, * nbExp2;
18912 int from;
18913
18914 switch(op)
18915 {
18916 case '%':
18917 case '/':
18918 nbExp1 = GetNonBracketsExp(nbExp->__anon1.op.exp1);
18919 from = nbExp1->expType->promotedFrom;
18920 if(from == 1 || (kind == 2 && from == 2))
18921 skipWarning = 1;
18922 break;
18923 case LEFT_OP:
18924 case RIGHT_OP:
18925 nbExp1 = GetNonBracketsExp(nbExp->__anon1.op.exp1);
18926 nbExp2 = GetNonBracketsExp(nbExp->__anon1.op.exp2);
18927 from = nbExp1->expType->promotedFrom;
18928 if(op == RIGHT_OP && (from == 1 || (kind == 2 && from == 2)))
18929 skipWarning = 1;
18930 else if(nbExp2->isConstant && nbExp2->type == 2 && (nbExp->__anon1.op.op == RIGHT_OP || nbExp1->expType->bitMemberSize))
18931 {
18932 int n = strtol(nbExp2->__anon1.__anon1.constant, (((void *)0)), 0);
18933 int s = from == 1 ? 8 : 16;
18934
18935 if(nbExp1->expType->bitMemberSize && nbExp1->expType->bitMemberSize < s)
18936 s = nbExp1->expType->bitMemberSize;
18937 if(nbExp->__anon1.op.op == RIGHT_OP)
18938 s -= n;
18939 else
18940 s += n;
18941 if(s <= (kind == 1 ? 8 : 16))
18942 skipWarning = 1;
18943 }
18944 break;
18945 case '-':
18946 if(!exp->destType->isSigned)
18947 {
18948 nbExp1 = GetNonBracketsExp(nbExp->__anon1.op.exp1);
18949 nbExp2 = GetNonBracketsExp(nbExp->__anon1.op.exp2);
18950 from = nbExp2->expType->promotedFrom;
18951 if((from == 1 || from == 2) && nbExp1->isConstant && nbExp1->type == 2)
18952 {
18953 int n = strtol(nbExp1->__anon1.__anon1.constant, (((void *)0)), 0);
18954
18955 if(n == (from == 1 ? 255 : 65535))
18956 skipWarning = 1;
18957 }
18958 }
18959 break;
18960 case '|':
18961 {
18962 int kind1, kind2;
18963
18964 nbExp1 = GetNonBracketsExp(nbExp->__anon1.op.exp1);
18965 nbExp2 = GetNonBracketsExp(nbExp->__anon1.op.exp2);
18966 kind1 = nbExp1->expType->promotedFrom ? nbExp1->expType->promotedFrom : nbExp1->expType->kind;
18967 kind2 = nbExp2->expType->promotedFrom ? nbExp2->expType->promotedFrom : nbExp2->expType->kind;
18968 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)))
18969 skipWarning = 1;
18970 break;
18971 }
18972 case '&':
18973 {
18974 int kind1, kind2;
18975
18976 nbExp1 = GetNonBracketsExp(nbExp->__anon1.op.exp1);
18977 nbExp2 = GetNonBracketsExp(nbExp->__anon1.op.exp2);
18978 kind1 = nbExp1->expType->promotedFrom ? nbExp1->expType->promotedFrom : nbExp1->expType->kind;
18979 kind2 = nbExp2->expType->promotedFrom ? nbExp2->expType->promotedFrom : nbExp2->expType->kind;
18980 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)))
18981 skipWarning = 1;
18982 break;
18983 }
18984 }
18985 }
18986 if(!skipWarning)
18987 {
18988 char expString[10240];
18989
18990 expString[0] = '\0';
18991 if(inCompiler)
18992 {
18993 PrintExpression(exp, expString);
18994 __ecereNameSpace__ecere__sys__ChangeCh(expString, '\n', ' ');
18995 }
18996 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")))
18997 {
18998 if(invalidCast)
18999 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "incompatible expression %s (%s); expected %s\n", (((void *)0))), expString, type1, type2);
19000 else
19001 Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "incompatible expression %s (%s); expected %s\n", (((void *)0))), expString, type1, type2);
19002 }
19003 }
19004 if(!inCompiler)
19005 {
19006 FreeType(exp->expType);
19007 exp->destType->refCount++;
19008 exp->expType = exp->destType;
19009 }
19010 }
19011 }
19012 }
19013 }
19014 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))
19015 {
19016 struct Expression * nbExp = GetNonBracketsExp(exp);
19017
19018 if(nbExp->type != 11 || !IsVoidPtrCast(nbExp->__anon1.cast.typeName))
19019 {
19020 struct Expression * e = MoveExpContents(exp);
19021
19022 exp->__anon1.cast.exp = MkExpBrackets(MkListOne(e));
19023 exp->type = 11;
19024 exp->__anon1.cast.exp->destType = exp->destType;
19025 if(exp->destType)
19026 exp->destType->refCount++;
19027 exp->__anon1.cast.typeName = MkTypeName(MkListOne(MkSpecifier(VOID)), MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), (((void *)0))));
19028 }
19029 }
19030 }
19031 else if(unresolved)
19032 {
19033 if(exp->__anon1.__anon1.identifier->_class && exp->__anon1.__anon1.identifier->_class->__anon1.__anon1.name)
19034 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);
19035 else if(exp->__anon1.__anon1.identifier->string && exp->__anon1.__anon1.identifier->string[0])
19036 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "unresolved identifier %s\n", (((void *)0))), exp->__anon1.__anon1.identifier->string);
19037 }
19038 else if(!exp->expType && exp->type != 16)
19039 {
19040 char expString[10240];
19041
19042 expString[0] = '\0';
19043 if(inCompiler)
19044 {
19045 PrintExpression(exp, expString);
19046 __ecereNameSpace__ecere__sys__ChangeCh(expString, '\n', ' ');
19047 }
19048 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "couldn't determine type of %s\n", (((void *)0))), expString);
19049 }
19050 if(inCompiler)
19051 ApplyAnyObjectLogic(exp);
19052 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)))
19053 {
19054 exp->byReference = 1;
19055 }
19056 yylloc = oldyylloc;
19057 }
19058
19059 static void ProcessFunction(struct FunctionDefinition * function)
19060 {
19061 struct Identifier * id = GetDeclId(function->declarator);
19062 struct Symbol * symbol = function->declarator ? function->declarator->symbol : (((void *)0));
19063 struct Type * type = symbol ? symbol->type : (((void *)0));
19064 struct __ecereNameSpace__ecere__com__Class * oldThisClass = thisClass;
19065 struct Context * oldTopContext = topContext;
19066
19067 yylloc = function->loc;
19068 if(type && type->__anon1.__anon2.thisClass)
19069 {
19070 struct Symbol * classSym = type->__anon1.__anon2.thisClass;
19071 struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1.__anon2.thisClass->__anon1.registered;
19072 char className[1024];
19073 char structName[1024];
19074 struct Declarator * funcDecl;
19075 struct Symbol * thisSymbol;
19076 unsigned int typedObject = 0;
19077
19078 if(_class && !_class->base)
19079 {
19080 _class = currentClass;
19081 if(_class && !_class->symbol)
19082 _class->symbol = FindClass(_class->fullName);
19083 classSym = _class ? _class->symbol : (((void *)0));
19084 typedObject = 1;
19085 }
19086 thisClass = _class;
19087 if(inCompiler && _class)
19088 {
19089 if(type->kind == 11)
19090 {
19091 if(symbol->type->__anon1.__anon2.params.count == 1 && ((struct Type *)symbol->type->__anon1.__anon2.params.first)->kind == 0)
19092 {
19093 struct Type * param = symbol->type->__anon1.__anon2.params.first;
19094
19095 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove(&symbol->type->__anon1.__anon2.params, param);
19096 FreeType(param);
19097 }
19098 if(type->classObjectType != 1)
19099 {
19100 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert(&symbol->type->__anon1.__anon2.params, (((void *)0)), MkClassType(_class->fullName));
19101 symbol->type->__anon1.__anon2.staticMethod = 1;
19102 symbol->type->__anon1.__anon2.thisClass = (((void *)0));
19103 symbol->type->extraParam = 0;
19104 }
19105 }
19106 strcpy(className, "__ecereClass_");
19107 FullClassNameCat(className, _class->fullName, 1);
19108 structName[0] = 0;
19109 FullClassNameCat(structName, _class->fullName, 0);
19110 funcDecl = GetFuncDecl(function->declarator);
19111 if(funcDecl)
19112 {
19113 if(funcDecl->__anon1.function.parameters && (*funcDecl->__anon1.function.parameters).count == 1)
19114 {
19115 struct TypeName * param = (*funcDecl->__anon1.function.parameters).first;
19116
19117 if(param->qualifiers && (*param->qualifiers).count == 1 && ((struct Specifier *)(*param->qualifiers).first)->__anon1.specifier == VOID && !param->declarator)
19118 {
19119 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove((&*funcDecl->__anon1.function.parameters), param);
19120 FreeTypeName(param);
19121 }
19122 }
19123 if(!function->propertyNoThis)
19124 {
19125 struct TypeName * thisParam = (((void *)0));
19126
19127 if(type->classObjectType != 1)
19128 {
19129 thisParam = QMkClass(_class->fullName, MkDeclaratorIdentifier(MkIdentifier("this")));
19130 if(!funcDecl->__anon1.function.parameters)
19131 funcDecl->__anon1.function.parameters = MkList();
19132 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*funcDecl->__anon1.function.parameters), (((void *)0)), thisParam);
19133 }
19134 if(typedObject)
19135 {
19136 if(type->classObjectType != 1)
19137 {
19138 if(type->byReference || _class->type == 3 || _class->type == 1000 || _class->type == 4 || _class->type == 2)
19139 thisParam->declarator = MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), thisParam->declarator);
19140 }
19141 thisParam = __extension__ ({
19142 struct TypeName * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_TypeName);
19143
19144 __ecereInstance1->declarator = MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), MkDeclaratorIdentifier(MkIdentifier("class"))), __ecereInstance1->qualifiers = MkListOne(MkStructOrUnion(3, MkIdentifier("__ecereNameSpace__ecere__com__Class"), (((void *)0)))), __ecereInstance1;
19145 });
19146 DeclareStruct(curExternal, "ecere::com::Class", 0, 1);
19147 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*funcDecl->__anon1.function.parameters), (((void *)0)), thisParam);
19148 }
19149 }
19150 }
19151 if(symbol && symbol->__anon2.__anon1.pointerExternal && symbol->__anon2.__anon1.pointerExternal->type == 1)
19152 {
19153 struct InitDeclarator * initDecl = (*symbol->__anon2.__anon1.pointerExternal->__anon1.declaration->__anon1.__anon1.declarators).first;
19154
19155 funcDecl = GetFuncDecl(initDecl->declarator);
19156 if(funcDecl)
19157 {
19158 if(funcDecl->__anon1.function.parameters && (*funcDecl->__anon1.function.parameters).count == 1)
19159 {
19160 struct TypeName * param = (*funcDecl->__anon1.function.parameters).first;
19161
19162 if(param->qualifiers && (*param->qualifiers).count == 1 && ((struct Specifier *)(*param->qualifiers).first)->__anon1.specifier == VOID && !param->declarator)
19163 {
19164 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove((&*funcDecl->__anon1.function.parameters), param);
19165 FreeTypeName(param);
19166 }
19167 }
19168 if(type->classObjectType != 1)
19169 {
19170 if((_class->type != 2 && _class->type != 3 && _class->type != 4) || function != (struct FunctionDefinition *)symbol->__anon2.__anon2.externalSet)
19171 {
19172 struct TypeName * thisParam = QMkClass(_class->fullName, MkDeclaratorIdentifier(MkIdentifier("this")));
19173
19174 if(!funcDecl->__anon1.function.parameters)
19175 funcDecl->__anon1.function.parameters = MkList();
19176 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*funcDecl->__anon1.function.parameters), (((void *)0)), thisParam);
19177 }
19178 }
19179 }
19180 }
19181 }
19182 if(function->body)
19183 {
19184 if(type->classObjectType != 1)
19185 {
19186 thisSymbol = __extension__ ({
19187 struct Symbol * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Symbol);
19188
19189 __ecereInstance1->string = __ecereNameSpace__ecere__sys__CopyString("this"), __ecereInstance1->type = classSym ? MkClassType(classSym->string) : (((void *)0)), __ecereInstance1;
19190 });
19191 __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Add(&function->body->__anon1.compound.context->symbols, (struct __ecereNameSpace__ecere__sys__BTNode *)thisSymbol);
19192 if(typedObject && thisSymbol->type)
19193 {
19194 thisSymbol->type->classObjectType = 2;
19195 thisSymbol->type->byReference = type->byReference;
19196 thisSymbol->type->typedByReference = type->byReference;
19197 }
19198 }
19199 }
19200 if(inCompiler && _class && _class->type == 0 && type->classObjectType != 1)
19201 {
19202 struct __ecereNameSpace__ecere__com__DataMember * member = (((void *)0));
19203
19204 {
19205 struct __ecereNameSpace__ecere__com__Class * base;
19206
19207 for(base = _class; base && base->type != 1000; base = base->next)
19208 {
19209 for(member = base->membersAndProperties.first; member; member = member->next)
19210 if(!member->isProperty)
19211 break;
19212 if(member)
19213 break;
19214 }
19215 }
19216 for(member = _class->membersAndProperties.first; member; member = member->next)
19217 if(!member->isProperty)
19218 break;
19219 if(member)
19220 {
19221 char pointerName[1024];
19222 struct Declaration * decl;
19223 struct Initializer * initializer;
19224 struct Expression * exp, * bytePtr;
19225
19226 strcpy(pointerName, "__ecerePointer_");
19227 FullClassNameCat(pointerName, _class->fullName, 0);
19228 {
19229 char className[1024];
19230
19231 strcpy(className, "__ecereClass_");
19232 FullClassNameCat(className, classSym->string, 1);
19233 DeclareClass(curExternal, classSym, className);
19234 }
19235 bytePtr = QBrackets(MkExpCast(QMkType("char", QMkPtrDecl((((void *)0)))), QMkExpId("this")));
19236 if(_class->fixed)
19237 {
19238 struct Expression * e;
19239
19240 if(_class->offset && _class->offset == (_class->base->type == 5 ? _class->base->memberOffset : _class->base->structSize))
19241 {
19242 e = MkExpClassSize(MkSpecifierName(_class->base->fullName));
19243 ProcessExpressionType(e);
19244 }
19245 else
19246 {
19247 char string[256];
19248
19249 sprintf(string, "%d", _class->offset);
19250 e = MkExpConstant(string);
19251 }
19252 exp = QBrackets(MkExpOp(bytePtr, '+', e));
19253 }
19254 else
19255 {
19256 exp = QBrackets(MkExpOp(bytePtr, '+', MkExpPointer(QMkExpId(className), MkIdentifier("offset"))));
19257 }
19258 exp = QBrackets(QMkExpCond(QMkExpId("this"), exp, MkExpConstant("0")));
19259 exp->expType = __extension__ ({
19260 struct Type * __ecereInstance2 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
19261
19262 __ecereInstance2->refCount = 1, __ecereInstance2->kind = 13, __ecereInstance2->__anon1.type = __extension__ ({
19263 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
19264
19265 __ecereInstance1->refCount = 1, __ecereInstance1->kind = 0, __ecereInstance1;
19266 }), __ecereInstance2;
19267 });
19268 if(function->body)
19269 {
19270 yylloc = function->body->loc;
19271 initializer = MkInitializerAssignment(MkExpCast(MkTypeName(MkListOne(MkStructOrUnion(3, MkIdentifier(structName), (((void *)0)))), MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), (((void *)0)))), exp));
19272 {
19273 struct Context * prevContext = curContext;
19274 struct __ecereNameSpace__ecere__sys__OldList * list;
19275
19276 curContext = function->body->__anon1.compound.context;
19277 decl = MkDeclaration((list = MkListOne(MkStructOrUnion(3, MkIdentifier(structName), (((void *)0))))), MkListOne(MkInitDeclarator(QMkPtrDecl(pointerName), initializer)));
19278 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*list), (((void *)0)), MkSpecifierExtended(MkExtDeclAttrib(MkAttrib(ATTRIB, MkListOne(MkAttribute(__ecereNameSpace__ecere__sys__CopyString("unused"), (((void *)0))))))));
19279 curContext = prevContext;
19280 }
19281 decl->symbol = (((void *)0));
19282 if(!function->body->__anon1.compound.declarations)
19283 function->body->__anon1.compound.declarations = MkList();
19284 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*function->body->__anon1.compound.declarations), (((void *)0)), decl);
19285 }
19286 }
19287 }
19288 }
19289 else
19290 thisClass = (((void *)0));
19291 if(id)
19292 {
19293 FreeSpecifier(id->_class);
19294 id->_class = (((void *)0));
19295 if(symbol && symbol->__anon2.__anon1.pointerExternal && symbol->__anon2.__anon1.pointerExternal->type == 1)
19296 {
19297 struct InitDeclarator * initDecl = (*symbol->__anon2.__anon1.pointerExternal->__anon1.declaration->__anon1.__anon1.declarators).first;
19298
19299 id = GetDeclId(initDecl->declarator);
19300 FreeSpecifier(id->_class);
19301 id->_class = (((void *)0));
19302 }
19303 }
19304 if(function->body)
19305 topContext = function->body->__anon1.compound.context;
19306 {
19307 struct FunctionDefinition * oldFunction = curFunction;
19308
19309 curFunction = function;
19310 if(function->body)
19311 ProcessStatement(function->body);
19312 if(inCompiler && function->propSet && !function->propSet->fireWatchersDone)
19313 {
19314 struct Statement * prevCompound = curCompound;
19315 struct Context * prevContext = curContext;
19316 struct Statement * fireWatchers = MkFireWatchersStmt((((void *)0)), (((void *)0)));
19317
19318 if(!function->body->__anon1.compound.statements)
19319 function->body->__anon1.compound.statements = MkList();
19320 ListAdd(function->body->__anon1.compound.statements, fireWatchers);
19321 curCompound = function->body;
19322 curContext = function->body->__anon1.compound.context;
19323 ProcessStatement(fireWatchers);
19324 curContext = prevContext;
19325 curCompound = prevCompound;
19326 }
19327 curFunction = oldFunction;
19328 }
19329 if(function->declarator)
19330 {
19331 ProcessDeclarator(function->declarator, 1);
19332 }
19333 topContext = oldTopContext;
19334 thisClass = oldThisClass;
19335 }
19336
19337 static void ProcessClass(struct __ecereNameSpace__ecere__sys__OldList * definitions, struct Symbol * symbol)
19338 {
19339 struct ClassDef * def;
19340 struct External * external = curExternal;
19341 struct __ecereNameSpace__ecere__com__Class * regClass = symbol ? symbol->__anon1.registered : (((void *)0));
19342
19343 for(def = definitions->first; def; def = def->next)
19344 {
19345 if(def->type == 0)
19346 {
19347 if(def->__anon1.function->declarator)
19348 curExternal = def->__anon1.function->declarator->symbol->__anon2.__anon1.pointerExternal;
19349 else
19350 curExternal = external;
19351 ProcessFunction((struct FunctionDefinition *)def->__anon1.function);
19352 }
19353 else if(def->type == 2)
19354 {
19355 if(def->__anon1.decl->type == 2)
19356 {
19357 thisClass = regClass;
19358 ProcessInstantiationType(def->__anon1.decl->__anon1.inst);
19359 thisClass = (((void *)0));
19360 }
19361 else
19362 {
19363 struct __ecereNameSpace__ecere__com__Class * backThisClass = thisClass;
19364
19365 if(regClass)
19366 thisClass = regClass;
19367 ProcessDeclaration(def->__anon1.decl, symbol ? 1 : 0);
19368 thisClass = backThisClass;
19369 }
19370 }
19371 else if(def->type == 1 && def->__anon1.defProperties)
19372 {
19373 struct MemberInit * defProperty;
19374 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);
19375
19376 __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Add(&globalContext->symbols, (struct __ecereNameSpace__ecere__sys__BTNode *)thisSymbol);
19377 for(defProperty = (*def->__anon1.defProperties).first; defProperty; defProperty = defProperty->next)
19378 {
19379 thisClass = regClass;
19380 ProcessMemberInitData(defProperty, regClass, (((void *)0)), (((void *)0)), (((void *)0)), (((void *)0)));
19381 thisClass = (((void *)0));
19382 }
19383 __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Remove(&globalContext->symbols, (struct __ecereNameSpace__ecere__sys__BTNode *)thisSymbol);
19384 FreeSymbol(thisSymbol);
19385 }
19386 else if(def->type == 3 && def->__anon1.propertyDef)
19387 {
19388 struct PropertyDef * prop = def->__anon1.propertyDef;
19389
19390 thisClass = regClass;
19391 if(prop->setStmt)
19392 {
19393 if(regClass)
19394 {
19395 struct Symbol * thisSymbol = (thisSymbol = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Symbol), thisSymbol->string = __ecereNameSpace__ecere__sys__CopyString("this"), thisSymbol->type = MkClassType(regClass->fullName), thisSymbol);
19396
19397 __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Add(&prop->setStmt->__anon1.compound.context->symbols, (struct __ecereNameSpace__ecere__sys__BTNode *)thisSymbol);
19398 }
19399 curExternal = prop->symbol ? prop->symbol->__anon2.__anon2.externalSet : (((void *)0));
19400 ProcessStatement(prop->setStmt);
19401 }
19402 if(prop->getStmt)
19403 {
19404 if(regClass)
19405 {
19406 struct Symbol * thisSymbol = (thisSymbol = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Symbol), thisSymbol->string = __ecereNameSpace__ecere__sys__CopyString("this"), thisSymbol->type = MkClassType(regClass->fullName), thisSymbol);
19407
19408 __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Add(&prop->getStmt->__anon1.compound.context->symbols, (struct __ecereNameSpace__ecere__sys__BTNode *)thisSymbol);
19409 }
19410 curExternal = prop->symbol ? prop->symbol->__anon2.__anon2.externalGet : (((void *)0));
19411 ProcessStatement(prop->getStmt);
19412 }
19413 if(prop->issetStmt)
19414 {
19415 if(regClass)
19416 {
19417 struct Symbol * thisSymbol = (thisSymbol = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Symbol), thisSymbol->string = __ecereNameSpace__ecere__sys__CopyString("this"), thisSymbol->type = MkClassType(regClass->fullName), thisSymbol);
19418
19419 __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Add(&prop->issetStmt->__anon1.compound.context->symbols, (struct __ecereNameSpace__ecere__sys__BTNode *)thisSymbol);
19420 }
19421 curExternal = prop->symbol ? prop->symbol->__anon2.__anon2.externalIsSet : (((void *)0));
19422 ProcessStatement(prop->issetStmt);
19423 }
19424 thisClass = (((void *)0));
19425 }
19426 else if(def->type == 4 && def->__anon1.propertyWatch)
19427 {
19428 struct PropertyWatch * propertyWatch = def->__anon1.propertyWatch;
19429
19430 thisClass = regClass;
19431 if(propertyWatch->compound)
19432 {
19433 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);
19434
19435 __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Add(&propertyWatch->compound->__anon1.compound.context->symbols, (struct __ecereNameSpace__ecere__sys__BTNode *)thisSymbol);
19436 curExternal = (((void *)0));
19437 ProcessStatement(propertyWatch->compound);
19438 }
19439 thisClass = (((void *)0));
19440 }
19441 }
19442 }
19443
19444 void __ecereRegisterModule_pass15(struct __ecereNameSpace__ecere__com__Instance * module)
19445 {
19446 struct __ecereNameSpace__ecere__com__Class __attribute__((unused)) * class;
19447
19448 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("SetYydebug", "void SetYydebug(bool b)", SetYydebug, module, 1);
19449 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("SetThisClass", "void SetThisClass(ecere::com::Class c)", SetThisClass, module, 1);
19450 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetThisClass", "ecere::com::Class GetThisClass(void)", GetThisClass, module, 1);
19451 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintExpression", "void PrintExpression(Expression exp, char * string)", PrintExpression, module, 1);
19452 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ProcessTemplateParameterType", "Type ProcessTemplateParameterType(TemplateParameter param)", ProcessTemplateParameterType, module, 2);
19453 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("NeedCast", "bool NeedCast(Type type1, Type type2)", NeedCast, module, 2);
19454 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintInt", "char * PrintInt(int64 result)", PrintInt, module, 1);
19455 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintUInt", "char * PrintUInt(uint64 result)", PrintUInt, module, 1);
19456 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintInt64", "char * PrintInt64(int64 result)", PrintInt64, module, 1);
19457 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintUInt64", "char * PrintUInt64(uint64 result)", PrintUInt64, module, 1);
19458 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintHexUInt", "char * PrintHexUInt(uint64 result)", PrintHexUInt, module, 1);
19459 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintHexUInt64", "char * PrintHexUInt64(uint64 result)", PrintHexUInt64, module, 1);
19460 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintShort", "char * PrintShort(short result)", PrintShort, module, 1);
19461 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintUShort", "char * PrintUShort(uint16 result)", PrintUShort, module, 1);
19462 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintChar", "char * PrintChar(char result)", PrintChar, module, 1);
19463 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintUChar", "char * PrintUChar(byte result)", PrintUChar, module, 1);
19464 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintFloat", "char * PrintFloat(float result)", PrintFloat, module, 1);
19465 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintDouble", "char * PrintDouble(double result)", PrintDouble, module, 1);
19466 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpInt", "bool GetOpInt(Operand op2, int * value2)", GetOpInt, module, 1);
19467 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetInt", "bool GetInt(Expression exp, int * value2)", GetInt, module, 1);
19468 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpUInt", "bool GetOpUInt(Operand op2, uint * value2)", GetOpUInt, module, 1);
19469 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetUInt", "bool GetUInt(Expression exp, uint * value2)", GetUInt, module, 1);
19470 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpInt64", "bool GetOpInt64(Operand op2, int64 * value2)", GetOpInt64, module, 1);
19471 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetInt64", "bool GetInt64(Expression exp, int64 * value2)", GetInt64, module, 1);
19472 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpUInt64", "bool GetOpUInt64(Operand op2, uint64 * value2)", GetOpUInt64, module, 1);
19473 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetUInt64", "bool GetUInt64(Expression exp, uint64 * value2)", GetUInt64, module, 1);
19474 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpIntPtr", "bool GetOpIntPtr(Operand op2, intptr * value2)", GetOpIntPtr, module, 1);
19475 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetIntPtr", "bool GetIntPtr(Expression exp, intptr * value2)", GetIntPtr, module, 1);
19476 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpUIntPtr", "bool GetOpUIntPtr(Operand op2, uintptr * value2)", GetOpUIntPtr, module, 1);
19477 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetUIntPtr", "bool GetUIntPtr(Expression exp, uintptr * value2)", GetUIntPtr, module, 1);
19478 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpIntSize", "bool GetOpIntSize(Operand op2, intsize * value2)", GetOpIntSize, module, 1);
19479 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetIntSize", "bool GetIntSize(Expression exp, intsize * value2)", GetIntSize, module, 1);
19480 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpUIntSize", "bool GetOpUIntSize(Operand op2, uintsize * value2)", GetOpUIntSize, module, 1);
19481 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetUIntSize", "bool GetUIntSize(Expression exp, uintsize * value2)", GetUIntSize, module, 1);
19482 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpShort", "bool GetOpShort(Operand op2, short * value2)", GetOpShort, module, 1);
19483 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetShort", "bool GetShort(Expression exp, short * value2)", GetShort, module, 1);
19484 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpUShort", "bool GetOpUShort(Operand op2, uint16 * value2)", GetOpUShort, module, 1);
19485 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetUShort", "bool GetUShort(Expression exp, uint16 * value2)", GetUShort, module, 1);
19486 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpChar", "bool GetOpChar(Operand op2, char * value2)", GetOpChar, module, 1);
19487 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetChar", "bool GetChar(Expression exp, char * value2)", GetChar, module, 1);
19488 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpUChar", "bool GetOpUChar(Operand op2, byte * value2)", GetOpUChar, module, 1);
19489 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetUChar", "bool GetUChar(Expression exp, byte * value2)", GetUChar, module, 1);
19490 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpFloat", "bool GetOpFloat(Operand op2, float * value2)", GetOpFloat, module, 1);
19491 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetFloat", "bool GetFloat(Expression exp, float * value2)", GetFloat, module, 1);
19492 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpDouble", "bool GetOpDouble(Operand op2, double * value2)", GetOpDouble, module, 1);
19493 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetDouble", "bool GetDouble(Expression exp, double * value2)", GetDouble, module, 1);
19494 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ComputeClassMembers", "void ComputeClassMembers(ecere::com::Class _class, bool isMember)", ComputeClassMembers, module, 2);
19495 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ComputeModuleClasses", "void ComputeModuleClasses(ecere::com::Module module)", ComputeModuleClasses, module, 1);
19496 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ComputeTypeSize", "int ComputeTypeSize(Type type)", ComputeTypeSize, module, 1);
19497 __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);
19498 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("DeclareStruct", "External DeclareStruct(External neededBy, const char * name, bool skipNoHead, bool needDereference)", DeclareStruct, module, 2);
19499 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("_DeclareStruct", "External _DeclareStruct(External neededBy, const char * name, bool skipNoHead, bool needDereference, bool fwdDecl)", _DeclareStruct, module, 2);
19500 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("DeclareProperty", "void DeclareProperty(External neededBy, ecere::com::Property prop, char * setName, char * getName)", DeclareProperty, module, 2);
19501 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("Dereference", "Type Dereference(Type source)", Dereference, module, 1);
19502 __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);
19503 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ProcessInstantiationType", "void ProcessInstantiationType(Instantiation inst)", ProcessInstantiationType, module, 2);
19504 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("DeclareType", "void DeclareType(External neededFor, Type type, bool needDereference, bool forFunctionDef)", DeclareType, module, 2);
19505 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("DeclareTypeForwardDeclare", "void DeclareTypeForwardDeclare(External neededFor, Type type, bool needDereference, bool forFunctionDef)", DeclareTypeForwardDeclare, module, 2);
19506 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("FindTemplateArg", "ecere::com::ClassTemplateArgument * FindTemplateArg(ecere::com::Class _class, TemplateParameter param)", FindTemplateArg, module, 2);
19507 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("SetupTemplatesContext", "Context SetupTemplatesContext(ecere::com::Class _class)", SetupTemplatesContext, module, 1);
19508 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("FinishTemplatesContext", "void FinishTemplatesContext(Context context)", FinishTemplatesContext, module, 1);
19509 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ProcessMethodType", "void ProcessMethodType(ecere::com::Method method)", ProcessMethodType, module, 1);
19510 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ProcessPropertyType", "void ProcessPropertyType(ecere::com::Property prop)", ProcessPropertyType, module, 1);
19511 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("DeclareMethod", "void DeclareMethod(External neededFor, ecere::com::Method method, const char * name)", DeclareMethod, module, 1);
19512 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ReplaceThisClass", "char * ReplaceThisClass(ecere::com::Class _class)", ReplaceThisClass, module, 2);
19513 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ReplaceThisClassType", "Type ReplaceThisClassType(ecere::com::Class _class)", ReplaceThisClassType, module, 2);
19514 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ReplaceThisClassSpecifiers", "void ReplaceThisClassSpecifiers(ecere::sys::OldList specs, ecere::com::Class _class)", ReplaceThisClassSpecifiers, module, 2);
19515 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("DeclareFunction", "bool DeclareFunction(External neededFor, ecere::com::GlobalFunction function, char * name)", DeclareFunction, module, 2);
19516 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("DeclareGlobalData", "void DeclareGlobalData(External neededFor, GlobalData data)", DeclareGlobalData, module, 2);
19517 class = __ecereNameSpace__ecere__com__eSystem_RegisterClass(5, "Conversion", 0, sizeof(struct Conversion), 0, (void *)0, (void *)0, module, 2, 1);
19518 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)
19519 __ecereClass_Conversion = class;
19520 __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);
19521 __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);
19522 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ModuleVisibility", "bool ModuleVisibility(ecere::com::Module searchIn, ecere::com::Module searchFor)", ModuleVisibility, module, 1);
19523 __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);
19524 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("MatchTypeExpression", "bool MatchTypeExpression(Expression sourceExp, Type dest, ecere::sys::OldList conversions, bool skipUnitBla, bool warnConst)", MatchTypeExpression, module, 2);
19525 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ReadString", "void ReadString(char * output, char * string)", ReadString, module, 1);
19526 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("UnescapeString", "int UnescapeString(char * d, char * s, int len)", UnescapeString, module, 1);
19527 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("OffsetEscapedString", "char * OffsetEscapedString(char * s, int len, int offset)", OffsetEscapedString, module, 1);
19528 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOperand", "Operand GetOperand(Expression exp)", GetOperand, module, 1);
19529 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PopulateInstance", "void PopulateInstance(Instantiation inst)", PopulateInstance, module, 1);
19530 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ComputeInstantiation", "void ComputeInstantiation(Expression exp)", ComputeInstantiation, module, 1);
19531 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("CallOperator", "void CallOperator(Expression exp, Expression exp1, Expression exp2, Operand op1, Operand op2)", CallOperator, module, 1);
19532 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ComputeExpression", "void ComputeExpression(Expression exp)", ComputeExpression, module, 1);
19533 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("CheckTemplateTypes", "void CheckTemplateTypes(Expression exp)", CheckTemplateTypes, module, 1);
19534 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("FindSymbol", "Symbol FindSymbol(const char * name, Context startContext, Context endContext, bool isStruct, bool globalNameSpace)", FindSymbol, module, 1);
19535 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintType", "void PrintType(Type type, char * string, bool printName, bool fullName)", PrintType, module, 1);
19536 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintTypeNoConst", "void PrintTypeNoConst(Type type, char * string, bool printName, bool fullName)", PrintTypeNoConst, module, 1);
19537 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("FindMemberAndOffset", "Type FindMemberAndOffset(Type type, char * string, uint * offset)", FindMemberAndOffset, module, 1);
19538 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetParseError", "bool GetParseError(void)", GetParseError, module, 1);
19539 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ParseExpressionString", "Expression ParseExpressionString(char * expression)", ParseExpressionString, module, 1);
19540 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ReplaceExpContents", "void ReplaceExpContents(Expression checkedExp, Expression newExp)", ReplaceExpContents, module, 1);
19541 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ApplyAnyObjectLogic", "void ApplyAnyObjectLogic(Expression e)", ApplyAnyObjectLogic, module, 1);
19542 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ApplyLocation", "void ApplyLocation(Expression exp, Location loc)", ApplyLocation, module, 1);
19543 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ProcessExpressionType", "void ProcessExpressionType(Expression exp)", ProcessExpressionType, module, 1);
19544 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("DeclareFunctionUtil", "void DeclareFunctionUtil(External neededBy, const String s)", DeclareFunctionUtil, module, 1);
19545 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ComputeDataTypes", "void ComputeDataTypes(void)", ComputeDataTypes, module, 1);
19546 }
19547