a6868d7ffee3072f1b35ad16fc7a201a3f5f21df
[sdk] / compiler / bootstrap / libec / bootstrap / pass15.c
1 /* Code generated from eC source file: pass15.ec */
2 #if defined(_WIN32)
3 #define __runtimePlatform 1
4 #elif defined(__APPLE__)
5 #define __runtimePlatform 3
6 #else
7 #define __runtimePlatform 2
8 #endif
9 #if defined(__GNUC__)
10 typedef long long int64;
11 typedef unsigned long long uint64;
12 #ifndef _WIN32
13 #define __declspec(x)
14 #endif
15 #elif defined(__TINYC__)
16 #include <stdarg.h>
17 #define __builtin_va_list va_list
18 #define __builtin_va_start va_start
19 #define __builtin_va_end va_end
20 #ifdef _WIN32
21 #define strcasecmp stricmp
22 #define strncasecmp strnicmp
23 #define __declspec(x) __attribute__((x))
24 #else
25 #define __declspec(x)
26 #endif
27 typedef long long int64;
28 typedef unsigned long long uint64;
29 #else
30 typedef __int64 int64;
31 typedef unsigned __int64 uint64;
32 #endif
33 #ifdef __BIG_ENDIAN__
34 #define __ENDIAN_PAD(x) (8 - (x))
35 #else
36 #define __ENDIAN_PAD(x) 0
37 #endif
38 #if defined(_WIN32)
39 #   if defined(__GNUC__) || defined(__TINYC__)
40 #      define ecere_stdcall __attribute__((__stdcall__))
41 #      define ecere_gcc_struct __attribute__((gcc_struct))
42 #   else
43 #      define ecere_stdcall __stdcall
44 #      define ecere_gcc_struct
45 #   endif
46 #else
47 #   define ecere_stdcall
48 #   define ecere_gcc_struct
49 #endif
50 #include <stdint.h>
51 #include <sys/types.h>
52 enum yytokentype
53 {
54 IDENTIFIER = 258, CONSTANT = 259, STRING_LITERAL = 260, SIZEOF = 261, PTR_OP = 262, INC_OP = 263, DEC_OP = 264, LEFT_OP = 265, RIGHT_OP = 266, LE_OP = 267, GE_OP = 268, EQ_OP = 269, NE_OP = 270, AND_OP = 271, OR_OP = 272, MUL_ASSIGN = 273, DIV_ASSIGN = 274, MOD_ASSIGN = 275, ADD_ASSIGN = 276, SUB_ASSIGN = 277, LEFT_ASSIGN = 278, RIGHT_ASSIGN = 279, AND_ASSIGN = 280, XOR_ASSIGN = 281, OR_ASSIGN = 282, TYPE_NAME = 283, TYPEDEF = 284, EXTERN = 285, STATIC = 286, AUTO = 287, REGISTER = 288, CHAR = 289, SHORT = 290, INT = 291, UINT = 292, INT64 = 293, LONG = 294, SIGNED = 295, UNSIGNED = 296, FLOAT = 297, DOUBLE = 298, CONST = 299, VOLATILE = 300, VOID = 301, VALIST = 302, STRUCT = 303, UNION = 304, ENUM = 305, ELLIPSIS = 306, CASE = 307, DEFAULT = 308, IF = 309, SWITCH = 310, WHILE = 311, DO = 312, FOR = 313, GOTO = 314, CONTINUE = 315, BREAK = 316, RETURN = 317, IFX = 318, ELSE = 319, CLASS = 320, THISCLASS = 321, CLASS_NAME = 322, PROPERTY = 323, SETPROP = 324, GETPROP = 325, NEWOP = 326, RENEW = 327, DELETE = 328, EXT_DECL = 329, EXT_STORAGE = 330, IMPORT = 331, DEFINE = 332, VIRTUAL = 333, ATTRIB = 334, PUBLIC = 335, PRIVATE = 336, TYPED_OBJECT = 337, ANY_OBJECT = 338, _INCREF = 339, EXTENSION = 340, ASM = 341, TYPEOF = 342, WATCH = 343, STOPWATCHING = 344, FIREWATCHERS = 345, WATCHABLE = 346, CLASS_DESIGNER = 347, CLASS_NO_EXPANSION = 348, CLASS_FIXED = 349, ISPROPSET = 350, CLASS_DEFAULT_PROPERTY = 351, PROPERTY_CATEGORY = 352, CLASS_DATA = 353, CLASS_PROPERTY = 354, SUBCLASS = 355, NAMESPACE = 356, NEW0OP = 357, RENEW0 = 358, VAARG = 359, DBTABLE = 360, DBFIELD = 361, DBINDEX = 362, DATABASE_OPEN = 363, ALIGNOF = 364, ATTRIB_DEP = 365, __ATTRIB = 366, BOOL = 367, _BOOL = 368, _COMPLEX = 369, _IMAGINARY = 370, RESTRICT = 371, THREAD = 372, WIDE_STRING_LITERAL = 373, BUILTIN_OFFSETOF = 374
55 };
56
57 extern int returnCode;
58
59 extern unsigned int yydebug;
60
61 extern unsigned int echoOn;
62
63 void resetScanner();
64
65 int propWatcherID;
66
67 int expression_yyparse();
68
69 static char * thisNameSpace;
70
71 unsigned int thisClassParams = 1;
72
73 unsigned int internalValueCounter;
74
75 extern unsigned int outputLineNumbers;
76
77 extern struct __ecereNameSpace__ecere__com__Property * __ecereProp_float_isInf;
78
79 extern struct __ecereNameSpace__ecere__com__Property * __ecereProp_float_signBit;
80
81 extern struct __ecereNameSpace__ecere__com__Property * __ecereProp_float_isNan;
82
83 extern struct __ecereNameSpace__ecere__com__Property * __ecereProp_double_isInf;
84
85 extern struct __ecereNameSpace__ecere__com__Property * __ecereProp_double_signBit;
86
87 extern struct __ecereNameSpace__ecere__com__Property * __ecereProp_double_isNan;
88
89 extern int targetBits;
90
91 extern unsigned int inCompiler;
92
93 extern unsigned int inPreCompiler;
94
95 extern unsigned int inDebugger;
96
97 extern struct __ecereNameSpace__ecere__com__Property * __ecereProp___ecereNameSpace__ecere__sys__BinaryTree_first;
98
99 extern struct __ecereNameSpace__ecere__com__Property * __ecereProp___ecereNameSpace__ecere__sys__BTNode_next;
100
101 int UnescapeString(char * d, char * s, int len)
102 {
103 int j = 0, k = 0;
104 char ch;
105
106 while(j < len && (ch = s[j]))
107 {
108 switch(ch)
109 {
110 case '\\':
111 switch((ch = s[++j]))
112 {
113 case 'n':
114 d[k] = '\n';
115 break;
116 case 't':
117 d[k] = '\t';
118 break;
119 case 'a':
120 d[k] = '\a';
121 break;
122 case 'b':
123 d[k] = '\b';
124 break;
125 case 'f':
126 d[k] = '\f';
127 break;
128 case 'r':
129 d[k] = '\r';
130 break;
131 case 'v':
132 d[k] = '\v';
133 break;
134 case '\\':
135 d[k] = '\\';
136 break;
137 case '\"':
138 d[k] = '\"';
139 break;
140 case '\'':
141 d[k] = '\'';
142 break;
143 default:
144 d[k] = '\\';
145 d[k] = ch;
146 }
147 break;
148 default:
149 d[k] = ch;
150 }
151 j++, k++;
152 }
153 d[k] = '\0';
154 return k;
155 }
156
157 char * OffsetEscapedString(char * s, int len, int offset)
158 {
159 char ch;
160 int j = 0, k = 0;
161
162 while(j < len && k < offset && (ch = s[j]))
163 {
164 if(ch == '\\')
165 ++j;
166 j++, k++;
167 }
168 return (k == offset) ? s + j : (((void *)0));
169 }
170
171 extern int __ecereVMethodID_class_OnGetString;
172
173 extern struct __ecereNameSpace__ecere__com__Property * __ecereProp_Type_isPointerType;
174
175 extern unsigned int parseError;
176
177 static int definedExpStackPos;
178
179 static void * definedExpStack[512];
180
181 extern const char *  sourceFile;
182
183 extern struct __ecereNameSpace__ecere__com__Property * __ecereProp_Type_specConst;
184
185 unsigned int reachedPass15;
186
187 extern unsigned int memoryGuard;
188
189 struct __ecereNameSpace__ecere__sys__OldList
190 {
191 void *  first;
192 void *  last;
193 int count;
194 unsigned int offset;
195 unsigned int circ;
196 } ecere_gcc_struct;
197
198 struct __ecereNameSpace__ecere__com__DataValue
199 {
200 union
201 {
202 char c;
203 unsigned char uc;
204 short s;
205 unsigned short us;
206 int i;
207 unsigned int ui;
208 void *  p;
209 float f;
210 double d;
211 long long i64;
212 uint64 ui64;
213 } ecere_gcc_struct __anon1;
214 } ecere_gcc_struct;
215
216 struct __ecereNameSpace__ecere__com__SerialBuffer
217 {
218 unsigned char *  _buffer;
219 unsigned int count;
220 unsigned int _size;
221 unsigned int pos;
222 } ecere_gcc_struct;
223
224 extern void *  __ecereNameSpace__ecere__com__eSystem_New(unsigned int size);
225
226 extern void *  __ecereNameSpace__ecere__com__eSystem_New0(unsigned int size);
227
228 extern void *  __ecereNameSpace__ecere__com__eSystem_Renew(void *  memory, unsigned int size);
229
230 extern void *  __ecereNameSpace__ecere__com__eSystem_Renew0(void *  memory, unsigned int size);
231
232 extern void __ecereNameSpace__ecere__com__eSystem_Delete(void *  memory);
233
234 struct Pointer;
235
236 struct Attrib;
237
238 struct Attribute;
239
240 struct TemplateArgument;
241
242 struct DBTableEntry;
243
244 struct DBIndexItem;
245
246 struct DBTableDef;
247
248 struct CodePosition
249 {
250 int line;
251 int charPos;
252 int pos;
253 int included;
254 } ecere_gcc_struct;
255
256 extern size_t strlen(const char * );
257
258 extern int strcmp(const char * , const char * );
259
260 extern int sprintf(char * , const char * , ...);
261
262 extern char *  strcat(char * , const char * );
263
264 extern char *  __ecereNameSpace__ecere__sys__CopyString(const char *  string);
265
266 extern int isprint(int c);
267
268 extern char *  strcpy(char * , const char * );
269
270 extern void Compiler_Error(const char *  format, ...);
271
272 extern const char *  __ecereNameSpace__ecere__GetTranslatedString(const char * name, const char *  string, const char *  stringAndContext);
273
274 struct __ecereNameSpace__ecere__com__LinkList
275 {
276 void * first;
277 void * last;
278 int count;
279 } ecere_gcc_struct;
280
281 extern char *  strchr(const char * , int);
282
283 extern void FullClassNameCat(char *  output, const char *  className, unsigned int includeTemplateParams);
284
285 extern void *  memcpy(void * , const void * , size_t size);
286
287 extern void __ecereNameSpace__ecere__sys__ChangeCh(char *  string, char ch1, char ch2);
288
289 extern void Compiler_Warning(const char *  format, ...);
290
291 extern unsigned long strtoul(const char *  nptr, char * *  endptr, int base);
292
293 extern long long strtoll(const char *  nptr, char * *  endptr, int base);
294
295 extern uint64 strtoull(const char *  nptr, char * *  endptr, int base);
296
297 extern int strtol(const char * , char * * , int base);
298
299 extern long long __ecereNameSpace__ecere__com___strtoi64(const char *  string, const char * *  endString, int base);
300
301 extern uint64 __ecereNameSpace__ecere__com___strtoui64(const char *  string, const char * *  endString, int base);
302
303 extern double strtod(const char * , char * * );
304
305 extern int strncmp(const char * , const char * , size_t n);
306
307 extern char *  __ecereNameSpace__ecere__sys__RSearchString(const char *  buffer, const char *  subStr, int maxLen, unsigned int matchCase, unsigned int matchWord);
308
309 extern char *  QMkString(const char *  source);
310
311 extern char *  strncpy(char * , const char * , size_t n);
312
313 extern int printf(const char * , ...);
314
315 extern char *  strstr(const char * , const char * );
316
317 extern unsigned int __ecereNameSpace__ecere__sys__UTF8GetChar(const char *  string, int *  numBytes);
318
319 extern unsigned int (* __ecereProp_float_Get_isInf)(float this);
320
321 extern int (* __ecereProp_float_Get_signBit)(float this);
322
323 extern unsigned int (* __ecereProp_float_Get_isNan)(float this);
324
325 extern unsigned int (* __ecereProp_double_Get_isInf)(double this);
326
327 extern int (* __ecereProp_double_Get_signBit)(double this);
328
329 extern unsigned int (* __ecereProp_double_Get_isNan)(double this);
330
331 extern float (* __ecereMethod_float_inf)(void);
332
333 extern float (* __ecereMethod_float_nan)(void);
334
335 extern double (* __ecereMethod_double_inf)(void);
336
337 extern double (* __ecereMethod_double_nan)(void);
338
339 int __ecereVMethodID_class_OnGetString;
340
341 void SetYydebug(unsigned int b)
342 {
343 yydebug = b;
344 }
345
346 unsigned int GetParseError()
347 {
348 return parseError;
349 }
350
351 extern struct __ecereNameSpace__ecere__sys__OldList * ast;
352
353 extern struct __ecereNameSpace__ecere__sys__OldList *  MkList(void);
354
355 extern struct __ecereNameSpace__ecere__sys__OldList *  MkListOne(void *  item);
356
357 extern void ListAdd(struct __ecereNameSpace__ecere__sys__OldList * list, void *  item);
358
359 extern void FreeList(struct __ecereNameSpace__ecere__sys__OldList * list, void (*  FreeFunction)(void * ));
360
361 struct __ecereNameSpace__ecere__com__EnumClassData
362 {
363 struct __ecereNameSpace__ecere__sys__OldList values;
364 long long largest;
365 } ecere_gcc_struct;
366
367 extern struct __ecereNameSpace__ecere__sys__OldList *  CopyList(struct __ecereNameSpace__ecere__sys__OldList *  source, void *  (*  CopyFunction)(void * ));
368
369 void __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(struct __ecereNameSpace__ecere__sys__OldList * this, void *  item);
370
371 unsigned int __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert(struct __ecereNameSpace__ecere__sys__OldList * this, void *  prevItem, void *  item);
372
373 void __ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove(struct __ecereNameSpace__ecere__sys__OldList * this, void *  item);
374
375 void __ecereMethod___ecereNameSpace__ecere__sys__OldList_Free(struct __ecereNameSpace__ecere__sys__OldList * this, void (*  freeFn)(void * ));
376
377 void __ecereMethod___ecereNameSpace__ecere__sys__OldList_Clear(struct __ecereNameSpace__ecere__sys__OldList * this);
378
379 extern struct Pointer * MkPointer(struct __ecereNameSpace__ecere__sys__OldList * qualifiers, struct Pointer * pointer);
380
381 extern struct Attrib * MkAttrib(int type, struct __ecereNameSpace__ecere__sys__OldList *  attribs);
382
383 struct Location
384 {
385 struct CodePosition start;
386 struct CodePosition end;
387 } ecere_gcc_struct;
388
389 void ReadString(char * output, char * string)
390 {
391 int len = strlen(string);
392 int c, d = 0;
393 unsigned int quoted = 0, escaped = 0;
394
395 for(c = 0; c < len; c++)
396 {
397 char ch = string[c];
398
399 if(escaped)
400 {
401 switch(ch)
402 {
403 case 'n':
404 output[d] = '\n';
405 break;
406 case 't':
407 output[d] = '\t';
408 break;
409 case 'a':
410 output[d] = '\a';
411 break;
412 case 'b':
413 output[d] = '\b';
414 break;
415 case 'f':
416 output[d] = '\f';
417 break;
418 case 'r':
419 output[d] = '\r';
420 break;
421 case 'v':
422 output[d] = '\v';
423 break;
424 case '\\':
425 output[d] = '\\';
426 break;
427 case '\"':
428 output[d] = '\"';
429 break;
430 case '\'':
431 output[d] = '\'';
432 break;
433 default:
434 output[d] = ch;
435 }
436 d++;
437 escaped = 0;
438 }
439 else
440 {
441 if(ch == '\"')
442 quoted ^= 1;
443 else if(quoted)
444 {
445 if(ch == '\\')
446 escaped = 1;
447 else
448 output[d++] = ch;
449 }
450 }
451 }
452 output[d] = '\0';
453 }
454
455 char * PrintInt(long long result)
456 {
457 char temp[100];
458
459 if(result > (((int)0x7fffffff)))
460 sprintf(temp, ((__runtimePlatform == 1) ? "0x%I64X" : "0x%llX"), result);
461 else
462 sprintf(temp, ((__runtimePlatform == 1) ? "%I64d" : "%lld"), result);
463 if(result > (((int)0x7fffffff)) || result < (((int)0x80000000)))
464 strcat(temp, "LL");
465 return __ecereNameSpace__ecere__sys__CopyString(temp);
466 }
467
468 char * PrintUInt(uint64 result)
469 {
470 char temp[100];
471
472 if(result > (0xffffffff))
473 sprintf(temp, ((__runtimePlatform == 1) ? "0x%I64XLL" : "0x%llXLL"), result);
474 else if(result > (((int)0x7fffffff)))
475 sprintf(temp, ((__runtimePlatform == 1) ? "0x%I64X" : "0x%llX"), result);
476 else
477 sprintf(temp, ((__runtimePlatform == 1) ? "%I64d" : "%lld"), result);
478 return __ecereNameSpace__ecere__sys__CopyString(temp);
479 }
480
481 char * PrintInt64(long long result)
482 {
483 char temp[100];
484
485 if(result > (((int)0x7fffffff)) || result < (((int)0x80000000)))
486 sprintf(temp, ((__runtimePlatform == 1) ? "%I64dLL" : "%lldLL"), result);
487 else
488 sprintf(temp, ((__runtimePlatform == 1) ? "%I64d" : "%lld"), result);
489 return __ecereNameSpace__ecere__sys__CopyString(temp);
490 }
491
492 char * PrintUInt64(uint64 result)
493 {
494 char temp[100];
495
496 if(result > (0xffffffff))
497 sprintf(temp, ((__runtimePlatform == 1) ? "0x%I64XLL" : "0x%llXLL"), result);
498 else if(result > (((int)0x7fffffff)))
499 sprintf(temp, ((__runtimePlatform == 1) ? "0x%I64X" : "0x%llX"), result);
500 else
501 sprintf(temp, ((__runtimePlatform == 1) ? "%I64d" : "%lld"), result);
502 return __ecereNameSpace__ecere__sys__CopyString(temp);
503 }
504
505 char * PrintHexUInt(uint64 result)
506 {
507 char temp[100];
508
509 if(result > (0xffffffff))
510 sprintf(temp, ((__runtimePlatform == 1) ? "0x%I64X" : "0x%llX"), result);
511 else
512 sprintf(temp, ((__runtimePlatform == 1) ? "0x%I64X" : "0x%llX"), result);
513 if(result > (0xffffffff))
514 strcat(temp, "LL");
515 return __ecereNameSpace__ecere__sys__CopyString(temp);
516 }
517
518 char * PrintHexUInt64(uint64 result)
519 {
520 char temp[100];
521
522 if(result > (0xffffffff))
523 sprintf(temp, ((__runtimePlatform == 1) ? "0x%I64XLL" : "0x%llXLL"), result);
524 else
525 sprintf(temp, ((__runtimePlatform == 1) ? "0x%I64X" : "0x%llX"), result);
526 return __ecereNameSpace__ecere__sys__CopyString(temp);
527 }
528
529 char * PrintShort(short result)
530 {
531 char temp[100];
532
533 sprintf(temp, "%d", (unsigned short)result);
534 return __ecereNameSpace__ecere__sys__CopyString(temp);
535 }
536
537 char * PrintUShort(unsigned short result)
538 {
539 char temp[100];
540
541 if(result > 32767)
542 sprintf(temp, "0x%X", (int)result);
543 else
544 sprintf(temp, "%d", (int)result);
545 return __ecereNameSpace__ecere__sys__CopyString(temp);
546 }
547
548 char * PrintUChar(unsigned char result)
549 {
550 char temp[100];
551
552 sprintf(temp, "0x%X", result);
553 return __ecereNameSpace__ecere__sys__CopyString(temp);
554 }
555
556 char * PrintChar(char result)
557 {
558 char temp[100];
559
560 if(result > 0 && isprint(result))
561 sprintf(temp, "'%c'", result);
562 else if(result < 0)
563 sprintf(temp, "%d", (int)result);
564 else
565 sprintf(temp, "0x%X", (unsigned char)result);
566 return __ecereNameSpace__ecere__sys__CopyString(temp);
567 }
568
569 char * PrintFloat(float result)
570 {
571 char temp[350];
572
573 if(__ecereProp_float_Get_isInf(result))
574 {
575 if(__ecereProp_float_Get_signBit(result))
576 strcpy(temp, "-inf");
577 else
578 strcpy(temp, "inf");
579 }
580 else if(__ecereProp_float_Get_isNan(result))
581 {
582 if(__ecereProp_float_Get_signBit(result))
583 strcpy(temp, "-nan");
584 else
585 strcpy(temp, "nan");
586 }
587 else
588 sprintf(temp, "%.16ff", result);
589 return __ecereNameSpace__ecere__sys__CopyString(temp);
590 }
591
592 char * PrintDouble(double result)
593 {
594 char temp[350];
595
596 if(__ecereProp_double_Get_isInf(result))
597 {
598 if(__ecereProp_double_Get_signBit(result))
599 strcpy(temp, "-inf");
600 else
601 strcpy(temp, "inf");
602 }
603 else if(__ecereProp_double_Get_isNan(result))
604 {
605 if(__ecereProp_double_Get_signBit(result))
606 strcpy(temp, "-nan");
607 else
608 strcpy(temp, "nan");
609 }
610 else
611 sprintf(temp, "%.16f", result);
612 return __ecereNameSpace__ecere__sys__CopyString(temp);
613 }
614
615 extern struct Location yylloc;
616
617 struct ExtDecl
618 {
619 struct Location loc;
620 int type;
621 union
622 {
623 char * s;
624 struct Attrib * attr;
625 } ecere_gcc_struct __anon1;
626 } ecere_gcc_struct;
627
628 extern struct ExtDecl * MkExtDeclAttrib(struct Attrib * attr);
629
630 struct Expression;
631
632 extern struct Expression * parsedExpression;
633
634 extern struct Expression * QMkExpId(const char *  id);
635
636 extern struct Expression * MkExpOp(struct Expression * exp1, int op, struct Expression * exp2);
637
638 void ComputeExpression(struct Expression * exp);
639
640 extern struct Expression * MkExpConstant(const char *  string);
641
642 extern struct Attribute * MkAttribute(char * attr, struct Expression * exp);
643
644 extern void FreeExpression(struct Expression * exp);
645
646 extern void FreeExpContents(struct Expression * exp);
647
648 extern struct Expression * GetNonBracketsExp(struct Expression * exp);
649
650 extern struct Expression * CopyExpression(struct Expression * exp);
651
652 extern struct Expression * MkExpBrackets(struct __ecereNameSpace__ecere__sys__OldList * expressions);
653
654 extern struct Expression * MkExpCall(struct Expression * expression, struct __ecereNameSpace__ecere__sys__OldList * arguments);
655
656 extern struct Expression * MkExpCondition(struct Expression * cond, struct __ecereNameSpace__ecere__sys__OldList * expressions, struct Expression * elseExp);
657
658 extern struct Expression * MoveExpContents(struct Expression * exp);
659
660 extern struct Expression * QBrackets(struct Expression * exp);
661
662 extern struct Expression * QMkExpCond(struct Expression * cond, struct Expression * exp, struct Expression * elseExp);
663
664 struct Statement;
665
666 static struct Statement * curCompound;
667
668 extern struct Statement * MkCompoundStmt(struct __ecereNameSpace__ecere__sys__OldList * declarations, struct __ecereNameSpace__ecere__sys__OldList * statements);
669
670 extern struct Statement * MkExpressionStmt(struct __ecereNameSpace__ecere__sys__OldList * expressions);
671
672 extern struct Statement * MkIfStmt(struct __ecereNameSpace__ecere__sys__OldList * exp, struct Statement * statement, struct Statement * elseStmt);
673
674 extern struct Statement * MkForStmt(struct Statement * init, struct Statement * check, struct __ecereNameSpace__ecere__sys__OldList * inc, struct Statement * statement);
675
676 extern struct Statement * MkWhileStmt(struct __ecereNameSpace__ecere__sys__OldList * exp, struct Statement * statement);
677
678 extern struct Statement * MkFireWatchersStmt(struct Expression * object, struct __ecereNameSpace__ecere__sys__OldList * watches);
679
680 struct External;
681
682 struct External * curExternal, * afterExternal;
683
684 extern void FreeExternal(struct External * external);
685
686 struct Type;
687
688 static struct Type * curSwitchType;
689
690 extern struct Type * ProcessTypeString(const char *  string, unsigned int staticMethod);
691
692 extern void FreeType(struct Type * type);
693
694 extern struct Type * MkClassType(const char *  name);
695
696 extern void CopyTypeInto(struct Type * type, struct Type * src);
697
698 struct __ecereNameSpace__ecere__com__Class;
699
700 struct __ecereNameSpace__ecere__com__Instance
701 {
702 void * *  _vTbl;
703 struct __ecereNameSpace__ecere__com__Class * _class;
704 int _refCount;
705 } ecere_gcc_struct;
706
707 extern long long __ecereNameSpace__ecere__com__eClass_GetProperty(struct __ecereNameSpace__ecere__com__Class * _class, const char *  name);
708
709 extern void __ecereNameSpace__ecere__com__eClass_SetProperty(struct __ecereNameSpace__ecere__com__Class * _class, const char *  name, long long value);
710
711 static struct __ecereNameSpace__ecere__com__Class * currentClass;
712
713 struct __ecereNameSpace__ecere__com__Class * thisClass;
714
715 struct __ecereNameSpace__ecere__com__Class * containerClass;
716
717 extern unsigned int __ecereNameSpace__ecere__com__eClass_IsDerived(struct __ecereNameSpace__ecere__com__Class * _class, struct __ecereNameSpace__ecere__com__Class * from);
718
719 extern struct Expression * GetTemplateArgExpByName(const char *  paramName, struct __ecereNameSpace__ecere__com__Class * curClass, int tplType);
720
721 extern void *  __ecereNameSpace__ecere__com__eInstance_New(struct __ecereNameSpace__ecere__com__Class * _class);
722
723 extern void __ecereNameSpace__ecere__com__eInstance_SetMethod(struct __ecereNameSpace__ecere__com__Instance * instance, const char *  name, void *  function);
724
725 extern void __ecereNameSpace__ecere__com__eInstance_IncRef(struct __ecereNameSpace__ecere__com__Instance * instance);
726
727 extern void OutputExpression(struct Expression * exp, struct __ecereNameSpace__ecere__com__Instance * f);
728
729 extern struct __ecereNameSpace__ecere__com__Instance * fileInput;
730
731 int __ecereVMethodID___ecereNameSpace__ecere__sys__File_Seek;
732
733 int __ecereVMethodID___ecereNameSpace__ecere__sys__File_Read;
734
735 extern void __ecereNameSpace__ecere__com__eInstance_DecRef(struct __ecereNameSpace__ecere__com__Instance * instance);
736
737 int __ecereVMethodID___ecereNameSpace__ecere__sys__File_Write;
738
739 void SetThisClass(struct __ecereNameSpace__ecere__com__Class * c)
740 {
741 thisClass = c;
742 }
743
744 struct __ecereNameSpace__ecere__com__Class * GetThisClass()
745 {
746 return thisClass;
747 }
748
749 struct Context;
750
751 extern struct Context * curContext;
752
753 extern struct Context * topContext;
754
755 extern struct Context * PushContext(void);
756
757 extern void PopContext(struct Context * ctx);
758
759 extern void FreeContext(struct Context * context);
760
761 extern struct Context * globalContext;
762
763 struct ModuleImport;
764
765 extern struct ModuleImport * mainModule;
766
767 struct ModuleImport
768 {
769 struct ModuleImport * prev;
770 struct ModuleImport * next;
771 char *  name;
772 struct __ecereNameSpace__ecere__sys__OldList classes;
773 struct __ecereNameSpace__ecere__sys__OldList functions;
774 int importType;
775 int importAccess;
776 } ecere_gcc_struct;
777
778 struct __ecereNameSpace__ecere__com__NameSpace;
779
780 extern struct __ecereNameSpace__ecere__com__NameSpace *  globalData;
781
782 struct FunctionDefinition;
783
784 static struct FunctionDefinition * curFunction;
785
786 struct __ecereNameSpace__ecere__sys__BTNode;
787
788 struct __ecereNameSpace__ecere__sys__BTNode
789 {
790 uintptr_t key;
791 struct __ecereNameSpace__ecere__sys__BTNode * parent;
792 struct __ecereNameSpace__ecere__sys__BTNode * left;
793 struct __ecereNameSpace__ecere__sys__BTNode * right;
794 int depth;
795 } ecere_gcc_struct;
796
797 struct __ecereNameSpace__ecere__sys__BTNode * __ecereProp___ecereNameSpace__ecere__sys__BTNode_Get_next(struct __ecereNameSpace__ecere__sys__BTNode * this);
798
799 struct __ecereNameSpace__ecere__com__Property;
800
801 struct __ecereNameSpace__ecere__com__Property
802 {
803 struct __ecereNameSpace__ecere__com__Property * prev;
804 struct __ecereNameSpace__ecere__com__Property * next;
805 const char *  name;
806 unsigned int isProperty;
807 int memberAccess;
808 int id;
809 struct __ecereNameSpace__ecere__com__Class * _class;
810 const char *  dataTypeString;
811 struct __ecereNameSpace__ecere__com__Class * dataTypeClass;
812 struct Type * dataType;
813 void (*  Set)(void * , int);
814 int (*  Get)(void * );
815 unsigned int (*  IsSet)(void * );
816 void *  data;
817 void *  symbol;
818 int vid;
819 unsigned int conversion;
820 unsigned int watcherOffset;
821 const char *  category;
822 unsigned int compiled;
823 unsigned int selfWatchable;
824 unsigned int isWatchable;
825 } ecere_gcc_struct;
826
827 extern void __ecereNameSpace__ecere__com__eInstance_FireSelfWatchers(struct __ecereNameSpace__ecere__com__Instance * instance, struct __ecereNameSpace__ecere__com__Property * _property);
828
829 extern void __ecereNameSpace__ecere__com__eInstance_StopWatching(struct __ecereNameSpace__ecere__com__Instance * instance, struct __ecereNameSpace__ecere__com__Property * _property, struct __ecereNameSpace__ecere__com__Instance * object);
830
831 extern void __ecereNameSpace__ecere__com__eInstance_Watch(void *  instance, struct __ecereNameSpace__ecere__com__Property * _property, void *  object, void (*  callback)(void * , void * ));
832
833 extern void __ecereNameSpace__ecere__com__eInstance_FireWatchers(struct __ecereNameSpace__ecere__com__Instance * instance, struct __ecereNameSpace__ecere__com__Property * _property);
834
835 struct Identifier;
836
837 extern void FreeIdentifier(struct Identifier * id);
838
839 extern struct Identifier * MkIdentifier(const char *  string);
840
841 extern struct Expression * MkExpIdentifier(struct Identifier * id);
842
843 extern struct Expression * MkExpMember(struct Expression * expression, struct Identifier * member);
844
845 extern struct Identifier * CopyIdentifier(struct Identifier * id);
846
847 extern struct Expression * MkExpPointer(struct Expression * expression, struct Identifier * member);
848
849 struct __ecereNameSpace__ecere__sys__OldLink;
850
851 struct __ecereNameSpace__ecere__sys__OldLink
852 {
853 struct __ecereNameSpace__ecere__sys__OldLink * prev;
854 struct __ecereNameSpace__ecere__sys__OldLink * next;
855 void *  data;
856 } ecere_gcc_struct;
857
858 struct Declaration;
859
860 extern struct External * MkExternalDeclaration(struct Declaration * declaration);
861
862 extern struct Declaration * MkDeclaration(struct __ecereNameSpace__ecere__sys__OldList * specifiers, struct __ecereNameSpace__ecere__sys__OldList * initDeclarators);
863
864 struct Specifier;
865
866 extern struct Declaration * MkStructDeclaration(struct __ecereNameSpace__ecere__sys__OldList * specifiers, struct __ecereNameSpace__ecere__sys__OldList * declarators, struct Specifier * extStorage);
867
868 extern struct Specifier * MkStructOrUnion(int type, struct Identifier * id, struct __ecereNameSpace__ecere__sys__OldList * definitions);
869
870 extern struct Specifier * MkSpecifier(int specifier);
871
872 extern struct Specifier * MkSpecifierName(const char *  name);
873
874 extern struct Specifier * MkSpecifierExtended(struct ExtDecl * extDecl);
875
876 extern void FreeSpecifier(struct Specifier * spec);
877
878 extern struct Specifier * MkEnum(struct Identifier * id, struct __ecereNameSpace__ecere__sys__OldList * list);
879
880 struct Statement
881 {
882 struct Statement * prev;
883 struct Statement * next;
884 struct Location loc;
885 int type;
886 union
887 {
888 struct __ecereNameSpace__ecere__sys__OldList *  expressions;
889 struct
890 {
891 struct Identifier * id;
892 struct Statement * stmt;
893 } ecere_gcc_struct labeled;
894 struct
895 {
896 struct Expression * exp;
897 struct Statement * stmt;
898 } ecere_gcc_struct caseStmt;
899 struct
900 {
901 struct __ecereNameSpace__ecere__sys__OldList * declarations;
902 struct __ecereNameSpace__ecere__sys__OldList * statements;
903 struct Context * context;
904 unsigned int isSwitch;
905 } ecere_gcc_struct compound;
906 struct
907 {
908 struct __ecereNameSpace__ecere__sys__OldList * exp;
909 struct Statement * stmt;
910 struct Statement * elseStmt;
911 } ecere_gcc_struct ifStmt;
912 struct
913 {
914 struct __ecereNameSpace__ecere__sys__OldList * exp;
915 struct Statement * stmt;
916 } ecere_gcc_struct switchStmt;
917 struct
918 {
919 struct __ecereNameSpace__ecere__sys__OldList * exp;
920 struct Statement * stmt;
921 } ecere_gcc_struct whileStmt;
922 struct
923 {
924 struct __ecereNameSpace__ecere__sys__OldList * exp;
925 struct Statement * stmt;
926 } ecere_gcc_struct doWhile;
927 struct
928 {
929 struct Statement * init;
930 struct Statement * check;
931 struct __ecereNameSpace__ecere__sys__OldList * increment;
932 struct Statement * stmt;
933 } ecere_gcc_struct forStmt;
934 struct
935 {
936 struct Identifier * id;
937 } ecere_gcc_struct gotoStmt;
938 struct
939 {
940 struct Specifier * spec;
941 char * statements;
942 struct __ecereNameSpace__ecere__sys__OldList * inputFields;
943 struct __ecereNameSpace__ecere__sys__OldList * outputFields;
944 struct __ecereNameSpace__ecere__sys__OldList * clobberedFields;
945 } ecere_gcc_struct asmStmt;
946 struct
947 {
948 struct Expression * watcher;
949 struct Expression * object;
950 struct __ecereNameSpace__ecere__sys__OldList * watches;
951 } ecere_gcc_struct _watch;
952 struct
953 {
954 struct Identifier * id;
955 struct __ecereNameSpace__ecere__sys__OldList * exp;
956 struct __ecereNameSpace__ecere__sys__OldList * filter;
957 struct Statement * stmt;
958 } ecere_gcc_struct forEachStmt;
959 struct Declaration * decl;
960 } ecere_gcc_struct __anon1;
961 } ecere_gcc_struct;
962
963 extern struct Specifier * CopySpecifier(struct Specifier * spec);
964
965 extern struct Expression * MkExpClassSize(struct Specifier * _class);
966
967 struct Symbol;
968
969 struct Identifier
970 {
971 struct Identifier * prev;
972 struct Identifier * next;
973 struct Location loc;
974 struct Symbol * classSym;
975 struct Specifier * _class;
976 char *  string;
977 struct Identifier * badID;
978 } ecere_gcc_struct;
979
980 extern struct Symbol * FindStruct(struct Context * ctx, const char *  name);
981
982 extern struct Symbol * FindClass(const char *  name);
983
984 extern void DeclareClass(struct External * neededFor, struct Symbol * classSym, const char *  className);
985
986 extern struct Symbol * FindType(struct Context * ctx, const char *  name);
987
988 extern void FreeSymbol(struct Symbol * symbol);
989
990 struct ClassDef;
991
992 extern struct ClassDef * MkClassDefDeclaration(struct Declaration * decl);
993
994 extern void FreeClassDef(struct ClassDef * def);
995
996 struct Declarator;
997
998 extern struct Type * ProcessType(struct __ecereNameSpace__ecere__sys__OldList * specs, struct Declarator * decl);
999
1000 struct TemplateDatatype
1001 {
1002 struct __ecereNameSpace__ecere__sys__OldList *  specifiers;
1003 struct Declarator * decl;
1004 } ecere_gcc_struct;
1005
1006 extern struct Declarator * SpecDeclFromString(const char *  string, struct __ecereNameSpace__ecere__sys__OldList *  specs, struct Declarator * baseDecl);
1007
1008 extern struct Declarator * MkDeclaratorPointer(struct Pointer * pointer, struct Declarator * declarator);
1009
1010 extern struct Declarator * MkDeclaratorIdentifier(struct Identifier * id);
1011
1012 extern struct Declarator * MkStructDeclarator(struct Declarator * declarator, struct Expression * exp);
1013
1014 extern struct Declarator * MkDeclaratorArray(struct Declarator * declarator, struct Expression * exp);
1015
1016 struct Declarator
1017 {
1018 struct Declarator * prev;
1019 struct Declarator * next;
1020 struct Location loc;
1021 int type;
1022 struct Symbol * symbol;
1023 struct Declarator * declarator;
1024 union
1025 {
1026 struct Identifier * identifier;
1027 struct
1028 {
1029 struct Expression * exp;
1030 struct Expression * posExp;
1031 struct Attrib * attrib;
1032 } ecere_gcc_struct structDecl;
1033 struct
1034 {
1035 struct Expression * exp;
1036 struct Specifier * enumClass;
1037 } ecere_gcc_struct array;
1038 struct
1039 {
1040 struct __ecereNameSpace__ecere__sys__OldList * parameters;
1041 } ecere_gcc_struct function;
1042 struct
1043 {
1044 struct Pointer * pointer;
1045 } ecere_gcc_struct pointer;
1046 struct
1047 {
1048 struct ExtDecl * extended;
1049 } ecere_gcc_struct extended;
1050 } ecere_gcc_struct __anon1;
1051 } ecere_gcc_struct;
1052
1053 extern struct Identifier * GetDeclId(struct Declarator * decl);
1054
1055 extern struct Declarator * MkDeclaratorBrackets(struct Declarator * declarator);
1056
1057 extern struct Declarator * PlugDeclarator(struct Declarator * decl, struct Declarator * baseDecl);
1058
1059 extern struct Declarator * MkDeclaratorFunction(struct Declarator * declarator, struct __ecereNameSpace__ecere__sys__OldList * parameters);
1060
1061 extern void FreeDeclarator(struct Declarator * decl);
1062
1063 extern struct Declarator * GetFuncDecl(struct Declarator * decl);
1064
1065 extern struct Expression * MkExpClass(struct __ecereNameSpace__ecere__sys__OldList *  specifiers, struct Declarator * decl);
1066
1067 extern struct Declarator * CopyDeclarator(struct Declarator * declarator);
1068
1069 struct FunctionDefinition
1070 {
1071 struct FunctionDefinition * prev;
1072 struct FunctionDefinition * next;
1073 struct Location loc;
1074 struct __ecereNameSpace__ecere__sys__OldList *  specifiers;
1075 struct Declarator * declarator;
1076 struct __ecereNameSpace__ecere__sys__OldList *  declarations;
1077 struct Statement * body;
1078 struct __ecereNameSpace__ecere__com__Class * _class;
1079 struct __ecereNameSpace__ecere__sys__OldList attached;
1080 int declMode;
1081 struct Type * type;
1082 struct Symbol * propSet;
1083 int tempCount;
1084 unsigned int propertyNoThis;
1085 } ecere_gcc_struct;
1086
1087 extern struct Declarator * QMkPtrDecl(const char *  id);
1088
1089 struct ClassFunction;
1090
1091 struct ClassFunction
1092 {
1093 struct ClassFunction * prev;
1094 struct ClassFunction * next;
1095 struct Location loc;
1096 struct __ecereNameSpace__ecere__sys__OldList *  specifiers;
1097 struct Declarator * declarator;
1098 struct __ecereNameSpace__ecere__sys__OldList *  declarations;
1099 struct Statement * body;
1100 struct __ecereNameSpace__ecere__com__Class * _class;
1101 struct __ecereNameSpace__ecere__sys__OldList attached;
1102 int declMode;
1103 struct Type * type;
1104 struct Symbol * propSet;
1105 unsigned int isVirtual;
1106 unsigned int isConstructor;
1107 unsigned int isDestructor;
1108 unsigned int dontMangle;
1109 int id;
1110 int idCode;
1111 } ecere_gcc_struct;
1112
1113 extern struct External * ProcessClassFunction(struct __ecereNameSpace__ecere__com__Class * owningClass, struct ClassFunction * func, struct __ecereNameSpace__ecere__sys__OldList * defs, struct External * after, unsigned int makeStatic);
1114
1115 extern void FreeClassFunction(struct ClassFunction * func);
1116
1117 extern struct ClassFunction * MkClassFunction(struct __ecereNameSpace__ecere__sys__OldList * specifiers, struct Specifier * _class, struct Declarator * decl, struct __ecereNameSpace__ecere__sys__OldList * declList);
1118
1119 extern void ProcessClassFunctionBody(struct ClassFunction * func, struct Statement * body);
1120
1121 struct TypeName;
1122
1123 extern struct Expression * MkExpCast(struct TypeName * typeName, struct Expression * expression);
1124
1125 extern struct TypeName * MkTypeName(struct __ecereNameSpace__ecere__sys__OldList * qualifiers, struct Declarator * declarator);
1126
1127 struct TypeName
1128 {
1129 struct TypeName * prev;
1130 struct TypeName * next;
1131 struct Location loc;
1132 struct __ecereNameSpace__ecere__sys__OldList *  qualifiers;
1133 struct Declarator * declarator;
1134 int classObjectType;
1135 struct Expression * bitCount;
1136 } ecere_gcc_struct;
1137
1138 extern void FreeTypeName(struct TypeName * typeName);
1139
1140 extern struct TypeName * QMkClass(const char *  spec, struct Declarator * decl);
1141
1142 extern struct Expression * MkExpTypeSize(struct TypeName * typeName);
1143
1144 extern unsigned int IsVoidPtrCast(struct TypeName * typeName);
1145
1146 extern struct TypeName * QMkType(const char *  spec, struct Declarator * decl);
1147
1148 struct __ecereNameSpace__ecere__com__BTNamedLink;
1149
1150 struct __ecereNameSpace__ecere__com__BTNamedLink
1151 {
1152 const char *  name;
1153 struct __ecereNameSpace__ecere__com__BTNamedLink * parent;
1154 struct __ecereNameSpace__ecere__com__BTNamedLink * left;
1155 struct __ecereNameSpace__ecere__com__BTNamedLink * right;
1156 int depth;
1157 void *  data;
1158 } ecere_gcc_struct;
1159
1160 struct __ecereNameSpace__ecere__sys__NamedLink64;
1161
1162 struct __ecereNameSpace__ecere__sys__NamedLink64
1163 {
1164 struct __ecereNameSpace__ecere__sys__NamedLink64 * prev;
1165 struct __ecereNameSpace__ecere__sys__NamedLink64 * next;
1166 char *  name;
1167 long long data;
1168 } ecere_gcc_struct;
1169
1170 struct Instantiation;
1171
1172 struct Declaration
1173 {
1174 struct Declaration * prev;
1175 struct Declaration * next;
1176 struct Location loc;
1177 int type;
1178 union
1179 {
1180 struct
1181 {
1182 struct __ecereNameSpace__ecere__sys__OldList *  specifiers;
1183 struct __ecereNameSpace__ecere__sys__OldList *  declarators;
1184 } ecere_gcc_struct __anon1;
1185 struct Instantiation * inst;
1186 struct
1187 {
1188 struct Identifier * id;
1189 struct Expression * exp;
1190 } ecere_gcc_struct __anon2;
1191 } ecere_gcc_struct __anon1;
1192 struct Specifier * extStorage;
1193 struct Symbol * symbol;
1194 int declMode;
1195 } ecere_gcc_struct;
1196
1197 struct Instantiation
1198 {
1199 struct Instantiation * prev;
1200 struct Instantiation * next;
1201 struct Location loc;
1202 struct Specifier * _class;
1203 struct Expression * exp;
1204 struct __ecereNameSpace__ecere__sys__OldList *  members;
1205 struct Symbol * symbol;
1206 unsigned int fullSet;
1207 unsigned int isConstant;
1208 unsigned char *  data;
1209 struct Location nameLoc;
1210 struct Location insideLoc;
1211 unsigned int built;
1212 } ecere_gcc_struct;
1213
1214 extern void FreeInstance(struct Instantiation * inst);
1215
1216 extern struct Declaration * MkDeclarationInst(struct Instantiation * inst);
1217
1218 extern struct Instantiation * MkInstantiationNamed(struct __ecereNameSpace__ecere__sys__OldList * specs, struct Expression * exp, struct __ecereNameSpace__ecere__sys__OldList * members);
1219
1220 struct InitDeclarator;
1221
1222 extern void FreeInitDeclarator(struct InitDeclarator * decl);
1223
1224 struct PropertyWatch;
1225
1226 struct PropertyWatch
1227 {
1228 struct PropertyWatch * prev;
1229 struct PropertyWatch * next;
1230 struct Location loc;
1231 struct Statement * compound;
1232 struct __ecereNameSpace__ecere__sys__OldList *  properties;
1233 unsigned int deleteWatch;
1234 } ecere_gcc_struct;
1235
1236 extern void FreePropertyWatch(struct PropertyWatch * watcher);
1237
1238 struct PropertyImport;
1239
1240 struct PropertyImport
1241 {
1242 struct PropertyImport * prev;
1243 struct PropertyImport * next;
1244 char *  name;
1245 unsigned int isVirtual;
1246 unsigned int hasSet;
1247 unsigned int hasGet;
1248 } ecere_gcc_struct;
1249
1250 struct MethodImport;
1251
1252 struct MethodImport
1253 {
1254 struct MethodImport * prev;
1255 struct MethodImport * next;
1256 char *  name;
1257 unsigned int isVirtual;
1258 } ecere_gcc_struct;
1259
1260 struct FunctionImport;
1261
1262 struct FunctionImport
1263 {
1264 struct FunctionImport * prev;
1265 struct FunctionImport * next;
1266 char *  name;
1267 } ecere_gcc_struct;
1268
1269 struct ClassImport;
1270
1271 struct ClassImport
1272 {
1273 struct ClassImport * prev;
1274 struct ClassImport * next;
1275 char *  name;
1276 struct __ecereNameSpace__ecere__sys__OldList methods;
1277 struct __ecereNameSpace__ecere__sys__OldList properties;
1278 unsigned int itself;
1279 int isRemote;
1280 } ecere_gcc_struct;
1281
1282 struct Initializer;
1283
1284 struct Expression
1285 {
1286 struct Expression * prev;
1287 struct Expression * next;
1288 struct Location loc;
1289 int type;
1290 union
1291 {
1292 struct
1293 {
1294 char *  constant;
1295 struct Identifier * identifier;
1296 } ecere_gcc_struct __anon1;
1297 struct Statement * compound;
1298 struct Instantiation * instance;
1299 struct
1300 {
1301 char *  string;
1302 unsigned int intlString;
1303 unsigned int wideString;
1304 } ecere_gcc_struct __anon2;
1305 struct __ecereNameSpace__ecere__sys__OldList *  list;
1306 struct
1307 {
1308 struct __ecereNameSpace__ecere__sys__OldList * specifiers;
1309 struct Declarator * decl;
1310 } ecere_gcc_struct _classExp;
1311 struct
1312 {
1313 struct Identifier * id;
1314 } ecere_gcc_struct classData;
1315 struct
1316 {
1317 struct Expression * exp;
1318 struct __ecereNameSpace__ecere__sys__OldList * arguments;
1319 struct Location argLoc;
1320 } ecere_gcc_struct call;
1321 struct
1322 {
1323 struct Expression * exp;
1324 struct __ecereNameSpace__ecere__sys__OldList * index;
1325 } ecere_gcc_struct index;
1326 struct
1327 {
1328 struct Expression * exp;
1329 struct Identifier * member;
1330 int memberType;
1331 unsigned int thisPtr;
1332 } ecere_gcc_struct member;
1333 struct
1334 {
1335 int op;
1336 struct Expression * exp1;
1337 struct Expression * exp2;
1338 } ecere_gcc_struct op;
1339 struct TypeName * typeName;
1340 struct Specifier * _class;
1341 struct
1342 {
1343 struct TypeName * typeName;
1344 struct Expression * exp;
1345 } ecere_gcc_struct cast;
1346 struct
1347 {
1348 struct Expression * cond;
1349 struct __ecereNameSpace__ecere__sys__OldList * exp;
1350 struct Expression * elseExp;
1351 } ecere_gcc_struct cond;
1352 struct
1353 {
1354 struct TypeName * typeName;
1355 struct Expression * size;
1356 } ecere_gcc_struct _new;
1357 struct
1358 {
1359 struct TypeName * typeName;
1360 struct Expression * size;
1361 struct Expression * exp;
1362 } ecere_gcc_struct _renew;
1363 struct
1364 {
1365 char * table;
1366 struct Identifier * id;
1367 } ecere_gcc_struct db;
1368 struct
1369 {
1370 struct Expression * ds;
1371 struct Expression * name;
1372 } ecere_gcc_struct dbopen;
1373 struct
1374 {
1375 struct TypeName * typeName;
1376 struct Initializer * initializer;
1377 } ecere_gcc_struct initializer;
1378 struct
1379 {
1380 struct Expression * exp;
1381 struct TypeName * typeName;
1382 } ecere_gcc_struct vaArg;
1383 struct
1384 {
1385 struct TypeName * typeName;
1386 struct Identifier * id;
1387 } ecere_gcc_struct offset;
1388 } ecere_gcc_struct __anon1;
1389 unsigned int debugValue;
1390 struct __ecereNameSpace__ecere__com__DataValue val;
1391 uint64 address;
1392 unsigned int hasAddress;
1393 struct Type * expType;
1394 struct Type * destType;
1395 unsigned int usage;
1396 int tempCount;
1397 unsigned int byReference;
1398 unsigned int isConstant;
1399 unsigned int addedThis;
1400 unsigned int needCast;
1401 unsigned int thisPtr;
1402 unsigned int opDestType;
1403 unsigned int usedInComparison;
1404 unsigned int ambiguousUnits;
1405 unsigned int parentOpDestType;
1406 unsigned int needTemplateCast;
1407 } ecere_gcc_struct;
1408
1409 extern struct InitDeclarator * MkInitDeclarator(struct Declarator * declarator, struct Initializer * initializer);
1410
1411 struct Initializer
1412 {
1413 struct Initializer * prev;
1414 struct Initializer * next;
1415 struct Location loc;
1416 int type;
1417 union
1418 {
1419 struct Expression * exp;
1420 struct __ecereNameSpace__ecere__sys__OldList *  list;
1421 } ecere_gcc_struct __anon1;
1422 unsigned int isConstant;
1423 struct Identifier * id;
1424 } ecere_gcc_struct;
1425
1426 extern struct Initializer * MkInitializerAssignment(struct Expression * exp);
1427
1428 extern struct Expression * MkExpExtensionInitializer(struct TypeName * typeName, struct Initializer * initializer);
1429
1430 extern struct Initializer * MkInitializerList(struct __ecereNameSpace__ecere__sys__OldList * list);
1431
1432 struct InitDeclarator
1433 {
1434 struct InitDeclarator * prev;
1435 struct InitDeclarator * next;
1436 struct Location loc;
1437 struct Declarator * declarator;
1438 struct Initializer * initializer;
1439 } ecere_gcc_struct;
1440
1441 void ApplyLocation(struct Expression * exp, struct Location * loc)
1442 {
1443 exp->loc = *loc;
1444 switch(exp->type)
1445 {
1446 case 4:
1447 if(exp->__anon1.op.exp1)
1448 ApplyLocation(exp->__anon1.op.exp1, loc);
1449 if(exp->__anon1.op.exp2)
1450 ApplyLocation(exp->__anon1.op.exp2, loc);
1451 break;
1452 case 5:
1453 if(exp->__anon1.list)
1454 {
1455 struct Expression * e;
1456
1457 for(e = (*exp->__anon1.list).first; e; e = e->next)
1458 ApplyLocation(e, loc);
1459 }
1460 break;
1461 case 6:
1462 if(exp->__anon1.index.index)
1463 {
1464 struct Expression * e;
1465
1466 for(e = (*exp->__anon1.index.index).first; e; e = e->next)
1467 ApplyLocation(e, loc);
1468 }
1469 if(exp->__anon1.index.exp)
1470 ApplyLocation(exp->__anon1.index.exp, loc);
1471 break;
1472 case 7:
1473 if(exp->__anon1.call.arguments)
1474 {
1475 struct Expression * arg;
1476
1477 for(arg = (*exp->__anon1.call.arguments).first; arg; arg = arg->next)
1478 ApplyLocation(arg, loc);
1479 }
1480 if(exp->__anon1.call.exp)
1481 ApplyLocation(exp->__anon1.call.exp, loc);
1482 break;
1483 case 8:
1484 case 9:
1485 if(exp->__anon1.member.exp)
1486 ApplyLocation(exp->__anon1.member.exp, loc);
1487 break;
1488 case 11:
1489 if(exp->__anon1.cast.exp)
1490 ApplyLocation(exp->__anon1.cast.exp, loc);
1491 break;
1492 case 12:
1493 if(exp->__anon1.cond.exp)
1494 {
1495 struct Expression * e;
1496
1497 for(e = (*exp->__anon1.cond.exp).first; e; e = e->next)
1498 ApplyLocation(e, loc);
1499 }
1500 if(exp->__anon1.cond.cond)
1501 ApplyLocation(exp->__anon1.cond.cond, loc);
1502 if(exp->__anon1.cond.elseExp)
1503 ApplyLocation(exp->__anon1.cond.elseExp, loc);
1504 break;
1505 case 34:
1506 if(exp->__anon1.vaArg.exp)
1507 ApplyLocation(exp->__anon1.vaArg.exp, loc);
1508 break;
1509 default:
1510 break;
1511 }
1512 }
1513
1514 void __ecereMethod_Expression_Clear();
1515
1516 struct MembersInit;
1517
1518 struct MembersInit
1519 {
1520 struct MembersInit * prev;
1521 struct MembersInit * next;
1522 struct Location loc;
1523 int type;
1524 union
1525 {
1526 struct __ecereNameSpace__ecere__sys__OldList *  dataMembers;
1527 struct ClassFunction * function;
1528 } ecere_gcc_struct __anon1;
1529 } ecere_gcc_struct;
1530
1531 extern struct MembersInit * MkMembersInitList(struct __ecereNameSpace__ecere__sys__OldList * dataMembers);
1532
1533 struct Operand;
1534
1535 struct OpTable
1536 {
1537 unsigned int (*  Add)(struct Expression *, struct Operand *, struct Operand *);
1538 unsigned int (*  Sub)(struct Expression *, struct Operand *, struct Operand *);
1539 unsigned int (*  Mul)(struct Expression *, struct Operand *, struct Operand *);
1540 unsigned int (*  Div)(struct Expression *, struct Operand *, struct Operand *);
1541 unsigned int (*  Mod)(struct Expression *, struct Operand *, struct Operand *);
1542 unsigned int (*  Neg)(struct Expression *, struct Operand *);
1543 unsigned int (*  Inc)(struct Expression *, struct Operand *);
1544 unsigned int (*  Dec)(struct Expression *, struct Operand *);
1545 unsigned int (*  Asign)(struct Expression *, struct Operand *, struct Operand *);
1546 unsigned int (*  AddAsign)(struct Expression *, struct Operand *, struct Operand *);
1547 unsigned int (*  SubAsign)(struct Expression *, struct Operand *, struct Operand *);
1548 unsigned int (*  MulAsign)(struct Expression *, struct Operand *, struct Operand *);
1549 unsigned int (*  DivAsign)(struct Expression *, struct Operand *, struct Operand *);
1550 unsigned int (*  ModAsign)(struct Expression *, struct Operand *, struct Operand *);
1551 unsigned int (*  BitAnd)(struct Expression *, struct Operand *, struct Operand *);
1552 unsigned int (*  BitOr)(struct Expression *, struct Operand *, struct Operand *);
1553 unsigned int (*  BitXor)(struct Expression *, struct Operand *, struct Operand *);
1554 unsigned int (*  LShift)(struct Expression *, struct Operand *, struct Operand *);
1555 unsigned int (*  RShift)(struct Expression *, struct Operand *, struct Operand *);
1556 unsigned int (*  BitNot)(struct Expression *, struct Operand *);
1557 unsigned int (*  AndAsign)(struct Expression *, struct Operand *, struct Operand *);
1558 unsigned int (*  OrAsign)(struct Expression *, struct Operand *, struct Operand *);
1559 unsigned int (*  XorAsign)(struct Expression *, struct Operand *, struct Operand *);
1560 unsigned int (*  LShiftAsign)(struct Expression *, struct Operand *, struct Operand *);
1561 unsigned int (*  RShiftAsign)(struct Expression *, struct Operand *, struct Operand *);
1562 unsigned int (*  Not)(struct Expression *, struct Operand *);
1563 unsigned int (*  Equ)(struct Expression *, struct Operand *, struct Operand *);
1564 unsigned int (*  Nqu)(struct Expression *, struct Operand *, struct Operand *);
1565 unsigned int (*  And)(struct Expression *, struct Operand *, struct Operand *);
1566 unsigned int (*  Or)(struct Expression *, struct Operand *, struct Operand *);
1567 unsigned int (*  Grt)(struct Expression *, struct Operand *, struct Operand *);
1568 unsigned int (*  Sma)(struct Expression *, struct Operand *, struct Operand *);
1569 unsigned int (*  GrtEqu)(struct Expression *, struct Operand *, struct Operand *);
1570 unsigned int (*  SmaEqu)(struct Expression *, struct Operand *, struct Operand *);
1571 unsigned int (*  Cond)(struct Expression *, struct Operand *, struct Operand *, struct Operand *);
1572 } ecere_gcc_struct;
1573
1574 struct Operand
1575 {
1576 int kind;
1577 struct Type * type;
1578 unsigned int ptrSize;
1579 union
1580 {
1581 char c;
1582 unsigned char uc;
1583 short s;
1584 unsigned short us;
1585 int i;
1586 unsigned int ui;
1587 float f;
1588 double d;
1589 long long i64;
1590 uint64 ui64;
1591 } ecere_gcc_struct __anon1;
1592 struct OpTable ops;
1593 } ecere_gcc_struct;
1594
1595 struct External *  _DeclareStruct(struct External *  neededBy, const char *  name, unsigned int skipNoHead, unsigned int needDereference, unsigned int fwdDecl);
1596
1597 struct External * DeclareStruct(struct External * neededBy, const char * name, unsigned int skipNoHead, unsigned int needDereference)
1598 {
1599 return _DeclareStruct(neededBy, name, skipNoHead, needDereference, 0);
1600 }
1601
1602 static void _DeclareType(struct External *  neededFor, struct Type *  type, unsigned int needDereference, unsigned int forFunctionDef, unsigned int fwdDecl);
1603
1604 void DeclareType(struct External * neededFor, struct Type * type, unsigned int needDereference, unsigned int forFunctionDef)
1605 {
1606 _DeclareType(neededFor, type, needDereference, forFunctionDef, 0);
1607 }
1608
1609 void DeclareTypeForwardDeclare(struct External * neededFor, struct Type * type, unsigned int needDereference, unsigned int forFunctionDef)
1610 {
1611 _DeclareType(neededFor, type, needDereference, forFunctionDef, 1);
1612 }
1613
1614 static void _PrintType(struct Type *  type, char *  string, unsigned int printName, unsigned int fullName, unsigned int printConst);
1615
1616 void PrintType(struct Type * type, char * string, unsigned int printName, unsigned int fullName)
1617 {
1618 _PrintType(type, string, printName, fullName, 1);
1619 }
1620
1621 void PrintTypeNoConst(struct Type * type, char * string, unsigned int printName, unsigned int fullName)
1622 {
1623 _PrintType(type, string, printName, fullName, 0);
1624 }
1625
1626 struct __ecereNameSpace__ecere__com__Method;
1627
1628 struct __ecereNameSpace__ecere__com__Method
1629 {
1630 const char *  name;
1631 struct __ecereNameSpace__ecere__com__Method * parent;
1632 struct __ecereNameSpace__ecere__com__Method * left;
1633 struct __ecereNameSpace__ecere__com__Method * right;
1634 int depth;
1635 int (*  function)();
1636 int vid;
1637 int type;
1638 struct __ecereNameSpace__ecere__com__Class * _class;
1639 void *  symbol;
1640 const char *  dataTypeString;
1641 struct Type * dataType;
1642 int memberAccess;
1643 } ecere_gcc_struct;
1644
1645 struct Symbol
1646 {
1647 char *  string;
1648 struct Symbol * parent;
1649 struct Symbol * left;
1650 struct Symbol * right;
1651 int depth;
1652 struct Type * type;
1653 union
1654 {
1655 struct __ecereNameSpace__ecere__com__Method * method;
1656 struct __ecereNameSpace__ecere__com__Property * _property;
1657 struct __ecereNameSpace__ecere__com__Class * registered;
1658 } ecere_gcc_struct __anon1;
1659 unsigned int notYetDeclared;
1660 union
1661 {
1662 struct
1663 {
1664 struct External * pointerExternal;
1665 struct External * structExternal;
1666 } ecere_gcc_struct __anon1;
1667 struct
1668 {
1669 struct External * externalGet;
1670 struct External * externalSet;
1671 struct External * externalPtr;
1672 struct External * externalIsSet;
1673 } ecere_gcc_struct __anon2;
1674 struct
1675 {
1676 struct External * methodExternal;
1677 struct External * methodCodeExternal;
1678 } ecere_gcc_struct __anon3;
1679 } ecere_gcc_struct __anon2;
1680 unsigned int imported;
1681 unsigned int declaredStructSym;
1682 struct __ecereNameSpace__ecere__com__Class * _class;
1683 unsigned int declaredStruct;
1684 unsigned int needConstructor;
1685 unsigned int needDestructor;
1686 char *  constructorName;
1687 char *  structName;
1688 char *  className;
1689 char *  destructorName;
1690 struct ModuleImport * module;
1691 struct ClassImport * _import;
1692 struct Location nameLoc;
1693 unsigned int isParam;
1694 unsigned int isRemote;
1695 unsigned int isStruct;
1696 unsigned int fireWatchersDone;
1697 int declaring;
1698 unsigned int classData;
1699 unsigned int isStatic;
1700 char *  shortName;
1701 struct __ecereNameSpace__ecere__sys__OldList *  templateParams;
1702 struct __ecereNameSpace__ecere__sys__OldList templatedClasses;
1703 struct Context * ctx;
1704 int isIterator;
1705 struct Expression * propCategory;
1706 unsigned int mustRegister;
1707 } ecere_gcc_struct;
1708
1709 struct __ecereNameSpace__ecere__com__ClassProperty;
1710
1711 extern struct __ecereNameSpace__ecere__com__ClassProperty * __ecereNameSpace__ecere__com__eClass_FindClassProperty(struct __ecereNameSpace__ecere__com__Class * _class, const char *  name);
1712
1713 struct __ecereNameSpace__ecere__com__ClassProperty
1714 {
1715 const char *  name;
1716 struct __ecereNameSpace__ecere__com__ClassProperty * parent;
1717 struct __ecereNameSpace__ecere__com__ClassProperty * left;
1718 struct __ecereNameSpace__ecere__com__ClassProperty * right;
1719 int depth;
1720 void (*  Set)(struct __ecereNameSpace__ecere__com__Class *, long long);
1721 long long (*  Get)(struct __ecereNameSpace__ecere__com__Class *);
1722 const char *  dataTypeString;
1723 struct Type * dataType;
1724 unsigned int constant;
1725 } ecere_gcc_struct;
1726
1727 struct __ecereNameSpace__ecere__com__BitMember;
1728
1729 struct __ecereNameSpace__ecere__com__BitMember
1730 {
1731 struct __ecereNameSpace__ecere__com__BitMember * prev;
1732 struct __ecereNameSpace__ecere__com__BitMember * next;
1733 const char *  name;
1734 unsigned int isProperty;
1735 int memberAccess;
1736 int id;
1737 struct __ecereNameSpace__ecere__com__Class * _class;
1738 const char *  dataTypeString;
1739 struct __ecereNameSpace__ecere__com__Class * dataTypeClass;
1740 struct Type * dataType;
1741 int type;
1742 int size;
1743 int pos;
1744 uint64 mask;
1745 } ecere_gcc_struct;
1746
1747 struct __ecereNameSpace__ecere__com__DataMember;
1748
1749 struct __ecereNameSpace__ecere__com__ClassTemplateArgument
1750 {
1751 union
1752 {
1753 struct
1754 {
1755 const char *  dataTypeString;
1756 struct __ecereNameSpace__ecere__com__Class * dataTypeClass;
1757 } ecere_gcc_struct __anon1;
1758 struct __ecereNameSpace__ecere__com__DataValue expression;
1759 struct
1760 {
1761 const char *  memberString;
1762 union
1763 {
1764 struct __ecereNameSpace__ecere__com__DataMember * member;
1765 struct __ecereNameSpace__ecere__com__Property * prop;
1766 struct __ecereNameSpace__ecere__com__Method * method;
1767 } ecere_gcc_struct __anon1;
1768 } ecere_gcc_struct __anon2;
1769 } ecere_gcc_struct __anon1;
1770 } ecere_gcc_struct;
1771
1772 extern void __ecereNameSpace__ecere__com__eClass_FindNextMember(struct __ecereNameSpace__ecere__com__Class * _class, struct __ecereNameSpace__ecere__com__Class **  curClass, struct __ecereNameSpace__ecere__com__DataMember **  curMember, struct __ecereNameSpace__ecere__com__DataMember **  subMemberStack, int *  subMemberStackPos);
1773
1774 extern struct __ecereNameSpace__ecere__com__DataMember * __ecereNameSpace__ecere__com__eClass_AddDataMember(struct __ecereNameSpace__ecere__com__Class * _class, const char *  name, const char *  type, unsigned int size, unsigned int alignment, int declMode);
1775
1776 struct TemplateParameter;
1777
1778 struct TemplateParameter
1779 {
1780 struct TemplateParameter * prev;
1781 struct TemplateParameter * next;
1782 struct Location loc;
1783 int type;
1784 struct Identifier * identifier;
1785 union
1786 {
1787 struct TemplateDatatype * dataType;
1788 int memberType;
1789 } ecere_gcc_struct __anon1;
1790 struct TemplateArgument * defaultArgument;
1791 const char *  dataTypeString;
1792 struct Type * baseType;
1793 } ecere_gcc_struct;
1794
1795 struct Type
1796 {
1797 struct Type * prev;
1798 struct Type * next;
1799 int refCount;
1800 union
1801 {
1802 struct Symbol * _class;
1803 struct
1804 {
1805 struct __ecereNameSpace__ecere__sys__OldList members;
1806 char *  enumName;
1807 } ecere_gcc_struct __anon1;
1808 struct
1809 {
1810 struct Type * returnType;
1811 struct __ecereNameSpace__ecere__sys__OldList params;
1812 struct Symbol * thisClass;
1813 unsigned int staticMethod;
1814 struct TemplateParameter * thisClassTemplate;
1815 } ecere_gcc_struct __anon2;
1816 struct
1817 {
1818 struct __ecereNameSpace__ecere__com__Method * method;
1819 struct __ecereNameSpace__ecere__com__Class * methodClass;
1820 struct __ecereNameSpace__ecere__com__Class * usedClass;
1821 } ecere_gcc_struct __anon3;
1822 struct
1823 {
1824 struct Type * arrayType;
1825 int arraySize;
1826 struct Expression * arraySizeExp;
1827 unsigned int freeExp;
1828 struct Symbol * enumClass;
1829 } ecere_gcc_struct __anon4;
1830 struct Type * type;
1831 struct TemplateParameter * templateParameter;
1832 } ecere_gcc_struct __anon1;
1833 int kind;
1834 unsigned int size;
1835 char *  name;
1836 char *  typeName;
1837 struct __ecereNameSpace__ecere__com__Class * thisClassFrom;
1838 int promotedFrom;
1839 int classObjectType;
1840 int alignment;
1841 unsigned int offset;
1842 int bitFieldCount;
1843 int count;
1844 int bitMemberSize;
1845 unsigned int isSigned : 1;
1846 unsigned int constant : 1;
1847 unsigned int truth : 1;
1848 unsigned int byReference : 1;
1849 unsigned int extraParam : 1;
1850 unsigned int directClassAccess : 1;
1851 unsigned int computing : 1;
1852 unsigned int keepCast : 1;
1853 unsigned int passAsTemplate : 1;
1854 unsigned int dllExport : 1;
1855 unsigned int attrStdcall : 1;
1856 unsigned int declaredWithStruct : 1;
1857 unsigned int typedByReference : 1;
1858 unsigned int casted : 1;
1859 unsigned int pointerAlignment : 1;
1860 unsigned int isLong : 1;
1861 unsigned int signedBeforePromotion : 1;
1862 } ecere_gcc_struct;
1863
1864 struct Specifier
1865 {
1866 struct Specifier * prev;
1867 struct Specifier * next;
1868 struct Location loc;
1869 int type;
1870 union
1871 {
1872 int specifier;
1873 struct
1874 {
1875 struct ExtDecl * extDecl;
1876 char *  name;
1877 struct Symbol * symbol;
1878 struct __ecereNameSpace__ecere__sys__OldList *  templateArgs;
1879 struct Specifier * nsSpec;
1880 } ecere_gcc_struct __anon1;
1881 struct
1882 {
1883 struct Identifier * id;
1884 struct __ecereNameSpace__ecere__sys__OldList *  list;
1885 struct __ecereNameSpace__ecere__sys__OldList *  baseSpecs;
1886 struct __ecereNameSpace__ecere__sys__OldList *  definitions;
1887 unsigned int addNameSpace;
1888 struct Context * ctx;
1889 struct ExtDecl * extDeclStruct;
1890 } ecere_gcc_struct __anon2;
1891 struct Expression * expression;
1892 struct Specifier * _class;
1893 struct TemplateParameter * templateParameter;
1894 } ecere_gcc_struct __anon1;
1895 } ecere_gcc_struct;
1896
1897 extern struct Expression * GetTemplateArgExp(struct TemplateParameter * param, struct __ecereNameSpace__ecere__com__Class * curClass, unsigned int pointer);
1898
1899 struct TemplatedType
1900 {
1901 uintptr_t key;
1902 struct __ecereNameSpace__ecere__sys__BTNode * parent;
1903 struct __ecereNameSpace__ecere__sys__BTNode * left;
1904 struct __ecereNameSpace__ecere__sys__BTNode * right;
1905 int depth;
1906 struct TemplateParameter * param;
1907 } ecere_gcc_struct;
1908
1909 struct Type * ProcessTemplateParameterType(struct TemplateParameter * param)
1910 {
1911 if(param && param->type == 0 && (param->__anon1.dataType || param->dataTypeString))
1912 {
1913 if(!param->baseType)
1914 {
1915 if(param->dataTypeString)
1916 param->baseType = ProcessTypeString(param->dataTypeString, 0);
1917 else
1918 param->baseType = ProcessType(param->__anon1.dataType->specifiers, param->__anon1.dataType->decl);
1919 }
1920 return param->baseType;
1921 }
1922 return (((void *)0));
1923 }
1924
1925 unsigned int NeedCast(struct Type * type1, struct Type * type2)
1926 {
1927 if(!type1 || !type2 || type1->keepCast || type2->keepCast)
1928 return 1;
1929 if(type1->kind == 20 && type2->kind == 4 && type2->passAsTemplate == 0)
1930 {
1931 return 0;
1932 }
1933 if(type1->kind == type2->kind && type1->isLong == type2->isLong)
1934 {
1935 switch(type1->kind)
1936 {
1937 case 24:
1938 case 1:
1939 case 2:
1940 case 3:
1941 case 4:
1942 case 22:
1943 case 23:
1944 if(type1->passAsTemplate && !type2->passAsTemplate)
1945 return 1;
1946 return type1->isSigned != type2->isSigned;
1947 case 8:
1948 return type1->__anon1._class != type2->__anon1._class;
1949 case 13:
1950 return (type1->__anon1.type && type2->__anon1.type && type1->__anon1.type->constant != type2->__anon1.type->constant) || NeedCast(type1->__anon1.type, type2->__anon1.type);
1951 default:
1952 return 1;
1953 }
1954 }
1955 return 1;
1956 }
1957
1958 unsigned int GetOpInt(struct Operand * op2, int * value2)
1959 {
1960 if(op2->kind == 3 && op2->type->isSigned)
1961 *value2 = op2->__anon1.i;
1962 else if(op2->kind == 3)
1963 *value2 = (int)op2->__anon1.ui;
1964 else if(op2->kind == 4 && op2->type->isSigned)
1965 *value2 = (int)op2->__anon1.i64;
1966 else if(op2->kind == 4)
1967 *value2 = (int)op2->__anon1.ui64;
1968 else if(op2->kind == 23 && op2->type->isSigned)
1969 *value2 = (int)op2->__anon1.i64;
1970 else if(op2->kind == 23)
1971 *value2 = (int)op2->__anon1.ui64;
1972 else if(op2->kind == 22 && op2->type->isSigned)
1973 *value2 = (int)op2->__anon1.i64;
1974 else if(op2->kind == 22)
1975 *value2 = (int)op2->__anon1.ui64;
1976 else if(op2->kind == 2 && op2->type->isSigned)
1977 *value2 = (int)op2->__anon1.s;
1978 else if(op2->kind == 2)
1979 *value2 = (int)op2->__anon1.us;
1980 else if(op2->kind == 1 && op2->type->isSigned)
1981 *value2 = (int)op2->__anon1.c;
1982 else if(op2->kind == 24 || op2->kind == 1)
1983 *value2 = (int)op2->__anon1.uc;
1984 else if(op2->kind == 6)
1985 *value2 = (int)op2->__anon1.f;
1986 else if(op2->kind == 7)
1987 *value2 = (int)op2->__anon1.d;
1988 else if(op2->kind == 13)
1989 *value2 = (int)op2->__anon1.ui64;
1990 else
1991 return 0;
1992 return 1;
1993 }
1994
1995 unsigned int GetOpUInt(struct Operand * op2, unsigned int * value2)
1996 {
1997 if(op2->kind == 3 && op2->type->isSigned)
1998 *value2 = (unsigned int)op2->__anon1.i;
1999 else if(op2->kind == 3)
2000 *value2 = op2->__anon1.ui;
2001 else if(op2->kind == 4 && op2->type->isSigned)
2002 *value2 = (unsigned int)op2->__anon1.i64;
2003 else if(op2->kind == 4)
2004 *value2 = (unsigned int)op2->__anon1.ui64;
2005 else if(op2->kind == 23 && op2->type->isSigned)
2006 *value2 = (unsigned int)op2->__anon1.i64;
2007 else if(op2->kind == 23)
2008 *value2 = (unsigned int)op2->__anon1.ui64;
2009 else if(op2->kind == 22 && op2->type->isSigned)
2010 *value2 = (unsigned int)op2->__anon1.i64;
2011 else if(op2->kind == 22)
2012 *value2 = (unsigned int)op2->__anon1.ui64;
2013 else if(op2->kind == 2 && op2->type->isSigned)
2014 *value2 = (unsigned int)op2->__anon1.s;
2015 else if(op2->kind == 2)
2016 *value2 = (unsigned int)op2->__anon1.us;
2017 else if(op2->kind == 1 && op2->type->isSigned)
2018 *value2 = (unsigned int)op2->__anon1.c;
2019 else if(op2->kind == 24 || op2->kind == 1)
2020 *value2 = (unsigned int)op2->__anon1.uc;
2021 else if(op2->kind == 6)
2022 *value2 = (unsigned int)op2->__anon1.f;
2023 else if(op2->kind == 7)
2024 *value2 = (unsigned int)op2->__anon1.d;
2025 else if(op2->kind == 13)
2026 *value2 = (unsigned int)op2->__anon1.ui64;
2027 else
2028 return 0;
2029 return 1;
2030 }
2031
2032 unsigned int GetOpInt64(struct Operand * op2, long long * value2)
2033 {
2034 if(op2->kind == 3 && op2->type->isSigned)
2035 *value2 = (long long)op2->__anon1.i;
2036 else if(op2->kind == 3)
2037 *value2 = (long long)op2->__anon1.ui;
2038 else if(op2->kind == 4 && op2->type->isSigned)
2039 *value2 = op2->__anon1.i64;
2040 else if(op2->kind == 4)
2041 *value2 = (long long)op2->__anon1.ui64;
2042 else if(op2->kind == 23 && op2->type->isSigned)
2043 *value2 = op2->__anon1.i64;
2044 else if(op2->kind == 23)
2045 *value2 = (long long)op2->__anon1.ui64;
2046 else if(op2->kind == 22 && op2->type->isSigned)
2047 *value2 = op2->__anon1.i64;
2048 else if(op2->kind == 22)
2049 *value2 = (long long)op2->__anon1.ui64;
2050 else if(op2->kind == 2 && op2->type->isSigned)
2051 *value2 = (long long)op2->__anon1.s;
2052 else if(op2->kind == 2)
2053 *value2 = (long long)op2->__anon1.us;
2054 else if(op2->kind == 1 && op2->type->isSigned)
2055 *value2 = (long long)op2->__anon1.c;
2056 else if(op2->kind == 24 || op2->kind == 1)
2057 *value2 = (long long)op2->__anon1.uc;
2058 else if(op2->kind == 6)
2059 *value2 = (long long)op2->__anon1.f;
2060 else if(op2->kind == 7)
2061 *value2 = (long long)op2->__anon1.d;
2062 else if(op2->kind == 13)
2063 *value2 = (long long)op2->__anon1.ui64;
2064 else
2065 return 0;
2066 return 1;
2067 }
2068
2069 unsigned int GetOpUInt64(struct Operand * op2, uint64 * value2)
2070 {
2071 if(op2->kind == 3 && op2->type->isSigned)
2072 *value2 = (uint64)op2->__anon1.i;
2073 else if(op2->kind == 3)
2074 *value2 = (uint64)op2->__anon1.ui;
2075 else if(op2->kind == 4 && op2->type->isSigned)
2076 *value2 = (uint64)op2->__anon1.i64;
2077 else if(op2->kind == 4)
2078 *value2 = op2->__anon1.ui64;
2079 else if(op2->kind == 23 && op2->type->isSigned)
2080 *value2 = (uint64)op2->__anon1.i64;
2081 else if(op2->kind == 23)
2082 *value2 = op2->__anon1.ui64;
2083 else if(op2->kind == 22 && op2->type->isSigned)
2084 *value2 = (uint64)op2->__anon1.i64;
2085 else if(op2->kind == 22)
2086 *value2 = op2->__anon1.ui64;
2087 else if(op2->kind == 2 && op2->type->isSigned)
2088 *value2 = (uint64)op2->__anon1.s;
2089 else if(op2->kind == 2)
2090 *value2 = (uint64)op2->__anon1.us;
2091 else if(op2->kind == 1 && op2->type->isSigned)
2092 *value2 = (uint64)op2->__anon1.c;
2093 else if(op2->kind == 24 || op2->kind == 1)
2094 *value2 = (uint64)op2->__anon1.uc;
2095 else if(op2->kind == 6)
2096 *value2 = (uint64)op2->__anon1.f;
2097 else if(op2->kind == 7)
2098 *value2 = (uint64)op2->__anon1.d;
2099 else if(op2->kind == 13)
2100 *value2 = op2->__anon1.ui64;
2101 else
2102 return 0;
2103 return 1;
2104 }
2105
2106 unsigned int GetOpIntPtr(struct Operand * op2, intptr_t * value2)
2107 {
2108 if(op2->kind == 3 && op2->type->isSigned)
2109 *value2 = (intptr_t)op2->__anon1.i;
2110 else if(op2->kind == 3)
2111 *value2 = (intptr_t)op2->__anon1.ui;
2112 else if(op2->kind == 4 && op2->type->isSigned)
2113 *value2 = (intptr_t)op2->__anon1.i64;
2114 else if(op2->kind == 4)
2115 *value2 = (intptr_t)op2->__anon1.ui64;
2116 else if(op2->kind == 23 && op2->type->isSigned)
2117 *value2 = (intptr_t)op2->__anon1.i64;
2118 else if(op2->kind == 23)
2119 *value2 = (intptr_t)op2->__anon1.ui64;
2120 else if(op2->kind == 22 && op2->type->isSigned)
2121 *value2 = (intptr_t)op2->__anon1.i64;
2122 else if(op2->kind == 22)
2123 *value2 = (intptr_t)op2->__anon1.ui64;
2124 else if(op2->kind == 2 && op2->type->isSigned)
2125 *value2 = (intptr_t)op2->__anon1.s;
2126 else if(op2->kind == 2)
2127 *value2 = (intptr_t)op2->__anon1.us;
2128 else if(op2->kind == 1 && op2->type->isSigned)
2129 *value2 = (intptr_t)op2->__anon1.c;
2130 else if(op2->kind == 24 || op2->kind == 1)
2131 *value2 = (intptr_t)op2->__anon1.uc;
2132 else if(op2->kind == 6)
2133 *value2 = (intptr_t)op2->__anon1.f;
2134 else if(op2->kind == 7)
2135 *value2 = (intptr_t)op2->__anon1.d;
2136 else if(op2->kind == 13)
2137 *value2 = (intptr_t)op2->__anon1.ui64;
2138 else
2139 return 0;
2140 return 1;
2141 }
2142
2143 unsigned int GetOpUIntPtr(struct Operand * op2, uintptr_t * value2)
2144 {
2145 if(op2->kind == 3 && op2->type->isSigned)
2146 *value2 = (uintptr_t)op2->__anon1.i;
2147 else if(op2->kind == 3)
2148 *value2 = (uintptr_t)op2->__anon1.ui;
2149 else if(op2->kind == 4 && op2->type->isSigned)
2150 *value2 = (uintptr_t)op2->__anon1.i64;
2151 else if(op2->kind == 4)
2152 *value2 = (uintptr_t)op2->__anon1.ui64;
2153 else if(op2->kind == 23 && op2->type->isSigned)
2154 *value2 = (uintptr_t)op2->__anon1.i64;
2155 else if(op2->kind == 23)
2156 *value2 = (uintptr_t)op2->__anon1.ui64;
2157 else if(op2->kind == 22 && op2->type->isSigned)
2158 *value2 = (uintptr_t)op2->__anon1.i64;
2159 else if(op2->kind == 22)
2160 *value2 = (uintptr_t)op2->__anon1.ui64;
2161 else if(op2->kind == 2 && op2->type->isSigned)
2162 *value2 = (uintptr_t)op2->__anon1.s;
2163 else if(op2->kind == 2)
2164 *value2 = (uintptr_t)op2->__anon1.us;
2165 else if(op2->kind == 1 && op2->type->isSigned)
2166 *value2 = (uintptr_t)op2->__anon1.c;
2167 else if(op2->kind == 24 || op2->kind == 1)
2168 *value2 = (uintptr_t)op2->__anon1.uc;
2169 else if(op2->kind == 6)
2170 *value2 = (uintptr_t)op2->__anon1.f;
2171 else if(op2->kind == 7)
2172 *value2 = (uintptr_t)op2->__anon1.d;
2173 else if(op2->kind == 13)
2174 *value2 = (uintptr_t)op2->__anon1.ui64;
2175 else
2176 return 0;
2177 return 1;
2178 }
2179
2180 unsigned int GetOpIntSize(struct Operand * op2, ssize_t * value2)
2181 {
2182 if(op2->kind == 3 && op2->type->isSigned)
2183 *value2 = (ssize_t)op2->__anon1.i;
2184 else if(op2->kind == 3)
2185 *value2 = (ssize_t)op2->__anon1.ui;
2186 else if(op2->kind == 4 && op2->type->isSigned)
2187 *value2 = (ssize_t)op2->__anon1.i64;
2188 else if(op2->kind == 4)
2189 *value2 = (ssize_t)op2->__anon1.ui64;
2190 else if(op2->kind == 23 && op2->type->isSigned)
2191 *value2 = (ssize_t)op2->__anon1.i64;
2192 else if(op2->kind == 23)
2193 *value2 = (ssize_t)op2->__anon1.ui64;
2194 else if(op2->kind == 22 && op2->type->isSigned)
2195 *value2 = (ssize_t)op2->__anon1.i64;
2196 else if(op2->kind == 22)
2197 *value2 = (ssize_t)op2->__anon1.ui64;
2198 else if(op2->kind == 2 && op2->type->isSigned)
2199 *value2 = (ssize_t)op2->__anon1.s;
2200 else if(op2->kind == 2)
2201 *value2 = (ssize_t)op2->__anon1.us;
2202 else if(op2->kind == 1 && op2->type->isSigned)
2203 *value2 = (ssize_t)op2->__anon1.c;
2204 else if(op2->kind == 24 || op2->kind == 1)
2205 *value2 = (ssize_t)op2->__anon1.uc;
2206 else if(op2->kind == 6)
2207 *value2 = (ssize_t)op2->__anon1.f;
2208 else if(op2->kind == 7)
2209 *value2 = (ssize_t)op2->__anon1.d;
2210 else if(op2->kind == 13)
2211 *value2 = (ssize_t)op2->__anon1.ui64;
2212 else
2213 return 0;
2214 return 1;
2215 }
2216
2217 unsigned int GetOpUIntSize(struct Operand * op2, size_t * value2)
2218 {
2219 if(op2->kind == 3 && op2->type->isSigned)
2220 *value2 = (size_t)op2->__anon1.i;
2221 else if(op2->kind == 3)
2222 *value2 = (size_t)op2->__anon1.ui;
2223 else if(op2->kind == 4 && op2->type->isSigned)
2224 *value2 = (size_t)op2->__anon1.i64;
2225 else if(op2->kind == 4)
2226 *value2 = (size_t)op2->__anon1.ui64;
2227 else if(op2->kind == 23 && op2->type->isSigned)
2228 *value2 = (size_t)op2->__anon1.i64;
2229 else if(op2->kind == 23)
2230 *value2 = (size_t)op2->__anon1.ui64;
2231 else if(op2->kind == 22 && op2->type->isSigned)
2232 *value2 = (size_t)op2->__anon1.i64;
2233 else if(op2->kind == 22)
2234 *value2 = (size_t)op2->__anon1.ui64;
2235 else if(op2->kind == 2 && op2->type->isSigned)
2236 *value2 = (size_t)op2->__anon1.s;
2237 else if(op2->kind == 2)
2238 *value2 = (size_t)op2->__anon1.us;
2239 else if(op2->kind == 1 && op2->type->isSigned)
2240 *value2 = (size_t)op2->__anon1.c;
2241 else if(op2->kind == 24 || op2->kind == 1)
2242 *value2 = (size_t)op2->__anon1.uc;
2243 else if(op2->kind == 6)
2244 *value2 = (size_t)op2->__anon1.f;
2245 else if(op2->kind == 7)
2246 *value2 = (size_t)op2->__anon1.d;
2247 else if(op2->kind == 13)
2248 *value2 = (size_t)op2->__anon1.ui64;
2249 else
2250 return 0;
2251 return 1;
2252 }
2253
2254 unsigned int GetOpShort(struct Operand * op2, short * value2)
2255 {
2256 if(op2->kind == 3 && op2->type->isSigned)
2257 *value2 = (short)op2->__anon1.i;
2258 else if(op2->kind == 3)
2259 *value2 = (short)op2->__anon1.ui;
2260 else if(op2->kind == 4 && op2->type->isSigned)
2261 *value2 = (short)op2->__anon1.i64;
2262 else if(op2->kind == 4)
2263 *value2 = (short)op2->__anon1.ui64;
2264 else if(op2->kind == 23 && op2->type->isSigned)
2265 *value2 = (short)op2->__anon1.i64;
2266 else if(op2->kind == 23)
2267 *value2 = (short)op2->__anon1.ui64;
2268 else if(op2->kind == 22 && op2->type->isSigned)
2269 *value2 = (short)op2->__anon1.i64;
2270 else if(op2->kind == 22)
2271 *value2 = (short)op2->__anon1.ui64;
2272 else if(op2->kind == 2 && op2->type->isSigned)
2273 *value2 = op2->__anon1.s;
2274 else if(op2->kind == 2)
2275 *value2 = (short)op2->__anon1.us;
2276 else if(op2->kind == 1 && op2->type->isSigned)
2277 *value2 = (short)op2->__anon1.c;
2278 else if(op2->kind == 24 || op2->kind == 1)
2279 *value2 = (short)op2->__anon1.uc;
2280 else if(op2->kind == 6)
2281 *value2 = (short)op2->__anon1.f;
2282 else if(op2->kind == 7)
2283 *value2 = (short)op2->__anon1.d;
2284 else if(op2->kind == 13)
2285 *value2 = (short)op2->__anon1.ui64;
2286 else
2287 return 0;
2288 return 1;
2289 }
2290
2291 unsigned int GetOpUShort(struct Operand * op2, unsigned short * value2)
2292 {
2293 if(op2->kind == 3 && op2->type->isSigned)
2294 *value2 = (unsigned short)op2->__anon1.i;
2295 else if(op2->kind == 3)
2296 *value2 = (unsigned short)op2->__anon1.ui;
2297 else if(op2->kind == 4 && op2->type->isSigned)
2298 *value2 = (unsigned short)op2->__anon1.i64;
2299 else if(op2->kind == 4)
2300 *value2 = (unsigned short)op2->__anon1.ui64;
2301 else if(op2->kind == 23 && op2->type->isSigned)
2302 *value2 = (unsigned short)op2->__anon1.i64;
2303 else if(op2->kind == 23)
2304 *value2 = (unsigned short)op2->__anon1.ui64;
2305 else if(op2->kind == 22 && op2->type->isSigned)
2306 *value2 = (unsigned short)op2->__anon1.i64;
2307 else if(op2->kind == 22)
2308 *value2 = (unsigned short)op2->__anon1.ui64;
2309 else if(op2->kind == 2 && op2->type->isSigned)
2310 *value2 = (unsigned short)op2->__anon1.s;
2311 else if(op2->kind == 2)
2312 *value2 = op2->__anon1.us;
2313 else if(op2->kind == 1 && op2->type->isSigned)
2314 *value2 = (unsigned short)op2->__anon1.c;
2315 else if(op2->kind == 24 || op2->kind == 1)
2316 *value2 = (unsigned short)op2->__anon1.uc;
2317 else if(op2->kind == 6)
2318 *value2 = (unsigned short)op2->__anon1.f;
2319 else if(op2->kind == 7)
2320 *value2 = (unsigned short)op2->__anon1.d;
2321 else if(op2->kind == 13)
2322 *value2 = (unsigned short)op2->__anon1.ui64;
2323 else
2324 return 0;
2325 return 1;
2326 }
2327
2328 unsigned int GetOpChar(struct Operand * op2, char * value2)
2329 {
2330 if(op2->kind == 3 && op2->type->isSigned)
2331 *value2 = (char)op2->__anon1.i;
2332 else if(op2->kind == 3)
2333 *value2 = (char)op2->__anon1.ui;
2334 else if(op2->kind == 4 && op2->type->isSigned)
2335 *value2 = (char)op2->__anon1.i64;
2336 else if(op2->kind == 4)
2337 *value2 = (char)op2->__anon1.ui64;
2338 else if(op2->kind == 23 && op2->type->isSigned)
2339 *value2 = (char)op2->__anon1.i64;
2340 else if(op2->kind == 23)
2341 *value2 = (char)op2->__anon1.ui64;
2342 else if(op2->kind == 22 && op2->type->isSigned)
2343 *value2 = (char)op2->__anon1.i64;
2344 else if(op2->kind == 22)
2345 *value2 = (char)op2->__anon1.ui64;
2346 else if(op2->kind == 2 && op2->type->isSigned)
2347 *value2 = (char)op2->__anon1.s;
2348 else if(op2->kind == 2)
2349 *value2 = (char)op2->__anon1.us;
2350 else if(op2->kind == 1 && op2->type->isSigned)
2351 *value2 = op2->__anon1.c;
2352 else if(op2->kind == 24 || op2->kind == 1)
2353 *value2 = (char)op2->__anon1.uc;
2354 else if(op2->kind == 6)
2355 *value2 = (char)op2->__anon1.f;
2356 else if(op2->kind == 7)
2357 *value2 = (char)op2->__anon1.d;
2358 else if(op2->kind == 13)
2359 *value2 = (char)op2->__anon1.ui64;
2360 else
2361 return 0;
2362 return 1;
2363 }
2364
2365 unsigned int GetOpUChar(struct Operand * op2, unsigned char * value2)
2366 {
2367 if(op2->kind == 3 && op2->type->isSigned)
2368 *value2 = (unsigned char)op2->__anon1.i;
2369 else if(op2->kind == 3)
2370 *value2 = (unsigned char)op2->__anon1.ui;
2371 else if(op2->kind == 4 && op2->type->isSigned)
2372 *value2 = (unsigned char)op2->__anon1.i64;
2373 else if(op2->kind == 4)
2374 *value2 = (unsigned char)op2->__anon1.ui64;
2375 else if(op2->kind == 23 && op2->type->isSigned)
2376 *value2 = (unsigned char)op2->__anon1.i64;
2377 else if(op2->kind == 23)
2378 *value2 = (unsigned char)op2->__anon1.ui64;
2379 else if(op2->kind == 22 && op2->type->isSigned)
2380 *value2 = (unsigned char)op2->__anon1.i64;
2381 else if(op2->kind == 22)
2382 *value2 = (unsigned char)op2->__anon1.ui64;
2383 else if(op2->kind == 2 && op2->type->isSigned)
2384 *value2 = (unsigned char)op2->__anon1.s;
2385 else if(op2->kind == 2)
2386 *value2 = (unsigned char)op2->__anon1.us;
2387 else if(op2->kind == 1 && op2->type->isSigned)
2388 *value2 = (unsigned char)op2->__anon1.c;
2389 else if(op2->kind == 24 || op2->kind == 1)
2390 *value2 = op2->__anon1.uc;
2391 else if(op2->kind == 6)
2392 *value2 = (unsigned char)op2->__anon1.f;
2393 else if(op2->kind == 7)
2394 *value2 = (unsigned char)op2->__anon1.d;
2395 else if(op2->kind == 13)
2396 *value2 = (unsigned char)op2->__anon1.ui64;
2397 else
2398 return 0;
2399 return 1;
2400 }
2401
2402 unsigned int GetOpFloat(struct Operand * op2, float * value2)
2403 {
2404 if(op2->kind == 3 && op2->type->isSigned)
2405 *value2 = (float)(float)op2->__anon1.i;
2406 else if(op2->kind == 3)
2407 *value2 = (float)(float)op2->__anon1.ui;
2408 else if(op2->kind == 4 && op2->type->isSigned)
2409 *value2 = (float)(float)op2->__anon1.i64;
2410 else if(op2->kind == 4)
2411 *value2 = (float)(float)op2->__anon1.ui64;
2412 else if(op2->kind == 23 && op2->type->isSigned)
2413 *value2 = (float)(float)op2->__anon1.i64;
2414 else if(op2->kind == 23)
2415 *value2 = (float)(float)op2->__anon1.ui64;
2416 else if(op2->kind == 22 && op2->type->isSigned)
2417 *value2 = (float)(float)op2->__anon1.i64;
2418 else if(op2->kind == 22)
2419 *value2 = (float)(float)op2->__anon1.ui64;
2420 else if(op2->kind == 2 && op2->type->isSigned)
2421 *value2 = (float)(float)op2->__anon1.s;
2422 else if(op2->kind == 2)
2423 *value2 = (float)(float)op2->__anon1.us;
2424 else if(op2->kind == 1 && op2->type->isSigned)
2425 *value2 = (float)(float)op2->__anon1.c;
2426 else if(op2->kind == 24 || op2->kind == 1)
2427 *value2 = (float)(float)op2->__anon1.uc;
2428 else if(op2->kind == 6)
2429 *value2 = (float)op2->__anon1.f;
2430 else if(op2->kind == 7)
2431 *value2 = (float)op2->__anon1.d;
2432 else if(op2->kind == 13)
2433 *value2 = (float)(float)op2->__anon1.ui64;
2434 else
2435 return 0;
2436 return 1;
2437 }
2438
2439 unsigned int GetOpDouble(struct Operand * op2, double * value2)
2440 {
2441 if(op2->kind == 3 && op2->type->isSigned)
2442 *value2 = (double)(double)op2->__anon1.i;
2443 else if(op2->kind == 3)
2444 *value2 = (double)(double)op2->__anon1.ui;
2445 else if(op2->kind == 4 && op2->type->isSigned)
2446 *value2 = (double)(double)op2->__anon1.i64;
2447 else if(op2->kind == 4)
2448 *value2 = (double)(double)op2->__anon1.ui64;
2449 else if(op2->kind == 23 && op2->type->isSigned)
2450 *value2 = (double)(double)op2->__anon1.i64;
2451 else if(op2->kind == 23)
2452 *value2 = (double)(double)op2->__anon1.ui64;
2453 else if(op2->kind == 22 && op2->type->isSigned)
2454 *value2 = (double)(double)op2->__anon1.i64;
2455 else if(op2->kind == 22)
2456 *value2 = (double)(double)op2->__anon1.ui64;
2457 else if(op2->kind == 2 && op2->type->isSigned)
2458 *value2 = (double)(double)op2->__anon1.s;
2459 else if(op2->kind == 2)
2460 *value2 = (double)(double)op2->__anon1.us;
2461 else if(op2->kind == 1 && op2->type->isSigned)
2462 *value2 = (double)(double)op2->__anon1.c;
2463 else if(op2->kind == 24 || op2->kind == 1)
2464 *value2 = (double)(double)op2->__anon1.uc;
2465 else if(op2->kind == 6)
2466 *value2 = (double)op2->__anon1.f;
2467 else if(op2->kind == 7)
2468 *value2 = (double)op2->__anon1.d;
2469 else if(op2->kind == 13)
2470 *value2 = (double)(double)op2->__anon1.ui64;
2471 else
2472 return 0;
2473 return 1;
2474 }
2475
2476 static unsigned int IntAdd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2477 {
2478 int value2 = op2->__anon1.i;
2479
2480 exp->type = 2;
2481 exp->__anon1.__anon2.string = PrintInt((op1->__anon1.i + value2));
2482 if(!exp->expType)
2483 {
2484 exp->expType = op1->type;
2485 if(op1->type)
2486 op1->type->refCount++;
2487 }
2488 return 1;
2489 }
2490
2491 static unsigned int UIntAdd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2492 {
2493 unsigned int value2 = op2->__anon1.ui;
2494
2495 exp->type = 2;
2496 exp->__anon1.__anon2.string = PrintUInt((op1->__anon1.ui + value2));
2497 if(!exp->expType)
2498 {
2499 exp->expType = op1->type;
2500 if(op1->type)
2501 op1->type->refCount++;
2502 }
2503 return 1;
2504 }
2505
2506 static unsigned int Int64Add(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2507 {
2508 long long value2 = op2->__anon1.i64;
2509
2510 exp->type = 2;
2511 exp->__anon1.__anon2.string = PrintInt64((op1->__anon1.i64 + value2));
2512 if(!exp->expType)
2513 {
2514 exp->expType = op1->type;
2515 if(op1->type)
2516 op1->type->refCount++;
2517 }
2518 return 1;
2519 }
2520
2521 static unsigned int UInt64Add(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2522 {
2523 uint64 value2 = op2->__anon1.ui64;
2524
2525 exp->type = 2;
2526 exp->__anon1.__anon2.string = PrintUInt64((op1->__anon1.ui64 + value2));
2527 if(!exp->expType)
2528 {
2529 exp->expType = op1->type;
2530 if(op1->type)
2531 op1->type->refCount++;
2532 }
2533 return 1;
2534 }
2535
2536 static unsigned int ShortAdd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2537 {
2538 short value2 = op2->__anon1.s;
2539
2540 exp->type = 2;
2541 exp->__anon1.__anon2.string = PrintShort((short)(op1->__anon1.s + value2));
2542 if(!exp->expType)
2543 {
2544 exp->expType = op1->type;
2545 if(op1->type)
2546 op1->type->refCount++;
2547 }
2548 return 1;
2549 }
2550
2551 static unsigned int UShortAdd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2552 {
2553 unsigned short value2 = op2->__anon1.us;
2554
2555 exp->type = 2;
2556 exp->__anon1.__anon2.string = PrintUShort((unsigned short)(op1->__anon1.us + value2));
2557 if(!exp->expType)
2558 {
2559 exp->expType = op1->type;
2560 if(op1->type)
2561 op1->type->refCount++;
2562 }
2563 return 1;
2564 }
2565
2566 static unsigned int CharAdd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2567 {
2568 char value2 = op2->__anon1.c;
2569
2570 exp->type = 2;
2571 exp->__anon1.__anon2.string = PrintChar((char)(op1->__anon1.c + value2));
2572 if(!exp->expType)
2573 {
2574 exp->expType = op1->type;
2575 if(op1->type)
2576 op1->type->refCount++;
2577 }
2578 return 1;
2579 }
2580
2581 static unsigned int UCharAdd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2582 {
2583 unsigned char value2 = op2->__anon1.uc;
2584
2585 exp->type = 2;
2586 exp->__anon1.__anon2.string = PrintUChar((unsigned char)(op1->__anon1.uc + value2));
2587 if(!exp->expType)
2588 {
2589 exp->expType = op1->type;
2590 if(op1->type)
2591 op1->type->refCount++;
2592 }
2593 return 1;
2594 }
2595
2596 static unsigned int FloatAdd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2597 {
2598 float value2 = op2->__anon1.f;
2599
2600 exp->type = 2;
2601 exp->__anon1.__anon2.string = PrintFloat((float)(op1->__anon1.f + value2));
2602 if(!exp->expType)
2603 {
2604 exp->expType = op1->type;
2605 if(op1->type)
2606 op1->type->refCount++;
2607 }
2608 return 1;
2609 }
2610
2611 static unsigned int DoubleAdd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2612 {
2613 double value2 = op2->__anon1.d;
2614
2615 exp->type = 2;
2616 exp->__anon1.__anon2.string = PrintDouble((double)(op1->__anon1.d + value2));
2617 if(!exp->expType)
2618 {
2619 exp->expType = op1->type;
2620 if(op1->type)
2621 op1->type->refCount++;
2622 }
2623 return 1;
2624 }
2625
2626 static unsigned int IntSub(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2627 {
2628 int value2 = op2->__anon1.i;
2629
2630 exp->type = 2;
2631 exp->__anon1.__anon2.string = PrintInt((op1->__anon1.i - value2));
2632 if(!exp->expType)
2633 {
2634 exp->expType = op1->type;
2635 if(op1->type)
2636 op1->type->refCount++;
2637 }
2638 return 1;
2639 }
2640
2641 static unsigned int UIntSub(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2642 {
2643 unsigned int value2 = op2->__anon1.ui;
2644
2645 exp->type = 2;
2646 exp->__anon1.__anon2.string = PrintUInt((op1->__anon1.ui - value2));
2647 if(!exp->expType)
2648 {
2649 exp->expType = op1->type;
2650 if(op1->type)
2651 op1->type->refCount++;
2652 }
2653 return 1;
2654 }
2655
2656 static unsigned int Int64Sub(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2657 {
2658 long long value2 = op2->__anon1.i64;
2659
2660 exp->type = 2;
2661 exp->__anon1.__anon2.string = PrintInt64((op1->__anon1.i64 - value2));
2662 if(!exp->expType)
2663 {
2664 exp->expType = op1->type;
2665 if(op1->type)
2666 op1->type->refCount++;
2667 }
2668 return 1;
2669 }
2670
2671 static unsigned int UInt64Sub(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2672 {
2673 uint64 value2 = op2->__anon1.ui64;
2674
2675 exp->type = 2;
2676 exp->__anon1.__anon2.string = PrintUInt64((op1->__anon1.ui64 - value2));
2677 if(!exp->expType)
2678 {
2679 exp->expType = op1->type;
2680 if(op1->type)
2681 op1->type->refCount++;
2682 }
2683 return 1;
2684 }
2685
2686 static unsigned int ShortSub(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2687 {
2688 short value2 = op2->__anon1.s;
2689
2690 exp->type = 2;
2691 exp->__anon1.__anon2.string = PrintShort((short)(op1->__anon1.s - value2));
2692 if(!exp->expType)
2693 {
2694 exp->expType = op1->type;
2695 if(op1->type)
2696 op1->type->refCount++;
2697 }
2698 return 1;
2699 }
2700
2701 static unsigned int UShortSub(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2702 {
2703 unsigned short value2 = op2->__anon1.us;
2704
2705 exp->type = 2;
2706 exp->__anon1.__anon2.string = PrintUShort((unsigned short)(op1->__anon1.us - value2));
2707 if(!exp->expType)
2708 {
2709 exp->expType = op1->type;
2710 if(op1->type)
2711 op1->type->refCount++;
2712 }
2713 return 1;
2714 }
2715
2716 static unsigned int CharSub(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2717 {
2718 char value2 = op2->__anon1.c;
2719
2720 exp->type = 2;
2721 exp->__anon1.__anon2.string = PrintChar((char)(op1->__anon1.c - value2));
2722 if(!exp->expType)
2723 {
2724 exp->expType = op1->type;
2725 if(op1->type)
2726 op1->type->refCount++;
2727 }
2728 return 1;
2729 }
2730
2731 static unsigned int UCharSub(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2732 {
2733 unsigned char value2 = op2->__anon1.uc;
2734
2735 exp->type = 2;
2736 exp->__anon1.__anon2.string = PrintUChar((unsigned char)(op1->__anon1.uc - value2));
2737 if(!exp->expType)
2738 {
2739 exp->expType = op1->type;
2740 if(op1->type)
2741 op1->type->refCount++;
2742 }
2743 return 1;
2744 }
2745
2746 static unsigned int FloatSub(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2747 {
2748 float value2 = op2->__anon1.f;
2749
2750 exp->type = 2;
2751 exp->__anon1.__anon2.string = PrintFloat((float)(op1->__anon1.f - value2));
2752 if(!exp->expType)
2753 {
2754 exp->expType = op1->type;
2755 if(op1->type)
2756 op1->type->refCount++;
2757 }
2758 return 1;
2759 }
2760
2761 static unsigned int DoubleSub(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2762 {
2763 double value2 = op2->__anon1.d;
2764
2765 exp->type = 2;
2766 exp->__anon1.__anon2.string = PrintDouble((double)(op1->__anon1.d - value2));
2767 if(!exp->expType)
2768 {
2769 exp->expType = op1->type;
2770 if(op1->type)
2771 op1->type->refCount++;
2772 }
2773 return 1;
2774 }
2775
2776 static unsigned int IntMul(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2777 {
2778 int value2 = op2->__anon1.i;
2779
2780 exp->type = 2;
2781 exp->__anon1.__anon2.string = PrintInt((op1->__anon1.i * value2));
2782 if(!exp->expType)
2783 {
2784 exp->expType = op1->type;
2785 if(op1->type)
2786 op1->type->refCount++;
2787 }
2788 return 1;
2789 }
2790
2791 static unsigned int UIntMul(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2792 {
2793 unsigned int value2 = op2->__anon1.ui;
2794
2795 exp->type = 2;
2796 exp->__anon1.__anon2.string = PrintUInt((op1->__anon1.ui * value2));
2797 if(!exp->expType)
2798 {
2799 exp->expType = op1->type;
2800 if(op1->type)
2801 op1->type->refCount++;
2802 }
2803 return 1;
2804 }
2805
2806 static unsigned int Int64Mul(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2807 {
2808 long long value2 = op2->__anon1.i64;
2809
2810 exp->type = 2;
2811 exp->__anon1.__anon2.string = PrintInt64((op1->__anon1.i64 * value2));
2812 if(!exp->expType)
2813 {
2814 exp->expType = op1->type;
2815 if(op1->type)
2816 op1->type->refCount++;
2817 }
2818 return 1;
2819 }
2820
2821 static unsigned int UInt64Mul(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2822 {
2823 uint64 value2 = op2->__anon1.ui64;
2824
2825 exp->type = 2;
2826 exp->__anon1.__anon2.string = PrintUInt64((op1->__anon1.ui64 * value2));
2827 if(!exp->expType)
2828 {
2829 exp->expType = op1->type;
2830 if(op1->type)
2831 op1->type->refCount++;
2832 }
2833 return 1;
2834 }
2835
2836 static unsigned int ShortMul(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2837 {
2838 short value2 = op2->__anon1.s;
2839
2840 exp->type = 2;
2841 exp->__anon1.__anon2.string = PrintShort((short)(op1->__anon1.s * value2));
2842 if(!exp->expType)
2843 {
2844 exp->expType = op1->type;
2845 if(op1->type)
2846 op1->type->refCount++;
2847 }
2848 return 1;
2849 }
2850
2851 static unsigned int UShortMul(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2852 {
2853 unsigned short value2 = op2->__anon1.us;
2854
2855 exp->type = 2;
2856 exp->__anon1.__anon2.string = PrintUShort((unsigned short)(op1->__anon1.us * value2));
2857 if(!exp->expType)
2858 {
2859 exp->expType = op1->type;
2860 if(op1->type)
2861 op1->type->refCount++;
2862 }
2863 return 1;
2864 }
2865
2866 static unsigned int CharMul(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2867 {
2868 char value2 = op2->__anon1.c;
2869
2870 exp->type = 2;
2871 exp->__anon1.__anon2.string = PrintChar((char)(op1->__anon1.c * value2));
2872 if(!exp->expType)
2873 {
2874 exp->expType = op1->type;
2875 if(op1->type)
2876 op1->type->refCount++;
2877 }
2878 return 1;
2879 }
2880
2881 static unsigned int UCharMul(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2882 {
2883 unsigned char value2 = op2->__anon1.uc;
2884
2885 exp->type = 2;
2886 exp->__anon1.__anon2.string = PrintUChar((unsigned char)(op1->__anon1.uc * value2));
2887 if(!exp->expType)
2888 {
2889 exp->expType = op1->type;
2890 if(op1->type)
2891 op1->type->refCount++;
2892 }
2893 return 1;
2894 }
2895
2896 static unsigned int FloatMul(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2897 {
2898 float value2 = op2->__anon1.f;
2899
2900 exp->type = 2;
2901 exp->__anon1.__anon2.string = PrintFloat((float)(op1->__anon1.f * value2));
2902 if(!exp->expType)
2903 {
2904 exp->expType = op1->type;
2905 if(op1->type)
2906 op1->type->refCount++;
2907 }
2908 return 1;
2909 }
2910
2911 static unsigned int DoubleMul(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2912 {
2913 double value2 = op2->__anon1.d;
2914
2915 exp->type = 2;
2916 exp->__anon1.__anon2.string = PrintDouble((double)(op1->__anon1.d * value2));
2917 if(!exp->expType)
2918 {
2919 exp->expType = op1->type;
2920 if(op1->type)
2921 op1->type->refCount++;
2922 }
2923 return 1;
2924 }
2925
2926 static unsigned int IntDiv(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2927 {
2928 int value2 = op2->__anon1.i;
2929
2930 exp->type = 2;
2931 exp->__anon1.__anon2.string = PrintInt(value2 ? ((op1->__anon1.i / value2)) : 0);
2932 if(!exp->expType)
2933 {
2934 exp->expType = op1->type;
2935 if(op1->type)
2936 op1->type->refCount++;
2937 }
2938 return 1;
2939 }
2940
2941 static unsigned int UIntDiv(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2942 {
2943 unsigned int value2 = op2->__anon1.ui;
2944
2945 exp->type = 2;
2946 exp->__anon1.__anon2.string = PrintUInt(value2 ? ((op1->__anon1.ui / value2)) : 0);
2947 if(!exp->expType)
2948 {
2949 exp->expType = op1->type;
2950 if(op1->type)
2951 op1->type->refCount++;
2952 }
2953 return 1;
2954 }
2955
2956 static unsigned int Int64Div(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2957 {
2958 long long value2 = op2->__anon1.i64;
2959
2960 exp->type = 2;
2961 exp->__anon1.__anon2.string = PrintInt64(value2 ? ((op1->__anon1.i64 / value2)) : 0);
2962 if(!exp->expType)
2963 {
2964 exp->expType = op1->type;
2965 if(op1->type)
2966 op1->type->refCount++;
2967 }
2968 return 1;
2969 }
2970
2971 static unsigned int UInt64Div(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2972 {
2973 uint64 value2 = op2->__anon1.ui64;
2974
2975 exp->type = 2;
2976 exp->__anon1.__anon2.string = PrintUInt64(value2 ? ((op1->__anon1.ui64 / value2)) : 0);
2977 if(!exp->expType)
2978 {
2979 exp->expType = op1->type;
2980 if(op1->type)
2981 op1->type->refCount++;
2982 }
2983 return 1;
2984 }
2985
2986 static unsigned int ShortDiv(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2987 {
2988 short value2 = op2->__anon1.s;
2989
2990 exp->type = 2;
2991 exp->__anon1.__anon2.string = PrintShort(value2 ? ((short)(op1->__anon1.s / value2)) : 0);
2992 if(!exp->expType)
2993 {
2994 exp->expType = op1->type;
2995 if(op1->type)
2996 op1->type->refCount++;
2997 }
2998 return 1;
2999 }
3000
3001 static unsigned int UShortDiv(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3002 {
3003 unsigned short value2 = op2->__anon1.us;
3004
3005 exp->type = 2;
3006 exp->__anon1.__anon2.string = PrintUShort(value2 ? ((unsigned short)(op1->__anon1.us / value2)) : 0);
3007 if(!exp->expType)
3008 {
3009 exp->expType = op1->type;
3010 if(op1->type)
3011 op1->type->refCount++;
3012 }
3013 return 1;
3014 }
3015
3016 static unsigned int CharDiv(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3017 {
3018 char value2 = op2->__anon1.c;
3019
3020 exp->type = 2;
3021 exp->__anon1.__anon2.string = PrintChar(value2 ? ((char)(op1->__anon1.c / value2)) : 0);
3022 if(!exp->expType)
3023 {
3024 exp->expType = op1->type;
3025 if(op1->type)
3026 op1->type->refCount++;
3027 }
3028 return 1;
3029 }
3030
3031 static unsigned int UCharDiv(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3032 {
3033 unsigned char value2 = op2->__anon1.uc;
3034
3035 exp->type = 2;
3036 exp->__anon1.__anon2.string = PrintUChar(value2 ? ((unsigned char)(op1->__anon1.uc / value2)) : 0);
3037 if(!exp->expType)
3038 {
3039 exp->expType = op1->type;
3040 if(op1->type)
3041 op1->type->refCount++;
3042 }
3043 return 1;
3044 }
3045
3046 static unsigned int FloatDiv(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3047 {
3048 float value2 = op2->__anon1.f;
3049
3050 exp->type = 2;
3051 exp->__anon1.__anon2.string = PrintFloat((float)(op1->__anon1.f / value2));
3052 if(!exp->expType)
3053 {
3054 exp->expType = op1->type;
3055 if(op1->type)
3056 op1->type->refCount++;
3057 }
3058 return 1;
3059 }
3060
3061 static unsigned int DoubleDiv(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3062 {
3063 double value2 = op2->__anon1.d;
3064
3065 exp->type = 2;
3066 exp->__anon1.__anon2.string = PrintDouble((double)(op1->__anon1.d / value2));
3067 if(!exp->expType)
3068 {
3069 exp->expType = op1->type;
3070 if(op1->type)
3071 op1->type->refCount++;
3072 }
3073 return 1;
3074 }
3075
3076 static unsigned int IntMod(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3077 {
3078 int value2 = op2->__anon1.i;
3079
3080 exp->type = 2;
3081 exp->__anon1.__anon2.string = PrintInt(value2 ? ((op1->__anon1.i % value2)) : 0);
3082 if(!exp->expType)
3083 {
3084 exp->expType = op1->type;
3085 if(op1->type)
3086 op1->type->refCount++;
3087 }
3088 return 1;
3089 }
3090
3091 static unsigned int UIntMod(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3092 {
3093 unsigned int value2 = op2->__anon1.ui;
3094
3095 exp->type = 2;
3096 exp->__anon1.__anon2.string = PrintUInt(value2 ? ((op1->__anon1.ui % value2)) : 0);
3097 if(!exp->expType)
3098 {
3099 exp->expType = op1->type;
3100 if(op1->type)
3101 op1->type->refCount++;
3102 }
3103 return 1;
3104 }
3105
3106 static unsigned int Int64Mod(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3107 {
3108 long long value2 = op2->__anon1.i64;
3109
3110 exp->type = 2;
3111 exp->__anon1.__anon2.string = PrintInt64(value2 ? ((op1->__anon1.i64 % value2)) : 0);
3112 if(!exp->expType)
3113 {
3114 exp->expType = op1->type;
3115 if(op1->type)
3116 op1->type->refCount++;
3117 }
3118 return 1;
3119 }
3120
3121 static unsigned int UInt64Mod(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3122 {
3123 uint64 value2 = op2->__anon1.ui64;
3124
3125 exp->type = 2;
3126 exp->__anon1.__anon2.string = PrintUInt64(value2 ? ((op1->__anon1.ui64 % value2)) : 0);
3127 if(!exp->expType)
3128 {
3129 exp->expType = op1->type;
3130 if(op1->type)
3131 op1->type->refCount++;
3132 }
3133 return 1;
3134 }
3135
3136 static unsigned int ShortMod(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3137 {
3138 short value2 = op2->__anon1.s;
3139
3140 exp->type = 2;
3141 exp->__anon1.__anon2.string = PrintShort(value2 ? ((short)(op1->__anon1.s % value2)) : 0);
3142 if(!exp->expType)
3143 {
3144 exp->expType = op1->type;
3145 if(op1->type)
3146 op1->type->refCount++;
3147 }
3148 return 1;
3149 }
3150
3151 static unsigned int UShortMod(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3152 {
3153 unsigned short value2 = op2->__anon1.us;
3154
3155 exp->type = 2;
3156 exp->__anon1.__anon2.string = PrintUShort(value2 ? ((unsigned short)(op1->__anon1.us % value2)) : 0);
3157 if(!exp->expType)
3158 {
3159 exp->expType = op1->type;
3160 if(op1->type)
3161 op1->type->refCount++;
3162 }
3163 return 1;
3164 }
3165
3166 static unsigned int CharMod(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3167 {
3168 char value2 = op2->__anon1.c;
3169
3170 exp->type = 2;
3171 exp->__anon1.__anon2.string = PrintChar(value2 ? ((char)(op1->__anon1.c % value2)) : 0);
3172 if(!exp->expType)
3173 {
3174 exp->expType = op1->type;
3175 if(op1->type)
3176 op1->type->refCount++;
3177 }
3178 return 1;
3179 }
3180
3181 static unsigned int UCharMod(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3182 {
3183 unsigned char value2 = op2->__anon1.uc;
3184
3185 exp->type = 2;
3186 exp->__anon1.__anon2.string = PrintUChar(value2 ? ((unsigned char)(op1->__anon1.uc % value2)) : 0);
3187 if(!exp->expType)
3188 {
3189 exp->expType = op1->type;
3190 if(op1->type)
3191 op1->type->refCount++;
3192 }
3193 return 1;
3194 }
3195
3196 static unsigned int IntNeg(struct Expression * exp, struct Operand * op1)
3197 {
3198 exp->type = 2;
3199 exp->__anon1.__anon2.string = PrintInt((-op1->__anon1.i));
3200 if(!exp->expType)
3201 {
3202 exp->expType = op1->type;
3203 if(op1->type)
3204 op1->type->refCount++;
3205 }
3206 return 1;
3207 }
3208
3209 static unsigned int UIntNeg(struct Expression * exp, struct Operand * op1)
3210 {
3211 exp->type = 2;
3212 exp->__anon1.__anon2.string = PrintUInt((unsigned int)(-op1->__anon1.ui));
3213 if(!exp->expType)
3214 {
3215 exp->expType = op1->type;
3216 if(op1->type)
3217 op1->type->refCount++;
3218 }
3219 return 1;
3220 }
3221
3222 static unsigned int Int64Neg(struct Expression * exp, struct Operand * op1)
3223 {
3224 exp->type = 2;
3225 exp->__anon1.__anon2.string = PrintInt64((-op1->__anon1.i64));
3226 if(!exp->expType)
3227 {
3228 exp->expType = op1->type;
3229 if(op1->type)
3230 op1->type->refCount++;
3231 }
3232 return 1;
3233 }
3234
3235 static unsigned int UInt64Neg(struct Expression * exp, struct Operand * op1)
3236 {
3237 exp->type = 2;
3238 exp->__anon1.__anon2.string = PrintUInt64((uint64)(-op1->__anon1.ui64));
3239 if(!exp->expType)
3240 {
3241 exp->expType = op1->type;
3242 if(op1->type)
3243 op1->type->refCount++;
3244 }
3245 return 1;
3246 }
3247
3248 static unsigned int ShortNeg(struct Expression * exp, struct Operand * op1)
3249 {
3250 exp->type = 2;
3251 exp->__anon1.__anon2.string = PrintShort((-op1->__anon1.s));
3252 if(!exp->expType)
3253 {
3254 exp->expType = op1->type;
3255 if(op1->type)
3256 op1->type->refCount++;
3257 }
3258 return 1;
3259 }
3260
3261 static unsigned int UShortNeg(struct Expression * exp, struct Operand * op1)
3262 {
3263 exp->type = 2;
3264 exp->__anon1.__anon2.string = PrintUShort((unsigned short)(-op1->__anon1.us));
3265 if(!exp->expType)
3266 {
3267 exp->expType = op1->type;
3268 if(op1->type)
3269 op1->type->refCount++;
3270 }
3271 return 1;
3272 }
3273
3274 static unsigned int CharNeg(struct Expression * exp, struct Operand * op1)
3275 {
3276 exp->type = 2;
3277 exp->__anon1.__anon2.string = PrintChar((-op1->__anon1.c));
3278 if(!exp->expType)
3279 {
3280 exp->expType = op1->type;
3281 if(op1->type)
3282 op1->type->refCount++;
3283 }
3284 return 1;
3285 }
3286
3287 static unsigned int UCharNeg(struct Expression * exp, struct Operand * op1)
3288 {
3289 exp->type = 2;
3290 exp->__anon1.__anon2.string = PrintUChar((unsigned char)(-op1->__anon1.uc));
3291 if(!exp->expType)
3292 {
3293 exp->expType = op1->type;
3294 if(op1->type)
3295 op1->type->refCount++;
3296 }
3297 return 1;
3298 }
3299
3300 static unsigned int FloatNeg(struct Expression * exp, struct Operand * op1)
3301 {
3302 exp->type = 2;
3303 exp->__anon1.__anon2.string = PrintFloat((float)(-op1->__anon1.f));
3304 if(!exp->expType)
3305 {
3306 exp->expType = op1->type;
3307 if(op1->type)
3308 op1->type->refCount++;
3309 }
3310 return 1;
3311 }
3312
3313 static unsigned int DoubleNeg(struct Expression * exp, struct Operand * op1)
3314 {
3315 exp->type = 2;
3316 exp->__anon1.__anon2.string = PrintDouble((double)(-op1->__anon1.d));
3317 if(!exp->expType)
3318 {
3319 exp->expType = op1->type;
3320 if(op1->type)
3321 op1->type->refCount++;
3322 }
3323 return 1;
3324 }
3325
3326 static unsigned int IntInc(struct Expression * exp, struct Operand * op1)
3327 {
3328 exp->type = 2;
3329 exp->__anon1.__anon2.string = PrintInt((++op1->__anon1.i));
3330 if(!exp->expType)
3331 {
3332 exp->expType = op1->type;
3333 if(op1->type)
3334 op1->type->refCount++;
3335 }
3336 return 1;
3337 }
3338
3339 static unsigned int UIntInc(struct Expression * exp, struct Operand * op1)
3340 {
3341 exp->type = 2;
3342 exp->__anon1.__anon2.string = PrintUInt((++op1->__anon1.ui));
3343 if(!exp->expType)
3344 {
3345 exp->expType = op1->type;
3346 if(op1->type)
3347 op1->type->refCount++;
3348 }
3349 return 1;
3350 }
3351
3352 static unsigned int Int64Inc(struct Expression * exp, struct Operand * op1)
3353 {
3354 exp->type = 2;
3355 exp->__anon1.__anon2.string = PrintInt64((++op1->__anon1.i64));
3356 if(!exp->expType)
3357 {
3358 exp->expType = op1->type;
3359 if(op1->type)
3360 op1->type->refCount++;
3361 }
3362 return 1;
3363 }
3364
3365 static unsigned int UInt64Inc(struct Expression * exp, struct Operand * op1)
3366 {
3367 exp->type = 2;
3368 exp->__anon1.__anon2.string = PrintUInt64((++op1->__anon1.ui64));
3369 if(!exp->expType)
3370 {
3371 exp->expType = op1->type;
3372 if(op1->type)
3373 op1->type->refCount++;
3374 }
3375 return 1;
3376 }
3377
3378 static unsigned int ShortInc(struct Expression * exp, struct Operand * op1)
3379 {
3380 exp->type = 2;
3381 exp->__anon1.__anon2.string = PrintShort((++op1->__anon1.s));
3382 if(!exp->expType)
3383 {
3384 exp->expType = op1->type;
3385 if(op1->type)
3386 op1->type->refCount++;
3387 }
3388 return 1;
3389 }
3390
3391 static unsigned int UShortInc(struct Expression * exp, struct Operand * op1)
3392 {
3393 exp->type = 2;
3394 exp->__anon1.__anon2.string = PrintUShort((++op1->__anon1.us));
3395 if(!exp->expType)
3396 {
3397 exp->expType = op1->type;
3398 if(op1->type)
3399 op1->type->refCount++;
3400 }
3401 return 1;
3402 }
3403
3404 static unsigned int CharInc(struct Expression * exp, struct Operand * op1)
3405 {
3406 exp->type = 2;
3407 exp->__anon1.__anon2.string = PrintChar((++op1->__anon1.c));
3408 if(!exp->expType)
3409 {
3410 exp->expType = op1->type;
3411 if(op1->type)
3412 op1->type->refCount++;
3413 }
3414 return 1;
3415 }
3416
3417 static unsigned int UCharInc(struct Expression * exp, struct Operand * op1)
3418 {
3419 exp->type = 2;
3420 exp->__anon1.__anon2.string = PrintUChar((++op1->__anon1.uc));
3421 if(!exp->expType)
3422 {
3423 exp->expType = op1->type;
3424 if(op1->type)
3425 op1->type->refCount++;
3426 }
3427 return 1;
3428 }
3429
3430 static unsigned int FloatInc(struct Expression * exp, struct Operand * op1)
3431 {
3432 exp->type = 2;
3433 exp->__anon1.__anon2.string = PrintFloat((float)(++op1->__anon1.f));
3434 if(!exp->expType)
3435 {
3436 exp->expType = op1->type;
3437 if(op1->type)
3438 op1->type->refCount++;
3439 }
3440 return 1;
3441 }
3442
3443 static unsigned int DoubleInc(struct Expression * exp, struct Operand * op1)
3444 {
3445 exp->type = 2;
3446 exp->__anon1.__anon2.string = PrintDouble((double)(++op1->__anon1.d));
3447 if(!exp->expType)
3448 {
3449 exp->expType = op1->type;
3450 if(op1->type)
3451 op1->type->refCount++;
3452 }
3453 return 1;
3454 }
3455
3456 static unsigned int IntDec(struct Expression * exp, struct Operand * op1)
3457 {
3458 exp->type = 2;
3459 exp->__anon1.__anon2.string = PrintInt((--op1->__anon1.i));
3460 if(!exp->expType)
3461 {
3462 exp->expType = op1->type;
3463 if(op1->type)
3464 op1->type->refCount++;
3465 }
3466 return 1;
3467 }
3468
3469 static unsigned int UIntDec(struct Expression * exp, struct Operand * op1)
3470 {
3471 exp->type = 2;
3472 exp->__anon1.__anon2.string = PrintUInt((--op1->__anon1.ui));
3473 if(!exp->expType)
3474 {
3475 exp->expType = op1->type;
3476 if(op1->type)
3477 op1->type->refCount++;
3478 }
3479 return 1;
3480 }
3481
3482 static unsigned int Int64Dec(struct Expression * exp, struct Operand * op1)
3483 {
3484 exp->type = 2;
3485 exp->__anon1.__anon2.string = PrintInt64((--op1->__anon1.i64));
3486 if(!exp->expType)
3487 {
3488 exp->expType = op1->type;
3489 if(op1->type)
3490 op1->type->refCount++;
3491 }
3492 return 1;
3493 }
3494
3495 static unsigned int UInt64Dec(struct Expression * exp, struct Operand * op1)
3496 {
3497 exp->type = 2;
3498 exp->__anon1.__anon2.string = PrintUInt64((--op1->__anon1.ui64));
3499 if(!exp->expType)
3500 {
3501 exp->expType = op1->type;
3502 if(op1->type)
3503 op1->type->refCount++;
3504 }
3505 return 1;
3506 }
3507
3508 static unsigned int ShortDec(struct Expression * exp, struct Operand * op1)
3509 {
3510 exp->type = 2;
3511 exp->__anon1.__anon2.string = PrintShort((--op1->__anon1.s));
3512 if(!exp->expType)
3513 {
3514 exp->expType = op1->type;
3515 if(op1->type)
3516 op1->type->refCount++;
3517 }
3518 return 1;
3519 }
3520
3521 static unsigned int UShortDec(struct Expression * exp, struct Operand * op1)
3522 {
3523 exp->type = 2;
3524 exp->__anon1.__anon2.string = PrintUShort((--op1->__anon1.us));
3525 if(!exp->expType)
3526 {
3527 exp->expType = op1->type;
3528 if(op1->type)
3529 op1->type->refCount++;
3530 }
3531 return 1;
3532 }
3533
3534 static unsigned int CharDec(struct Expression * exp, struct Operand * op1)
3535 {
3536 exp->type = 2;
3537 exp->__anon1.__anon2.string = PrintChar((--op1->__anon1.c));
3538 if(!exp->expType)
3539 {
3540 exp->expType = op1->type;
3541 if(op1->type)
3542 op1->type->refCount++;
3543 }
3544 return 1;
3545 }
3546
3547 static unsigned int UCharDec(struct Expression * exp, struct Operand * op1)
3548 {
3549 exp->type = 2;
3550 exp->__anon1.__anon2.string = PrintUChar((--op1->__anon1.uc));
3551 if(!exp->expType)
3552 {
3553 exp->expType = op1->type;
3554 if(op1->type)
3555 op1->type->refCount++;
3556 }
3557 return 1;
3558 }
3559
3560 static unsigned int FloatDec(struct Expression * exp, struct Operand * op1)
3561 {
3562 exp->type = 2;
3563 exp->__anon1.__anon2.string = PrintFloat((float)(--op1->__anon1.f));
3564 if(!exp->expType)
3565 {
3566 exp->expType = op1->type;
3567 if(op1->type)
3568 op1->type->refCount++;
3569 }
3570 return 1;
3571 }
3572
3573 static unsigned int DoubleDec(struct Expression * exp, struct Operand * op1)
3574 {
3575 exp->type = 2;
3576 exp->__anon1.__anon2.string = PrintDouble((double)(--op1->__anon1.d));
3577 if(!exp->expType)
3578 {
3579 exp->expType = op1->type;
3580 if(op1->type)
3581 op1->type->refCount++;
3582 }
3583 return 1;
3584 }
3585
3586 static unsigned int IntAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3587 {
3588 int value2 = op2->__anon1.i;
3589
3590 exp->type = 2;
3591 exp->__anon1.__anon2.string = PrintInt((op1->__anon1.i = value2));
3592 if(!exp->expType)
3593 {
3594 exp->expType = op1->type;
3595 if(op1->type)
3596 op1->type->refCount++;
3597 }
3598 return 1;
3599 }
3600
3601 static unsigned int UIntAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3602 {
3603 unsigned int value2 = op2->__anon1.ui;
3604
3605 exp->type = 2;
3606 exp->__anon1.__anon2.string = PrintUInt((op1->__anon1.ui = value2));
3607 if(!exp->expType)
3608 {
3609 exp->expType = op1->type;
3610 if(op1->type)
3611 op1->type->refCount++;
3612 }
3613 return 1;
3614 }
3615
3616 static unsigned int Int64Asign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3617 {
3618 long long value2 = op2->__anon1.i64;
3619
3620 exp->type = 2;
3621 exp->__anon1.__anon2.string = PrintInt64((op1->__anon1.i64 = value2));
3622 if(!exp->expType)
3623 {
3624 exp->expType = op1->type;
3625 if(op1->type)
3626 op1->type->refCount++;
3627 }
3628 return 1;
3629 }
3630
3631 static unsigned int UInt64Asign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3632 {
3633 uint64 value2 = op2->__anon1.ui64;
3634
3635 exp->type = 2;
3636 exp->__anon1.__anon2.string = PrintUInt64((op1->__anon1.ui64 = value2));
3637 if(!exp->expType)
3638 {
3639 exp->expType = op1->type;
3640 if(op1->type)
3641 op1->type->refCount++;
3642 }
3643 return 1;
3644 }
3645
3646 static unsigned int ShortAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3647 {
3648 short value2 = op2->__anon1.s;
3649
3650 exp->type = 2;
3651 exp->__anon1.__anon2.string = PrintShort((op1->__anon1.s = value2));
3652 if(!exp->expType)
3653 {
3654 exp->expType = op1->type;
3655 if(op1->type)
3656 op1->type->refCount++;
3657 }
3658 return 1;
3659 }
3660
3661 static unsigned int UShortAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3662 {
3663 unsigned short value2 = op2->__anon1.us;
3664
3665 exp->type = 2;
3666 exp->__anon1.__anon2.string = PrintUShort((op1->__anon1.us = value2));
3667 if(!exp->expType)
3668 {
3669 exp->expType = op1->type;
3670 if(op1->type)
3671 op1->type->refCount++;
3672 }
3673 return 1;
3674 }
3675
3676 static unsigned int CharAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3677 {
3678 char value2 = op2->__anon1.c;
3679
3680 exp->type = 2;
3681 exp->__anon1.__anon2.string = PrintChar((op1->__anon1.c = value2));
3682 if(!exp->expType)
3683 {
3684 exp->expType = op1->type;
3685 if(op1->type)
3686 op1->type->refCount++;
3687 }
3688 return 1;
3689 }
3690
3691 static unsigned int UCharAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3692 {
3693 unsigned char value2 = op2->__anon1.uc;
3694
3695 exp->type = 2;
3696 exp->__anon1.__anon2.string = PrintUChar((op1->__anon1.uc = value2));
3697 if(!exp->expType)
3698 {
3699 exp->expType = op1->type;
3700 if(op1->type)
3701 op1->type->refCount++;
3702 }
3703 return 1;
3704 }
3705
3706 static unsigned int FloatAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3707 {
3708 float value2 = op2->__anon1.f;
3709
3710 exp->type = 2;
3711 exp->__anon1.__anon2.string = PrintFloat((float)(op1->__anon1.f = value2));
3712 if(!exp->expType)
3713 {
3714 exp->expType = op1->type;
3715 if(op1->type)
3716 op1->type->refCount++;
3717 }
3718 return 1;
3719 }
3720
3721 static unsigned int DoubleAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3722 {
3723 double value2 = op2->__anon1.d;
3724
3725 exp->type = 2;
3726 exp->__anon1.__anon2.string = PrintDouble((double)(op1->__anon1.d = value2));
3727 if(!exp->expType)
3728 {
3729 exp->expType = op1->type;
3730 if(op1->type)
3731 op1->type->refCount++;
3732 }
3733 return 1;
3734 }
3735
3736 static unsigned int IntAddAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3737 {
3738 int value2 = op2->__anon1.i;
3739
3740 exp->type = 2;
3741 exp->__anon1.__anon2.string = PrintInt((op1->__anon1.i += value2));
3742 if(!exp->expType)
3743 {
3744 exp->expType = op1->type;
3745 if(op1->type)
3746 op1->type->refCount++;
3747 }
3748 return 1;
3749 }
3750
3751 static unsigned int UIntAddAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3752 {
3753 unsigned int value2 = op2->__anon1.ui;
3754
3755 exp->type = 2;
3756 exp->__anon1.__anon2.string = PrintUInt((op1->__anon1.ui += value2));
3757 if(!exp->expType)
3758 {
3759 exp->expType = op1->type;
3760 if(op1->type)
3761 op1->type->refCount++;
3762 }
3763 return 1;
3764 }
3765
3766 static unsigned int Int64AddAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3767 {
3768 long long value2 = op2->__anon1.i64;
3769
3770 exp->type = 2;
3771 exp->__anon1.__anon2.string = PrintInt64((op1->__anon1.i64 += value2));
3772 if(!exp->expType)
3773 {
3774 exp->expType = op1->type;
3775 if(op1->type)
3776 op1->type->refCount++;
3777 }
3778 return 1;
3779 }
3780
3781 static unsigned int UInt64AddAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3782 {
3783 uint64 value2 = op2->__anon1.ui64;
3784
3785 exp->type = 2;
3786 exp->__anon1.__anon2.string = PrintUInt64((op1->__anon1.ui64 += value2));
3787 if(!exp->expType)
3788 {
3789 exp->expType = op1->type;
3790 if(op1->type)
3791 op1->type->refCount++;
3792 }
3793 return 1;
3794 }
3795
3796 static unsigned int ShortAddAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3797 {
3798 short value2 = op2->__anon1.s;
3799
3800 exp->type = 2;
3801 exp->__anon1.__anon2.string = PrintShort((op1->__anon1.s += value2));
3802 if(!exp->expType)
3803 {
3804 exp->expType = op1->type;
3805 if(op1->type)
3806 op1->type->refCount++;
3807 }
3808 return 1;
3809 }
3810
3811 static unsigned int UShortAddAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3812 {
3813 unsigned short value2 = op2->__anon1.us;
3814
3815 exp->type = 2;
3816 exp->__anon1.__anon2.string = PrintUShort((op1->__anon1.us += value2));
3817 if(!exp->expType)
3818 {
3819 exp->expType = op1->type;
3820 if(op1->type)
3821 op1->type->refCount++;
3822 }
3823 return 1;
3824 }
3825
3826 static unsigned int CharAddAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3827 {
3828 char value2 = op2->__anon1.c;
3829
3830 exp->type = 2;
3831 exp->__anon1.__anon2.string = PrintChar((op1->__anon1.c += value2));
3832 if(!exp->expType)
3833 {
3834 exp->expType = op1->type;
3835 if(op1->type)
3836 op1->type->refCount++;
3837 }
3838 return 1;
3839 }
3840
3841 static unsigned int UCharAddAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3842 {
3843 unsigned char value2 = op2->__anon1.uc;
3844
3845 exp->type = 2;
3846 exp->__anon1.__anon2.string = PrintUChar((op1->__anon1.uc += value2));
3847 if(!exp->expType)
3848 {
3849 exp->expType = op1->type;
3850 if(op1->type)
3851 op1->type->refCount++;
3852 }
3853 return 1;
3854 }
3855
3856 static unsigned int FloatAddAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3857 {
3858 float value2 = op2->__anon1.f;
3859
3860 exp->type = 2;
3861 exp->__anon1.__anon2.string = PrintFloat((float)(op1->__anon1.f += value2));
3862 if(!exp->expType)
3863 {
3864 exp->expType = op1->type;
3865 if(op1->type)
3866 op1->type->refCount++;
3867 }
3868 return 1;
3869 }
3870
3871 static unsigned int DoubleAddAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3872 {
3873 double value2 = op2->__anon1.d;
3874
3875 exp->type = 2;
3876 exp->__anon1.__anon2.string = PrintDouble((double)(op1->__anon1.d += value2));
3877 if(!exp->expType)
3878 {
3879 exp->expType = op1->type;
3880 if(op1->type)
3881 op1->type->refCount++;
3882 }
3883 return 1;
3884 }
3885
3886 static unsigned int IntSubAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3887 {
3888 int value2 = op2->__anon1.i;
3889
3890 exp->type = 2;
3891 exp->__anon1.__anon2.string = PrintInt((op1->__anon1.i -= value2));
3892 if(!exp->expType)
3893 {
3894 exp->expType = op1->type;
3895 if(op1->type)
3896 op1->type->refCount++;
3897 }
3898 return 1;
3899 }
3900
3901 static unsigned int UIntSubAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3902 {
3903 unsigned int value2 = op2->__anon1.ui;
3904
3905 exp->type = 2;
3906 exp->__anon1.__anon2.string = PrintUInt((op1->__anon1.ui -= value2));
3907 if(!exp->expType)
3908 {
3909 exp->expType = op1->type;
3910 if(op1->type)
3911 op1->type->refCount++;
3912 }
3913 return 1;
3914 }
3915
3916 static unsigned int Int64SubAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3917 {
3918 long long value2 = op2->__anon1.i64;
3919
3920 exp->type = 2;
3921 exp->__anon1.__anon2.string = PrintInt64((op1->__anon1.i64 -= value2));
3922 if(!exp->expType)
3923 {
3924 exp->expType = op1->type;
3925 if(op1->type)
3926 op1->type->refCount++;
3927 }
3928 return 1;
3929 }
3930
3931 static unsigned int UInt64SubAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3932 {
3933 uint64 value2 = op2->__anon1.ui64;
3934
3935 exp->type = 2;
3936 exp->__anon1.__anon2.string = PrintUInt64((op1->__anon1.ui64 -= value2));
3937 if(!exp->expType)
3938 {
3939 exp->expType = op1->type;
3940 if(op1->type)
3941 op1->type->refCount++;
3942 }
3943 return 1;
3944 }
3945
3946 static unsigned int ShortSubAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3947 {
3948 short value2 = op2->__anon1.s;
3949
3950 exp->type = 2;
3951 exp->__anon1.__anon2.string = PrintShort((op1->__anon1.s -= value2));
3952 if(!exp->expType)
3953 {
3954 exp->expType = op1->type;
3955 if(op1->type)
3956 op1->type->refCount++;
3957 }
3958 return 1;
3959 }
3960
3961 static unsigned int UShortSubAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3962 {
3963 unsigned short value2 = op2->__anon1.us;
3964
3965 exp->type = 2;
3966 exp->__anon1.__anon2.string = PrintUShort((op1->__anon1.us -= value2));
3967 if(!exp->expType)
3968 {
3969 exp->expType = op1->type;
3970 if(op1->type)
3971 op1->type->refCount++;
3972 }
3973 return 1;
3974 }
3975
3976 static unsigned int CharSubAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3977 {
3978 char value2 = op2->__anon1.c;
3979
3980 exp->type = 2;
3981 exp->__anon1.__anon2.string = PrintChar((op1->__anon1.c -= value2));
3982 if(!exp->expType)
3983 {
3984 exp->expType = op1->type;
3985 if(op1->type)
3986 op1->type->refCount++;
3987 }
3988 return 1;
3989 }
3990
3991 static unsigned int UCharSubAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3992 {
3993 unsigned char value2 = op2->__anon1.uc;
3994
3995 exp->type = 2;
3996 exp->__anon1.__anon2.string = PrintUChar((op1->__anon1.uc -= value2));
3997 if(!exp->expType)
3998 {
3999 exp->expType = op1->type;
4000 if(op1->type)
4001 op1->type->refCount++;
4002 }
4003 return 1;
4004 }
4005
4006 static unsigned int FloatSubAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4007 {
4008 float value2 = op2->__anon1.f;
4009
4010 exp->type = 2;
4011 exp->__anon1.__anon2.string = PrintFloat((float)(op1->__anon1.f -= value2));
4012 if(!exp->expType)
4013 {
4014 exp->expType = op1->type;
4015 if(op1->type)
4016 op1->type->refCount++;
4017 }
4018 return 1;
4019 }
4020
4021 static unsigned int DoubleSubAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4022 {
4023 double value2 = op2->__anon1.d;
4024
4025 exp->type = 2;
4026 exp->__anon1.__anon2.string = PrintDouble((double)(op1->__anon1.d -= value2));
4027 if(!exp->expType)
4028 {
4029 exp->expType = op1->type;
4030 if(op1->type)
4031 op1->type->refCount++;
4032 }
4033 return 1;
4034 }
4035
4036 static unsigned int IntMulAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4037 {
4038 int value2 = op2->__anon1.i;
4039
4040 exp->type = 2;
4041 exp->__anon1.__anon2.string = PrintInt((op1->__anon1.i *= value2));
4042 if(!exp->expType)
4043 {
4044 exp->expType = op1->type;
4045 if(op1->type)
4046 op1->type->refCount++;
4047 }
4048 return 1;
4049 }
4050
4051 static unsigned int UIntMulAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4052 {
4053 unsigned int value2 = op2->__anon1.ui;
4054
4055 exp->type = 2;
4056 exp->__anon1.__anon2.string = PrintUInt((op1->__anon1.ui *= value2));
4057 if(!exp->expType)
4058 {
4059 exp->expType = op1->type;
4060 if(op1->type)
4061 op1->type->refCount++;
4062 }
4063 return 1;
4064 }
4065
4066 static unsigned int Int64MulAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4067 {
4068 long long value2 = op2->__anon1.i64;
4069
4070 exp->type = 2;
4071 exp->__anon1.__anon2.string = PrintInt64((op1->__anon1.i64 *= value2));
4072 if(!exp->expType)
4073 {
4074 exp->expType = op1->type;
4075 if(op1->type)
4076 op1->type->refCount++;
4077 }
4078 return 1;
4079 }
4080
4081 static unsigned int UInt64MulAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4082 {
4083 uint64 value2 = op2->__anon1.ui64;
4084
4085 exp->type = 2;
4086 exp->__anon1.__anon2.string = PrintUInt64((op1->__anon1.ui64 *= value2));
4087 if(!exp->expType)
4088 {
4089 exp->expType = op1->type;
4090 if(op1->type)
4091 op1->type->refCount++;
4092 }
4093 return 1;
4094 }
4095
4096 static unsigned int ShortMulAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4097 {
4098 short value2 = op2->__anon1.s;
4099
4100 exp->type = 2;
4101 exp->__anon1.__anon2.string = PrintShort((op1->__anon1.s *= value2));
4102 if(!exp->expType)
4103 {
4104 exp->expType = op1->type;
4105 if(op1->type)
4106 op1->type->refCount++;
4107 }
4108 return 1;
4109 }
4110
4111 static unsigned int UShortMulAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4112 {
4113 unsigned short value2 = op2->__anon1.us;
4114
4115 exp->type = 2;
4116 exp->__anon1.__anon2.string = PrintUShort((op1->__anon1.us *= value2));
4117 if(!exp->expType)
4118 {
4119 exp->expType = op1->type;
4120 if(op1->type)
4121 op1->type->refCount++;
4122 }
4123 return 1;
4124 }
4125
4126 static unsigned int CharMulAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4127 {
4128 char value2 = op2->__anon1.c;
4129
4130 exp->type = 2;
4131 exp->__anon1.__anon2.string = PrintChar((op1->__anon1.c *= value2));
4132 if(!exp->expType)
4133 {
4134 exp->expType = op1->type;
4135 if(op1->type)
4136 op1->type->refCount++;
4137 }
4138 return 1;
4139 }
4140
4141 static unsigned int UCharMulAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4142 {
4143 unsigned char value2 = op2->__anon1.uc;
4144
4145 exp->type = 2;
4146 exp->__anon1.__anon2.string = PrintUChar((op1->__anon1.uc *= value2));
4147 if(!exp->expType)
4148 {
4149 exp->expType = op1->type;
4150 if(op1->type)
4151 op1->type->refCount++;
4152 }
4153 return 1;
4154 }
4155
4156 static unsigned int FloatMulAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4157 {
4158 float value2 = op2->__anon1.f;
4159
4160 exp->type = 2;
4161 exp->__anon1.__anon2.string = PrintFloat((float)(op1->__anon1.f *= value2));
4162 if(!exp->expType)
4163 {
4164 exp->expType = op1->type;
4165 if(op1->type)
4166 op1->type->refCount++;
4167 }
4168 return 1;
4169 }
4170
4171 static unsigned int DoubleMulAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4172 {
4173 double value2 = op2->__anon1.d;
4174
4175 exp->type = 2;
4176 exp->__anon1.__anon2.string = PrintDouble((double)(op1->__anon1.d *= value2));
4177 if(!exp->expType)
4178 {
4179 exp->expType = op1->type;
4180 if(op1->type)
4181 op1->type->refCount++;
4182 }
4183 return 1;
4184 }
4185
4186 static unsigned int IntDivAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4187 {
4188 int value2 = op2->__anon1.i;
4189
4190 exp->type = 2;
4191 exp->__anon1.__anon2.string = PrintInt(value2 ? ((op1->__anon1.i /= value2)) : 0);
4192 if(!exp->expType)
4193 {
4194 exp->expType = op1->type;
4195 if(op1->type)
4196 op1->type->refCount++;
4197 }
4198 return 1;
4199 }
4200
4201 static unsigned int UIntDivAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4202 {
4203 unsigned int value2 = op2->__anon1.ui;
4204
4205 exp->type = 2;
4206 exp->__anon1.__anon2.string = PrintUInt(value2 ? ((op1->__anon1.ui /= value2)) : 0);
4207 if(!exp->expType)
4208 {
4209 exp->expType = op1->type;
4210 if(op1->type)
4211 op1->type->refCount++;
4212 }
4213 return 1;
4214 }
4215
4216 static unsigned int Int64DivAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4217 {
4218 long long value2 = op2->__anon1.i64;
4219
4220 exp->type = 2;
4221 exp->__anon1.__anon2.string = PrintInt64(value2 ? ((op1->__anon1.i64 /= value2)) : 0);
4222 if(!exp->expType)
4223 {
4224 exp->expType = op1->type;
4225 if(op1->type)
4226 op1->type->refCount++;
4227 }
4228 return 1;
4229 }
4230
4231 static unsigned int UInt64DivAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4232 {
4233 uint64 value2 = op2->__anon1.ui64;
4234
4235 exp->type = 2;
4236 exp->__anon1.__anon2.string = PrintUInt64(value2 ? ((op1->__anon1.ui64 /= value2)) : 0);
4237 if(!exp->expType)
4238 {
4239 exp->expType = op1->type;
4240 if(op1->type)
4241 op1->type->refCount++;
4242 }
4243 return 1;
4244 }
4245
4246 static unsigned int ShortDivAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4247 {
4248 short value2 = op2->__anon1.s;
4249
4250 exp->type = 2;
4251 exp->__anon1.__anon2.string = PrintShort(value2 ? ((op1->__anon1.s /= value2)) : 0);
4252 if(!exp->expType)
4253 {
4254 exp->expType = op1->type;
4255 if(op1->type)
4256 op1->type->refCount++;
4257 }
4258 return 1;
4259 }
4260
4261 static unsigned int UShortDivAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4262 {
4263 unsigned short value2 = op2->__anon1.us;
4264
4265 exp->type = 2;
4266 exp->__anon1.__anon2.string = PrintUShort(value2 ? ((op1->__anon1.us /= value2)) : 0);
4267 if(!exp->expType)
4268 {
4269 exp->expType = op1->type;
4270 if(op1->type)
4271 op1->type->refCount++;
4272 }
4273 return 1;
4274 }
4275
4276 static unsigned int CharDivAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4277 {
4278 char value2 = op2->__anon1.c;
4279
4280 exp->type = 2;
4281 exp->__anon1.__anon2.string = PrintChar(value2 ? ((op1->__anon1.c /= value2)) : 0);
4282 if(!exp->expType)
4283 {
4284 exp->expType = op1->type;
4285 if(op1->type)
4286 op1->type->refCount++;
4287 }
4288 return 1;
4289 }
4290
4291 static unsigned int UCharDivAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4292 {
4293 unsigned char value2 = op2->__anon1.uc;
4294
4295 exp->type = 2;
4296 exp->__anon1.__anon2.string = PrintUChar(value2 ? ((op1->__anon1.uc /= value2)) : 0);
4297 if(!exp->expType)
4298 {
4299 exp->expType = op1->type;
4300 if(op1->type)
4301 op1->type->refCount++;
4302 }
4303 return 1;
4304 }
4305
4306 static unsigned int FloatDivAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4307 {
4308 float value2 = op2->__anon1.f;
4309
4310 exp->type = 2;
4311 exp->__anon1.__anon2.string = PrintFloat((float)(op1->__anon1.f /= value2));
4312 if(!exp->expType)
4313 {
4314 exp->expType = op1->type;
4315 if(op1->type)
4316 op1->type->refCount++;
4317 }
4318 return 1;
4319 }
4320
4321 static unsigned int DoubleDivAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4322 {
4323 double value2 = op2->__anon1.d;
4324
4325 exp->type = 2;
4326 exp->__anon1.__anon2.string = PrintDouble((double)(op1->__anon1.d /= value2));
4327 if(!exp->expType)
4328 {
4329 exp->expType = op1->type;
4330 if(op1->type)
4331 op1->type->refCount++;
4332 }
4333 return 1;
4334 }
4335
4336 static unsigned int IntModAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4337 {
4338 int value2 = op2->__anon1.i;
4339
4340 exp->type = 2;
4341 exp->__anon1.__anon2.string = PrintInt(value2 ? ((op1->__anon1.i %= value2)) : 0);
4342 if(!exp->expType)
4343 {
4344 exp->expType = op1->type;
4345 if(op1->type)
4346 op1->type->refCount++;
4347 }
4348 return 1;
4349 }
4350
4351 static unsigned int UIntModAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4352 {
4353 unsigned int value2 = op2->__anon1.ui;
4354
4355 exp->type = 2;
4356 exp->__anon1.__anon2.string = PrintUInt(value2 ? ((op1->__anon1.ui %= value2)) : 0);
4357 if(!exp->expType)
4358 {
4359 exp->expType = op1->type;
4360 if(op1->type)
4361 op1->type->refCount++;
4362 }
4363 return 1;
4364 }
4365
4366 static unsigned int Int64ModAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4367 {
4368 long long value2 = op2->__anon1.i64;
4369
4370 exp->type = 2;
4371 exp->__anon1.__anon2.string = PrintInt64(value2 ? ((op1->__anon1.i64 %= value2)) : 0);
4372 if(!exp->expType)
4373 {
4374 exp->expType = op1->type;
4375 if(op1->type)
4376 op1->type->refCount++;
4377 }
4378 return 1;
4379 }
4380
4381 static unsigned int UInt64ModAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4382 {
4383 uint64 value2 = op2->__anon1.ui64;
4384
4385 exp->type = 2;
4386 exp->__anon1.__anon2.string = PrintUInt64(value2 ? ((op1->__anon1.ui64 %= value2)) : 0);
4387 if(!exp->expType)
4388 {
4389 exp->expType = op1->type;
4390 if(op1->type)
4391 op1->type->refCount++;
4392 }
4393 return 1;
4394 }
4395
4396 static unsigned int ShortModAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4397 {
4398 short value2 = op2->__anon1.s;
4399
4400 exp->type = 2;
4401 exp->__anon1.__anon2.string = PrintShort(value2 ? ((op1->__anon1.s %= value2)) : 0);
4402 if(!exp->expType)
4403 {
4404 exp->expType = op1->type;
4405 if(op1->type)
4406 op1->type->refCount++;
4407 }
4408 return 1;
4409 }
4410
4411 static unsigned int UShortModAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4412 {
4413 unsigned short value2 = op2->__anon1.us;
4414
4415 exp->type = 2;
4416 exp->__anon1.__anon2.string = PrintUShort(value2 ? ((op1->__anon1.us %= value2)) : 0);
4417 if(!exp->expType)
4418 {
4419 exp->expType = op1->type;
4420 if(op1->type)
4421 op1->type->refCount++;
4422 }
4423 return 1;
4424 }
4425
4426 static unsigned int CharModAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4427 {
4428 char value2 = op2->__anon1.c;
4429
4430 exp->type = 2;
4431 exp->__anon1.__anon2.string = PrintChar(value2 ? ((op1->__anon1.c %= value2)) : 0);
4432 if(!exp->expType)
4433 {
4434 exp->expType = op1->type;
4435 if(op1->type)
4436 op1->type->refCount++;
4437 }
4438 return 1;
4439 }
4440
4441 static unsigned int UCharModAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4442 {
4443 unsigned char value2 = op2->__anon1.uc;
4444
4445 exp->type = 2;
4446 exp->__anon1.__anon2.string = PrintUChar(value2 ? ((op1->__anon1.uc %= value2)) : 0);
4447 if(!exp->expType)
4448 {
4449 exp->expType = op1->type;
4450 if(op1->type)
4451 op1->type->refCount++;
4452 }
4453 return 1;
4454 }
4455
4456 static unsigned int IntBitAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4457 {
4458 int value2 = op2->__anon1.i;
4459
4460 exp->type = 2;
4461 exp->__anon1.__anon2.string = PrintInt((op1->__anon1.i & value2));
4462 if(!exp->expType)
4463 {
4464 exp->expType = op1->type;
4465 if(op1->type)
4466 op1->type->refCount++;
4467 }
4468 return 1;
4469 }
4470
4471 static unsigned int UIntBitAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4472 {
4473 unsigned int value2 = op2->__anon1.ui;
4474
4475 exp->type = 2;
4476 exp->__anon1.__anon2.string = PrintUInt((op1->__anon1.ui & value2));
4477 if(!exp->expType)
4478 {
4479 exp->expType = op1->type;
4480 if(op1->type)
4481 op1->type->refCount++;
4482 }
4483 return 1;
4484 }
4485
4486 static unsigned int Int64BitAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4487 {
4488 long long value2 = op2->__anon1.i64;
4489
4490 exp->type = 2;
4491 exp->__anon1.__anon2.string = PrintInt64((op1->__anon1.i64 & value2));
4492 if(!exp->expType)
4493 {
4494 exp->expType = op1->type;
4495 if(op1->type)
4496 op1->type->refCount++;
4497 }
4498 return 1;
4499 }
4500
4501 static unsigned int UInt64BitAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4502 {
4503 uint64 value2 = op2->__anon1.ui64;
4504
4505 exp->type = 2;
4506 exp->__anon1.__anon2.string = PrintUInt64((op1->__anon1.ui64 & value2));
4507 if(!exp->expType)
4508 {
4509 exp->expType = op1->type;
4510 if(op1->type)
4511 op1->type->refCount++;
4512 }
4513 return 1;
4514 }
4515
4516 static unsigned int ShortBitAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4517 {
4518 short value2 = op2->__anon1.s;
4519
4520 exp->type = 2;
4521 exp->__anon1.__anon2.string = PrintShort((short)(op1->__anon1.s & value2));
4522 if(!exp->expType)
4523 {
4524 exp->expType = op1->type;
4525 if(op1->type)
4526 op1->type->refCount++;
4527 }
4528 return 1;
4529 }
4530
4531 static unsigned int UShortBitAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4532 {
4533 unsigned short value2 = op2->__anon1.us;
4534
4535 exp->type = 2;
4536 exp->__anon1.__anon2.string = PrintUShort((unsigned short)(op1->__anon1.us & value2));
4537 if(!exp->expType)
4538 {
4539 exp->expType = op1->type;
4540 if(op1->type)
4541 op1->type->refCount++;
4542 }
4543 return 1;
4544 }
4545
4546 static unsigned int CharBitAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4547 {
4548 char value2 = op2->__anon1.c;
4549
4550 exp->type = 2;
4551 exp->__anon1.__anon2.string = PrintChar((char)(op1->__anon1.c & value2));
4552 if(!exp->expType)
4553 {
4554 exp->expType = op1->type;
4555 if(op1->type)
4556 op1->type->refCount++;
4557 }
4558 return 1;
4559 }
4560
4561 static unsigned int UCharBitAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4562 {
4563 unsigned char value2 = op2->__anon1.uc;
4564
4565 exp->type = 2;
4566 exp->__anon1.__anon2.string = PrintUChar((unsigned char)(op1->__anon1.uc & value2));
4567 if(!exp->expType)
4568 {
4569 exp->expType = op1->type;
4570 if(op1->type)
4571 op1->type->refCount++;
4572 }
4573 return 1;
4574 }
4575
4576 static unsigned int IntBitOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4577 {
4578 int value2 = op2->__anon1.i;
4579
4580 exp->type = 2;
4581 exp->__anon1.__anon2.string = PrintInt((op1->__anon1.i | value2));
4582 if(!exp->expType)
4583 {
4584 exp->expType = op1->type;
4585 if(op1->type)
4586 op1->type->refCount++;
4587 }
4588 return 1;
4589 }
4590
4591 static unsigned int UIntBitOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4592 {
4593 unsigned int value2 = op2->__anon1.ui;
4594
4595 exp->type = 2;
4596 exp->__anon1.__anon2.string = PrintUInt((op1->__anon1.ui | value2));
4597 if(!exp->expType)
4598 {
4599 exp->expType = op1->type;
4600 if(op1->type)
4601 op1->type->refCount++;
4602 }
4603 return 1;
4604 }
4605
4606 static unsigned int Int64BitOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4607 {
4608 long long value2 = op2->__anon1.i64;
4609
4610 exp->type = 2;
4611 exp->__anon1.__anon2.string = PrintInt64((op1->__anon1.i64 | value2));
4612 if(!exp->expType)
4613 {
4614 exp->expType = op1->type;
4615 if(op1->type)
4616 op1->type->refCount++;
4617 }
4618 return 1;
4619 }
4620
4621 static unsigned int UInt64BitOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4622 {
4623 uint64 value2 = op2->__anon1.ui64;
4624
4625 exp->type = 2;
4626 exp->__anon1.__anon2.string = PrintUInt64((op1->__anon1.ui64 | value2));
4627 if(!exp->expType)
4628 {
4629 exp->expType = op1->type;
4630 if(op1->type)
4631 op1->type->refCount++;
4632 }
4633 return 1;
4634 }
4635
4636 static unsigned int ShortBitOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4637 {
4638 short value2 = op2->__anon1.s;
4639
4640 exp->type = 2;
4641 exp->__anon1.__anon2.string = PrintShort((short)(op1->__anon1.s | value2));
4642 if(!exp->expType)
4643 {
4644 exp->expType = op1->type;
4645 if(op1->type)
4646 op1->type->refCount++;
4647 }
4648 return 1;
4649 }
4650
4651 static unsigned int UShortBitOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4652 {
4653 unsigned short value2 = op2->__anon1.us;
4654
4655 exp->type = 2;
4656 exp->__anon1.__anon2.string = PrintUShort((unsigned short)(op1->__anon1.us | value2));
4657 if(!exp->expType)
4658 {
4659 exp->expType = op1->type;
4660 if(op1->type)
4661 op1->type->refCount++;
4662 }
4663 return 1;
4664 }
4665
4666 static unsigned int CharBitOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4667 {
4668 char value2 = op2->__anon1.c;
4669
4670 exp->type = 2;
4671 exp->__anon1.__anon2.string = PrintChar((char)(op1->__anon1.c | value2));
4672 if(!exp->expType)
4673 {
4674 exp->expType = op1->type;
4675 if(op1->type)
4676 op1->type->refCount++;
4677 }
4678 return 1;
4679 }
4680
4681 static unsigned int UCharBitOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4682 {
4683 unsigned char value2 = op2->__anon1.uc;
4684
4685 exp->type = 2;
4686 exp->__anon1.__anon2.string = PrintUChar((unsigned char)(op1->__anon1.uc | value2));
4687 if(!exp->expType)
4688 {
4689 exp->expType = op1->type;
4690 if(op1->type)
4691 op1->type->refCount++;
4692 }
4693 return 1;
4694 }
4695
4696 static unsigned int IntBitXor(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4697 {
4698 int value2 = op2->__anon1.i;
4699
4700 exp->type = 2;
4701 exp->__anon1.__anon2.string = PrintInt((op1->__anon1.i ^ value2));
4702 if(!exp->expType)
4703 {
4704 exp->expType = op1->type;
4705 if(op1->type)
4706 op1->type->refCount++;
4707 }
4708 return 1;
4709 }
4710
4711 static unsigned int UIntBitXor(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4712 {
4713 unsigned int value2 = op2->__anon1.ui;
4714
4715 exp->type = 2;
4716 exp->__anon1.__anon2.string = PrintUInt((op1->__anon1.ui ^ value2));
4717 if(!exp->expType)
4718 {
4719 exp->expType = op1->type;
4720 if(op1->type)
4721 op1->type->refCount++;
4722 }
4723 return 1;
4724 }
4725
4726 static unsigned int Int64BitXor(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4727 {
4728 long long value2 = op2->__anon1.i64;
4729
4730 exp->type = 2;
4731 exp->__anon1.__anon2.string = PrintInt64((op1->__anon1.i64 ^ value2));
4732 if(!exp->expType)
4733 {
4734 exp->expType = op1->type;
4735 if(op1->type)
4736 op1->type->refCount++;
4737 }
4738 return 1;
4739 }
4740
4741 static unsigned int UInt64BitXor(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4742 {
4743 uint64 value2 = op2->__anon1.ui64;
4744
4745 exp->type = 2;
4746 exp->__anon1.__anon2.string = PrintUInt64((op1->__anon1.ui64 ^ value2));
4747 if(!exp->expType)
4748 {
4749 exp->expType = op1->type;
4750 if(op1->type)
4751 op1->type->refCount++;
4752 }
4753 return 1;
4754 }
4755
4756 static unsigned int ShortBitXor(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4757 {
4758 short value2 = op2->__anon1.s;
4759
4760 exp->type = 2;
4761 exp->__anon1.__anon2.string = PrintShort((short)(op1->__anon1.s ^ value2));
4762 if(!exp->expType)
4763 {
4764 exp->expType = op1->type;
4765 if(op1->type)
4766 op1->type->refCount++;
4767 }
4768 return 1;
4769 }
4770
4771 static unsigned int UShortBitXor(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4772 {
4773 unsigned short value2 = op2->__anon1.us;
4774
4775 exp->type = 2;
4776 exp->__anon1.__anon2.string = PrintUShort((unsigned short)(op1->__anon1.us ^ value2));
4777 if(!exp->expType)
4778 {
4779 exp->expType = op1->type;
4780 if(op1->type)
4781 op1->type->refCount++;
4782 }
4783 return 1;
4784 }
4785
4786 static unsigned int CharBitXor(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4787 {
4788 char value2 = op2->__anon1.c;
4789
4790 exp->type = 2;
4791 exp->__anon1.__anon2.string = PrintChar((char)(op1->__anon1.c ^ value2));
4792 if(!exp->expType)
4793 {
4794 exp->expType = op1->type;
4795 if(op1->type)
4796 op1->type->refCount++;
4797 }
4798 return 1;
4799 }
4800
4801 static unsigned int UCharBitXor(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4802 {
4803 unsigned char value2 = op2->__anon1.uc;
4804
4805 exp->type = 2;
4806 exp->__anon1.__anon2.string = PrintUChar((unsigned char)(op1->__anon1.uc ^ value2));
4807 if(!exp->expType)
4808 {
4809 exp->expType = op1->type;
4810 if(op1->type)
4811 op1->type->refCount++;
4812 }
4813 return 1;
4814 }
4815
4816 static unsigned int IntLShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4817 {
4818 int value2 = op2->__anon1.i;
4819
4820 exp->type = 2;
4821 exp->__anon1.__anon2.string = PrintInt((op1->__anon1.i << value2));
4822 if(!exp->expType)
4823 {
4824 exp->expType = op1->type;
4825 if(op1->type)
4826 op1->type->refCount++;
4827 }
4828 return 1;
4829 }
4830
4831 static unsigned int UIntLShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4832 {
4833 unsigned int value2 = op2->__anon1.ui;
4834
4835 exp->type = 2;
4836 exp->__anon1.__anon2.string = PrintUInt((op1->__anon1.ui << value2));
4837 if(!exp->expType)
4838 {
4839 exp->expType = op1->type;
4840 if(op1->type)
4841 op1->type->refCount++;
4842 }
4843 return 1;
4844 }
4845
4846 static unsigned int Int64LShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4847 {
4848 long long value2 = op2->__anon1.i64;
4849
4850 exp->type = 2;
4851 exp->__anon1.__anon2.string = PrintInt64((op1->__anon1.i64 << value2));
4852 if(!exp->expType)
4853 {
4854 exp->expType = op1->type;
4855 if(op1->type)
4856 op1->type->refCount++;
4857 }
4858 return 1;
4859 }
4860
4861 static unsigned int UInt64LShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4862 {
4863 uint64 value2 = op2->__anon1.ui64;
4864
4865 exp->type = 2;
4866 exp->__anon1.__anon2.string = PrintUInt64((op1->__anon1.ui64 << value2));
4867 if(!exp->expType)
4868 {
4869 exp->expType = op1->type;
4870 if(op1->type)
4871 op1->type->refCount++;
4872 }
4873 return 1;
4874 }
4875
4876 static unsigned int ShortLShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4877 {
4878 short value2 = op2->__anon1.s;
4879
4880 exp->type = 2;
4881 exp->__anon1.__anon2.string = PrintShort((short)(op1->__anon1.s << value2));
4882 if(!exp->expType)
4883 {
4884 exp->expType = op1->type;
4885 if(op1->type)
4886 op1->type->refCount++;
4887 }
4888 return 1;
4889 }
4890
4891 static unsigned int UShortLShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4892 {
4893 unsigned short value2 = op2->__anon1.us;
4894
4895 exp->type = 2;
4896 exp->__anon1.__anon2.string = PrintUShort((unsigned short)(op1->__anon1.us << value2));
4897 if(!exp->expType)
4898 {
4899 exp->expType = op1->type;
4900 if(op1->type)
4901 op1->type->refCount++;
4902 }
4903 return 1;
4904 }
4905
4906 static unsigned int CharLShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4907 {
4908 char value2 = op2->__anon1.c;
4909
4910 exp->type = 2;
4911 exp->__anon1.__anon2.string = PrintChar((char)(op1->__anon1.c << value2));
4912 if(!exp->expType)
4913 {
4914 exp->expType = op1->type;
4915 if(op1->type)
4916 op1->type->refCount++;
4917 }
4918 return 1;
4919 }
4920
4921 static unsigned int UCharLShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4922 {
4923 unsigned char value2 = op2->__anon1.uc;
4924
4925 exp->type = 2;
4926 exp->__anon1.__anon2.string = PrintUChar((unsigned char)(op1->__anon1.uc << value2));
4927 if(!exp->expType)
4928 {
4929 exp->expType = op1->type;
4930 if(op1->type)
4931 op1->type->refCount++;
4932 }
4933 return 1;
4934 }
4935
4936 static unsigned int IntRShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4937 {
4938 int value2 = op2->__anon1.i;
4939
4940 exp->type = 2;
4941 exp->__anon1.__anon2.string = PrintInt((op1->__anon1.i >> value2));
4942 if(!exp->expType)
4943 {
4944 exp->expType = op1->type;
4945 if(op1->type)
4946 op1->type->refCount++;
4947 }
4948 return 1;
4949 }
4950
4951 static unsigned int UIntRShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4952 {
4953 unsigned int value2 = op2->__anon1.ui;
4954
4955 exp->type = 2;
4956 exp->__anon1.__anon2.string = PrintUInt((op1->__anon1.ui >> value2));
4957 if(!exp->expType)
4958 {
4959 exp->expType = op1->type;
4960 if(op1->type)
4961 op1->type->refCount++;
4962 }
4963 return 1;
4964 }
4965
4966 static unsigned int Int64RShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4967 {
4968 long long value2 = op2->__anon1.i64;
4969
4970 exp->type = 2;
4971 exp->__anon1.__anon2.string = PrintInt64((op1->__anon1.i64 >> value2));
4972 if(!exp->expType)
4973 {
4974 exp->expType = op1->type;
4975 if(op1->type)
4976 op1->type->refCount++;
4977 }
4978 return 1;
4979 }
4980
4981 static unsigned int UInt64RShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4982 {
4983 uint64 value2 = op2->__anon1.ui64;
4984
4985 exp->type = 2;
4986 exp->__anon1.__anon2.string = PrintUInt64((op1->__anon1.ui64 >> value2));
4987 if(!exp->expType)
4988 {
4989 exp->expType = op1->type;
4990 if(op1->type)
4991 op1->type->refCount++;
4992 }
4993 return 1;
4994 }
4995
4996 static unsigned int ShortRShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4997 {
4998 short value2 = op2->__anon1.s;
4999
5000 exp->type = 2;
5001 exp->__anon1.__anon2.string = PrintShort((short)(op1->__anon1.s >> value2));
5002 if(!exp->expType)
5003 {
5004 exp->expType = op1->type;
5005 if(op1->type)
5006 op1->type->refCount++;
5007 }
5008 return 1;
5009 }
5010
5011 static unsigned int UShortRShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5012 {
5013 unsigned short value2 = op2->__anon1.us;
5014
5015 exp->type = 2;
5016 exp->__anon1.__anon2.string = PrintUShort((unsigned short)(op1->__anon1.us >> value2));
5017 if(!exp->expType)
5018 {
5019 exp->expType = op1->type;
5020 if(op1->type)
5021 op1->type->refCount++;
5022 }
5023 return 1;
5024 }
5025
5026 static unsigned int CharRShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5027 {
5028 char value2 = op2->__anon1.c;
5029
5030 exp->type = 2;
5031 exp->__anon1.__anon2.string = PrintChar((char)(op1->__anon1.c >> value2));
5032 if(!exp->expType)
5033 {
5034 exp->expType = op1->type;
5035 if(op1->type)
5036 op1->type->refCount++;
5037 }
5038 return 1;
5039 }
5040
5041 static unsigned int UCharRShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5042 {
5043 unsigned char value2 = op2->__anon1.uc;
5044
5045 exp->type = 2;
5046 exp->__anon1.__anon2.string = PrintUChar((unsigned char)(op1->__anon1.uc >> value2));
5047 if(!exp->expType)
5048 {
5049 exp->expType = op1->type;
5050 if(op1->type)
5051 op1->type->refCount++;
5052 }
5053 return 1;
5054 }
5055
5056 static unsigned int IntBitNot(struct Expression * exp, struct Operand * op1)
5057 {
5058 exp->type = 2;
5059 exp->__anon1.__anon2.string = PrintInt((~op1->__anon1.i));
5060 if(!exp->expType)
5061 {
5062 exp->expType = op1->type;
5063 if(op1->type)
5064 op1->type->refCount++;
5065 }
5066 return 1;
5067 }
5068
5069 static unsigned int UIntBitNot(struct Expression * exp, struct Operand * op1)
5070 {
5071 exp->type = 2;
5072 exp->__anon1.__anon2.string = PrintUInt((unsigned int)(~op1->__anon1.ui));
5073 if(!exp->expType)
5074 {
5075 exp->expType = op1->type;
5076 if(op1->type)
5077 op1->type->refCount++;
5078 }
5079 return 1;
5080 }
5081
5082 static unsigned int Int64BitNot(struct Expression * exp, struct Operand * op1)
5083 {
5084 exp->type = 2;
5085 exp->__anon1.__anon2.string = PrintInt64((long long)(~op1->__anon1.i64));
5086 if(!exp->expType)
5087 {
5088 exp->expType = op1->type;
5089 if(op1->type)
5090 op1->type->refCount++;
5091 }
5092 return 1;
5093 }
5094
5095 static unsigned int UInt64BitNot(struct Expression * exp, struct Operand * op1)
5096 {
5097 exp->type = 2;
5098 exp->__anon1.__anon2.string = PrintUInt64((uint64)(~op1->__anon1.ui64));
5099 if(!exp->expType)
5100 {
5101 exp->expType = op1->type;
5102 if(op1->type)
5103 op1->type->refCount++;
5104 }
5105 return 1;
5106 }
5107
5108 static unsigned int ShortBitNot(struct Expression * exp, struct Operand * op1)
5109 {
5110 exp->type = 2;
5111 exp->__anon1.__anon2.string = PrintShort((short)(~op1->__anon1.s));
5112 if(!exp->expType)
5113 {
5114 exp->expType = op1->type;
5115 if(op1->type)
5116 op1->type->refCount++;
5117 }
5118 return 1;
5119 }
5120
5121 static unsigned int UShortBitNot(struct Expression * exp, struct Operand * op1)
5122 {
5123 exp->type = 2;
5124 exp->__anon1.__anon2.string = PrintUShort((unsigned short)(~op1->__anon1.us));
5125 if(!exp->expType)
5126 {
5127 exp->expType = op1->type;
5128 if(op1->type)
5129 op1->type->refCount++;
5130 }
5131 return 1;
5132 }
5133
5134 static unsigned int CharBitNot(struct Expression * exp, struct Operand * op1)
5135 {
5136 exp->type = 2;
5137 exp->__anon1.__anon2.string = PrintChar((char)(~op1->__anon1.c));
5138 if(!exp->expType)
5139 {
5140 exp->expType = op1->type;
5141 if(op1->type)
5142 op1->type->refCount++;
5143 }
5144 return 1;
5145 }
5146
5147 static unsigned int UCharBitNot(struct Expression * exp, struct Operand * op1)
5148 {
5149 exp->type = 2;
5150 exp->__anon1.__anon2.string = PrintUChar((unsigned char)(~op1->__anon1.uc));
5151 if(!exp->expType)
5152 {
5153 exp->expType = op1->type;
5154 if(op1->type)
5155 op1->type->refCount++;
5156 }
5157 return 1;
5158 }
5159
5160 static unsigned int IntAndAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5161 {
5162 int value2 = op2->__anon1.i;
5163
5164 exp->type = 2;
5165 exp->__anon1.__anon2.string = PrintInt((op1->__anon1.i &= value2));
5166 if(!exp->expType)
5167 {
5168 exp->expType = op1->type;
5169 if(op1->type)
5170 op1->type->refCount++;
5171 }
5172 return 1;
5173 }
5174
5175 static unsigned int UIntAndAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5176 {
5177 unsigned int value2 = op2->__anon1.ui;
5178
5179 exp->type = 2;
5180 exp->__anon1.__anon2.string = PrintUInt((op1->__anon1.ui &= value2));
5181 if(!exp->expType)
5182 {
5183 exp->expType = op1->type;
5184 if(op1->type)
5185 op1->type->refCount++;
5186 }
5187 return 1;
5188 }
5189
5190 static unsigned int Int64AndAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5191 {
5192 long long value2 = op2->__anon1.i64;
5193
5194 exp->type = 2;
5195 exp->__anon1.__anon2.string = PrintInt64((op1->__anon1.i64 &= value2));
5196 if(!exp->expType)
5197 {
5198 exp->expType = op1->type;
5199 if(op1->type)
5200 op1->type->refCount++;
5201 }
5202 return 1;
5203 }
5204
5205 static unsigned int UInt64AndAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5206 {
5207 uint64 value2 = op2->__anon1.ui64;
5208
5209 exp->type = 2;
5210 exp->__anon1.__anon2.string = PrintUInt64((op1->__anon1.ui64 &= value2));
5211 if(!exp->expType)
5212 {
5213 exp->expType = op1->type;
5214 if(op1->type)
5215 op1->type->refCount++;
5216 }
5217 return 1;
5218 }
5219
5220 static unsigned int ShortAndAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5221 {
5222 short value2 = op2->__anon1.s;
5223
5224 exp->type = 2;
5225 exp->__anon1.__anon2.string = PrintShort((op1->__anon1.s &= value2));
5226 if(!exp->expType)
5227 {
5228 exp->expType = op1->type;
5229 if(op1->type)
5230 op1->type->refCount++;
5231 }
5232 return 1;
5233 }
5234
5235 static unsigned int UShortAndAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5236 {
5237 unsigned short value2 = op2->__anon1.us;
5238
5239 exp->type = 2;
5240 exp->__anon1.__anon2.string = PrintUShort((op1->__anon1.us &= value2));
5241 if(!exp->expType)
5242 {
5243 exp->expType = op1->type;
5244 if(op1->type)
5245 op1->type->refCount++;
5246 }
5247 return 1;
5248 }
5249
5250 static unsigned int CharAndAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5251 {
5252 char value2 = op2->__anon1.c;
5253
5254 exp->type = 2;
5255 exp->__anon1.__anon2.string = PrintChar((op1->__anon1.c &= value2));
5256 if(!exp->expType)
5257 {
5258 exp->expType = op1->type;
5259 if(op1->type)
5260 op1->type->refCount++;
5261 }
5262 return 1;
5263 }
5264
5265 static unsigned int UCharAndAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5266 {
5267 unsigned char value2 = op2->__anon1.uc;
5268
5269 exp->type = 2;
5270 exp->__anon1.__anon2.string = PrintUChar((op1->__anon1.uc &= value2));
5271 if(!exp->expType)
5272 {
5273 exp->expType = op1->type;
5274 if(op1->type)
5275 op1->type->refCount++;
5276 }
5277 return 1;
5278 }
5279
5280 static unsigned int IntOrAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5281 {
5282 int value2 = op2->__anon1.i;
5283
5284 exp->type = 2;
5285 exp->__anon1.__anon2.string = PrintInt((op1->__anon1.i |= value2));
5286 if(!exp->expType)
5287 {
5288 exp->expType = op1->type;
5289 if(op1->type)
5290 op1->type->refCount++;
5291 }
5292 return 1;
5293 }
5294
5295 static unsigned int UIntOrAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5296 {
5297 unsigned int value2 = op2->__anon1.ui;
5298
5299 exp->type = 2;
5300 exp->__anon1.__anon2.string = PrintUInt((op1->__anon1.ui |= value2));
5301 if(!exp->expType)
5302 {
5303 exp->expType = op1->type;
5304 if(op1->type)
5305 op1->type->refCount++;
5306 }
5307 return 1;
5308 }
5309
5310 static unsigned int Int64OrAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5311 {
5312 long long value2 = op2->__anon1.i64;
5313
5314 exp->type = 2;
5315 exp->__anon1.__anon2.string = PrintInt64((op1->__anon1.i64 |= value2));
5316 if(!exp->expType)
5317 {
5318 exp->expType = op1->type;
5319 if(op1->type)
5320 op1->type->refCount++;
5321 }
5322 return 1;
5323 }
5324
5325 static unsigned int UInt64OrAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5326 {
5327 uint64 value2 = op2->__anon1.ui64;
5328
5329 exp->type = 2;
5330 exp->__anon1.__anon2.string = PrintUInt64((op1->__anon1.ui64 |= value2));
5331 if(!exp->expType)
5332 {
5333 exp->expType = op1->type;
5334 if(op1->type)
5335 op1->type->refCount++;
5336 }
5337 return 1;
5338 }
5339
5340 static unsigned int ShortOrAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5341 {
5342 short value2 = op2->__anon1.s;
5343
5344 exp->type = 2;
5345 exp->__anon1.__anon2.string = PrintShort((op1->__anon1.s |= value2));
5346 if(!exp->expType)
5347 {
5348 exp->expType = op1->type;
5349 if(op1->type)
5350 op1->type->refCount++;
5351 }
5352 return 1;
5353 }
5354
5355 static unsigned int UShortOrAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5356 {
5357 unsigned short value2 = op2->__anon1.us;
5358
5359 exp->type = 2;
5360 exp->__anon1.__anon2.string = PrintUShort((op1->__anon1.us |= value2));
5361 if(!exp->expType)
5362 {
5363 exp->expType = op1->type;
5364 if(op1->type)
5365 op1->type->refCount++;
5366 }
5367 return 1;
5368 }
5369
5370 static unsigned int CharOrAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5371 {
5372 char value2 = op2->__anon1.c;
5373
5374 exp->type = 2;
5375 exp->__anon1.__anon2.string = PrintChar((op1->__anon1.c |= value2));
5376 if(!exp->expType)
5377 {
5378 exp->expType = op1->type;
5379 if(op1->type)
5380 op1->type->refCount++;
5381 }
5382 return 1;
5383 }
5384
5385 static unsigned int UCharOrAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5386 {
5387 unsigned char value2 = op2->__anon1.uc;
5388
5389 exp->type = 2;
5390 exp->__anon1.__anon2.string = PrintUChar((op1->__anon1.uc |= value2));
5391 if(!exp->expType)
5392 {
5393 exp->expType = op1->type;
5394 if(op1->type)
5395 op1->type->refCount++;
5396 }
5397 return 1;
5398 }
5399
5400 static unsigned int IntXorAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5401 {
5402 int value2 = op2->__anon1.i;
5403
5404 exp->type = 2;
5405 exp->__anon1.__anon2.string = PrintInt((op1->__anon1.i ^= value2));
5406 if(!exp->expType)
5407 {
5408 exp->expType = op1->type;
5409 if(op1->type)
5410 op1->type->refCount++;
5411 }
5412 return 1;
5413 }
5414
5415 static unsigned int UIntXorAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5416 {
5417 unsigned int value2 = op2->__anon1.ui;
5418
5419 exp->type = 2;
5420 exp->__anon1.__anon2.string = PrintUInt((op1->__anon1.ui ^= value2));
5421 if(!exp->expType)
5422 {
5423 exp->expType = op1->type;
5424 if(op1->type)
5425 op1->type->refCount++;
5426 }
5427 return 1;
5428 }
5429
5430 static unsigned int Int64XorAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5431 {
5432 long long value2 = op2->__anon1.i64;
5433
5434 exp->type = 2;
5435 exp->__anon1.__anon2.string = PrintInt64((op1->__anon1.i64 ^= value2));
5436 if(!exp->expType)
5437 {
5438 exp->expType = op1->type;
5439 if(op1->type)
5440 op1->type->refCount++;
5441 }
5442 return 1;
5443 }
5444
5445 static unsigned int UInt64XorAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5446 {
5447 uint64 value2 = op2->__anon1.ui64;
5448
5449 exp->type = 2;
5450 exp->__anon1.__anon2.string = PrintUInt64((op1->__anon1.ui64 ^= value2));
5451 if(!exp->expType)
5452 {
5453 exp->expType = op1->type;
5454 if(op1->type)
5455 op1->type->refCount++;
5456 }
5457 return 1;
5458 }
5459
5460 static unsigned int ShortXorAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5461 {
5462 short value2 = op2->__anon1.s;
5463
5464 exp->type = 2;
5465 exp->__anon1.__anon2.string = PrintShort((op1->__anon1.s ^= value2));
5466 if(!exp->expType)
5467 {
5468 exp->expType = op1->type;
5469 if(op1->type)
5470 op1->type->refCount++;
5471 }
5472 return 1;
5473 }
5474
5475 static unsigned int UShortXorAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5476 {
5477 unsigned short value2 = op2->__anon1.us;
5478
5479 exp->type = 2;
5480 exp->__anon1.__anon2.string = PrintUShort((op1->__anon1.us ^= value2));
5481 if(!exp->expType)
5482 {
5483 exp->expType = op1->type;
5484 if(op1->type)
5485 op1->type->refCount++;
5486 }
5487 return 1;
5488 }
5489
5490 static unsigned int CharXorAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5491 {
5492 char value2 = op2->__anon1.c;
5493
5494 exp->type = 2;
5495 exp->__anon1.__anon2.string = PrintChar((op1->__anon1.c ^= value2));
5496 if(!exp->expType)
5497 {
5498 exp->expType = op1->type;
5499 if(op1->type)
5500 op1->type->refCount++;
5501 }
5502 return 1;
5503 }
5504
5505 static unsigned int UCharXorAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5506 {
5507 unsigned char value2 = op2->__anon1.uc;
5508
5509 exp->type = 2;
5510 exp->__anon1.__anon2.string = PrintUChar((op1->__anon1.uc ^= value2));
5511 if(!exp->expType)
5512 {
5513 exp->expType = op1->type;
5514 if(op1->type)
5515 op1->type->refCount++;
5516 }
5517 return 1;
5518 }
5519
5520 static unsigned int IntLShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5521 {
5522 int value2 = op2->__anon1.i;
5523
5524 exp->type = 2;
5525 exp->__anon1.__anon2.string = PrintInt((op1->__anon1.i <<= value2));
5526 if(!exp->expType)
5527 {
5528 exp->expType = op1->type;
5529 if(op1->type)
5530 op1->type->refCount++;
5531 }
5532 return 1;
5533 }
5534
5535 static unsigned int UIntLShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5536 {
5537 unsigned int value2 = op2->__anon1.ui;
5538
5539 exp->type = 2;
5540 exp->__anon1.__anon2.string = PrintUInt((op1->__anon1.ui <<= value2));
5541 if(!exp->expType)
5542 {
5543 exp->expType = op1->type;
5544 if(op1->type)
5545 op1->type->refCount++;
5546 }
5547 return 1;
5548 }
5549
5550 static unsigned int Int64LShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5551 {
5552 long long value2 = op2->__anon1.i64;
5553
5554 exp->type = 2;
5555 exp->__anon1.__anon2.string = PrintInt64((op1->__anon1.i64 <<= value2));
5556 if(!exp->expType)
5557 {
5558 exp->expType = op1->type;
5559 if(op1->type)
5560 op1->type->refCount++;
5561 }
5562 return 1;
5563 }
5564
5565 static unsigned int UInt64LShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5566 {
5567 uint64 value2 = op2->__anon1.ui64;
5568
5569 exp->type = 2;
5570 exp->__anon1.__anon2.string = PrintUInt64((op1->__anon1.ui64 <<= value2));
5571 if(!exp->expType)
5572 {
5573 exp->expType = op1->type;
5574 if(op1->type)
5575 op1->type->refCount++;
5576 }
5577 return 1;
5578 }
5579
5580 static unsigned int ShortLShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5581 {
5582 short value2 = op2->__anon1.s;
5583
5584 exp->type = 2;
5585 exp->__anon1.__anon2.string = PrintShort((op1->__anon1.s <<= value2));
5586 if(!exp->expType)
5587 {
5588 exp->expType = op1->type;
5589 if(op1->type)
5590 op1->type->refCount++;
5591 }
5592 return 1;
5593 }
5594
5595 static unsigned int UShortLShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5596 {
5597 unsigned short value2 = op2->__anon1.us;
5598
5599 exp->type = 2;
5600 exp->__anon1.__anon2.string = PrintUShort((op1->__anon1.us <<= value2));
5601 if(!exp->expType)
5602 {
5603 exp->expType = op1->type;
5604 if(op1->type)
5605 op1->type->refCount++;
5606 }
5607 return 1;
5608 }
5609
5610 static unsigned int CharLShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5611 {
5612 char value2 = op2->__anon1.c;
5613
5614 exp->type = 2;
5615 exp->__anon1.__anon2.string = PrintChar((op1->__anon1.c <<= value2));
5616 if(!exp->expType)
5617 {
5618 exp->expType = op1->type;
5619 if(op1->type)
5620 op1->type->refCount++;
5621 }
5622 return 1;
5623 }
5624
5625 static unsigned int UCharLShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5626 {
5627 unsigned char value2 = op2->__anon1.uc;
5628
5629 exp->type = 2;
5630 exp->__anon1.__anon2.string = PrintUChar((op1->__anon1.uc <<= value2));
5631 if(!exp->expType)
5632 {
5633 exp->expType = op1->type;
5634 if(op1->type)
5635 op1->type->refCount++;
5636 }
5637 return 1;
5638 }
5639
5640 static unsigned int IntRShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5641 {
5642 int value2 = op2->__anon1.i;
5643
5644 exp->type = 2;
5645 exp->__anon1.__anon2.string = PrintInt((op1->__anon1.i >>= value2));
5646 if(!exp->expType)
5647 {
5648 exp->expType = op1->type;
5649 if(op1->type)
5650 op1->type->refCount++;
5651 }
5652 return 1;
5653 }
5654
5655 static unsigned int UIntRShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5656 {
5657 unsigned int value2 = op2->__anon1.ui;
5658
5659 exp->type = 2;
5660 exp->__anon1.__anon2.string = PrintUInt((op1->__anon1.ui >>= value2));
5661 if(!exp->expType)
5662 {
5663 exp->expType = op1->type;
5664 if(op1->type)
5665 op1->type->refCount++;
5666 }
5667 return 1;
5668 }
5669
5670 static unsigned int Int64RShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5671 {
5672 long long value2 = op2->__anon1.i64;
5673
5674 exp->type = 2;
5675 exp->__anon1.__anon2.string = PrintInt64((op1->__anon1.i64 >>= value2));
5676 if(!exp->expType)
5677 {
5678 exp->expType = op1->type;
5679 if(op1->type)
5680 op1->type->refCount++;
5681 }
5682 return 1;
5683 }
5684
5685 static unsigned int UInt64RShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5686 {
5687 uint64 value2 = op2->__anon1.ui64;
5688
5689 exp->type = 2;
5690 exp->__anon1.__anon2.string = PrintUInt64((op1->__anon1.ui64 >>= value2));
5691 if(!exp->expType)
5692 {
5693 exp->expType = op1->type;
5694 if(op1->type)
5695 op1->type->refCount++;
5696 }
5697 return 1;
5698 }
5699
5700 static unsigned int ShortRShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5701 {
5702 short value2 = op2->__anon1.s;
5703
5704 exp->type = 2;
5705 exp->__anon1.__anon2.string = PrintShort((op1->__anon1.s >>= value2));
5706 if(!exp->expType)
5707 {
5708 exp->expType = op1->type;
5709 if(op1->type)
5710 op1->type->refCount++;
5711 }
5712 return 1;
5713 }
5714
5715 static unsigned int UShortRShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5716 {
5717 unsigned short value2 = op2->__anon1.us;
5718
5719 exp->type = 2;
5720 exp->__anon1.__anon2.string = PrintUShort((op1->__anon1.us >>= value2));
5721 if(!exp->expType)
5722 {
5723 exp->expType = op1->type;
5724 if(op1->type)
5725 op1->type->refCount++;
5726 }
5727 return 1;
5728 }
5729
5730 static unsigned int CharRShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5731 {
5732 char value2 = op2->__anon1.c;
5733
5734 exp->type = 2;
5735 exp->__anon1.__anon2.string = PrintChar((op1->__anon1.c >>= value2));
5736 if(!exp->expType)
5737 {
5738 exp->expType = op1->type;
5739 if(op1->type)
5740 op1->type->refCount++;
5741 }
5742 return 1;
5743 }
5744
5745 static unsigned int UCharRShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5746 {
5747 unsigned char value2 = op2->__anon1.uc;
5748
5749 exp->type = 2;
5750 exp->__anon1.__anon2.string = PrintUChar((op1->__anon1.uc >>= value2));
5751 if(!exp->expType)
5752 {
5753 exp->expType = op1->type;
5754 if(op1->type)
5755 op1->type->refCount++;
5756 }
5757 return 1;
5758 }
5759
5760 static unsigned int IntNot(struct Expression * exp, struct Operand * op1)
5761 {
5762 exp->type = 2;
5763 exp->__anon1.__anon2.string = PrintInt((int)(!op1->__anon1.i));
5764 if(!exp->expType)
5765 {
5766 exp->expType = op1->type;
5767 if(op1->type)
5768 op1->type->refCount++;
5769 }
5770 return 1;
5771 }
5772
5773 static unsigned int UIntNot(struct Expression * exp, struct Operand * op1)
5774 {
5775 exp->type = 2;
5776 exp->__anon1.__anon2.string = PrintUInt((unsigned int)(!op1->__anon1.ui));
5777 if(!exp->expType)
5778 {
5779 exp->expType = op1->type;
5780 if(op1->type)
5781 op1->type->refCount++;
5782 }
5783 return 1;
5784 }
5785
5786 static unsigned int Int64Not(struct Expression * exp, struct Operand * op1)
5787 {
5788 exp->type = 2;
5789 exp->__anon1.__anon2.string = PrintInt64((long long)(!op1->__anon1.i64));
5790 if(!exp->expType)
5791 {
5792 exp->expType = op1->type;
5793 if(op1->type)
5794 op1->type->refCount++;
5795 }
5796 return 1;
5797 }
5798
5799 static unsigned int UInt64Not(struct Expression * exp, struct Operand * op1)
5800 {
5801 exp->type = 2;
5802 exp->__anon1.__anon2.string = PrintUInt64((uint64)(!op1->__anon1.ui64));
5803 if(!exp->expType)
5804 {
5805 exp->expType = op1->type;
5806 if(op1->type)
5807 op1->type->refCount++;
5808 }
5809 return 1;
5810 }
5811
5812 static unsigned int ShortNot(struct Expression * exp, struct Operand * op1)
5813 {
5814 exp->type = 2;
5815 exp->__anon1.__anon2.string = PrintShort((short)(!op1->__anon1.s));
5816 if(!exp->expType)
5817 {
5818 exp->expType = op1->type;
5819 if(op1->type)
5820 op1->type->refCount++;
5821 }
5822 return 1;
5823 }
5824
5825 static unsigned int UShortNot(struct Expression * exp, struct Operand * op1)
5826 {
5827 exp->type = 2;
5828 exp->__anon1.__anon2.string = PrintUShort((unsigned short)(!op1->__anon1.us));
5829 if(!exp->expType)
5830 {
5831 exp->expType = op1->type;
5832 if(op1->type)
5833 op1->type->refCount++;
5834 }
5835 return 1;
5836 }
5837
5838 static unsigned int CharNot(struct Expression * exp, struct Operand * op1)
5839 {
5840 exp->type = 2;
5841 exp->__anon1.__anon2.string = PrintChar((char)(!op1->__anon1.c));
5842 if(!exp->expType)
5843 {
5844 exp->expType = op1->type;
5845 if(op1->type)
5846 op1->type->refCount++;
5847 }
5848 return 1;
5849 }
5850
5851 static unsigned int UCharNot(struct Expression * exp, struct Operand * op1)
5852 {
5853 exp->type = 2;
5854 exp->__anon1.__anon2.string = PrintUChar((unsigned char)(!op1->__anon1.uc));
5855 if(!exp->expType)
5856 {
5857 exp->expType = op1->type;
5858 if(op1->type)
5859 op1->type->refCount++;
5860 }
5861 return 1;
5862 }
5863
5864 static unsigned int IntEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5865 {
5866 int value2 = op2->__anon1.i;
5867
5868 exp->type = 2;
5869 exp->__anon1.__anon2.string = PrintInt((int)(op1->__anon1.i == value2));
5870 if(!exp->expType)
5871 {
5872 exp->expType = op1->type;
5873 if(op1->type)
5874 op1->type->refCount++;
5875 }
5876 return 1;
5877 }
5878
5879 static unsigned int UIntEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5880 {
5881 unsigned int value2 = op2->__anon1.ui;
5882
5883 exp->type = 2;
5884 exp->__anon1.__anon2.string = PrintUInt((unsigned int)(op1->__anon1.ui == value2));
5885 if(!exp->expType)
5886 {
5887 exp->expType = op1->type;
5888 if(op1->type)
5889 op1->type->refCount++;
5890 }
5891 return 1;
5892 }
5893
5894 static unsigned int Int64Equ(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5895 {
5896 long long value2 = op2->__anon1.i64;
5897
5898 exp->type = 2;
5899 exp->__anon1.__anon2.string = PrintInt64((long long)(op1->__anon1.i64 == value2));
5900 if(!exp->expType)
5901 {
5902 exp->expType = op1->type;
5903 if(op1->type)
5904 op1->type->refCount++;
5905 }
5906 return 1;
5907 }
5908
5909 static unsigned int UInt64Equ(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5910 {
5911 uint64 value2 = op2->__anon1.ui64;
5912
5913 exp->type = 2;
5914 exp->__anon1.__anon2.string = PrintUInt64((uint64)(op1->__anon1.ui64 == value2));
5915 if(!exp->expType)
5916 {
5917 exp->expType = op1->type;
5918 if(op1->type)
5919 op1->type->refCount++;
5920 }
5921 return 1;
5922 }
5923
5924 static unsigned int ShortEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5925 {
5926 short value2 = op2->__anon1.s;
5927
5928 exp->type = 2;
5929 exp->__anon1.__anon2.string = PrintShort((short)(op1->__anon1.s == value2));
5930 if(!exp->expType)
5931 {
5932 exp->expType = op1->type;
5933 if(op1->type)
5934 op1->type->refCount++;
5935 }
5936 return 1;
5937 }
5938
5939 static unsigned int UShortEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5940 {
5941 unsigned short value2 = op2->__anon1.us;
5942
5943 exp->type = 2;
5944 exp->__anon1.__anon2.string = PrintUShort((unsigned short)(op1->__anon1.us == value2));
5945 if(!exp->expType)
5946 {
5947 exp->expType = op1->type;
5948 if(op1->type)
5949 op1->type->refCount++;
5950 }
5951 return 1;
5952 }
5953
5954 static unsigned int CharEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5955 {
5956 char value2 = op2->__anon1.c;
5957
5958 exp->type = 2;
5959 exp->__anon1.__anon2.string = PrintChar((char)(op1->__anon1.c == value2));
5960 if(!exp->expType)
5961 {
5962 exp->expType = op1->type;
5963 if(op1->type)
5964 op1->type->refCount++;
5965 }
5966 return 1;
5967 }
5968
5969 static unsigned int UCharEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5970 {
5971 unsigned char value2 = op2->__anon1.uc;
5972
5973 exp->type = 2;
5974 exp->__anon1.__anon2.string = PrintUChar((unsigned char)(op1->__anon1.uc == value2));
5975 if(!exp->expType)
5976 {
5977 exp->expType = op1->type;
5978 if(op1->type)
5979 op1->type->refCount++;
5980 }
5981 return 1;
5982 }
5983
5984 static unsigned int FloatEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5985 {
5986 float value2 = op2->__anon1.f;
5987
5988 exp->type = 2;
5989 exp->__anon1.__anon2.string = PrintFloat((float)(op1->__anon1.f == value2));
5990 if(!exp->expType)
5991 {
5992 exp->expType = op1->type;
5993 if(op1->type)
5994 op1->type->refCount++;
5995 }
5996 return 1;
5997 }
5998
5999 static unsigned int DoubleEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6000 {
6001 double value2 = op2->__anon1.d;
6002
6003 exp->type = 2;
6004 exp->__anon1.__anon2.string = PrintDouble((double)(op1->__anon1.d == value2));
6005 if(!exp->expType)
6006 {
6007 exp->expType = op1->type;
6008 if(op1->type)
6009 op1->type->refCount++;
6010 }
6011 return 1;
6012 }
6013
6014 static unsigned int IntNqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6015 {
6016 int value2 = op2->__anon1.i;
6017
6018 exp->type = 2;
6019 exp->__anon1.__anon2.string = PrintInt((int)(op1->__anon1.i != value2));
6020 if(!exp->expType)
6021 {
6022 exp->expType = op1->type;
6023 if(op1->type)
6024 op1->type->refCount++;
6025 }
6026 return 1;
6027 }
6028
6029 static unsigned int UIntNqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6030 {
6031 unsigned int value2 = op2->__anon1.ui;
6032
6033 exp->type = 2;
6034 exp->__anon1.__anon2.string = PrintUInt((unsigned int)(op1->__anon1.ui != value2));
6035 if(!exp->expType)
6036 {
6037 exp->expType = op1->type;
6038 if(op1->type)
6039 op1->type->refCount++;
6040 }
6041 return 1;
6042 }
6043
6044 static unsigned int Int64Nqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6045 {
6046 long long value2 = op2->__anon1.i64;
6047
6048 exp->type = 2;
6049 exp->__anon1.__anon2.string = PrintInt64((long long)(op1->__anon1.i64 != value2));
6050 if(!exp->expType)
6051 {
6052 exp->expType = op1->type;
6053 if(op1->type)
6054 op1->type->refCount++;
6055 }
6056 return 1;
6057 }
6058
6059 static unsigned int UInt64Nqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6060 {
6061 uint64 value2 = op2->__anon1.ui64;
6062
6063 exp->type = 2;
6064 exp->__anon1.__anon2.string = PrintUInt64((uint64)(op1->__anon1.ui64 != value2));
6065 if(!exp->expType)
6066 {
6067 exp->expType = op1->type;
6068 if(op1->type)
6069 op1->type->refCount++;
6070 }
6071 return 1;
6072 }
6073
6074 static unsigned int ShortNqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6075 {
6076 short value2 = op2->__anon1.s;
6077
6078 exp->type = 2;
6079 exp->__anon1.__anon2.string = PrintShort((short)(op1->__anon1.s != value2));
6080 if(!exp->expType)
6081 {
6082 exp->expType = op1->type;
6083 if(op1->type)
6084 op1->type->refCount++;
6085 }
6086 return 1;
6087 }
6088
6089 static unsigned int UShortNqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6090 {
6091 unsigned short value2 = op2->__anon1.us;
6092
6093 exp->type = 2;
6094 exp->__anon1.__anon2.string = PrintUShort((unsigned short)(op1->__anon1.us != value2));
6095 if(!exp->expType)
6096 {
6097 exp->expType = op1->type;
6098 if(op1->type)
6099 op1->type->refCount++;
6100 }
6101 return 1;
6102 }
6103
6104 static unsigned int CharNqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6105 {
6106 char value2 = op2->__anon1.c;
6107
6108 exp->type = 2;
6109 exp->__anon1.__anon2.string = PrintChar((char)(op1->__anon1.c != value2));
6110 if(!exp->expType)
6111 {
6112 exp->expType = op1->type;
6113 if(op1->type)
6114 op1->type->refCount++;
6115 }
6116 return 1;
6117 }
6118
6119 static unsigned int UCharNqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6120 {
6121 unsigned char value2 = op2->__anon1.uc;
6122
6123 exp->type = 2;
6124 exp->__anon1.__anon2.string = PrintUChar((unsigned char)(op1->__anon1.uc != value2));
6125 if(!exp->expType)
6126 {
6127 exp->expType = op1->type;
6128 if(op1->type)
6129 op1->type->refCount++;
6130 }
6131 return 1;
6132 }
6133
6134 static unsigned int FloatNqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6135 {
6136 float value2 = op2->__anon1.f;
6137
6138 exp->type = 2;
6139 exp->__anon1.__anon2.string = PrintFloat((float)(op1->__anon1.f != value2));
6140 if(!exp->expType)
6141 {
6142 exp->expType = op1->type;
6143 if(op1->type)
6144 op1->type->refCount++;
6145 }
6146 return 1;
6147 }
6148
6149 static unsigned int DoubleNqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6150 {
6151 double value2 = op2->__anon1.d;
6152
6153 exp->type = 2;
6154 exp->__anon1.__anon2.string = PrintDouble((double)(op1->__anon1.d != value2));
6155 if(!exp->expType)
6156 {
6157 exp->expType = op1->type;
6158 if(op1->type)
6159 op1->type->refCount++;
6160 }
6161 return 1;
6162 }
6163
6164 static unsigned int IntAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6165 {
6166 int value2 = op2->__anon1.i;
6167
6168 exp->type = 2;
6169 exp->__anon1.__anon2.string = PrintInt((int)(op1->__anon1.i && value2));
6170 if(!exp->expType)
6171 {
6172 exp->expType = op1->type;
6173 if(op1->type)
6174 op1->type->refCount++;
6175 }
6176 return 1;
6177 }
6178
6179 static unsigned int UIntAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6180 {
6181 unsigned int value2 = op2->__anon1.ui;
6182
6183 exp->type = 2;
6184 exp->__anon1.__anon2.string = PrintUInt((unsigned int)(op1->__anon1.ui && value2));
6185 if(!exp->expType)
6186 {
6187 exp->expType = op1->type;
6188 if(op1->type)
6189 op1->type->refCount++;
6190 }
6191 return 1;
6192 }
6193
6194 static unsigned int Int64And(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6195 {
6196 long long value2 = op2->__anon1.i64;
6197
6198 exp->type = 2;
6199 exp->__anon1.__anon2.string = PrintInt64((long long)(op1->__anon1.i64 && value2));
6200 if(!exp->expType)
6201 {
6202 exp->expType = op1->type;
6203 if(op1->type)
6204 op1->type->refCount++;
6205 }
6206 return 1;
6207 }
6208
6209 static unsigned int UInt64And(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6210 {
6211 uint64 value2 = op2->__anon1.ui64;
6212
6213 exp->type = 2;
6214 exp->__anon1.__anon2.string = PrintUInt64((uint64)(op1->__anon1.ui64 && value2));
6215 if(!exp->expType)
6216 {
6217 exp->expType = op1->type;
6218 if(op1->type)
6219 op1->type->refCount++;
6220 }
6221 return 1;
6222 }
6223
6224 static unsigned int ShortAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6225 {
6226 short value2 = op2->__anon1.s;
6227
6228 exp->type = 2;
6229 exp->__anon1.__anon2.string = PrintShort((short)(op1->__anon1.s && value2));
6230 if(!exp->expType)
6231 {
6232 exp->expType = op1->type;
6233 if(op1->type)
6234 op1->type->refCount++;
6235 }
6236 return 1;
6237 }
6238
6239 static unsigned int UShortAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6240 {
6241 unsigned short value2 = op2->__anon1.us;
6242
6243 exp->type = 2;
6244 exp->__anon1.__anon2.string = PrintUShort((unsigned short)(op1->__anon1.us && value2));
6245 if(!exp->expType)
6246 {
6247 exp->expType = op1->type;
6248 if(op1->type)
6249 op1->type->refCount++;
6250 }
6251 return 1;
6252 }
6253
6254 static unsigned int CharAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6255 {
6256 char value2 = op2->__anon1.c;
6257
6258 exp->type = 2;
6259 exp->__anon1.__anon2.string = PrintChar((char)(op1->__anon1.c && value2));
6260 if(!exp->expType)
6261 {
6262 exp->expType = op1->type;
6263 if(op1->type)
6264 op1->type->refCount++;
6265 }
6266 return 1;
6267 }
6268
6269 static unsigned int UCharAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6270 {
6271 unsigned char value2 = op2->__anon1.uc;
6272
6273 exp->type = 2;
6274 exp->__anon1.__anon2.string = PrintUChar((unsigned char)(op1->__anon1.uc && value2));
6275 if(!exp->expType)
6276 {
6277 exp->expType = op1->type;
6278 if(op1->type)
6279 op1->type->refCount++;
6280 }
6281 return 1;
6282 }
6283
6284 static unsigned int FloatAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6285 {
6286 float value2 = op2->__anon1.f;
6287
6288 exp->type = 2;
6289 exp->__anon1.__anon2.string = PrintFloat((float)(op1->__anon1.f && value2));
6290 if(!exp->expType)
6291 {
6292 exp->expType = op1->type;
6293 if(op1->type)
6294 op1->type->refCount++;
6295 }
6296 return 1;
6297 }
6298
6299 static unsigned int DoubleAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6300 {
6301 double value2 = op2->__anon1.d;
6302
6303 exp->type = 2;
6304 exp->__anon1.__anon2.string = PrintDouble((double)(op1->__anon1.d && value2));
6305 if(!exp->expType)
6306 {
6307 exp->expType = op1->type;
6308 if(op1->type)
6309 op1->type->refCount++;
6310 }
6311 return 1;
6312 }
6313
6314 static unsigned int IntOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6315 {
6316 int value2 = op2->__anon1.i;
6317
6318 exp->type = 2;
6319 exp->__anon1.__anon2.string = PrintInt((int)(op1->__anon1.i || value2));
6320 if(!exp->expType)
6321 {
6322 exp->expType = op1->type;
6323 if(op1->type)
6324 op1->type->refCount++;
6325 }
6326 return 1;
6327 }
6328
6329 static unsigned int UIntOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6330 {
6331 unsigned int value2 = op2->__anon1.ui;
6332
6333 exp->type = 2;
6334 exp->__anon1.__anon2.string = PrintUInt((unsigned int)(op1->__anon1.ui || value2));
6335 if(!exp->expType)
6336 {
6337 exp->expType = op1->type;
6338 if(op1->type)
6339 op1->type->refCount++;
6340 }
6341 return 1;
6342 }
6343
6344 static unsigned int Int64Or(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6345 {
6346 long long value2 = op2->__anon1.i64;
6347
6348 exp->type = 2;
6349 exp->__anon1.__anon2.string = PrintInt64((long long)(op1->__anon1.i64 || value2));
6350 if(!exp->expType)
6351 {
6352 exp->expType = op1->type;
6353 if(op1->type)
6354 op1->type->refCount++;
6355 }
6356 return 1;
6357 }
6358
6359 static unsigned int UInt64Or(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6360 {
6361 uint64 value2 = op2->__anon1.ui64;
6362
6363 exp->type = 2;
6364 exp->__anon1.__anon2.string = PrintUInt64((uint64)(op1->__anon1.ui64 || value2));
6365 if(!exp->expType)
6366 {
6367 exp->expType = op1->type;
6368 if(op1->type)
6369 op1->type->refCount++;
6370 }
6371 return 1;
6372 }
6373
6374 static unsigned int ShortOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6375 {
6376 short value2 = op2->__anon1.s;
6377
6378 exp->type = 2;
6379 exp->__anon1.__anon2.string = PrintShort((short)(op1->__anon1.s || value2));
6380 if(!exp->expType)
6381 {
6382 exp->expType = op1->type;
6383 if(op1->type)
6384 op1->type->refCount++;
6385 }
6386 return 1;
6387 }
6388
6389 static unsigned int UShortOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6390 {
6391 unsigned short value2 = op2->__anon1.us;
6392
6393 exp->type = 2;
6394 exp->__anon1.__anon2.string = PrintUShort((unsigned short)(op1->__anon1.us || value2));
6395 if(!exp->expType)
6396 {
6397 exp->expType = op1->type;
6398 if(op1->type)
6399 op1->type->refCount++;
6400 }
6401 return 1;
6402 }
6403
6404 static unsigned int CharOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6405 {
6406 char value2 = op2->__anon1.c;
6407
6408 exp->type = 2;
6409 exp->__anon1.__anon2.string = PrintChar((char)(op1->__anon1.c || value2));
6410 if(!exp->expType)
6411 {
6412 exp->expType = op1->type;
6413 if(op1->type)
6414 op1->type->refCount++;
6415 }
6416 return 1;
6417 }
6418
6419 static unsigned int UCharOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6420 {
6421 unsigned char value2 = op2->__anon1.uc;
6422
6423 exp->type = 2;
6424 exp->__anon1.__anon2.string = PrintUChar((unsigned char)(op1->__anon1.uc || value2));
6425 if(!exp->expType)
6426 {
6427 exp->expType = op1->type;
6428 if(op1->type)
6429 op1->type->refCount++;
6430 }
6431 return 1;
6432 }
6433
6434 static unsigned int FloatOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6435 {
6436 float value2 = op2->__anon1.f;
6437
6438 exp->type = 2;
6439 exp->__anon1.__anon2.string = PrintFloat((float)(op1->__anon1.f || value2));
6440 if(!exp->expType)
6441 {
6442 exp->expType = op1->type;
6443 if(op1->type)
6444 op1->type->refCount++;
6445 }
6446 return 1;
6447 }
6448
6449 static unsigned int DoubleOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6450 {
6451 double value2 = op2->__anon1.d;
6452
6453 exp->type = 2;
6454 exp->__anon1.__anon2.string = PrintDouble((double)(op1->__anon1.d || value2));
6455 if(!exp->expType)
6456 {
6457 exp->expType = op1->type;
6458 if(op1->type)
6459 op1->type->refCount++;
6460 }
6461 return 1;
6462 }
6463
6464 static unsigned int IntGrt(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6465 {
6466 int value2 = op2->__anon1.i;
6467
6468 exp->type = 2;
6469 exp->__anon1.__anon2.string = PrintInt((int)(op1->__anon1.i > value2));
6470 if(!exp->expType)
6471 {
6472 exp->expType = op1->type;
6473 if(op1->type)
6474 op1->type->refCount++;
6475 }
6476 return 1;
6477 }
6478
6479 static unsigned int UIntGrt(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6480 {
6481 unsigned int value2 = op2->__anon1.ui;
6482
6483 exp->type = 2;
6484 exp->__anon1.__anon2.string = PrintUInt((unsigned int)(op1->__anon1.ui > value2));
6485 if(!exp->expType)
6486 {
6487 exp->expType = op1->type;
6488 if(op1->type)
6489 op1->type->refCount++;
6490 }
6491 return 1;
6492 }
6493
6494 static unsigned int Int64Grt(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6495 {
6496 long long value2 = op2->__anon1.i64;
6497
6498 exp->type = 2;
6499 exp->__anon1.__anon2.string = PrintInt64((long long)(op1->__anon1.i64 > value2));
6500 if(!exp->expType)
6501 {
6502 exp->expType = op1->type;
6503 if(op1->type)
6504 op1->type->refCount++;
6505 }
6506 return 1;
6507 }
6508
6509 static unsigned int UInt64Grt(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6510 {
6511 uint64 value2 = op2->__anon1.ui64;
6512
6513 exp->type = 2;
6514 exp->__anon1.__anon2.string = PrintUInt64((uint64)(op1->__anon1.ui64 > value2));
6515 if(!exp->expType)
6516 {
6517 exp->expType = op1->type;
6518 if(op1->type)
6519 op1->type->refCount++;
6520 }
6521 return 1;
6522 }
6523
6524 static unsigned int ShortGrt(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6525 {
6526 short value2 = op2->__anon1.s;
6527
6528 exp->type = 2;
6529 exp->__anon1.__anon2.string = PrintShort((short)(op1->__anon1.s > value2));
6530 if(!exp->expType)
6531 {
6532 exp->expType = op1->type;
6533 if(op1->type)
6534 op1->type->refCount++;
6535 }
6536 return 1;
6537 }
6538
6539 static unsigned int UShortGrt(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6540 {
6541 unsigned short value2 = op2->__anon1.us;
6542
6543 exp->type = 2;
6544 exp->__anon1.__anon2.string = PrintUShort((unsigned short)(op1->__anon1.us > value2));
6545 if(!exp->expType)
6546 {
6547 exp->expType = op1->type;
6548 if(op1->type)
6549 op1->type->refCount++;
6550 }
6551 return 1;
6552 }
6553
6554 static unsigned int CharGrt(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6555 {
6556 char value2 = op2->__anon1.c;
6557
6558 exp->type = 2;
6559 exp->__anon1.__anon2.string = PrintChar((char)(op1->__anon1.c > value2));
6560 if(!exp->expType)
6561 {
6562 exp->expType = op1->type;
6563 if(op1->type)
6564 op1->type->refCount++;
6565 }
6566 return 1;
6567 }
6568
6569 static unsigned int UCharGrt(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6570 {
6571 unsigned char value2 = op2->__anon1.uc;
6572
6573 exp->type = 2;
6574 exp->__anon1.__anon2.string = PrintUChar((unsigned char)(op1->__anon1.uc > value2));
6575 if(!exp->expType)
6576 {
6577 exp->expType = op1->type;
6578 if(op1->type)
6579 op1->type->refCount++;
6580 }
6581 return 1;
6582 }
6583
6584 static unsigned int FloatGrt(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6585 {
6586 float value2 = op2->__anon1.f;
6587
6588 exp->type = 2;
6589 exp->__anon1.__anon2.string = PrintFloat((float)(op1->__anon1.f > value2));
6590 if(!exp->expType)
6591 {
6592 exp->expType = op1->type;
6593 if(op1->type)
6594 op1->type->refCount++;
6595 }
6596 return 1;
6597 }
6598
6599 static unsigned int DoubleGrt(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6600 {
6601 double value2 = op2->__anon1.d;
6602
6603 exp->type = 2;
6604 exp->__anon1.__anon2.string = PrintDouble((double)(op1->__anon1.d > value2));
6605 if(!exp->expType)
6606 {
6607 exp->expType = op1->type;
6608 if(op1->type)
6609 op1->type->refCount++;
6610 }
6611 return 1;
6612 }
6613
6614 static unsigned int IntSma(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6615 {
6616 int value2 = op2->__anon1.i;
6617
6618 exp->type = 2;
6619 exp->__anon1.__anon2.string = PrintInt((int)(op1->__anon1.i < value2));
6620 if(!exp->expType)
6621 {
6622 exp->expType = op1->type;
6623 if(op1->type)
6624 op1->type->refCount++;
6625 }
6626 return 1;
6627 }
6628
6629 static unsigned int UIntSma(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6630 {
6631 unsigned int value2 = op2->__anon1.ui;
6632
6633 exp->type = 2;
6634 exp->__anon1.__anon2.string = PrintUInt((unsigned int)(op1->__anon1.ui < value2));
6635 if(!exp->expType)
6636 {
6637 exp->expType = op1->type;
6638 if(op1->type)
6639 op1->type->refCount++;
6640 }
6641 return 1;
6642 }
6643
6644 static unsigned int Int64Sma(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6645 {
6646 long long value2 = op2->__anon1.i64;
6647
6648 exp->type = 2;
6649 exp->__anon1.__anon2.string = PrintInt64((long long)(op1->__anon1.i64 < value2));
6650 if(!exp->expType)
6651 {
6652 exp->expType = op1->type;
6653 if(op1->type)
6654 op1->type->refCount++;
6655 }
6656 return 1;
6657 }
6658
6659 static unsigned int UInt64Sma(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6660 {
6661 uint64 value2 = op2->__anon1.ui64;
6662
6663 exp->type = 2;
6664 exp->__anon1.__anon2.string = PrintUInt64((uint64)(op1->__anon1.ui64 < value2));
6665 if(!exp->expType)
6666 {
6667 exp->expType = op1->type;
6668 if(op1->type)
6669 op1->type->refCount++;
6670 }
6671 return 1;
6672 }
6673
6674 static unsigned int ShortSma(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6675 {
6676 short value2 = op2->__anon1.s;
6677
6678 exp->type = 2;
6679 exp->__anon1.__anon2.string = PrintShort((short)(op1->__anon1.s < value2));
6680 if(!exp->expType)
6681 {
6682 exp->expType = op1->type;
6683 if(op1->type)
6684 op1->type->refCount++;
6685 }
6686 return 1;
6687 }
6688
6689 static unsigned int UShortSma(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6690 {
6691 unsigned short value2 = op2->__anon1.us;
6692
6693 exp->type = 2;
6694 exp->__anon1.__anon2.string = PrintUShort((unsigned short)(op1->__anon1.us < value2));
6695 if(!exp->expType)
6696 {
6697 exp->expType = op1->type;
6698 if(op1->type)
6699 op1->type->refCount++;
6700 }
6701 return 1;
6702 }
6703
6704 static unsigned int CharSma(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6705 {
6706 char value2 = op2->__anon1.c;
6707
6708 exp->type = 2;
6709 exp->__anon1.__anon2.string = PrintChar((char)(op1->__anon1.c < value2));
6710 if(!exp->expType)
6711 {
6712 exp->expType = op1->type;
6713 if(op1->type)
6714 op1->type->refCount++;
6715 }
6716 return 1;
6717 }
6718
6719 static unsigned int UCharSma(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6720 {
6721 unsigned char value2 = op2->__anon1.uc;
6722
6723 exp->type = 2;
6724 exp->__anon1.__anon2.string = PrintUChar((unsigned char)(op1->__anon1.uc < value2));
6725 if(!exp->expType)
6726 {
6727 exp->expType = op1->type;
6728 if(op1->type)
6729 op1->type->refCount++;
6730 }
6731 return 1;
6732 }
6733
6734 static unsigned int FloatSma(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6735 {
6736 float value2 = op2->__anon1.f;
6737
6738 exp->type = 2;
6739 exp->__anon1.__anon2.string = PrintFloat((float)(op1->__anon1.f < value2));
6740 if(!exp->expType)
6741 {
6742 exp->expType = op1->type;
6743 if(op1->type)
6744 op1->type->refCount++;
6745 }
6746 return 1;
6747 }
6748
6749 static unsigned int DoubleSma(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6750 {
6751 double value2 = op2->__anon1.d;
6752
6753 exp->type = 2;
6754 exp->__anon1.__anon2.string = PrintDouble((double)(op1->__anon1.d < value2));
6755 if(!exp->expType)
6756 {
6757 exp->expType = op1->type;
6758 if(op1->type)
6759 op1->type->refCount++;
6760 }
6761 return 1;
6762 }
6763
6764 static unsigned int IntGrtEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6765 {
6766 int value2 = op2->__anon1.i;
6767
6768 exp->type = 2;
6769 exp->__anon1.__anon2.string = PrintInt((int)(op1->__anon1.i >= value2));
6770 if(!exp->expType)
6771 {
6772 exp->expType = op1->type;
6773 if(op1->type)
6774 op1->type->refCount++;
6775 }
6776 return 1;
6777 }
6778
6779 static unsigned int UIntGrtEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6780 {
6781 unsigned int value2 = op2->__anon1.ui;
6782
6783 exp->type = 2;
6784 exp->__anon1.__anon2.string = PrintUInt((unsigned int)(op1->__anon1.ui >= value2));
6785 if(!exp->expType)
6786 {
6787 exp->expType = op1->type;
6788 if(op1->type)
6789 op1->type->refCount++;
6790 }
6791 return 1;
6792 }
6793
6794 static unsigned int Int64GrtEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6795 {
6796 long long value2 = op2->__anon1.i64;
6797
6798 exp->type = 2;
6799 exp->__anon1.__anon2.string = PrintInt64((long long)(op1->__anon1.i64 >= value2));
6800 if(!exp->expType)
6801 {
6802 exp->expType = op1->type;
6803 if(op1->type)
6804 op1->type->refCount++;
6805 }
6806 return 1;
6807 }
6808
6809 static unsigned int UInt64GrtEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6810 {
6811 uint64 value2 = op2->__anon1.ui64;
6812
6813 exp->type = 2;
6814 exp->__anon1.__anon2.string = PrintUInt64((uint64)(op1->__anon1.ui64 >= value2));
6815 if(!exp->expType)
6816 {
6817 exp->expType = op1->type;
6818 if(op1->type)
6819 op1->type->refCount++;
6820 }
6821 return 1;
6822 }
6823
6824 static unsigned int ShortGrtEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6825 {
6826 short value2 = op2->__anon1.s;
6827
6828 exp->type = 2;
6829 exp->__anon1.__anon2.string = PrintShort((short)(op1->__anon1.s >= value2));
6830 if(!exp->expType)
6831 {
6832 exp->expType = op1->type;
6833 if(op1->type)
6834 op1->type->refCount++;
6835 }
6836 return 1;
6837 }
6838
6839 static unsigned int UShortGrtEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6840 {
6841 unsigned short value2 = op2->__anon1.us;
6842
6843 exp->type = 2;
6844 exp->__anon1.__anon2.string = PrintUShort((unsigned short)(op1->__anon1.us >= value2));
6845 if(!exp->expType)
6846 {
6847 exp->expType = op1->type;
6848 if(op1->type)
6849 op1->type->refCount++;
6850 }
6851 return 1;
6852 }
6853
6854 static unsigned int CharGrtEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6855 {
6856 char value2 = op2->__anon1.c;
6857
6858 exp->type = 2;
6859 exp->__anon1.__anon2.string = PrintChar((char)(op1->__anon1.c >= value2));
6860 if(!exp->expType)
6861 {
6862 exp->expType = op1->type;
6863 if(op1->type)
6864 op1->type->refCount++;
6865 }
6866 return 1;
6867 }
6868
6869 static unsigned int UCharGrtEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6870 {
6871 unsigned char value2 = op2->__anon1.uc;
6872
6873 exp->type = 2;
6874 exp->__anon1.__anon2.string = PrintUChar((unsigned char)(op1->__anon1.uc >= value2));
6875 if(!exp->expType)
6876 {
6877 exp->expType = op1->type;
6878 if(op1->type)
6879 op1->type->refCount++;
6880 }
6881 return 1;
6882 }
6883
6884 static unsigned int FloatGrtEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6885 {
6886 float value2 = op2->__anon1.f;
6887
6888 exp->type = 2;
6889 exp->__anon1.__anon2.string = PrintFloat((float)(op1->__anon1.f >= value2));
6890 if(!exp->expType)
6891 {
6892 exp->expType = op1->type;
6893 if(op1->type)
6894 op1->type->refCount++;
6895 }
6896 return 1;
6897 }
6898
6899 static unsigned int DoubleGrtEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6900 {
6901 double value2 = op2->__anon1.d;
6902
6903 exp->type = 2;
6904 exp->__anon1.__anon2.string = PrintDouble((double)(op1->__anon1.d >= value2));
6905 if(!exp->expType)
6906 {
6907 exp->expType = op1->type;
6908 if(op1->type)
6909 op1->type->refCount++;
6910 }
6911 return 1;
6912 }
6913
6914 static unsigned int IntSmaEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6915 {
6916 int value2 = op2->__anon1.i;
6917
6918 exp->type = 2;
6919 exp->__anon1.__anon2.string = PrintInt((int)(op1->__anon1.i <= value2));
6920 if(!exp->expType)
6921 {
6922 exp->expType = op1->type;
6923 if(op1->type)
6924 op1->type->refCount++;
6925 }
6926 return 1;
6927 }
6928
6929 static unsigned int UIntSmaEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6930 {
6931 unsigned int value2 = op2->__anon1.ui;
6932
6933 exp->type = 2;
6934 exp->__anon1.__anon2.string = PrintUInt((unsigned int)(op1->__anon1.ui <= value2));
6935 if(!exp->expType)
6936 {
6937 exp->expType = op1->type;
6938 if(op1->type)
6939 op1->type->refCount++;
6940 }
6941 return 1;
6942 }
6943
6944 static unsigned int Int64SmaEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6945 {
6946 long long value2 = op2->__anon1.i64;
6947
6948 exp->type = 2;
6949 exp->__anon1.__anon2.string = PrintInt64((long long)(op1->__anon1.i64 <= value2));
6950 if(!exp->expType)
6951 {
6952 exp->expType = op1->type;
6953 if(op1->type)
6954 op1->type->refCount++;
6955 }
6956 return 1;
6957 }
6958
6959 static unsigned int UInt64SmaEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6960 {
6961 uint64 value2 = op2->__anon1.ui64;
6962
6963 exp->type = 2;
6964 exp->__anon1.__anon2.string = PrintUInt64((uint64)(op1->__anon1.ui64 <= value2));
6965 if(!exp->expType)
6966 {
6967 exp->expType = op1->type;
6968 if(op1->type)
6969 op1->type->refCount++;
6970 }
6971 return 1;
6972 }
6973
6974 static unsigned int ShortSmaEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6975 {
6976 short value2 = op2->__anon1.s;
6977
6978 exp->type = 2;
6979 exp->__anon1.__anon2.string = PrintShort((short)(op1->__anon1.s <= value2));
6980 if(!exp->expType)
6981 {
6982 exp->expType = op1->type;
6983 if(op1->type)
6984 op1->type->refCount++;
6985 }
6986 return 1;
6987 }
6988
6989 static unsigned int UShortSmaEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6990 {
6991 unsigned short value2 = op2->__anon1.us;
6992
6993 exp->type = 2;
6994 exp->__anon1.__anon2.string = PrintUShort((unsigned short)(op1->__anon1.us <= value2));
6995 if(!exp->expType)
6996 {
6997 exp->expType = op1->type;
6998 if(op1->type)
6999 op1->type->refCount++;
7000 }
7001 return 1;
7002 }
7003
7004 static unsigned int CharSmaEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
7005 {
7006 char value2 = op2->__anon1.c;
7007
7008 exp->type = 2;
7009 exp->__anon1.__anon2.string = PrintChar((char)(op1->__anon1.c <= value2));
7010 if(!exp->expType)
7011 {
7012 exp->expType = op1->type;
7013 if(op1->type)
7014 op1->type->refCount++;
7015 }
7016 return 1;
7017 }
7018
7019 static unsigned int UCharSmaEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
7020 {
7021 unsigned char value2 = op2->__anon1.uc;
7022
7023 exp->type = 2;
7024 exp->__anon1.__anon2.string = PrintUChar((unsigned char)(op1->__anon1.uc <= value2));
7025 if(!exp->expType)
7026 {
7027 exp->expType = op1->type;
7028 if(op1->type)
7029 op1->type->refCount++;
7030 }
7031 return 1;
7032 }
7033
7034 static unsigned int FloatSmaEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
7035 {
7036 float value2 = op2->__anon1.f;
7037
7038 exp->type = 2;
7039 exp->__anon1.__anon2.string = PrintFloat((float)(op1->__anon1.f <= value2));
7040 if(!exp->expType)
7041 {
7042 exp->expType = op1->type;
7043 if(op1->type)
7044 op1->type->refCount++;
7045 }
7046 return 1;
7047 }
7048
7049 static unsigned int DoubleSmaEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
7050 {
7051 double value2 = op2->__anon1.d;
7052
7053 exp->type = 2;
7054 exp->__anon1.__anon2.string = PrintDouble((double)(op1->__anon1.d <= value2));
7055 if(!exp->expType)
7056 {
7057 exp->expType = op1->type;
7058 if(op1->type)
7059 op1->type->refCount++;
7060 }
7061 return 1;
7062 }
7063
7064 static unsigned int IntCond(struct Expression * exp, struct Operand * op1, struct Operand * op2, struct Operand * op3)
7065 {
7066 exp->type = 2;
7067 exp->__anon1.__anon2.string = PrintInt(op1->__anon1.i ? op2->__anon1.i : op3->__anon1.i);
7068 if(!exp->expType)
7069 {
7070 exp->expType = op1->type;
7071 if(op1->type)
7072 op1->type->refCount++;
7073 }
7074 return 1;
7075 }
7076
7077 static unsigned int UIntCond(struct Expression * exp, struct Operand * op1, struct Operand * op2, struct Operand * op3)
7078 {
7079 exp->type = 2;
7080 exp->__anon1.__anon2.string = PrintUInt(op1->__anon1.ui ? op2->__anon1.ui : op3->__anon1.ui);
7081 if(!exp->expType)
7082 {
7083 exp->expType = op1->type;
7084 if(op1->type)
7085 op1->type->refCount++;
7086 }
7087 return 1;
7088 }
7089
7090 static unsigned int Int64Cond(struct Expression * exp, struct Operand * op1, struct Operand * op2, struct Operand * op3)
7091 {
7092 exp->type = 2;
7093 exp->__anon1.__anon2.string = PrintInt64(op1->__anon1.i64 ? op2->__anon1.i64 : op3->__anon1.i64);
7094 if(!exp->expType)
7095 {
7096 exp->expType = op1->type;
7097 if(op1->type)
7098 op1->type->refCount++;
7099 }
7100 return 1;
7101 }
7102
7103 static unsigned int UInt64Cond(struct Expression * exp, struct Operand * op1, struct Operand * op2, struct Operand * op3)
7104 {
7105 exp->type = 2;
7106 exp->__anon1.__anon2.string = PrintUInt64(op1->__anon1.ui64 ? op2->__anon1.ui64 : op3->__anon1.ui64);
7107 if(!exp->expType)
7108 {
7109 exp->expType = op1->type;
7110 if(op1->type)
7111 op1->type->refCount++;
7112 }
7113 return 1;
7114 }
7115
7116 static unsigned int ShortCond(struct Expression * exp, struct Operand * op1, struct Operand * op2, struct Operand * op3)
7117 {
7118 exp->type = 2;
7119 exp->__anon1.__anon2.string = PrintShort(op1->__anon1.s ? op2->__anon1.s : op3->__anon1.s);
7120 if(!exp->expType)
7121 {
7122 exp->expType = op1->type;
7123 if(op1->type)
7124 op1->type->refCount++;
7125 }
7126 return 1;
7127 }
7128
7129 static unsigned int UShortCond(struct Expression * exp, struct Operand * op1, struct Operand * op2, struct Operand * op3)
7130 {
7131 exp->type = 2;
7132 exp->__anon1.__anon2.string = PrintUShort(op1->__anon1.us ? op2->__anon1.us : op3->__anon1.us);
7133 if(!exp->expType)
7134 {
7135 exp->expType = op1->type;
7136 if(op1->type)
7137 op1->type->refCount++;
7138 }
7139 return 1;
7140 }
7141
7142 static unsigned int CharCond(struct Expression * exp, struct Operand * op1, struct Operand * op2, struct Operand * op3)
7143 {
7144 exp->type = 2;
7145 exp->__anon1.__anon2.string = PrintChar(op1->__anon1.c ? op2->__anon1.c : op3->__anon1.c);
7146 if(!exp->expType)
7147 {
7148 exp->expType = op1->type;
7149 if(op1->type)
7150 op1->type->refCount++;
7151 }
7152 return 1;
7153 }
7154
7155 static unsigned int UCharCond(struct Expression * exp, struct Operand * op1, struct Operand * op2, struct Operand * op3)
7156 {
7157 exp->type = 2;
7158 exp->__anon1.__anon2.string = PrintUChar(op1->__anon1.uc ? op2->__anon1.uc : op3->__anon1.uc);
7159 if(!exp->expType)
7160 {
7161 exp->expType = op1->type;
7162 if(op1->type)
7163 op1->type->refCount++;
7164 }
7165 return 1;
7166 }
7167
7168 static void PrintName(struct Type * type, char * string, unsigned int fullName)
7169 {
7170 if(type->name && type->name[0])
7171 {
7172 if(fullName)
7173 strcat(string, type->name);
7174 else
7175 {
7176 char * name = __ecereNameSpace__ecere__sys__RSearchString(type->name, "::", strlen(type->name), 1, 0);
7177
7178 if(name)
7179 name += 2;
7180 else
7181 name = type->name;
7182 strcat(string, name);
7183 }
7184 }
7185 }
7186
7187 static void PrintAttribs(struct Type * type, char * string)
7188 {
7189 if(type)
7190 {
7191 if(type->dllExport)
7192 strcat(string, "dllexport ");
7193 if(type->attrStdcall)
7194 strcat(string, "stdcall ");
7195 }
7196 }
7197
7198 static struct Type * FindMember(struct Type * type, char * string)
7199 {
7200 struct Type * memberType;
7201
7202 for(memberType = type->__anon1.__anon1.members.first; memberType; memberType = memberType->next)
7203 {
7204 if(!memberType->name)
7205 {
7206 struct Type * subType = FindMember(memberType, string);
7207
7208 if(subType)
7209 return subType;
7210 }
7211 else if(!strcmp(memberType->name, string))
7212 return memberType;
7213 }
7214 return (((void *)0));
7215 }
7216
7217 unsigned int __ecereProp_Type_Get_isPointerType(struct Type * this);
7218
7219 unsigned int __ecereProp_Type_Get_specConst(struct Type * this);
7220
7221 static unsigned int Promote(struct Operand * op, int kind, unsigned int isSigned)
7222 {
7223 unsigned int result = 0;
7224
7225 switch(kind)
7226 {
7227 case 2:
7228 if(op->kind == 1 || op->kind == 15 || op->kind == 24)
7229 result = isSigned ? GetOpShort(op, &op->__anon1.s) : GetOpUShort(op, &op->__anon1.us);
7230 break;
7231 case 3:
7232 case 5:
7233 if(op->kind == 1 || op->kind == 2 || op->kind == 15 || op->kind == 24)
7234 result = isSigned ? GetOpInt(op, &op->__anon1.i) : GetOpUInt(op, &op->__anon1.ui);
7235 break;
7236 case 4:
7237 if(op->kind == 1 || op->kind == 2 || op->kind == 3 || op->kind == 4 || op->kind == 5 || op->kind == 6 || op->kind == 7 || op->kind == 13 || op->kind == 15 || op->kind == 22 || op->kind == 23 || op->kind == 24)
7238 result = isSigned ? GetOpInt64(op, &op->__anon1.i64) : GetOpUInt64(op, &op->__anon1.ui64);
7239 break;
7240 case 6:
7241 if(op->kind == 1 || op->kind == 2 || op->kind == 3 || op->kind == 4 || op->kind == 5 || op->kind == 15 || op->kind == 22 || op->kind == 23 || op->kind == 24)
7242 result = GetOpFloat(op, &op->__anon1.f);
7243 break;
7244 case 7:
7245 if(op->kind == 1 || op->kind == 2 || op->kind == 3 || op->kind == 4 || op->kind == 5 || op->kind == 6 || op->kind == 15 || op->kind == 22 || op->kind == 23 || op->kind == 24)
7246 result = GetOpDouble(op, &op->__anon1.d);
7247 break;
7248 case 13:
7249 if(op->kind == 1 || op->kind == 2 || op->kind == 3 || op->kind == 4 || op->kind == 5 || op->kind == 6 || op->kind == 7 || op->kind == 13 || op->kind == 15 || op->kind == 22 || op->kind == 23 || op->kind == 24)
7250 result = GetOpUInt64(op, &op->__anon1.ui64);
7251 break;
7252 case 15:
7253 if(op->kind == 1 || op->kind == 2 || op->kind == 3 || op->kind == 4 || op->kind == 5 || op->kind == 6 || op->kind == 7 || op->kind == 13 || op->kind == 15 || op->kind == 22 || op->kind == 23 || op->kind == 24)
7254 result = isSigned ? GetOpInt(op, &op->__anon1.i) : GetOpUInt(op, &op->__anon1.ui);
7255 break;
7256 case 22:
7257 if(op->kind == 1 || op->kind == 2 || op->kind == 3 || op->kind == 5 || op->kind == 15 || op->kind == 24)
7258 result = isSigned ? GetOpInt64(op, &op->__anon1.i64) : GetOpUInt64(op, &op->__anon1.ui64);
7259 break;
7260 case 23:
7261 if(op->kind == 1 || op->kind == 2 || op->kind == 3 || op->kind == 5 || op->kind == 15 || op->kind == 24)
7262 result = isSigned ? GetOpInt64(op, &op->__anon1.i64) : GetOpUInt64(op, &op->__anon1.ui64);
7263 break;
7264 }
7265 return result;
7266 }
7267
7268 struct OpTable floatOps =
7269 {
7270 (void *)(FloatAdd), (void *)(FloatSub), (void *)(FloatMul), (void *)(FloatDiv), (((void *)0)), (void *)(FloatNeg), (void *)(FloatInc), (void *)(FloatDec), (void *)(FloatAsign), (void *)(FloatAddAsign), (void *)(FloatSubAsign), (void *)(FloatMulAsign), (void *)(FloatDivAsign), (((void *)0)), (((void *)0)), (((void *)0)), (((void *)0)), (((void *)0)), (((void *)0)), (((void *)0)), (((void *)0)), (((void *)0)), (((void *)0)), (((void *)0)), (((void *)0)), (((void *)0)), (void *)(FloatEqu), (void *)(FloatNqu), (void *)(FloatAnd), (void *)(FloatOr), (void *)(FloatGrt), (void *)(FloatSma), (void *)(FloatGrtEqu), (void *)(FloatSmaEqu)
7271 };
7272
7273 struct OpTable doubleOps =
7274 {
7275 (void *)(DoubleAdd), (void *)(DoubleSub), (void *)(DoubleMul), (void *)(DoubleDiv), (((void *)0)), (void *)(DoubleNeg), (void *)(DoubleInc), (void *)(DoubleDec), (void *)(DoubleAsign), (void *)(DoubleAddAsign), (void *)(DoubleSubAsign), (void *)(DoubleMulAsign), (void *)(DoubleDivAsign), (((void *)0)), (((void *)0)), (((void *)0)), (((void *)0)), (((void *)0)), (((void *)0)), (((void *)0)), (((void *)0)), (((void *)0)), (((void *)0)), (((void *)0)), (((void *)0)), (((void *)0)), (void *)(DoubleEqu), (void *)(DoubleNqu), (void *)(DoubleAnd), (void *)(DoubleOr), (void *)(DoubleGrt), (void *)(DoubleSma), (void *)(DoubleGrtEqu), (void *)(DoubleSmaEqu)
7276 };
7277
7278 struct OpTable intOps =
7279 {
7280 (void *)(IntAdd), (void *)(IntSub), (void *)(IntMul), (void *)(IntDiv), (void *)(IntMod), (void *)(IntNeg), (void *)(IntInc), (void *)(IntDec), (void *)(IntAsign), (void *)(IntAddAsign), (void *)(IntSubAsign), (void *)(IntMulAsign), (void *)(IntDivAsign), (void *)(IntModAsign), (void *)(IntBitAnd), (void *)(IntBitOr), (void *)(IntBitXor), (void *)(IntLShift), (void *)(IntRShift), (void *)(IntBitNot), (void *)(IntAndAsign), (void *)(IntOrAsign), (void *)(IntXorAsign), (void *)(IntLShiftAsign), (void *)(IntRShiftAsign), (void *)(IntNot), (void *)(IntEqu), (void *)(IntNqu), (void *)(IntAnd), (void *)(IntOr), (void *)(IntGrt), (void *)(IntSma), (void *)(IntGrtEqu), (void *)(IntSmaEqu), (void *)(IntCond)
7281 };
7282
7283 struct OpTable uintOps =
7284 {
7285 (void *)(UIntAdd), (void *)(UIntSub), (void *)(UIntMul), (void *)(UIntDiv), (void *)(UIntMod), (void *)(UIntNeg), (void *)(UIntInc), (void *)(UIntDec), (void *)(UIntAsign), (void *)(UIntAddAsign), (void *)(UIntSubAsign), (void *)(UIntMulAsign), (void *)(UIntDivAsign), (void *)(UIntModAsign), (void *)(UIntBitAnd), (void *)(UIntBitOr), (void *)(UIntBitXor), (void *)(UIntLShift), (void *)(UIntRShift), (void *)(UIntBitNot), (void *)(UIntAndAsign), (void *)(UIntOrAsign), (void *)(UIntXorAsign), (void *)(UIntLShiftAsign), (void *)(UIntRShiftAsign), (void *)(UIntNot), (void *)(UIntEqu), (void *)(UIntNqu), (void *)(UIntAnd), (void *)(UIntOr), (void *)(UIntGrt), (void *)(UIntSma), (void *)(UIntGrtEqu), (void *)(UIntSmaEqu), (void *)(UIntCond)
7286 };
7287
7288 struct OpTable int64Ops =
7289 {
7290 (void *)(Int64Add), (void *)(Int64Sub), (void *)(Int64Mul), (void *)(Int64Div), (void *)(Int64Mod), (void *)(Int64Neg), (void *)(Int64Inc), (void *)(Int64Dec), (void *)(Int64Asign), (void *)(Int64AddAsign), (void *)(Int64SubAsign), (void *)(Int64MulAsign), (void *)(Int64DivAsign), (void *)(Int64ModAsign), (void *)(Int64BitAnd), (void *)(Int64BitOr), (void *)(Int64BitXor), (void *)(Int64LShift), (void *)(Int64RShift), (void *)(Int64BitNot), (void *)(Int64AndAsign), (void *)(Int64OrAsign), (void *)(Int64XorAsign), (void *)(Int64LShiftAsign), (void *)(Int64RShiftAsign), (void *)(Int64Not), (void *)(Int64Equ), (void *)(Int64Nqu), (void *)(Int64And), (void *)(Int64Or), (void *)(Int64Grt), (void *)(Int64Sma), (void *)(Int64GrtEqu), (void *)(Int64SmaEqu), (void *)(Int64Cond)
7291 };
7292
7293 struct OpTable uint64Ops =
7294 {
7295 (void *)(UInt64Add), (void *)(UInt64Sub), (void *)(UInt64Mul), (void *)(UInt64Div), (void *)(UInt64Mod), (void *)(UInt64Neg), (void *)(UInt64Inc), (void *)(UInt64Dec), (void *)(UInt64Asign), (void *)(UInt64AddAsign), (void *)(UInt64SubAsign), (void *)(UInt64MulAsign), (void *)(UInt64DivAsign), (void *)(UInt64ModAsign), (void *)(UInt64BitAnd), (void *)(UInt64BitOr), (void *)(UInt64BitXor), (void *)(UInt64LShift), (void *)(UInt64RShift), (void *)(UInt64BitNot), (void *)(UInt64AndAsign), (void *)(UInt64OrAsign), (void *)(UInt64XorAsign), (void *)(UInt64LShiftAsign), (void *)(UInt64RShiftAsign), (void *)(UInt64Not), (void *)(UInt64Equ), (void *)(UInt64Nqu), (void *)(UInt64And), (void *)(UInt64Or), (void *)(UInt64Grt), (void *)(UInt64Sma), (void *)(UInt64GrtEqu), (void *)(UInt64SmaEqu), (void *)(UInt64Cond)
7296 };
7297
7298 struct OpTable shortOps =
7299 {
7300 (void *)(ShortAdd), (void *)(ShortSub), (void *)(ShortMul), (void *)(ShortDiv), (void *)(ShortMod), (void *)(ShortNeg), (void *)(ShortInc), (void *)(ShortDec), (void *)(ShortAsign), (void *)(ShortAddAsign), (void *)(ShortSubAsign), (void *)(ShortMulAsign), (void *)(ShortDivAsign), (void *)(ShortModAsign), (void *)(ShortBitAnd), (void *)(ShortBitOr), (void *)(ShortBitXor), (void *)(ShortLShift), (void *)(ShortRShift), (void *)(ShortBitNot), (void *)(ShortAndAsign), (void *)(ShortOrAsign), (void *)(ShortXorAsign), (void *)(ShortLShiftAsign), (void *)(ShortRShiftAsign), (void *)(ShortNot), (void *)(ShortEqu), (void *)(ShortNqu), (void *)(ShortAnd), (void *)(ShortOr), (void *)(ShortGrt), (void *)(ShortSma), (void *)(ShortGrtEqu), (void *)(ShortSmaEqu), (void *)(ShortCond)
7301 };
7302
7303 struct OpTable ushortOps =
7304 {
7305 (void *)(UShortAdd), (void *)(UShortSub), (void *)(UShortMul), (void *)(UShortDiv), (void *)(UShortMod), (void *)(UShortNeg), (void *)(UShortInc), (void *)(UShortDec), (void *)(UShortAsign), (void *)(UShortAddAsign), (void *)(UShortSubAsign), (void *)(UShortMulAsign), (void *)(UShortDivAsign), (void *)(UShortModAsign), (void *)(UShortBitAnd), (void *)(UShortBitOr), (void *)(UShortBitXor), (void *)(UShortLShift), (void *)(UShortRShift), (void *)(UShortBitNot), (void *)(UShortAndAsign), (void *)(UShortOrAsign), (void *)(UShortXorAsign), (void *)(UShortLShiftAsign), (void *)(UShortRShiftAsign), (void *)(UShortNot), (void *)(UShortEqu), (void *)(UShortNqu), (void *)(UShortAnd), (void *)(UShortOr), (void *)(UShortGrt), (void *)(UShortSma), (void *)(UShortGrtEqu), (void *)(UShortSmaEqu), (void *)(UShortCond)
7306 };
7307
7308 struct OpTable charOps =
7309 {
7310 (void *)(CharAdd), (void *)(CharSub), (void *)(CharMul), (void *)(CharDiv), (void *)(CharMod), (void *)(CharNeg), (void *)(CharInc), (void *)(CharDec), (void *)(CharAsign), (void *)(CharAddAsign), (void *)(CharSubAsign), (void *)(CharMulAsign), (void *)(CharDivAsign), (void *)(CharModAsign), (void *)(CharBitAnd), (void *)(CharBitOr), (void *)(CharBitXor), (void *)(CharLShift), (void *)(CharRShift), (void *)(CharBitNot), (void *)(CharAndAsign), (void *)(CharOrAsign), (void *)(CharXorAsign), (void *)(CharLShiftAsign), (void *)(CharRShiftAsign), (void *)(CharNot), (void *)(CharEqu), (void *)(CharNqu), (void *)(CharAnd), (void *)(CharOr), (void *)(CharGrt), (void *)(CharSma), (void *)(CharGrtEqu), (void *)(CharSmaEqu), (void *)(CharCond)
7311 };
7312
7313 struct OpTable ucharOps =
7314 {
7315 (void *)(UCharAdd), (void *)(UCharSub), (void *)(UCharMul), (void *)(UCharDiv), (void *)(UCharMod), (void *)(UCharNeg), (void *)(UCharInc), (void *)(UCharDec), (void *)(UCharAsign), (void *)(UCharAddAsign), (void *)(UCharSubAsign), (void *)(UCharMulAsign), (void *)(UCharDivAsign), (void *)(UCharModAsign), (void *)(UCharBitAnd), (void *)(UCharBitOr), (void *)(UCharBitXor), (void *)(UCharLShift), (void *)(UCharRShift), (void *)(UCharBitNot), (void *)(UCharAndAsign), (void *)(UCharOrAsign), (void *)(UCharXorAsign), (void *)(UCharLShiftAsign), (void *)(UCharRShiftAsign), (void *)(UCharNot), (void *)(UCharEqu), (void *)(UCharNqu), (void *)(UCharAnd), (void *)(UCharOr), (void *)(UCharGrt), (void *)(UCharSma), (void *)(UCharGrtEqu), (void *)(UCharSmaEqu), (void *)(UCharCond)
7316 };
7317
7318 struct Type * FindMemberAndOffset(struct Type * type, char * string, unsigned int * offset)
7319 {
7320 struct Type * memberType;
7321
7322 for(memberType = type->__anon1.__anon1.members.first; memberType; memberType = memberType->next)
7323 {
7324 if(!memberType->name)
7325 {
7326 struct Type * subType = FindMember(memberType, string);
7327
7328 if(subType)
7329 {
7330 *offset += memberType->offset;
7331 return subType;
7332 }
7333 }
7334 else if(!strcmp(memberType->name, string))
7335 {
7336 *offset += memberType->offset;
7337 return memberType;
7338 }
7339 }
7340 return (((void *)0));
7341 }
7342
7343 struct __ecereNameSpace__ecere__com__Module;
7344
7345 extern struct __ecereNameSpace__ecere__com__Property * __ecereNameSpace__ecere__com__eClass_FindProperty(struct __ecereNameSpace__ecere__com__Class * _class, const char *  name, struct __ecereNameSpace__ecere__com__Instance * module);
7346
7347 extern struct __ecereNameSpace__ecere__com__Instance * privateModule;
7348
7349 extern struct __ecereNameSpace__ecere__com__Method * __ecereNameSpace__ecere__com__eClass_FindMethod(struct __ecereNameSpace__ecere__com__Class * _class, const char *  name, struct __ecereNameSpace__ecere__com__Instance * module);
7350
7351 extern struct __ecereNameSpace__ecere__com__DataMember * __ecereNameSpace__ecere__com__eClass_FindDataMember(struct __ecereNameSpace__ecere__com__Class * _class, const char *  name, struct __ecereNameSpace__ecere__com__Instance * module, struct __ecereNameSpace__ecere__com__DataMember **  subMemberStack, int *  subMemberStackPos);
7352
7353 extern struct ModuleImport * FindModule(struct __ecereNameSpace__ecere__com__Instance * moduleToFind);
7354
7355 extern struct __ecereNameSpace__ecere__com__Class * __ecereNameSpace__ecere__com__eSystem_FindClass(struct __ecereNameSpace__ecere__com__Instance * module, const char *  name);
7356
7357 struct GlobalData
7358 {
7359 uintptr_t key;
7360 struct __ecereNameSpace__ecere__sys__BTNode * parent;
7361 struct __ecereNameSpace__ecere__sys__BTNode * left;
7362 struct __ecereNameSpace__ecere__sys__BTNode * right;
7363 int depth;
7364 struct __ecereNameSpace__ecere__com__Instance * module;
7365 char *  dataTypeString;
7366 struct Type * dataType;
7367 void *  symbol;
7368 char *  fullName;
7369 } ecere_gcc_struct;
7370
7371 extern struct __ecereNameSpace__ecere__com__DataMember * __ecereNameSpace__ecere__com__eClass_FindDataMemberAndOffset(struct __ecereNameSpace__ecere__com__Class * _class, const char *  name, unsigned int *  offset, struct __ecereNameSpace__ecere__com__Instance * module, struct __ecereNameSpace__ecere__com__DataMember **  subMemberStack, int *  subMemberStackPos);
7372
7373 extern struct __ecereNameSpace__ecere__com__Instance * GetPrivateModule(void);
7374
7375 extern struct __ecereNameSpace__ecere__com__Class * __ecereNameSpace__ecere__com__eSystem_RegisterClass(int type, const char *  name, const char *  baseName, int size, int sizeClass, unsigned int (*  Constructor)(void * ), void (*  Destructor)(void * ), struct __ecereNameSpace__ecere__com__Instance * module, int declMode, int inheritanceAccess);
7376
7377 extern struct __ecereNameSpace__ecere__com__Instance * __thisModule;
7378
7379 struct __ecereNameSpace__ecere__com__DefinedExpression;
7380
7381 extern struct __ecereNameSpace__ecere__com__DefinedExpression * __ecereNameSpace__ecere__com__eSystem_FindDefine(struct __ecereNameSpace__ecere__com__Instance * module, const char *  name);
7382
7383 struct __ecereNameSpace__ecere__com__DefinedExpression
7384 {
7385 struct __ecereNameSpace__ecere__com__DefinedExpression * prev;
7386 struct __ecereNameSpace__ecere__com__DefinedExpression * next;
7387 const char *  name;
7388 const char *  value;
7389 struct __ecereNameSpace__ecere__com__NameSpace *  nameSpace;
7390 } ecere_gcc_struct;
7391
7392 struct __ecereNameSpace__ecere__sys__BinaryTree;
7393
7394 struct __ecereNameSpace__ecere__sys__BinaryTree
7395 {
7396 struct __ecereNameSpace__ecere__sys__BTNode * root;
7397 int count;
7398 int (*  CompareKey)(struct __ecereNameSpace__ecere__sys__BinaryTree * tree, uintptr_t a, uintptr_t b);
7399 void (*  FreeKey)(void *  key);
7400 } ecere_gcc_struct;
7401
7402 struct __ecereNameSpace__ecere__com__Class
7403 {
7404 struct __ecereNameSpace__ecere__com__Class * prev;
7405 struct __ecereNameSpace__ecere__com__Class * next;
7406 const char *  name;
7407 int offset;
7408 int structSize;
7409 void * *  _vTbl;
7410 int vTblSize;
7411 unsigned int (*  Constructor)(void * );
7412 void (*  Destructor)(void * );
7413 int offsetClass;
7414 int sizeClass;
7415 struct __ecereNameSpace__ecere__com__Class * base;
7416 struct __ecereNameSpace__ecere__sys__BinaryTree methods;
7417 struct __ecereNameSpace__ecere__sys__BinaryTree members;
7418 struct __ecereNameSpace__ecere__sys__BinaryTree prop;
7419 struct __ecereNameSpace__ecere__sys__OldList membersAndProperties;
7420 struct __ecereNameSpace__ecere__sys__BinaryTree classProperties;
7421 struct __ecereNameSpace__ecere__sys__OldList derivatives;
7422 int memberID;
7423 int startMemberID;
7424 int type;
7425 struct __ecereNameSpace__ecere__com__Instance * module;
7426 struct __ecereNameSpace__ecere__com__NameSpace *  nameSpace;
7427 const char *  dataTypeString;
7428 struct Type * dataType;
7429 int typeSize;
7430 int defaultAlignment;
7431 void (*  Initialize)();
7432 int memberOffset;
7433 struct __ecereNameSpace__ecere__sys__OldList selfWatchers;
7434 const char *  designerClass;
7435 unsigned int noExpansion;
7436 const char *  defaultProperty;
7437 unsigned int comRedefinition;
7438 int count;
7439 int isRemote;
7440 unsigned int internalDecl;
7441 void *  data;
7442 unsigned int computeSize;
7443 short structAlignment;
7444 short pointerAlignment;
7445 int destructionWatchOffset;
7446 unsigned int fixed;
7447 struct __ecereNameSpace__ecere__sys__OldList delayedCPValues;
7448 int inheritanceAccess;
7449 const char *  fullName;
7450 void *  symbol;
7451 struct __ecereNameSpace__ecere__sys__OldList conversions;
7452 struct __ecereNameSpace__ecere__sys__OldList templateParams;
7453 struct __ecereNameSpace__ecere__com__ClassTemplateArgument *  templateArgs;
7454 struct __ecereNameSpace__ecere__com__Class * templateClass;
7455 struct __ecereNameSpace__ecere__sys__OldList templatized;
7456 int numParams;
7457 unsigned int isInstanceClass;
7458 unsigned int byValueSystemClass;
7459 } ecere_gcc_struct;
7460
7461 struct __ecereNameSpace__ecere__com__NameSpace
7462 {
7463 const char *  name;
7464 struct __ecereNameSpace__ecere__com__NameSpace *  btParent;
7465 struct __ecereNameSpace__ecere__com__NameSpace *  left;
7466 struct __ecereNameSpace__ecere__com__NameSpace *  right;
7467 int depth;
7468 struct __ecereNameSpace__ecere__com__NameSpace *  parent;
7469 struct __ecereNameSpace__ecere__sys__BinaryTree nameSpaces;
7470 struct __ecereNameSpace__ecere__sys__BinaryTree classes;
7471 struct __ecereNameSpace__ecere__sys__BinaryTree defines;
7472 struct __ecereNameSpace__ecere__sys__BinaryTree functions;
7473 } ecere_gcc_struct;
7474
7475 struct __ecereNameSpace__ecere__com__DataMember
7476 {
7477 struct __ecereNameSpace__ecere__com__DataMember * prev;
7478 struct __ecereNameSpace__ecere__com__DataMember * next;
7479 const char *  name;
7480 unsigned int isProperty;
7481 int memberAccess;
7482 int id;
7483 struct __ecereNameSpace__ecere__com__Class * _class;
7484 const char *  dataTypeString;
7485 struct __ecereNameSpace__ecere__com__Class * dataTypeClass;
7486 struct Type * dataType;
7487 int type;
7488 int offset;
7489 int memberID;
7490 struct __ecereNameSpace__ecere__sys__OldList members;
7491 struct __ecereNameSpace__ecere__sys__BinaryTree membersAlpha;
7492 int memberOffset;
7493 short structAlignment;
7494 short pointerAlignment;
7495 } ecere_gcc_struct;
7496
7497 struct __ecereNameSpace__ecere__sys__BTNode * __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindString(struct __ecereNameSpace__ecere__sys__BinaryTree * this, const char *  key);
7498
7499 unsigned int __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Add(struct __ecereNameSpace__ecere__sys__BinaryTree * this, struct __ecereNameSpace__ecere__sys__BTNode * node);
7500
7501 struct __ecereNameSpace__ecere__sys__BTNode * __ecereProp___ecereNameSpace__ecere__sys__BinaryTree_Get_first(struct __ecereNameSpace__ecere__sys__BinaryTree * this);
7502
7503 struct __ecereNameSpace__ecere__sys__BTNode * __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindPrefix(struct __ecereNameSpace__ecere__sys__BinaryTree * this, const char *  key);
7504
7505 void __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Remove(struct __ecereNameSpace__ecere__sys__BinaryTree * this, struct __ecereNameSpace__ecere__sys__BTNode * node);
7506
7507 static struct __ecereNameSpace__ecere__com__Class * __ecereClass_Conversion;
7508
7509 static void _DeclareType(struct External * neededFor, struct Type * type, unsigned int needDereference, unsigned int forFunctionDef, unsigned int fwdDecl)
7510 {
7511 if(inCompiler)
7512 {
7513 if(type->kind == 11)
7514 {
7515 struct Type * param;
7516
7517 for(param = type->__anon1.__anon2.params.first; param; param = param->next)
7518 _DeclareType(neededFor, param, forFunctionDef, 0, fwdDecl);
7519 _DeclareType(neededFor, type->__anon1.__anon2.returnType, forFunctionDef, 0, fwdDecl);
7520 }
7521 else if(type->kind == 13)
7522 _DeclareType(neededFor, type->__anon1.type, 0, 0, fwdDecl);
7523 else if(type->kind == 8)
7524 {
7525 struct __ecereNameSpace__ecere__com__Class * c = type->__anon1._class->__anon1.registered;
7526
7527 _DeclareStruct(neededFor, c ? c->fullName : "ecere::com::Instance", c ? c->type == 5 : 0, needDereference && c && c->type == 1, fwdDecl);
7528 }
7529 else if(type->kind == 9 || type->kind == 10)
7530 {
7531 struct Type * member;
7532
7533 for(member = type->__anon1.__anon1.members.first; member; member = member->next)
7534 _DeclareType(neededFor, member, needDereference, forFunctionDef, fwdDecl);
7535 }
7536 else if(type->kind == 12)
7537 _DeclareType(neededFor, type->__anon1.__anon4.arrayType, 1, 0, fwdDecl);
7538 }
7539 }
7540
7541 static unsigned int CheckConstCompatibility(struct Type * source, struct Type * dest, unsigned int warn)
7542 {
7543 unsigned int status = 1;
7544
7545 if(((source->kind == 8 && source->__anon1._class && source->__anon1._class->__anon1.registered) || source->kind == 12 || source->kind == 13) && ((dest->kind == 8 && dest->__anon1._class && dest->__anon1._class->__anon1.registered) || dest->kind == 13))
7546 {
7547 struct __ecereNameSpace__ecere__com__Class * sourceClass = source->kind == 8 ? source->__anon1._class->__anon1.registered : (((void *)0));
7548 struct __ecereNameSpace__ecere__com__Class * destClass = dest->kind == 8 ? dest->__anon1._class->__anon1.registered : (((void *)0));
7549
7550 if((!sourceClass || (sourceClass && sourceClass->type == 0 && !sourceClass->structSize)) && (!destClass || (destClass && destClass->type == 0 && !destClass->structSize)))
7551 {
7552 struct Type * sourceType = source, * destType = dest;
7553
7554 while((sourceType->kind == 13 || sourceType->kind == 12) && sourceType->__anon1.type)
7555 sourceType = sourceType->__anon1.type;
7556 while((destType->kind == 13 || destType->kind == 12) && destType->__anon1.type)
7557 destType = destType->__anon1.type;
7558 if(!destType->constant && sourceType->constant)
7559 {
7560 status = 0;
7561 if(warn)
7562 Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "discarding const qualifier\n", (((void *)0))));
7563 }
7564 }
7565 }
7566 return status;
7567 }
7568
7569 struct Operand GetOperand(struct Expression * exp)
7570 {
7571 struct Operand op =
7572 {
7573 0, 0, 0,
7574 .__anon1 = {
7575 .c = 0
7576 },
7577 {
7578 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
7579 }
7580 };
7581 struct Type * type = exp->expType;
7582
7583 if(type)
7584 {
7585 while(type->kind == 8 && type->__anon1._class && type->__anon1._class->__anon1.registered && (type->__anon1._class->__anon1.registered->type == 2 || type->__anon1._class->__anon1.registered->type == 3 || type->__anon1._class->__anon1.registered->type == 4))
7586 {
7587 if(!type->__anon1._class->__anon1.registered->dataType)
7588 type->__anon1._class->__anon1.registered->dataType = ProcessTypeString(type->__anon1._class->__anon1.registered->dataTypeString, 0);
7589 type = type->__anon1._class->__anon1.registered->dataType;
7590 }
7591 if(exp->type == 3 && op.kind == 13)
7592 {
7593 op.__anon1.ui64 = (uint64)(uintptr_t)exp->__anon1.__anon2.string;
7594 op.kind = 13;
7595 op.ops = uint64Ops;
7596 }
7597 else if(exp->isConstant && exp->type == 2)
7598 {
7599 op.kind = type->kind;
7600 op.type = type;
7601 switch(op.kind)
7602 {
7603 case 24:
7604 case 1:
7605 {
7606 if(exp->__anon1.__anon1.constant[0] == '\'')
7607 {
7608 op.__anon1.c = exp->__anon1.__anon1.constant[1];
7609 op.ops = charOps;
7610 }
7611 else if(type->isSigned)
7612 {
7613 op.__anon1.c = (char)strtol(exp->__anon1.__anon1.constant, (((void *)0)), 0);
7614 op.ops = charOps;
7615 }
7616 else
7617 {
7618 op.__anon1.uc = (unsigned char)strtoul(exp->__anon1.__anon1.constant, (((void *)0)), 0);
7619 op.ops = ucharOps;
7620 }
7621 break;
7622 }
7623 case 2:
7624 if(exp->__anon1.__anon1.constant[0] == '\'')
7625 {
7626 op.__anon1.s = exp->__anon1.__anon1.constant[1];
7627 op.ops = shortOps;
7628 }
7629 else if(type->isSigned)
7630 {
7631 op.__anon1.s = (short)strtol(exp->__anon1.__anon1.constant, (((void *)0)), 0);
7632 op.ops = shortOps;
7633 }
7634 else
7635 {
7636 op.__anon1.us = (unsigned short)strtoul(exp->__anon1.__anon1.constant, (((void *)0)), 0);
7637 op.ops = ushortOps;
7638 }
7639 break;
7640 case 3:
7641 case 5:
7642 if(exp->__anon1.__anon1.constant[0] == '\'')
7643 {
7644 op.__anon1.i = exp->__anon1.__anon1.constant[1];
7645 op.ops = intOps;
7646 }
7647 else if(type->isSigned)
7648 {
7649 op.__anon1.i = strtol(exp->__anon1.__anon1.constant, (((void *)0)), 0);
7650 op.ops = intOps;
7651 }
7652 else
7653 {
7654 op.__anon1.ui = (unsigned int)strtoul(exp->__anon1.__anon1.constant, (((void *)0)), 0);
7655 op.ops = uintOps;
7656 }
7657 op.kind = 3;
7658 break;
7659 case 4:
7660 if(type->isSigned)
7661 {
7662 op.__anon1.i64 = __ecereNameSpace__ecere__com___strtoi64(exp->__anon1.__anon1.constant, (((void *)0)), 0);
7663 op.ops = int64Ops;
7664 }
7665 else
7666 {
7667 op.__anon1.ui64 = __ecereNameSpace__ecere__com___strtoui64(exp->__anon1.__anon1.constant, (((void *)0)), 0);
7668 op.ops = uint64Ops;
7669 }
7670 op.kind = 4;
7671 break;
7672 case 22:
7673 if(type->isSigned)
7674 {
7675 op.__anon1.i64 = __ecereNameSpace__ecere__com___strtoi64(exp->__anon1.__anon1.constant, (((void *)0)), 0);
7676 op.ops = int64Ops;
7677 }
7678 else
7679 {
7680 op.__anon1.ui64 = __ecereNameSpace__ecere__com___strtoui64(exp->__anon1.__anon1.constant, (((void *)0)), 0);
7681 op.ops = uint64Ops;
7682 }
7683 op.kind = 4;
7684 break;
7685 case 23:
7686 if(type->isSigned)
7687 {
7688 op.__anon1.i64 = __ecereNameSpace__ecere__com___strtoi64(exp->__anon1.__anon1.constant, (((void *)0)), 0);
7689 op.ops = int64Ops;
7690 }
7691 else
7692 {
7693 op.__anon1.ui64 = __ecereNameSpace__ecere__com___strtoui64(exp->__anon1.__anon1.constant, (((void *)0)), 0);
7694 op.ops = uint64Ops;
7695 }
7696 op.kind = 4;
7697 break;
7698 case 6:
7699 if(!strcmp(exp->__anon1.__anon1.constant, "inf"))
7700 op.__anon1.f = __ecereMethod_float_inf();
7701 else if(!strcmp(exp->__anon1.__anon1.constant, "-inf"))
7702 op.__anon1.f = -__ecereMethod_float_inf();
7703 else if(!strcmp(exp->__anon1.__anon1.constant, "nan"))
7704 op.__anon1.f = __ecereMethod_float_nan();
7705 else if(!strcmp(exp->__anon1.__anon1.constant, "-nan"))
7706 op.__anon1.f = -__ecereMethod_float_nan();
7707 else
7708 op.__anon1.f = (float)strtod(exp->__anon1.__anon1.constant, (((void *)0)));
7709 op.ops = floatOps;
7710 break;
7711 case 7:
7712 if(!strcmp(exp->__anon1.__anon1.constant, "inf"))
7713 op.__anon1.d = __ecereMethod_double_inf();
7714 else if(!strcmp(exp->__anon1.__anon1.constant, "-inf"))
7715 op.__anon1.d = -__ecereMethod_double_inf();
7716 else if(!strcmp(exp->__anon1.__anon1.constant, "nan"))
7717 op.__anon1.d = __ecereMethod_double_nan();
7718 else if(!strcmp(exp->__anon1.__anon1.constant, "-nan"))
7719 op.__anon1.d = -__ecereMethod_double_nan();
7720 else
7721 op.__anon1.d = (double)strtod(exp->__anon1.__anon1.constant, (((void *)0)));
7722 op.ops = doubleOps;
7723 break;
7724 case 12:
7725 case 13:
7726 case 8:
7727 op.__anon1.ui64 = __ecereNameSpace__ecere__com___strtoui64(exp->__anon1.__anon1.constant, (((void *)0)), 0);
7728 op.kind = 13;
7729 op.ops = uint64Ops;
7730 break;
7731 }
7732 }
7733 }
7734 return op;
7735 }
7736
7737 static long long GetEnumValue(struct __ecereNameSpace__ecere__com__Class * _class, void * ptr)
7738 {
7739 long long v = 0;
7740
7741 switch(_class->typeSize)
7742 {
7743 case 8:
7744 if(!strcmp(_class->dataTypeString, "uint64"))
7745 v = (long long)*(uint64 *)ptr;
7746 else
7747 v = *(long long *)ptr;
7748 break;
7749 case 4:
7750 if(!strcmp(_class->dataTypeString, "uint"))
7751 v = (long long)*(unsigned int *)ptr;
7752 else
7753 v = (long long)*(int *)ptr;
7754 break;
7755 case 2:
7756 if(!strcmp(_class->dataTypeString, "uint16"))
7757 v = (long long)*(unsigned short *)ptr;
7758 else
7759 v = (long long)*(short *)ptr;
7760 break;
7761 case 1:
7762 if(!strcmp(_class->dataTypeString, "byte"))
7763 v = (long long)*(unsigned char *)ptr;
7764 else
7765 v = (long long)*(char *)ptr;
7766 break;
7767 }
7768 return v;
7769 }
7770
7771 static void GetTypeSpecs(struct Type * type, struct __ecereNameSpace__ecere__sys__OldList * specs)
7772 {
7773 if(!type->isSigned && type->kind != 22 && type->kind != 23)
7774 ListAdd(specs, MkSpecifier(UNSIGNED));
7775 switch(type->kind)
7776 {
7777 case 8:
7778 {
7779 if(type->__anon1._class->__anon1.registered)
7780 {
7781 if(!type->__anon1._class->__anon1.registered->dataType)
7782 type->__anon1._class->__anon1.registered->dataType = ProcessTypeString(type->__anon1._class->__anon1.registered->dataTypeString, 0);
7783 GetTypeSpecs(type->__anon1._class->__anon1.registered->dataType, specs);
7784 }
7785 break;
7786 }
7787 case 7:
7788 ListAdd(specs, MkSpecifier(DOUBLE));
7789 break;
7790 case 6:
7791 ListAdd(specs, MkSpecifier(FLOAT));
7792 break;
7793 case 1:
7794 ListAdd(specs, MkSpecifier(CHAR));
7795 break;
7796 case 24:
7797 ListAdd(specs, MkSpecifier(_BOOL));
7798 break;
7799 case 2:
7800 ListAdd(specs, MkSpecifier(SHORT));
7801 break;
7802 case 4:
7803 ListAdd(specs, MkSpecifier(INT64));
7804 break;
7805 case 22:
7806 ListAdd(specs, MkSpecifierName(type->isSigned ? "intptr" : "uintptr"));
7807 break;
7808 case 23:
7809 ListAdd(specs, MkSpecifierName(type->isSigned ? "intsize" : "uintsize"));
7810 break;
7811 case 3:
7812 default:
7813 ListAdd(specs, MkSpecifier(INT));
7814 break;
7815 }
7816 }
7817
7818 static void PrintTypeSpecs(struct Type * type, char * string, unsigned int fullName, unsigned int printConst)
7819 {
7820 if(type)
7821 {
7822 if(printConst && type->constant)
7823 strcat(string, "const ");
7824 switch(type->kind)
7825 {
7826 case 8:
7827 {
7828 struct Symbol * c = type->__anon1._class;
7829 unsigned int isObjectBaseClass = !c || !c->string || !strcmp(c->string, "class");
7830
7831 if(type->classObjectType == 2 && isObjectBaseClass)
7832 strcat(string, "typed_object");
7833 else if(type->classObjectType == 3 && isObjectBaseClass)
7834 strcat(string, "any_object");
7835 else
7836 {
7837 if(c && c->string)
7838 strcat(string, (fullName || !c->__anon1.registered) ? c->string : c->__anon1.registered->name);
7839 }
7840 if(type->byReference)
7841 strcat(string, " &");
7842 break;
7843 }
7844 case 0:
7845 strcat(string, "void");
7846 break;
7847 case 3:
7848 strcat(string, type->isSigned ? "int" : "uint");
7849 break;
7850 case 4:
7851 strcat(string, type->isSigned ? "int64" : "uint64");
7852 break;
7853 case 22:
7854 strcat(string, type->isSigned ? "intptr" : "uintptr");
7855 break;
7856 case 23:
7857 strcat(string, type->isSigned ? "intsize" : "uintsize");
7858 break;
7859 case 1:
7860 strcat(string, type->isSigned ? "char" : "byte");
7861 break;
7862 case 24:
7863 strcat(string, "_Bool");
7864 break;
7865 case 2:
7866 strcat(string, type->isSigned ? "short" : "uint16");
7867 break;
7868 case 6:
7869 strcat(string, "float");
7870 break;
7871 case 7:
7872 strcat(string, "double");
7873 break;
7874 case 9:
7875 if(type->__anon1.__anon1.enumName)
7876 {
7877 strcat(string, "struct ");
7878 strcat(string, type->__anon1.__anon1.enumName);
7879 }
7880 else if(type->typeName)
7881 strcat(string, type->typeName);
7882 else
7883 {
7884 struct Type * member;
7885
7886 strcat(string, "struct { ");
7887 for(member = type->__anon1.__anon1.members.first; member; member = member->next)
7888 {
7889 PrintType(member, string, 1, fullName);
7890 strcat(string, "; ");
7891 }
7892 strcat(string, "}");
7893 }
7894 break;
7895 case 10:
7896 if(type->__anon1.__anon1.enumName)
7897 {
7898 strcat(string, "union ");
7899 strcat(string, type->__anon1.__anon1.enumName);
7900 }
7901 else if(type->typeName)
7902 strcat(string, type->typeName);
7903 else
7904 {
7905 strcat(string, "union ");
7906 strcat(string, "(unnamed)");
7907 }
7908 break;
7909 case 15:
7910 if(type->__anon1.__anon1.enumName)
7911 {
7912 strcat(string, "enum ");
7913 strcat(string, type->__anon1.__anon1.enumName);
7914 }
7915 else if(type->typeName)
7916 strcat(string, type->typeName);
7917 else
7918 strcat(string, "int");
7919 break;
7920 case 14:
7921 strcat(string, "...");
7922 break;
7923 case 19:
7924 strcat(string, "subclass(");
7925 strcat(string, type->__anon1._class ? type->__anon1._class->string : "int");
7926 strcat(string, ")");
7927 break;
7928 case 20:
7929 strcat(string, type->__anon1.templateParameter->identifier->string);
7930 break;
7931 case 21:
7932 strcat(string, "thisclass");
7933 break;
7934 case 17:
7935 strcat(string, "__builtin_va_list");
7936 break;
7937 }
7938 }
7939 }
7940
7941 unsigned int RelatedUnits(struct __ecereNameSpace__ecere__com__Class * c1, struct __ecereNameSpace__ecere__com__Class * c2)
7942 {
7943 if(c1->base->type == 3)
7944 c1 = c1->base;
7945 if(c2->base->type == 3)
7946 c2 = c2->base;
7947 return c1 == c2;
7948 }
7949
7950 extern char *  __ecereNameSpace__ecere__com__PrintString(struct __ecereNameSpace__ecere__com__Class * class, const void * object, ...);
7951
7952 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass___ecereNameSpace__ecere__sys__TempFile;
7953
7954 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_ClassImport;
7955
7956 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_Symbol;
7957
7958 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_PropertyImport;
7959
7960 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_Type;
7961
7962 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_TemplatedType;
7963
7964 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_TemplateParameter;
7965
7966 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_MethodImport;
7967
7968 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_FunctionImport;
7969
7970 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_Expression;
7971
7972 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_Instantiation;
7973
7974 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass___ecereNameSpace__ecere__sys__NamedLink64;
7975
7976 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_TypeName;
7977
7978 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_Context;
7979
7980 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass___ecereNameSpace__ecere__com__Module;
7981
7982 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass___ecereNameSpace__ecere__com__LinkList;
7983
7984 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass___ecereNameSpace__ecere__com__Application;
7985
7986 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_int;
7987
7988 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass___ecereNameSpace__ecere__com__Instance;
7989
7990 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass___ecereNameSpace__ecere__sys__File;
7991
7992 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_External;
7993
7994 struct __ecereNameSpace__ecere__com__Application
7995 {
7996 int argc;
7997 const char * *  argv;
7998 int exitCode;
7999 unsigned int isGUIApp;
8000 struct __ecereNameSpace__ecere__sys__OldList allModules;
8001 char *  parsedCommand;
8002 struct __ecereNameSpace__ecere__com__NameSpace systemNameSpace;
8003 } ecere_gcc_struct;
8004
8005 static void FindNextDataMember(struct __ecereNameSpace__ecere__com__Class * _class, struct __ecereNameSpace__ecere__com__Class ** curClass, struct __ecereNameSpace__ecere__com__DataMember ** curMember, struct __ecereNameSpace__ecere__com__DataMember ** subMemberStack, int * subMemberStackPos)
8006 {
8007 if(*curMember)
8008 {
8009 *curMember = (*curMember)->next;
8010 if(subMemberStackPos && *subMemberStackPos > 0 && subMemberStack[*subMemberStackPos - 1]->type == 1)
8011 {
8012 *curMember = subMemberStack[--(*subMemberStackPos)];
8013 *curMember = (*curMember)->next;
8014 }
8015 while((*curMember) && (*curMember)->isProperty)
8016 *curMember = (*curMember)->next;
8017 if(subMemberStackPos)
8018 {
8019 while((*curMember) && !(*curMember)->isProperty && !(*curMember)->name && ((*curMember)->type == 2 || (*curMember)->type == 1))
8020 {
8021 subMemberStack[(*subMemberStackPos)++] = *curMember;
8022 *curMember = (*curMember)->members.first;
8023 while(*curMember && (*curMember)->isProperty)
8024 *curMember = (*curMember)->next;
8025 }
8026 }
8027 }
8028 while(!*curMember)
8029 {
8030 if(!*curMember)
8031 {
8032 if(subMemberStackPos && *subMemberStackPos)
8033 {
8034 *curMember = subMemberStack[--(*subMemberStackPos)];
8035 *curMember = (*curMember)->next;
8036 }
8037 else
8038 {
8039 struct __ecereNameSpace__ecere__com__Class * lastCurClass = *curClass;
8040
8041 if(*curClass == _class)
8042 break;
8043 for(*curClass = _class; (*curClass)->base != lastCurClass && (*curClass)->base->type != 1000; *curClass = (*curClass)->base)
8044 ;
8045 *curMember = (*curClass)->membersAndProperties.first;
8046 }
8047 while((*curMember) && (*curMember)->isProperty)
8048 *curMember = (*curMember)->next;
8049 if(subMemberStackPos)
8050 {
8051 while((*curMember) && !(*curMember)->isProperty && !(*curMember)->name && ((*curMember)->type == 2 || (*curMember)->type == 1))
8052 {
8053 subMemberStack[(*subMemberStackPos)++] = *curMember;
8054 *curMember = (*curMember)->members.first;
8055 while(*curMember && (*curMember)->isProperty)
8056 *curMember = (*curMember)->next;
8057 }
8058 }
8059 }
8060 }
8061 }
8062
8063 static struct GlobalData * ScanGlobalData(struct __ecereNameSpace__ecere__com__NameSpace * nameSpace, char * name)
8064 {
8065 struct __ecereNameSpace__ecere__sys__BinaryTree * tree = &nameSpace->functions;
8066 struct GlobalData * data = (struct GlobalData *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindString((&*tree), name);
8067 struct __ecereNameSpace__ecere__com__NameSpace * child;
8068
8069 if(!data)
8070 {
8071 for(child = (struct __ecereNameSpace__ecere__com__NameSpace *)__ecereProp___ecereNameSpace__ecere__sys__BinaryTree_Get_first(&nameSpace->nameSpaces); child; child = (struct __ecereNameSpace__ecere__com__NameSpace *)__ecereProp___ecereNameSpace__ecere__sys__BTNode_Get_next(((struct __ecereNameSpace__ecere__sys__BTNode *)child)))
8072 {
8073 data = ScanGlobalData(child, name);
8074 if(data)
8075 break;
8076 }
8077 }
8078 return data;
8079 }
8080
8081 static struct Symbol * ScanWithNameSpace(struct __ecereNameSpace__ecere__sys__BinaryTree * tree, const char * nameSpace, const char * name)
8082 {
8083 int nsLen = strlen(nameSpace);
8084 struct Symbol * symbol;
8085
8086 for(symbol = (struct Symbol *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindPrefix(tree, nameSpace); symbol; symbol = (struct Symbol *)__ecereProp___ecereNameSpace__ecere__sys__BTNode_Get_next(((struct __ecereNameSpace__ecere__sys__BTNode *)symbol)))
8087 {
8088 char * s = symbol->string;
8089
8090 if(!strncmp(s, nameSpace, nsLen))
8091 {
8092 int c;
8093 char * namePart;
8094
8095 for(c = strlen(s) - 1; c >= 0; c--)
8096 if(s[c] == ':')
8097 break;
8098 namePart = s + c + 1;
8099 if(!strcmp(namePart, name))
8100 {
8101 return symbol;
8102 }
8103 }
8104 else
8105 break;
8106 }
8107 return (((void *)0));
8108 }
8109
8110 unsigned int GetInt(struct Expression * exp, int * value2)
8111 {
8112 struct Operand op2 = GetOperand(exp);
8113
8114 return GetOpInt(&op2, value2);
8115 }
8116
8117 unsigned int GetUInt(struct Expression * exp, unsigned int * value2)
8118 {
8119 struct Operand op2 = GetOperand(exp);
8120
8121 return GetOpUInt(&op2, value2);
8122 }
8123
8124 unsigned int GetInt64(struct Expression * exp, long long * value2)
8125 {
8126 struct Operand op2 = GetOperand(exp);
8127
8128 return GetOpInt64(&op2, value2);
8129 }
8130
8131 unsigned int GetUInt64(struct Expression * exp, uint64 * value2)
8132 {
8133 struct Operand op2 = GetOperand(exp);
8134
8135 return GetOpUInt64(&op2, value2);
8136 }
8137
8138 unsigned int GetIntPtr(struct Expression * exp, intptr_t * value2)
8139 {
8140 struct Operand op2 = GetOperand(exp);
8141
8142 return GetOpIntPtr(&op2, value2);
8143 }
8144
8145 unsigned int GetUIntPtr(struct Expression * exp, uintptr_t * value2)
8146 {
8147 struct Operand op2 = GetOperand(exp);
8148
8149 return GetOpUIntPtr(&op2, value2);
8150 }
8151
8152 unsigned int GetIntSize(struct Expression * exp, ssize_t * value2)
8153 {
8154 struct Operand op2 = GetOperand(exp);
8155
8156 return GetOpIntSize(&op2, value2);
8157 }
8158
8159 unsigned int GetUIntSize(struct Expression * exp, size_t * value2)
8160 {
8161 struct Operand op2 = GetOperand(exp);
8162
8163 return GetOpUIntSize(&op2, value2);
8164 }
8165
8166 unsigned int GetShort(struct Expression * exp, short * value2)
8167 {
8168 struct Operand op2 = GetOperand(exp);
8169
8170 return GetOpShort(&op2, value2);
8171 }
8172
8173 unsigned int GetUShort(struct Expression * exp, unsigned short * value2)
8174 {
8175 struct Operand op2 = GetOperand(exp);
8176
8177 return GetOpUShort(&op2, value2);
8178 }
8179
8180 unsigned int GetChar(struct Expression * exp, char * value2)
8181 {
8182 struct Operand op2 = GetOperand(exp);
8183
8184 return GetOpChar(&op2, value2);
8185 }
8186
8187 unsigned int GetUChar(struct Expression * exp, unsigned char * value2)
8188 {
8189 struct Operand op2 = GetOperand(exp);
8190
8191 return GetOpUChar(&op2, value2);
8192 }
8193
8194 unsigned int GetFloat(struct Expression * exp, float * value2)
8195 {
8196 struct Operand op2 = GetOperand(exp);
8197
8198 return GetOpFloat(&op2, value2);
8199 }
8200
8201 unsigned int GetDouble(struct Expression * exp, double * value2)
8202 {
8203 struct Operand op2 = GetOperand(exp);
8204
8205 return GetOpDouble(&op2, value2);
8206 }
8207
8208 static void PrePrintType(struct Type * type, char * string, unsigned int fullName, struct Type * parentType, unsigned int printConst)
8209 {
8210 if(type->kind == 12 || type->kind == 13 || type->kind == 11 || type->kind == 16)
8211 {
8212 if((type->kind == 11 || type->kind == 16) && (!parentType || parentType->kind != 13))
8213 PrintAttribs(type, string);
8214 if(printConst && type->constant && (type->kind == 11 || type->kind == 16))
8215 strcat(string, " const");
8216 PrePrintType(type->kind == 16 ? type->__anon1.__anon3.method->dataType : type->__anon1.type, string, fullName, type, printConst);
8217 if(type->kind == 13 && (type->__anon1.type->kind == 12 || type->__anon1.type->kind == 11 || type->__anon1.type->kind == 16))
8218 strcat(string, " (");
8219 if(type->kind == 13)
8220 {
8221 if(type->__anon1.type->kind == 11 || type->__anon1.type->kind == 16)
8222 PrintAttribs(type->__anon1.type, string);
8223 }
8224 if(type->kind == 13)
8225 {
8226 if(type->__anon1.type->kind == 11 || type->__anon1.type->kind == 16 || type->__anon1.type->kind == 12)
8227 strcat(string, "*");
8228 else
8229 strcat(string, " *");
8230 }
8231 if(printConst && type->constant && type->kind == 13)
8232 strcat(string, " const");
8233 }
8234 else
8235 PrintTypeSpecs(type, string, fullName, printConst);
8236 }
8237
8238 void PrintExpression(struct Expression * exp, char * string)
8239 {
8240 {
8241 struct __ecereNameSpace__ecere__com__Instance * f = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass___ecereNameSpace__ecere__sys__TempFile);
8242 int count;
8243 unsigned int backOutputLineNumbers = outputLineNumbers;
8244
8245 outputLineNumbers = 0;
8246 if(exp)
8247 OutputExpression(exp, f);
8248 ((unsigned int (*)(struct __ecereNameSpace__ecere__com__Instance *, int pos, int mode))__extension__ ({
8249 struct __ecereNameSpace__ecere__com__Instance * __internal_ClassInst = f;
8250
8251 __internal_ClassInst ? __internal_ClassInst->_vTbl : __ecereClass___ecereNameSpace__ecere__sys__TempFile->_vTbl;
8252 })[__ecereVMethodID___ecereNameSpace__ecere__sys__File_Seek])(f, 0, 0);
8253 count = strlen(string);
8254 count += ((int (*)(struct __ecereNameSpace__ecere__com__Instance *, void *  buffer, unsigned int size, unsigned int count))__extension__ ({
8255 struct __ecereNameSpace__ecere__com__Instance * __internal_ClassInst = f;
8256
8257 __internal_ClassInst ? __internal_ClassInst->_vTbl : __ecereClass___ecereNameSpace__ecere__sys__TempFile->_vTbl;
8258 })[__ecereVMethodID___ecereNameSpace__ecere__sys__File_Read])(f, string + count, 1, 1023);
8259 string[count] = '\0';
8260 (__ecereNameSpace__ecere__com__eInstance_DecRef(f), f = 0);
8261 outputLineNumbers = backOutputLineNumbers;
8262 }
8263 }
8264
8265 struct Type * Dereference(struct Type * source)
8266 {
8267 struct Type * type = (((void *)0));
8268
8269 if(source)
8270 {
8271 if(source->kind == 13 || source->kind == 12)
8272 {
8273 type = source->__anon1.type;
8274 source->__anon1.type->refCount++;
8275 }
8276 else if(source->kind == 8 && !strcmp(source->__anon1._class->string, "String"))
8277 {
8278 type = __extension__ ({
8279 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
8280
8281 __ecereInstance1->kind = 1, __ecereInstance1->refCount = 1, __ecereInstance1;
8282 });
8283 }
8284 else if(source->kind == 8 && source->__anon1._class && source->__anon1._class->__anon1.registered && source->__anon1._class->__anon1.registered->type == 5)
8285 {
8286 type = source;
8287 source->refCount++;
8288 }
8289 else
8290 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "cannot dereference type\n", (((void *)0))));
8291 }
8292 return type;
8293 }
8294
8295 static struct Type * Reference(struct Type * source)
8296 {
8297 struct Type * type = (((void *)0));
8298
8299 if(source)
8300 {
8301 type = __extension__ ({
8302 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
8303
8304 __ecereInstance1->kind = 13, __ecereInstance1->__anon1.type = source, __ecereInstance1->refCount = 1, __ecereInstance1;
8305 });
8306 source->refCount++;
8307 }
8308 return type;
8309 }
8310
8311 void ReplaceExpContents(struct Expression * checkedExp, struct Expression * newExp)
8312 {
8313 struct Expression * prev = checkedExp->prev, * next = checkedExp->next;
8314
8315 FreeExpContents(checkedExp);
8316 FreeType(checkedExp->expType);
8317 FreeType(checkedExp->destType);
8318 *checkedExp = *newExp;
8319 ((newExp ? __extension__ ({
8320 void * __ecerePtrToDelete = (newExp);
8321
8322 __ecereClass_Expression->Destructor ? __ecereClass_Expression->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete);
8323 }) : 0), newExp = 0);
8324 checkedExp->prev = prev;
8325 checkedExp->next = next;
8326 }
8327
8328 void FinishTemplatesContext(struct Context * context)
8329 {
8330 PopContext(context);
8331 FreeContext(context);
8332 ((context ? __extension__ ({
8333 void * __ecerePtrToDelete = (context);
8334
8335 __ecereClass_Context->Destructor ? __ecereClass_Context->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete);
8336 }) : 0), context = 0);
8337 }
8338
8339 static __attribute__((unused)) void UnusedFunction()
8340 {
8341 int a;
8342
8343 ((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);
8344 }
8345
8346 struct Expression * ParseExpressionString(char * expression)
8347 {
8348 parseError = 0;
8349 fileInput = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass___ecereNameSpace__ecere__sys__TempFile);
8350 ((int (*)(struct __ecereNameSpace__ecere__com__Instance *, const void *  buffer, unsigned int size, unsigned int count))__extension__ ({
8351 struct __ecereNameSpace__ecere__com__Instance * __internal_ClassInst = fileInput;
8352
8353 __internal_ClassInst ? __internal_ClassInst->_vTbl : __ecereClass___ecereNameSpace__ecere__sys__File->_vTbl;
8354 })[__ecereVMethodID___ecereNameSpace__ecere__sys__File_Write])(fileInput, expression, 1, strlen(expression));
8355 ((unsigned int (*)(struct __ecereNameSpace__ecere__com__Instance *, int pos, int mode))__extension__ ({
8356 struct __ecereNameSpace__ecere__com__Instance * __internal_ClassInst = fileInput;
8357
8358 __internal_ClassInst ? __internal_ClassInst->_vTbl : __ecereClass___ecereNameSpace__ecere__sys__File->_vTbl;
8359 })[__ecereVMethodID___ecereNameSpace__ecere__sys__File_Seek])(fileInput, 0, 0);
8360 echoOn = 0;
8361 parsedExpression = (((void *)0));
8362 resetScanner();
8363 expression_yyparse();
8364 (__ecereNameSpace__ecere__com__eInstance_DecRef(fileInput), fileInput = 0);
8365 return parsedExpression;
8366 }
8367
8368 struct __ecereNameSpace__ecere__com__Module
8369 {
8370 struct __ecereNameSpace__ecere__com__Instance * application;
8371 struct __ecereNameSpace__ecere__sys__OldList classes;
8372 struct __ecereNameSpace__ecere__sys__OldList defines;
8373 struct __ecereNameSpace__ecere__sys__OldList functions;
8374 struct __ecereNameSpace__ecere__sys__OldList modules;
8375 struct __ecereNameSpace__ecere__com__Instance * prev;
8376 struct __ecereNameSpace__ecere__com__Instance * next;
8377 const char *  name;
8378 void *  library;
8379 void *  Unload;
8380 int importType;
8381 int origImportType;
8382 struct __ecereNameSpace__ecere__com__NameSpace privateNameSpace;
8383 struct __ecereNameSpace__ecere__com__NameSpace publicNameSpace;
8384 } ecere_gcc_struct;
8385
8386 static struct GlobalData * FindGlobalData(char * name)
8387 {
8388 int start = 0, c;
8389 struct __ecereNameSpace__ecere__com__NameSpace * nameSpace;
8390
8391 nameSpace = globalData;
8392 for(c = 0; name[c]; c++)
8393 {
8394 if(name[c] == '.' || (name[c] == ':' && name[c + 1] == ':'))
8395 {
8396 struct __ecereNameSpace__ecere__com__NameSpace * newSpace;
8397 char * spaceName = __ecereNameSpace__ecere__com__eSystem_New(sizeof(char) * (c - start + 1));
8398
8399 strncpy(spaceName, name + start, c - start);
8400 spaceName[c - start] = '\0';
8401 newSpace = (struct __ecereNameSpace__ecere__com__NameSpace *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindString(&(*nameSpace).nameSpaces, spaceName);
8402 (__ecereNameSpace__ecere__com__eSystem_Delete(spaceName), spaceName = 0);
8403 if(!newSpace)
8404 return (((void *)0));
8405 nameSpace = newSpace;
8406 if(name[c] == ':')
8407 c++;
8408 start = c + 1;
8409 }
8410 }
8411 if(c - start)
8412 {
8413 return ScanGlobalData(nameSpace, name + start);
8414 }
8415 return (((void *)0));
8416 }
8417
8418 static struct Symbol * FindWithNameSpace(struct __ecereNameSpace__ecere__sys__BinaryTree * tree, const char * name)
8419 {
8420 int c;
8421 char nameSpace[1024];
8422 const char * namePart;
8423 unsigned int gotColon = 0;
8424
8425 nameSpace[0] = '\0';
8426 for(c = strlen(name) - 1; c >= 0; c--)
8427 if(name[c] == ':')
8428 {
8429 gotColon = 1;
8430 break;
8431 }
8432 namePart = name + c + 1;
8433 while(c >= 0 && name[c] == ':')
8434 c--;
8435 if(c >= 0)
8436 {
8437 struct Symbol * symbol = (struct Symbol *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindString(tree, name);
8438
8439 if(symbol)
8440 return symbol;
8441 memcpy(nameSpace, name, c + 1);
8442 nameSpace[c + 1] = 0;
8443 return ScanWithNameSpace(tree, nameSpace, namePart);
8444 }
8445 else if(gotColon)
8446 {
8447 struct Symbol * symbol = (struct Symbol *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindString(tree, namePart);
8448
8449 return symbol;
8450 }
8451 else
8452 {
8453 struct Symbol * symbol = (struct Symbol *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindString(tree, namePart);
8454
8455 if(symbol)
8456 return symbol;
8457 return ScanWithNameSpace(tree, "", namePart);
8458 }
8459 return (((void *)0));
8460 }
8461
8462 static void PrintArraySize(struct Type * arrayType, char * string)
8463 {
8464 char size[256];
8465
8466 size[0] = '\0';
8467 strcat(size, "[");
8468 if(arrayType->__anon1.__anon4.enumClass)
8469 strcat(size, arrayType->__anon1.__anon4.enumClass->string);
8470 else if(arrayType->__anon1.__anon4.arraySizeExp)
8471 PrintExpression(arrayType->__anon1.__anon4.arraySizeExp, size);
8472 strcat(size, "]");
8473 strcat(string, size);
8474 }
8475
8476 void __ecereUnregisterModule_pass15(struct __ecereNameSpace__ecere__com__Instance * module)
8477 {
8478
8479 }
8480
8481 static void PostPrintType(struct Type * type, char * string, unsigned int fullName)
8482 {
8483 if(type->kind == 13 && (type->__anon1.type->kind == 12 || type->__anon1.type->kind == 11 || type->__anon1.type->kind == 16))
8484 strcat(string, ")");
8485 if(type->kind == 12)
8486 PrintArraySize(type, string);
8487 else if(type->kind == 11)
8488 {
8489 struct Type * param;
8490
8491 strcat(string, "(");
8492 for(param = type->__anon1.__anon2.params.first; param; param = param->next)
8493 {
8494 PrintType(param, string, 1, fullName);
8495 if(param->next)
8496 strcat(string, ", ");
8497 }
8498 strcat(string, ")");
8499 }
8500 if(type->kind == 12 || type->kind == 13 || type->kind == 11 || type->kind == 16)
8501 PostPrintType(type->kind == 16 ? type->__anon1.__anon3.method->dataType : type->__anon1.type, string, fullName);
8502 }
8503
8504 static void _PrintType(struct Type * type, char * string, unsigned int printName, unsigned int fullName, unsigned int printConst)
8505 {
8506 PrePrintType(type, string, fullName, (((void *)0)), printConst);
8507 if(type->__anon1.__anon2.thisClass || (printName && type->name && type->name[0]))
8508 strcat(string, " ");
8509 if((type->__anon1.__anon2.thisClass || type->__anon1.__anon2.staticMethod))
8510 {
8511 struct Symbol * _class = type->__anon1.__anon2.thisClass;
8512
8513 if((type->classObjectType == 2 || type->classObjectType == 1) || (_class && !strcmp(_class->string, "class")))
8514 {
8515 if(type->classObjectType == 1)
8516 strcat(string, "class");
8517 else
8518 strcat(string, type->byReference ? "typed_object&" : "typed_object");
8519 }
8520 else if(_class && _class->string)
8521 {
8522 char * s = _class->string;
8523
8524 if(fullName)
8525 strcat(string, s);
8526 else
8527 {
8528 char * name = __ecereNameSpace__ecere__sys__RSearchString(s, "::", strlen(s), 1, 0);
8529
8530 if(name)
8531 name += 2;
8532 else
8533 name = s;
8534 strcat(string, name);
8535 }
8536 }
8537 strcat(string, "::");
8538 }
8539 if(printName && type->name)
8540 PrintName(type, string, fullName);
8541 PostPrintType(type, string, fullName);
8542 if(type->bitFieldCount)
8543 {
8544 char count[100];
8545
8546 sprintf(count, ":%d", type->bitFieldCount);
8547 strcat(string, count);
8548 }
8549 }
8550
8551 struct Conversion;
8552
8553 struct Conversion
8554 {
8555 struct Conversion * prev, * next;
8556 struct __ecereNameSpace__ecere__com__Property * convert;
8557 unsigned int isGet;
8558 struct Type * resultType;
8559 } ecere_gcc_struct;
8560
8561 static void FreeConvert(struct Conversion * convert)
8562 {
8563 if(convert->resultType)
8564 FreeType(convert->resultType);
8565 }
8566
8567 struct Enumerator;
8568
8569 struct Enumerator
8570 {
8571 struct Enumerator * prev;
8572 struct Enumerator * next;
8573 struct Location loc;
8574 struct Identifier * id;
8575 struct Expression * exp;
8576 } ecere_gcc_struct;
8577
8578 struct AsmField;
8579
8580 struct AsmField
8581 {
8582 struct AsmField * prev;
8583 struct AsmField * next;
8584 struct Location loc;
8585 char *  command;
8586 struct Expression * expression;
8587 struct Identifier * symbolic;
8588 } ecere_gcc_struct;
8589
8590 struct ClassDefinition;
8591
8592 struct Context
8593 {
8594 struct Context * parent;
8595 struct __ecereNameSpace__ecere__sys__BinaryTree types;
8596 struct __ecereNameSpace__ecere__sys__BinaryTree classes;
8597 struct __ecereNameSpace__ecere__sys__BinaryTree symbols;
8598 struct __ecereNameSpace__ecere__sys__BinaryTree structSymbols;
8599 int nextID;
8600 int simpleID;
8601 struct __ecereNameSpace__ecere__sys__BinaryTree templateTypes;
8602 struct ClassDefinition * classDef;
8603 unsigned int templateTypesOnly;
8604 unsigned int hasNameSpace;
8605 } ecere_gcc_struct;
8606
8607 struct External
8608 {
8609 struct External * prev;
8610 struct External * next;
8611 struct Location loc;
8612 int type;
8613 struct Symbol * symbol;
8614 union
8615 {
8616 struct FunctionDefinition * function;
8617 struct ClassDefinition * _class;
8618 struct Declaration * declaration;
8619 char *  importString;
8620 struct Identifier * id;
8621 struct DBTableDef * table;
8622 } ecere_gcc_struct __anon1;
8623 int importType;
8624 struct External * fwdDecl;
8625 struct __ecereNameSpace__ecere__com__Instance * outgoing;
8626 struct __ecereNameSpace__ecere__com__Instance * incoming;
8627 int nonBreakableIncoming;
8628 } ecere_gcc_struct;
8629
8630 struct ClassDefinition
8631 {
8632 struct ClassDefinition * prev;
8633 struct ClassDefinition * next;
8634 struct Location loc;
8635 struct Specifier * _class;
8636 struct __ecereNameSpace__ecere__sys__OldList *  baseSpecs;
8637 struct __ecereNameSpace__ecere__sys__OldList *  definitions;
8638 struct Symbol * symbol;
8639 struct Location blockStart;
8640 struct Location nameLoc;
8641 int declMode;
8642 unsigned int deleteWatchable;
8643 } ecere_gcc_struct;
8644
8645 void __ecereMethod_External_CreateUniqueEdge(struct External * this, struct External * from, unsigned int soft);
8646
8647 void __ecereMethod_External_CreateEdge(struct External * this, struct External * from, unsigned int soft);
8648
8649 void DeclareGlobalData(struct External * neededFor, struct GlobalData * data)
8650 {
8651 struct Symbol * symbol = data->symbol;
8652
8653 if(!symbol || !symbol->__anon2.__anon1.pointerExternal)
8654 {
8655 if(inCompiler)
8656 {
8657 if(!symbol)
8658 symbol = data->symbol = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Symbol);
8659 }
8660 if(!data->dataType)
8661 data->dataType = ProcessTypeString(data->dataTypeString, 0);
8662 if(inCompiler)
8663 {
8664 struct Declaration * decl;
8665 struct __ecereNameSpace__ecere__sys__OldList * specifiers, * declarators;
8666 struct Declarator * d;
8667 struct External * external;
8668
8669 specifiers = MkList();
8670 declarators = MkList();
8671 ListAdd(specifiers, MkSpecifier(EXTERN));
8672 d = MkDeclaratorIdentifier(MkIdentifier(data->fullName));
8673 d = SpecDeclFromString(data->dataTypeString, specifiers, d);
8674 ListAdd(declarators, MkInitDeclarator(d, (((void *)0))));
8675 decl = MkDeclaration(specifiers, declarators);
8676 external = MkExternalDeclaration(decl);
8677 if(curExternal)
8678 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*ast), curExternal->prev, external);
8679 external->symbol = symbol;
8680 symbol->__anon2.__anon1.pointerExternal = external;
8681 DeclareType(external, data->dataType, 1, 1);
8682 }
8683 }
8684 if(inCompiler && neededFor && symbol && symbol->__anon2.__anon1.pointerExternal)
8685 __ecereMethod_External_CreateUniqueEdge(neededFor, symbol->__anon2.__anon1.pointerExternal, 0);
8686 }
8687
8688 struct Symbol * FindSymbol(const char * name, struct Context * startContext, struct Context * endContext, unsigned int isStruct, unsigned int globalNameSpace)
8689 {
8690 struct Context * ctx;
8691 struct Symbol * symbol = (((void *)0));
8692
8693 for(ctx = startContext; ctx && !symbol; ctx = ctx->parent)
8694 {
8695 if(ctx == globalContext && !globalNameSpace && ctx->hasNameSpace)
8696 {
8697 symbol = (((void *)0));
8698 if(thisNameSpace)
8699 {
8700 char curName[1024];
8701
8702 strcpy(curName, thisNameSpace);
8703 strcat(curName, "::");
8704 strcat(curName, name);
8705 symbol = FindWithNameSpace(isStruct ? &ctx->structSymbols : &ctx->symbols, curName);
8706 }
8707 if(!symbol)
8708 symbol = FindWithNameSpace(isStruct ? &ctx->structSymbols : &ctx->symbols, name);
8709 }
8710 else
8711 symbol = (struct Symbol *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindString((isStruct ? &ctx->structSymbols : &ctx->symbols), name);
8712 if(symbol || ctx == endContext)
8713 break;
8714 }
8715 if(inCompiler && symbol && ctx == globalContext && symbol->__anon2.__anon1.pointerExternal && curExternal && symbol->__anon2.__anon1.pointerExternal != curExternal)
8716 __ecereMethod_External_CreateUniqueEdge(curExternal, symbol->__anon2.__anon1.pointerExternal, symbol->__anon2.__anon1.pointerExternal->type == 0);
8717 return symbol;
8718 }
8719
8720 struct PropertyDef;
8721
8722 struct ClassDef
8723 {
8724 struct ClassDef * prev;
8725 struct ClassDef * next;
8726 struct Location loc;
8727 int type;
8728 union
8729 {
8730 struct Declaration * decl;
8731 struct ClassFunction * function;
8732 struct __ecereNameSpace__ecere__sys__OldList *  defProperties;
8733 struct PropertyDef * propertyDef;
8734 struct PropertyWatch * propertyWatch;
8735 char *  designer;
8736 struct Identifier * defaultProperty;
8737 struct
8738 {
8739 struct Identifier * id;
8740 struct Initializer * initializer;
8741 } ecere_gcc_struct __anon1;
8742 } ecere_gcc_struct __anon1;
8743 int memberAccess;
8744 void *  object;
8745 } ecere_gcc_struct;
8746
8747 struct PropertyDef
8748 {
8749 struct PropertyDef * prev;
8750 struct PropertyDef * next;
8751 struct Location loc;
8752 struct __ecereNameSpace__ecere__sys__OldList *  specifiers;
8753 struct Declarator * declarator;
8754 struct Identifier * id;
8755 struct Statement * getStmt;
8756 struct Statement * setStmt;
8757 struct Statement * issetStmt;
8758 struct Symbol * symbol;
8759 struct Expression * category;
8760 struct
8761 {
8762 unsigned int conversion : 1;
8763 unsigned int isWatchable : 1;
8764 unsigned int isDBProp : 1;
8765 } ecere_gcc_struct __anon1;
8766 } ecere_gcc_struct;
8767
8768 static void IdentifyAnonStructs(struct __ecereNameSpace__ecere__sys__OldList * definitions)
8769 {
8770 struct ClassDef * def;
8771 int anonID = 1;
8772
8773 for(def = (*definitions).first; def; def = def->next)
8774 {
8775 if(def->type == 2)
8776 {
8777 struct Declaration * decl = def->__anon1.decl;
8778
8779 if(decl && decl->__anon1.__anon1.specifiers)
8780 {
8781 struct Specifier * spec;
8782 unsigned int isStruct = 0;
8783
8784 for(spec = (*decl->__anon1.__anon1.specifiers).first; spec; spec = spec->next)
8785 {
8786 if(spec->type == 3 || spec->type == 4)
8787 {
8788 if(spec->__anon1.__anon2.definitions)
8789 IdentifyAnonStructs(spec->__anon1.__anon2.definitions);
8790 isStruct = 1;
8791 }
8792 }
8793 if(isStruct)
8794 {
8795 struct Declarator * d = (((void *)0));
8796
8797 if(decl->__anon1.__anon1.declarators)
8798 {
8799 for(d = (*decl->__anon1.__anon1.declarators).first; d; d = d->next)
8800 {
8801 struct Identifier * idDecl = GetDeclId(d);
8802
8803 if(idDecl)
8804 break;
8805 }
8806 }
8807 if(!d)
8808 {
8809 char id[100];
8810
8811 sprintf(id, "__anon%d", anonID++);
8812 if(!decl->__anon1.__anon1.declarators)
8813 decl->__anon1.__anon1.declarators = MkList();
8814 ListAdd(decl->__anon1.__anon1.declarators, MkDeclaratorIdentifier(MkIdentifier(id)));
8815 }
8816 }
8817 }
8818 }
8819 }
8820 }
8821
8822 struct MemberInit;
8823
8824 typedef union YYSTYPE
8825 {
8826 int specifierType;
8827 int i;
8828 int declMode;
8829 struct Identifier * id;
8830 struct Expression * exp;
8831 struct Specifier * specifier;
8832 struct __ecereNameSpace__ecere__sys__OldList * list;
8833 struct Enumerator * enumerator;
8834 struct Declarator * declarator;
8835 struct Pointer * pointer;
8836 struct Initializer * initializer;
8837 struct InitDeclarator * initDeclarator;
8838 struct TypeName * typeName;
8839 struct Declaration * declaration;
8840 struct Statement * stmt;
8841 struct FunctionDefinition * function;
8842 struct External * external;
8843 struct Context * context;
8844 struct AsmField * asmField;
8845 struct Attrib * attrib;
8846 struct ExtDecl * extDecl;
8847 struct Attribute * attribute;
8848 struct Instantiation * instance;
8849 struct MembersInit * membersInit;
8850 struct MemberInit * memberInit;
8851 struct ClassFunction * classFunction;
8852 struct ClassDefinition * _class;
8853 struct ClassDef * classDef;
8854 struct PropertyDef * prop;
8855 char * string;
8856 struct Symbol * symbol;
8857 struct PropertyWatch * propertyWatch;
8858 struct TemplateParameter * templateParameter;
8859 struct TemplateArgument * templateArgument;
8860 struct TemplateDatatype * templateDatatype;
8861 struct DBTableEntry * dbtableEntry;
8862 struct DBIndexItem * dbindexItem;
8863 struct DBTableDef * dbtableDef;
8864 } ecere_gcc_struct YYSTYPE;
8865
8866 extern YYSTYPE yylval;
8867
8868 struct MemberInit
8869 {
8870 struct MemberInit * prev;
8871 struct MemberInit * next;
8872 struct Location loc;
8873 struct Location realLoc;
8874 struct __ecereNameSpace__ecere__sys__OldList *  identifiers;
8875 struct Initializer * initializer;
8876 unsigned int used;
8877 unsigned int variable;
8878 unsigned int takeOutExp;
8879 } ecere_gcc_struct;
8880
8881 extern struct MemberInit * MkMemberInit(struct __ecereNameSpace__ecere__sys__OldList * ids, struct Initializer * initializer);
8882
8883 struct __ecereNameSpace__ecere__com__ClassTemplateParameter;
8884
8885 struct __ecereNameSpace__ecere__com__ClassTemplateParameter
8886 {
8887 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * prev;
8888 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * next;
8889 const char *  name;
8890 int type;
8891 union
8892 {
8893 const char *  dataTypeString;
8894 int memberType;
8895 } ecere_gcc_struct __anon1;
8896 struct __ecereNameSpace__ecere__com__ClassTemplateArgument defaultArg;
8897 void *  param;
8898 } ecere_gcc_struct;
8899
8900 struct __ecereNameSpace__ecere__com__ClassTemplateArgument * FindTemplateArg(struct __ecereNameSpace__ecere__com__Class * _class, struct TemplateParameter * param)
8901 {
8902 struct __ecereNameSpace__ecere__com__ClassTemplateArgument * arg = (((void *)0));
8903 int id = 0;
8904 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * curParam = (((void *)0));
8905 struct __ecereNameSpace__ecere__com__Class * sClass;
8906
8907 for(sClass = _class; sClass; sClass = sClass->base)
8908 {
8909 id = 0;
8910 if(sClass->templateClass)
8911 sClass = sClass->templateClass;
8912 for(curParam = sClass->templateParams.first; curParam; curParam = curParam->next)
8913 {
8914 if(curParam->type == 0 && !strcmp(param->identifier->string, curParam->name))
8915 {
8916 for(sClass = sClass->base; sClass; sClass = sClass->base)
8917 {
8918 if(sClass->templateClass)
8919 sClass = sClass->templateClass;
8920 id += sClass->templateParams.count;
8921 }
8922 break;
8923 }
8924 id++;
8925 }
8926 if(curParam)
8927 break;
8928 }
8929 if(curParam)
8930 {
8931 arg = &_class->templateArgs[id];
8932 if(arg && param->type == 0)
8933 (*arg).__anon1.__anon1.dataTypeClass = __ecereNameSpace__ecere__com__eSystem_FindClass(_class->module, (*arg).__anon1.__anon1.dataTypeString);
8934 }
8935 return arg;
8936 }
8937
8938 struct Context * SetupTemplatesContext(struct __ecereNameSpace__ecere__com__Class * _class)
8939 {
8940 struct Context * context = PushContext();
8941
8942 context->templateTypesOnly = 1;
8943 if(_class->symbol && ((struct Symbol *)_class->symbol)->templateParams)
8944 {
8945 struct TemplateParameter * param = (*((struct Symbol *)_class->symbol)->templateParams).first;
8946
8947 for(; param; param = param->next)
8948 {
8949 if(param->type == 0 && param->identifier)
8950 {
8951 struct TemplatedType * type = (type = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_TemplatedType), type->key = (uintptr_t)param->identifier->string, type->param = param, type);
8952
8953 __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Add(&curContext->templateTypes, (struct __ecereNameSpace__ecere__sys__BTNode *)type);
8954 }
8955 }
8956 }
8957 else if(_class)
8958 {
8959 struct __ecereNameSpace__ecere__com__Class * sClass;
8960
8961 for(sClass = _class; sClass; sClass = sClass->base)
8962 {
8963 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * p;
8964
8965 for(p = sClass->templateParams.first; p; p = p->next)
8966 {
8967 if(p->type == 0)
8968 {
8969 struct TemplateParameter * param = p->param;
8970 struct TemplatedType * type;
8971
8972 if(!param)
8973 {
8974 p->param = param = __extension__ ({
8975 struct TemplateParameter * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_TemplateParameter);
8976
8977 __ecereInstance1->identifier = MkIdentifier(p->name), __ecereInstance1->type = p->type, __ecereInstance1->dataTypeString = p->__anon1.dataTypeString, __ecereInstance1;
8978 });
8979 }
8980 type = __extension__ ({
8981 struct TemplatedType * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_TemplatedType);
8982
8983 __ecereInstance1->key = (uintptr_t)p->name, __ecereInstance1->param = param, __ecereInstance1;
8984 });
8985 __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Add(&curContext->templateTypes, (struct __ecereNameSpace__ecere__sys__BTNode *)type);
8986 }
8987 }
8988 }
8989 }
8990 return context;
8991 }
8992
8993 char * ReplaceThisClass(struct __ecereNameSpace__ecere__com__Class * _class)
8994 {
8995 if(thisClassParams && _class->templateParams.count && !_class->templateClass)
8996 {
8997 unsigned int first = 1;
8998 int p = 0;
8999 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * param;
9000 int lastParam = -1;
9001 char className[1024];
9002
9003 strcpy(className, _class->fullName);
9004 for(param = _class->templateParams.first; param; param = param->next)
9005 {
9006 {
9007 if(first)
9008 strcat(className, "<");
9009 if(!first)
9010 strcat(className, ", ");
9011 if(lastParam + 1 != p)
9012 {
9013 strcat(className, param->name);
9014 strcat(className, " = ");
9015 }
9016 strcat(className, param->name);
9017 first = 0;
9018 lastParam = p;
9019 }
9020 p++;
9021 }
9022 if(!first)
9023 {
9024 int len = strlen(className);
9025
9026 if(className[len - 1] == '>')
9027 className[len++] = ' ';
9028 className[len++] = '>';
9029 className[len++] = '\0';
9030 }
9031 return __ecereNameSpace__ecere__sys__CopyString(className);
9032 }
9033 else
9034 return __ecereNameSpace__ecere__sys__CopyString(_class->fullName);
9035 }
9036
9037 struct Type * ReplaceThisClassType(struct __ecereNameSpace__ecere__com__Class * _class)
9038 {
9039 struct Type * type;
9040
9041 if(thisClassParams && _class->templateParams.count && !_class->templateClass)
9042 {
9043 unsigned int first = 1;
9044 int p = 0;
9045 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * param;
9046 int lastParam = -1;
9047 char className[1024];
9048
9049 strcpy(className, _class->fullName);
9050 for(param = _class->templateParams.first; param; param = param->next)
9051 {
9052 {
9053 if(first)
9054 strcat(className, "<");
9055 if(!first)
9056 strcat(className, ", ");
9057 if(lastParam + 1 != p)
9058 {
9059 strcat(className, param->name);
9060 strcat(className, " = ");
9061 }
9062 strcat(className, param->name);
9063 first = 0;
9064 lastParam = p;
9065 }
9066 p++;
9067 }
9068 if(!first)
9069 {
9070 int len = strlen(className);
9071
9072 if(className[len - 1] == '>')
9073 className[len++] = ' ';
9074 className[len++] = '>';
9075 className[len++] = '\0';
9076 }
9077 type = MkClassType(className);
9078 }
9079 else
9080 {
9081 type = MkClassType(_class->fullName);
9082 }
9083 return type;
9084 }
9085
9086 static int DeclareMembers(struct External * neededBy, struct __ecereNameSpace__ecere__com__Class * _class, unsigned int isMember)
9087 {
9088 struct __ecereNameSpace__ecere__com__DataMember * topMember = isMember ? (struct __ecereNameSpace__ecere__com__DataMember *)_class : (((void *)0));
9089 struct __ecereNameSpace__ecere__com__DataMember * member;
9090 struct Context * context = isMember ? (((void *)0)) : SetupTemplatesContext(_class);
9091
9092 if(!isMember && (_class->type == 1 || _class->type == 5) && _class->base->type != 1000)
9093 DeclareMembers(neededBy, _class->base, 0);
9094 for(member = isMember ? topMember->members.first : _class->membersAndProperties.first; member; member = member->next)
9095 {
9096 if(!member->isProperty)
9097 {
9098 switch(member->type)
9099 {
9100 case 0:
9101 {
9102 if(!member->dataType && member->dataTypeString)
9103 member->dataType = ProcessTypeString(member->dataTypeString, 0);
9104 if(member->dataType)
9105 DeclareType(neededBy, member->dataType, 1, 0);
9106 break;
9107 }
9108 case 1:
9109 case 2:
9110 {
9111 DeclareMembers(neededBy, (struct __ecereNameSpace__ecere__com__Class *)member, 1);
9112 break;
9113 }
9114 }
9115 }
9116 }
9117 if(context)
9118 FinishTemplatesContext(context);
9119 return topMember ? topMember->memberID : _class->memberID;
9120 }
9121
9122 void ProcessMethodType(struct __ecereNameSpace__ecere__com__Method * method)
9123 {
9124 if(!method->dataType)
9125 {
9126 struct Context * context = SetupTemplatesContext(method->_class);
9127
9128 method->dataType = ProcessTypeString(method->dataTypeString, 0);
9129 FinishTemplatesContext(context);
9130 if(method->type != 1 && method->dataType)
9131 {
9132 if(!method->dataType->__anon1.__anon2.thisClass && !method->dataType->__anon1.__anon2.staticMethod)
9133 {
9134 if(!method->_class->symbol)
9135 method->_class->symbol = FindClass(method->_class->fullName);
9136 method->dataType->__anon1.__anon2.thisClass = method->_class->symbol;
9137 }
9138 }
9139 }
9140 }
9141
9142 void ProcessPropertyType(struct __ecereNameSpace__ecere__com__Property * prop)
9143 {
9144 if(!prop->dataType)
9145 {
9146 struct Context * context = SetupTemplatesContext(prop->_class);
9147
9148 prop->dataType = ProcessTypeString(prop->dataTypeString, 0);
9149 FinishTemplatesContext(context);
9150 }
9151 }
9152
9153 void ReplaceThisClassSpecifiers(struct __ecereNameSpace__ecere__sys__OldList * specs, struct __ecereNameSpace__ecere__com__Class * _class)
9154 {
9155 if(specs != (((void *)0)) && _class)
9156 {
9157 struct Specifier * spec;
9158
9159 for(spec = specs->first; spec; spec = spec->next)
9160 {
9161 if(spec->type == 0 && spec->__anon1.specifier == THISCLASS)
9162 {
9163 spec->type = 1;
9164 spec->__anon1.__anon1.name = ReplaceThisClass(_class);
9165 spec->__anon1.__anon1.symbol = FindClass(spec->__anon1.__anon1.name);
9166 }
9167 }
9168 }
9169 }
9170
9171 static unsigned int ResolveIdWithClass(struct Expression * exp, struct __ecereNameSpace__ecere__com__Class * _class, unsigned int skipIDClassCheck)
9172 {
9173 struct Identifier * id = exp->__anon1.__anon1.identifier;
9174 struct __ecereNameSpace__ecere__com__Method * method = (((void *)0));
9175 struct __ecereNameSpace__ecere__com__Property * prop = (((void *)0));
9176 struct __ecereNameSpace__ecere__com__DataMember * member = (((void *)0));
9177 struct __ecereNameSpace__ecere__com__ClassProperty * classProp = (((void *)0));
9178
9179 if(_class && _class->type == 4)
9180 {
9181 struct __ecereNameSpace__ecere__sys__NamedLink64 * value = (((void *)0));
9182 struct __ecereNameSpace__ecere__com__Class * enumClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "enum");
9183
9184 if(enumClass)
9185 {
9186 struct __ecereNameSpace__ecere__com__Class * baseClass;
9187
9188 for(baseClass = _class; baseClass && baseClass->type == 4; baseClass = baseClass->base)
9189 {
9190 struct __ecereNameSpace__ecere__com__EnumClassData * e = (baseClass ? ((void *)(((char *)baseClass->data) + enumClass->offsetClass)) : (((void *)0)));
9191
9192 for(value = e->values.first; value; value = value->next)
9193 {
9194 if(!strcmp(value->name, id->string))
9195 break;
9196 }
9197 if(value)
9198 {
9199 exp->isConstant = 1;
9200 if(inCompiler || inPreCompiler || inDebugger)
9201 {
9202 char constant[256];
9203
9204 FreeExpContents(exp);
9205 exp->type = 2;
9206 if(!strcmp(baseClass->dataTypeString, "int") || !strcmp(baseClass->dataTypeString, "int64") || !strcmp(baseClass->dataTypeString, "char") || !strcmp(baseClass->dataTypeString, "short"))
9207 sprintf(constant, ((__runtimePlatform == 1) ? "%I64d" : "%lld"), value->data);
9208 else
9209 sprintf(constant, ((__runtimePlatform == 1) ? "0x%I64X" : "0x%llX"), value->data);
9210 exp->__anon1.__anon1.constant = __ecereNameSpace__ecere__sys__CopyString(constant);
9211 }
9212 exp->expType = MkClassType(baseClass->fullName);
9213 break;
9214 }
9215 }
9216 }
9217 if(value)
9218 return 1;
9219 }
9220 if((method = __ecereNameSpace__ecere__com__eClass_FindMethod(_class, id->string, privateModule)))
9221 {
9222 ProcessMethodType(method);
9223 exp->expType = __extension__ ({
9224 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
9225
9226 __ecereInstance1->refCount = 1, __ecereInstance1->kind = 16, __ecereInstance1->__anon1.__anon3.method = method, __ecereInstance1->__anon1.__anon3.methodClass = (skipIDClassCheck || (id && id->_class)) ? _class : (((void *)0)), __ecereInstance1;
9227 });
9228 return 1;
9229 }
9230 else if((prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, id->string, privateModule)))
9231 {
9232 if(!prop->dataType)
9233 ProcessPropertyType(prop);
9234 exp->expType = prop->dataType;
9235 if(prop->dataType)
9236 prop->dataType->refCount++;
9237 return 1;
9238 }
9239 else if((member = __ecereNameSpace__ecere__com__eClass_FindDataMember(_class, id->string, privateModule, (((void *)0)), (((void *)0)))))
9240 {
9241 if(!member->dataType)
9242 member->dataType = ProcessTypeString(member->dataTypeString, 0);
9243 exp->expType = member->dataType;
9244 if(member->dataType)
9245 member->dataType->refCount++;
9246 return 1;
9247 }
9248 else if((classProp = __ecereNameSpace__ecere__com__eClass_FindClassProperty(_class, id->string)))
9249 {
9250 if(!classProp->dataType)
9251 classProp->dataType = ProcessTypeString(classProp->dataTypeString, 0);
9252 if(classProp->constant)
9253 {
9254 FreeExpContents(exp);
9255 exp->isConstant = 1;
9256 if(classProp->dataType->kind == 13 && classProp->dataType->__anon1.type->kind == 1)
9257 {
9258 exp->type = 3;
9259 exp->__anon1.__anon1.constant = QMkString((char *)(uintptr_t)classProp->Get(_class));
9260 }
9261 else
9262 {
9263 char constant[256];
9264
9265 exp->type = 2;
9266 sprintf(constant, "%d", (int)classProp->Get(_class));
9267 exp->__anon1.__anon1.constant = __ecereNameSpace__ecere__sys__CopyString(constant);
9268 }
9269 }
9270 else
9271 {
9272 }
9273 exp->expType = classProp->dataType;
9274 if(classProp->dataType)
9275 classProp->dataType->refCount++;
9276 return 1;
9277 }
9278 return 0;
9279 }
9280
9281 void DeclareProperty(struct External * neededBy, struct __ecereNameSpace__ecere__com__Property * prop, char * setName, char * getName)
9282 {
9283 struct Symbol * symbol = prop->symbol;
9284 unsigned int imported = 0;
9285 unsigned int dllImport = 0;
9286 struct External * structExternal = (((void *)0));
9287 struct External * instExternal = (((void *)0));
9288
9289 strcpy(setName, "__ecereProp_");
9290 FullClassNameCat(setName, prop->_class->fullName, 0);
9291 strcat(setName, "_Set_");
9292 FullClassNameCat(setName, prop->name, 1);
9293 strcpy(getName, "__ecereProp_");
9294 FullClassNameCat(getName, prop->_class->fullName, 0);
9295 strcat(getName, "_Get_");
9296 FullClassNameCat(getName, prop->name, 1);
9297 if(!symbol || symbol->_import)
9298 {
9299 if(!symbol)
9300 {
9301 struct Symbol * classSym;
9302
9303 if(!prop->_class->symbol)
9304 prop->_class->symbol = FindClass(prop->_class->fullName);
9305 classSym = prop->_class->symbol;
9306 if(classSym && !classSym->_import)
9307 {
9308 struct ModuleImport * module;
9309
9310 if(prop->_class->module)
9311 module = FindModule(prop->_class->module);
9312 else
9313 module = mainModule;
9314 classSym->_import = __extension__ ({
9315 struct ClassImport * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_ClassImport);
9316
9317 __ecereInstance1->name = __ecereNameSpace__ecere__sys__CopyString(prop->_class->fullName), __ecereInstance1->isRemote = prop->_class->isRemote, __ecereInstance1;
9318 });
9319 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(&module->classes, classSym->_import);
9320 }
9321 symbol = prop->symbol = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Symbol);
9322 symbol->_import = (struct ClassImport *)__extension__ ({
9323 struct PropertyImport * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_PropertyImport);
9324
9325 __ecereInstance1->name = __ecereNameSpace__ecere__sys__CopyString(prop->name), __ecereInstance1->isVirtual = 0, __ecereInstance1->hasSet = prop->Set ? 1 : 0, __ecereInstance1->hasGet = prop->Get ? 1 : 0, __ecereInstance1;
9326 });
9327 if(classSym)
9328 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(&classSym->_import->properties, symbol->_import);
9329 }
9330 imported = 1;
9331 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)
9332 dllImport = 1;
9333 }
9334 if(!symbol->type)
9335 {
9336 struct Context * context = SetupTemplatesContext(prop->_class);
9337
9338 symbol->type = ProcessTypeString(prop->dataTypeString, 0);
9339 FinishTemplatesContext(context);
9340 }
9341 if((prop->Get && !symbol->__anon2.__anon2.externalGet) || (prop->Set && !symbol->__anon2.__anon2.externalSet))
9342 {
9343 if(prop->_class->type == 0 && prop->_class->structSize)
9344 instExternal = DeclareStruct((((void *)0)), "ecere::com::Instance", 0, 1);
9345 structExternal = DeclareStruct((((void *)0)), prop->_class->fullName, prop->_class->type != 1, 0);
9346 }
9347 if(prop->Get && !symbol->__anon2.__anon2.externalGet)
9348 {
9349 struct Declaration * decl;
9350 struct __ecereNameSpace__ecere__sys__OldList * specifiers, * declarators;
9351 struct Declarator * d;
9352 struct __ecereNameSpace__ecere__sys__OldList * params;
9353 struct Specifier * spec = (((void *)0));
9354 struct External * external;
9355 struct Declarator * typeDecl;
9356 unsigned int simple = 0;
9357 unsigned int needReference;
9358
9359 specifiers = MkList();
9360 declarators = MkList();
9361 params = MkList();
9362 ListAdd(params, MkTypeName(MkListOne(MkSpecifierName(prop->_class->fullName)), MkDeclaratorIdentifier(MkIdentifier("this"))));
9363 d = MkDeclaratorIdentifier(MkIdentifier(getName));
9364 if(dllImport)
9365 d = MkDeclaratorBrackets(MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), d));
9366 {
9367 struct Context * context = SetupTemplatesContext(prop->_class);
9368
9369 typeDecl = SpecDeclFromString(prop->dataTypeString, specifiers, (((void *)0)));
9370 FinishTemplatesContext(context);
9371 }
9372 needReference = !typeDecl || typeDecl->type == 1;
9373 for(spec = (*specifiers).first; spec; spec = spec->next)
9374 {
9375 if(spec->type == 1)
9376 {
9377 struct Symbol * classSym = spec->__anon1.__anon1.symbol;
9378
9379 if(needReference)
9380 {
9381 symbol->_class = classSym->__anon1.registered;
9382 if(classSym->__anon1.registered && classSym->__anon1.registered->type == 1)
9383 simple = 1;
9384 }
9385 break;
9386 }
9387 }
9388 if(!simple)
9389 d = PlugDeclarator(typeDecl, d);
9390 else
9391 {
9392 ListAdd(params, MkTypeName(specifiers, PlugDeclarator(typeDecl, MkDeclaratorIdentifier(MkIdentifier("value")))));
9393 specifiers = MkList();
9394 }
9395 d = MkDeclaratorFunction(d, params);
9396 if(dllImport)
9397 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*specifiers), (((void *)0)), MkSpecifier(EXTERN));
9398 else if(prop->_class->symbol && ((struct Symbol *)prop->_class->symbol)->isStatic)
9399 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*specifiers), (((void *)0)), MkSpecifier(STATIC));
9400 if(simple)
9401 ListAdd(specifiers, MkSpecifier(VOID));
9402 ListAdd(declarators, MkInitDeclarator(d, (((void *)0))));
9403 decl = MkDeclaration(specifiers, declarators);
9404 external = MkExternalDeclaration(decl);
9405 if(structExternal)
9406 __ecereMethod_External_CreateEdge(external, structExternal, 0);
9407 if(instExternal)
9408 __ecereMethod_External_CreateEdge(external, instExternal, 0);
9409 if(spec)
9410 DeclareStruct(external, spec->__anon1.__anon1.name, 0, needReference);
9411 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add((&*ast), external);
9412 external->symbol = symbol;
9413 symbol->__anon2.__anon2.externalGet = external;
9414 ReplaceThisClassSpecifiers(specifiers, prop->_class);
9415 if(typeDecl)
9416 FreeDeclarator(typeDecl);
9417 }
9418 if(prop->Set && !symbol->__anon2.__anon2.externalSet)
9419 {
9420 struct Declaration * decl;
9421 struct __ecereNameSpace__ecere__sys__OldList * specifiers, * declarators;
9422 struct Declarator * d;
9423 struct __ecereNameSpace__ecere__sys__OldList * params;
9424 struct Specifier * spec = (((void *)0));
9425 struct External * external;
9426 struct Declarator * typeDecl;
9427 unsigned int needReference;
9428
9429 declarators = MkList();
9430 params = MkList();
9431 if(!prop->conversion || prop->_class->type == 1)
9432 {
9433 ListAdd(params, MkTypeName(MkListOne(MkSpecifierName(prop->_class->fullName)), MkDeclaratorIdentifier(MkIdentifier("this"))));
9434 }
9435 specifiers = MkList();
9436 {
9437 struct Context * context = SetupTemplatesContext(prop->_class);
9438
9439 typeDecl = d = SpecDeclFromString(prop->dataTypeString, specifiers, MkDeclaratorIdentifier(MkIdentifier("value")));
9440 FinishTemplatesContext(context);
9441 }
9442 if(!strcmp(prop->_class->base->fullName, "eda::Row") || !strcmp(prop->_class->base->fullName, "eda::Id"))
9443 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*specifiers), (((void *)0)), MkSpecifier(CONST));
9444 ListAdd(params, MkTypeName(specifiers, d));
9445 d = MkDeclaratorIdentifier(MkIdentifier(setName));
9446 if(dllImport)
9447 d = MkDeclaratorBrackets(MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), d));
9448 d = MkDeclaratorFunction(d, params);
9449 needReference = !typeDecl || typeDecl->type == 1;
9450 for(spec = (*specifiers).first; spec; spec = spec->next)
9451 {
9452 if(spec->type == 1)
9453 {
9454 struct Symbol * classSym = spec->__anon1.__anon1.symbol;
9455
9456 if(needReference)
9457 symbol->_class = classSym->__anon1.registered;
9458 break;
9459 }
9460 }
9461 ListAdd(declarators, MkInitDeclarator(d, (((void *)0))));
9462 specifiers = MkList();
9463 if(dllImport)
9464 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*specifiers), (((void *)0)), MkSpecifier(EXTERN));
9465 else if(prop->_class->symbol && ((struct Symbol *)prop->_class->symbol)->isStatic)
9466 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*specifiers), (((void *)0)), MkSpecifier(STATIC));
9467 if(!prop->conversion || prop->_class->type == 1)
9468 ListAdd(specifiers, MkSpecifier(VOID));
9469 else
9470 ListAdd(specifiers, MkSpecifierName(prop->_class->fullName));
9471 decl = MkDeclaration(specifiers, declarators);
9472 external = MkExternalDeclaration(decl);
9473 if(structExternal)
9474 __ecereMethod_External_CreateEdge(external, structExternal, 0);
9475 if(instExternal)
9476 __ecereMethod_External_CreateEdge(external, instExternal, 0);
9477 if(spec)
9478 DeclareStruct(external, spec->__anon1.__anon1.name, 0, needReference);
9479 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add((&*ast), external);
9480 external->symbol = symbol;
9481 symbol->__anon2.__anon2.externalSet = external;
9482 ReplaceThisClassSpecifiers(specifiers, prop->_class);
9483 }
9484 if(!symbol->__anon2.__anon2.externalPtr)
9485 {
9486 struct Declaration * decl;
9487 struct External * external;
9488 struct __ecereNameSpace__ecere__sys__OldList * specifiers = MkList();
9489 char propName[1024];
9490
9491 if(imported)
9492 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*specifiers), (((void *)0)), MkSpecifier(EXTERN));
9493 else
9494 {
9495 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*specifiers), (((void *)0)), MkSpecifier(STATIC));
9496 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add((&*specifiers), MkSpecifierExtended(MkExtDeclAttrib(MkAttrib(ATTRIB, MkListOne(MkAttribute(__ecereNameSpace__ecere__sys__CopyString("unused"), (((void *)0))))))));
9497 }
9498 ListAdd(specifiers, MkSpecifierName("Property"));
9499 strcpy(propName, "__ecereProp_");
9500 FullClassNameCat(propName, prop->_class->fullName, 0);
9501 strcat(propName, "_");
9502 FullClassNameCat(propName, prop->name, 1);
9503 {
9504 struct __ecereNameSpace__ecere__sys__OldList * list = MkList();
9505
9506 ListAdd(list, MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier(propName)), (((void *)0))));
9507 if(!imported)
9508 {
9509 strcpy(propName, "__ecerePropM_");
9510 FullClassNameCat(propName, prop->_class->fullName, 0);
9511 strcat(propName, "_");
9512 FullClassNameCat(propName, prop->name, 1);
9513 ListAdd(list, MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier(propName)), (((void *)0))));
9514 }
9515 decl = MkDeclaration(specifiers, list);
9516 }
9517 external = MkExternalDeclaration(decl);
9518 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*ast), curExternal->prev, external);
9519 external->symbol = symbol;
9520 symbol->__anon2.__anon2.externalPtr = external;
9521 }
9522 if(inCompiler && neededBy)
9523 {
9524 if(symbol->__anon2.__anon2.externalPtr)
9525 __ecereMethod_External_CreateUniqueEdge(neededBy, symbol->__anon2.__anon2.externalPtr, 0);
9526 if(symbol->__anon2.__anon2.externalGet)
9527 __ecereMethod_External_CreateUniqueEdge(neededBy, symbol->__anon2.__anon2.externalGet, symbol->__anon2.__anon2.externalGet->type == 0);
9528 if(symbol->__anon2.__anon2.externalSet)
9529 __ecereMethod_External_CreateUniqueEdge(neededBy, symbol->__anon2.__anon2.externalSet, symbol->__anon2.__anon2.externalSet->type == 0);
9530 }
9531 }
9532
9533 static void ProcessDeclarator(struct Declarator *  decl, unsigned int isFunction);
9534
9535 void DeclareMethod(struct External * neededFor, struct __ecereNameSpace__ecere__com__Method * method, const char * name)
9536 {
9537 struct Symbol * symbol = method->symbol;
9538
9539 if(!symbol || (!symbol->__anon2.__anon1.pointerExternal && (!symbol->__anon2.__anon3.methodCodeExternal || method->type == 1)))
9540 {
9541 unsigned int dllImport = 0;
9542
9543 if(!method->dataType)
9544 method->dataType = ProcessTypeString(method->dataTypeString, 0);
9545 {
9546 if(!symbol || method->type == 1)
9547 {
9548 struct Symbol * classSym;
9549
9550 if(!method->_class->symbol)
9551 method->_class->symbol = FindClass(method->_class->fullName);
9552 classSym = method->_class->symbol;
9553 if(!classSym->_import)
9554 {
9555 struct ModuleImport * module;
9556
9557 if(method->_class->module && ((struct __ecereNameSpace__ecere__com__Module *)(((char *)method->_class->module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->name)
9558 module = FindModule(method->_class->module);
9559 else
9560 module = mainModule;
9561 classSym->_import = __extension__ ({
9562 struct ClassImport * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_ClassImport);
9563
9564 __ecereInstance1->name = __ecereNameSpace__ecere__sys__CopyString(method->_class->fullName), __ecereInstance1->isRemote = method->_class->isRemote, __ecereInstance1;
9565 });
9566 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(&module->classes, classSym->_import);
9567 }
9568 if(!symbol)
9569 {
9570 symbol = method->symbol = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Symbol);
9571 }
9572 if(!symbol->_import)
9573 {
9574 symbol->_import = (struct ClassImport *)__extension__ ({
9575 struct MethodImport * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_MethodImport);
9576
9577 __ecereInstance1->name = __ecereNameSpace__ecere__sys__CopyString(method->name), __ecereInstance1->isVirtual = method->type == 1, __ecereInstance1;
9578 });
9579 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(&classSym->_import->methods, symbol->_import);
9580 }
9581 if(!symbol)
9582 {
9583 symbol->type = method->dataType;
9584 if(symbol->type)
9585 symbol->type->refCount++;
9586 }
9587 }
9588 if(!method->dataType->dllExport)
9589 {
9590 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)
9591 dllImport = 1;
9592 }
9593 }
9594 if(inCompiler)
9595 {
9596 struct Declaration * decl;
9597 struct __ecereNameSpace__ecere__sys__OldList * specifiers, * declarators;
9598 struct Declarator * d;
9599 struct Declarator * funcDecl;
9600 struct External * external;
9601
9602 specifiers = MkList();
9603 declarators = MkList();
9604 if(dllImport)
9605 ListAdd(specifiers, MkSpecifier(EXTERN));
9606 else if(method->_class->symbol && ((struct Symbol *)method->_class->symbol)->isStatic)
9607 ListAdd(specifiers, MkSpecifier(STATIC));
9608 if(method->type == 1)
9609 {
9610 ListAdd(specifiers, MkSpecifier(INT));
9611 d = MkDeclaratorIdentifier(MkIdentifier(name));
9612 }
9613 else
9614 {
9615 d = MkDeclaratorIdentifier(MkIdentifier(name));
9616 if(dllImport)
9617 d = MkDeclaratorBrackets(MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), d));
9618 {
9619 struct Context * context = SetupTemplatesContext(method->_class);
9620
9621 d = SpecDeclFromString(method->dataTypeString, specifiers, d);
9622 FinishTemplatesContext(context);
9623 }
9624 funcDecl = GetFuncDecl(d);
9625 if(dllImport)
9626 {
9627 struct Specifier * spec, * next;
9628
9629 for(spec = (*specifiers).first; spec; spec = next)
9630 {
9631 next = spec->next;
9632 if(spec->type == 5)
9633 {
9634 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove((&*specifiers), spec);
9635 FreeSpecifier(spec);
9636 }
9637 }
9638 }
9639 if(method->dataType && !method->dataType->__anon1.__anon2.staticMethod)
9640 {
9641 if(funcDecl && funcDecl->__anon1.function.parameters && (*funcDecl->__anon1.function.parameters).count)
9642 {
9643 struct __ecereNameSpace__ecere__com__Class * _class = method->dataType->__anon1.__anon2.thisClass ? method->dataType->__anon1.__anon2.thisClass->__anon1.registered : method->_class;
9644 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")));
9645 struct TypeName * firstParam = ((struct TypeName *)(*funcDecl->__anon1.function.parameters).first);
9646 struct Specifier * firstSpec = firstParam->qualifiers ? (*firstParam->qualifiers).first : (((void *)0));
9647
9648 if(firstSpec && firstSpec->type == 0 && firstSpec->__anon1.specifier == VOID && !firstParam->declarator)
9649 {
9650 struct TypeName * param = (*funcDecl->__anon1.function.parameters).first;
9651
9652 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove((&*funcDecl->__anon1.function.parameters), param);
9653 FreeTypeName(param);
9654 }
9655 if(!funcDecl->__anon1.function.parameters)
9656 funcDecl->__anon1.function.parameters = MkList();
9657 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*funcDecl->__anon1.function.parameters), (((void *)0)), thisParam);
9658 }
9659 }
9660 }
9661 ProcessDeclarator(d, 1);
9662 ListAdd(declarators, MkInitDeclarator(d, (((void *)0))));
9663 decl = MkDeclaration(specifiers, declarators);
9664 ReplaceThisClassSpecifiers(specifiers, method->_class);
9665 external = MkExternalDeclaration(decl);
9666 external->symbol = symbol;
9667 symbol->__anon2.__anon1.pointerExternal = external;
9668 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add((&*ast), external);
9669 DeclareStruct(external, method->_class->fullName, 1, 1);
9670 if(method->dataType)
9671 DeclareType(external, method->dataType, 1, 1);
9672 }
9673 }
9674 if(inCompiler && neededFor)
9675 {
9676 struct External * external = symbol->__anon2.__anon1.pointerExternal ? symbol->__anon2.__anon1.pointerExternal : symbol->__anon2.__anon3.methodCodeExternal;
9677
9678 __ecereMethod_External_CreateUniqueEdge(neededFor, external, external->type == 0);
9679 }
9680 }
9681
9682 struct __ecereNameSpace__ecere__com__GlobalFunction;
9683
9684 struct __ecereNameSpace__ecere__com__GlobalFunction
9685 {
9686 struct __ecereNameSpace__ecere__com__GlobalFunction * prev;
9687 struct __ecereNameSpace__ecere__com__GlobalFunction * next;
9688 const char *  name;
9689 int (*  function)();
9690 struct __ecereNameSpace__ecere__com__Instance * module;
9691 struct __ecereNameSpace__ecere__com__NameSpace *  nameSpace;
9692 const char *  dataTypeString;
9693 struct Type * dataType;
9694 void *  symbol;
9695 } ecere_gcc_struct;
9696
9697 extern struct __ecereNameSpace__ecere__com__GlobalFunction * __ecereNameSpace__ecere__com__eSystem_FindFunction(struct __ecereNameSpace__ecere__com__Instance * module, const char *  name);
9698
9699 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);
9700
9701 unsigned int DeclareFunction(struct External * neededFor, struct __ecereNameSpace__ecere__com__GlobalFunction * function, char * name)
9702 {
9703 struct Symbol * symbol = function->symbol;
9704
9705 if(!symbol || !symbol->__anon2.__anon1.pointerExternal)
9706 {
9707 unsigned int imported = 0;
9708 unsigned int dllImport = 0;
9709
9710 if(!function->dataType)
9711 {
9712 function->dataType = ProcessTypeString(function->dataTypeString, 0);
9713 if(!function->dataType->__anon1.__anon2.thisClass)
9714 function->dataType->__anon1.__anon2.staticMethod = 1;
9715 }
9716 if(inCompiler)
9717 {
9718 if(!symbol)
9719 {
9720 struct ModuleImport * module = FindModule(function->module);
9721
9722 symbol = function->symbol = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Symbol);
9723 if(module->name)
9724 {
9725 if(!function->dataType->dllExport)
9726 {
9727 symbol->_import = (struct ClassImport *)__extension__ ({
9728 struct FunctionImport * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_FunctionImport);
9729
9730 __ecereInstance1->name = __ecereNameSpace__ecere__sys__CopyString(function->name), __ecereInstance1;
9731 });
9732 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(&module->functions, symbol->_import);
9733 }
9734 }
9735 {
9736 symbol->type = ProcessTypeString(function->dataTypeString, 0);
9737 if(!symbol->type->__anon1.__anon2.thisClass)
9738 symbol->type->__anon1.__anon2.staticMethod = 1;
9739 }
9740 }
9741 imported = symbol->_import ? 1 : 0;
9742 if(imported && function->module != privateModule && ((struct __ecereNameSpace__ecere__com__Module *)(((char *)function->module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->importType != 1)
9743 dllImport = 1;
9744 }
9745 if(inCompiler)
9746 {
9747 {
9748 struct Declaration * decl;
9749 struct __ecereNameSpace__ecere__sys__OldList * specifiers, * declarators;
9750 struct Declarator * d;
9751 struct Declarator * funcDecl;
9752 struct External * external;
9753
9754 specifiers = MkList();
9755 declarators = MkList();
9756 ListAdd(specifiers, MkSpecifier(EXTERN));
9757 d = MkDeclaratorIdentifier(MkIdentifier(imported ? name : function->name));
9758 if(dllImport)
9759 d = MkDeclaratorBrackets(MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), d));
9760 d = SpecDeclFromString(function->dataTypeString, specifiers, d);
9761 if(((struct __ecereNameSpace__ecere__com__Module *)(((char *)function->module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->importType == 1)
9762 {
9763 struct Specifier * spec;
9764
9765 for(spec = (*specifiers).first; spec; spec = spec->next)
9766 if(spec->type == 5 && spec->__anon1.__anon1.extDecl && spec->__anon1.__anon1.extDecl->type == 0 && !strcmp(spec->__anon1.__anon1.extDecl->__anon1.s, "dllexport"))
9767 {
9768 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove((&*specifiers), spec);
9769 FreeSpecifier(spec);
9770 break;
9771 }
9772 }
9773 funcDecl = GetFuncDecl(d);
9774 if(funcDecl && !funcDecl->__anon1.function.parameters)
9775 {
9776 funcDecl->__anon1.function.parameters = MkList();
9777 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*funcDecl->__anon1.function.parameters), (((void *)0)), MkTypeName(MkListOne(MkSpecifier(VOID)), (((void *)0))));
9778 }
9779 ListAdd(declarators, MkInitDeclarator(d, (((void *)0))));
9780 {
9781 struct Context * oldCtx = curContext;
9782
9783 curContext = globalContext;
9784 decl = MkDeclaration(specifiers, declarators);
9785 curContext = oldCtx;
9786 }
9787 external = MkExternalDeclaration(decl);
9788 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add((&*ast), external);
9789 external->symbol = symbol;
9790 symbol->__anon2.__anon1.pointerExternal = external;
9791 DeclareType(external, function->dataType, 1, 1);
9792 }
9793 }
9794 }
9795 if(inCompiler && neededFor && symbol && symbol->__anon2.__anon1.pointerExternal)
9796 __ecereMethod_External_CreateUniqueEdge(neededFor, symbol->__anon2.__anon1.pointerExternal, symbol->__anon2.__anon1.pointerExternal->type == 0);
9797 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;
9798 }
9799
9800 void DeclareFunctionUtil(struct External * neededBy, const char * s)
9801 {
9802 struct __ecereNameSpace__ecere__com__GlobalFunction * function = __ecereNameSpace__ecere__com__eSystem_FindFunction(privateModule, s);
9803
9804 if(function)
9805 {
9806 char name[1024];
9807
9808 name[0] = 0;
9809 if(((struct __ecereNameSpace__ecere__com__Module *)(((char *)function->module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->importType != 1 && (!function->dataType || !function->dataType->dllExport))
9810 strcpy(name, "__ecereFunction_");
9811 FullClassNameCat(name, s, 0);
9812 DeclareFunction(neededBy, function, name);
9813 }
9814 else if(neededBy)
9815 FindSymbol(s, globalContext, globalContext, 0, 0);
9816 }
9817
9818 static void CreateFireWatcher(struct __ecereNameSpace__ecere__com__Property * prop, struct Expression * object, struct Statement * stmt)
9819 {
9820 char propName[1024], propNameM[1024];
9821 char getName[1024], setName[1024];
9822 struct __ecereNameSpace__ecere__sys__OldList * args;
9823
9824 DeclareProperty(curExternal, prop, setName, getName);
9825 strcpy(propName, "__ecereProp_");
9826 FullClassNameCat(propName, prop->_class->fullName, 0);
9827 strcat(propName, "_");
9828 FullClassNameCat(propName, prop->name, 1);
9829 strcpy(propNameM, "__ecerePropM_");
9830 FullClassNameCat(propNameM, prop->_class->fullName, 0);
9831 strcat(propNameM, "_");
9832 FullClassNameCat(propNameM, prop->name, 1);
9833 if(prop->isWatchable)
9834 {
9835 args = MkList();
9836 ListAdd(args, object ? CopyExpression(object) : MkExpIdentifier(MkIdentifier("this")));
9837 ListAdd(args, MkExpIdentifier(MkIdentifier(propName)));
9838 ListAdd(stmt->__anon1.expressions, MkExpCall(MkExpIdentifier(MkIdentifier("ecere::com::eInstance_FireWatchers")), args));
9839 args = MkList();
9840 ListAdd(args, object ? CopyExpression(object) : MkExpIdentifier(MkIdentifier("this")));
9841 ListAdd(args, MkExpIdentifier(MkIdentifier(propNameM)));
9842 ListAdd(stmt->__anon1.expressions, MkExpCall(MkExpIdentifier(MkIdentifier("ecere::com::eInstance_FireWatchers")), args));
9843 DeclareFunctionUtil(curExternal, "eInstance_FireWatchers");
9844 }
9845 {
9846 args = MkList();
9847 ListAdd(args, object ? CopyExpression(object) : MkExpIdentifier(MkIdentifier("this")));
9848 ListAdd(args, MkExpIdentifier(MkIdentifier(propName)));
9849 ListAdd(stmt->__anon1.expressions, MkExpCall(MkExpIdentifier(MkIdentifier("ecere::com::eInstance_FireSelfWatchers")), args));
9850 args = MkList();
9851 ListAdd(args, object ? CopyExpression(object) : MkExpIdentifier(MkIdentifier("this")));
9852 ListAdd(args, MkExpIdentifier(MkIdentifier(propNameM)));
9853 ListAdd(stmt->__anon1.expressions, MkExpCall(MkExpIdentifier(MkIdentifier("ecere::com::eInstance_FireSelfWatchers")), args));
9854 DeclareFunctionUtil(curExternal, "eInstance_FireSelfWatchers");
9855 }
9856 if(curFunction->propSet && !strcmp(curFunction->propSet->string, prop->name) && (!object || (object->type == 0 && !strcmp(object->__anon1.__anon1.identifier->string, "this"))))
9857 curFunction->propSet->fireWatchersDone = 1;
9858 }
9859
9860 struct __ecereNameSpace__ecere__com__SubModule;
9861
9862 struct __ecereNameSpace__ecere__com__SubModule
9863 {
9864 struct __ecereNameSpace__ecere__com__SubModule * prev;
9865 struct __ecereNameSpace__ecere__com__SubModule * next;
9866 struct __ecereNameSpace__ecere__com__Instance * module;
9867 int importMode;
9868 } ecere_gcc_struct;
9869
9870 unsigned int ModuleVisibility(struct __ecereNameSpace__ecere__com__Instance * searchIn, struct __ecereNameSpace__ecere__com__Instance * searchFor)
9871 {
9872 struct __ecereNameSpace__ecere__com__SubModule * subModule;
9873
9874 if(searchFor == searchIn)
9875 return 1;
9876 for(subModule = ((struct __ecereNameSpace__ecere__com__Module *)(((char *)searchIn + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->modules.first; subModule; subModule = subModule->next)
9877 {
9878 if(subModule->importMode == 1 || searchIn == ((struct __ecereNameSpace__ecere__com__Module *)(((char *)searchIn + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application)
9879 {
9880 if(ModuleVisibility(subModule->module, searchFor))
9881 return 1;
9882 }
9883 }
9884 return 0;
9885 }
9886
9887 void ProcessExpressionType(struct Expression *  exp);
9888
9889 static void ReplaceClassMembers(struct Expression * exp, struct __ecereNameSpace__ecere__com__Class * _class)
9890 {
9891 if(exp->type == 0 && exp->__anon1.__anon1.identifier)
9892 {
9893 struct Identifier * id = exp->__anon1.__anon1.identifier;
9894 struct Context * ctx;
9895 struct Symbol * symbol = (((void *)0));
9896
9897 if(!id->_class || !id->_class->__anon1.__anon1.name || strcmp(id->_class->__anon1.__anon1.name, "property"))
9898 {
9899 for(ctx = curContext; ctx != topContext->parent && !symbol; ctx = ctx->parent)
9900 {
9901 if(!ctx)
9902 break;
9903 symbol = (struct Symbol *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindString(&ctx->symbols, id->string);
9904 if(symbol)
9905 break;
9906 }
9907 }
9908 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))))
9909 {
9910 struct __ecereNameSpace__ecere__com__Property * prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, id->string, privateModule);
9911 struct __ecereNameSpace__ecere__com__Method * method = (((void *)0));
9912 struct __ecereNameSpace__ecere__com__DataMember * member = (((void *)0));
9913 struct __ecereNameSpace__ecere__com__ClassProperty * classProp = (((void *)0));
9914
9915 if(!prop)
9916 {
9917 method = __ecereNameSpace__ecere__com__eClass_FindMethod(_class, id->string, privateModule);
9918 }
9919 if(!prop && !method)
9920 member = __ecereNameSpace__ecere__com__eClass_FindDataMember(_class, id->string, privateModule, (((void *)0)), (((void *)0)));
9921 if(!prop && !method && !member)
9922 {
9923 classProp = __ecereNameSpace__ecere__com__eClass_FindClassProperty(_class, id->string);
9924 }
9925 if(prop || method || member || classProp)
9926 {
9927 exp->type = 8;
9928 exp->__anon1.member.member = id;
9929 exp->__anon1.member.memberType = 0;
9930 exp->__anon1.member.exp = QMkExpId("this");
9931 exp->addedThis = 1;
9932 }
9933 else if(_class && _class->templateParams.first)
9934 {
9935 struct __ecereNameSpace__ecere__com__Class * sClass;
9936
9937 for(sClass = _class; sClass; sClass = sClass->base)
9938 {
9939 if(sClass->templateParams.first)
9940 {
9941 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * param;
9942
9943 for(param = sClass->templateParams.first; param; param = param->next)
9944 {
9945 if(param->type == 2 && !strcmp(param->name, id->string))
9946 {
9947 struct Expression * argExp = GetTemplateArgExpByName(param->name, _class, 2);
9948
9949 if(argExp)
9950 {
9951 struct Declarator * decl;
9952 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
9953
9954 FreeIdentifier(exp->__anon1.member.member);
9955 ProcessExpressionType(argExp);
9956 decl = SpecDeclFromString(param->__anon1.dataTypeString, specs, (((void *)0)));
9957 exp->expType = ProcessType(specs, decl);
9958 exp->type = 5;
9959 exp->__anon1.list = MkListOne(MkExpOp((((void *)0)), '*', MkExpCast(MkTypeName(specs, MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), decl)), MkExpOp((((void *)0)), '&', argExp))));
9960 }
9961 }
9962 }
9963 }
9964 }
9965 }
9966 }
9967 }
9968 }
9969
9970 static void PopulateInstanceProcessMember(struct Instantiation * inst, struct __ecereNameSpace__ecere__sys__OldList * memberList, struct __ecereNameSpace__ecere__com__DataMember * parentDataMember, unsigned int offset)
9971 {
9972 struct __ecereNameSpace__ecere__com__DataMember * dataMember;
9973
9974 for(dataMember = parentDataMember->members.first; dataMember; dataMember = dataMember->next)
9975 {
9976 if(!dataMember->name && (dataMember->type == 2 || dataMember->type == 1))
9977 PopulateInstanceProcessMember(inst, memberList, dataMember, offset + dataMember->offset);
9978 else
9979 {
9980 struct Expression * exp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression);
9981 struct MemberInit * member = MkMemberInit(MkListOne(MkIdentifier(dataMember->name)), MkInitializerAssignment(exp));
9982 struct Type * type;
9983 void * ptr = inst->data + dataMember->offset + offset;
9984 char * result = (((void *)0));
9985
9986 exp->loc = member->loc = inst->loc;
9987 ((struct Identifier *)(*member->identifiers).first)->loc = inst->loc;
9988 if(!dataMember->dataType)
9989 dataMember->dataType = ProcessTypeString(dataMember->dataTypeString, 0);
9990 type = dataMember->dataType;
9991 if(type->kind == 8)
9992 {
9993 struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class->__anon1.registered;
9994
9995 if(_class->type == 4)
9996 {
9997 struct __ecereNameSpace__ecere__com__Class * enumClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "enum");
9998
9999 if(enumClass)
10000 {
10001 struct __ecereNameSpace__ecere__com__EnumClassData * e = (_class ? ((void *)(((char *)_class->data) + enumClass->offsetClass)) : (((void *)0)));
10002 struct __ecereNameSpace__ecere__sys__NamedLink64 * item;
10003
10004 for(item = e->values.first; item; item = item->next)
10005 {
10006 if(item->data == GetEnumValue(_class, ptr))
10007 {
10008 result = item->name;
10009 break;
10010 }
10011 }
10012 if(result)
10013 {
10014 exp->__anon1.__anon1.identifier = MkIdentifier(result);
10015 exp->type = 0;
10016 exp->destType = MkClassType(_class->fullName);
10017 ProcessExpressionType(exp);
10018 }
10019 }
10020 }
10021 if(_class->type == 4 || _class->type == 3 || _class->type == 2)
10022 {
10023 if(!_class->dataType)
10024 _class->dataType = ProcessTypeString(_class->dataTypeString, 0);
10025 type = _class->dataType;
10026 }
10027 }
10028 if(!result)
10029 {
10030 switch(type->kind)
10031 {
10032 case 6:
10033 {
10034 FreeExpContents(exp);
10035 exp->__anon1.__anon1.constant = PrintFloat(*(float *)ptr);
10036 exp->type = 2;
10037 break;
10038 }
10039 case 7:
10040 {
10041 FreeExpContents(exp);
10042 exp->__anon1.__anon1.constant = PrintDouble(*(double *)ptr);
10043 exp->type = 2;
10044 break;
10045 }
10046 case 3:
10047 {
10048 FreeExpContents(exp);
10049 exp->__anon1.__anon1.constant = PrintInt(*(int *)ptr);
10050 exp->type = 2;
10051 break;
10052 }
10053 case 4:
10054 {
10055 FreeExpContents(exp);
10056 exp->__anon1.__anon1.constant = PrintInt64(*(long long *)ptr);
10057 exp->type = 2;
10058 break;
10059 }
10060 case 22:
10061 {
10062 FreeExpContents(exp);
10063 exp->__anon1.__anon1.constant = PrintInt64((long long)*(intptr_t *)ptr);
10064 exp->type = 2;
10065 break;
10066 }
10067 case 23:
10068 {
10069 FreeExpContents(exp);
10070 exp->__anon1.__anon1.constant = PrintInt64((long long)*(ssize_t *)ptr);
10071 exp->type = 2;
10072 break;
10073 }
10074 default:
10075 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Unhandled type populating instance\n", (((void *)0))));
10076 }
10077 }
10078 ListAdd(memberList, member);
10079 }
10080 if(parentDataMember->type == 1)
10081 break;
10082 }
10083 }
10084
10085 void CheckTemplateTypes(struct Expression * exp)
10086 {
10087 struct Expression * nbExp = GetNonBracketsExp(exp);
10088
10089 if(exp->destType && exp->destType->passAsTemplate && exp->expType && exp->expType->kind != 20 && !exp->expType->passAsTemplate && (nbExp == exp || nbExp->type != 11))
10090 {
10091 struct Expression * newExp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression);
10092 struct Context * context;
10093 int kind = exp->expType->kind;
10094
10095 *newExp = *exp;
10096 if(exp->destType)
10097 exp->destType->refCount++;
10098 if(exp->expType)
10099 exp->expType->refCount++;
10100 newExp->prev = (((void *)0));
10101 newExp->next = (((void *)0));
10102 if(exp->expType->kind == 8 && exp->expType->__anon1._class && exp->expType->__anon1._class->__anon1.registered)
10103 {
10104 struct __ecereNameSpace__ecere__com__Class * c = exp->expType->__anon1._class->__anon1.registered;
10105
10106 if(c->type == 2 || c->type == 4 || c->type == 3)
10107 {
10108 if(!c->dataType)
10109 c->dataType = ProcessTypeString(c->dataTypeString, 0);
10110 kind = c->dataType->kind;
10111 }
10112 }
10113 switch(kind)
10114 {
10115 case 7:
10116 if(exp->destType->classObjectType)
10117 {
10118 if(exp->destType)
10119 exp->destType->refCount--;
10120 if(exp->expType)
10121 exp->expType->refCount--;
10122 ((newExp ? __extension__ ({
10123 void * __ecerePtrToDelete = (newExp);
10124
10125 __ecereClass_Expression->Destructor ? __ecereClass_Expression->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete);
10126 }) : 0), newExp = 0);
10127 }
10128 else
10129 {
10130 struct __ecereNameSpace__ecere__sys__OldList * specs;
10131 struct __ecereNameSpace__ecere__sys__OldList * unionDefs = MkList();
10132 struct __ecereNameSpace__ecere__sys__OldList * statements = MkList();
10133
10134 context = PushContext();
10135 ListAdd(unionDefs, MkClassDefDeclaration(MkStructDeclaration(MkListOne(MkSpecifier(DOUBLE)), MkListOne(MkDeclaratorIdentifier(MkIdentifier("d"))), (((void *)0)))));
10136 ListAdd(unionDefs, MkClassDefDeclaration(MkStructDeclaration(MkListOne(MkSpecifierName("uint64")), MkListOne(MkDeclaratorIdentifier(MkIdentifier("i"))), (((void *)0)))));
10137 specs = MkListOne(MkStructOrUnion(4, (((void *)0)), unionDefs));
10138 exp->type = 23;
10139 exp->__anon1.compound = MkCompoundStmt(MkListOne(MkDeclaration(specs, MkListOne(MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier("__internal_union")), (((void *)0)))))), statements);
10140 ListAdd(statements, MkExpressionStmt(MkListOne(MkExpOp(MkExpMember(MkExpIdentifier(MkIdentifier("__internal_union")), MkIdentifier("d")), '=', newExp))));
10141 ListAdd(statements, MkExpressionStmt(MkListOne(MkExpMember(MkExpIdentifier(MkIdentifier("__internal_union")), MkIdentifier("i")))));
10142 exp->__anon1.compound->__anon1.compound.context = context;
10143 PopContext(context);
10144 }
10145 break;
10146 default:
10147 exp->type = 11;
10148 exp->__anon1.cast.typeName = MkTypeName(MkListOne(MkSpecifierName("uint64")), (((void *)0)));
10149 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))
10150 exp->__anon1.cast.exp = MkExpCast(MkTypeName(MkListOne(MkSpecifierName("uintptr")), (((void *)0))), MkExpBrackets(MkListOne(newExp)));
10151 else
10152 exp->__anon1.cast.exp = MkExpBrackets(MkListOne(newExp));
10153 exp->needCast = 1;
10154 break;
10155 }
10156 }
10157 else if(exp->expType && exp->expType->passAsTemplate && exp->destType && ((unsigned int)((exp->usage & 0x1) >> 0)) && exp->destType->kind != 20 && !exp->destType->passAsTemplate)
10158 {
10159 struct Expression * newExp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression);
10160 struct Context * context;
10161 int kind = exp->expType->kind;
10162
10163 *newExp = *exp;
10164 if(exp->destType)
10165 exp->destType->refCount++;
10166 if(exp->expType)
10167 exp->expType->refCount++;
10168 newExp->prev = (((void *)0));
10169 newExp->next = (((void *)0));
10170 if(exp->expType->kind == 8 && exp->expType->__anon1._class && exp->expType->__anon1._class->__anon1.registered)
10171 {
10172 struct __ecereNameSpace__ecere__com__Class * c = exp->expType->__anon1._class->__anon1.registered;
10173
10174 if(c->type == 2 || c->type == 4 || c->type == 3)
10175 {
10176 if(!c->dataType)
10177 c->dataType = ProcessTypeString(c->dataTypeString, 0);
10178 kind = c->dataType->kind;
10179 }
10180 }
10181 switch(kind)
10182 {
10183 case 7:
10184 if(exp->destType->classObjectType)
10185 {
10186 if(exp->destType)
10187 exp->destType->refCount--;
10188 if(exp->expType)
10189 exp->expType->refCount--;
10190 ((newExp ? __extension__ ({
10191 void * __ecerePtrToDelete = (newExp);
10192
10193 __ecereClass_Expression->Destructor ? __ecereClass_Expression->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete);
10194 }) : 0), newExp = 0);
10195 }
10196 else
10197 {
10198 struct __ecereNameSpace__ecere__sys__OldList * specs;
10199 struct __ecereNameSpace__ecere__sys__OldList * unionDefs = MkList();
10200 struct __ecereNameSpace__ecere__sys__OldList * statements = MkList();
10201
10202 context = PushContext();
10203 ListAdd(unionDefs, MkClassDefDeclaration(MkStructDeclaration(MkListOne(MkSpecifier(DOUBLE)), MkListOne(MkDeclaratorIdentifier(MkIdentifier("d"))), (((void *)0)))));
10204 ListAdd(unionDefs, MkClassDefDeclaration(MkStructDeclaration(MkListOne(MkSpecifierName("uint64")), MkListOne(MkDeclaratorIdentifier(MkIdentifier("i"))), (((void *)0)))));
10205 specs = MkListOne(MkStructOrUnion(4, (((void *)0)), unionDefs));
10206 exp->type = 23;
10207 exp->__anon1.compound = MkCompoundStmt(MkListOne(MkDeclaration(specs, MkListOne(MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier("__internal_union")), (((void *)0)))))), statements);
10208 ListAdd(statements, MkExpressionStmt(MkListOne(MkExpOp(MkExpMember(MkExpIdentifier(MkIdentifier("__internal_union")), MkIdentifier("i")), '=', newExp))));
10209 ListAdd(statements, MkExpressionStmt(MkListOne(MkExpMember(MkExpIdentifier(MkIdentifier("__internal_union")), MkIdentifier("d")))));
10210 exp->__anon1.compound->__anon1.compound.context = context;
10211 PopContext(context);
10212 }
10213 break;
10214 case 8:
10215 {
10216 if(exp->expType->__anon1._class && exp->expType->__anon1._class->__anon1.registered && exp->expType->__anon1._class->__anon1.registered->type == 1)
10217 {
10218 exp->type = 5;
10219 newExp = MkExpCast(MkTypeName(MkListOne(MkSpecifierName("uintptr")), (((void *)0))), newExp);
10220 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)));
10221 ProcessExpressionType((*exp->__anon1.list).first);
10222 break;
10223 }
10224 else
10225 {
10226 exp->type = 5;
10227 if(__ecereProp_Type_Get_isPointerType(exp->expType))
10228 {
10229 exp->needTemplateCast = 2;
10230 newExp->needCast = 1;
10231 newExp->needTemplateCast = 2;
10232 newExp = MkExpCast(MkTypeName(MkListOne(MkSpecifierName("uintptr")), (((void *)0))), newExp);
10233 }
10234 exp->__anon1.list = MkListOne(MkExpCast(MkTypeName(MkListOne(MkSpecifierName(exp->expType->__anon1._class->string)), (((void *)0))), newExp));
10235 exp->needTemplateCast = 2;
10236 newExp->needCast = 1;
10237 newExp->needTemplateCast = 2;
10238 ProcessExpressionType((*exp->__anon1.list).first);
10239 break;
10240 }
10241 }
10242 default:
10243 {
10244 if(exp->expType->kind == 20)
10245 {
10246 struct Type * type = ProcessTemplateParameterType(exp->expType->__anon1.templateParameter);
10247
10248 if(type)
10249 {
10250 FreeType(exp->destType);
10251 FreeType(exp->expType);
10252 ((newExp ? __extension__ ({
10253 void * __ecerePtrToDelete = (newExp);
10254
10255 __ecereClass_Expression->Destructor ? __ecereClass_Expression->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete);
10256 }) : 0), newExp = 0);
10257 break;
10258 }
10259 }
10260 {
10261 char typeString[1024];
10262 struct Declarator * decl;
10263 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
10264
10265 typeString[0] = '\0';
10266 PrintType(exp->expType, typeString, 0, 0);
10267 decl = SpecDeclFromString(typeString, specs, (((void *)0)));
10268 exp->type = 11;
10269 exp->__anon1.cast.typeName = MkTypeName(specs, decl);
10270 exp->__anon1.cast.exp = MkExpBrackets(MkListOne(newExp));
10271 exp->__anon1.cast.exp->needCast = 1;
10272 exp->needTemplateCast = 2;
10273 newExp->needTemplateCast = 2;
10274 }
10275 break;
10276 }
10277 }
10278 }
10279 }
10280
10281 static void ProcessInitializer(struct Initializer * init, struct Type * type)
10282 {
10283 switch(init->type)
10284 {
10285 case 0:
10286 if(!init->__anon1.exp || init->__anon1.exp->type != 1 || !init->__anon1.exp->__anon1.instance || init->__anon1.exp->__anon1.instance->_class || !type || type->kind == 8)
10287 {
10288 if(init->__anon1.exp && !init->__anon1.exp->destType)
10289 {
10290 FreeType(init->__anon1.exp->destType);
10291 init->__anon1.exp->destType = type;
10292 if(type)
10293 type->refCount++;
10294 }
10295 if(init->__anon1.exp)
10296 {
10297 ProcessExpressionType(init->__anon1.exp);
10298 init->isConstant = init->__anon1.exp->isConstant;
10299 }
10300 break;
10301 }
10302 else
10303 {
10304 struct Expression * exp = init->__anon1.exp;
10305 struct Instantiation * inst = exp->__anon1.instance;
10306 struct MembersInit * members;
10307
10308 init->type = 1;
10309 init->__anon1.list = MkList();
10310 if(inst->members)
10311 {
10312 for(members = (*inst->members).first; members; members = members->next)
10313 {
10314 if(members->type == 0)
10315 {
10316 struct MemberInit * member;
10317
10318 for(member = (*members->__anon1.dataMembers).first; member; member = member->next)
10319 {
10320 ListAdd(init->__anon1.list, member->initializer);
10321 member->initializer = (((void *)0));
10322 }
10323 }
10324 }
10325 }
10326 FreeExpression(exp);
10327 }
10328 case 1:
10329 {
10330 struct Initializer * i;
10331 struct Type * initializerType = (((void *)0));
10332 struct __ecereNameSpace__ecere__com__Class * curClass = (((void *)0));
10333 struct __ecereNameSpace__ecere__com__DataMember * curMember = (((void *)0));
10334 struct __ecereNameSpace__ecere__com__DataMember * subMemberStack[256];
10335 int subMemberStackPos = 0;
10336
10337 if(type && type->kind == 12)
10338 initializerType = Dereference(type);
10339 else if(type && (type->kind == 9 || type->kind == 10))
10340 initializerType = type->__anon1.__anon1.members.first;
10341 for(i = (*init->__anon1.list).first; i; i = i->next)
10342 {
10343 if(type && type->kind == 8 && type->__anon1._class && type->__anon1._class->__anon1.registered)
10344 {
10345 FindNextDataMember(type->__anon1._class->__anon1.registered, &curClass, &curMember, subMemberStack, &subMemberStackPos);
10346 if(curMember)
10347 {
10348 if(!curMember->dataType)
10349 curMember->dataType = ProcessTypeString(curMember->dataTypeString, 0);
10350 initializerType = curMember->dataType;
10351 }
10352 }
10353 ProcessInitializer(i, initializerType);
10354 if(initializerType && type && (type->kind == 9 || type->kind == 10))
10355 initializerType = initializerType->next;
10356 if(!i->isConstant)
10357 init->isConstant = 0;
10358 }
10359 if(type && type->kind == 12)
10360 FreeType(initializerType);
10361 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))
10362 {
10363 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Assigning list initializer to non list\n", (((void *)0))));
10364 }
10365 break;
10366 }
10367 }
10368 }
10369
10370 void PopulateInstance(struct Instantiation * inst)
10371 {
10372 struct Symbol * classSym = inst->_class->__anon1.__anon1.symbol;
10373 struct __ecereNameSpace__ecere__com__Class * _class = classSym->__anon1.registered;
10374 struct __ecereNameSpace__ecere__com__DataMember * dataMember;
10375 struct __ecereNameSpace__ecere__sys__OldList * memberList = MkList();
10376
10377 if(!inst->members)
10378 inst->members = MkListOne(MkMembersInitList(memberList));
10379 else
10380 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add((&*inst->members), MkMembersInitList(memberList));
10381 for(dataMember = _class->membersAndProperties.first; dataMember; dataMember = dataMember->next)
10382 {
10383 if(!dataMember->isProperty)
10384 {
10385 if(!dataMember->name && (dataMember->type == 2 || dataMember->type == 1))
10386 PopulateInstanceProcessMember(inst, memberList, dataMember, dataMember->offset);
10387 else
10388 {
10389 struct Expression * exp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression);
10390 struct MemberInit * member = MkMemberInit(MkListOne(MkIdentifier(dataMember->name)), MkInitializerAssignment(exp));
10391 struct Type * type;
10392 void * ptr = inst->data + dataMember->offset;
10393 char * result = (((void *)0));
10394
10395 exp->loc = member->loc = inst->loc;
10396 ((struct Identifier *)(*member->identifiers).first)->loc = inst->loc;
10397 if(!dataMember->dataType)
10398 dataMember->dataType = ProcessTypeString(dataMember->dataTypeString, 0);
10399 type = dataMember->dataType;
10400 if(type->kind == 8)
10401 {
10402 struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class->__anon1.registered;
10403
10404 if(_class->type == 4)
10405 {
10406 struct __ecereNameSpace__ecere__com__Class * enumClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "enum");
10407
10408 if(enumClass)
10409 {
10410 struct __ecereNameSpace__ecere__com__EnumClassData * e = (_class ? ((void *)(((char *)_class->data) + enumClass->offsetClass)) : (((void *)0)));
10411 struct __ecereNameSpace__ecere__sys__NamedLink64 * item;
10412
10413 for(item = e->values.first; item; item = item->next)
10414 {
10415 if(item->data == GetEnumValue(_class, ptr))
10416 {
10417 result = item->name;
10418 break;
10419 }
10420 }
10421 }
10422 if(result)
10423 {
10424 exp->__anon1.__anon1.identifier = MkIdentifier(result);
10425 exp->type = 0;
10426 exp->destType = MkClassType(_class->fullName);
10427 ProcessExpressionType(exp);
10428 }
10429 }
10430 if(_class->type == 4 || _class->type == 3 || _class->type == 2)
10431 {
10432 if(!_class->dataType)
10433 _class->dataType = ProcessTypeString(_class->dataTypeString, 0);
10434 type = _class->dataType;
10435 }
10436 }
10437 if(!result)
10438 {
10439 switch(type->kind)
10440 {
10441 case 6:
10442 {
10443 exp->__anon1.__anon1.constant = PrintFloat(*(float *)ptr);
10444 exp->type = 2;
10445 break;
10446 }
10447 case 7:
10448 {
10449 exp->__anon1.__anon1.constant = PrintDouble(*(double *)ptr);
10450 exp->type = 2;
10451 break;
10452 }
10453 case 3:
10454 {
10455 exp->__anon1.__anon1.constant = PrintInt(*(int *)ptr);
10456 exp->type = 2;
10457 break;
10458 }
10459 case 4:
10460 {
10461 exp->__anon1.__anon1.constant = PrintInt64(*(long long *)ptr);
10462 exp->type = 2;
10463 break;
10464 }
10465 case 22:
10466 {
10467 exp->__anon1.__anon1.constant = PrintInt64((long long)*(intptr_t *)ptr);
10468 exp->type = 2;
10469 break;
10470 }
10471 default:
10472 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Unhandled type populating instance\n", (((void *)0))));
10473 }
10474 }
10475 ListAdd(memberList, member);
10476 }
10477 }
10478 }
10479 }
10480
10481 int ComputeTypeSize(struct Type *  type);
10482
10483 void ComputeClassMembers(struct __ecereNameSpace__ecere__com__Class * _class, unsigned int isMember)
10484 {
10485 struct __ecereNameSpace__ecere__com__DataMember * member = isMember ? (struct __ecereNameSpace__ecere__com__DataMember *)_class : (((void *)0));
10486 struct Context * context = isMember ? (((void *)0)) : SetupTemplatesContext(_class);
10487
10488 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))
10489 {
10490 int unionMemberOffset = 0;
10491 int bitFields = 0;
10492
10493 if(member)
10494 {
10495 member->memberOffset = 0;
10496 if(targetBits < sizeof(void *) * 8)
10497 member->structAlignment = 0;
10498 }
10499 else if(targetBits < sizeof(void *) * 8)
10500 _class->structAlignment = 0;
10501 if(!member && ((_class->type == 0 || _class->type == 5) || (_class->type == 1 && _class->memberOffset && _class->memberOffset > _class->base->structSize)))
10502 _class->memberOffset = (_class->base && _class->type == 1) ? _class->base->structSize : 0;
10503 if(!member && _class->destructionWatchOffset)
10504 _class->memberOffset += sizeof(struct __ecereNameSpace__ecere__sys__OldList);
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)
10511 {
10512 if(dataMember->type == 0 && dataMember->dataTypeString && !dataMember->dataType)
10513 {
10514 dataMember->dataType = ProcessTypeString(dataMember->dataTypeString, 0);
10515 }
10516 }
10517 }
10518 }
10519 {
10520 struct __ecereNameSpace__ecere__com__DataMember * dataMember;
10521
10522 for(dataMember = member ? member->members.first : _class->membersAndProperties.first; dataMember; dataMember = dataMember->next)
10523 {
10524 if(!dataMember->isProperty && (dataMember->type != 0 || dataMember->dataTypeString))
10525 {
10526 if(!isMember && _class->type == 2 && dataMember->dataType)
10527 {
10528 struct __ecereNameSpace__ecere__com__BitMember * bitMember = (struct __ecereNameSpace__ecere__com__BitMember *)dataMember;
10529 uint64 mask = 0;
10530 int d;
10531
10532 ComputeTypeSize(dataMember->dataType);
10533 if(bitMember->pos == -1)
10534 bitMember->pos = _class->memberOffset;
10535 if(!bitMember->size)
10536 bitMember->size = dataMember->dataType->size * 8;
10537 _class->memberOffset = bitMember->pos + bitMember->size;
10538 for(d = 0; d < bitMember->size; d++)
10539 {
10540 if(d)
10541 mask <<= 1;
10542 mask |= 1;
10543 }
10544 bitMember->mask = mask << bitMember->pos;
10545 }
10546 else if(dataMember->type == 0 && dataMember->dataType)
10547 {
10548 int size;
10549 int alignment = 0;
10550
10551 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)))
10552 ComputeTypeSize(dataMember->dataType);
10553 if(dataMember->dataType->bitFieldCount)
10554 {
10555 bitFields += dataMember->dataType->bitFieldCount;
10556 size = 0;
10557 }
10558 else
10559 {
10560 if(bitFields)
10561 {
10562 int size = (bitFields + 7) / 8;
10563
10564 if(isMember)
10565 {
10566 int __simpleStruct0;
10567
10568 if(alignment)
10569 {
10570 short __simpleStruct0;
10571
10572 member->structAlignment = (__simpleStruct0 = member->structAlignment, (__simpleStruct0 > alignment) ? __simpleStruct0 : alignment);
10573 if(member->memberOffset % alignment)
10574 member->memberOffset += alignment - (member->memberOffset % alignment);
10575 }
10576 dataMember->offset = member->memberOffset;
10577 if(member->type == 1)
10578 unionMemberOffset = (__simpleStruct0 = dataMember->dataType->size, (unionMemberOffset > __simpleStruct0) ? unionMemberOffset : __simpleStruct0);
10579 else
10580 {
10581 member->memberOffset += size;
10582 }
10583 }
10584 else
10585 {
10586 if(alignment)
10587 {
10588 short __simpleStruct0;
10589
10590 _class->structAlignment = (__simpleStruct0 = _class->structAlignment, (__simpleStruct0 > alignment) ? __simpleStruct0 : alignment);
10591 if(_class->memberOffset % alignment)
10592 _class->memberOffset += alignment - (_class->memberOffset % alignment);
10593 }
10594 dataMember->offset = _class->memberOffset;
10595 _class->memberOffset += size;
10596 }
10597 bitFields = 0;
10598 }
10599 size = dataMember->dataType->size;
10600 alignment = dataMember->dataType->alignment;
10601 }
10602 if(isMember)
10603 {
10604 int __simpleStruct0;
10605
10606 if(alignment)
10607 {
10608 short __simpleStruct0;
10609
10610 member->structAlignment = (__simpleStruct0 = member->structAlignment, (__simpleStruct0 > alignment) ? __simpleStruct0 : alignment);
10611 if(member->memberOffset % alignment)
10612 member->memberOffset += alignment - (member->memberOffset % alignment);
10613 }
10614 dataMember->offset = member->memberOffset;
10615 if(member->type == 1)
10616 unionMemberOffset = (__simpleStruct0 = dataMember->dataType->size, (unionMemberOffset > __simpleStruct0) ? unionMemberOffset : __simpleStruct0);
10617 else
10618 {
10619 member->memberOffset += size;
10620 }
10621 }
10622 else
10623 {
10624 if(alignment)
10625 {
10626 short __simpleStruct0;
10627
10628 _class->structAlignment = (__simpleStruct0 = _class->structAlignment, (__simpleStruct0 > alignment) ? __simpleStruct0 : alignment);
10629 if(_class->memberOffset % alignment)
10630 _class->memberOffset += alignment - (_class->memberOffset % alignment);
10631 }
10632 dataMember->offset = _class->memberOffset;
10633 _class->memberOffset += size;
10634 }
10635 }
10636 else
10637 {
10638 int alignment;
10639
10640 ComputeClassMembers((struct __ecereNameSpace__ecere__com__Class *)dataMember, 1);
10641 alignment = dataMember->structAlignment;
10642 if(isMember)
10643 {
10644 int __simpleStruct0;
10645
10646 if(alignment)
10647 {
10648 short __simpleStruct0;
10649
10650 if(member->memberOffset % alignment)
10651 member->memberOffset += alignment - (member->memberOffset % alignment);
10652 member->structAlignment = (__simpleStruct0 = member->structAlignment, (__simpleStruct0 > alignment) ? __simpleStruct0 : alignment);
10653 }
10654 dataMember->offset = member->memberOffset;
10655 if(member->type == 1)
10656 unionMemberOffset = (__simpleStruct0 = dataMember->memberOffset, (unionMemberOffset > __simpleStruct0) ? unionMemberOffset : __simpleStruct0);
10657 else
10658 member->memberOffset += dataMember->memberOffset;
10659 }
10660 else
10661 {
10662 if(alignment)
10663 {
10664 short __simpleStruct0;
10665
10666 if(_class->memberOffset % alignment)
10667 _class->memberOffset += alignment - (_class->memberOffset % alignment);
10668 _class->structAlignment = (__simpleStruct0 = _class->structAlignment, (__simpleStruct0 > alignment) ? __simpleStruct0 : alignment);
10669 }
10670 dataMember->offset = _class->memberOffset;
10671 _class->memberOffset += dataMember->memberOffset;
10672 }
10673 }
10674 }
10675 }
10676 if(bitFields)
10677 {
10678 int alignment = 0;
10679 int size = (bitFields + 7) / 8;
10680
10681 if(isMember)
10682 {
10683 int __simpleStruct0;
10684
10685 if(alignment)
10686 {
10687 short __simpleStruct0;
10688
10689 member->structAlignment = (__simpleStruct0 = member->structAlignment, (__simpleStruct0 > alignment) ? __simpleStruct0 : alignment);
10690 if(member->memberOffset % alignment)
10691 member->memberOffset += alignment - (member->memberOffset % alignment);
10692 }
10693 if(member->type == 1)
10694 unionMemberOffset = (__simpleStruct0 = dataMember->dataType->size, (unionMemberOffset > __simpleStruct0) ? unionMemberOffset : __simpleStruct0);
10695 else
10696 {
10697 member->memberOffset += size;
10698 }
10699 }
10700 else
10701 {
10702 if(alignment)
10703 {
10704 short __simpleStruct0;
10705
10706 _class->structAlignment = (__simpleStruct0 = _class->structAlignment, (__simpleStruct0 > alignment) ? __simpleStruct0 : alignment);
10707 if(_class->memberOffset % alignment)
10708 _class->memberOffset += alignment - (_class->memberOffset % alignment);
10709 }
10710 _class->memberOffset += size;
10711 }
10712 bitFields = 0;
10713 }
10714 }
10715 if(member && member->type == 1)
10716 {
10717 member->memberOffset = unionMemberOffset;
10718 }
10719 if(!isMember)
10720 {
10721 if(_class->type != 2)
10722 {
10723 int extra = 0;
10724
10725 if(_class->structAlignment)
10726 {
10727 if(_class->memberOffset % _class->structAlignment)
10728 extra += _class->structAlignment - (_class->memberOffset % _class->structAlignment);
10729 }
10730 _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;
10731 if(!member)
10732 {
10733 struct __ecereNameSpace__ecere__com__Property * prop;
10734
10735 for(prop = _class->membersAndProperties.first; prop; prop = prop->next)
10736 {
10737 if(prop->isProperty && prop->isWatchable)
10738 {
10739 prop->watcherOffset = _class->structSize;
10740 _class->structSize += sizeof(struct __ecereNameSpace__ecere__sys__OldList);
10741 }
10742 }
10743 }
10744 {
10745 struct __ecereNameSpace__ecere__sys__OldLink * derivative;
10746
10747 for(derivative = _class->derivatives.first; derivative; derivative = derivative->next)
10748 {
10749 struct __ecereNameSpace__ecere__com__Class * deriv = derivative->data;
10750
10751 if(deriv->computeSize)
10752 {
10753 deriv->offset = (_class->type == 5 ? _class->memberOffset : _class->structSize);
10754 deriv->memberOffset = 0;
10755 deriv->structSize = deriv->offset;
10756 ComputeClassMembers(deriv, 0);
10757 }
10758 }
10759 }
10760 }
10761 }
10762 }
10763 if(context)
10764 FinishTemplatesContext(context);
10765 }
10766
10767 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)
10768 {
10769 struct __ecereNameSpace__ecere__com__DataMember * topMember = isMember ? (struct __ecereNameSpace__ecere__com__DataMember *)_class : (((void *)0));
10770 unsigned int totalSize = 0;
10771 unsigned int maxSize = 0;
10772 int alignment;
10773 unsigned int size;
10774 struct __ecereNameSpace__ecere__com__DataMember * member;
10775 int anonID = 1;
10776 struct Context * context = isMember ? (((void *)0)) : SetupTemplatesContext(_class);
10777
10778 if(addedPadding)
10779 *addedPadding = 0;
10780 if(!isMember && _class->base)
10781 {
10782 maxSize = _class->structSize;
10783 {
10784 if(_class->type == 1 || _class->type == 5)
10785 AddMembers(neededBy, declarations, _class->base, 0, &totalSize, topClass, (((void *)0)));
10786 else
10787 {
10788 unsigned int baseSize = _class->base->templateClass ? _class->base->templateClass->structSize : _class->base->structSize;
10789
10790 if(maxSize > baseSize)
10791 maxSize -= baseSize;
10792 else
10793 maxSize = 0;
10794 }
10795 }
10796 }
10797 for(member = isMember ? topMember->members.first : _class->membersAndProperties.first; member; member = member->next)
10798 {
10799 if(!member->isProperty)
10800 {
10801 switch(member->type)
10802 {
10803 case 0:
10804 {
10805 if(member->dataTypeString)
10806 {
10807 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList(), * decls = MkList();
10808 struct Declarator * decl;
10809
10810 decl = SpecDeclFromString(member->dataTypeString, specs, MkDeclaratorIdentifier(MkIdentifier(member->name)));
10811 ListAdd(decls, MkStructDeclarator(decl, (((void *)0))));
10812 ListAdd(declarations, MkClassDefDeclaration(MkStructDeclaration(specs, decls, (((void *)0)))));
10813 if(!member->dataType)
10814 member->dataType = ProcessType(specs, decl);
10815 ReplaceThisClassSpecifiers(specs, topClass);
10816 {
10817 struct Type * type = ProcessType(specs, decl);
10818
10819 DeclareType(neededBy, member->dataType, 1, 0);
10820 FreeType(type);
10821 }
10822 ComputeTypeSize(member->dataType);
10823 size = member->dataType->size;
10824 alignment = member->dataType->alignment;
10825 if(alignment)
10826 {
10827 if(totalSize % alignment)
10828 totalSize += alignment - (totalSize % alignment);
10829 }
10830 totalSize += size;
10831 }
10832 break;
10833 }
10834 case 1:
10835 case 2:
10836 {
10837 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList(), * list = MkList();
10838 char id[100];
10839
10840 sprintf(id, "__anon%d", anonID++);
10841 size = 0;
10842 AddMembers(neededBy, list, (struct __ecereNameSpace__ecere__com__Class *)member, 1, &size, topClass, (((void *)0)));
10843 ListAdd(specs, MkStructOrUnion((member->type == 1) ? 4 : 3, (((void *)0)), list));
10844 ListAdd(declarations, MkClassDefDeclaration(MkStructDeclaration(specs, MkListOne(MkDeclaratorIdentifier(MkIdentifier(id))), (((void *)0)))));
10845 alignment = member->structAlignment;
10846 if(alignment)
10847 {
10848 if(totalSize % alignment)
10849 totalSize += alignment - (totalSize % alignment);
10850 }
10851 totalSize += size;
10852 break;
10853 }
10854 }
10855 }
10856 }
10857 if(retSize)
10858 {
10859 unsigned int __simpleStruct0;
10860
10861 if(topMember && topMember->type == 1)
10862 *retSize = (__simpleStruct0 = *retSize, (__simpleStruct0 > totalSize) ? __simpleStruct0 : totalSize);
10863 else
10864 *retSize += totalSize;
10865 }
10866 else if(totalSize < maxSize && _class->type != 1000)
10867 {
10868 int autoPadding = 0;
10869
10870 if(!isMember && _class->structAlignment && totalSize % _class->structAlignment)
10871 autoPadding = _class->structAlignment - (totalSize % _class->structAlignment);
10872 if(totalSize + autoPadding < maxSize)
10873 {
10874 char sizeString[50];
10875
10876 sprintf(sizeString, "%d", maxSize - totalSize);
10877 ListAdd(declarations, MkClassDefDeclaration(MkStructDeclaration(MkListOne(MkSpecifier(CHAR)), MkListOne(MkDeclaratorArray(MkDeclaratorIdentifier(MkIdentifier("__ecere_padding")), MkExpConstant(sizeString))), (((void *)0)))));
10878 if(addedPadding)
10879 *addedPadding = 1;
10880 }
10881 }
10882 if(context)
10883 FinishTemplatesContext(context);
10884 return topMember ? topMember->memberID : _class->memberID;
10885 }
10886
10887 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)
10888 {
10889 if(source && dest)
10890 {
10891 if(warnConst)
10892 CheckConstCompatibility(source, dest, 1);
10893 if(source->kind == 20 && dest->kind != 20)
10894 {
10895 struct Type * type = ProcessTemplateParameterType(source->__anon1.templateParameter);
10896
10897 if(type)
10898 source = type;
10899 }
10900 if(dest->kind == 20 && source->kind != 20)
10901 {
10902 struct Type * type = ProcessTemplateParameterType(dest->__anon1.templateParameter);
10903
10904 if(type)
10905 dest = type;
10906 }
10907 if(dest->classObjectType == 2 && dest->kind != 11)
10908 {
10909 if(source->classObjectType != 3)
10910 return 1;
10911 else
10912 {
10913 if((dest->__anon1._class && strcmp(dest->__anon1._class->string, "class")) || (source->__anon1._class && strcmp(source->__anon1._class->string, "class")))
10914 {
10915 return 1;
10916 }
10917 }
10918 }
10919 else
10920 {
10921 if(source->kind != 11 && source->classObjectType == 3)
10922 return 1;
10923 if(dest->kind != 11 && dest->classObjectType == 3 && source->classObjectType != 2)
10924 return 1;
10925 }
10926 if((dest->kind == 9 && source->kind == 9) || (dest->kind == 10 && source->kind == 10))
10927 {
10928 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))
10929 return 1;
10930 }
10931 if(dest->kind == 14 && source->kind != 0)
10932 return 1;
10933 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))
10934 return 1;
10935 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))
10936 return 1;
10937 if(((source->kind == 8 && dest->kind == 8) || (source->kind == 19 && dest->kind == 19)) && source->__anon1._class)
10938 {
10939 if(source->__anon1._class->__anon1.registered && source->__anon1._class->__anon1.registered->type == 3)
10940 {
10941 if(conversions != (((void *)0)))
10942 {
10943 if(source->__anon1._class->__anon1.registered == dest->__anon1._class->__anon1.registered)
10944 return 1;
10945 }
10946 else
10947 {
10948 struct __ecereNameSpace__ecere__com__Class * sourceBase, * destBase;
10949
10950 for(sourceBase = source->__anon1._class->__anon1.registered; sourceBase && sourceBase->base->type != 1000; sourceBase = sourceBase->base)
10951 ;
10952 for(destBase = dest->__anon1._class->__anon1.registered; destBase && destBase->base->type != 1000; destBase = destBase->base)
10953 ;
10954 if(sourceBase == destBase)
10955 return 1;
10956 }
10957 }
10958 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))
10959 return 1;
10960 else
10961 {
10962 if(dest->__anon1._class && dest->__anon1._class->__anon1.registered && source->__anon1._class && source->__anon1._class->__anon1.registered && (dest->casted || (enumBaseType && dest->__anon1._class->__anon1.registered->type == 4 && (source->kind == 8 || source->__anon1._class->__anon1.registered->type != 4))))
10963 {
10964 if(__ecereNameSpace__ecere__com__eClass_IsDerived(dest->__anon1._class->__anon1.registered, source->__anon1._class->__anon1.registered))
10965 {
10966 return 1;
10967 }
10968 }
10969 }
10970 }
10971 if(source->kind == 19 && dest->kind == 8 && dest->__anon1._class && !strcmp(dest->__anon1._class->string, "ecere::com::Class"))
10972 return 1;
10973 if(doConversion)
10974 {
10975 if(source->kind == 8)
10976 {
10977 struct __ecereNameSpace__ecere__com__Class * _class;
10978
10979 for(_class = source->__anon1._class ? source->__anon1._class->__anon1.registered : (((void *)0)); _class; _class = _class->base)
10980 {
10981 struct __ecereNameSpace__ecere__com__Property * convert;
10982
10983 for(convert = _class->conversions.first; convert; convert = convert->next)
10984 {
10985 if(convert->memberAccess == 1 || _class->module == privateModule)
10986 {
10987 struct Conversion * after = (conversions != (((void *)0))) ? conversions->last : (((void *)0));
10988
10989 if(!convert->dataType)
10990 convert->dataType = ProcessTypeString(convert->dataTypeString, 0);
10991 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))
10992 {
10993 if(!conversions && !convert->Get)
10994 return 1;
10995 else if(conversions != (((void *)0)))
10996 {
10997 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))
10998 return 1;
10999 else
11000 {
11001 struct Conversion * conv = (conv = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Conversion), conv->convert = convert, conv->isGet = 1, conv);
11002
11003 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert(conversions, after, conv);
11004 return 1;
11005 }
11006 }
11007 }
11008 }
11009 }
11010 }
11011 }
11012 if(dest->kind == 8)
11013 {
11014 struct __ecereNameSpace__ecere__com__Class * _class;
11015
11016 for(_class = dest->__anon1._class ? dest->__anon1._class->__anon1.registered : (((void *)0)); _class; _class = _class->base)
11017 {
11018 struct __ecereNameSpace__ecere__com__Property * convert;
11019
11020 for(convert = _class->conversions.first; convert; convert = convert->next)
11021 {
11022 if(convert->memberAccess == 1 || _class->module == privateModule)
11023 {
11024 struct Type * constType = (((void *)0));
11025 unsigned int success = 0;
11026
11027 if(!convert->dataType)
11028 convert->dataType = ProcessTypeString(convert->dataTypeString, 0);
11029 if(warnConst && convert->dataType->kind == 13 && convert->dataType->__anon1.type && dest->constant)
11030 {
11031 struct Type * ptrType = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
11032
11033 constType = __extension__ ({
11034 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
11035
11036 __ecereInstance1->kind = 13, __ecereInstance1->refCount = 1, __ecereInstance1->__anon1.type = ptrType, __ecereInstance1;
11037 });
11038 CopyTypeInto(ptrType, convert->dataType->__anon1.type);
11039 ptrType->constant = 1;
11040 }
11041 if((constType || convert->dataType != dest) && MatchTypes(source, constType ? constType : convert->dataType, conversions, (((void *)0)), (((void *)0)), 1, 0, 0, 1, warnConst))
11042 {
11043 if(!conversions && !convert->Set)
11044 success = 1;
11045 else if(conversions != (((void *)0)))
11046 {
11047 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))
11048 success = 1;
11049 else
11050 {
11051 struct Conversion * conv = (conv = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Conversion), conv->convert = convert, conv);
11052
11053 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(conversions, conv);
11054 success = 1;
11055 }
11056 }
11057 }
11058 if(constType)
11059 FreeType(constType);
11060 if(success)
11061 return 1;
11062 }
11063 }
11064 }
11065 if(enumBaseType && dest->__anon1._class && dest->__anon1._class->__anon1.registered && dest->__anon1._class->__anon1.registered->type == 4)
11066 {
11067 if(!dest->__anon1._class->__anon1.registered->dataType)
11068 dest->__anon1._class->__anon1.registered->dataType = ProcessTypeString(dest->__anon1._class->__anon1.registered->dataTypeString, 0);
11069 if(dest->__anon1._class->__anon1.registered->dataType->kind == 8 || source->truth || dest->truth)
11070 {
11071 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))
11072 {
11073 return 1;
11074 }
11075 }
11076 }
11077 }
11078 if(source->kind == 8)
11079 {
11080 struct __ecereNameSpace__ecere__com__Class * _class;
11081
11082 for(_class = source->__anon1._class ? source->__anon1._class->__anon1.registered : (((void *)0)); _class; _class = _class->base)
11083 {
11084 struct __ecereNameSpace__ecere__com__Property * convert;
11085
11086 for(convert = _class->conversions.first; convert; convert = convert->next)
11087 {
11088 if(convert->memberAccess == 1 || _class->module == privateModule)
11089 {
11090 struct Conversion * after = (conversions != (((void *)0))) ? conversions->last : (((void *)0));
11091
11092 if(!convert->dataType)
11093 convert->dataType = ProcessTypeString(convert->dataTypeString, 0);
11094 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))
11095 {
11096 if(!conversions && !convert->Get)
11097 return 1;
11098 else if(conversions != (((void *)0)))
11099 {
11100 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))
11101 return 1;
11102 else
11103 {
11104 struct Conversion * conv = (conv = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Conversion), conv->convert = convert, conv->isGet = 1, conv);
11105
11106 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert(conversions, after, conv);
11107 return 1;
11108 }
11109 }
11110 }
11111 }
11112 }
11113 }
11114 if(enumBaseType && source->__anon1._class && source->__anon1._class->__anon1.registered && source->__anon1._class->__anon1.registered->type == 4)
11115 {
11116 if(!source->__anon1._class->__anon1.registered->dataType)
11117 source->__anon1._class->__anon1.registered->dataType = ProcessTypeString(source->__anon1._class->__anon1.registered->dataTypeString, 0);
11118 if(!isConversionExploration || source->__anon1._class->__anon1.registered->dataType->kind == 8 || !strcmp(source->__anon1._class->__anon1.registered->name, "String"))
11119 {
11120 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))
11121 return 1;
11122 else if(MatchTypes(dest, source->__anon1._class->__anon1.registered->dataType, (((void *)0)), (((void *)0)), (((void *)0)), 0, 0, 0, 0, warnConst))
11123 return 1;
11124 }
11125 }
11126 }
11127 }
11128 if(source->kind == 8 || source->kind == 19)
11129 ;
11130 else if(dest->kind == source->kind && (dest->kind != 9 && dest->kind != 10 && dest->kind != 11 && dest->kind != 12 && dest->kind != 13 && dest->kind != 16))
11131 return 1;
11132 else if(dest->kind == 7 && source->kind == 6)
11133 return 1;
11134 else if(dest->kind == 2 && (source->kind == 1 || source->kind == 24))
11135 return 1;
11136 else if(dest->kind == 3 && (source->kind == 2 || source->kind == 1 || source->kind == 24 || source->kind == 23))
11137 return 1;
11138 else if(dest->kind == 4 && (source->kind == 2 || source->kind == 1 || source->kind == 24 || source->kind == 3 || source->kind == 22 || source->kind == 23))
11139 return 1;
11140 else if(dest->kind == 22 && (source->kind == 2 || source->kind == 1 || source->kind == 24 || source->kind == 3 || source->kind == 23 || source->kind == 4))
11141 return 1;
11142 else if(dest->kind == 23 && (source->kind == 2 || source->kind == 1 || source->kind == 24 || source->kind == 3 || source->kind == 4 || source->kind == 22))
11143 return 1;
11144 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))
11145 return 1;
11146 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))
11147 return 1;
11148 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)))
11149 {
11150 struct Type * paramSource, * paramDest;
11151
11152 if(dest->kind == 16)
11153 owningClassDest = dest->__anon1.__anon3.methodClass ? dest->__anon1.__anon3.methodClass : dest->__anon1.__anon3.method->_class;
11154 if(source->kind == 16)
11155 owningClassSource = source->__anon1.__anon3.methodClass ? source->__anon1.__anon3.methodClass : source->__anon1.__anon3.method->_class;
11156 if(dest->kind == 13 && dest->__anon1.type->kind == 11)
11157 dest = dest->__anon1.type;
11158 if(source->kind == 13 && source->__anon1.type->kind == 11)
11159 source = source->__anon1.type;
11160 if(dest->kind == 16)
11161 dest = dest->__anon1.__anon3.method->dataType;
11162 if(source->kind == 16)
11163 source = source->__anon1.__anon3.method->dataType;
11164 paramSource = source->__anon1.__anon2.params.first;
11165 if(paramSource && paramSource->kind == 0)
11166 paramSource = (((void *)0));
11167 paramDest = dest->__anon1.__anon2.params.first;
11168 if(paramDest && paramDest->kind == 0)
11169 paramDest = (((void *)0));
11170 if((dest->__anon1.__anon2.staticMethod || (!dest->__anon1.__anon2.thisClass && !owningClassDest)) && !(source->__anon1.__anon2.staticMethod || (!source->__anon1.__anon2.thisClass && !owningClassSource)))
11171 {
11172 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))))
11173 {
11174 if(paramDest && paramDest->kind == 8)
11175 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "method class must be derived from %s\n", (((void *)0))), paramDest->__anon1._class->string);
11176 else
11177 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "method class should not take an object\n", (((void *)0))));
11178 return 0;
11179 }
11180 paramDest = paramDest->next;
11181 }
11182 else if(!dest->__anon1.__anon2.staticMethod && (dest->__anon1.__anon2.thisClass || owningClassDest))
11183 {
11184 if((source->__anon1.__anon2.staticMethod || (!source->__anon1.__anon2.thisClass && !owningClassSource)))
11185 {
11186 if(dest->__anon1.__anon2.thisClass)
11187 {
11188 if(!paramSource || paramSource->kind != 8 || !__ecereNameSpace__ecere__com__eClass_IsDerived(paramSource->__anon1._class->__anon1.registered, dest->__anon1.__anon2.thisClass->__anon1.registered))
11189 {
11190 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "method class must be derived from %s\n", (((void *)0))), dest->__anon1.__anon2.thisClass->string);
11191 return 0;
11192 }
11193 }
11194 else
11195 {
11196 if(!paramSource || paramSource->kind != 8 || (owningClassDest && !__ecereNameSpace__ecere__com__eClass_IsDerived(paramSource->__anon1._class->__anon1.registered, owningClassDest)))
11197 {
11198 if(owningClassDest)
11199 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "%s expected to be derived from method class\n", (((void *)0))), owningClassDest->fullName);
11200 else
11201 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "overriding class expected to be derived from method class\n", (((void *)0))));
11202 return 0;
11203 }
11204 }
11205 paramSource = paramSource->next;
11206 }
11207 else
11208 {
11209 if(dest->__anon1.__anon2.thisClass)
11210 {
11211 if(!__ecereNameSpace__ecere__com__eClass_IsDerived(source->__anon1.__anon2.thisClass ? source->__anon1.__anon2.thisClass->__anon1.registered : owningClassSource, dest->__anon1.__anon2.thisClass->__anon1.registered))
11212 {
11213 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "method class must be derived from %s\n", (((void *)0))), dest->__anon1.__anon2.thisClass->string);
11214 return 0;
11215 }
11216 }
11217 else
11218 {
11219 if(source->__anon1.__anon2.thisClass && source->__anon1.__anon2.thisClass->__anon1.registered && owningClassDest && !__ecereNameSpace__ecere__com__eClass_IsDerived(source->__anon1.__anon2.thisClass->__anon1.registered, owningClassDest))
11220 {
11221 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "%s expected to be derived from method class\n", (((void *)0))), source->__anon1.__anon2.thisClass->__anon1.registered->fullName);
11222 return 0;
11223 }
11224 }
11225 }
11226 }
11227 if(!MatchTypes(source->__anon1.__anon2.returnType, dest->__anon1.__anon2.returnType, (((void *)0)), (((void *)0)), (((void *)0)), 1, 1, 0, 0, warnConst))
11228 {
11229 Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "incompatible return type for function\n", (((void *)0))));
11230 return 0;
11231 }
11232 else
11233 CheckConstCompatibility(dest->__anon1.__anon2.returnType, source->__anon1.__anon2.returnType, 1);
11234 for(; paramDest; paramDest = paramDest->next)
11235 {
11236 if(!paramSource)
11237 {
11238 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "not enough parameters\n", (((void *)0))));
11239 return 0;
11240 }
11241 {
11242 struct Type * paramDestType = paramDest;
11243 struct Type * paramSourceType = paramSource;
11244 struct Type * type = paramDestType;
11245
11246 if(paramDest->kind == 20 && paramDest->__anon1.templateParameter->type == 0 && owningClassSource && paramSource->kind != 20)
11247 {
11248 int id = 0;
11249 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * curParam = (((void *)0));
11250 struct __ecereNameSpace__ecere__com__Class * sClass;
11251
11252 for(sClass = owningClassSource; sClass; sClass = sClass->base)
11253 {
11254 id = 0;
11255 if(sClass->templateClass)
11256 sClass = sClass->templateClass;
11257 for(curParam = sClass->templateParams.first; curParam; curParam = curParam->next)
11258 {
11259 if(curParam->type == 0 && !strcmp(type->__anon1.templateParameter->identifier->string, curParam->name))
11260 {
11261 for(sClass = sClass->base; sClass; sClass = sClass->base)
11262 {
11263 if(sClass->templateClass)
11264 sClass = sClass->templateClass;
11265 id += sClass->templateParams.count;
11266 }
11267 break;
11268 }
11269 id++;
11270 }
11271 if(curParam)
11272 break;
11273 }
11274 if(curParam)
11275 {
11276 struct __ecereNameSpace__ecere__com__ClassTemplateArgument arg = owningClassSource->templateArgs[id];
11277
11278 paramDestType = type = ProcessTypeString(arg.__anon1.__anon1.dataTypeString, 0);
11279 }
11280 }
11281 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)))
11282 {
11283 char type[1024];
11284
11285 type[0] = 0;
11286 PrintType(paramDest, type, 0, 1);
11287 Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "incompatible parameter %s (expected %s)\n", (((void *)0))), paramSource->name, type);
11288 if(paramDestType != paramDest)
11289 FreeType(paramDestType);
11290 return 0;
11291 }
11292 if(paramDestType != paramDest)
11293 FreeType(paramDestType);
11294 }
11295 paramSource = paramSource->next;
11296 }
11297 if(paramSource)
11298 {
11299 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "too many parameters\n", (((void *)0))));
11300 return 0;
11301 }
11302 return 1;
11303 }
11304 else if((dest->kind == 11 || (dest->kind == 13 && dest->__anon1.type->kind == 11) || dest->kind == 16) && (source->kind == 13 && source->__anon1.type->kind == 0))
11305 {
11306 return 1;
11307 }
11308 else if((dest->kind == 13 || dest->kind == 12) && (source->kind == 12 || source->kind == 13))
11309 {
11310 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))
11311 {
11312 ComputeTypeSize(source->__anon1.type);
11313 ComputeTypeSize(dest->__anon1.type);
11314 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))
11315 return 1;
11316 }
11317 }
11318 }
11319 return 0;
11320 }
11321
11322 void ComputeInstantiation(struct Expression * exp)
11323 {
11324 struct Instantiation * inst = exp->__anon1.instance;
11325 struct MembersInit * members;
11326 struct Symbol * classSym = inst->_class ? inst->_class->__anon1.__anon1.symbol : (((void *)0));
11327 struct __ecereNameSpace__ecere__com__Class * _class = classSym ? classSym->__anon1.registered : (((void *)0));
11328 struct __ecereNameSpace__ecere__com__DataMember * curMember = (((void *)0));
11329 struct __ecereNameSpace__ecere__com__Class * curClass = (((void *)0));
11330 struct __ecereNameSpace__ecere__com__DataMember * subMemberStack[256];
11331 int subMemberStackPos = 0;
11332 uint64 bits = 0;
11333
11334 if(_class && (_class->type == 1 || _class->type == 0 || _class->type == 5))
11335 {
11336 if(inst->data)
11337 return ;
11338 if(_class->type == 0 || _class->type == 5)
11339 {
11340 inst->data = (unsigned char *)__ecereNameSpace__ecere__com__eInstance_New(_class);
11341 if(_class->type == 0)
11342 ((struct __ecereNameSpace__ecere__com__Instance *)(char *)((struct __ecereNameSpace__ecere__com__Instance *)inst->data))->_refCount++;
11343 }
11344 else
11345 inst->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize));
11346 }
11347 if(inst->members)
11348 {
11349 for(members = (*inst->members).first; members; members = members->next)
11350 {
11351 switch(members->type)
11352 {
11353 case 0:
11354 {
11355 if(members->__anon1.dataMembers)
11356 {
11357 struct MemberInit * member;
11358
11359 for(member = (*members->__anon1.dataMembers).first; member; member = member->next)
11360 {
11361 struct Identifier * ident = member->identifiers ? (*member->identifiers).first : (((void *)0));
11362 unsigned int found = 0;
11363 struct __ecereNameSpace__ecere__com__Property * prop = (((void *)0));
11364 struct __ecereNameSpace__ecere__com__DataMember * dataMember = (((void *)0));
11365 unsigned int dataMemberOffset;
11366
11367 if(!ident)
11368 {
11369 __ecereNameSpace__ecere__com__eClass_FindNextMember(_class, &curClass, &curMember, subMemberStack, &subMemberStackPos);
11370 if(curMember)
11371 {
11372 if(curMember->isProperty)
11373 prop = (struct __ecereNameSpace__ecere__com__Property *)curMember;
11374 else
11375 {
11376 dataMember = curMember;
11377 __ecereNameSpace__ecere__com__eClass_FindDataMemberAndOffset(_class, dataMember->name, &dataMemberOffset, privateModule, (((void *)0)), (((void *)0)));
11378 if(_class->type == 0)
11379 dataMemberOffset += _class->base->structSize;
11380 }
11381 found = 1;
11382 }
11383 }
11384 else
11385 {
11386 prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, ident->string, privateModule);
11387 if(prop)
11388 {
11389 found = 1;
11390 if(prop->memberAccess == 1)
11391 {
11392 curMember = (struct __ecereNameSpace__ecere__com__DataMember *)prop;
11393 curClass = prop->_class;
11394 }
11395 }
11396 else
11397 {
11398 struct __ecereNameSpace__ecere__com__DataMember * _subMemberStack[256];
11399 int _subMemberStackPos = 0;
11400
11401 dataMember = __ecereNameSpace__ecere__com__eClass_FindDataMemberAndOffset(_class, ident->string, &dataMemberOffset, privateModule, _subMemberStack, &_subMemberStackPos);
11402 if(dataMember)
11403 {
11404 found = 1;
11405 if(dataMember->memberAccess == 1)
11406 {
11407 curMember = dataMember;
11408 curClass = dataMember->_class;
11409 memcpy(subMemberStack, _subMemberStack, sizeof(struct __ecereNameSpace__ecere__com__DataMember *) * _subMemberStackPos);
11410 subMemberStackPos = _subMemberStackPos;
11411 }
11412 }
11413 }
11414 }
11415 if(found && member->initializer && member->initializer->type == 0)
11416 {
11417 struct Expression * value = member->initializer->__anon1.exp;
11418 struct Type * type = (((void *)0));
11419 unsigned int deepMember = 0;
11420
11421 if(prop)
11422 {
11423 type = prop->dataType;
11424 }
11425 else if(dataMember)
11426 {
11427 if(!dataMember->dataType)
11428 dataMember->dataType = ProcessTypeString(dataMember->dataTypeString, 0);
11429 type = dataMember->dataType;
11430 }
11431 if(ident && ident->next)
11432 {
11433 deepMember = 1;
11434 for(ident = ident->next; ident && type; ident = ident->next)
11435 {
11436 if(type->kind == 8)
11437 {
11438 prop = __ecereNameSpace__ecere__com__eClass_FindProperty(type->__anon1._class->__anon1.registered, ident->string, privateModule);
11439 if(prop)
11440 type = prop->dataType;
11441 else
11442 {
11443 dataMember = __ecereNameSpace__ecere__com__eClass_FindDataMemberAndOffset(type->__anon1._class->__anon1.registered, ident->string, &dataMemberOffset, privateModule, (((void *)0)), (((void *)0)));
11444 if(dataMember)
11445 type = dataMember->dataType;
11446 }
11447 }
11448 else if(type->kind == 9 || type->kind == 10)
11449 {
11450 struct Type * memberType;
11451
11452 for(memberType = type->__anon1.__anon1.members.first; memberType; memberType = memberType->next)
11453 {
11454 if(!strcmp(memberType->name, ident->string))
11455 {
11456 type = memberType;
11457 break;
11458 }
11459 }
11460 }
11461 }
11462 }
11463 if(value)
11464 {
11465 FreeType(value->destType);
11466 value->destType = type;
11467 if(type)
11468 type->refCount++;
11469 ComputeExpression(value);
11470 }
11471 if(!deepMember && type && value && (_class->type == 1 || _class->type == 0 || _class->type == 5))
11472 {
11473 if(type->kind == 8)
11474 {
11475 struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class->__anon1.registered;
11476
11477 if(_class && (_class->type == 2 || _class->type == 3 || _class->type == 4))
11478 {
11479 if(!_class->dataType)
11480 _class->dataType = ProcessTypeString(_class->dataTypeString, 0);
11481 type = _class->dataType;
11482 }
11483 }
11484 if(dataMember)
11485 {
11486 void * ptr = inst->data + dataMemberOffset;
11487
11488 if(value->type == 2)
11489 {
11490 switch(type->kind)
11491 {
11492 case 3:
11493 {
11494 GetInt(value, (int *)ptr);
11495 break;
11496 }
11497 case 4:
11498 {
11499 GetInt64(value, (long long *)ptr);
11500 break;
11501 }
11502 case 22:
11503 {
11504 GetIntPtr(value, (intptr_t *)ptr);
11505 break;
11506 }
11507 case 23:
11508 {
11509 GetIntSize(value, (ssize_t *)ptr);
11510 break;
11511 }
11512 case 6:
11513 {
11514 GetFloat(value, (float *)ptr);
11515 break;
11516 }
11517 case 7:
11518 {
11519 GetDouble(value, (double *)ptr);
11520 break;
11521 }
11522 }
11523 }
11524 else if(value->type == 1)
11525 {
11526 if(type->kind == 8)
11527 {
11528 struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class->__anon1.registered;
11529
11530 if(_class->type == 1)
11531 {
11532 ComputeTypeSize(type);
11533 if(value->__anon1.instance->data)
11534 memcpy(ptr, value->__anon1.instance->data, type->size);
11535 }
11536 }
11537 }
11538 }
11539 else if(prop && prop->Set != (void *)(intptr_t)1)
11540 {
11541 if(value->type == 1 && value->__anon1.instance->data)
11542 {
11543 if(type->kind == 8)
11544 {
11545 struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class->__anon1.registered;
11546
11547 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)))
11548 {
11549 void (* Set)(void *, void *) = (void *)prop->Set;
11550
11551 Set(inst->data, value->__anon1.instance->data);
11552 PopulateInstance(inst);
11553 }
11554 }
11555 }
11556 else if(value->type == 2)
11557 {
11558 switch(type->kind)
11559 {
11560 case 7:
11561 {
11562 void (* Set)(void *, double) = (void *)prop->Set;
11563
11564 Set(inst->data, strtod(value->__anon1.__anon1.constant, (((void *)0))));
11565 break;
11566 }
11567 case 6:
11568 {
11569 void (* Set)(void *, float) = (void *)prop->Set;
11570
11571 Set(inst->data, (float)(strtod(value->__anon1.__anon1.constant, (((void *)0)))));
11572 break;
11573 }
11574 case 3:
11575 {
11576 void (* Set)(void *, int) = (void *)prop->Set;
11577
11578 Set(inst->data, strtol(value->__anon1.__anon1.constant, (((void *)0)), 0));
11579 break;
11580 }
11581 case 4:
11582 {
11583 void (* Set)(void *, long long) = (void *)prop->Set;
11584
11585 Set(inst->data, __ecereNameSpace__ecere__com___strtoi64(value->__anon1.__anon1.constant, (((void *)0)), 0));
11586 break;
11587 }
11588 case 22:
11589 {
11590 void (* Set)(void *, intptr_t) = (void *)prop->Set;
11591
11592 Set(inst->data, (intptr_t)__ecereNameSpace__ecere__com___strtoi64(value->__anon1.__anon1.constant, (((void *)0)), 0));
11593 break;
11594 }
11595 case 23:
11596 {
11597 void (* Set)(void *, ssize_t) = (void *)prop->Set;
11598
11599 Set(inst->data, (ssize_t)__ecereNameSpace__ecere__com___strtoi64(value->__anon1.__anon1.constant, (((void *)0)), 0));
11600 break;
11601 }
11602 }
11603 }
11604 else if(value->type == 3)
11605 {
11606 char temp[1024];
11607
11608 ReadString(temp, value->__anon1.__anon2.string);
11609 ((void (*)(void *, void *))(void *)prop->Set)(inst->data, temp);
11610 }
11611 }
11612 }
11613 else if(!deepMember && type && _class->type == 3)
11614 {
11615 if(prop)
11616 {
11617 if(value->type == 2)
11618 {
11619 if(type->kind == 8)
11620 {
11621 struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class->__anon1.registered;
11622
11623 if(_class->type == 3)
11624 {
11625 if(!_class->dataType)
11626 _class->dataType = ProcessTypeString(_class->dataTypeString, 0);
11627 type = _class->dataType;
11628 }
11629 }
11630 switch(type->kind)
11631 {
11632 case 6:
11633 {
11634 float fValue;
11635 float (* Set)(float) = (void *)prop->Set;
11636
11637 GetFloat(member->initializer->__anon1.exp, &fValue);
11638 exp->__anon1.__anon1.constant = PrintFloat(Set(fValue));
11639 exp->type = 2;
11640 break;
11641 }
11642 case 7:
11643 {
11644 double dValue;
11645 double (* Set)(double) = (void *)prop->Set;
11646
11647 GetDouble(member->initializer->__anon1.exp, &dValue);
11648 exp->__anon1.__anon1.constant = PrintDouble(Set(dValue));
11649 exp->type = 2;
11650 break;
11651 }
11652 }
11653 }
11654 }
11655 }
11656 else if(!deepMember && type && _class->type == 2)
11657 {
11658 if(prop)
11659 {
11660 if(value->type == 1 && value->__anon1.instance->data)
11661 {
11662 unsigned int (* Set)(void *) = (void *)prop->Set;
11663
11664 bits = Set(value->__anon1.instance->data);
11665 }
11666 else if(value->type == 2)
11667 {
11668 }
11669 }
11670 else if(dataMember)
11671 {
11672 struct __ecereNameSpace__ecere__com__BitMember * bitMember = (struct __ecereNameSpace__ecere__com__BitMember *)dataMember;
11673 struct Type * type;
11674 uint64 part = 0;
11675
11676 bits = (bits & ~bitMember->mask);
11677 if(!bitMember->dataType)
11678 bitMember->dataType = ProcessTypeString(bitMember->dataTypeString, 0);
11679 type = bitMember->dataType;
11680 if(type->kind == 8 && type->__anon1._class && type->__anon1._class->__anon1.registered)
11681 {
11682 if(!type->__anon1._class->__anon1.registered->dataType)
11683 type->__anon1._class->__anon1.registered->dataType = ProcessTypeString(type->__anon1._class->__anon1.registered->dataTypeString, 0);
11684 type = type->__anon1._class->__anon1.registered->dataType;
11685 }
11686 switch(type->kind)
11687 {
11688 case 24:
11689 case 1:
11690 {
11691 unsigned char v;
11692
11693 type->isSigned ? GetChar(value, (char *)&v) : GetUChar(value, &v);
11694 part = (uint64)v;
11695 break;
11696 }
11697 case 2:
11698 {
11699 unsigned short v;
11700
11701 type->isSigned ? GetShort(value, (short *)&v) : GetUShort(value, &v);
11702 part = (uint64)v;
11703 break;
11704 }
11705 case 3:
11706 case 5:
11707 {
11708 unsigned int v;
11709
11710 type->isSigned ? GetInt(value, (int *)&v) : GetUInt(value, &v);
11711 part = (uint64)v;
11712 break;
11713 }
11714 case 4:
11715 {
11716 uint64 v;
11717
11718 type->isSigned ? GetInt64(value, (long long *)&v) : GetUInt64(value, &v);
11719 part = v;
11720 break;
11721 }
11722 case 22:
11723 {
11724 uintptr_t v;
11725
11726 type->isSigned ? GetIntPtr(value, (intptr_t *)&v) : GetUIntPtr(value, &v);
11727 part = (uint64)v;
11728 break;
11729 }
11730 case 23:
11731 {
11732 size_t v;
11733
11734 type->isSigned ? GetIntSize(value, (ssize_t *)&v) : GetUIntSize(value, &v);
11735 part = (uint64)v;
11736 break;
11737 }
11738 }
11739 bits |= part << bitMember->pos;
11740 }
11741 }
11742 }
11743 else
11744 {
11745 if(_class && _class->type == 3)
11746 {
11747 ComputeExpression(member->initializer->__anon1.exp);
11748 exp->__anon1.__anon1.constant = member->initializer->__anon1.exp->__anon1.__anon1.constant;
11749 exp->type = 2;
11750 member->initializer->__anon1.exp->__anon1.__anon1.constant = (((void *)0));
11751 }
11752 }
11753 }
11754 }
11755 break;
11756 }
11757 }
11758 }
11759 }
11760 if(_class && _class->type == 2)
11761 {
11762 exp->__anon1.__anon1.constant = PrintHexUInt(bits);
11763 exp->type = 2;
11764 }
11765 if(exp->type != 1)
11766 {
11767 FreeInstance(inst);
11768 }
11769 }
11770
11771 void CallOperator(struct Expression * exp, struct Expression * exp1, struct Expression * exp2, struct Operand * op1, struct Operand * op2)
11772 {
11773 if(exp->__anon1.op.op == SIZEOF)
11774 {
11775 FreeExpContents(exp);
11776 exp->type = 2;
11777 exp->__anon1.__anon1.constant = PrintUInt(ComputeTypeSize(op1->type));
11778 }
11779 else
11780 {
11781 if(!exp->__anon1.op.exp1)
11782 {
11783 switch(exp->__anon1.op.op)
11784 {
11785 case '+':
11786 {
11787 struct Expression * exp2 = exp->__anon1.op.exp2;
11788
11789 exp->__anon1.op.exp2 = (((void *)0));
11790 FreeExpContents(exp);
11791 FreeType(exp->expType);
11792 FreeType(exp->destType);
11793 *exp = *exp2;
11794 ((exp2 ? __extension__ ({
11795 void * __ecerePtrToDelete = (exp2);
11796
11797 __ecereClass_Expression->Destructor ? __ecereClass_Expression->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete);
11798 }) : 0), exp2 = 0);
11799 break;
11800 }
11801 case '-':
11802 if(op1->ops.Neg)
11803 {
11804 FreeExpContents(exp);
11805 op1->ops.Neg(exp, op1);
11806 }
11807 break;
11808 case '~':
11809 if(op1->ops.BitNot)
11810 {
11811 FreeExpContents(exp);
11812 op1->ops.BitNot(exp, op1);
11813 }
11814 break;
11815 case '!':
11816 if(op1->ops.Not)
11817 {
11818 FreeExpContents(exp);
11819 op1->ops.Not(exp, op1);
11820 }
11821 break;
11822 }
11823 }
11824 else
11825 {
11826 if(op1 && op2 && op1->type && op2->type && op1->kind != op2->kind)
11827 {
11828 if(Promote(op2, op1->kind, op1->type->isSigned))
11829 op2->kind = op1->kind, op2->ops = op1->ops;
11830 else if(Promote(op1, op2->kind, op2->type->isSigned))
11831 op1->kind = op2->kind, op1->ops = op2->ops;
11832 }
11833 switch(exp->__anon1.op.op)
11834 {
11835 case '+':
11836 if(op1->ops.Add)
11837 {
11838 FreeExpContents(exp);
11839 op1->ops.Add(exp, op1, op2);
11840 }
11841 break;
11842 case '-':
11843 if(op1->ops.Sub)
11844 {
11845 FreeExpContents(exp);
11846 op1->ops.Sub(exp, op1, op2);
11847 }
11848 break;
11849 case '*':
11850 if(op1->ops.Mul)
11851 {
11852 FreeExpContents(exp);
11853 op1->ops.Mul(exp, op1, op2);
11854 }
11855 break;
11856 case '/':
11857 if(op1->ops.Div)
11858 {
11859 FreeExpContents(exp);
11860 op1->ops.Div(exp, op1, op2);
11861 }
11862 break;
11863 case '%':
11864 if(op1->ops.Mod)
11865 {
11866 FreeExpContents(exp);
11867 op1->ops.Mod(exp, op1, op2);
11868 }
11869 break;
11870 case '&':
11871 if(exp->__anon1.op.exp2)
11872 {
11873 if(op1->ops.BitAnd)
11874 {
11875 FreeExpContents(exp);
11876 op1->ops.BitAnd(exp, op1, op2);
11877 }
11878 }
11879 break;
11880 case '|':
11881 if(op1->ops.BitOr)
11882 {
11883 FreeExpContents(exp);
11884 op1->ops.BitOr(exp, op1, op2);
11885 }
11886 break;
11887 case '^':
11888 if(op1->ops.BitXor)
11889 {
11890 FreeExpContents(exp);
11891 op1->ops.BitXor(exp, op1, op2);
11892 }
11893 break;
11894 case LEFT_OP:
11895 if(op1->ops.LShift)
11896 {
11897 FreeExpContents(exp);
11898 op1->ops.LShift(exp, op1, op2);
11899 }
11900 break;
11901 case RIGHT_OP:
11902 if(op1->ops.RShift)
11903 {
11904 FreeExpContents(exp);
11905 op1->ops.RShift(exp, op1, op2);
11906 }
11907 break;
11908 case EQ_OP:
11909 if(op1->ops.Equ)
11910 {
11911 FreeExpContents(exp);
11912 op1->ops.Equ(exp, op1, op2);
11913 }
11914 break;
11915 case NE_OP:
11916 if(op1->ops.Nqu)
11917 {
11918 FreeExpContents(exp);
11919 op1->ops.Nqu(exp, op1, op2);
11920 }
11921 break;
11922 case AND_OP:
11923 if(op1->ops.And)
11924 {
11925 FreeExpContents(exp);
11926 op1->ops.And(exp, op1, op2);
11927 }
11928 break;
11929 case OR_OP:
11930 if(op1->ops.Or)
11931 {
11932 FreeExpContents(exp);
11933 op1->ops.Or(exp, op1, op2);
11934 }
11935 break;
11936 case '>':
11937 if(op1->ops.Grt)
11938 {
11939 FreeExpContents(exp);
11940 op1->ops.Grt(exp, op1, op2);
11941 }
11942 break;
11943 case '<':
11944 if(op1->ops.Sma)
11945 {
11946 FreeExpContents(exp);
11947 op1->ops.Sma(exp, op1, op2);
11948 }
11949 break;
11950 case GE_OP:
11951 if(op1->ops.GrtEqu)
11952 {
11953 FreeExpContents(exp);
11954 op1->ops.GrtEqu(exp, op1, op2);
11955 }
11956 break;
11957 case LE_OP:
11958 if(op1->ops.SmaEqu)
11959 {
11960 FreeExpContents(exp);
11961 op1->ops.SmaEqu(exp, op1, op2);
11962 }
11963 break;
11964 }
11965 }
11966 }
11967 }
11968
11969 void ApplyAnyObjectLogic(struct Expression * e)
11970 {
11971 struct Type * destType = e->destType;
11972
11973 if(destType && (destType->classObjectType == 3))
11974 {
11975 if(e && e->expType)
11976 {
11977 struct Type * type = e->expType;
11978 struct __ecereNameSpace__ecere__com__Class * _class = (((void *)0));
11979
11980 if(type->kind == 8 && type->__anon1._class && type->__anon1._class->__anon1.registered)
11981 {
11982 _class = type->__anon1._class->__anon1.registered;
11983 }
11984 else if(type->kind == 19)
11985 {
11986 _class = FindClass("ecere::com::Class")->__anon1.registered;
11987 }
11988 else
11989 {
11990 char string[1024] = "";
11991 struct Symbol * classSym;
11992
11993 PrintTypeNoConst(type, string, 0, 1);
11994 classSym = FindClass(string);
11995 if(classSym)
11996 _class = classSym->__anon1.registered;
11997 }
11998 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)))
11999 {
12000 if(!_class || strcmp(_class->fullName, "char *"))
12001 {
12002 struct Expression * checkedExp = e, * newExp;
12003
12004 while(((checkedExp->type == 5 || checkedExp->type == 32 || checkedExp->type == 23) && checkedExp->__anon1.list) || checkedExp->type == 11)
12005 {
12006 if(checkedExp->type == 5 || checkedExp->type == 32 || checkedExp->type == 23)
12007 {
12008 if(checkedExp->type == 23)
12009 {
12010 checkedExp = (*((struct Statement *)(*checkedExp->__anon1.compound->__anon1.compound.statements).last)->__anon1.expressions).last;
12011 }
12012 else
12013 checkedExp = (*checkedExp->__anon1.list).last;
12014 }
12015 else if(checkedExp->type == 11)
12016 checkedExp = checkedExp->__anon1.cast.exp;
12017 }
12018 if(checkedExp && checkedExp->type == 4 && checkedExp->__anon1.op.op == '*' && !checkedExp->__anon1.op.exp1)
12019 {
12020 newExp = checkedExp->__anon1.op.exp2;
12021 checkedExp->__anon1.op.exp2 = (((void *)0));
12022 FreeExpContents(checkedExp);
12023 if(e->expType && e->expType->passAsTemplate)
12024 {
12025 char size[100];
12026
12027 ComputeTypeSize(e->expType);
12028 sprintf(size, "%d", e->expType->size);
12029 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))))));
12030 }
12031 ReplaceExpContents(checkedExp, newExp);
12032 e->byReference = 1;
12033 }
12034 else if(!e->byReference || (_class && _class->type == 5))
12035 {
12036 struct Expression * checkedExp;
12037
12038 {
12039 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;
12040
12041 if(_class && _class->type != 5 && _class->type != 0 && _class->type != 1 && !hasAddress)
12042 {
12043 struct Context * context = PushContext();
12044 struct Declarator * decl;
12045 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
12046 char typeString[1024];
12047 struct Expression * newExp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression);
12048
12049 typeString[0] = '\0';
12050 *newExp = *e;
12051 newExp->prev = (((void *)0));
12052 newExp->next = (((void *)0));
12053 newExp->expType = (((void *)0));
12054 PrintTypeNoConst(e->expType, typeString, 0, 1);
12055 decl = SpecDeclFromString(typeString, specs, (((void *)0)));
12056 newExp->destType = ProcessType(specs, decl);
12057 curContext = context;
12058 if(curCompound)
12059 {
12060 char name[100];
12061 struct __ecereNameSpace__ecere__sys__OldList * stmts = MkList();
12062
12063 e->type = 23;
12064 sprintf(name, "__internalValue%03X", internalValueCounter++);
12065 if(!curCompound->__anon1.compound.declarations)
12066 curCompound->__anon1.compound.declarations = MkList();
12067 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*curCompound->__anon1.compound.declarations), (((void *)0)), MkDeclaration(specs, MkListOne(MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier(name)), (((void *)0))))));
12068 ListAdd(stmts, MkExpressionStmt(MkListOne(MkExpOp(MkExpIdentifier(MkIdentifier(name)), '=', newExp))));
12069 ListAdd(stmts, MkExpressionStmt(MkListOne(MkExpIdentifier(MkIdentifier(name)))));
12070 e->__anon1.compound = MkCompoundStmt((((void *)0)), stmts);
12071 }
12072 else
12073 printf("libec: compiler error, curCompound is null in ApplyAnyObjectLogic\n");
12074 {
12075 struct Type * type = e->destType;
12076
12077 e->destType = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
12078 CopyTypeInto(e->destType, type);
12079 e->destType->refCount = 1;
12080 e->destType->classObjectType = 0;
12081 FreeType(type);
12082 }
12083 e->__anon1.compound->__anon1.compound.context = context;
12084 PopContext(context);
12085 curContext = context->parent;
12086 }
12087 }
12088 checkedExp = e;
12089 while(((checkedExp->type == 5 || checkedExp->type == 32 || checkedExp->type == 23) && checkedExp->__anon1.list) || checkedExp->type == 11)
12090 {
12091 if(checkedExp->type == 5 || checkedExp->type == 32 || checkedExp->type == 23)
12092 {
12093 if(checkedExp->type == 23)
12094 {
12095 checkedExp = (*((struct Statement *)(*checkedExp->__anon1.compound->__anon1.compound.statements).last)->__anon1.expressions).last;
12096 }
12097 else
12098 checkedExp = (*checkedExp->__anon1.list).last;
12099 }
12100 else if(checkedExp->type == 11)
12101 checkedExp = checkedExp->__anon1.cast.exp;
12102 }
12103 {
12104 struct Expression * operand = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression);
12105
12106 *operand = *checkedExp;
12107 __ecereMethod_Expression_Clear(checkedExp);
12108 checkedExp->destType = ProcessTypeString("void *", 0);
12109 checkedExp->expType = checkedExp->destType;
12110 checkedExp->destType->refCount++;
12111 checkedExp->type = 4;
12112 checkedExp->__anon1.op.op = '&';
12113 checkedExp->__anon1.op.exp1 = (((void *)0));
12114 checkedExp->__anon1.op.exp2 = operand;
12115 }
12116 }
12117 }
12118 }
12119 }
12120 }
12121 {
12122 }
12123 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))))
12124 {
12125 if(e->expType->classObjectType && destType && destType->classObjectType)
12126 {
12127 return ;
12128 }
12129 else
12130 {
12131 struct Expression * thisExp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression);
12132
12133 *thisExp = *e;
12134 thisExp->prev = (((void *)0));
12135 thisExp->next = (((void *)0));
12136 __ecereMethod_Expression_Clear(e);
12137 e->type = 5;
12138 e->__anon1.list = MkListOne(MkExpOp((((void *)0)), '*', thisExp->type == 0 ? thisExp : MkExpBrackets(MkListOne(thisExp))));
12139 if(thisExp->expType->kind == 8 && thisExp->expType->__anon1._class && thisExp->expType->__anon1._class->__anon1.registered && thisExp->expType->__anon1._class->__anon1.registered->type == 5)
12140 ((struct Expression *)(*e->__anon1.list).first)->byReference = 1;
12141 {
12142 e->expType = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
12143 CopyTypeInto(e->expType, thisExp->expType);
12144 e->expType->byReference = 0;
12145 e->expType->refCount = 1;
12146 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))
12147 {
12148 e->expType->classObjectType = 0;
12149 }
12150 }
12151 }
12152 }
12153 else if(destType && e->expType && (e->expType->classObjectType == 3 || e->expType->classObjectType == 2) && !destType->classObjectType && destType->kind != 0)
12154 {
12155 if(destType->kind == 14)
12156 {
12157 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Unspecified type\n", (((void *)0))));
12158 }
12159 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))
12160 {
12161 unsigned int byReference = e->expType->byReference;
12162 struct Expression * thisExp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression);
12163 struct Declarator * decl;
12164 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
12165 char typeString[1024];
12166 struct Type * type;
12167 int backupClassObjectType;
12168 unsigned int backupByReference;
12169
12170 if(e->expType->kind == 8 && e->expType->__anon1._class && e->expType->__anon1._class->__anon1.registered && strcmp(e->expType->__anon1._class->__anon1.registered->name, "class"))
12171 type = e->expType;
12172 else
12173 type = destType;
12174 backupClassObjectType = type->classObjectType;
12175 backupByReference = type->byReference;
12176 type->classObjectType = 0;
12177 type->byReference = 0;
12178 typeString[0] = '\0';
12179 PrintType(type, typeString, 0, 1);
12180 decl = SpecDeclFromString(typeString, specs, (((void *)0)));
12181 type->classObjectType = backupClassObjectType;
12182 type->byReference = backupByReference;
12183 *thisExp = *e;
12184 thisExp->prev = (((void *)0));
12185 thisExp->next = (((void *)0));
12186 __ecereMethod_Expression_Clear(e);
12187 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)))
12188 {
12189 unsigned int passAsTemplate = thisExp->destType->passAsTemplate;
12190 struct Type * t;
12191
12192 destType->refCount++;
12193 e->type = 4;
12194 e->__anon1.op.op = '*';
12195 e->__anon1.op.exp1 = (((void *)0));
12196 e->__anon1.op.exp2 = MkExpCast(MkTypeName(specs, MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), decl)), thisExp);
12197 t = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
12198 CopyTypeInto(t, thisExp->destType);
12199 t->passAsTemplate = 0;
12200 FreeType(thisExp->destType);
12201 thisExp->destType = t;
12202 t = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
12203 CopyTypeInto(t, destType);
12204 t->passAsTemplate = passAsTemplate;
12205 FreeType(destType);
12206 destType = t;
12207 destType->refCount = 0;
12208 e->expType = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
12209 CopyTypeInto(e->expType, type);
12210 if(type->passAsTemplate)
12211 {
12212 e->expType->classObjectType = 0;
12213 e->expType->passAsTemplate = 0;
12214 }
12215 e->expType->byReference = 0;
12216 e->expType->refCount = 1;
12217 }
12218 else
12219 {
12220 e->type = 11;
12221 e->__anon1.cast.typeName = MkTypeName(specs, decl);
12222 e->__anon1.cast.exp = thisExp;
12223 e->byReference = 1;
12224 e->expType = type;
12225 type->refCount++;
12226 }
12227 if(e->destType)
12228 FreeType(e->destType);
12229 e->destType = destType;
12230 destType->refCount++;
12231 }
12232 }
12233 }
12234
12235 void ComputeModuleClasses(struct __ecereNameSpace__ecere__com__Instance * module)
12236 {
12237 struct __ecereNameSpace__ecere__com__Class * _class;
12238 struct __ecereNameSpace__ecere__sys__OldLink * subModule;
12239
12240 for(subModule = ((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->modules.first; subModule; subModule = subModule->next)
12241 ComputeModuleClasses(subModule->data);
12242 for(_class = ((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->classes.first; _class; _class = _class->next)
12243 ComputeClassMembers(_class, 0);
12244 }
12245
12246 int ComputeTypeSize(struct Type * type)
12247 {
12248 unsigned int size = type ? type->size : 0;
12249
12250 if(!size && type && !type->computing)
12251 {
12252 type->computing = 1;
12253 switch(type->kind)
12254 {
12255 case 24:
12256 type->alignment = size = sizeof(char);
12257 break;
12258 case 1:
12259 type->alignment = size = sizeof(char);
12260 break;
12261 case 3:
12262 type->alignment = size = sizeof(int);
12263 break;
12264 case 4:
12265 type->alignment = size = sizeof(long long);
12266 break;
12267 case 22:
12268 type->alignment = size = targetBits / 8;
12269 type->pointerAlignment = 1;
12270 break;
12271 case 23:
12272 type->alignment = size = targetBits / 8;
12273 type->pointerAlignment = 1;
12274 break;
12275 case 5:
12276 type->alignment = size = sizeof(long);
12277 break;
12278 case 2:
12279 type->alignment = size = sizeof(short);
12280 break;
12281 case 6:
12282 type->alignment = size = sizeof(float);
12283 break;
12284 case 7:
12285 type->alignment = size = sizeof(double);
12286 break;
12287 case 8:
12288 {
12289 struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class ? type->__anon1._class->__anon1.registered : (((void *)0));
12290
12291 if(_class && _class->type == 1)
12292 {
12293 ComputeClassMembers(_class, 0);
12294 type->alignment = _class->structAlignment;
12295 type->pointerAlignment = (unsigned int)_class->pointerAlignment;
12296 size = _class->structSize;
12297 if(type->alignment && size % type->alignment)
12298 size += type->alignment - (size % type->alignment);
12299 }
12300 else if(_class && (_class->type == 3 || _class->type == 4 || _class->type == 2))
12301 {
12302 if(!_class->dataType)
12303 _class->dataType = ProcessTypeString(_class->dataTypeString, 0);
12304 size = type->alignment = ComputeTypeSize(_class->dataType);
12305 }
12306 else
12307 {
12308 size = type->alignment = targetBits / 8;
12309 type->pointerAlignment = 1;
12310 }
12311 break;
12312 }
12313 case 13:
12314 case 19:
12315 size = type->alignment = targetBits / 8;
12316 type->pointerAlignment = 1;
12317 break;
12318 case 12:
12319 if(type->__anon1.__anon4.arraySizeExp)
12320 {
12321 ProcessExpressionType(type->__anon1.__anon4.arraySizeExp);
12322 ComputeExpression(type->__anon1.__anon4.arraySizeExp);
12323 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)))
12324 {
12325 struct Location oldLoc = yylloc;
12326 char expression[10240];
12327
12328 expression[0] = '\0';
12329 type->__anon1.__anon4.arraySizeExp->expType = (((void *)0));
12330 yylloc = type->__anon1.__anon4.arraySizeExp->loc;
12331 if(inCompiler)
12332 PrintExpression(type->__anon1.__anon4.arraySizeExp, expression);
12333 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Array size not constant int (%s)\n", (((void *)0))), expression);
12334 yylloc = oldLoc;
12335 }
12336 GetInt(type->__anon1.__anon4.arraySizeExp, &type->__anon1.__anon4.arraySize);
12337 }
12338 else if(type->__anon1.__anon4.enumClass)
12339 {
12340 if(type->__anon1.__anon4.enumClass && type->__anon1.__anon4.enumClass->__anon1.registered && type->__anon1.__anon4.enumClass->__anon1.registered->type == 4)
12341 {
12342 type->__anon1.__anon4.arraySize = (int)__ecereNameSpace__ecere__com__eClass_GetProperty(type->__anon1.__anon4.enumClass->__anon1.registered, "enumSize");
12343 }
12344 else
12345 type->__anon1.__anon4.arraySize = 0;
12346 }
12347 else
12348 {
12349 type->__anon1.__anon4.arraySize = 0;
12350 }
12351 size = ComputeTypeSize(type->__anon1.type) * type->__anon1.__anon4.arraySize;
12352 if(type->__anon1.type)
12353 {
12354 type->alignment = type->__anon1.type->alignment;
12355 type->pointerAlignment = type->__anon1.type->pointerAlignment;
12356 }
12357 break;
12358 case 9:
12359 {
12360 if(!type->__anon1.__anon1.members.first && type->__anon1.__anon1.enumName)
12361 {
12362 struct Symbol * symbol = FindStruct(curContext, type->__anon1.__anon1.enumName);
12363
12364 if(symbol && symbol->type)
12365 {
12366 ComputeTypeSize(symbol->type);
12367 size = symbol->type->size;
12368 }
12369 }
12370 else
12371 {
12372 struct Type * member;
12373
12374 for(member = type->__anon1.__anon1.members.first; member; member = member->next)
12375 {
12376 int __simpleStruct0, __simpleStruct1;
12377 unsigned int addSize = ComputeTypeSize(member);
12378
12379 member->offset = size;
12380 if(member->alignment && size % member->alignment)
12381 member->offset += member->alignment - (size % member->alignment);
12382 size = member->offset;
12383 if(member->pointerAlignment && type->size <= 4)
12384 type->pointerAlignment = 1;
12385 else if(!member->pointerAlignment && member->alignment >= 8)
12386 type->pointerAlignment = 0;
12387 type->alignment = (__simpleStruct0 = type->alignment, __simpleStruct1 = member->alignment, (__simpleStruct0 > __simpleStruct1) ? __simpleStruct0 : __simpleStruct1);
12388 size += addSize;
12389 }
12390 if(type->alignment && size % type->alignment)
12391 size += type->alignment - (size % type->alignment);
12392 }
12393 break;
12394 }
12395 case 10:
12396 {
12397 if(!type->__anon1.__anon1.members.first && type->__anon1.__anon1.enumName)
12398 {
12399 struct Symbol * symbol = FindStruct(curContext, type->__anon1.__anon1.enumName);
12400
12401 if(symbol && symbol->type)
12402 {
12403 ComputeTypeSize(symbol->type);
12404 size = symbol->type->size;
12405 type->alignment = symbol->type->alignment;
12406 }
12407 }
12408 else
12409 {
12410 struct Type * member;
12411
12412 for(member = type->__anon1.__anon1.members.first; member; member = member->next)
12413 {
12414 int __simpleStruct0, __simpleStruct1;
12415 unsigned int addSize = ComputeTypeSize(member);
12416
12417 member->offset = size;
12418 if(member->alignment && size % member->alignment)
12419 member->offset += member->alignment - (size % member->alignment);
12420 size = member->offset;
12421 if(member->pointerAlignment && type->size <= 4)
12422 type->pointerAlignment = 1;
12423 else if(!member->pointerAlignment && member->alignment >= 8)
12424 type->pointerAlignment = 0;
12425 type->alignment = (__simpleStruct0 = type->alignment, __simpleStruct1 = member->alignment, (__simpleStruct0 > __simpleStruct1) ? __simpleStruct0 : __simpleStruct1);
12426 size = ((size > addSize) ? size : addSize);
12427 }
12428 if(type->alignment && size % type->alignment)
12429 size += type->alignment - (size % type->alignment);
12430 }
12431 break;
12432 }
12433 case 20:
12434 {
12435 struct TemplateParameter * param = type->__anon1.templateParameter;
12436 struct Type * baseType = ProcessTemplateParameterType(param);
12437
12438 if(baseType)
12439 {
12440 size = ComputeTypeSize(baseType);
12441 type->alignment = baseType->alignment;
12442 type->pointerAlignment = baseType->pointerAlignment;
12443 }
12444 else
12445 type->alignment = size = sizeof(uint64);
12446 break;
12447 }
12448 case 15:
12449 {
12450 type->alignment = size = sizeof(enum
12451 {
12452 test
12453 });
12454 break;
12455 }
12456 case 21:
12457 {
12458 type->alignment = size = targetBits / 8;
12459 type->pointerAlignment = 1;
12460 break;
12461 }
12462 }
12463 type->size = size;
12464 type->computing = 0;
12465 }
12466 return size;
12467 }
12468
12469 struct External * _DeclareStruct(struct External * neededBy, const char * name, unsigned int skipNoHead, unsigned int needDereference, unsigned int fwdDecl)
12470 {
12471 struct External * external = (((void *)0));
12472 struct Symbol * classSym = FindClass(name);
12473 struct __ecereNameSpace__ecere__sys__OldList * curDeclarations = (((void *)0));
12474
12475 if(!inCompiler || !classSym)
12476 return (((void *)0));
12477 if(classSym->__anon1.registered && (classSym->__anon1.registered->type == 2 || classSym->__anon1.registered->type == 3 || classSym->__anon1.registered->type == 4))
12478 return (((void *)0));
12479 if(!classSym->__anon1.registered || (classSym->__anon1.registered->type == 0 && classSym->__anon1.registered->structSize && classSym->__anon1.registered->base && classSym->__anon1.registered->base->base))
12480 _DeclareStruct(neededBy, "ecere::com::Instance", 0, 1, fwdDecl);
12481 external = classSym->__anon2.__anon1.structExternal;
12482 if(external && external->__anon1.declaration)
12483 {
12484 struct Specifier * spec;
12485
12486 for(spec = external->__anon1.declaration->__anon1.__anon1.specifiers ? (*external->__anon1.declaration->__anon1.__anon1.specifiers).first : (((void *)0)); spec; spec = spec->next)
12487 if(spec->type == 3 || spec->type == 4)
12488 {
12489 curDeclarations = spec->__anon1.__anon2.definitions;
12490 break;
12491 }
12492 }
12493 if(classSym->__anon1.registered && !classSym->declaring && classSym->imported && (!classSym->declaredStructSym || (classSym->__anon1.registered->type == 5 && !skipNoHead && external && !curDeclarations)))
12494 {
12495 struct __ecereNameSpace__ecere__sys__OldList * specifiers, * declarators;
12496 struct __ecereNameSpace__ecere__sys__OldList * declarations = (((void *)0));
12497 char structName[1024];
12498 unsigned int addedPadding = 0;
12499 struct Specifier * curSpec = (((void *)0));
12500
12501 classSym->declaring++;
12502 if(strchr(classSym->string, '<'))
12503 {
12504 if(classSym->__anon1.registered->templateClass)
12505 external = _DeclareStruct(neededBy, classSym->__anon1.registered->templateClass->fullName, skipNoHead, needDereference, fwdDecl);
12506 classSym->declaring--;
12507 return external;
12508 }
12509 structName[0] = 0;
12510 FullClassNameCat(structName, name, 0);
12511 classSym->declaredStructSym = 1;
12512 if(!external || (classSym->__anon1.registered->type == 5 && !skipNoHead && !curDeclarations))
12513 {
12514 unsigned int add = 0;
12515
12516 if(!external)
12517 {
12518 external = MkExternalDeclaration((((void *)0)));
12519 classSym->__anon2.__anon1.structExternal = external;
12520 external->symbol = classSym;
12521 add = 1;
12522 }
12523 if(!skipNoHead)
12524 {
12525 declarations = MkList();
12526 AddMembers(external, declarations, classSym->__anon1.registered, 0, (((void *)0)), classSym->__anon1.registered, &addedPadding);
12527 }
12528 if(external->__anon1.declaration)
12529 {
12530 struct Specifier * spec;
12531
12532 for(spec = external->__anon1.declaration->__anon1.__anon1.specifiers ? (*external->__anon1.declaration->__anon1.__anon1.specifiers).first : (((void *)0)); spec; spec = spec->next)
12533 if(spec->type == 3 || spec->type == 4)
12534 {
12535 curSpec = spec;
12536 curDeclarations = spec->__anon1.__anon2.definitions;
12537 break;
12538 }
12539 }
12540 if(declarations && (!(*declarations).count || ((*declarations).count == 1 && addedPadding)))
12541 {
12542 FreeList(declarations, (void *)(FreeClassDef));
12543 declarations = (((void *)0));
12544 }
12545 if(classSym->__anon1.registered->type != 5 && !declarations)
12546 {
12547 FreeExternal(external);
12548 external = (((void *)0));
12549 classSym->__anon2.__anon1.structExternal = (((void *)0));
12550 }
12551 else
12552 {
12553 if(curSpec)
12554 curSpec->__anon1.__anon2.definitions = declarations;
12555 else
12556 {
12557 specifiers = MkList();
12558 declarators = MkList();
12559 ListAdd(specifiers, MkStructOrUnion(3, MkIdentifier(structName), declarations));
12560 external->__anon1.declaration = MkDeclaration(specifiers, declarators);
12561 }
12562 if(add)
12563 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add((&*ast), external);
12564 }
12565 }
12566 classSym->declaring--;
12567 }
12568 else if(!classSym->declaredStructSym && classSym->__anon2.__anon1.structExternal)
12569 {
12570 classSym->declaredStructSym = 1;
12571 if(classSym->__anon1.registered)
12572 DeclareMembers(classSym->__anon2.__anon1.structExternal, classSym->__anon1.registered, 0);
12573 if(classSym->__anon2.__anon1.structExternal->__anon1.declaration && classSym->__anon2.__anon1.structExternal->__anon1.declaration->__anon1.__anon1.specifiers)
12574 {
12575 struct Specifier * spec;
12576
12577 for(spec = (*classSym->__anon2.__anon1.structExternal->__anon1.declaration->__anon1.__anon1.specifiers).first; spec; spec = spec->next)
12578 {
12579 if(spec->__anon1.__anon2.definitions)
12580 IdentifyAnonStructs(spec->__anon1.__anon2.definitions);
12581 }
12582 }
12583 }
12584 if(inCompiler && neededBy && (external || !classSym->imported))
12585 {
12586 if(!external)
12587 {
12588 classSym->__anon2.__anon1.structExternal = external = MkExternalDeclaration((((void *)0)));
12589 external->symbol = classSym;
12590 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add((&*ast), external);
12591 }
12592 if(reachedPass15 && !external->__anon1.declaration && classSym->__anon1.registered && classSym->__anon1.registered->type == 5)
12593 {
12594 char structName[1024];
12595 struct __ecereNameSpace__ecere__sys__OldList * specifiers, * declarators;
12596
12597 structName[0] = 0;
12598 FullClassNameCat(structName, name, 0);
12599 specifiers = MkList();
12600 declarators = MkList();
12601 ListAdd(specifiers, MkStructOrUnion(3, MkIdentifier(structName), (((void *)0))));
12602 external->__anon1.declaration = MkDeclaration(specifiers, declarators);
12603 }
12604 if(fwdDecl)
12605 {
12606 struct External * e = external->fwdDecl ? external->fwdDecl : external;
12607
12608 if(((struct __ecereNameSpace__ecere__com__LinkList *)(((char *)e->incoming + 0 + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->count)
12609 __ecereMethod_External_CreateUniqueEdge(neededBy, e, !needDereference && !external->fwdDecl);
12610 }
12611 else
12612 __ecereMethod_External_CreateUniqueEdge(neededBy, external, !needDereference);
12613 }
12614 return external;
12615 }
12616
12617 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)
12618 {
12619 struct Identifier * ident = member->identifiers ? (*member->identifiers).first : (((void *)0));
12620 unsigned int found = 0;
12621 struct __ecereNameSpace__ecere__com__DataMember * dataMember = (((void *)0));
12622 struct __ecereNameSpace__ecere__com__Method * method = (((void *)0));
12623 unsigned int freeType = 0;
12624
12625 yylloc = member->loc;
12626 if(!ident)
12627 {
12628 if(curMember)
12629 {
12630 __ecereNameSpace__ecere__com__eClass_FindNextMember(_class, curClass, curMember, subMemberStack, subMemberStackPos);
12631 if(*curMember)
12632 {
12633 found = 1;
12634 dataMember = *curMember;
12635 }
12636 }
12637 }
12638 else
12639 {
12640 struct __ecereNameSpace__ecere__com__DataMember * thisMember = (struct __ecereNameSpace__ecere__com__DataMember *)__ecereNameSpace__ecere__com__eClass_FindProperty(_class, ident->string, privateModule);
12641 struct __ecereNameSpace__ecere__com__DataMember * _subMemberStack[256];
12642 int _subMemberStackPos = 0;
12643
12644 if(!thisMember)
12645 thisMember = __ecereNameSpace__ecere__com__eClass_FindDataMember(_class, ident->string, privateModule, _subMemberStack, &_subMemberStackPos);
12646 if(thisMember)
12647 {
12648 dataMember = thisMember;
12649 if(curMember && thisMember->memberAccess == 1)
12650 {
12651 *curMember = thisMember;
12652 *curClass = thisMember->_class;
12653 memcpy(subMemberStack, _subMemberStack, sizeof(struct __ecereNameSpace__ecere__com__DataMember *) * _subMemberStackPos);
12654 *subMemberStackPos = _subMemberStackPos;
12655 }
12656 found = 1;
12657 }
12658 else
12659 {
12660 method = __ecereNameSpace__ecere__com__eClass_FindMethod(_class, ident->string, privateModule);
12661 if(method && method->type == 1)
12662 found = 1;
12663 else
12664 method = (((void *)0));
12665 }
12666 }
12667 if(found)
12668 {
12669 struct Type * type = (((void *)0));
12670
12671 if(dataMember)
12672 {
12673 if(!dataMember->dataType && dataMember->dataTypeString)
12674 {
12675 struct Context * context = SetupTemplatesContext(_class);
12676
12677 dataMember->dataType = ProcessTypeString(dataMember->dataTypeString, 0);
12678 FinishTemplatesContext(context);
12679 }
12680 type = dataMember->dataType;
12681 }
12682 else if(method)
12683 {
12684 if(!method->dataType)
12685 ProcessMethodType(method);
12686 type = method->dataType;
12687 }
12688 if(ident && ident->next)
12689 {
12690 for(ident = ident->next; ident && type; ident = ident->next)
12691 {
12692 if(type->kind == 8)
12693 {
12694 dataMember = (struct __ecereNameSpace__ecere__com__DataMember *)__ecereNameSpace__ecere__com__eClass_FindProperty(type->__anon1._class->__anon1.registered, ident->string, privateModule);
12695 if(!dataMember)
12696 dataMember = __ecereNameSpace__ecere__com__eClass_FindDataMember(type->__anon1._class->__anon1.registered, ident->string, privateModule, (((void *)0)), (((void *)0)));
12697 if(dataMember)
12698 type = dataMember->dataType;
12699 }
12700 else if(type->kind == 9 || type->kind == 10)
12701 {
12702 struct Type * memberType;
12703
12704 for(memberType = type->__anon1.__anon1.members.first; memberType; memberType = memberType->next)
12705 {
12706 if(!strcmp(memberType->name, ident->string))
12707 {
12708 type = memberType;
12709 break;
12710 }
12711 }
12712 }
12713 }
12714 }
12715 if(type && type->kind == 20 && type->__anon1.templateParameter->type == 0 && _class->templateArgs)
12716 {
12717 int id = 0;
12718 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * curParam = (((void *)0));
12719 struct __ecereNameSpace__ecere__com__Class * sClass;
12720
12721 for(sClass = _class; sClass; sClass = sClass->base)
12722 {
12723 id = 0;
12724 if(sClass->templateClass)
12725 sClass = sClass->templateClass;
12726 for(curParam = sClass->templateParams.first; curParam; curParam = curParam->next)
12727 {
12728 if(curParam->type == 0 && !strcmp(type->__anon1.templateParameter->identifier->string, curParam->name))
12729 {
12730 for(sClass = sClass->base; sClass; sClass = sClass->base)
12731 {
12732 if(sClass->templateClass)
12733 sClass = sClass->templateClass;
12734 id += sClass->templateParams.count;
12735 }
12736 break;
12737 }
12738 id++;
12739 }
12740 if(curParam)
12741 break;
12742 }
12743 if(curParam)
12744 {
12745 struct __ecereNameSpace__ecere__com__ClassTemplateArgument arg = _class->templateArgs[id];
12746
12747 if(arg.__anon1.__anon1.dataTypeString)
12748 {
12749 unsigned int constant = type->constant;
12750
12751 type = ProcessTypeString(arg.__anon1.__anon1.dataTypeString, 0);
12752 if(type->kind == 8 && constant)
12753 type->constant = 1;
12754 else if(type->kind == 13)
12755 {
12756 struct Type * t = type->__anon1.type;
12757
12758 while(t->kind == 13)
12759 t = t->__anon1.type;
12760 if(constant)
12761 t->constant = constant;
12762 }
12763 freeType = 1;
12764 if(type && _class->templateClass)
12765 type->passAsTemplate = 1;
12766 if(type)
12767 {
12768 }
12769 }
12770 }
12771 }
12772 if(type && type->kind == 8 && type->__anon1._class && type->__anon1._class->__anon1.registered && strchr(type->__anon1._class->__anon1.registered->fullName, '<'))
12773 {
12774 struct __ecereNameSpace__ecere__com__Class * expClass = type->__anon1._class->__anon1.registered;
12775 struct __ecereNameSpace__ecere__com__Class * cClass = (((void *)0));
12776 int paramCount = 0;
12777 int lastParam = -1;
12778 char templateString[1024];
12779 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * param;
12780
12781 sprintf(templateString, "%s<", expClass->templateClass->fullName);
12782 for(cClass = expClass; cClass; cClass = cClass->base)
12783 {
12784 int p = 0;
12785
12786 if(cClass->templateClass)
12787 cClass = cClass->templateClass;
12788 for(param = cClass->templateParams.first; param; param = param->next)
12789 {
12790 int id = p;
12791 struct __ecereNameSpace__ecere__com__Class * sClass;
12792 struct __ecereNameSpace__ecere__com__ClassTemplateArgument arg;
12793
12794 for(sClass = cClass->base; sClass; sClass = sClass->base)
12795 {
12796 if(sClass->templateClass)
12797 sClass = sClass->templateClass;
12798 id += sClass->templateParams.count;
12799 }
12800 arg = expClass->templateArgs[id];
12801 for(sClass = _class; sClass; sClass = sClass->base)
12802 {
12803 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * cParam;
12804 int p = 0;
12805 struct __ecereNameSpace__ecere__com__Class * nextClass;
12806
12807 if(sClass->templateClass)
12808 sClass = sClass->templateClass;
12809 for(nextClass = sClass->base; nextClass; nextClass = nextClass->base)
12810 {
12811 if(nextClass->templateClass)
12812 nextClass = nextClass->templateClass;
12813 p += nextClass->templateParams.count;
12814 }
12815 for(cParam = sClass->templateParams.first; cParam; cParam = cParam->next, p++)
12816 {
12817 if(cParam->type == 0 && arg.__anon1.__anon1.dataTypeString && !strcmp(cParam->name, arg.__anon1.__anon1.dataTypeString))
12818 {
12819 if(_class->templateArgs && arg.__anon1.__anon1.dataTypeString && (!param->defaultArg.__anon1.__anon1.dataTypeString || strcmp(arg.__anon1.__anon1.dataTypeString, param->defaultArg.__anon1.__anon1.dataTypeString)))
12820 {
12821 arg.__anon1.__anon1.dataTypeString = _class->templateArgs[p].__anon1.__anon1.dataTypeString;
12822 arg.__anon1.__anon1.dataTypeClass = _class->templateArgs[p].__anon1.__anon1.dataTypeClass;
12823 break;
12824 }
12825 }
12826 }
12827 }
12828 {
12829 char argument[256];
12830
12831 argument[0] = '\0';
12832 switch(param->type)
12833 {
12834 case 2:
12835 {
12836 char expString[1024];
12837 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
12838 struct Declarator * decl = SpecDeclFromString(param->__anon1.dataTypeString, specs, (((void *)0)));
12839 struct Expression * exp;
12840 char * string = PrintHexUInt64(arg.__anon1.expression.__anon1.ui64);
12841
12842 exp = MkExpCast(MkTypeName(specs, decl), MkExpConstant(string));
12843 (__ecereNameSpace__ecere__com__eSystem_Delete(string), string = 0);
12844 ProcessExpressionType(exp);
12845 ComputeExpression(exp);
12846 expString[0] = '\0';
12847 PrintExpression(exp, expString);
12848 strcat(argument, expString);
12849 FreeExpression(exp);
12850 break;
12851 }
12852 case 1:
12853 {
12854 strcat(argument, arg.__anon1.__anon2.__anon1.member->name);
12855 break;
12856 }
12857 case 0:
12858 {
12859 if(arg.__anon1.__anon1.dataTypeString && (!param->defaultArg.__anon1.__anon1.dataTypeString || strcmp(arg.__anon1.__anon1.dataTypeString, param->defaultArg.__anon1.__anon1.dataTypeString)))
12860 strcat(argument, arg.__anon1.__anon1.dataTypeString);
12861 break;
12862 }
12863 }
12864 if(argument[0])
12865 {
12866 if(paramCount)
12867 strcat(templateString, ", ");
12868 if(lastParam != p - 1)
12869 {
12870 strcat(templateString, param->name);
12871 strcat(templateString, " = ");
12872 }
12873 strcat(templateString, argument);
12874 paramCount++;
12875 lastParam = p;
12876 }
12877 p++;
12878 }
12879 }
12880 }
12881 {
12882 int len = strlen(templateString);
12883
12884 if(templateString[len - 1] == '<')
12885 len--;
12886 else
12887 {
12888 if(templateString[len - 1] == '>')
12889 templateString[len++] = ' ';
12890 templateString[len++] = '>';
12891 }
12892 templateString[len++] = '\0';
12893 }
12894 {
12895 struct Context * context = SetupTemplatesContext(_class);
12896
12897 if(freeType)
12898 FreeType(type);
12899 type = ProcessTypeString(templateString, 0);
12900 freeType = 1;
12901 FinishTemplatesContext(context);
12902 }
12903 }
12904 if(method && member->initializer && member->initializer->type == 0 && member->initializer->__anon1.exp)
12905 {
12906 ProcessExpressionType(member->initializer->__anon1.exp);
12907 if(!member->initializer->__anon1.exp->expType)
12908 {
12909 if(inCompiler)
12910 {
12911 char expString[10240];
12912
12913 expString[0] = '\0';
12914 PrintExpression(member->initializer->__anon1.exp, expString);
12915 __ecereNameSpace__ecere__sys__ChangeCh(expString, '\n', ' ');
12916 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "unresolved symbol used as an instance method %s\n", (((void *)0))), expString);
12917 }
12918 }
12919 else if(!MatchTypes(member->initializer->__anon1.exp->expType, type, (((void *)0)), (((void *)0)), _class, 1, 1, 0, 0, 1))
12920 {
12921 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "incompatible instance method %s\n", (((void *)0))), ident->string);
12922 }
12923 }
12924 else if(member->initializer)
12925 {
12926 ProcessInitializer(member->initializer, type);
12927 }
12928 if(freeType)
12929 FreeType(type);
12930 }
12931 else
12932 {
12933 if(_class && _class->type == 3)
12934 {
12935 if(member->initializer)
12936 {
12937 struct Type * type = MkClassType(_class->fullName);
12938
12939 ProcessInitializer(member->initializer, type);
12940 FreeType(type);
12941 }
12942 }
12943 else
12944 {
12945 if(member->initializer)
12946 {
12947 ProcessInitializer(member->initializer, (((void *)0)));
12948 }
12949 if(ident)
12950 {
12951 if(method)
12952 {
12953 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "couldn't find virtual method %s in class %s\n", (((void *)0))), ident->string, _class->fullName);
12954 }
12955 else if(_class)
12956 {
12957 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "couldn't find member %s in class %s\n", (((void *)0))), ident->string, _class->fullName);
12958 if(inCompiler)
12959 __ecereNameSpace__ecere__com__eClass_AddDataMember(_class, ident->string, "int", 0, 0, 1);
12960 }
12961 }
12962 else if(_class)
12963 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "too many initializers for instantiation of class %s\n", (((void *)0))), _class->fullName);
12964 }
12965 }
12966 }
12967
12968 unsigned int MatchWithEnums_NameSpace(struct __ecereNameSpace__ecere__com__NameSpace * nameSpace, struct Expression * sourceExp, struct Type * dest, char * string, struct __ecereNameSpace__ecere__sys__OldList * conversions)
12969 {
12970 struct __ecereNameSpace__ecere__com__BTNamedLink * link;
12971
12972 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)))
12973 {
12974 struct __ecereNameSpace__ecere__com__Class * _class = link->data;
12975
12976 if(_class->type == 4)
12977 {
12978 struct __ecereNameSpace__ecere__sys__OldList converts =
12979 {
12980 0, 0, 0, 0, 0
12981 };
12982 struct Type * type = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
12983
12984 type->kind = 8;
12985 if(!_class->symbol)
12986 _class->symbol = FindClass(_class->fullName);
12987 type->__anon1._class = _class->symbol;
12988 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))
12989 {
12990 struct __ecereNameSpace__ecere__sys__NamedLink64 * value;
12991 struct __ecereNameSpace__ecere__com__Class * enumClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "enum");
12992
12993 if(enumClass)
12994 {
12995 struct __ecereNameSpace__ecere__com__Class * baseClass;
12996
12997 for(baseClass = _class; baseClass && baseClass->type == 4; baseClass = baseClass->base)
12998 {
12999 struct __ecereNameSpace__ecere__com__EnumClassData * e = (baseClass ? ((void *)(((char *)baseClass->data) + enumClass->offsetClass)) : (((void *)0)));
13000
13001 for(value = e->values.first; value; value = value->next)
13002 {
13003 if(!strcmp(value->name, string))
13004 break;
13005 }
13006 if(value)
13007 {
13008 FreeType(sourceExp->expType);
13009 sourceExp->isConstant = 1;
13010 sourceExp->expType = MkClassType(baseClass->fullName);
13011 if(inCompiler || inPreCompiler || inDebugger)
13012 {
13013 char constant[256];
13014
13015 FreeExpContents(sourceExp);
13016 sourceExp->type = 2;
13017 if(!strcmp(baseClass->dataTypeString, "int") || !strcmp(baseClass->dataTypeString, "int64") || !strcmp(baseClass->dataTypeString, "short") || !strcmp(baseClass->dataTypeString, "char"))
13018 sprintf(constant, ((__runtimePlatform == 1) ? "%I64d" : "%lld"), value->data);
13019 else
13020 sprintf(constant, ((__runtimePlatform == 1) ? "0x%I64XLL" : "0x%llXLL"), value->data);
13021 sourceExp->__anon1.__anon1.constant = __ecereNameSpace__ecere__sys__CopyString(constant);
13022 }
13023 while(converts.first)
13024 {
13025 struct Conversion * convert = converts.first;
13026
13027 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove(&converts, convert);
13028 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(conversions, convert);
13029 }
13030 ((type ? __extension__ ({
13031 void * __ecerePtrToDelete = (type);
13032
13033 __ecereClass_Type->Destructor ? __ecereClass_Type->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete);
13034 }) : 0), type = 0);
13035 return 1;
13036 }
13037 }
13038 }
13039 }
13040 if(converts.first)
13041 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Free(&converts, (void *)(FreeConvert));
13042 ((type ? __extension__ ({
13043 void * __ecerePtrToDelete = (type);
13044
13045 __ecereClass_Type->Destructor ? __ecereClass_Type->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete);
13046 }) : 0), type = 0);
13047 }
13048 }
13049 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)))
13050 if(MatchWithEnums_NameSpace(nameSpace, sourceExp, dest, string, conversions))
13051 return 1;
13052 return 0;
13053 }
13054
13055 void ComputeExpression(struct Expression * exp)
13056 {
13057 switch(exp->type)
13058 {
13059 case 0:
13060 {
13061 struct Identifier * id = exp->__anon1.__anon1.identifier;
13062
13063 if(id && exp->isConstant && !inCompiler && !inPreCompiler && !inDebugger)
13064 {
13065 struct __ecereNameSpace__ecere__com__Class * c = (exp->expType && exp->expType->kind == 8 && exp->expType->__anon1._class) ? exp->expType->__anon1._class->__anon1.registered : (((void *)0));
13066
13067 if(c && c->type == 4)
13068 {
13069 struct __ecereNameSpace__ecere__com__Class * enumClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "enum");
13070
13071 if(enumClass)
13072 {
13073 struct __ecereNameSpace__ecere__sys__NamedLink64 * value;
13074 struct __ecereNameSpace__ecere__com__EnumClassData * e = (c ? ((void *)(((char *)c->data) + enumClass->offsetClass)) : (((void *)0)));
13075
13076 for(value = e->values.first; value; value = value->next)
13077 {
13078 if(!strcmp(value->name, id->string))
13079 break;
13080 }
13081 if(value)
13082 {
13083 const char * dts = c->dataTypeString;
13084
13085 FreeExpContents(exp);
13086 exp->type = 2;
13087 exp->__anon1.__anon1.constant = (dts && (!strcmp(dts, "int") || !strcmp(dts, "int64") || !strcmp(dts, "short") || !strcmp(dts, "char"))) ? PrintInt64(value->data) : PrintUInt64(value->data);
13088 }
13089 }
13090 }
13091 }
13092 break;
13093 }
13094 case 1:
13095 {
13096 ComputeInstantiation(exp);
13097 break;
13098 }
13099 case 4:
13100 {
13101 struct Expression * exp1, * exp2 = (((void *)0));
13102 struct Operand op1 =
13103 {
13104 0, 0, 0,
13105 .__anon1 = {
13106 .c = 0
13107 },
13108 {
13109 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
13110 }
13111 };
13112 struct Operand op2 =
13113 {
13114 0, 0, 0,
13115 .__anon1 = {
13116 .c = 0
13117 },
13118 {
13119 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
13120 }
13121 };
13122
13123 if(exp->__anon1.op.exp2)
13124 {
13125 struct Expression * e = exp->__anon1.op.exp2;
13126
13127 while((e->type == 5 || e->type == 32 || e->type == 23) && e->__anon1.list)
13128 {
13129 if(e->type == 5 || e->type == 32 || e->type == 23)
13130 {
13131 if(e->type == 23)
13132 e = (*((struct Statement *)(*e->__anon1.compound->__anon1.compound.statements).last)->__anon1.expressions).last;
13133 else
13134 e = (*e->__anon1.list).last;
13135 }
13136 }
13137 if(exp->__anon1.op.op == 261 && e && e->expType)
13138 {
13139 if(e->type == 3 && e->__anon1.__anon2.string)
13140 {
13141 char * string = e->__anon1.__anon2.string;
13142 int len = strlen(string);
13143 char * tmp = __ecereNameSpace__ecere__com__eSystem_New(sizeof(char) * (len - 2 + 1));
13144
13145 len = UnescapeString(tmp, string + 1, len - 2);
13146 (__ecereNameSpace__ecere__com__eSystem_Delete(tmp), tmp = 0);
13147 FreeExpContents(exp);
13148 exp->type = 2;
13149 exp->__anon1.__anon1.constant = PrintUInt(len + 1);
13150 }
13151 else
13152 {
13153 struct Type * type = e->expType;
13154
13155 type->refCount++;
13156 FreeExpContents(exp);
13157 exp->type = 2;
13158 exp->__anon1.__anon1.constant = PrintUInt(ComputeTypeSize(type));
13159 FreeType(type);
13160 }
13161 break;
13162 }
13163 else
13164 ComputeExpression(exp->__anon1.op.exp2);
13165 }
13166 if(exp->__anon1.op.exp1)
13167 {
13168 ComputeExpression(exp->__anon1.op.exp1);
13169 exp1 = exp->__anon1.op.exp1;
13170 exp2 = exp->__anon1.op.exp2;
13171 op1 = GetOperand(exp1);
13172 if(op1.type)
13173 op1.type->refCount++;
13174 if(exp2)
13175 {
13176 op2 = GetOperand(exp2);
13177 if(op2.type)
13178 op2.type->refCount++;
13179 }
13180 }
13181 else
13182 {
13183 exp1 = exp->__anon1.op.exp2;
13184 op1 = GetOperand(exp1);
13185 if(op1.type)
13186 op1.type->refCount++;
13187 }
13188 CallOperator(exp, exp1, exp2, &op1, &op2);
13189 if(op1.type)
13190 FreeType(op1.type);
13191 if(op2.type)
13192 FreeType(op2.type);
13193 break;
13194 }
13195 case 5:
13196 case 32:
13197 {
13198 struct Expression * e, * n;
13199
13200 for(e = (*exp->__anon1.list).first; e; e = n)
13201 {
13202 n = e->next;
13203 if(!n)
13204 {
13205 struct __ecereNameSpace__ecere__sys__OldList * list = exp->__anon1.list;
13206 struct Expression * prev = exp->prev;
13207 struct Expression * next = exp->next;
13208
13209 if(exp->expType && exp->expType->kind == 8 && (!e->expType || e->expType->kind != 8))
13210 {
13211 FreeType(e->expType);
13212 e->expType = exp->expType;
13213 e->expType->refCount++;
13214 }
13215 ComputeExpression(e);
13216 FreeType(exp->expType);
13217 FreeType(exp->destType);
13218 *exp = *e;
13219 exp->prev = prev;
13220 exp->next = next;
13221 ((e ? __extension__ ({
13222 void * __ecerePtrToDelete = (e);
13223
13224 __ecereClass_Expression->Destructor ? __ecereClass_Expression->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete);
13225 }) : 0), e = 0);
13226 (__ecereNameSpace__ecere__com__eSystem_Delete(list), list = 0);
13227 }
13228 else
13229 {
13230 FreeExpression(e);
13231 }
13232 }
13233 break;
13234 }
13235 case 8:
13236 {
13237 struct Expression * memberExp = exp->__anon1.member.exp;
13238 struct Identifier * memberID = exp->__anon1.member.member;
13239 struct Type * type;
13240
13241 ComputeExpression(exp->__anon1.member.exp);
13242 type = exp->__anon1.member.exp->expType;
13243 if(type)
13244 {
13245 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)));
13246 struct __ecereNameSpace__ecere__com__Property * prop = (((void *)0));
13247 struct __ecereNameSpace__ecere__com__DataMember * member = (((void *)0));
13248 struct __ecereNameSpace__ecere__com__Class * convertTo = (((void *)0));
13249
13250 if(type->kind == 19 && exp->__anon1.member.exp->type == 24)
13251 _class = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "ecere::com::Class");
13252 if(!_class)
13253 {
13254 char string[256];
13255 struct Symbol * classSym;
13256
13257 string[0] = '\0';
13258 PrintTypeNoConst(type, string, 0, 1);
13259 classSym = FindClass(string);
13260 _class = classSym ? classSym->__anon1.registered : (((void *)0));
13261 }
13262 if(exp->__anon1.member.member)
13263 {
13264 prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, exp->__anon1.member.member->string, privateModule);
13265 if(!prop)
13266 member = __ecereNameSpace__ecere__com__eClass_FindDataMember(_class, exp->__anon1.member.member->string, privateModule, (((void *)0)), (((void *)0)));
13267 }
13268 if(!prop && !member && _class && exp->__anon1.member.member)
13269 {
13270 struct Symbol * classSym = FindClass(exp->__anon1.member.member->string);
13271
13272 convertTo = _class;
13273 _class = classSym ? classSym->__anon1.registered : (((void *)0));
13274 prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, convertTo->fullName, privateModule);
13275 }
13276 if(prop)
13277 {
13278 if(prop->compiled)
13279 {
13280 struct Type * type = prop->dataType;
13281
13282 if(_class->type == 3)
13283 {
13284 if(type->kind == 8)
13285 {
13286 struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class->__anon1.registered;
13287
13288 if(_class->type == 3)
13289 {
13290 if(!_class->dataType)
13291 _class->dataType = ProcessTypeString(_class->dataTypeString, 0);
13292 type = _class->dataType;
13293 }
13294 }
13295 switch(type->kind)
13296 {
13297 case 6:
13298 {
13299 float value;
13300 float (* Get)(float) = (void *)prop->Get;
13301
13302 GetFloat(exp->__anon1.member.exp, &value);
13303 exp->__anon1.__anon1.constant = PrintFloat(Get ? Get(value) : value);
13304 exp->type = 2;
13305 break;
13306 }
13307 case 7:
13308 {
13309 double value;
13310 double (* Get)(double);
13311
13312 GetDouble(exp->__anon1.member.exp, &value);
13313 if(convertTo)
13314 Get = (void *)prop->Set;
13315 else
13316 Get = (void *)prop->Get;
13317 exp->__anon1.__anon1.constant = PrintDouble(Get ? Get(value) : value);
13318 exp->type = 2;
13319 break;
13320 }
13321 }
13322 }
13323 else
13324 {
13325 if(convertTo)
13326 {
13327 struct Expression * value = exp->__anon1.member.exp;
13328 struct Type * type;
13329
13330 if(!prop->dataType)
13331 ProcessPropertyType(prop);
13332 type = prop->dataType;
13333 if(!type)
13334 {
13335 }
13336 else if(_class->type == 1)
13337 {
13338 switch(type->kind)
13339 {
13340 case 8:
13341 {
13342 struct __ecereNameSpace__ecere__com__Class * propertyClass = type->__anon1._class->__anon1.registered;
13343
13344 if(propertyClass->type == 1 && value->type == 1)
13345 {
13346 void (* Set)(void *, void *) = (void *)prop->Set;
13347
13348 exp->__anon1.instance = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Instantiation);
13349 exp->__anon1.instance->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize));
13350 exp->__anon1.instance->_class = MkSpecifierName(_class->fullName);
13351 exp->__anon1.instance->loc = exp->loc;
13352 exp->type = 1;
13353 Set(exp->__anon1.instance->data, value->__anon1.instance->data);
13354 PopulateInstance(exp->__anon1.instance);
13355 }
13356 break;
13357 }
13358 case 3:
13359 {
13360 int intValue;
13361 void (* Set)(void *, int) = (void *)prop->Set;
13362
13363 exp->__anon1.instance = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Instantiation);
13364 exp->__anon1.instance->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize));
13365 exp->__anon1.instance->_class = MkSpecifierName(_class->fullName);
13366 exp->__anon1.instance->loc = exp->loc;
13367 exp->type = 1;
13368 GetInt(value, &intValue);
13369 Set(exp->__anon1.instance->data, intValue);
13370 PopulateInstance(exp->__anon1.instance);
13371 break;
13372 }
13373 case 4:
13374 {
13375 long long intValue;
13376 void (* Set)(void *, long long) = (void *)prop->Set;
13377
13378 exp->__anon1.instance = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Instantiation);
13379 exp->__anon1.instance->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize));
13380 exp->__anon1.instance->_class = MkSpecifierName(_class->fullName);
13381 exp->__anon1.instance->loc = exp->loc;
13382 exp->type = 1;
13383 GetInt64(value, &intValue);
13384 Set(exp->__anon1.instance->data, intValue);
13385 PopulateInstance(exp->__anon1.instance);
13386 break;
13387 }
13388 case 22:
13389 {
13390 intptr_t intValue;
13391 void (* Set)(void *, intptr_t) = (void *)prop->Set;
13392
13393 exp->__anon1.instance = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Instantiation);
13394 exp->__anon1.instance->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize));
13395 exp->__anon1.instance->_class = MkSpecifierName(_class->fullName);
13396 exp->__anon1.instance->loc = exp->loc;
13397 exp->type = 1;
13398 GetIntPtr(value, &intValue);
13399 Set(exp->__anon1.instance->data, intValue);
13400 PopulateInstance(exp->__anon1.instance);
13401 break;
13402 }
13403 case 23:
13404 {
13405 ssize_t intValue;
13406 void (* Set)(void *, ssize_t) = (void *)prop->Set;
13407
13408 exp->__anon1.instance = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Instantiation);
13409 exp->__anon1.instance->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize));
13410 exp->__anon1.instance->_class = MkSpecifierName(_class->fullName);
13411 exp->__anon1.instance->loc = exp->loc;
13412 exp->type = 1;
13413 GetIntSize(value, &intValue);
13414 Set(exp->__anon1.instance->data, intValue);
13415 PopulateInstance(exp->__anon1.instance);
13416 break;
13417 }
13418 case 6:
13419 {
13420 float floatValue;
13421 void (* Set)(void *, float) = (void *)prop->Set;
13422
13423 exp->__anon1.instance = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Instantiation);
13424 exp->__anon1.instance->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize));
13425 exp->__anon1.instance->_class = MkSpecifierName(_class->fullName);
13426 exp->__anon1.instance->loc = exp->loc;
13427 exp->type = 1;
13428 GetFloat(value, &floatValue);
13429 Set(exp->__anon1.instance->data, floatValue);
13430 PopulateInstance(exp->__anon1.instance);
13431 break;
13432 }
13433 case 7:
13434 {
13435 double doubleValue;
13436 void (* Set)(void *, double) = (void *)prop->Set;
13437
13438 exp->__anon1.instance = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Instantiation);
13439 exp->__anon1.instance->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize));
13440 exp->__anon1.instance->_class = MkSpecifierName(_class->fullName);
13441 exp->__anon1.instance->loc = exp->loc;
13442 exp->type = 1;
13443 GetDouble(value, &doubleValue);
13444 Set(exp->__anon1.instance->data, doubleValue);
13445 PopulateInstance(exp->__anon1.instance);
13446 break;
13447 }
13448 }
13449 }
13450 else if(_class->type == 2)
13451 {
13452 switch(type->kind)
13453 {
13454 case 8:
13455 {
13456 struct __ecereNameSpace__ecere__com__Class * propertyClass = type->__anon1._class->__anon1.registered;
13457
13458 if(propertyClass->type == 1 && value->__anon1.instance->data)
13459 {
13460 unsigned int (* Set)(void *) = (void *)prop->Set;
13461 unsigned int bits = Set(value->__anon1.instance->data);
13462
13463 exp->__anon1.__anon1.constant = PrintHexUInt(bits);
13464 exp->type = 2;
13465 break;
13466 }
13467 else if(_class->type == 2)
13468 {
13469 unsigned int value;
13470 unsigned int (* Set)(unsigned int) = (void *)prop->Set;
13471 unsigned int bits;
13472
13473 GetUInt(exp->__anon1.member.exp, &value);
13474 bits = Set(value);
13475 exp->__anon1.__anon1.constant = PrintHexUInt(bits);
13476 exp->type = 2;
13477 }
13478 }
13479 }
13480 }
13481 }
13482 else
13483 {
13484 if(_class->type == 2)
13485 {
13486 unsigned int value;
13487
13488 GetUInt(exp->__anon1.member.exp, &value);
13489 switch(type->kind)
13490 {
13491 case 8:
13492 {
13493 struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class->__anon1.registered;
13494
13495 if(_class->type == 1)
13496 {
13497 void (* Get)(unsigned int, void *) = (void *)prop->Get;
13498
13499 exp->__anon1.instance = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Instantiation);
13500 exp->__anon1.instance->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize));
13501 exp->__anon1.instance->_class = MkSpecifierName(_class->fullName);
13502 exp->__anon1.instance->loc = exp->loc;
13503 exp->type = 1;
13504 Get(value, exp->__anon1.instance->data);
13505 PopulateInstance(exp->__anon1.instance);
13506 }
13507 else if(_class->type == 2)
13508 {
13509 unsigned int (* Get)(unsigned int) = (void *)prop->Get;
13510 uint64 bits = Get(value);
13511
13512 exp->__anon1.__anon1.constant = PrintHexUInt64(bits);
13513 exp->type = 2;
13514 }
13515 break;
13516 }
13517 }
13518 }
13519 else if(_class->type == 1)
13520 {
13521 unsigned char * value = (exp->__anon1.member.exp->type == 1) ? exp->__anon1.member.exp->__anon1.instance->data : (((void *)0));
13522
13523 switch(type->kind)
13524 {
13525 case 8:
13526 {
13527 struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class->__anon1.registered;
13528
13529 if(_class->type == 1 && value)
13530 {
13531 void (* Get)(void *, void *) = (void *)prop->Get;
13532
13533 exp->__anon1.instance = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Instantiation);
13534 exp->__anon1.instance->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize));
13535 exp->__anon1.instance->_class = MkSpecifierName(_class->fullName);
13536 exp->__anon1.instance->loc = exp->loc;
13537 exp->type = 1;
13538 Get(value, exp->__anon1.instance->data);
13539 PopulateInstance(exp->__anon1.instance);
13540 }
13541 break;
13542 }
13543 }
13544 }
13545 }
13546 }
13547 }
13548 else
13549 {
13550 exp->isConstant = 0;
13551 }
13552 }
13553 else if(member)
13554 {
13555 }
13556 }
13557 if(exp->type != 8)
13558 {
13559 FreeExpression(memberExp);
13560 FreeIdentifier(memberID);
13561 }
13562 break;
13563 }
13564 case 10:
13565 {
13566 struct Type * type = ProcessType(exp->__anon1.typeName->qualifiers, exp->__anon1.typeName->declarator);
13567
13568 FreeExpContents(exp);
13569 exp->__anon1.__anon1.constant = PrintUInt(ComputeTypeSize(type));
13570 exp->type = 2;
13571 FreeType(type);
13572 break;
13573 }
13574 case 15:
13575 {
13576 struct Symbol * classSym = exp->__anon1._class->__anon1.__anon1.symbol;
13577
13578 if(classSym && classSym->__anon1.registered)
13579 {
13580 if(classSym->__anon1.registered->fixed)
13581 {
13582 FreeSpecifier(exp->__anon1._class);
13583 exp->__anon1.__anon1.constant = PrintUInt(classSym->__anon1.registered->templateClass ? classSym->__anon1.registered->templateClass->structSize : classSym->__anon1.registered->structSize);
13584 exp->type = 2;
13585 }
13586 else
13587 {
13588 char className[1024];
13589
13590 strcpy(className, "__ecereClass_");
13591 FullClassNameCat(className, classSym->string, 1);
13592 DeclareClass(curExternal, classSym, className);
13593 FreeExpContents(exp);
13594 exp->type = 9;
13595 exp->__anon1.member.exp = MkExpIdentifier(MkIdentifier(className));
13596 exp->__anon1.member.member = MkIdentifier("structSize");
13597 }
13598 }
13599 break;
13600 }
13601 case 11:
13602 {
13603 struct Type * type;
13604 struct Expression * e = exp;
13605
13606 if(exp->type == 11)
13607 {
13608 if(exp->__anon1.cast.exp)
13609 ComputeExpression(exp->__anon1.cast.exp);
13610 e = exp->__anon1.cast.exp;
13611 }
13612 if(e && exp->expType)
13613 {
13614 type = exp->expType;
13615 if(type->kind == 8)
13616 {
13617 struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class->__anon1.registered;
13618
13619 if(_class && (_class->type == 3 || _class->type == 2))
13620 {
13621 if(!_class->dataType)
13622 _class->dataType = ProcessTypeString(_class->dataTypeString, 0);
13623 type = _class->dataType;
13624 }
13625 }
13626 switch(type->kind)
13627 {
13628 case 24:
13629 case 1:
13630 if(type->isSigned)
13631 {
13632 char value = 0;
13633
13634 if(GetChar(e, &value))
13635 {
13636 FreeExpContents(exp);
13637 exp->__anon1.__anon1.constant = PrintChar(value);
13638 exp->type = 2;
13639 }
13640 }
13641 else
13642 {
13643 unsigned char value = 0;
13644
13645 if(GetUChar(e, &value))
13646 {
13647 FreeExpContents(exp);
13648 exp->__anon1.__anon1.constant = PrintUChar(value);
13649 exp->type = 2;
13650 }
13651 }
13652 break;
13653 case 2:
13654 if(type->isSigned)
13655 {
13656 short value = 0;
13657
13658 if(GetShort(e, &value))
13659 {
13660 FreeExpContents(exp);
13661 exp->__anon1.__anon1.constant = PrintShort(value);
13662 exp->type = 2;
13663 }
13664 }
13665 else
13666 {
13667 unsigned short value = 0;
13668
13669 if(GetUShort(e, &value))
13670 {
13671 FreeExpContents(exp);
13672 exp->__anon1.__anon1.constant = PrintUShort(value);
13673 exp->type = 2;
13674 }
13675 }
13676 break;
13677 case 3:
13678 if(type->isSigned)
13679 {
13680 int value = 0;
13681
13682 if(GetInt(e, &value))
13683 {
13684 FreeExpContents(exp);
13685 exp->__anon1.__anon1.constant = PrintInt(value);
13686 exp->type = 2;
13687 }
13688 }
13689 else
13690 {
13691 unsigned int value = 0;
13692
13693 if(GetUInt(e, &value))
13694 {
13695 FreeExpContents(exp);
13696 exp->__anon1.__anon1.constant = PrintUInt(value);
13697 exp->type = 2;
13698 }
13699 }
13700 break;
13701 case 4:
13702 if(type->isSigned)
13703 {
13704 long long value = 0;
13705
13706 if(GetInt64(e, &value))
13707 {
13708 FreeExpContents(exp);
13709 exp->__anon1.__anon1.constant = PrintInt64(value);
13710 exp->type = 2;
13711 }
13712 }
13713 else
13714 {
13715 uint64 value = 0;
13716
13717 if(GetUInt64(e, &value))
13718 {
13719 FreeExpContents(exp);
13720 exp->__anon1.__anon1.constant = PrintUInt64(value);
13721 exp->type = 2;
13722 }
13723 }
13724 break;
13725 case 22:
13726 if(type->isSigned)
13727 {
13728 intptr_t value = 0;
13729
13730 if(GetIntPtr(e, &value))
13731 {
13732 FreeExpContents(exp);
13733 exp->__anon1.__anon1.constant = PrintInt64((long long)value);
13734 exp->type = 2;
13735 }
13736 }
13737 else
13738 {
13739 uintptr_t value = 0;
13740
13741 if(GetUIntPtr(e, &value))
13742 {
13743 FreeExpContents(exp);
13744 exp->__anon1.__anon1.constant = PrintUInt64((uint64)value);
13745 exp->type = 2;
13746 }
13747 }
13748 break;
13749 case 23:
13750 if(type->isSigned)
13751 {
13752 ssize_t value = 0;
13753
13754 if(GetIntSize(e, &value))
13755 {
13756 FreeExpContents(exp);
13757 exp->__anon1.__anon1.constant = PrintInt64((long long)value);
13758 exp->type = 2;
13759 }
13760 }
13761 else
13762 {
13763 size_t value = 0;
13764
13765 if(GetUIntSize(e, &value))
13766 {
13767 FreeExpContents(exp);
13768 exp->__anon1.__anon1.constant = PrintUInt64((uint64)value);
13769 exp->type = 2;
13770 }
13771 }
13772 break;
13773 case 6:
13774 {
13775 float value = 0;
13776
13777 if(GetFloat(e, &value))
13778 {
13779 FreeExpContents(exp);
13780 exp->__anon1.__anon1.constant = PrintFloat(value);
13781 exp->type = 2;
13782 }
13783 break;
13784 }
13785 case 7:
13786 {
13787 double value = 0;
13788
13789 if(GetDouble(e, &value))
13790 {
13791 FreeExpContents(exp);
13792 exp->__anon1.__anon1.constant = PrintDouble(value);
13793 exp->type = 2;
13794 }
13795 break;
13796 }
13797 }
13798 }
13799 break;
13800 }
13801 case 12:
13802 {
13803 struct Operand op1 =
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 struct Operand op2 =
13814 {
13815 0, 0, 0,
13816 .__anon1 = {
13817 .c = 0
13818 },
13819 {
13820 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
13821 }
13822 };
13823 struct Operand op3 =
13824 {
13825 0, 0, 0,
13826 .__anon1 = {
13827 .c = 0
13828 },
13829 {
13830 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
13831 }
13832 };
13833
13834 if(exp->__anon1.cond.exp)
13835 ComputeExpression((*exp->__anon1.cond.exp).last);
13836 if(exp->__anon1.cond.elseExp)
13837 ComputeExpression(exp->__anon1.cond.elseExp);
13838 if(exp->__anon1.cond.cond)
13839 ComputeExpression(exp->__anon1.cond.cond);
13840 op1 = GetOperand(exp->__anon1.cond.cond);
13841 if(op1.type)
13842 op1.type->refCount++;
13843 op2 = GetOperand((*exp->__anon1.cond.exp).last);
13844 if(op2.type)
13845 op2.type->refCount++;
13846 op3 = GetOperand(exp->__anon1.cond.elseExp);
13847 if(op3.type)
13848 op3.type->refCount++;
13849 if(op1.ops.Cond)
13850 {
13851 FreeExpContents(exp);
13852 op1.ops.Cond(exp, &op1, &op2, &op3);
13853 }
13854 if(op1.type)
13855 FreeType(op1.type);
13856 if(op2.type)
13857 FreeType(op2.type);
13858 if(op3.type)
13859 FreeType(op3.type);
13860 break;
13861 }
13862 }
13863 }
13864
13865 unsigned int MatchWithEnums_Module(struct __ecereNameSpace__ecere__com__Instance * mainModule, struct Expression * sourceExp, struct Type * dest, char * string, struct __ecereNameSpace__ecere__sys__OldList * conversions)
13866 {
13867 struct __ecereNameSpace__ecere__com__Instance * module;
13868
13869 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))
13870 return 1;
13871 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))
13872 return 1;
13873 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))
13874 return 1;
13875 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)
13876 {
13877 if(ModuleVisibility(mainModule, module) && MatchWithEnums_NameSpace(&((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->publicNameSpace, sourceExp, dest, string, conversions))
13878 return 1;
13879 }
13880 return 0;
13881 }
13882
13883 unsigned int MatchTypeExpression(struct Expression * sourceExp, struct Type * dest, struct __ecereNameSpace__ecere__sys__OldList * conversions, unsigned int skipUnitBla, unsigned int warnConst)
13884 {
13885 struct Type * source;
13886 struct Type * realDest = dest;
13887 struct Type * backupSourceExpType = (((void *)0));
13888 struct Expression * nbExp = GetNonBracketsExp(sourceExp);
13889 struct Expression * computedExp = nbExp;
13890
13891 dest->refCount++;
13892 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)
13893 {
13894 computedExp = CopyExpression(nbExp);
13895 ComputeExpression(computedExp);
13896 }
13897 source = sourceExp->expType;
13898 if(dest->kind == 13 && sourceExp->type == 2 && !strtoul(sourceExp->__anon1.__anon1.constant, (((void *)0)), 0))
13899 {
13900 if(computedExp != nbExp)
13901 {
13902 FreeExpression(computedExp);
13903 computedExp = nbExp;
13904 }
13905 FreeType(dest);
13906 return 1;
13907 }
13908 if(!skipUnitBla && source && dest && source->kind == 8 && dest->kind == 8)
13909 {
13910 if(source->__anon1._class && source->__anon1._class->__anon1.registered && source->__anon1._class->__anon1.registered->type == 3)
13911 {
13912 struct __ecereNameSpace__ecere__com__Class * sourceBase, * destBase;
13913
13914 for(sourceBase = source->__anon1._class->__anon1.registered; sourceBase && sourceBase->base && sourceBase->base->type != 1000; sourceBase = sourceBase->base)
13915 ;
13916 for(destBase = dest->__anon1._class->__anon1.registered; destBase && destBase->base && destBase->base->type != 1000; destBase = destBase->base)
13917 ;
13918 if(sourceBase == destBase)
13919 {
13920 if(computedExp != nbExp)
13921 {
13922 FreeExpression(computedExp);
13923 computedExp = nbExp;
13924 }
13925 FreeType(dest);
13926 return 1;
13927 }
13928 }
13929 }
13930 if(source)
13931 {
13932 struct __ecereNameSpace__ecere__sys__OldList * specs;
13933 unsigned int flag = 0;
13934 long long value = (((int)0x7fffffff));
13935
13936 source->refCount++;
13937 if(computedExp->type == 2)
13938 {
13939 if(source->isSigned)
13940 value = strtoll(computedExp->__anon1.__anon1.constant, (((void *)0)), 0);
13941 else
13942 value = strtoull(computedExp->__anon1.__anon1.constant, (((void *)0)), 0);
13943 }
13944 else if(computedExp->type == 4 && computedExp->__anon1.op.op == '-' && !computedExp->__anon1.op.exp1 && computedExp->__anon1.op.exp2 && computedExp->__anon1.op.exp2->type == 2)
13945 {
13946 if(source->isSigned)
13947 value = -strtoll(computedExp->__anon1.op.exp2->__anon1.__anon1.constant, (((void *)0)), 0);
13948 else
13949 value = -strtoull(computedExp->__anon1.op.exp2->__anon1.__anon1.constant, (((void *)0)), 0);
13950 }
13951 if(computedExp != nbExp)
13952 {
13953 FreeExpression(computedExp);
13954 computedExp = nbExp;
13955 }
13956 if(dest->kind != 8 && source->kind == 8 && source->__anon1._class && source->__anon1._class->__anon1.registered && !strcmp(source->__anon1._class->__anon1.registered->fullName, "unichar"))
13957 {
13958 FreeType(source);
13959 source = __extension__ ({
13960 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
13961
13962 __ecereInstance1->kind = 3, __ecereInstance1->isSigned = 0, __ecereInstance1->refCount = 1, __ecereInstance1;
13963 });
13964 }
13965 if(dest->kind == 8)
13966 {
13967 struct __ecereNameSpace__ecere__com__Class * _class = dest->__anon1._class ? dest->__anon1._class->__anon1.registered : (((void *)0));
13968
13969 if(_class && _class->type == 3)
13970 {
13971 if(source->kind != 8)
13972 {
13973 struct Type * tempType = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
13974 struct Type * tempDest, * tempSource;
13975
13976 for(; _class->base->type != 1000; _class = _class->base)
13977 ;
13978 tempSource = dest;
13979 tempDest = tempType;
13980 tempType->kind = 8;
13981 if(!_class->symbol)
13982 _class->symbol = FindClass(_class->fullName);
13983 tempType->__anon1._class = _class->symbol;
13984 tempType->truth = dest->truth;
13985 if(tempType->__anon1._class)
13986 MatchTypes(tempSource, tempDest, conversions, (((void *)0)), (((void *)0)), 1, 1, 0, 0, warnConst);
13987 backupSourceExpType = sourceExp->expType;
13988 if(dest->passAsTemplate)
13989 {
13990 sourceExp->expType = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
13991 CopyTypeInto(sourceExp->expType, dest);
13992 sourceExp->expType->passAsTemplate = 0;
13993 }
13994 else
13995 {
13996 sourceExp->expType = dest;
13997 dest->refCount++;
13998 }
13999 flag = 1;
14000 ((tempType ? __extension__ ({
14001 void * __ecerePtrToDelete = (tempType);
14002
14003 __ecereClass_Type->Destructor ? __ecereClass_Type->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete);
14004 }) : 0), tempType = 0);
14005 }
14006 }
14007 if(_class && _class->type == 2 && source->kind != 8)
14008 {
14009 if(!dest->__anon1._class->__anon1.registered->dataType)
14010 dest->__anon1._class->__anon1.registered->dataType = ProcessTypeString(dest->__anon1._class->__anon1.registered->dataTypeString, 0);
14011 if(MatchTypes(source, dest->__anon1._class->__anon1.registered->dataType, conversions, (((void *)0)), (((void *)0)), 1, 1, 0, 0, warnConst))
14012 {
14013 FreeType(source);
14014 FreeType(sourceExp->expType);
14015 source = sourceExp->expType = MkClassType(dest->__anon1._class->string);
14016 source->refCount++;
14017 }
14018 }
14019 if(_class && !strcmp(_class->fullName, "ecere::com::Class") && source->kind == 13 && source->__anon1.type && source->__anon1.type->kind == 1 && sourceExp->type == 3)
14020 {
14021 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
14022 struct Declarator * decl;
14023 char string[1024];
14024
14025 ReadString(string, sourceExp->__anon1.__anon2.string);
14026 decl = SpecDeclFromString(string, specs, (((void *)0)));
14027 FreeExpContents(sourceExp);
14028 FreeType(sourceExp->expType);
14029 sourceExp->type = 24;
14030 sourceExp->__anon1._classExp.specifiers = specs;
14031 sourceExp->__anon1._classExp.decl = decl;
14032 sourceExp->expType = dest;
14033 dest->refCount++;
14034 FreeType(source);
14035 FreeType(dest);
14036 if(backupSourceExpType)
14037 FreeType(backupSourceExpType);
14038 return 1;
14039 }
14040 }
14041 else if(source->kind == 8)
14042 {
14043 struct __ecereNameSpace__ecere__com__Class * _class = source->__anon1._class ? source->__anon1._class->__anon1.registered : (((void *)0));
14044
14045 if(_class && (_class->type == 3 || _class->type == 2))
14046 {
14047 if(dest->kind != 8)
14048 {
14049 struct Type * tempType = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
14050 struct Type * tempDest, * tempSource;
14051
14052 if(!source->__anon1._class->__anon1.registered->dataType)
14053 source->__anon1._class->__anon1.registered->dataType = ProcessTypeString(source->__anon1._class->__anon1.registered->dataTypeString, 0);
14054 for(; _class->base->type != 1000; _class = _class->base)
14055 ;
14056 tempDest = source;
14057 tempSource = tempType;
14058 tempType->kind = 8;
14059 tempType->__anon1._class = FindClass(_class->fullName);
14060 tempType->truth = source->truth;
14061 tempType->classObjectType = source->classObjectType;
14062 if(tempType->__anon1._class)
14063 MatchTypes(tempSource, tempDest, conversions, (((void *)0)), (((void *)0)), 1, 1, 0, 0, warnConst);
14064 if(conversions && conversions->last)
14065 {
14066 ((struct Conversion *)conversions->last)->resultType = dest;
14067 dest->refCount++;
14068 }
14069 FreeType(sourceExp->expType);
14070 sourceExp->expType = MkClassType(_class->fullName);
14071 sourceExp->expType->truth = source->truth;
14072 sourceExp->expType->classObjectType = source->classObjectType;
14073 if(!sourceExp->destType)
14074 {
14075 FreeType(sourceExp->destType);
14076 sourceExp->destType = sourceExp->expType;
14077 if(sourceExp->expType)
14078 sourceExp->expType->refCount++;
14079 }
14080 if(!_class->dataType)
14081 _class->dataType = ProcessTypeString(_class->dataTypeString, 0);
14082 FreeType(dest);
14083 dest = MkClassType(source->__anon1._class->string);
14084 dest->truth = source->truth;
14085 dest->classObjectType = source->classObjectType;
14086 FreeType(source);
14087 source = _class->dataType;
14088 source->refCount++;
14089 ((tempType ? __extension__ ({
14090 void * __ecerePtrToDelete = (tempType);
14091
14092 __ecereClass_Type->Destructor ? __ecereClass_Type->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete);
14093 }) : 0), tempType = 0);
14094 }
14095 }
14096 }
14097 if(!flag)
14098 {
14099 if(MatchTypes(source, dest, conversions, (((void *)0)), (((void *)0)), 1, 1, 0, 0, warnConst))
14100 {
14101 FreeType(source);
14102 FreeType(dest);
14103 return 1;
14104 }
14105 }
14106 if(dest->kind == 8)
14107 {
14108 struct __ecereNameSpace__ecere__com__Class * _class = dest->__anon1._class ? dest->__anon1._class->__anon1.registered : (((void *)0));
14109 unsigned int fittingValue = 0;
14110
14111 if(_class && _class->type == 4)
14112 {
14113 struct __ecereNameSpace__ecere__com__Class * enumClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "enum");
14114 struct __ecereNameSpace__ecere__com__EnumClassData * c = (_class ? ((void *)(((char *)_class->data) + enumClass->offsetClass)) : (((void *)0)));
14115
14116 if(c && value >= 0 && value <= c->largest)
14117 fittingValue = 1;
14118 }
14119 if(_class && !dest->truth && (_class->type == 3 || fittingValue || (_class->type != 1 && !value && source->kind == 3) || _class->type == 2))
14120 {
14121 if(_class->type == 0 || _class->type == 5)
14122 {
14123 struct Expression * newExp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression);
14124
14125 *newExp = *sourceExp;
14126 if(sourceExp->destType)
14127 sourceExp->destType->refCount++;
14128 if(sourceExp->expType)
14129 sourceExp->expType->refCount++;
14130 sourceExp->type = 11;
14131 sourceExp->__anon1.cast.typeName = MkTypeName(MkListOne(MkSpecifier(VOID)), MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), (((void *)0))));
14132 sourceExp->__anon1.cast.exp = newExp;
14133 FreeType(sourceExp->expType);
14134 sourceExp->expType = (((void *)0));
14135 ProcessExpressionType(sourceExp);
14136 if(!inCompiler)
14137 {
14138 FreeType(sourceExp->expType);
14139 sourceExp->expType = dest;
14140 }
14141 FreeType(source);
14142 if(inCompiler)
14143 FreeType(dest);
14144 if(backupSourceExpType)
14145 FreeType(backupSourceExpType);
14146 return 1;
14147 }
14148 if(!_class->dataType)
14149 _class->dataType = ProcessTypeString(_class->dataTypeString, 0);
14150 FreeType(dest);
14151 dest = _class->dataType;
14152 dest->refCount++;
14153 }
14154 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))
14155 {
14156 specs = MkListOne(MkSpecifier(DOUBLE));
14157 }
14158 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))
14159 {
14160 specs = MkListOne(MkSpecifier(FLOAT));
14161 }
14162 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))
14163 {
14164 specs = MkList();
14165 if(!dest->isSigned)
14166 ListAdd(specs, MkSpecifier(UNSIGNED));
14167 ListAdd(specs, MkSpecifier(INT64));
14168 }
14169 else if(dest->kind == 3 && (source->kind == 3 || source->kind == 2 || source->kind == 1 || source->kind == 24 || source->kind == 6 || source->kind == 7))
14170 {
14171 specs = MkList();
14172 if(!dest->isSigned)
14173 ListAdd(specs, MkSpecifier(UNSIGNED));
14174 ListAdd(specs, MkSpecifier(INT));
14175 }
14176 else if(dest->kind == 2 && (source->kind == 2 || source->kind == 1 || source->kind == 24 || source->kind == 3 || source->kind == 6 || source->kind == 7))
14177 {
14178 specs = MkList();
14179 if(!dest->isSigned)
14180 ListAdd(specs, MkSpecifier(UNSIGNED));
14181 ListAdd(specs, MkSpecifier(SHORT));
14182 }
14183 else if(dest->kind == 1 && (source->kind == 1 || source->kind == 24 || source->kind == 2 || source->kind == 3 || source->kind == 6 || source->kind == 7))
14184 {
14185 specs = MkList();
14186 if(!dest->isSigned)
14187 ListAdd(specs, MkSpecifier(UNSIGNED));
14188 ListAdd(specs, MkSpecifier(CHAR));
14189 }
14190 else
14191 {
14192 FreeType(source);
14193 FreeType(dest);
14194 if(backupSourceExpType)
14195 {
14196 if(sourceExp->expType)
14197 FreeType(sourceExp->expType);
14198 sourceExp->expType = backupSourceExpType;
14199 }
14200 return 0;
14201 }
14202 }
14203 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))
14204 {
14205 specs = MkListOne(MkSpecifier(DOUBLE));
14206 }
14207 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))
14208 {
14209 specs = MkListOne(MkSpecifier(FLOAT));
14210 }
14211 else if(dest->kind == 24 && (source->kind == 24 || source->kind == 1 || source->kind == 15 || source->kind == 2 || source->kind == 3) && (value == 1 || value == 0))
14212 {
14213 specs = MkList();
14214 ListAdd(specs, MkSpecifier(BOOL));
14215 }
14216 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)))
14217 {
14218 if(source->kind == 3)
14219 {
14220 FreeType(dest);
14221 FreeType(source);
14222 if(backupSourceExpType)
14223 FreeType(backupSourceExpType);
14224 return 1;
14225 }
14226 else
14227 {
14228 specs = MkList();
14229 if(!dest->isSigned)
14230 ListAdd(specs, MkSpecifier(UNSIGNED));
14231 ListAdd(specs, MkSpecifier(CHAR));
14232 }
14233 }
14234 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)))))
14235 {
14236 if(source->kind == 3)
14237 {
14238 FreeType(dest);
14239 FreeType(source);
14240 if(backupSourceExpType)
14241 FreeType(backupSourceExpType);
14242 return 1;
14243 }
14244 else
14245 {
14246 specs = MkList();
14247 if(!dest->isSigned)
14248 ListAdd(specs, MkSpecifier(UNSIGNED));
14249 ListAdd(specs, MkSpecifier(SHORT));
14250 }
14251 }
14252 else if(dest->kind == 3 && (source->kind == 15 || source->kind == 2 || source->kind == 24 || source->kind == 1 || source->kind == 3))
14253 {
14254 specs = MkList();
14255 if(!dest->isSigned)
14256 ListAdd(specs, MkSpecifier(UNSIGNED));
14257 ListAdd(specs, MkSpecifier(INT));
14258 }
14259 else if(dest->kind == 4 && (source->kind == 15 || source->kind == 2 || source->kind == 24 || source->kind == 1 || source->kind == 3 || source->kind == 4))
14260 {
14261 specs = MkList();
14262 if(!dest->isSigned)
14263 ListAdd(specs, MkSpecifier(UNSIGNED));
14264 ListAdd(specs, MkSpecifier(INT64));
14265 }
14266 else if(dest->kind == 15 && (source->kind == 4 || source->kind == 3 || source->kind == 2 || source->kind == 24 || source->kind == 1))
14267 {
14268 specs = MkListOne(MkEnum(MkIdentifier(dest->__anon1.__anon1.enumName), (((void *)0))));
14269 }
14270 else
14271 {
14272 FreeType(source);
14273 FreeType(dest);
14274 if(backupSourceExpType)
14275 {
14276 if(sourceExp->expType)
14277 FreeType(sourceExp->expType);
14278 sourceExp->expType = backupSourceExpType;
14279 }
14280 return 0;
14281 }
14282 if(!flag && !sourceExp->opDestType)
14283 {
14284 struct Expression * newExp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression);
14285
14286 *newExp = *sourceExp;
14287 newExp->prev = (((void *)0));
14288 newExp->next = (((void *)0));
14289 if(sourceExp->destType)
14290 sourceExp->destType->refCount++;
14291 if(sourceExp->expType)
14292 sourceExp->expType->refCount++;
14293 sourceExp->type = 11;
14294 if(realDest->kind == 8)
14295 {
14296 sourceExp->__anon1.cast.typeName = QMkClass(realDest->__anon1._class->string, (((void *)0)));
14297 FreeList(specs, (void *)(FreeSpecifier));
14298 }
14299 else
14300 sourceExp->__anon1.cast.typeName = MkTypeName(specs, (((void *)0)));
14301 if(newExp->type == 4)
14302 {
14303 sourceExp->__anon1.cast.exp = MkExpBrackets(MkListOne(newExp));
14304 }
14305 else
14306 sourceExp->__anon1.cast.exp = newExp;
14307 FreeType(sourceExp->expType);
14308 sourceExp->expType = (((void *)0));
14309 ProcessExpressionType(sourceExp);
14310 }
14311 else
14312 FreeList(specs, (void *)(FreeSpecifier));
14313 FreeType(dest);
14314 FreeType(source);
14315 if(backupSourceExpType)
14316 FreeType(backupSourceExpType);
14317 return 1;
14318 }
14319 else
14320 {
14321 if(computedExp != nbExp)
14322 {
14323 FreeExpression(computedExp);
14324 computedExp = nbExp;
14325 }
14326 while((sourceExp->type == 5 || sourceExp->type == 32) && sourceExp->__anon1.list)
14327 sourceExp = (*sourceExp->__anon1.list).last;
14328 if(sourceExp->type == 0)
14329 {
14330 struct Identifier * id = sourceExp->__anon1.__anon1.identifier;
14331
14332 if(dest->kind == 8)
14333 {
14334 if(dest->__anon1._class && dest->__anon1._class->__anon1.registered && dest->__anon1._class->__anon1.registered->type == 4)
14335 {
14336 struct __ecereNameSpace__ecere__com__Class * _class = dest->__anon1._class->__anon1.registered;
14337 struct __ecereNameSpace__ecere__com__Class * enumClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "enum");
14338
14339 if(enumClass)
14340 {
14341 for(; _class && _class->type == 4; _class = _class->base)
14342 {
14343 struct __ecereNameSpace__ecere__sys__NamedLink64 * value;
14344 struct __ecereNameSpace__ecere__com__EnumClassData * e = (_class ? ((void *)(((char *)_class->data) + enumClass->offsetClass)) : (((void *)0)));
14345
14346 for(value = e->values.first; value; value = value->next)
14347 {
14348 if(!strcmp(value->name, id->string))
14349 break;
14350 }
14351 if(value)
14352 {
14353 FreeType(sourceExp->expType);
14354 sourceExp->isConstant = 1;
14355 sourceExp->expType = MkClassType(_class->fullName);
14356 if(inCompiler || inPreCompiler || inDebugger)
14357 {
14358 FreeExpContents(sourceExp);
14359 sourceExp->type = 2;
14360 if(_class->dataTypeString && (!strcmp(_class->dataTypeString, "int") || !strcmp(_class->dataTypeString, "int64") || !strcmp(_class->dataTypeString, "short") || !strcmp(_class->dataTypeString, "char")))
14361 sourceExp->__anon1.__anon1.constant = PrintInt64(value->data);
14362 else
14363 sourceExp->__anon1.__anon1.constant = PrintUInt64(value->data);
14364 }
14365 FreeType(dest);
14366 return 1;
14367 }
14368 }
14369 }
14370 }
14371 }
14372 if(dest->classObjectType != 2 && dest->kind == 8 && MatchWithEnums_Module(privateModule, sourceExp, dest, id->string, conversions))
14373 {
14374 FreeType(dest);
14375 return 1;
14376 }
14377 }
14378 FreeType(dest);
14379 }
14380 return 0;
14381 }
14382
14383 static unsigned int CheckExpressionType(struct Expression * exp, struct Type * destType, unsigned int skipUnitBla, unsigned int warnConst)
14384 {
14385 unsigned int result = 1;
14386
14387 if(destType)
14388 {
14389 struct __ecereNameSpace__ecere__sys__OldList converts =
14390 {
14391 0, 0, 0, 0, 0
14392 };
14393 struct Conversion * convert;
14394
14395 if(destType->kind == 0)
14396 return 0;
14397 if(!MatchTypeExpression(exp, destType, &converts, skipUnitBla, warnConst))
14398 result = 0;
14399 if(converts.count)
14400 {
14401 for(convert = converts.first; convert; convert = convert->next)
14402 {
14403 unsigned int empty = !(convert->isGet ? (void *)convert->convert->Get : (void *)convert->convert->Set);
14404
14405 if(!empty)
14406 {
14407 struct Expression * newExp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression);
14408 int objectType = exp->expType ? exp->expType->classObjectType : 0;
14409
14410 *newExp = *exp;
14411 newExp->prev = (((void *)0));
14412 newExp->next = (((void *)0));
14413 newExp->destType = (((void *)0));
14414 if(convert->isGet)
14415 {
14416 exp->type = 8;
14417 exp->addedThis = 1;
14418 exp->__anon1.member.exp = newExp;
14419 FreeType(exp->__anon1.member.exp->expType);
14420 exp->__anon1.member.exp->expType = MkClassType(convert->convert->_class->fullName);
14421 exp->__anon1.member.exp->expType->classObjectType = objectType;
14422 exp->__anon1.member.member = MkIdentifier(convert->convert->dataTypeString);
14423 exp->__anon1.member.memberType = 1;
14424 exp->expType = convert->resultType ? convert->resultType : convert->convert->dataType;
14425 exp->needCast = 1;
14426 if(exp->expType)
14427 exp->expType->refCount++;
14428 ApplyAnyObjectLogic(exp->__anon1.member.exp);
14429 }
14430 else
14431 {
14432 {
14433 exp->type = 8;
14434 exp->addedThis = 1;
14435 exp->__anon1.member.exp = newExp;
14436 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)
14437 {
14438 newExp->byReference = 1;
14439 }
14440 FreeType(exp->__anon1.member.exp->expType);
14441 exp->__anon1.member.exp->expType = (((void *)0));
14442 if(convert->convert->dataType)
14443 {
14444 exp->__anon1.member.exp->expType = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
14445 CopyTypeInto(exp->__anon1.member.exp->expType, convert->convert->dataType);
14446 exp->__anon1.member.exp->expType->refCount = 1;
14447 exp->__anon1.member.exp->expType->classObjectType = objectType;
14448 ApplyAnyObjectLogic(exp->__anon1.member.exp);
14449 }
14450 exp->__anon1.member.member = MkIdentifier(convert->convert->_class->fullName);
14451 exp->__anon1.member.memberType = 4;
14452 exp->expType = convert->resultType ? convert->resultType : MkClassType(convert->convert->_class->fullName);
14453 exp->needCast = 1;
14454 if(convert->resultType)
14455 convert->resultType->refCount++;
14456 }
14457 }
14458 }
14459 else
14460 {
14461 FreeType(exp->expType);
14462 if(convert->isGet)
14463 {
14464 exp->expType = convert->resultType ? convert->resultType : convert->convert->dataType;
14465 if(exp->destType->casted)
14466 exp->needCast = 1;
14467 if(exp->expType)
14468 exp->expType->refCount++;
14469 }
14470 else
14471 {
14472 exp->expType = convert->resultType ? convert->resultType : MkClassType(convert->convert->_class->fullName);
14473 if(exp->destType->casted)
14474 exp->needCast = 1;
14475 if(convert->resultType)
14476 convert->resultType->refCount++;
14477 }
14478 }
14479 }
14480 if(exp->isConstant && inCompiler)
14481 ComputeExpression(exp);
14482 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Free(&converts, (void *)(FreeConvert));
14483 }
14484 if(!result && exp->expType && converts.count)
14485 {
14486 result = MatchTypes(exp->expType, exp->destType, (((void *)0)), (((void *)0)), (((void *)0)), 1, 1, 0, 0, warnConst);
14487 }
14488 if(!result && exp->expType && exp->destType)
14489 {
14490 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))
14491 result = 1;
14492 }
14493 }
14494 return result;
14495 }
14496
14497 static void ProcessFunction(struct FunctionDefinition *  function);
14498
14499 void ProcessInstantiationType(struct Instantiation * inst)
14500 {
14501 yylloc = inst->loc;
14502 if(inst->_class)
14503 {
14504 struct MembersInit * members;
14505 struct Symbol * classSym;
14506 struct __ecereNameSpace__ecere__com__Class * _class;
14507
14508 classSym = inst->_class->__anon1.__anon1.symbol;
14509 _class = classSym ? classSym->__anon1.registered : (((void *)0));
14510 if(!_class || _class->type != 5)
14511 DeclareStruct(curExternal, inst->_class->__anon1.__anon1.name, 0, 1);
14512 afterExternal = afterExternal ? afterExternal : curExternal;
14513 if(inst->exp)
14514 ProcessExpressionType(inst->exp);
14515 inst->isConstant = 1;
14516 if(inst->members)
14517 {
14518 struct __ecereNameSpace__ecere__com__DataMember * curMember = (((void *)0));
14519 struct __ecereNameSpace__ecere__com__Class * curClass = (((void *)0));
14520 struct __ecereNameSpace__ecere__com__DataMember * subMemberStack[256];
14521 int subMemberStackPos = 0;
14522
14523 for(members = (*inst->members).first; members; members = members->next)
14524 {
14525 switch(members->type)
14526 {
14527 case 1:
14528 {
14529 char name[1024];
14530 static unsigned int instMethodID = 0;
14531 struct External * external = curExternal;
14532 struct Context * context = curContext;
14533 struct Declarator * declarator = members->__anon1.function->declarator;
14534 struct Identifier * nameID = GetDeclId(declarator);
14535 char * unmangled = nameID ? nameID->string : (((void *)0));
14536 struct Expression * exp;
14537 struct External * createdExternal = (((void *)0));
14538
14539 if(inCompiler)
14540 {
14541 char number[16];
14542
14543 strcpy(name, "__ecereInstMeth_");
14544 FullClassNameCat(name, _class ? _class->fullName : "_UNKNOWNCLASS", 0);
14545 strcat(name, "_");
14546 strcat(name, nameID->string);
14547 strcat(name, "_");
14548 sprintf(number, "_%08d", instMethodID++);
14549 strcat(name, number);
14550 nameID->string = __ecereNameSpace__ecere__sys__CopyString(name);
14551 }
14552 if(declarator)
14553 {
14554 struct Symbol * symbol = declarator->symbol;
14555 struct __ecereNameSpace__ecere__com__Method * method = __ecereNameSpace__ecere__com__eClass_FindMethod(_class, unmangled, privateModule);
14556
14557 if(method && method->type == 1)
14558 {
14559 symbol->__anon1.method = method;
14560 ProcessMethodType(method);
14561 if(!symbol->type->__anon1.__anon2.thisClass)
14562 {
14563 if(method->dataType->__anon1.__anon2.thisClass && currentClass && __ecereNameSpace__ecere__com__eClass_IsDerived(currentClass, method->dataType->__anon1.__anon2.thisClass->__anon1.registered))
14564 {
14565 if(!currentClass->symbol)
14566 currentClass->symbol = FindClass(currentClass->fullName);
14567 symbol->type->__anon1.__anon2.thisClass = currentClass->symbol;
14568 }
14569 else
14570 {
14571 if(!_class->symbol)
14572 _class->symbol = FindClass(_class->fullName);
14573 symbol->type->__anon1.__anon2.thisClass = _class->symbol;
14574 }
14575 }
14576 DeclareType(curExternal, symbol->type, 1, 1);
14577 }
14578 else if(classSym)
14579 {
14580 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "couldn't find virtual method %s in class %s\n", (((void *)0))), unmangled, classSym->string);
14581 }
14582 }
14583 createdExternal = ProcessClassFunction(classSym ? classSym->__anon1.registered : (((void *)0)), members->__anon1.function, ast, afterExternal, 1);
14584 if(nameID)
14585 {
14586 FreeSpecifier(nameID->_class);
14587 nameID->_class = (((void *)0));
14588 }
14589 curExternal = createdExternal;
14590 if(inCompiler)
14591 {
14592 if(createdExternal->__anon1.function)
14593 ProcessFunction(createdExternal->__anon1.function);
14594 }
14595 else if(declarator)
14596 {
14597 curExternal = declarator->symbol->__anon2.__anon1.pointerExternal;
14598 ProcessFunction((struct FunctionDefinition *)members->__anon1.function);
14599 }
14600 curExternal = external;
14601 curContext = context;
14602 if(inCompiler)
14603 {
14604 FreeClassFunction(members->__anon1.function);
14605 exp = QMkExpId(name);
14606 members->type = 0;
14607 members->__anon1.dataMembers = MkListOne(MkMemberInit(MkListOne(MkIdentifier(unmangled)), MkInitializerAssignment(exp)));
14608 (__ecereNameSpace__ecere__com__eSystem_Delete(unmangled), unmangled = 0);
14609 }
14610 break;
14611 }
14612 case 0:
14613 {
14614 if(members->__anon1.dataMembers && classSym)
14615 {
14616 struct MemberInit * member;
14617 struct Location oldyyloc = yylloc;
14618
14619 for(member = (*members->__anon1.dataMembers).first; member; member = member->next)
14620 {
14621 ProcessMemberInitData(member, classSym->__anon1.registered, &curClass, &curMember, subMemberStack, &subMemberStackPos);
14622 if(member->initializer && !member->initializer->isConstant)
14623 inst->isConstant = 0;
14624 }
14625 yylloc = oldyyloc;
14626 }
14627 break;
14628 }
14629 }
14630 }
14631 }
14632 }
14633 }
14634
14635 static void ProcessClass(struct __ecereNameSpace__ecere__sys__OldList *  definitions, struct Symbol *  symbol);
14636
14637 static void ProcessSpecifier(struct Specifier * spec, unsigned int declareStruct, unsigned int warnClasses)
14638 {
14639 switch(spec->type)
14640 {
14641 case 0:
14642 {
14643 if(spec->__anon1.specifier == THISCLASS)
14644 {
14645 if(thisClass)
14646 {
14647 spec->type = 1;
14648 spec->__anon1.__anon1.name = ReplaceThisClass(thisClass);
14649 spec->__anon1.__anon1.symbol = FindClass(spec->__anon1.__anon1.name);
14650 ProcessSpecifier(spec, declareStruct, 0);
14651 }
14652 }
14653 break;
14654 }
14655 case 1:
14656 {
14657 struct Symbol * symbol = FindType(curContext, spec->__anon1.__anon1.name);
14658
14659 if(symbol)
14660 DeclareType(curExternal, symbol->type, 1, 1);
14661 else if(spec->__anon1.__anon1.symbol)
14662 {
14663 struct __ecereNameSpace__ecere__com__Class * c = spec->__anon1.__anon1.symbol->__anon1.registered;
14664
14665 if(warnClasses && !c)
14666 Compiler_Warning("Undeclared class %s\n", spec->__anon1.__anon1.name);
14667 DeclareStruct(curExternal, spec->__anon1.__anon1.name, c && c->type == 5, declareStruct && c && c->type == 1);
14668 }
14669 break;
14670 }
14671 case 2:
14672 {
14673 struct Enumerator * e;
14674
14675 if(spec->__anon1.__anon2.list)
14676 {
14677 for(e = (*spec->__anon1.__anon2.list).first; e; e = e->next)
14678 {
14679 if(e->exp)
14680 ProcessExpressionType(e->exp);
14681 }
14682 }
14683 if(inCompiler)
14684 break;
14685 }
14686 case 3:
14687 case 4:
14688 {
14689 if(spec->__anon1.__anon2.definitions)
14690 {
14691 struct Symbol * symbol = spec->__anon1.__anon2.id ? FindClass(spec->__anon1.__anon2.id->string) : (((void *)0));
14692
14693 ProcessClass(spec->__anon1.__anon2.definitions, symbol);
14694 }
14695 break;
14696 }
14697 }
14698 }
14699
14700 static void ProcessDeclarator(struct Declarator * decl, unsigned int isFunction)
14701 {
14702 switch(decl->type)
14703 {
14704 case 1:
14705 if(decl->__anon1.identifier->classSym)
14706 {
14707 FreeSpecifier(decl->__anon1.identifier->_class);
14708 decl->__anon1.identifier->_class = (((void *)0));
14709 }
14710 break;
14711 case 3:
14712 if(decl->__anon1.array.exp)
14713 ProcessExpressionType(decl->__anon1.array.exp);
14714 case 0:
14715 case 2:
14716 case 4:
14717 case 5:
14718 case 6:
14719 case 7:
14720 {
14721 struct Identifier * id = (((void *)0));
14722 struct Specifier * classSpec = (((void *)0));
14723
14724 if(decl->type == 4)
14725 {
14726 id = GetDeclId(decl);
14727 if(id && id->_class)
14728 {
14729 classSpec = id->_class;
14730 id->_class = (((void *)0));
14731 }
14732 }
14733 if(decl->declarator)
14734 ProcessDeclarator(decl->declarator, isFunction);
14735 if(decl->type == 4)
14736 {
14737 if(classSpec)
14738 {
14739 struct TypeName * param = (param = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_TypeName), param->qualifiers = MkListOne(classSpec), param->declarator = (((void *)0)), param);
14740
14741 if(!decl->__anon1.function.parameters)
14742 decl->__anon1.function.parameters = MkList();
14743 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*decl->__anon1.function.parameters), (((void *)0)), param);
14744 }
14745 if(decl->__anon1.function.parameters)
14746 {
14747 struct TypeName * param;
14748
14749 for(param = (*decl->__anon1.function.parameters).first; param; param = param->next)
14750 {
14751 if(param->qualifiers)
14752 {
14753 struct Specifier * spec;
14754
14755 for(spec = (*param->qualifiers).first; spec; spec = spec->next)
14756 {
14757 if(spec->type == 0)
14758 {
14759 if(spec->__anon1.specifier == TYPED_OBJECT)
14760 {
14761 struct Declarator * d = param->declarator;
14762 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);
14763
14764 if(!d || d->type != 5)
14765 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*newParam->qualifiers), (((void *)0)), MkSpecifier(CONST));
14766 FreeList(param->qualifiers, (void *)(FreeSpecifier));
14767 param->qualifiers = MkListOne(MkStructOrUnion(3, MkIdentifier("__ecereNameSpace__ecere__com__Class"), (((void *)0))));
14768 param->declarator = MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), MkDeclaratorIdentifier(MkIdentifier("class")));
14769 DeclareStruct(curExternal, "ecere::com::Class", 0, 1);
14770 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*decl->__anon1.function.parameters), param, newParam);
14771 param = newParam;
14772 break;
14773 }
14774 else if(spec->__anon1.specifier == ANY_OBJECT)
14775 {
14776 struct Declarator * d = param->declarator;
14777
14778 FreeList(param->qualifiers, (void *)(FreeSpecifier));
14779 param->qualifiers = MkListOne(MkSpecifier(VOID));
14780 if(!d || d->type != 5)
14781 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*param->qualifiers), (((void *)0)), MkSpecifier(CONST));
14782 param->declarator = MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), d);
14783 break;
14784 }
14785 else if(spec->__anon1.specifier == THISCLASS)
14786 {
14787 if(thisClass)
14788 {
14789 spec->type = 1;
14790 spec->__anon1.__anon1.name = ReplaceThisClass(thisClass);
14791 spec->__anon1.__anon1.symbol = FindClass(spec->__anon1.__anon1.name);
14792 ProcessSpecifier(spec, 0, 0);
14793 }
14794 break;
14795 }
14796 }
14797 else if(spec->type == 1)
14798 {
14799 ProcessSpecifier(spec, isFunction, 1);
14800 }
14801 else if((spec->type == 3 || spec->type == 4) && !spec->__anon1.__anon2.definitions && spec->__anon1.__anon2.id && spec->__anon1.__anon2.id->string)
14802 {
14803 struct Declarator * d = param->declarator;
14804
14805 if(!d || d->type != 5)
14806 DeclareStruct(curExternal, spec->__anon1.__anon2.id->string, 0, 1);
14807 }
14808 }
14809 }
14810 if(param->declarator)
14811 ProcessDeclarator(param->declarator, 0);
14812 }
14813 }
14814 }
14815 break;
14816 }
14817 }
14818 }
14819
14820 static void ProcessDeclaration(struct Declaration * decl, unsigned int warnClasses)
14821 {
14822 yylloc = decl->loc;
14823 switch(decl->type)
14824 {
14825 case 1:
14826 {
14827 unsigned int declareStruct = 0;
14828
14829 if(decl->__anon1.__anon1.declarators)
14830 {
14831 struct InitDeclarator * d;
14832
14833 for(d = (*decl->__anon1.__anon1.declarators).first; d; d = d->next)
14834 {
14835 struct Type * type, * subType;
14836
14837 ProcessDeclarator(d->declarator, 0);
14838 type = ProcessType(decl->__anon1.__anon1.specifiers, d->declarator);
14839 if(d->initializer)
14840 {
14841 ProcessInitializer(d->initializer, type);
14842 if((*decl->__anon1.__anon1.declarators).count == 1 && d->initializer->type == 0 && d->initializer->__anon1.exp->type == 1)
14843 {
14844 if(type->kind == 8 && type->__anon1._class == d->initializer->__anon1.exp->expType->__anon1._class)
14845 {
14846 struct Instantiation * inst = d->initializer->__anon1.exp->__anon1.instance;
14847
14848 inst->exp = MkExpIdentifier(CopyIdentifier(GetDeclId(d->declarator)));
14849 d->initializer->__anon1.exp->__anon1.instance = (((void *)0));
14850 if(decl->__anon1.__anon1.specifiers)
14851 FreeList(decl->__anon1.__anon1.specifiers, (void *)(FreeSpecifier));
14852 FreeList(decl->__anon1.__anon1.declarators, (void *)(FreeInitDeclarator));
14853 d = (((void *)0));
14854 decl->type = 2;
14855 decl->__anon1.inst = inst;
14856 }
14857 }
14858 }
14859 for(subType = type; subType; )
14860 {
14861 if(subType->kind == 8)
14862 {
14863 declareStruct = 1;
14864 break;
14865 }
14866 else if(subType->kind == 13)
14867 break;
14868 else if(subType->kind == 12)
14869 subType = subType->__anon1.__anon4.arrayType;
14870 else
14871 break;
14872 }
14873 FreeType(type);
14874 if(!d)
14875 break;
14876 }
14877 }
14878 if(decl->__anon1.__anon1.specifiers)
14879 {
14880 struct Specifier * s;
14881
14882 for(s = (*decl->__anon1.__anon1.specifiers).first; s; s = s->next)
14883 {
14884 ProcessSpecifier(s, declareStruct, 1);
14885 }
14886 }
14887 break;
14888 }
14889 case 2:
14890 {
14891 ProcessInstantiationType(decl->__anon1.inst);
14892 break;
14893 }
14894 case 0:
14895 {
14896 struct Specifier * spec;
14897 struct Declarator * d;
14898 unsigned int declareStruct = 0;
14899
14900 if(decl->__anon1.__anon1.declarators)
14901 {
14902 for(d = (*decl->__anon1.__anon1.declarators).first; d; d = d->next)
14903 {
14904 struct Type * type = ProcessType(decl->__anon1.__anon1.specifiers, d->declarator);
14905 struct Type * subType;
14906
14907 ProcessDeclarator(d, 0);
14908 for(subType = type; subType; )
14909 {
14910 if(subType->kind == 8)
14911 {
14912 declareStruct = 1;
14913 break;
14914 }
14915 else if(subType->kind == 13)
14916 break;
14917 else if(subType->kind == 12)
14918 subType = subType->__anon1.__anon4.arrayType;
14919 else
14920 break;
14921 }
14922 FreeType(type);
14923 }
14924 }
14925 if(decl->__anon1.__anon1.specifiers)
14926 {
14927 for(spec = (*decl->__anon1.__anon1.specifiers).first; spec; spec = spec->next)
14928 ProcessSpecifier(spec, declareStruct, warnClasses);
14929 }
14930 break;
14931 }
14932 }
14933 }
14934
14935 static void ProcessStatement(struct Statement * stmt)
14936 {
14937 yylloc = stmt->loc;
14938 switch(stmt->type)
14939 {
14940 case 0:
14941 ProcessStatement(stmt->__anon1.labeled.stmt);
14942 break;
14943 case 1:
14944 if(stmt->__anon1.caseStmt.exp)
14945 {
14946 FreeType(stmt->__anon1.caseStmt.exp->destType);
14947 stmt->__anon1.caseStmt.exp->destType = curSwitchType;
14948 if(curSwitchType)
14949 curSwitchType->refCount++;
14950 ProcessExpressionType(stmt->__anon1.caseStmt.exp);
14951 ComputeExpression(stmt->__anon1.caseStmt.exp);
14952 }
14953 if(stmt->__anon1.caseStmt.stmt)
14954 ProcessStatement(stmt->__anon1.caseStmt.stmt);
14955 break;
14956 case 2:
14957 {
14958 if(stmt->__anon1.compound.context)
14959 {
14960 struct Declaration * decl;
14961 struct Statement * s;
14962 struct Statement * prevCompound = curCompound;
14963 struct Context * prevContext = curContext;
14964
14965 if(!stmt->__anon1.compound.isSwitch)
14966 curCompound = stmt;
14967 curContext = stmt->__anon1.compound.context;
14968 if(stmt->__anon1.compound.declarations)
14969 {
14970 for(decl = (*stmt->__anon1.compound.declarations).first; decl; decl = decl->next)
14971 ProcessDeclaration(decl, 1);
14972 }
14973 if(stmt->__anon1.compound.statements)
14974 {
14975 for(s = (*stmt->__anon1.compound.statements).first; s; s = s->next)
14976 ProcessStatement(s);
14977 }
14978 curContext = prevContext;
14979 curCompound = prevCompound;
14980 }
14981 break;
14982 }
14983 case 3:
14984 {
14985 struct Expression * exp;
14986
14987 if(stmt->__anon1.expressions)
14988 {
14989 for(exp = (*stmt->__anon1.expressions).first; exp; exp = exp->next)
14990 ProcessExpressionType(exp);
14991 }
14992 break;
14993 }
14994 case 4:
14995 {
14996 struct Expression * exp;
14997
14998 FreeType(((struct Expression *)(*stmt->__anon1.ifStmt.exp).last)->destType);
14999 ((struct Expression *)(*stmt->__anon1.ifStmt.exp).last)->destType = MkClassType("bool");
15000 ((struct Expression *)(*stmt->__anon1.ifStmt.exp).last)->destType->truth = 1;
15001 for(exp = (*stmt->__anon1.ifStmt.exp).first; exp; exp = exp->next)
15002 {
15003 ProcessExpressionType(exp);
15004 }
15005 if(stmt->__anon1.ifStmt.stmt)
15006 ProcessStatement(stmt->__anon1.ifStmt.stmt);
15007 if(stmt->__anon1.ifStmt.elseStmt)
15008 ProcessStatement(stmt->__anon1.ifStmt.elseStmt);
15009 break;
15010 }
15011 case 5:
15012 {
15013 struct Type * oldSwitchType = curSwitchType;
15014
15015 if(stmt->__anon1.switchStmt.exp)
15016 {
15017 struct Expression * exp;
15018
15019 for(exp = (*stmt->__anon1.switchStmt.exp).first; exp; exp = exp->next)
15020 {
15021 if(!exp->next)
15022 {
15023 ProcessExpressionType(exp);
15024 }
15025 if(!exp->next)
15026 curSwitchType = exp->expType;
15027 }
15028 }
15029 ProcessStatement(stmt->__anon1.switchStmt.stmt);
15030 curSwitchType = oldSwitchType;
15031 break;
15032 }
15033 case 6:
15034 {
15035 if(stmt->__anon1.whileStmt.exp)
15036 {
15037 struct Expression * exp;
15038
15039 FreeType(((struct Expression *)(*stmt->__anon1.whileStmt.exp).last)->destType);
15040 ((struct Expression *)(*stmt->__anon1.whileStmt.exp).last)->destType = MkClassType("bool");
15041 ((struct Expression *)(*stmt->__anon1.whileStmt.exp).last)->destType->truth = 1;
15042 for(exp = (*stmt->__anon1.whileStmt.exp).first; exp; exp = exp->next)
15043 {
15044 ProcessExpressionType(exp);
15045 }
15046 }
15047 if(stmt->__anon1.whileStmt.stmt)
15048 ProcessStatement(stmt->__anon1.whileStmt.stmt);
15049 break;
15050 }
15051 case 7:
15052 {
15053 if(stmt->__anon1.doWhile.exp)
15054 {
15055 struct Expression * exp;
15056
15057 if((*stmt->__anon1.doWhile.exp).last)
15058 {
15059 FreeType(((struct Expression *)(*stmt->__anon1.doWhile.exp).last)->destType);
15060 ((struct Expression *)(*stmt->__anon1.doWhile.exp).last)->destType = MkClassType("bool");
15061 ((struct Expression *)(*stmt->__anon1.doWhile.exp).last)->destType->truth = 1;
15062 }
15063 for(exp = (*stmt->__anon1.doWhile.exp).first; exp; exp = exp->next)
15064 {
15065 ProcessExpressionType(exp);
15066 }
15067 }
15068 if(stmt->__anon1.doWhile.stmt)
15069 ProcessStatement(stmt->__anon1.doWhile.stmt);
15070 break;
15071 }
15072 case 8:
15073 {
15074 struct Expression * exp;
15075
15076 if(stmt->__anon1.forStmt.init)
15077 ProcessStatement(stmt->__anon1.forStmt.init);
15078 if(stmt->__anon1.forStmt.check && stmt->__anon1.forStmt.check->__anon1.expressions)
15079 {
15080 FreeType(((struct Expression *)(*stmt->__anon1.forStmt.check->__anon1.expressions).last)->destType);
15081 ((struct Expression *)(*stmt->__anon1.forStmt.check->__anon1.expressions).last)->destType = MkClassType("bool");
15082 ((struct Expression *)(*stmt->__anon1.forStmt.check->__anon1.expressions).last)->destType->truth = 1;
15083 }
15084 if(stmt->__anon1.forStmt.check)
15085 ProcessStatement(stmt->__anon1.forStmt.check);
15086 if(stmt->__anon1.forStmt.increment)
15087 {
15088 for(exp = (*stmt->__anon1.forStmt.increment).first; exp; exp = exp->next)
15089 ProcessExpressionType(exp);
15090 }
15091 if(stmt->__anon1.forStmt.stmt)
15092 ProcessStatement(stmt->__anon1.forStmt.stmt);
15093 break;
15094 }
15095 case 18:
15096 {
15097 struct Identifier * id = stmt->__anon1.forEachStmt.id;
15098 struct __ecereNameSpace__ecere__sys__OldList * exp = stmt->__anon1.forEachStmt.exp;
15099 struct __ecereNameSpace__ecere__sys__OldList * filter = stmt->__anon1.forEachStmt.filter;
15100 struct Statement * block = stmt->__anon1.forEachStmt.stmt;
15101 char iteratorType[1024];
15102 struct Type * source;
15103 struct Expression * e;
15104 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));
15105 struct Expression * arrayExp;
15106 const char * typeString = (((void *)0));
15107 int builtinCount = 0;
15108
15109 for(e = exp ? (*exp).first : (((void *)0)); e; e = e->next)
15110 {
15111 if(!e->next)
15112 {
15113 FreeType(e->destType);
15114 e->destType = ProcessTypeString("Container", 0);
15115 }
15116 if(!isBuiltin || e->next)
15117 ProcessExpressionType(e);
15118 }
15119 source = (exp && (*exp).last) ? ((struct Expression *)(*exp).last)->expType : (((void *)0));
15120 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)))
15121 {
15122 struct __ecereNameSpace__ecere__com__Class * _class = source ? source->__anon1._class->__anon1.registered : (((void *)0));
15123 struct Symbol * symbol;
15124 struct Expression * expIt = (((void *)0));
15125 unsigned int isMap = 0, isArray = 0, isLinkList = 0, isList = 0, isCustomAVLTree = 0;
15126 struct __ecereNameSpace__ecere__com__Class * arrayClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "Array");
15127 struct __ecereNameSpace__ecere__com__Class * linkListClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "LinkList");
15128 struct __ecereNameSpace__ecere__com__Class * customAVLTreeClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "CustomAVLTree");
15129
15130 if(inCompiler)
15131 {
15132 stmt->type = 2;
15133 stmt->__anon1.compound.context = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Context);
15134 stmt->__anon1.compound.context->parent = curContext;
15135 curContext = stmt->__anon1.compound.context;
15136 }
15137 if(source && __ecereNameSpace__ecere__com__eClass_IsDerived(source->__anon1._class->__anon1.registered, customAVLTreeClass))
15138 {
15139 struct __ecereNameSpace__ecere__com__Class * mapClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "Map");
15140
15141 isCustomAVLTree = 1;
15142 if(__ecereNameSpace__ecere__com__eClass_IsDerived(source->__anon1._class->__anon1.registered, mapClass))
15143 isMap = 1;
15144 }
15145 else if(source && __ecereNameSpace__ecere__com__eClass_IsDerived(source->__anon1._class->__anon1.registered, arrayClass))
15146 isArray = 1;
15147 else if(source && __ecereNameSpace__ecere__com__eClass_IsDerived(source->__anon1._class->__anon1.registered, linkListClass))
15148 {
15149 struct __ecereNameSpace__ecere__com__Class * listClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "List");
15150
15151 isLinkList = 1;
15152 isList = __ecereNameSpace__ecere__com__eClass_IsDerived(source->__anon1._class->__anon1.registered, listClass);
15153 }
15154 if(inCompiler && isArray)
15155 {
15156 struct Declarator * decl;
15157 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
15158
15159 decl = SpecDeclFromString(_class->templateArgs[2].__anon1.__anon1.dataTypeString, specs, MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), MkDeclaratorIdentifier(id)));
15160 stmt->__anon1.compound.declarations = MkListOne(MkDeclaration(specs, MkListOne(MkInitDeclarator(decl, (((void *)0))))));
15161 ListAdd(stmt->__anon1.compound.declarations, MkDeclaration(MkListOne(MkSpecifierName(source->__anon1._class->__anon1.registered->fullName)), MkListOne(MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier("__internalArray")), MkInitializerAssignment(MkExpBrackets(exp))))));
15162 }
15163 else if(isBuiltin)
15164 {
15165 struct Type * type = (((void *)0));
15166 char typeStringBuf[1024];
15167
15168 arrayExp = (((struct Expression *)(*exp).last)->type == 35) ? (struct Expression *)(*exp).last : ((struct Expression *)(*exp).last)->__anon1.cast.exp;
15169 if(((struct Expression *)(*exp).last)->type == 11)
15170 {
15171 struct TypeName * typeName = ((struct Expression *)(*exp).last)->__anon1.cast.typeName;
15172
15173 if(typeName)
15174 arrayExp->destType = ProcessType(typeName->qualifiers, typeName->declarator);
15175 }
15176 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)
15177 {
15178 struct __ecereNameSpace__ecere__com__Class * templateClass = arrayExp->destType->__anon1._class->__anon1.registered;
15179
15180 typeString = templateClass->templateArgs[2].__anon1.__anon1.dataTypeString;
15181 }
15182 else if(arrayExp->__anon1.list)
15183 {
15184 struct Expression * e;
15185
15186 for(e = (*arrayExp->__anon1.list).first; e; e = e->next)
15187 {
15188 ProcessExpressionType(e);
15189 if(e->expType)
15190 {
15191 if(!type)
15192 {
15193 type = e->expType;
15194 type->refCount++;
15195 }
15196 else
15197 {
15198 if(!MatchTypeExpression(e, type, (((void *)0)), 0, 1))
15199 {
15200 FreeType(type);
15201 type = e->expType;
15202 e->expType = (((void *)0));
15203 e = (*arrayExp->__anon1.list).first;
15204 ProcessExpressionType(e);
15205 if(e->expType)
15206 {
15207 if(!MatchTypeExpression(e, type, (((void *)0)), 0, 1))
15208 {
15209 FreeType(e->expType);
15210 e->expType = (((void *)0));
15211 FreeType(type);
15212 type = (((void *)0));
15213 break;
15214 }
15215 }
15216 }
15217 }
15218 if(e->expType)
15219 {
15220 FreeType(e->expType);
15221 e->expType = (((void *)0));
15222 }
15223 }
15224 }
15225 if(type)
15226 {
15227 typeStringBuf[0] = '\0';
15228 PrintType(type, typeStringBuf, 0, 1);
15229 typeString = typeStringBuf;
15230 FreeType(type);
15231 }
15232 }
15233 if(typeString)
15234 {
15235 if(inCompiler)
15236 {
15237 struct __ecereNameSpace__ecere__sys__OldList * initializers = MkList();
15238 struct Declarator * decl;
15239 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
15240
15241 if(arrayExp->__anon1.list)
15242 {
15243 struct Expression * e;
15244
15245 builtinCount = (*arrayExp->__anon1.list).count;
15246 type = ProcessTypeString(typeString, 0);
15247 while((e = (*arrayExp->__anon1.list).first))
15248 {
15249 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove((&*arrayExp->__anon1.list), e);
15250 e->destType = type;
15251 type->refCount++;
15252 ProcessExpressionType(e);
15253 if(inCompiler)
15254 ListAdd(initializers, MkInitializerAssignment(e));
15255 }
15256 FreeType(type);
15257 (__ecereNameSpace__ecere__com__eSystem_Delete(arrayExp->__anon1.list), arrayExp->__anon1.list = 0);
15258 }
15259 decl = SpecDeclFromString(typeString, specs, MkDeclaratorIdentifier(id));
15260 stmt->__anon1.compound.declarations = MkListOne(MkDeclaration(CopyList(specs, (void *)(CopySpecifier)), MkListOne(MkInitDeclarator(MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), decl), (((void *)0))))));
15261 ListAdd(stmt->__anon1.compound.declarations, MkDeclaration(specs, MkListOne(MkInitDeclarator(PlugDeclarator(decl, MkDeclaratorArray(MkDeclaratorIdentifier(MkIdentifier("__internalArray")), (((void *)0)))), MkInitializerList(initializers)))));
15262 FreeList(exp, (void *)(FreeExpression));
15263 }
15264 else if(arrayExp->__anon1.list)
15265 {
15266 struct Expression * e;
15267
15268 type = ProcessTypeString(typeString, 0);
15269 for(e = (*arrayExp->__anon1.list).first; e; e = e->next)
15270 {
15271 e->destType = type;
15272 type->refCount++;
15273 ProcessExpressionType(e);
15274 }
15275 FreeType(type);
15276 }
15277 }
15278 else
15279 {
15280 arrayExp->expType = ProcessTypeString("Container", 0);
15281 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Couldn't determine type of array elements\n", (((void *)0))));
15282 }
15283 }
15284 else if(inCompiler && isLinkList && !isList)
15285 {
15286 struct Declarator * decl;
15287 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
15288
15289 decl = SpecDeclFromString(_class->templateArgs[3].__anon1.__anon1.dataTypeString, specs, MkDeclaratorIdentifier(id));
15290 stmt->__anon1.compound.declarations = MkListOne(MkDeclaration(specs, MkListOne(MkInitDeclarator(decl, (((void *)0))))));
15291 ListAdd(stmt->__anon1.compound.declarations, MkDeclaration(MkListOne(MkSpecifierName(source->__anon1._class->__anon1.registered->fullName)), MkListOne(MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier("__internalLinkList")), MkInitializerAssignment(MkExpBrackets(exp))))));
15292 }
15293 else if(inCompiler && _class->templateArgs)
15294 {
15295 if(isMap)
15296 sprintf(iteratorType, "MapIterator<%s, %s >", _class->templateArgs[5].__anon1.__anon1.dataTypeString, _class->templateArgs[6].__anon1.__anon1.dataTypeString);
15297 else
15298 sprintf(iteratorType, "Iterator<%s, %s >", _class->templateArgs[2].__anon1.__anon1.dataTypeString, _class->templateArgs[1].__anon1.__anon1.dataTypeString);
15299 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)))))))));
15300 }
15301 if(inCompiler)
15302 {
15303 symbol = FindSymbol(id->string, curContext, curContext, 0, 0);
15304 if(block)
15305 {
15306 switch(block->type)
15307 {
15308 case 2:
15309 if(block->__anon1.compound.context)
15310 block->__anon1.compound.context->parent = stmt->__anon1.compound.context;
15311 break;
15312 case 4:
15313 if(block->__anon1.ifStmt.stmt && block->__anon1.ifStmt.stmt->type == 2 && block->__anon1.ifStmt.stmt->__anon1.compound.context)
15314 block->__anon1.ifStmt.stmt->__anon1.compound.context->parent = stmt->__anon1.compound.context;
15315 if(block->__anon1.ifStmt.elseStmt && block->__anon1.ifStmt.elseStmt->type == 2 && block->__anon1.ifStmt.elseStmt->__anon1.compound.context)
15316 block->__anon1.ifStmt.elseStmt->__anon1.compound.context->parent = stmt->__anon1.compound.context;
15317 break;
15318 case 5:
15319 if(block->__anon1.switchStmt.stmt && block->__anon1.switchStmt.stmt->type == 2 && block->__anon1.switchStmt.stmt->__anon1.compound.context)
15320 block->__anon1.switchStmt.stmt->__anon1.compound.context->parent = stmt->__anon1.compound.context;
15321 break;
15322 case 6:
15323 if(block->__anon1.whileStmt.stmt && block->__anon1.whileStmt.stmt->type == 2 && block->__anon1.whileStmt.stmt->__anon1.compound.context)
15324 block->__anon1.whileStmt.stmt->__anon1.compound.context->parent = stmt->__anon1.compound.context;
15325 break;
15326 case 7:
15327 if(block->__anon1.doWhile.stmt && block->__anon1.doWhile.stmt->type == 2 && block->__anon1.doWhile.stmt->__anon1.compound.context)
15328 block->__anon1.doWhile.stmt->__anon1.compound.context->parent = stmt->__anon1.compound.context;
15329 break;
15330 case 8:
15331 if(block->__anon1.forStmt.stmt && block->__anon1.forStmt.stmt->type == 2 && block->__anon1.forStmt.stmt->__anon1.compound.context)
15332 block->__anon1.forStmt.stmt->__anon1.compound.context->parent = stmt->__anon1.compound.context;
15333 break;
15334 case 18:
15335 if(block->__anon1.forEachStmt.stmt && block->__anon1.forEachStmt.stmt->type == 2 && block->__anon1.forEachStmt.stmt->__anon1.compound.context)
15336 block->__anon1.forEachStmt.stmt->__anon1.compound.context->parent = stmt->__anon1.compound.context;
15337 break;
15338 }
15339 }
15340 if(filter)
15341 {
15342 block = MkIfStmt(filter, block, (((void *)0)));
15343 }
15344 if(isArray)
15345 {
15346 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));
15347 ProcessStatement(((struct Statement *)(*stmt->__anon1.compound.statements).first)->__anon1.forStmt.init);
15348 ProcessStatement(((struct Statement *)(*stmt->__anon1.compound.statements).first)->__anon1.forStmt.check);
15349 ProcessExpressionType((*((struct Statement *)(*stmt->__anon1.compound.statements).first)->__anon1.forStmt.increment).first);
15350 }
15351 else if(isBuiltin)
15352 {
15353 char count[128];
15354
15355 sprintf(count, "%d", builtinCount);
15356 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));
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 if(isLinkList && !isList)
15362 {
15363 struct __ecereNameSpace__ecere__com__Class * typeClass = __ecereNameSpace__ecere__com__eSystem_FindClass(_class->module, _class->templateArgs[3].__anon1.__anon1.dataTypeString);
15364 struct __ecereNameSpace__ecere__com__Class * listItemClass = __ecereNameSpace__ecere__com__eSystem_FindClass(_class->module, "ListItem");
15365
15366 if(typeClass && __ecereNameSpace__ecere__com__eClass_IsDerived(typeClass, listItemClass) && _class->templateArgs[5].__anon1.__anon1.dataTypeString && !strcmp(_class->templateArgs[5].__anon1.__anon1.dataTypeString, "LT::link"))
15367 {
15368 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));
15369 }
15370 else
15371 {
15372 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
15373 struct Declarator * decl = SpecDeclFromString(_class->templateArgs[3].__anon1.__anon1.dataTypeString, specs, (((void *)0)));
15374
15375 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));
15376 }
15377 ProcessStatement(((struct Statement *)(*stmt->__anon1.compound.statements).first)->__anon1.forStmt.init);
15378 ProcessStatement(((struct Statement *)(*stmt->__anon1.compound.statements).first)->__anon1.forStmt.check);
15379 ProcessExpressionType((*((struct Statement *)(*stmt->__anon1.compound.statements).first)->__anon1.forStmt.increment).first);
15380 }
15381 else
15382 {
15383 stmt->__anon1.compound.statements = MkListOne(MkWhileStmt(MkListOne(MkExpCall(MkExpMember(expIt = MkExpIdentifier(CopyIdentifier(id)), MkIdentifier("Next")), (((void *)0)))), block));
15384 }
15385 ProcessExpressionType(expIt);
15386 if((*stmt->__anon1.compound.declarations).first)
15387 ProcessDeclaration((*stmt->__anon1.compound.declarations).first, 1);
15388 if(symbol)
15389 symbol->isIterator = isMap ? 2 : ((isArray || isBuiltin) ? 3 : (isLinkList ? (isList ? 5 : 4) : (isCustomAVLTree ? 6 : 1)));
15390 ProcessStatement(stmt);
15391 }
15392 else
15393 ProcessStatement(stmt->__anon1.forEachStmt.stmt);
15394 if(inCompiler)
15395 curContext = stmt->__anon1.compound.context->parent;
15396 break;
15397 }
15398 else
15399 {
15400 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Expression is not a container\n", (((void *)0))));
15401 }
15402 break;
15403 }
15404 case 9:
15405 break;
15406 case 10:
15407 break;
15408 case 11:
15409 break;
15410 case 12:
15411 {
15412 struct Expression * exp;
15413
15414 if(stmt->__anon1.expressions)
15415 {
15416 for(exp = (*stmt->__anon1.expressions).first; exp; exp = exp->next)
15417 {
15418 if(!exp->next)
15419 {
15420 if(curFunction && !curFunction->type)
15421 curFunction->type = ProcessType(curFunction->specifiers, curFunction->declarator);
15422 FreeType(exp->destType);
15423 exp->destType = (curFunction && curFunction->type && curFunction->type->kind == 11) ? curFunction->type->__anon1.__anon2.returnType : (((void *)0));
15424 if(exp->destType)
15425 exp->destType->refCount++;
15426 }
15427 ProcessExpressionType(exp);
15428 }
15429 }
15430 break;
15431 }
15432 case 14:
15433 {
15434 ProcessDeclaration(stmt->__anon1.decl, 1);
15435 break;
15436 }
15437 case 13:
15438 {
15439 struct AsmField * field;
15440
15441 if(stmt->__anon1.asmStmt.inputFields)
15442 {
15443 for(field = (*stmt->__anon1.asmStmt.inputFields).first; field; field = field->next)
15444 if(field->expression)
15445 ProcessExpressionType(field->expression);
15446 }
15447 if(stmt->__anon1.asmStmt.outputFields)
15448 {
15449 for(field = (*stmt->__anon1.asmStmt.outputFields).first; field; field = field->next)
15450 if(field->expression)
15451 ProcessExpressionType(field->expression);
15452 }
15453 if(stmt->__anon1.asmStmt.clobberedFields)
15454 {
15455 for(field = (*stmt->__anon1.asmStmt.clobberedFields).first; field; field = field->next)
15456 {
15457 if(field->expression)
15458 ProcessExpressionType(field->expression);
15459 }
15460 }
15461 break;
15462 }
15463 case 17:
15464 {
15465 struct PropertyWatch * propWatch;
15466 struct __ecereNameSpace__ecere__sys__OldList * watches = stmt->__anon1._watch.watches;
15467 struct Expression * object = stmt->__anon1._watch.object;
15468 struct Expression * watcher = stmt->__anon1._watch.watcher;
15469
15470 if(watcher)
15471 ProcessExpressionType(watcher);
15472 if(object)
15473 ProcessExpressionType(object);
15474 if(inCompiler)
15475 {
15476 if(watcher || thisClass)
15477 {
15478 struct External * external = curExternal;
15479 struct Context * context = curContext;
15480
15481 stmt->type = 3;
15482 stmt->__anon1.expressions = MkList();
15483 for(propWatch = (*watches).first; propWatch; propWatch = propWatch->next)
15484 {
15485 struct ClassFunction * func;
15486 char watcherName[1024];
15487 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;
15488 struct External * createdExternal;
15489
15490 sprintf(watcherName, "__ecerePropertyWatcher_%d", propWatcherID++);
15491 if(propWatch->deleteWatch)
15492 strcat(watcherName, "_delete");
15493 else
15494 {
15495 struct Identifier * propID;
15496
15497 for(propID = (*propWatch->properties).first; propID; propID = propID->next)
15498 {
15499 strcat(watcherName, "_");
15500 strcat(watcherName, propID->string);
15501 }
15502 }
15503 if(object && object->expType && object->expType->kind == 8 && object->expType->__anon1._class && object->expType->__anon1._class->__anon1.registered)
15504 {
15505 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)));
15506 ProcessClassFunctionBody(func, propWatch->compound);
15507 propWatch->compound = (((void *)0));
15508 createdExternal = ProcessClassFunction(watcherClass, func, ast, curExternal, 1);
15509 FreeClassFunction(func);
15510 curExternal = createdExternal;
15511 ProcessFunction(createdExternal->__anon1.function);
15512 if(propWatch->deleteWatch)
15513 {
15514 struct __ecereNameSpace__ecere__sys__OldList * args = MkList();
15515
15516 ListAdd(args, CopyExpression(object));
15517 ListAdd(args, watcher ? CopyExpression(watcher) : MkExpIdentifier(MkIdentifier("this")));
15518 ListAdd(args, MkExpIdentifier(MkIdentifier(watcherName)));
15519 ListAdd(stmt->__anon1.expressions, MkExpCall(MkExpIdentifier(MkIdentifier("ecere::com::eInstance_WatchDestruction")), args));
15520 }
15521 else
15522 {
15523 struct __ecereNameSpace__ecere__com__Class * _class = object->expType->__anon1._class->__anon1.registered;
15524 struct Identifier * propID;
15525
15526 for(propID = (*propWatch->properties).first; propID; propID = propID->next)
15527 {
15528 char propName[1024];
15529 struct __ecereNameSpace__ecere__com__Property * prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, propID->string, privateModule);
15530
15531 if(prop)
15532 {
15533 char getName[1024], setName[1024];
15534 struct __ecereNameSpace__ecere__sys__OldList * args = MkList();
15535
15536 DeclareProperty(createdExternal, prop, setName, getName);
15537 strcpy(propName, "__ecereProp_");
15538 FullClassNameCat(propName, prop->_class->fullName, 0);
15539 strcat(propName, "_");
15540 FullClassNameCat(propName, prop->name, 1);
15541 ListAdd(args, CopyExpression(object));
15542 ListAdd(args, MkExpIdentifier(MkIdentifier(propName)));
15543 ListAdd(args, watcher ? CopyExpression(watcher) : MkExpIdentifier(MkIdentifier("this")));
15544 ListAdd(args, MkExpCast(MkTypeName(MkListOne(MkSpecifier(VOID)), MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), (((void *)0)))), MkExpIdentifier(MkIdentifier(watcherName))));
15545 ListAdd(stmt->__anon1.expressions, MkExpCall(MkExpIdentifier(MkIdentifier("ecere::com::eInstance_Watch")), args));
15546 __ecereMethod_External_CreateUniqueEdge(external, createdExternal, 1);
15547 }
15548 else
15549 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Property %s not found in class %s\n", (((void *)0))), propID->string, _class->fullName);
15550 }
15551 }
15552 }
15553 else
15554 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Invalid watched object\n", (((void *)0))));
15555 }
15556 curExternal = external;
15557 curContext = context;
15558 if(watcher)
15559 FreeExpression(watcher);
15560 if(object)
15561 FreeExpression(object);
15562 FreeList(watches, (void *)(FreePropertyWatch));
15563 }
15564 else
15565 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "No observer specified and not inside a class\n", (((void *)0))));
15566 }
15567 else
15568 {
15569 for(propWatch = (*watches).first; propWatch; propWatch = propWatch->next)
15570 {
15571 ProcessStatement(propWatch->compound);
15572 }
15573 }
15574 break;
15575 }
15576 case 15:
15577 {
15578 struct __ecereNameSpace__ecere__sys__OldList * watches = stmt->__anon1._watch.watches;
15579 struct Expression * object = stmt->__anon1._watch.object;
15580 struct __ecereNameSpace__ecere__com__Class * _class;
15581
15582 if(object)
15583 ProcessExpressionType(object);
15584 if(inCompiler)
15585 {
15586 _class = object ? ((object->expType && object->expType->kind == 8 && object->expType->__anon1._class) ? object->expType->__anon1._class->__anon1.registered : (((void *)0))) : thisClass;
15587 if(_class)
15588 {
15589 struct Identifier * propID;
15590
15591 stmt->type = 3;
15592 stmt->__anon1.expressions = MkList();
15593 if(!watches && curFunction->propSet && (!object || (object->type == 0 && !strcmp(object->__anon1.__anon1.identifier->string, "this"))))
15594 {
15595 watches = MkListOne(MkIdentifier(curFunction->propSet->string));
15596 }
15597 else if(!watches)
15598 {
15599 }
15600 if(watches)
15601 {
15602 for(propID = (*watches).first; propID; propID = propID->next)
15603 {
15604 struct __ecereNameSpace__ecere__com__Property * prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, propID->string, privateModule);
15605
15606 if(prop)
15607 {
15608 CreateFireWatcher(prop, object, stmt);
15609 }
15610 else
15611 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Property %s not found in class %s\n", (((void *)0))), propID->string, _class->fullName);
15612 }
15613 }
15614 else
15615 {
15616 struct __ecereNameSpace__ecere__com__Property * prop;
15617 struct __ecereNameSpace__ecere__com__Class * base;
15618
15619 for(base = _class; base; base = base->base)
15620 {
15621 for(prop = base->membersAndProperties.first; prop; prop = prop->next)
15622 {
15623 if(prop->isProperty && prop->isWatchable)
15624 {
15625 CreateFireWatcher(prop, object, stmt);
15626 }
15627 }
15628 }
15629 }
15630 if(object)
15631 FreeExpression(object);
15632 FreeList(watches, (void *)(FreeIdentifier));
15633 }
15634 else
15635 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Invalid object specified and not inside a class\n", (((void *)0))));
15636 }
15637 break;
15638 }
15639 case 16:
15640 {
15641 struct __ecereNameSpace__ecere__sys__OldList * watches = stmt->__anon1._watch.watches;
15642 struct Expression * object = stmt->__anon1._watch.object;
15643 struct Expression * watcher = stmt->__anon1._watch.watcher;
15644 struct __ecereNameSpace__ecere__com__Class * _class;
15645
15646 if(object)
15647 ProcessExpressionType(object);
15648 if(watcher)
15649 ProcessExpressionType(watcher);
15650 if(inCompiler)
15651 {
15652 _class = (object && object->expType && object->expType->kind == 8 && object->expType->__anon1._class) ? object->expType->__anon1._class->__anon1.registered : (((void *)0));
15653 if(watcher || thisClass)
15654 {
15655 if(_class)
15656 {
15657 struct Identifier * propID;
15658
15659 stmt->type = 3;
15660 stmt->__anon1.expressions = MkList();
15661 if(!watches)
15662 {
15663 struct __ecereNameSpace__ecere__sys__OldList * args;
15664
15665 args = MkList();
15666 ListAdd(args, CopyExpression(object));
15667 ListAdd(args, MkExpConstant("0"));
15668 ListAdd(args, watcher ? CopyExpression(watcher) : MkExpIdentifier(MkIdentifier("this")));
15669 ListAdd(stmt->__anon1.expressions, MkExpCall(MkExpIdentifier(MkIdentifier("ecere::com::eInstance_StopWatching")), args));
15670 }
15671 else
15672 {
15673 for(propID = (*watches).first; propID; propID = propID->next)
15674 {
15675 char propName[1024];
15676 struct __ecereNameSpace__ecere__com__Property * prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, propID->string, privateModule);
15677
15678 if(prop)
15679 {
15680 char getName[1024], setName[1024];
15681 struct __ecereNameSpace__ecere__sys__OldList * args = MkList();
15682
15683 DeclareProperty(curExternal, prop, setName, getName);
15684 strcpy(propName, "__ecereProp_");
15685 FullClassNameCat(propName, prop->_class->fullName, 0);
15686 strcat(propName, "_");
15687 FullClassNameCat(propName, prop->name, 1);
15688 ListAdd(args, CopyExpression(object));
15689 ListAdd(args, MkExpIdentifier(MkIdentifier(propName)));
15690 ListAdd(args, watcher ? CopyExpression(watcher) : MkExpIdentifier(MkIdentifier("this")));
15691 ListAdd(stmt->__anon1.expressions, MkExpCall(MkExpIdentifier(MkIdentifier("ecere::com::eInstance_StopWatching")), args));
15692 }
15693 else
15694 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Property %s not found in class %s\n", (((void *)0))), propID->string, _class->fullName);
15695 }
15696 }
15697 if(object)
15698 FreeExpression(object);
15699 if(watcher)
15700 FreeExpression(watcher);
15701 FreeList(watches, (void *)(FreeIdentifier));
15702 }
15703 else
15704 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Invalid object specified and not inside a class\n", (((void *)0))));
15705 }
15706 else
15707 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "No observer specified and not inside a class\n", (((void *)0))));
15708 }
15709 break;
15710 }
15711 }
15712 }
15713
15714 void ComputeDataTypes()
15715 {
15716 struct External * external;
15717
15718 currentClass = (((void *)0));
15719 containerClass = __ecereNameSpace__ecere__com__eSystem_FindClass(GetPrivateModule(), "Container");
15720 DeclareStruct((((void *)0)), "ecere::com::Class", 0, 1);
15721 DeclareStruct((((void *)0)), "ecere::com::Instance", 0, 1);
15722 DeclareStruct((((void *)0)), "ecere::com::Property", 0, 1);
15723 DeclareStruct((((void *)0)), "ecere::com::DataMember", 0, 1);
15724 DeclareStruct((((void *)0)), "ecere::com::Method", 0, 1);
15725 DeclareStruct((((void *)0)), "ecere::com::SerialBuffer", 0, 1);
15726 DeclareStruct((((void *)0)), "ecere::com::ClassTemplateArgument", 0, 1);
15727 DeclareFunctionUtil((((void *)0)), "eSystem_New");
15728 DeclareFunctionUtil((((void *)0)), "eSystem_New0");
15729 DeclareFunctionUtil((((void *)0)), "eSystem_Renew");
15730 DeclareFunctionUtil((((void *)0)), "eSystem_Renew0");
15731 DeclareFunctionUtil((((void *)0)), "eSystem_Delete");
15732 DeclareFunctionUtil((((void *)0)), "eClass_GetProperty");
15733 DeclareFunctionUtil((((void *)0)), "eClass_SetProperty");
15734 DeclareFunctionUtil((((void *)0)), "eInstance_FireSelfWatchers");
15735 DeclareFunctionUtil((((void *)0)), "eInstance_SetMethod");
15736 DeclareFunctionUtil((((void *)0)), "eInstance_IncRef");
15737 DeclareFunctionUtil((((void *)0)), "eInstance_StopWatching");
15738 DeclareFunctionUtil((((void *)0)), "eInstance_Watch");
15739 DeclareFunctionUtil((((void *)0)), "eInstance_FireWatchers");
15740 reachedPass15 = 1;
15741 for(external = (*ast).first; external; external = external->next)
15742 {
15743 afterExternal = curExternal = external;
15744 if(external->type == 0)
15745 {
15746 if(memoryGuard)
15747 {
15748 DeclareFunctionUtil(external, "MemoryGuard_PushLoc");
15749 DeclareFunctionUtil(external, "MemoryGuard_PopLoc");
15750 }
15751 currentClass = external->__anon1.function->_class;
15752 ProcessFunction(external->__anon1.function);
15753 }
15754 else if(external->type == 1)
15755 {
15756 if(memoryGuard && external->__anon1.declaration && external->__anon1.declaration->type == 2)
15757 {
15758 DeclareFunctionUtil(external, "MemoryGuard_PushLoc");
15759 DeclareFunctionUtil(external, "MemoryGuard_PopLoc");
15760 }
15761 currentClass = (((void *)0));
15762 if(external->__anon1.declaration)
15763 ProcessDeclaration(external->__anon1.declaration, 1);
15764 }
15765 else if(external->type == 2)
15766 {
15767 struct ClassDefinition * _class = external->__anon1._class;
15768
15769 currentClass = external->symbol->__anon1.registered;
15770 if(memoryGuard)
15771 {
15772 DeclareFunctionUtil(external, "MemoryGuard_PushLoc");
15773 DeclareFunctionUtil(external, "MemoryGuard_PopLoc");
15774 }
15775 if(_class->definitions)
15776 {
15777 ProcessClass(_class->definitions, _class->symbol);
15778 }
15779 if(inCompiler)
15780 {
15781 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove((&*ast), external);
15782 ((external ? __extension__ ({
15783 void * __ecerePtrToDelete = (external);
15784
15785 __ecereClass_External->Destructor ? __ecereClass_External->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete);
15786 }) : 0), external = 0);
15787 }
15788 }
15789 else if(external->type == 4)
15790 {
15791 thisNameSpace = external->__anon1.id->string;
15792 }
15793 }
15794 currentClass = (((void *)0));
15795 thisNameSpace = (((void *)0));
15796 curExternal = (((void *)0));
15797 }
15798
15799 void ProcessExpressionType(struct Expression * exp)
15800 {
15801 unsigned int unresolved = 0;
15802 struct Location oldyylloc = yylloc;
15803 unsigned int notByReference = 0;
15804
15805 if(!exp || exp->expType)
15806 return ;
15807 yylloc = exp->loc;
15808 switch(exp->type)
15809 {
15810 case 0:
15811 {
15812 struct Identifier * id = exp->__anon1.__anon1.identifier;
15813
15814 if(!id || !topContext)
15815 return ;
15816 if(id->_class && id->_class->__anon1.__anon1.name)
15817 {
15818 id->classSym = id->_class->__anon1.__anon1.symbol;
15819 }
15820 if(!strcmp(id->string, "__runtimePlatform"))
15821 {
15822 exp->expType = ProcessTypeString("ecere::com::Platform", 1);
15823 break;
15824 }
15825 else if(strstr(id->string, "__ecereClass") == id->string)
15826 {
15827 exp->expType = ProcessTypeString("ecere::com::Class", 1);
15828 break;
15829 }
15830 else if(id->_class && (id->classSym || (id->_class->__anon1.__anon1.name && !strcmp(id->_class->__anon1.__anon1.name, "property"))))
15831 {
15832 ReplaceClassMembers(exp, thisClass);
15833 if(exp->type != 0)
15834 {
15835 ProcessExpressionType(exp);
15836 break;
15837 }
15838 if(id->classSym && ResolveIdWithClass(exp, id->classSym->__anon1.registered, 0))
15839 break;
15840 }
15841 else
15842 {
15843 struct Symbol * symbol = (((void *)0));
15844 unsigned int findInGlobal = 0;
15845
15846 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)
15847 findInGlobal = 1;
15848 else
15849 symbol = FindSymbol(id->string, curContext, topContext, 0, id->_class && id->_class->__anon1.__anon1.name == (((void *)0)));
15850 if(!symbol)
15851 {
15852 if(exp->destType && CheckExpressionType(exp, exp->destType, 0, 0))
15853 break;
15854 else
15855 {
15856 if(thisClass)
15857 {
15858 ReplaceClassMembers(exp, thisClass ? thisClass : currentClass);
15859 if(exp->type != 0)
15860 {
15861 ProcessExpressionType(exp);
15862 break;
15863 }
15864 }
15865 else if(currentClass && !id->_class)
15866 {
15867 if(ResolveIdWithClass(exp, currentClass, 1))
15868 break;
15869 }
15870 symbol = FindSymbol(id->string, topContext->parent, globalContext, 0, id->_class && id->_class->__anon1.__anon1.name == (((void *)0)));
15871 }
15872 }
15873 if(findInGlobal)
15874 symbol = FindSymbol(id->string, curContext, topContext, 0, id->_class && id->_class->__anon1.__anon1.name == (((void *)0)));
15875 if(symbol)
15876 {
15877 struct Type * type = symbol->type;
15878 struct __ecereNameSpace__ecere__com__Class * _class = (type && type->kind == 8 && type->__anon1._class) ? type->__anon1._class->__anon1.registered : (((void *)0));
15879
15880 if(_class && !strcmp(id->string, "this") && !type->classObjectType)
15881 {
15882 struct Context * context = SetupTemplatesContext(_class);
15883
15884 type = ReplaceThisClassType(_class);
15885 FinishTemplatesContext(context);
15886 if(type)
15887 type->refCount = 0;
15888 }
15889 FreeSpecifier(id->_class);
15890 id->_class = (((void *)0));
15891 (__ecereNameSpace__ecere__com__eSystem_Delete(id->string), id->string = 0);
15892 id->string = __ecereNameSpace__ecere__sys__CopyString(symbol->string);
15893 id->classSym = (((void *)0));
15894 exp->expType = type;
15895 if(type)
15896 type->refCount++;
15897 if(type && (type->kind == 15))
15898 exp->isConstant = 1;
15899 if(symbol->isParam || !strcmp(id->string, "this"))
15900 {
15901 if(_class && _class->type == 1 && !type->declaredWithStruct)
15902 exp->byReference = 1;
15903 }
15904 if(symbol->isIterator)
15905 {
15906 if(symbol->isIterator == 3)
15907 {
15908 exp->type = 5;
15909 exp->__anon1.list = MkListOne(MkExpOp((((void *)0)), '*', MkExpIdentifier(exp->__anon1.__anon1.identifier)));
15910 ((struct Expression *)(*exp->__anon1.list).first)->__anon1.op.exp2->expType = exp->expType;
15911 exp->expType = (((void *)0));
15912 ProcessExpressionType(exp);
15913 }
15914 else if(symbol->isIterator != 4)
15915 {
15916 exp->type = 8;
15917 exp->__anon1.member.exp = MkExpIdentifier(exp->__anon1.__anon1.identifier);
15918 exp->__anon1.member.exp->expType = exp->expType;
15919 exp->__anon1.member.member = MkIdentifier("data");
15920 exp->expType = (((void *)0));
15921 ProcessExpressionType(exp);
15922 }
15923 }
15924 break;
15925 }
15926 else
15927 {
15928 struct __ecereNameSpace__ecere__com__DefinedExpression * definedExp = (((void *)0));
15929
15930 if(thisNameSpace && !(id->_class && !id->_class->__anon1.__anon1.name))
15931 {
15932 char name[1024];
15933
15934 strcpy(name, thisNameSpace);
15935 strcat(name, "::");
15936 strcat(name, id->string);
15937 definedExp = __ecereNameSpace__ecere__com__eSystem_FindDefine(privateModule, name);
15938 }
15939 if(!definedExp)
15940 definedExp = __ecereNameSpace__ecere__com__eSystem_FindDefine(privateModule, id->string);
15941 if(definedExp)
15942 {
15943 int c;
15944
15945 for(c = 0; c < definedExpStackPos; c++)
15946 if(definedExpStack[c] == definedExp)
15947 break;
15948 if(c == definedExpStackPos && c < sizeof (definedExpStack) / sizeof(void *))
15949 {
15950 struct Location backupYylloc = yylloc;
15951 struct __ecereNameSpace__ecere__com__Instance * backInput = fileInput;
15952
15953 definedExpStack[definedExpStackPos++] = definedExp;
15954 fileInput = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass___ecereNameSpace__ecere__sys__TempFile);
15955 ((int (*)(struct __ecereNameSpace__ecere__com__Instance *, const void *  buffer, unsigned int size, unsigned int count))__extension__ ({
15956 struct __ecereNameSpace__ecere__com__Instance * __internal_ClassInst = fileInput;
15957
15958 __internal_ClassInst ? __internal_ClassInst->_vTbl : __ecereClass___ecereNameSpace__ecere__sys__File->_vTbl;
15959 })[__ecereVMethodID___ecereNameSpace__ecere__sys__File_Write])(fileInput, definedExp->value, 1, strlen(definedExp->value));
15960 ((unsigned int (*)(struct __ecereNameSpace__ecere__com__Instance *, int pos, int mode))__extension__ ({
15961 struct __ecereNameSpace__ecere__com__Instance * __internal_ClassInst = fileInput;
15962
15963 __internal_ClassInst ? __internal_ClassInst->_vTbl : __ecereClass___ecereNameSpace__ecere__sys__File->_vTbl;
15964 })[__ecereVMethodID___ecereNameSpace__ecere__sys__File_Seek])(fileInput, 0, 0);
15965 echoOn = 0;
15966 parsedExpression = (((void *)0));
15967 resetScanner();
15968 expression_yyparse();
15969 (__ecereNameSpace__ecere__com__eInstance_DecRef(fileInput), fileInput = 0);
15970 if(backInput)
15971 fileInput = backInput;
15972 yylloc = backupYylloc;
15973 if(parsedExpression)
15974 {
15975 FreeIdentifier(id);
15976 exp->type = 5;
15977 exp->__anon1.list = MkListOne(parsedExpression);
15978 ApplyLocation(parsedExpression, &yylloc);
15979 ProcessExpressionType(exp);
15980 definedExpStackPos--;
15981 return ;
15982 }
15983 definedExpStackPos--;
15984 }
15985 else
15986 {
15987 if(inCompiler)
15988 {
15989 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Recursion in defined expression %s\n", (((void *)0))), id->string);
15990 }
15991 }
15992 }
15993 else
15994 {
15995 struct GlobalData * data = (((void *)0));
15996
15997 if(thisNameSpace && !(id->_class && !id->_class->__anon1.__anon1.name))
15998 {
15999 char name[1024];
16000
16001 strcpy(name, thisNameSpace);
16002 strcat(name, "::");
16003 strcat(name, id->string);
16004 data = FindGlobalData(name);
16005 }
16006 if(!data)
16007 data = FindGlobalData(id->string);
16008 if(data)
16009 {
16010 DeclareGlobalData(curExternal, data);
16011 exp->expType = data->dataType;
16012 if(data->dataType)
16013 data->dataType->refCount++;
16014 (__ecereNameSpace__ecere__com__eSystem_Delete(id->string), id->string = 0);
16015 id->string = __ecereNameSpace__ecere__sys__CopyString(data->fullName);
16016 FreeSpecifier(id->_class);
16017 id->_class = (((void *)0));
16018 break;
16019 }
16020 else
16021 {
16022 struct __ecereNameSpace__ecere__com__GlobalFunction * function = (((void *)0));
16023
16024 if(thisNameSpace && !(id->_class && !id->_class->__anon1.__anon1.name))
16025 {
16026 char name[1024];
16027
16028 strcpy(name, thisNameSpace);
16029 strcat(name, "::");
16030 strcat(name, id->string);
16031 function = __ecereNameSpace__ecere__com__eSystem_FindFunction(privateModule, name);
16032 }
16033 if(!function)
16034 function = __ecereNameSpace__ecere__com__eSystem_FindFunction(privateModule, id->string);
16035 if(function)
16036 {
16037 char name[1024];
16038
16039 (__ecereNameSpace__ecere__com__eSystem_Delete(id->string), id->string = 0);
16040 id->string = __ecereNameSpace__ecere__sys__CopyString(function->name);
16041 name[0] = 0;
16042 if(((struct __ecereNameSpace__ecere__com__Module *)(((char *)function->module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->importType != 1 && (!function->dataType || !function->dataType->dllExport))
16043 strcpy(name, "__ecereFunction_");
16044 FullClassNameCat(name, id->string, 0);
16045 if(DeclareFunction(curExternal, function, name))
16046 {
16047 (__ecereNameSpace__ecere__com__eSystem_Delete(id->string), id->string = 0);
16048 id->string = __ecereNameSpace__ecere__sys__CopyString(name);
16049 }
16050 exp->expType = function->dataType;
16051 if(function->dataType)
16052 function->dataType->refCount++;
16053 FreeSpecifier(id->_class);
16054 id->_class = (((void *)0));
16055 break;
16056 }
16057 }
16058 }
16059 }
16060 }
16061 unresolved = 1;
16062 break;
16063 }
16064 case 1:
16065 {
16066 if(!exp->__anon1.instance->_class)
16067 {
16068 if(exp->destType && exp->destType->kind == 8 && exp->destType->__anon1._class)
16069 {
16070 exp->__anon1.instance->_class = MkSpecifierName(exp->destType->__anon1._class->string);
16071 }
16072 }
16073 ProcessInstantiationType(exp->__anon1.instance);
16074 exp->isConstant = exp->__anon1.instance->isConstant;
16075 if(exp->__anon1.instance->_class)
16076 {
16077 exp->expType = MkClassType(exp->__anon1.instance->_class->__anon1.__anon1.name);
16078 }
16079 break;
16080 }
16081 case 2:
16082 {
16083 if(!exp->expType)
16084 {
16085 char * constant = exp->__anon1.__anon1.constant;
16086 struct Type * type = (type = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type), type->refCount = 1, type->constant = 1, type);
16087
16088 exp->expType = type;
16089 if(constant[0] == '\'')
16090 {
16091 if((int)((unsigned char *)constant)[1] > 127)
16092 {
16093 int nb;
16094 unsigned int ch = __ecereNameSpace__ecere__sys__UTF8GetChar(constant + 1, &nb);
16095
16096 if(nb < 2)
16097 ch = constant[1];
16098 (__ecereNameSpace__ecere__com__eSystem_Delete(constant), constant = 0);
16099 exp->__anon1.__anon1.constant = PrintUInt(ch);
16100 type->kind = 8;
16101 type->__anon1._class = FindClass("unichar");
16102 type->isSigned = 0;
16103 }
16104 else
16105 {
16106 type->kind = 1;
16107 type->isSigned = 1;
16108 }
16109 }
16110 else
16111 {
16112 char * dot = strchr(constant, '.');
16113 unsigned int isHex = (constant[0] == '0' && (constant[1] == 'x' || constant[1] == 'X'));
16114 char * exponent;
16115
16116 if(isHex)
16117 {
16118 exponent = strchr(constant, 'p');
16119 if(!exponent)
16120 exponent = strchr(constant, 'P');
16121 }
16122 else
16123 {
16124 exponent = strchr(constant, 'e');
16125 if(!exponent)
16126 exponent = strchr(constant, 'E');
16127 }
16128 if(dot || exponent)
16129 {
16130 if(strchr(constant, 'f') || strchr(constant, 'F'))
16131 type->kind = 6;
16132 else
16133 type->kind = 7;
16134 type->isSigned = 1;
16135 }
16136 else
16137 {
16138 unsigned int isSigned = constant[0] == '-';
16139 char * endP = (((void *)0));
16140 long long i64 = strtoll(constant, &endP, 0);
16141 uint64 ui64 = strtoull(constant, &endP, 0);
16142 unsigned int is64Bit = endP && (!strcmp(endP, "LL") || !strcmp(endP, "ll") || !strcmp(endP, "LLU") || !strcmp(endP, "llu") || !strcmp(endP, "ull") || !strcmp(endP, "ULL"));
16143 unsigned int forceUnsigned = endP && (!strcmp(endP, "U") || !strcmp(endP, "u") || !strcmp(endP, "LLU") || !strcmp(endP, "llu") || !strcmp(endP, "ull") || !strcmp(endP, "ULL"));
16144
16145 if(isSigned)
16146 {
16147 if(i64 < (((int)0x80000000)))
16148 is64Bit = 1;
16149 }
16150 else
16151 {
16152 if(ui64 > (((int)0x7fffffff)))
16153 {
16154 if(ui64 > (0xffffffff))
16155 {
16156 is64Bit = 1;
16157 if(ui64 <= (((long long)0x7fffffffffffffffLL)) && (constant[0] != '0' || !constant[1]))
16158 isSigned = 1;
16159 }
16160 }
16161 else if(constant[0] != '0' || !constant[1])
16162 isSigned = 1;
16163 }
16164 if(forceUnsigned)
16165 isSigned = 0;
16166 type->kind = is64Bit ? 4 : 3;
16167 type->isSigned = isSigned;
16168 }
16169 }
16170 exp->isConstant = 1;
16171 if(exp->destType && exp->destType->kind == 7)
16172 type->kind = 7;
16173 else if(exp->destType && exp->destType->kind == 6)
16174 type->kind = 6;
16175 else if(exp->destType && exp->destType->kind == 4)
16176 type->kind = 4;
16177 }
16178 break;
16179 }
16180 case 3:
16181 {
16182 exp->isConstant = 1;
16183 exp->expType = __extension__ ({
16184 struct Type * __ecereInstance2 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
16185
16186 __ecereInstance2->refCount = 1, __ecereInstance2->kind = 13, __ecereInstance2->__anon1.type = __extension__ ({
16187 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
16188
16189 __ecereInstance1->refCount = 1, __ecereInstance1->kind = exp->__anon1.__anon2.wideString ? 2 : 1, __ecereInstance1->constant = 1, __ecereInstance1->isSigned = exp->__anon1.__anon2.wideString ? 0 : 1, __ecereInstance1;
16190 }), __ecereInstance2;
16191 });
16192 break;
16193 }
16194 case 13:
16195 case 26:
16196 ProcessExpressionType(exp->__anon1._new.size);
16197 exp->expType = __extension__ ({
16198 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
16199
16200 __ecereInstance1->refCount = 1, __ecereInstance1->kind = 13, __ecereInstance1->__anon1.type = ProcessType(exp->__anon1._new.typeName->qualifiers, exp->__anon1._new.typeName->declarator), __ecereInstance1;
16201 });
16202 DeclareType(curExternal, exp->expType->__anon1.type, 1, 0);
16203 break;
16204 case 14:
16205 case 27:
16206 ProcessExpressionType(exp->__anon1._renew.size);
16207 ProcessExpressionType(exp->__anon1._renew.exp);
16208 exp->expType = __extension__ ({
16209 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
16210
16211 __ecereInstance1->refCount = 1, __ecereInstance1->kind = 13, __ecereInstance1->__anon1.type = ProcessType(exp->__anon1._renew.typeName->qualifiers, exp->__anon1._renew.typeName->declarator), __ecereInstance1;
16212 });
16213 DeclareType(curExternal, exp->expType->__anon1.type, 1, 0);
16214 break;
16215 case 4:
16216 {
16217 unsigned int assign = 0, boolResult = 0, boolOps = 0;
16218 struct Type * type1 = (((void *)0)), * type2 = (((void *)0));
16219 unsigned int useDestType = 0, useSideType = 0;
16220 struct Location oldyylloc = yylloc;
16221 unsigned int useSideUnit = 0;
16222 struct __ecereNameSpace__ecere__com__Class * destClass = (exp->destType && exp->destType->kind == 8 && exp->destType->__anon1._class) ? exp->destType->__anon1._class->__anon1.registered : (((void *)0));
16223 unsigned int powerOp = 0, relationOp = 0;
16224 struct __ecereNameSpace__ecere__com__Class * c1 = (((void *)0)), * c2 = (((void *)0));
16225 struct Type * dummy = (dummy = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type), dummy->count = 1, dummy->refCount = 1, dummy);
16226
16227 switch(exp->__anon1.op.op)
16228 {
16229 case '=':
16230 case MUL_ASSIGN:
16231 case DIV_ASSIGN:
16232 case MOD_ASSIGN:
16233 case ADD_ASSIGN:
16234 case SUB_ASSIGN:
16235 case LEFT_ASSIGN:
16236 case RIGHT_ASSIGN:
16237 case AND_ASSIGN:
16238 case XOR_ASSIGN:
16239 case OR_ASSIGN:
16240 assign = 1;
16241 break;
16242 case '!':
16243 break;
16244 case AND_OP:
16245 case OR_OP:
16246 boolOps = 1;
16247 boolResult = 1;
16248 break;
16249 case EQ_OP:
16250 case '<':
16251 case '>':
16252 case LE_OP:
16253 case GE_OP:
16254 case NE_OP:
16255 boolResult = 1;
16256 useSideType = 1;
16257 relationOp = 1;
16258 break;
16259 case '+':
16260 case '-':
16261 useSideUnit = 1;
16262 useSideType = 1;
16263 useDestType = 1;
16264 break;
16265 case LEFT_OP:
16266 case RIGHT_OP:
16267 break;
16268 case '|':
16269 case '^':
16270 useSideType = 1;
16271 useDestType = 1;
16272 break;
16273 case '/':
16274 case '%':
16275 useSideType = 1;
16276 useDestType = 1;
16277 if(exp->__anon1.op.op == '/')
16278 powerOp = 1;
16279 break;
16280 case '&':
16281 case '*':
16282 if(exp->__anon1.op.exp1)
16283 {
16284 useSideType = 1;
16285 useDestType = 1;
16286 if(exp->__anon1.op.op == '*')
16287 powerOp = 1;
16288 }
16289 break;
16290 }
16291 if(exp->__anon1.op.op == '&')
16292 {
16293 if(!exp->__anon1.op.exp1 && exp->__anon1.op.exp2 && exp->__anon1.op.exp2->type == 0 && exp->__anon1.op.exp2->__anon1.__anon1.identifier)
16294 {
16295 struct Identifier * id = exp->__anon1.op.exp2->__anon1.__anon1.identifier;
16296 struct Symbol * symbol = FindSymbol(id->string, curContext, topContext, 0, id->_class && id->_class->__anon1.__anon1.name == (((void *)0)));
16297
16298 if(symbol && symbol->isIterator == 2)
16299 {
16300 exp->type = 8;
16301 exp->__anon1.member.exp = exp->__anon1.op.exp2;
16302 exp->__anon1.member.member = MkIdentifier("key");
16303 exp->expType = (((void *)0));
16304 exp->__anon1.op.exp2->expType = symbol->type;
16305 symbol->type->refCount++;
16306 ProcessExpressionType(exp);
16307 FreeType(dummy);
16308 break;
16309 }
16310 }
16311 }
16312 if(exp->__anon1.op.exp1)
16313 {
16314 if(exp->__anon1.op.exp2 && useSideUnit && useDestType && destClass && destClass->type == 3 && destClass->base->type != 3)
16315 useDestType = 0;
16316 if(destClass && useDestType && ((destClass->type == 3 && useSideUnit) || destClass->type == 4 || destClass->type == 2))
16317 {
16318 if(exp->__anon1.op.exp1->destType)
16319 FreeType(exp->__anon1.op.exp1->destType);
16320 exp->__anon1.op.exp1->destType = exp->destType;
16321 exp->__anon1.op.exp1->opDestType = 1;
16322 if(exp->destType)
16323 exp->destType->refCount++;
16324 }
16325 else if(!assign)
16326 {
16327 if(exp->__anon1.op.exp1->destType)
16328 FreeType(exp->__anon1.op.exp1->destType);
16329 exp->__anon1.op.exp1->destType = dummy;
16330 dummy->refCount++;
16331 if(powerOp)
16332 exp->__anon1.op.exp1->opDestType = 1;
16333 if(relationOp)
16334 exp->__anon1.op.exp1->usedInComparison = 1;
16335 }
16336 if(exp->__anon1.op.op == '+' || exp->__anon1.op.op == '-')
16337 {
16338 if(exp->opDestType)
16339 exp->__anon1.op.exp1->parentOpDestType = 1;
16340 if(exp->usedInComparison)
16341 exp->__anon1.op.exp1->usedInComparison = 1;
16342 }
16343 if(exp->__anon1.op.exp1->destType && exp->__anon1.op.op != '=')
16344 exp->__anon1.op.exp1->destType->count++;
16345 ProcessExpressionType(exp->__anon1.op.exp1);
16346 if(exp->__anon1.op.exp1->destType && exp->__anon1.op.op != '=')
16347 exp->__anon1.op.exp1->destType->count--;
16348 exp->__anon1.op.exp1->opDestType = 0;
16349 exp->__anon1.op.exp1->usedInComparison = 0;
16350 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)
16351 {
16352 exp->__anon1.op.exp2 = MkExpConstant("1");
16353 exp->__anon1.op.op = exp->__anon1.op.op == INC_OP ? ADD_ASSIGN : SUB_ASSIGN;
16354 assign = 1;
16355 }
16356 if(exp->__anon1.op.exp1->destType == dummy)
16357 {
16358 FreeType(dummy);
16359 exp->__anon1.op.exp1->destType = (((void *)0));
16360 }
16361 if(exp->__anon1.op.exp2)
16362 {
16363 if(!assign && exp->__anon1.op.exp1->expType && (exp->__anon1.op.exp1->expType->kind == 1 || exp->__anon1.op.exp1->expType->kind == 2))
16364 {
16365 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);
16366
16367 FreeType(exp->__anon1.op.exp1->expType);
16368 exp->__anon1.op.exp1->expType = type;
16369 }
16370 }
16371 type1 = exp->__anon1.op.exp1->expType;
16372 }
16373 if(exp->__anon1.op.exp2)
16374 {
16375 char expString[10240];
16376
16377 expString[0] = '\0';
16378 if(exp->__anon1.op.exp2->type == 1 && !exp->__anon1.op.exp2->__anon1.instance->_class)
16379 {
16380 if(exp->__anon1.op.exp1)
16381 {
16382 exp->__anon1.op.exp2->destType = exp->__anon1.op.exp1->expType;
16383 if(exp->__anon1.op.exp1->expType)
16384 exp->__anon1.op.exp1->expType->refCount++;
16385 }
16386 else
16387 {
16388 exp->__anon1.op.exp2->destType = exp->destType;
16389 if(!exp->__anon1.op.exp1 || (exp->__anon1.op.op != '&' && exp->__anon1.op.op != '^'))
16390 exp->__anon1.op.exp2->opDestType = 1;
16391 if(exp->destType)
16392 exp->destType->refCount++;
16393 }
16394 if(type1)
16395 type1->refCount++;
16396 exp->expType = type1;
16397 }
16398 else if(assign)
16399 {
16400 if(inCompiler)
16401 PrintExpression(exp->__anon1.op.exp2, expString);
16402 if(type1 && type1->kind == 13)
16403 {
16404 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)
16405 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "operator %s illegal on pointer\n", (((void *)0))), exp->__anon1.op.op);
16406 else if(exp->__anon1.op.op == '=')
16407 {
16408 if(exp->__anon1.op.exp2->destType)
16409 FreeType(exp->__anon1.op.exp2->destType);
16410 exp->__anon1.op.exp2->destType = type1;
16411 if(type1)
16412 type1->refCount++;
16413 }
16414 }
16415 else
16416 {
16417 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)
16418 ;
16419 else
16420 {
16421 if(exp->__anon1.op.exp2->destType)
16422 FreeType(exp->__anon1.op.exp2->destType);
16423 exp->__anon1.op.exp2->destType = type1;
16424 if(type1)
16425 type1->refCount++;
16426 }
16427 }
16428 if(type1)
16429 type1->refCount++;
16430 exp->expType = type1;
16431 }
16432 else if(destClass && ((destClass->type == 3 && useDestType && useSideUnit) || (destClass->type == 4 && useDestType)))
16433 {
16434 if(exp->__anon1.op.exp2->destType)
16435 FreeType(exp->__anon1.op.exp2->destType);
16436 exp->__anon1.op.exp2->destType = exp->destType;
16437 if(exp->__anon1.op.op != '&' && exp->__anon1.op.op != '^')
16438 exp->__anon1.op.exp2->opDestType = 1;
16439 if(exp->destType)
16440 exp->destType->refCount++;
16441 }
16442 else
16443 {
16444 if(exp->__anon1.op.exp2->destType)
16445 FreeType(exp->__anon1.op.exp2->destType);
16446 exp->__anon1.op.exp2->destType = dummy;
16447 dummy->refCount++;
16448 if(powerOp)
16449 exp->__anon1.op.exp2->opDestType = 1;
16450 if(relationOp)
16451 exp->__anon1.op.exp2->usedInComparison = 1;
16452 }
16453 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))
16454 {
16455 FreeType(exp->__anon1.op.exp2->destType);
16456 exp->__anon1.op.exp2->destType = type1;
16457 type1->refCount++;
16458 }
16459 if(exp->__anon1.op.exp2->destType && exp->__anon1.op.op != '=')
16460 exp->__anon1.op.exp2->destType->count++;
16461 if(exp->__anon1.op.op == SIZEOF)
16462 {
16463 struct Expression * e = exp->__anon1.op.exp2;
16464
16465 while((e->type == 5 || e->type == 32 || e->type == 23) && e->__anon1.list)
16466 {
16467 if(e->type == 5 || e->type == 32 || e->type == 23)
16468 {
16469 if(e->type == 23)
16470 e = (*((struct Statement *)(*e->__anon1.compound->__anon1.compound.statements).last)->__anon1.expressions).last;
16471 else
16472 e = (*e->__anon1.list).last;
16473 }
16474 }
16475 if(e->type == 11 && e->__anon1.cast.exp)
16476 e->__anon1.cast.exp->needCast = 1;
16477 }
16478 if(exp->__anon1.op.op == '+' || exp->__anon1.op.op == '-')
16479 {
16480 if(exp->opDestType)
16481 exp->__anon1.op.exp2->parentOpDestType = 1;
16482 if(exp->usedInComparison)
16483 exp->__anon1.op.exp2->usedInComparison = 1;
16484 }
16485 ProcessExpressionType(exp->__anon1.op.exp2);
16486 exp->__anon1.op.exp2->opDestType = 0;
16487 exp->__anon1.op.exp2->usedInComparison = 0;
16488 if(exp->__anon1.op.exp2->destType && exp->__anon1.op.op != '=')
16489 exp->__anon1.op.exp2->destType->count--;
16490 if(!assign && (exp->__anon1.op.exp1 || exp->__anon1.op.op == '~'))
16491 {
16492 if(exp->__anon1.op.exp2->expType && (exp->__anon1.op.exp2->expType->kind == 1 || exp->__anon1.op.exp2->expType->kind == 2))
16493 {
16494 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);
16495
16496 FreeType(exp->__anon1.op.exp2->expType);
16497 exp->__anon1.op.exp2->expType = type;
16498 }
16499 }
16500 if(assign && type1 && type1->kind == 13 && exp->__anon1.op.exp2->expType)
16501 {
16502 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)
16503 {
16504 if(exp->__anon1.op.op != '=' && type1->__anon1.type->kind == 0)
16505 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "void *: unknown size\n", (((void *)0))));
16506 }
16507 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)))
16508 {
16509 if(exp->__anon1.op.op == ADD_ASSIGN)
16510 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "cannot add two pointers\n", (((void *)0))));
16511 }
16512 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))
16513 {
16514 if(exp->__anon1.op.op == ADD_ASSIGN)
16515 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "cannot add two pointers\n", (((void *)0))));
16516 }
16517 else if(inCompiler)
16518 {
16519 char type1String[1024];
16520 char type2String[1024];
16521
16522 type1String[0] = '\0';
16523 type2String[0] = '\0';
16524 PrintType(exp->__anon1.op.exp2->expType, type1String, 0, 1);
16525 PrintType(type1, type2String, 0, 1);
16526 __ecereNameSpace__ecere__sys__ChangeCh(expString, '\n', ' ');
16527 Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "incompatible expression %s (%s); expected %s\n", (((void *)0))), expString, type1String, type2String);
16528 }
16529 }
16530 if(exp->__anon1.op.exp2->destType == dummy)
16531 {
16532 FreeType(dummy);
16533 exp->__anon1.op.exp2->destType = (((void *)0));
16534 }
16535 if(exp->__anon1.op.op == '-' && !exp->__anon1.op.exp1 && exp->__anon1.op.exp2->expType && !exp->__anon1.op.exp2->expType->isSigned)
16536 {
16537 type2 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
16538 type2->refCount = 1;
16539 CopyTypeInto(type2, exp->__anon1.op.exp2->expType);
16540 type2->isSigned = 1;
16541 }
16542 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))
16543 {
16544 type2 = __extension__ ({
16545 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
16546
16547 __ecereInstance1->kind = 3, __ecereInstance1;
16548 });
16549 type2->refCount = 1;
16550 type2->isSigned = 1;
16551 }
16552 else
16553 {
16554 type2 = exp->__anon1.op.exp2->expType;
16555 if(type2)
16556 type2->refCount++;
16557 }
16558 }
16559 c1 = type1 && type1->kind == 8 && type1->__anon1._class ? type1->__anon1._class->__anon1.registered : (((void *)0));
16560 c2 = type2 && type2->kind == 8 && type2->__anon1._class ? type2->__anon1._class->__anon1.registered : (((void *)0));
16561 if(relationOp && ((exp->__anon1.op.exp1 && exp->__anon1.op.exp1->ambiguousUnits && (!c2 || c2->type != 3)) || (exp->__anon1.op.exp2 && exp->__anon1.op.exp2->ambiguousUnits && (!c1 || c1->type != 3))))
16562 Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "ambiguous units in relational operation\n", (((void *)0))));
16563 if(!relationOp && ((exp->__anon1.op.exp1 && exp->__anon1.op.exp1->ambiguousUnits) || (exp->__anon1.op.exp2 && exp->__anon1.op.exp2->ambiguousUnits)) && (!powerOp || !c1 || c1->type != 3 || !c2 || c2->type != 3 || !RelatedUnits(c1, c2)))
16564 {
16565 if(exp->opDestType || exp->usedInComparison)
16566 exp->ambiguousUnits = 1;
16567 else
16568 Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "ambiguous units\n", (((void *)0))));
16569 }
16570 dummy->kind = 0;
16571 if(exp->__anon1.op.op == SIZEOF)
16572 {
16573 exp->expType = __extension__ ({
16574 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
16575
16576 __ecereInstance1->refCount = 1, __ecereInstance1->kind = 23, __ecereInstance1;
16577 });
16578 exp->isConstant = 1;
16579 }
16580 else if(exp->__anon1.op.op == '*' && !exp->__anon1.op.exp1)
16581 {
16582 exp->expType = Dereference(type2);
16583 if(type2 && type2->kind == 8)
16584 notByReference = 1;
16585 }
16586 else if(exp->__anon1.op.op == '&' && !exp->__anon1.op.exp1)
16587 exp->expType = Reference(type2);
16588 else if(exp->__anon1.op.op == LEFT_OP || exp->__anon1.op.op == RIGHT_OP)
16589 {
16590 if(exp->__anon1.op.exp1->expType)
16591 {
16592 exp->expType = exp->__anon1.op.exp1->expType;
16593 exp->expType->refCount++;
16594 }
16595 }
16596 else if(!assign)
16597 {
16598 if(c1 && !c1->dataType)
16599 c1->dataType = ProcessTypeString(c1->dataTypeString, 0);
16600 if(c2 && !c2->dataType)
16601 c2->dataType = ProcessTypeString(c2->dataTypeString, 0);
16602 if(boolOps)
16603 {
16604 if(exp->__anon1.op.exp1)
16605 {
16606 if(exp->__anon1.op.exp1->destType)
16607 FreeType(exp->__anon1.op.exp1->destType);
16608 exp->__anon1.op.exp1->destType = MkClassType("bool");
16609 exp->__anon1.op.exp1->destType->truth = 1;
16610 if(!exp->__anon1.op.exp1->expType)
16611 ProcessExpressionType(exp->__anon1.op.exp1);
16612 else
16613 CheckExpressionType(exp->__anon1.op.exp1, exp->__anon1.op.exp1->destType, 0, 0);
16614 FreeType(exp->__anon1.op.exp1->expType);
16615 exp->__anon1.op.exp1->expType = MkClassType("bool");
16616 exp->__anon1.op.exp1->expType->truth = 1;
16617 }
16618 if(exp->__anon1.op.exp2)
16619 {
16620 if(exp->__anon1.op.exp2->destType)
16621 FreeType(exp->__anon1.op.exp2->destType);
16622 exp->__anon1.op.exp2->destType = MkClassType("bool");
16623 exp->__anon1.op.exp2->destType->truth = 1;
16624 if(!exp->__anon1.op.exp2->expType)
16625 ProcessExpressionType(exp->__anon1.op.exp2);
16626 else
16627 CheckExpressionType(exp->__anon1.op.exp2, exp->__anon1.op.exp2->destType, 0, 0);
16628 FreeType(exp->__anon1.op.exp2->expType);
16629 exp->__anon1.op.exp2->expType = MkClassType("bool");
16630 exp->__anon1.op.exp2->expType->truth = 1;
16631 }
16632 }
16633 else if(powerOp && exp->__anon1.op.exp1 && exp->__anon1.op.exp2 && ((c1 && c1->type == 3) || (c2 && c2->type == 3)))
16634 {
16635 if(c1 && c1->type == 3 && c2 && c2->type == 3)
16636 {
16637 if(c1->dataType->kind == 7)
16638 exp->expType = c1->dataType;
16639 else if(c2->dataType->kind == 7)
16640 exp->expType = c2->dataType;
16641 else if(c1->dataType->kind == 6)
16642 exp->expType = c1->dataType;
16643 else if(c2->dataType->kind == 6)
16644 exp->expType = c2->dataType;
16645 else
16646 exp->expType = c1->dataType;
16647 }
16648 else if((c1 && c1->type == 3) || exp->__anon1.op.op == '/')
16649 exp->expType = type1;
16650 else
16651 exp->expType = type2;
16652 if(exp->expType)
16653 exp->expType->refCount++;
16654 }
16655 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")))))
16656 {
16657 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"))))
16658 {
16659 if(exp->__anon1.op.op == '-' && ((c1 && c1->type == 4) || (c2 && c2->type == 4)))
16660 {
16661 struct Type * intType = ProcessTypeString((c1 && c1->dataType->kind == 4) || (c2 && c2->dataType->kind == 4) ? "int64" : "int", 0);
16662
16663 if(exp->__anon1.op.exp1->destType)
16664 FreeType(exp->__anon1.op.exp1->destType);
16665 if(exp->__anon1.op.exp2->destType)
16666 FreeType(exp->__anon1.op.exp2->destType);
16667 exp->__anon1.op.exp1->destType = intType;
16668 exp->__anon1.op.exp2->destType = intType;
16669 intType->refCount++;
16670 }
16671 else
16672 {
16673 if(exp->__anon1.op.exp2->destType)
16674 FreeType(exp->__anon1.op.exp2->destType);
16675 exp->__anon1.op.exp2->destType = type1;
16676 type1->refCount++;
16677 if(exp->__anon1.op.exp1->destType)
16678 FreeType(exp->__anon1.op.exp1->destType);
16679 exp->__anon1.op.exp1->destType = type2;
16680 type2->refCount++;
16681 }
16682 if(!boolResult && !exp->opDestType && (!exp->destType || exp->destType->kind != 8) && c1 && c1->type == 3 && c2 && c2->type == 3 && c1 != c2)
16683 {
16684 if(exp->usedInComparison || exp->parentOpDestType)
16685 exp->ambiguousUnits = 1;
16686 else
16687 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);
16688 }
16689 if(type1->kind == 13 && type1->__anon1.type->kind == 20 && type2->kind != 13)
16690 {
16691 struct Expression * argExp = GetTemplateArgExp(type1->__anon1.type->__anon1.templateParameter, thisClass, 1);
16692
16693 if(argExp)
16694 {
16695 struct Expression * classExp = MkExpMember(argExp, MkIdentifier("dataTypeClass"));
16696
16697 exp->__anon1.op.exp1 = MkExpBrackets(MkListOne(MkExpCast(MkTypeName(MkListOne(MkSpecifierName("byte")), MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), (((void *)0)))), exp->__anon1.op.exp1)));
16698 ProcessExpressionType(exp->__anon1.op.exp1);
16699 if(type2->kind != 13)
16700 {
16701 ProcessExpressionType(classExp);
16702 exp->__anon1.op.exp2 = MkExpBrackets(MkListOne(MkExpOp(exp->__anon1.op.exp2, '*', MkExpMember(classExp, MkIdentifier("typeSize")))));
16703 if(!exp->__anon1.op.exp2->expType)
16704 {
16705 if(type2)
16706 FreeType(type2);
16707 type2 = exp->__anon1.op.exp2->expType = ProcessTypeString("int", 0);
16708 c2 = (((void *)0));
16709 type2->refCount++;
16710 }
16711 ProcessExpressionType(exp->__anon1.op.exp2);
16712 }
16713 }
16714 }
16715 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)))
16716 {
16717 if(type1->kind != 8 && type1->__anon1.type->kind == 0)
16718 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "void *: unknown size\n", (((void *)0))));
16719 exp->expType = type1;
16720 if(type1)
16721 type1->refCount++;
16722 }
16723 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)))
16724 {
16725 if(type2->kind != 8 && type2->__anon1.type->kind == 0)
16726 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "void *: unknown size\n", (((void *)0))));
16727 exp->expType = type2;
16728 if(type2)
16729 type2->refCount++;
16730 }
16731 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))
16732 {
16733 Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "different levels of indirection\n", (((void *)0))));
16734 }
16735 else
16736 {
16737 unsigned int success = 0;
16738
16739 if(type1->kind == 13 && type2->kind == 13)
16740 {
16741 if(exp->__anon1.op.op == '+')
16742 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "cannot add two pointers\n", (((void *)0))));
16743 else if(exp->__anon1.op.op == '-')
16744 {
16745 if(MatchTypes(type1->__anon1.type, type2->__anon1.type, (((void *)0)), (((void *)0)), (((void *)0)), 0, 0, 0, 0, 0))
16746 {
16747 exp->expType = __extension__ ({
16748 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
16749
16750 __ecereInstance1->kind = 3, __ecereInstance1->refCount = 1, __ecereInstance1;
16751 });
16752 success = 1;
16753 if(type1->__anon1.type->kind == 20)
16754 {
16755 struct Expression * argExp = GetTemplateArgExp(type1->__anon1.type->__anon1.templateParameter, thisClass, 1);
16756
16757 if(argExp)
16758 {
16759 struct Expression * classExp = MkExpMember(argExp, MkIdentifier("dataTypeClass"));
16760
16761 ProcessExpressionType(classExp);
16762 exp->type = 5;
16763 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"))));
16764 ProcessExpressionType(((struct Expression *)(*exp->__anon1.list).first)->__anon1.op.exp2);
16765 FreeType(dummy);
16766 return ;
16767 }
16768 }
16769 }
16770 }
16771 }
16772 if(!success && exp->__anon1.op.exp1->type == 2)
16773 {
16774 if(CheckExpressionType(exp->__anon1.op.exp1, exp->__anon1.op.exp1->destType, 0, 0))
16775 {
16776 if(exp->expType)
16777 FreeType(exp->expType);
16778 exp->expType = exp->__anon1.op.exp1->destType;
16779 if(exp->__anon1.op.exp1->destType)
16780 exp->__anon1.op.exp1->destType->refCount++;
16781 success = 1;
16782 }
16783 else if(CheckExpressionType(exp->__anon1.op.exp2, exp->__anon1.op.exp2->destType, 0, 0))
16784 {
16785 if(exp->expType)
16786 FreeType(exp->expType);
16787 exp->expType = exp->__anon1.op.exp2->destType;
16788 if(exp->__anon1.op.exp2->destType)
16789 exp->__anon1.op.exp2->destType->refCount++;
16790 success = 1;
16791 }
16792 }
16793 else if(!success)
16794 {
16795 if(CheckExpressionType(exp->__anon1.op.exp2, exp->__anon1.op.exp2->destType, 0, 0))
16796 {
16797 if(exp->expType)
16798 FreeType(exp->expType);
16799 exp->expType = exp->__anon1.op.exp2->destType;
16800 if(exp->__anon1.op.exp2->destType)
16801 exp->__anon1.op.exp2->destType->refCount++;
16802 success = 1;
16803 }
16804 else if(CheckExpressionType(exp->__anon1.op.exp1, exp->__anon1.op.exp1->destType, 0, 0))
16805 {
16806 if(exp->expType)
16807 FreeType(exp->expType);
16808 exp->expType = exp->__anon1.op.exp1->destType;
16809 if(exp->__anon1.op.exp1->destType)
16810 exp->__anon1.op.exp1->destType->refCount++;
16811 success = 1;
16812 }
16813 }
16814 if(!success)
16815 {
16816 char expString1[10240];
16817 char expString2[10240];
16818 char type1[1024];
16819 char type2[1024];
16820
16821 expString1[0] = '\0';
16822 expString2[0] = '\0';
16823 type1[0] = '\0';
16824 type2[0] = '\0';
16825 if(inCompiler)
16826 {
16827 PrintExpression(exp->__anon1.op.exp1, expString1);
16828 __ecereNameSpace__ecere__sys__ChangeCh(expString1, '\n', ' ');
16829 PrintExpression(exp->__anon1.op.exp2, expString2);
16830 __ecereNameSpace__ecere__sys__ChangeCh(expString2, '\n', ' ');
16831 PrintType(exp->__anon1.op.exp1->expType, type1, 0, 1);
16832 PrintType(exp->__anon1.op.exp2->expType, type2, 0, 1);
16833 }
16834 Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "incompatible expressions %s (%s) and %s (%s)\n", (((void *)0))), expString1, type1, expString2, type2);
16835 }
16836 }
16837 }
16838 else if(!boolResult && !useSideUnit && c2 && c2->type == 3 && type1 && type1->kind != 8)
16839 {
16840 if(exp->__anon1.op.exp1->destType)
16841 FreeType(exp->__anon1.op.exp1->destType);
16842 exp->__anon1.op.exp1->destType = type2->__anon1._class->__anon1.registered->dataType;
16843 if(type2->__anon1._class->__anon1.registered->dataType)
16844 type2->__anon1._class->__anon1.registered->dataType->refCount++;
16845 CheckExpressionType(exp->__anon1.op.exp1, exp->__anon1.op.exp1->destType, 0, 0);
16846 exp->expType = type2;
16847 if(type2)
16848 type2->refCount++;
16849 }
16850 else if(!boolResult && !useSideUnit && c1 && c1->type == 3 && type2 && type2->kind != 8)
16851 {
16852 if(exp->__anon1.op.exp2->destType)
16853 FreeType(exp->__anon1.op.exp2->destType);
16854 exp->__anon1.op.exp2->destType = type1->__anon1._class->__anon1.registered->dataType;
16855 if(type1->__anon1._class->__anon1.registered->dataType)
16856 type1->__anon1._class->__anon1.registered->dataType->refCount++;
16857 CheckExpressionType(exp->__anon1.op.exp2, exp->__anon1.op.exp2->destType, 0, 0);
16858 exp->expType = type1;
16859 if(type1)
16860 type1->refCount++;
16861 }
16862 else if(type1)
16863 {
16864 unsigned int valid = 0;
16865
16866 if(!boolResult && useSideUnit && c1 && c1->type == 3 && type2 && type2->kind != 8)
16867 {
16868 if(exp->__anon1.op.exp2->destType)
16869 FreeType(exp->__anon1.op.exp2->destType);
16870 exp->__anon1.op.exp2->destType = c1->dataType;
16871 exp->__anon1.op.exp2->destType->refCount++;
16872 CheckExpressionType(exp->__anon1.op.exp2, exp->__anon1.op.exp2->destType, 0, 0);
16873 if(type2)
16874 FreeType(type2);
16875 type2 = exp->__anon1.op.exp2->destType;
16876 c2 = type2 && type2->kind == 8 && type2->__anon1._class ? type2->__anon1._class->__anon1.registered : (((void *)0));
16877 if(type2)
16878 type2->refCount++;
16879 exp->expType = type2;
16880 type2->refCount++;
16881 }
16882 if(!boolResult && useSideUnit && c2 && c2->type == 3 && type1 && type1->kind != 8)
16883 {
16884 if(exp->__anon1.op.exp1->destType)
16885 FreeType(exp->__anon1.op.exp1->destType);
16886 exp->__anon1.op.exp1->destType = c2->dataType;
16887 exp->__anon1.op.exp1->destType->refCount++;
16888 CheckExpressionType(exp->__anon1.op.exp1, exp->__anon1.op.exp1->destType, 0, 0);
16889 type1 = exp->__anon1.op.exp1->destType;
16890 c1 = type1 && type1->kind == 8 && type1->__anon1._class ? type1->__anon1._class->__anon1.registered : (((void *)0));
16891 exp->expType = type1;
16892 type1->refCount++;
16893 }
16894 if(!boolResult || exp->__anon1.op.op == '>' || exp->__anon1.op.op == '<' || exp->__anon1.op.op == GE_OP || exp->__anon1.op.op == LE_OP)
16895 {
16896 unsigned int op1IsEnum = c1 && c1->type == 4;
16897 unsigned int op2IsEnum = c2 && c2->type == 4;
16898
16899 if(exp->__anon1.op.op == '*' || exp->__anon1.op.op == '/' || exp->__anon1.op.op == '-' || exp->__anon1.op.op == '|' || exp->__anon1.op.op == '^')
16900 {
16901 if(op1IsEnum && exp->__anon1.op.exp2->expType)
16902 {
16903 if(CheckExpressionType(exp->__anon1.op.exp1, exp->__anon1.op.exp2->expType, 0, 0))
16904 {
16905 if(exp->expType)
16906 FreeType(exp->expType);
16907 exp->expType = exp->__anon1.op.exp2->expType;
16908 if(exp->__anon1.op.exp2->expType)
16909 exp->__anon1.op.exp2->expType->refCount++;
16910 valid = 1;
16911 }
16912 }
16913 else if(op2IsEnum && exp->__anon1.op.exp1->expType)
16914 {
16915 if(CheckExpressionType(exp->__anon1.op.exp2, exp->__anon1.op.exp1->expType, 0, 0))
16916 {
16917 if(exp->expType)
16918 FreeType(exp->expType);
16919 exp->expType = exp->__anon1.op.exp1->expType;
16920 if(exp->__anon1.op.exp1->expType)
16921 exp->__anon1.op.exp1->expType->refCount++;
16922 valid = 1;
16923 }
16924 }
16925 }
16926 else
16927 {
16928 if(op1IsEnum && exp->__anon1.op.exp2->expType)
16929 {
16930 if(CheckExpressionType(exp->__anon1.op.exp1, exp->__anon1.op.exp2->expType, 0, 0))
16931 {
16932 if(exp->expType)
16933 FreeType(exp->expType);
16934 exp->expType = exp->__anon1.op.exp1->expType;
16935 if(exp->__anon1.op.exp1->expType)
16936 exp->__anon1.op.exp1->expType->refCount++;
16937 valid = 1;
16938 }
16939 }
16940 else if(op2IsEnum && exp->__anon1.op.exp1->expType)
16941 {
16942 if(CheckExpressionType(exp->__anon1.op.exp2, exp->__anon1.op.exp1->expType, 0, 0))
16943 {
16944 if(exp->expType)
16945 FreeType(exp->expType);
16946 exp->expType = exp->__anon1.op.exp2->expType;
16947 if(exp->__anon1.op.exp2->expType)
16948 exp->__anon1.op.exp2->expType->refCount++;
16949 valid = 1;
16950 }
16951 }
16952 }
16953 }
16954 if(!valid)
16955 {
16956 if(c2 && c2->type == 3 && (!c1 || c1->type != 3))
16957 {
16958 if(exp->__anon1.op.exp1->destType)
16959 FreeType(exp->__anon1.op.exp1->destType);
16960 exp->__anon1.op.exp1->destType = type2;
16961 type2->refCount++;
16962 if(CheckExpressionType(exp->__anon1.op.exp1, exp->__anon1.op.exp1->destType, 0, 0))
16963 {
16964 if(exp->expType)
16965 FreeType(exp->expType);
16966 exp->expType = exp->__anon1.op.exp1->destType;
16967 if(exp->__anon1.op.exp1->destType)
16968 exp->__anon1.op.exp1->destType->refCount++;
16969 }
16970 }
16971 else
16972 {
16973 if(exp->__anon1.op.exp2->destType)
16974 FreeType(exp->__anon1.op.exp2->destType);
16975 exp->__anon1.op.exp2->destType = type1;
16976 type1->refCount++;
16977 if(CheckExpressionType(exp->__anon1.op.exp2, exp->__anon1.op.exp2->destType, 0, 0))
16978 {
16979 if(exp->expType)
16980 FreeType(exp->expType);
16981 exp->expType = exp->__anon1.op.exp2->destType;
16982 if(exp->__anon1.op.exp2->destType)
16983 exp->__anon1.op.exp2->destType->refCount++;
16984 }
16985 else if(type1 && type2)
16986 {
16987 char expString1[10240];
16988 char expString2[10240];
16989 char type1String[1024];
16990 char type2String[1024];
16991
16992 expString1[0] = '\0';
16993 expString2[0] = '\0';
16994 type1String[0] = '\0';
16995 type2String[0] = '\0';
16996 if(inCompiler)
16997 {
16998 PrintExpression(exp->__anon1.op.exp1, expString1);
16999 __ecereNameSpace__ecere__sys__ChangeCh(expString1, '\n', ' ');
17000 PrintExpression(exp->__anon1.op.exp2, expString2);
17001 __ecereNameSpace__ecere__sys__ChangeCh(expString2, '\n', ' ');
17002 PrintType(exp->__anon1.op.exp1->expType, type1String, 0, 1);
17003 PrintType(exp->__anon1.op.exp2->expType, type2String, 0, 1);
17004 }
17005 Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "incompatible expressions %s (%s) and %s (%s)\n", (((void *)0))), expString1, type1String, expString2, type2String);
17006 if(c1 && c1->type == 4)
17007 {
17008 exp->expType = exp->__anon1.op.exp1->expType;
17009 if(exp->__anon1.op.exp1->expType)
17010 exp->__anon1.op.exp1->expType->refCount++;
17011 }
17012 else if(c2 && c2->type == 4)
17013 {
17014 exp->expType = exp->__anon1.op.exp2->expType;
17015 if(exp->__anon1.op.exp2->expType)
17016 exp->__anon1.op.exp2->expType->refCount++;
17017 }
17018 }
17019 }
17020 }
17021 }
17022 else if(type2)
17023 {
17024 if(c2 && c2->type == 4)
17025 {
17026 struct Type * oldType = exp->__anon1.op.exp1->expType;
17027
17028 exp->__anon1.op.exp1->expType = (((void *)0));
17029 if(CheckExpressionType(exp->__anon1.op.exp1, exp->__anon1.op.exp1->destType, 0, 0))
17030 FreeType(oldType);
17031 else
17032 exp->__anon1.op.exp1->expType = oldType;
17033 }
17034 if(exp->__anon1.op.exp1->destType)
17035 FreeType(exp->__anon1.op.exp1->destType);
17036 exp->__anon1.op.exp1->destType = type2;
17037 type2->refCount++;
17038 if(CheckExpressionType(exp->__anon1.op.exp1, exp->__anon1.op.exp1->destType, 0, 0))
17039 {
17040 if(exp->expType)
17041 FreeType(exp->expType);
17042 exp->expType = exp->__anon1.op.exp1->destType;
17043 if(exp->__anon1.op.exp1->destType)
17044 exp->__anon1.op.exp1->destType->refCount++;
17045 }
17046 }
17047 }
17048 else if(type2 && (!type1 || (type2->kind == 8 && type1->kind != 8)))
17049 {
17050 if(type1 && c2 && c2->type == 3)
17051 {
17052 if(exp->__anon1.op.exp1->destType)
17053 FreeType(exp->__anon1.op.exp1->destType);
17054 exp->__anon1.op.exp1->destType = type2->__anon1._class->__anon1.registered->dataType;
17055 if(type2->__anon1._class->__anon1.registered->dataType)
17056 type2->__anon1._class->__anon1.registered->dataType->refCount++;
17057 CheckExpressionType(exp->__anon1.op.exp1, exp->__anon1.op.exp1->destType, 0, 0);
17058 }
17059 if(exp->__anon1.op.op == '!')
17060 {
17061 exp->expType = MkClassType("bool");
17062 exp->expType->truth = 1;
17063 }
17064 else
17065 {
17066 exp->expType = type2;
17067 if(type2)
17068 type2->refCount++;
17069 }
17070 }
17071 else if(type1 && (!type2 || (type1->kind == 8 && type2->kind != 8)))
17072 {
17073 if(c2 && c2->type == 3)
17074 {
17075 if(exp->__anon1.op.exp2->destType)
17076 FreeType(exp->__anon1.op.exp2->destType);
17077 exp->__anon1.op.exp2->destType = type1->__anon1._class->__anon1.registered->dataType;
17078 if(type1->__anon1._class->__anon1.registered->dataType)
17079 type1->__anon1._class->__anon1.registered->dataType->refCount++;
17080 CheckExpressionType(exp->__anon1.op.exp2, exp->__anon1.op.exp2->destType, 0, 0);
17081 }
17082 exp->expType = type1;
17083 if(type1)
17084 type1->refCount++;
17085 }
17086 }
17087 yylloc = exp->loc;
17088 if(exp->__anon1.op.exp1 && !exp->__anon1.op.exp1->expType)
17089 {
17090 char expString[10000];
17091
17092 expString[0] = '\0';
17093 if(inCompiler)
17094 {
17095 PrintExpression(exp->__anon1.op.exp1, expString);
17096 __ecereNameSpace__ecere__sys__ChangeCh(expString, '\n', ' ');
17097 }
17098 if(expString[0])
17099 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "couldn't determine type of %s\n", (((void *)0))), expString);
17100 }
17101 if(exp->__anon1.op.exp2 && !exp->__anon1.op.exp2->expType)
17102 {
17103 char expString[10240];
17104
17105 expString[0] = '\0';
17106 if(inCompiler)
17107 {
17108 PrintExpression(exp->__anon1.op.exp2, expString);
17109 __ecereNameSpace__ecere__sys__ChangeCh(expString, '\n', ' ');
17110 }
17111 if(expString[0])
17112 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "couldn't determine type of %s\n", (((void *)0))), expString);
17113 }
17114 if(boolResult)
17115 {
17116 FreeType(exp->expType);
17117 exp->expType = MkClassType("bool");
17118 exp->expType->truth = 1;
17119 }
17120 if(exp->__anon1.op.op != SIZEOF)
17121 exp->isConstant = (!exp->__anon1.op.exp1 || exp->__anon1.op.exp1->isConstant) && (!exp->__anon1.op.exp2 || exp->__anon1.op.exp2->isConstant);
17122 if(exp->__anon1.op.op == SIZEOF && exp->__anon1.op.exp2->expType)
17123 {
17124 DeclareType(curExternal, exp->__anon1.op.exp2->expType, 1, 0);
17125 }
17126 if(exp->__anon1.op.op == DELETE && exp->__anon1.op.exp2 && exp->__anon1.op.exp2->expType && __ecereProp_Type_Get_specConst(exp->__anon1.op.exp2->expType))
17127 Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "deleting const qualified object\n", (((void *)0))));
17128 yylloc = oldyylloc;
17129 FreeType(dummy);
17130 if(type2)
17131 FreeType(type2);
17132 break;
17133 }
17134 case 5:
17135 case 32:
17136 {
17137 struct Expression * e;
17138
17139 exp->isConstant = 1;
17140 for(e = (*exp->__anon1.list).first; e; e = e->next)
17141 {
17142 if(!e->next)
17143 {
17144 FreeType(e->destType);
17145 e->opDestType = exp->opDestType;
17146 e->usedInComparison = exp->usedInComparison;
17147 e->parentOpDestType = exp->parentOpDestType;
17148 e->destType = exp->destType;
17149 if(e->destType)
17150 {
17151 exp->destType->refCount++;
17152 }
17153 }
17154 ProcessExpressionType(e);
17155 if(e->ambiguousUnits)
17156 exp->ambiguousUnits = 1;
17157 if(!exp->expType && !e->next)
17158 {
17159 exp->expType = e->expType;
17160 if(e->expType)
17161 e->expType->refCount++;
17162 exp->needCast = e->needCast;
17163 }
17164 if(!e->isConstant)
17165 exp->isConstant = 0;
17166 }
17167 e = (*exp->__anon1.list).first;
17168 if(!e->next && e->type == 8)
17169 {
17170 struct Expression * next = exp->next, * prev = exp->prev;
17171
17172 FreeType(exp->expType);
17173 FreeType(exp->destType);
17174 (__ecereNameSpace__ecere__com__eSystem_Delete(exp->__anon1.list), exp->__anon1.list = 0);
17175 *exp = *e;
17176 exp->prev = prev;
17177 exp->next = next;
17178 ((e ? __extension__ ({
17179 void * __ecerePtrToDelete = (e);
17180
17181 __ecereClass_Expression->Destructor ? __ecereClass_Expression->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete);
17182 }) : 0), e = 0);
17183 ProcessExpressionType(exp);
17184 }
17185 break;
17186 }
17187 case 6:
17188 {
17189 struct Expression * e;
17190
17191 exp->isConstant = 1;
17192 ProcessExpressionType(exp->__anon1.index.exp);
17193 if(!exp->__anon1.index.exp->isConstant)
17194 exp->isConstant = 0;
17195 if(exp->__anon1.index.exp->expType)
17196 {
17197 struct Type * source = exp->__anon1.index.exp->expType;
17198
17199 if(source->kind == 8 && source->__anon1._class && source->__anon1._class->__anon1.registered)
17200 {
17201 struct __ecereNameSpace__ecere__com__Class * _class = source->__anon1._class->__anon1.registered;
17202 struct __ecereNameSpace__ecere__com__Class * c = _class->templateClass ? _class->templateClass : _class;
17203
17204 if(_class != containerClass && __ecereNameSpace__ecere__com__eClass_IsDerived(c, containerClass) && _class->templateArgs)
17205 {
17206 exp->expType = ProcessTypeString(_class->templateArgs[2].__anon1.__anon1.dataTypeString, 0);
17207 if(exp->__anon1.index.index && (*exp->__anon1.index.index).last)
17208 {
17209 struct Type * type = ProcessTypeString(_class->templateArgs[1].__anon1.__anon1.dataTypeString, 0);
17210
17211 if(type->kind == 8)
17212 type->constant = 1;
17213 else if(type->kind == 13)
17214 {
17215 struct Type * t = type;
17216
17217 while(t->kind == 13)
17218 t = t->__anon1.type;
17219 t->constant = 1;
17220 }
17221 ((struct Expression *)(*exp->__anon1.index.index).last)->destType = type;
17222 }
17223 }
17224 }
17225 }
17226 for(e = (*exp->__anon1.index.index).first; e; e = e->next)
17227 {
17228 if(!e->next && exp->__anon1.index.exp->expType && exp->__anon1.index.exp->expType->kind == 12 && exp->__anon1.index.exp->expType->__anon1.__anon4.enumClass)
17229 {
17230 if(e->destType)
17231 FreeType(e->destType);
17232 e->destType = MkClassType(exp->__anon1.index.exp->expType->__anon1.__anon4.enumClass->string);
17233 }
17234 ProcessExpressionType(e);
17235 if(!e->next)
17236 {
17237 }
17238 if(!e->isConstant)
17239 exp->isConstant = 0;
17240 }
17241 if(!exp->expType)
17242 exp->expType = Dereference(exp->__anon1.index.exp->expType);
17243 if(exp->expType)
17244 DeclareType(curExternal, exp->expType, 1, 0);
17245 break;
17246 }
17247 case 7:
17248 {
17249 struct Expression * e;
17250 struct Type * functionType;
17251 struct Type * methodType = (((void *)0));
17252 char name[1024];
17253
17254 name[0] = '\0';
17255 if(inCompiler)
17256 {
17257 PrintExpression(exp->__anon1.call.exp, name);
17258 if(exp->__anon1.call.exp->expType && !exp->__anon1.call.exp->expType->__anon1.__anon2.returnType)
17259 {
17260 PrintExpression(exp->__anon1.call.exp, name);
17261 }
17262 }
17263 if(exp->__anon1.call.exp->type == 0)
17264 {
17265 struct Expression * idExp = exp->__anon1.call.exp;
17266 struct Identifier * id = idExp->__anon1.__anon1.identifier;
17267
17268 if(!strcmp(id->string, "__builtin_frame_address"))
17269 {
17270 exp->expType = ProcessTypeString("void *", 1);
17271 if(exp->__anon1.call.arguments && (*exp->__anon1.call.arguments).first)
17272 ProcessExpressionType((*exp->__anon1.call.arguments).first);
17273 break;
17274 }
17275 else if(!strcmp(id->string, "__ENDIAN_PAD"))
17276 {
17277 exp->expType = ProcessTypeString("int", 1);
17278 if(exp->__anon1.call.arguments && (*exp->__anon1.call.arguments).first)
17279 ProcessExpressionType((*exp->__anon1.call.arguments).first);
17280 break;
17281 }
17282 else if(!strcmp(id->string, "Max") || !strcmp(id->string, "Min") || !strcmp(id->string, "Sgn") || !strcmp(id->string, "Abs"))
17283 {
17284 struct Expression * a = (((void *)0));
17285 struct Expression * b = (((void *)0));
17286 struct Expression * tempExp1 = (((void *)0)), * tempExp2 = (((void *)0));
17287
17288 if((!strcmp(id->string, "Max") || !strcmp(id->string, "Min")) && (*exp->__anon1.call.arguments).count == 2)
17289 {
17290 a = (*exp->__anon1.call.arguments).first;
17291 b = (*exp->__anon1.call.arguments).last;
17292 tempExp1 = a;
17293 tempExp2 = b;
17294 }
17295 else if((*exp->__anon1.call.arguments).count == 1)
17296 {
17297 a = (*exp->__anon1.call.arguments).first;
17298 tempExp1 = a;
17299 }
17300 if(a)
17301 {
17302 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Clear((&*exp->__anon1.call.arguments));
17303 idExp->__anon1.__anon1.identifier = (((void *)0));
17304 FreeExpContents(exp);
17305 ProcessExpressionType(a);
17306 if(b)
17307 ProcessExpressionType(b);
17308 exp->type = 5;
17309 exp->__anon1.list = MkList();
17310 if(a->expType && (!b || b->expType))
17311 {
17312 if((!a->isConstant && a->type != 0) || (b && !b->isConstant && b->type != 0))
17313 {
17314 if(inCompiler)
17315 {
17316 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
17317 struct __ecereNameSpace__ecere__sys__OldList * decls = MkList();
17318 struct Declaration * decl;
17319 char temp1[1024], temp2[1024];
17320
17321 GetTypeSpecs(a->expType, specs);
17322 if(a && !a->isConstant && a->type != 0)
17323 {
17324 sprintf(temp1, "__simpleStruct%d", curContext->simpleID++);
17325 ListAdd(decls, MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier(temp1)), (((void *)0))));
17326 tempExp1 = QMkExpId(temp1);
17327 tempExp1->expType = a->expType;
17328 if(a->expType)
17329 a->expType->refCount++;
17330 ListAdd(exp->__anon1.list, MkExpOp(CopyExpression(tempExp1), '=', a));
17331 }
17332 if(b && !b->isConstant && b->type != 0)
17333 {
17334 sprintf(temp2, "__simpleStruct%d", curContext->simpleID++);
17335 ListAdd(decls, MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier(temp2)), (((void *)0))));
17336 tempExp2 = QMkExpId(temp2);
17337 tempExp2->expType = b->expType;
17338 if(b->expType)
17339 b->expType->refCount++;
17340 ListAdd(exp->__anon1.list, MkExpOp(CopyExpression(tempExp2), '=', b));
17341 }
17342 decl = MkDeclaration(specs, decls);
17343 if(!curCompound->__anon1.compound.declarations)
17344 curCompound->__anon1.compound.declarations = MkList();
17345 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*curCompound->__anon1.compound.declarations), (((void *)0)), decl);
17346 }
17347 }
17348 }
17349 if(!strcmp(id->string, "Max") || !strcmp(id->string, "Min"))
17350 {
17351 int op = (!strcmp(id->string, "Max")) ? '>' : '<';
17352
17353 ListAdd(exp->__anon1.list, MkExpCondition(MkExpBrackets(MkListOne(MkExpOp(CopyExpression(tempExp1), op, CopyExpression(tempExp2)))), MkListOne(CopyExpression(tempExp1)), CopyExpression(tempExp2)));
17354 exp->expType = a->expType;
17355 if(a->expType)
17356 a->expType->refCount++;
17357 }
17358 else if(!strcmp(id->string, "Abs"))
17359 {
17360 ListAdd(exp->__anon1.list, MkExpCondition(MkExpBrackets(MkListOne(MkExpOp(CopyExpression(tempExp1), '<', MkExpConstant("0")))), MkListOne(MkExpOp((((void *)0)), '-', CopyExpression(tempExp1))), CopyExpression(tempExp1)));
17361 exp->expType = a->expType;
17362 if(a->expType)
17363 a->expType->refCount++;
17364 }
17365 else if(!strcmp(id->string, "Sgn"))
17366 {
17367 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"))))));
17368 exp->expType = ProcessTypeString("int", 0);
17369 }
17370 FreeExpression(tempExp1);
17371 if(tempExp2)
17372 FreeExpression(tempExp2);
17373 FreeIdentifier(id);
17374 break;
17375 }
17376 }
17377 }
17378 {
17379 struct Type * dummy = (dummy = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type), dummy->count = 1, dummy->refCount = 1, dummy);
17380
17381 if(!exp->__anon1.call.exp->destType)
17382 {
17383 exp->__anon1.call.exp->destType = dummy;
17384 dummy->refCount++;
17385 }
17386 ProcessExpressionType(exp->__anon1.call.exp);
17387 if(exp->__anon1.call.exp->destType == dummy)
17388 {
17389 FreeType(dummy);
17390 exp->__anon1.call.exp->destType = (((void *)0));
17391 }
17392 FreeType(dummy);
17393 }
17394 functionType = exp->__anon1.call.exp->expType;
17395 if(functionType && functionType->kind == 16)
17396 {
17397 methodType = functionType;
17398 functionType = methodType->__anon1.__anon3.method->dataType;
17399 if(exp->__anon1.call.exp->expType->__anon1.__anon3.usedClass)
17400 {
17401 char typeString[1024];
17402
17403 typeString[0] = '\0';
17404 {
17405 struct Symbol * back = functionType->__anon1.__anon2.thisClass;
17406
17407 functionType->__anon1.__anon2.thisClass = (((void *)0));
17408 PrintType(functionType, typeString, 1, 1);
17409 functionType->__anon1.__anon2.thisClass = back;
17410 }
17411 if(strstr(typeString, "thisclass"))
17412 {
17413 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
17414 struct Declarator * decl;
17415
17416 {
17417 struct Context * context = SetupTemplatesContext(exp->__anon1.call.exp->expType->__anon1.__anon3.usedClass);
17418
17419 decl = SpecDeclFromString(typeString, specs, (((void *)0)));
17420 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))
17421 thisClassParams = 0;
17422 ReplaceThisClassSpecifiers(specs, exp->__anon1.call.exp->expType->__anon1.__anon3.usedClass);
17423 {
17424 struct __ecereNameSpace__ecere__com__Class * backupThisClass = thisClass;
17425
17426 thisClass = exp->__anon1.call.exp->expType->__anon1.__anon3.usedClass;
17427 ProcessDeclarator(decl, 1);
17428 thisClass = backupThisClass;
17429 }
17430 thisClassParams = 1;
17431 functionType = ProcessType(specs, decl);
17432 functionType->refCount = 0;
17433 FinishTemplatesContext(context);
17434 {
17435 struct Type * p, * op;
17436
17437 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)
17438 {
17439 if(op->kind == 21)
17440 p->thisClassFrom = methodType->__anon1.__anon3.method->_class;
17441 }
17442 }
17443 if(methodType->__anon1.__anon3.method->dataType->__anon1.__anon2.returnType->kind == 21)
17444 {
17445 functionType->__anon1.__anon2.returnType->thisClassFrom = methodType->__anon1.__anon3.method->_class;
17446 }
17447 }
17448 FreeList(specs, (void *)(FreeSpecifier));
17449 FreeDeclarator(decl);
17450 }
17451 }
17452 }
17453 if(functionType && functionType->kind == 13 && functionType->__anon1.type && functionType->__anon1.type->kind == 11)
17454 {
17455 struct Type * type = functionType->__anon1.type;
17456
17457 if(!functionType->refCount)
17458 {
17459 functionType->__anon1.type = (((void *)0));
17460 FreeType(functionType);
17461 }
17462 functionType = type;
17463 }
17464 if(functionType && functionType->kind != 11)
17465 {
17466 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "called object %s is not a function\n", (((void *)0))), name);
17467 }
17468 else if(functionType)
17469 {
17470 unsigned int emptyParams = 0, noParams = 0;
17471 struct Expression * e = exp->__anon1.call.arguments ? (*exp->__anon1.call.arguments).first : (((void *)0));
17472 struct Type * type = functionType->__anon1.__anon2.params.first;
17473 struct Expression * memberExp = (exp->__anon1.call.exp->type == 8) ? exp->__anon1.call.exp : (((void *)0));
17474 int extra = 0;
17475 struct Location oldyylloc = yylloc;
17476
17477 if(!type)
17478 emptyParams = 1;
17479 if(functionType->extraParam && e && functionType->__anon1.__anon2.thisClass)
17480 {
17481 e->destType = MkClassType(functionType->__anon1.__anon2.thisClass->string);
17482 e = e->next;
17483 }
17484 if(!functionType->__anon1.__anon2.staticMethod && !functionType->extraParam)
17485 {
17486 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)
17487 {
17488 type = MkClassType(memberExp->__anon1.member.exp->expType->__anon1._class->string);
17489 if(e)
17490 {
17491 e->destType = type;
17492 e = e->next;
17493 type = functionType->__anon1.__anon2.params.first;
17494 }
17495 else
17496 type->refCount = 0;
17497 }
17498 else if(!memberExp && (functionType->__anon1.__anon2.thisClass || (methodType && methodType->__anon1.__anon3.methodClass)))
17499 {
17500 type = MkClassType(functionType->__anon1.__anon2.thisClass ? functionType->__anon1.__anon2.thisClass->string : (methodType ? methodType->__anon1.__anon3.methodClass->fullName : (((void *)0))));
17501 type->byReference = functionType->byReference;
17502 type->typedByReference = functionType->typedByReference;
17503 if(e)
17504 {
17505 if(e->next && type->kind == 8 && (functionType && functionType->__anon1.__anon2.thisClass) && functionType->classObjectType == 2)
17506 e = e->next;
17507 e->destType = type;
17508 e = e->next;
17509 type = functionType->__anon1.__anon2.params.first;
17510 }
17511 else
17512 type->refCount = 0;
17513 }
17514 }
17515 if(type && type->kind == 0)
17516 {
17517 noParams = 1;
17518 if(!type->refCount)
17519 FreeType(type);
17520 type = (((void *)0));
17521 }
17522 for(; e; e = e->next)
17523 {
17524 if(!type && !emptyParams)
17525 {
17526 yylloc = e->loc;
17527 if(methodType && methodType->__anon1.__anon3.methodClass)
17528 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);
17529 else
17530 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);
17531 break;
17532 }
17533 if(methodType && type && type->kind == 20 && type->__anon1.templateParameter->type == 0)
17534 {
17535 struct Type * templatedType = (((void *)0));
17536 struct __ecereNameSpace__ecere__com__Class * _class = methodType->__anon1.__anon3.usedClass;
17537 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * curParam = (((void *)0));
17538 int id = 0;
17539
17540 if(_class && _class->templateArgs)
17541 {
17542 struct __ecereNameSpace__ecere__com__Class * sClass;
17543
17544 for(sClass = _class; sClass; sClass = sClass->base)
17545 {
17546 if(sClass->templateClass)
17547 sClass = sClass->templateClass;
17548 id = 0;
17549 for(curParam = sClass->templateParams.first; curParam; curParam = curParam->next)
17550 {
17551 if(curParam->type == 0 && !strcmp(type->__anon1.templateParameter->identifier->string, curParam->name))
17552 {
17553 struct __ecereNameSpace__ecere__com__Class * nextClass;
17554
17555 for(nextClass = sClass->base; nextClass; nextClass = nextClass->base)
17556 {
17557 if(nextClass->templateClass)
17558 nextClass = nextClass->templateClass;
17559 id += nextClass->templateParams.count;
17560 }
17561 break;
17562 }
17563 id++;
17564 }
17565 if(curParam)
17566 break;
17567 }
17568 }
17569 if(curParam && _class->templateArgs[id].__anon1.__anon1.dataTypeString)
17570 {
17571 unsigned int constant = type->constant;
17572 struct __ecereNameSpace__ecere__com__ClassTemplateArgument arg = _class->templateArgs[id];
17573
17574 {
17575 struct Context * context = SetupTemplatesContext(_class);
17576
17577 templatedType = ProcessTypeString(arg.__anon1.__anon1.dataTypeString, 0);
17578 FinishTemplatesContext(context);
17579 }
17580 if(templatedType->kind == 8 && constant)
17581 templatedType->constant = 1;
17582 else if(templatedType->kind == 13)
17583 {
17584 struct Type * t = templatedType->__anon1.type;
17585
17586 while(t->kind == 13)
17587 t = t->__anon1.type;
17588 if(constant)
17589 t->constant = constant;
17590 }
17591 e->destType = templatedType;
17592 if(templatedType)
17593 {
17594 templatedType->passAsTemplate = 1;
17595 }
17596 }
17597 else
17598 {
17599 e->destType = type;
17600 if(type)
17601 type->refCount++;
17602 }
17603 }
17604 else
17605 {
17606 if(type && type->kind == 14 && type->prev && type->prev->kind == 8 && type->prev->classObjectType)
17607 {
17608 e->destType = type->prev;
17609 e->destType->refCount++;
17610 }
17611 else
17612 {
17613 e->destType = type;
17614 if(type)
17615 type->refCount++;
17616 }
17617 }
17618 if(type && type->kind != 14)
17619 {
17620 struct Type * next = type->next;
17621
17622 if(!type->refCount)
17623 FreeType(type);
17624 type = next;
17625 }
17626 }
17627 if(type && type->kind != 14)
17628 {
17629 if(methodType && methodType->__anon1.__anon3.methodClass)
17630 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);
17631 else
17632 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);
17633 }
17634 yylloc = oldyylloc;
17635 if(type && !type->refCount)
17636 FreeType(type);
17637 }
17638 else
17639 {
17640 functionType = __extension__ ({
17641 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
17642
17643 __ecereInstance1->refCount = 0, __ecereInstance1->kind = 11, __ecereInstance1;
17644 });
17645 if(exp->__anon1.call.exp->type == 0)
17646 {
17647 char * string = exp->__anon1.call.exp->__anon1.__anon1.identifier->string;
17648
17649 if(inCompiler)
17650 {
17651 struct Symbol * symbol;
17652 struct Location oldyylloc = yylloc;
17653
17654 yylloc = exp->__anon1.call.exp->__anon1.__anon1.identifier->loc;
17655 if(strstr(string, "__builtin_") == string)
17656 {
17657 if(exp->destType)
17658 {
17659 functionType->__anon1.__anon2.returnType = exp->destType;
17660 exp->destType->refCount++;
17661 }
17662 }
17663 else
17664 Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "%s undefined; assuming extern returning int\n", (((void *)0))), string);
17665 symbol = __extension__ ({
17666 struct Symbol * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Symbol);
17667
17668 __ecereInstance1->string = __ecereNameSpace__ecere__sys__CopyString(string), __ecereInstance1->type = ProcessTypeString("int()", 1), __ecereInstance1;
17669 });
17670 __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Add(&globalContext->symbols, (struct __ecereNameSpace__ecere__sys__BTNode *)symbol);
17671 if(strstr(symbol->string, "::"))
17672 globalContext->hasNameSpace = 1;
17673 yylloc = oldyylloc;
17674 }
17675 }
17676 else if(exp->__anon1.call.exp->type == 8)
17677 {
17678 }
17679 else
17680 Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "callable object undefined; extern assuming returning int\n", (((void *)0))));
17681 if(!functionType->__anon1.__anon2.returnType)
17682 {
17683 functionType->__anon1.__anon2.returnType = __extension__ ({
17684 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
17685
17686 __ecereInstance1->refCount = 1, __ecereInstance1->kind = 3, __ecereInstance1;
17687 });
17688 }
17689 }
17690 if(functionType && functionType->kind == 11)
17691 {
17692 exp->expType = functionType->__anon1.__anon2.returnType;
17693 if(functionType->__anon1.__anon2.returnType)
17694 functionType->__anon1.__anon2.returnType->refCount++;
17695 if(!functionType->refCount)
17696 FreeType(functionType);
17697 }
17698 if(exp->__anon1.call.arguments)
17699 {
17700 for(e = (*exp->__anon1.call.arguments).first; e; e = e->next)
17701 ProcessExpressionType(e);
17702 }
17703 break;
17704 }
17705 case 8:
17706 {
17707 struct Type * type;
17708 struct Location oldyylloc = yylloc;
17709 unsigned int thisPtr;
17710 struct Expression * checkExp = exp->__anon1.member.exp;
17711
17712 while(checkExp)
17713 {
17714 if(checkExp->type == 11)
17715 checkExp = checkExp->__anon1.cast.exp;
17716 else if(checkExp->type == 5)
17717 checkExp = checkExp->__anon1.list ? (*checkExp->__anon1.list).first : (((void *)0));
17718 else
17719 break;
17720 }
17721 thisPtr = (checkExp && checkExp->type == 0 && !strcmp(checkExp->__anon1.__anon1.identifier->string, "this"));
17722 exp->thisPtr = thisPtr;
17723 if(exp->__anon1.member.member && exp->__anon1.member.member->_class && exp->__anon1.member.member->_class->__anon1.__anon1.name)
17724 {
17725 exp->__anon1.member.member->classSym = exp->__anon1.member.member->_class->__anon1.__anon1.symbol;
17726 }
17727 ProcessExpressionType(exp->__anon1.member.exp);
17728 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)
17729 {
17730 exp->isConstant = 0;
17731 }
17732 else
17733 exp->isConstant = exp->__anon1.member.exp->isConstant;
17734 type = exp->__anon1.member.exp->expType;
17735 yylloc = exp->loc;
17736 if(type && (type->kind == 20))
17737 {
17738 struct __ecereNameSpace__ecere__com__Class * _class = thisClass ? thisClass : currentClass;
17739 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * param = (((void *)0));
17740
17741 if(_class)
17742 {
17743 for(param = _class->templateParams.first; param; param = param->next)
17744 {
17745 if(param->type == 1 && exp->__anon1.member.member && exp->__anon1.member.member->string && !strcmp(param->name, exp->__anon1.member.member->string))
17746 break;
17747 }
17748 }
17749 if(param && param->defaultArg.__anon1.__anon2.__anon1.member)
17750 {
17751 struct Expression * argExp = GetTemplateArgExpByName(param->name, thisClass, 1);
17752
17753 if(argExp)
17754 {
17755 struct Expression * expMember = exp->__anon1.member.exp;
17756 struct Declarator * decl;
17757 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
17758 char thisClassTypeString[1024];
17759
17760 FreeIdentifier(exp->__anon1.member.member);
17761 ProcessExpressionType(argExp);
17762 {
17763 char * colon = strstr(param->defaultArg.__anon1.__anon2.memberString, "::");
17764
17765 if(colon)
17766 {
17767 memcpy(thisClassTypeString, param->defaultArg.__anon1.__anon2.memberString, colon - param->defaultArg.__anon1.__anon2.memberString);
17768 thisClassTypeString[colon - param->defaultArg.__anon1.__anon2.memberString] = '\0';
17769 }
17770 else
17771 strcpy(thisClassTypeString, _class->fullName);
17772 }
17773 decl = SpecDeclFromString(param->defaultArg.__anon1.__anon2.__anon1.member->dataTypeString, specs, (((void *)0)));
17774 exp->expType = ProcessType(specs, decl);
17775 if(exp->expType->kind == 8 && exp->expType->__anon1._class && exp->expType->__anon1._class->__anon1.registered && exp->expType->__anon1._class->__anon1.registered->templateClass)
17776 {
17777 struct __ecereNameSpace__ecere__com__Class * expClass = exp->expType->__anon1._class->__anon1.registered;
17778 struct __ecereNameSpace__ecere__com__Class * cClass = (((void *)0));
17779 int paramCount = 0;
17780 int lastParam = -1;
17781 char templateString[1024];
17782 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * param;
17783
17784 sprintf(templateString, "%s<", expClass->templateClass->fullName);
17785 for(cClass = expClass; cClass; cClass = cClass->base)
17786 {
17787 int p = 0;
17788
17789 for(param = cClass->templateParams.first; param; param = param->next)
17790 {
17791 int id = p;
17792 struct __ecereNameSpace__ecere__com__Class * sClass;
17793 struct __ecereNameSpace__ecere__com__ClassTemplateArgument arg;
17794
17795 for(sClass = cClass->base; sClass; sClass = sClass->base)
17796 id += sClass->templateParams.count;
17797 arg = expClass->templateArgs[id];
17798 for(sClass = _class; sClass; sClass = sClass->base)
17799 {
17800 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * cParam;
17801 int p = 0;
17802 struct __ecereNameSpace__ecere__com__Class * nextClass;
17803
17804 for(nextClass = sClass->base; nextClass; nextClass = nextClass->base)
17805 p += nextClass->templateParams.count;
17806 for(cParam = sClass->templateParams.first; cParam; cParam = cParam->next, p++)
17807 {
17808 if(cParam->type == 0 && arg.__anon1.__anon1.dataTypeString && !strcmp(cParam->name, arg.__anon1.__anon1.dataTypeString))
17809 {
17810 if(_class->templateArgs && arg.__anon1.__anon1.dataTypeString && (!param->defaultArg.__anon1.__anon1.dataTypeString || strcmp(arg.__anon1.__anon1.dataTypeString, param->defaultArg.__anon1.__anon1.dataTypeString)))
17811 {
17812 arg.__anon1.__anon1.dataTypeString = _class->templateArgs[p].__anon1.__anon1.dataTypeString;
17813 arg.__anon1.__anon1.dataTypeClass = _class->templateArgs[p].__anon1.__anon1.dataTypeClass;
17814 break;
17815 }
17816 }
17817 }
17818 }
17819 {
17820 char argument[256];
17821
17822 argument[0] = '\0';
17823 switch(param->type)
17824 {
17825 case 2:
17826 {
17827 char expString[1024];
17828 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
17829 struct Declarator * decl = SpecDeclFromString(param->__anon1.dataTypeString, specs, (((void *)0)));
17830 struct Expression * exp;
17831 char * string = PrintHexUInt64(arg.__anon1.expression.__anon1.ui64);
17832
17833 exp = MkExpCast(MkTypeName(specs, decl), MkExpConstant(string));
17834 (__ecereNameSpace__ecere__com__eSystem_Delete(string), string = 0);
17835 ProcessExpressionType(exp);
17836 ComputeExpression(exp);
17837 expString[0] = '\0';
17838 PrintExpression(exp, expString);
17839 strcat(argument, expString);
17840 FreeExpression(exp);
17841 break;
17842 }
17843 case 1:
17844 {
17845 strcat(argument, arg.__anon1.__anon2.__anon1.member->name);
17846 break;
17847 }
17848 case 0:
17849 {
17850 if(arg.__anon1.__anon1.dataTypeString && (!param->defaultArg.__anon1.__anon1.dataTypeString || strcmp(arg.__anon1.__anon1.dataTypeString, param->defaultArg.__anon1.__anon1.dataTypeString)))
17851 {
17852 if(!strcmp(arg.__anon1.__anon1.dataTypeString, "thisclass"))
17853 strcat(argument, thisClassTypeString);
17854 else
17855 strcat(argument, arg.__anon1.__anon1.dataTypeString);
17856 }
17857 break;
17858 }
17859 }
17860 if(argument[0])
17861 {
17862 if(paramCount)
17863 strcat(templateString, ", ");
17864 if(lastParam != p - 1)
17865 {
17866 strcat(templateString, param->name);
17867 strcat(templateString, " = ");
17868 }
17869 strcat(templateString, argument);
17870 paramCount++;
17871 lastParam = p;
17872 }
17873 p++;
17874 }
17875 }
17876 }
17877 {
17878 int len = strlen(templateString);
17879
17880 if(templateString[len - 1] == '>')
17881 templateString[len++] = ' ';
17882 templateString[len++] = '>';
17883 templateString[len++] = '\0';
17884 }
17885 {
17886 struct Context * context = SetupTemplatesContext(_class);
17887
17888 FreeType(exp->expType);
17889 exp->expType = ProcessTypeString(templateString, 0);
17890 FinishTemplatesContext(context);
17891 }
17892 }
17893 if(!__ecereProp_Type_Get_isPointerType(expMember->expType))
17894 expMember = MkExpCast(MkTypeName(MkListOne(MkSpecifierName("uintptr")), (((void *)0))), expMember);
17895 exp->type = 5;
17896 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")))))))));
17897 }
17898 }
17899 else if(type->__anon1.templateParameter && type->__anon1.templateParameter->type == 0 && (type->__anon1.templateParameter->__anon1.dataType || type->__anon1.templateParameter->dataTypeString))
17900 {
17901 type = ProcessTemplateParameterType(type->__anon1.templateParameter);
17902 }
17903 }
17904 if(type && (type->kind == 20))
17905 ;
17906 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)))
17907 {
17908 struct Identifier * id = exp->__anon1.member.member;
17909 int typeKind = type->kind;
17910 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));
17911
17912 if(typeKind == 19 && exp->__anon1.member.exp->type == 24)
17913 {
17914 _class = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "ecere::com::Class");
17915 typeKind = 8;
17916 }
17917 if(id)
17918 {
17919 if(typeKind == 3 || typeKind == 15)
17920 _class = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "int");
17921 else if(!_class)
17922 {
17923 if(type->kind == 8 && type->__anon1._class && type->__anon1._class->__anon1.registered)
17924 {
17925 _class = type->__anon1._class->__anon1.registered;
17926 }
17927 else if((type->kind == 12 || type->kind == 13) && type->__anon1.type && type->__anon1.type->kind == 1)
17928 {
17929 _class = FindClass("char *")->__anon1.registered;
17930 }
17931 else if(type->kind == 13)
17932 {
17933 _class = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "uintptr");
17934 FreeType(exp->expType);
17935 exp->expType = ProcessTypeString("uintptr", 0);
17936 exp->byReference = 1;
17937 }
17938 else
17939 {
17940 char string[1024] = "";
17941 struct Symbol * classSym;
17942
17943 PrintTypeNoConst(type, string, 0, 1);
17944 classSym = FindClass(string);
17945 if(classSym)
17946 _class = classSym->__anon1.registered;
17947 }
17948 }
17949 }
17950 if(_class && id)
17951 {
17952 struct __ecereNameSpace__ecere__com__Property * prop = (((void *)0));
17953 struct __ecereNameSpace__ecere__com__Method * method = (((void *)0));
17954 struct __ecereNameSpace__ecere__com__DataMember * member = (((void *)0));
17955 struct __ecereNameSpace__ecere__com__Property * revConvert = (((void *)0));
17956 struct __ecereNameSpace__ecere__com__ClassProperty * classProp = (((void *)0));
17957
17958 if(id && id->_class && id->_class->__anon1.__anon1.name && !strcmp(id->_class->__anon1.__anon1.name, "property"))
17959 exp->__anon1.member.memberType = 1;
17960 if(id && id->_class && type->__anon1._class && !__ecereNameSpace__ecere__com__eClass_IsDerived(type->__anon1._class->__anon1.registered, _class))
17961 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "invalid class specifier %s for object of class %s\n", (((void *)0))), _class->fullName, type->__anon1._class->string);
17962 if(typeKind != 19)
17963 {
17964 if((exp->__anon1.member.memberType == 0 && thisPtr) || exp->__anon1.member.memberType == 3)
17965 {
17966 member = __ecereNameSpace__ecere__com__eClass_FindDataMember(_class, id->string, privateModule, (((void *)0)), (((void *)0)));
17967 if(member && member->_class != (_class->templateClass ? _class->templateClass : _class) && exp->__anon1.member.memberType != 3)
17968 {
17969 prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, id->string, privateModule);
17970 if(prop)
17971 member = (((void *)0));
17972 }
17973 if(!member && !prop)
17974 prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, id->string, privateModule);
17975 if((member && member->_class == (_class->templateClass ? _class->templateClass : _class)) || (prop && prop->_class == (_class->templateClass ? _class->templateClass : _class)))
17976 exp->__anon1.member.thisPtr = 1;
17977 }
17978 else
17979 {
17980 unsigned int useMemberForNonConst = 0;
17981
17982 if(!id->classSym)
17983 {
17984 prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, id->string, (((void *)0)));
17985 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);
17986 if(useMemberForNonConst || !id->_class || !id->_class->__anon1.__anon1.name || strcmp(id->_class->__anon1.__anon1.name, "property"))
17987 member = __ecereNameSpace__ecere__com__eClass_FindDataMember(_class, id->string, (((void *)0)), (((void *)0)), (((void *)0)));
17988 }
17989 if((!prop || useMemberForNonConst) && !member)
17990 {
17991 method = useMemberForNonConst ? (((void *)0)) : __ecereNameSpace__ecere__com__eClass_FindMethod(_class, id->string, (((void *)0)));
17992 if(!method)
17993 {
17994 prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, id->string, privateModule);
17995 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);
17996 if(useMemberForNonConst || !id->_class || !id->_class->__anon1.__anon1.name || strcmp(id->_class->__anon1.__anon1.name, "property"))
17997 member = __ecereNameSpace__ecere__com__eClass_FindDataMember(_class, id->string, privateModule, (((void *)0)), (((void *)0)));
17998 }
17999 }
18000 if(member && prop)
18001 {
18002 if(useMemberForNonConst || (member->_class != prop->_class && !id->_class && __ecereNameSpace__ecere__com__eClass_IsDerived(member->_class, prop->_class)))
18003 prop = (((void *)0));
18004 else
18005 member = (((void *)0));
18006 }
18007 }
18008 }
18009 if(!prop && !member && !method)
18010 method = __ecereNameSpace__ecere__com__eClass_FindMethod(_class, id->string, privateModule);
18011 if(!prop && !member && !method)
18012 {
18013 if(typeKind == 19)
18014 {
18015 classProp = __ecereNameSpace__ecere__com__eClass_FindClassProperty(type->__anon1._class->__anon1.registered, exp->__anon1.member.member->string);
18016 if(classProp)
18017 {
18018 exp->__anon1.member.memberType = 5;
18019 exp->expType = ProcessTypeString(classProp->dataTypeString, 0);
18020 }
18021 else
18022 {
18023 char structName[1024];
18024 struct Identifier * id = exp->__anon1.member.member;
18025 struct Expression * classExp = exp->__anon1.member.exp;
18026
18027 type->refCount++;
18028 FreeType(classExp->expType);
18029 classExp->expType = ProcessTypeString("ecere::com::Class", 0);
18030 strcpy(structName, "__ecereClassData_");
18031 FullClassNameCat(structName, type->__anon1._class->string, 0);
18032 exp->type = 9;
18033 exp->__anon1.member.member = id;
18034 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"))))))));
18035 FreeType(type);
18036 ProcessExpressionType(exp);
18037 return ;
18038 }
18039 }
18040 else
18041 {
18042 struct Symbol * classSym = FindClass(id->string);
18043
18044 if(classSym)
18045 {
18046 struct __ecereNameSpace__ecere__com__Class * convertClass = classSym->__anon1.registered;
18047
18048 if(convertClass)
18049 revConvert = __ecereNameSpace__ecere__com__eClass_FindProperty(convertClass, _class->fullName, privateModule);
18050 }
18051 }
18052 }
18053 if(exp->__anon1.member.exp->destType)
18054 FreeType(exp->__anon1.member.exp->destType);
18055 {
18056 if(method && !method->_class->symbol)
18057 method->_class->symbol = FindClass(method->_class->fullName);
18058 if(prop && !prop->_class->symbol)
18059 prop->_class->symbol = FindClass(prop->_class->fullName);
18060 exp->__anon1.member.exp->destType = __extension__ ({
18061 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
18062
18063 __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;
18064 });
18065 }
18066 if(prop)
18067 {
18068 exp->__anon1.member.memberType = 1;
18069 if(!prop->dataType)
18070 ProcessPropertyType(prop);
18071 exp->expType = prop->dataType;
18072 if(!strcmp(_class->base->fullName, "eda::Row") && !exp->expType->constant && !exp->destType)
18073 {
18074 struct Type * type = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
18075
18076 CopyTypeInto(type, exp->expType);
18077 type->refCount = 1;
18078 type->constant = 1;
18079 exp->expType = type;
18080 }
18081 else if(prop->dataType)
18082 prop->dataType->refCount++;
18083 }
18084 else if(member)
18085 {
18086 if(exp->__anon1.member.exp->expType->classObjectType == 2 && !strcmp(exp->__anon1.member.member->string, "_class"))
18087 {
18088 FreeExpContents(exp);
18089 exp->type = 0;
18090 exp->__anon1.__anon1.identifier = MkIdentifier("class");
18091 ProcessExpressionType(exp);
18092 return ;
18093 }
18094 exp->__anon1.member.memberType = 3;
18095 DeclareStruct(curExternal, _class->fullName, 0, 1);
18096 if(member->_class != _class)
18097 DeclareStruct(curExternal, member->_class->fullName, 0, 1);
18098 if(!member->dataType)
18099 {
18100 struct Context * context = SetupTemplatesContext(_class);
18101
18102 member->dataType = ProcessTypeString(member->dataTypeString, 0);
18103 FinishTemplatesContext(context);
18104 }
18105 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)
18106 member->dataType->bitMemberSize = ((struct __ecereNameSpace__ecere__com__BitMember *)member)->size;
18107 exp->expType = member->dataType;
18108 if(member->dataType)
18109 member->dataType->refCount++;
18110 }
18111 else if(revConvert)
18112 {
18113 exp->__anon1.member.memberType = 4;
18114 exp->expType = MkClassType(revConvert->_class->fullName);
18115 }
18116 else if(method)
18117 {
18118 {
18119 exp->__anon1.member.memberType = 2;
18120 }
18121 if(!method->dataType)
18122 ProcessMethodType(method);
18123 exp->expType = __extension__ ({
18124 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
18125
18126 __ecereInstance1->refCount = 1, __ecereInstance1->kind = 16, __ecereInstance1->__anon1.__anon3.method = method, __ecereInstance1;
18127 });
18128 exp->expType->__anon1.__anon3.methodClass = (id && id->_class) ? _class : (((void *)0));
18129 exp->expType->__anon1.__anon3.usedClass = _class;
18130 }
18131 else if(!classProp)
18132 {
18133 if(exp->__anon1.member.exp->expType->classObjectType == 2 && !strcmp(exp->__anon1.member.member->string, "_class"))
18134 {
18135 FreeExpContents(exp);
18136 exp->type = 0;
18137 exp->__anon1.__anon1.identifier = MkIdentifier("class");
18138 FreeType(exp->expType);
18139 exp->expType = MkClassType("ecere::com::Class");
18140 return ;
18141 }
18142 yylloc = exp->__anon1.member.member->loc;
18143 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "couldn't find member %s in class %s\n", (((void *)0))), id->string, _class->fullName);
18144 if(inCompiler)
18145 __ecereNameSpace__ecere__com__eClass_AddDataMember(_class, id->string, "int", 0, 0, 1);
18146 }
18147 if(_class && exp->expType)
18148 {
18149 struct __ecereNameSpace__ecere__com__Class * tClass;
18150
18151 tClass = type->__anon1._class && type->__anon1._class->__anon1.registered ? type->__anon1._class->__anon1.registered : _class;
18152 while(tClass && !tClass->templateClass)
18153 tClass = tClass->base;
18154 if(tClass && exp->expType->kind == 20 && exp->expType->__anon1.templateParameter->type == 0)
18155 {
18156 int id = 0;
18157 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * curParam = (((void *)0));
18158 struct __ecereNameSpace__ecere__com__Class * sClass;
18159
18160 for(sClass = tClass; sClass; sClass = sClass->base)
18161 {
18162 id = 0;
18163 if(sClass->templateClass)
18164 sClass = sClass->templateClass;
18165 for(curParam = sClass->templateParams.first; curParam; curParam = curParam->next)
18166 {
18167 if(curParam->type == 0 && !strcmp(exp->expType->__anon1.templateParameter->identifier->string, curParam->name))
18168 {
18169 for(sClass = sClass->base; sClass; sClass = sClass->base)
18170 id += sClass->templateParams.count;
18171 break;
18172 }
18173 id++;
18174 }
18175 if(curParam)
18176 break;
18177 }
18178 if(curParam && tClass->templateArgs[id].__anon1.__anon1.dataTypeString)
18179 {
18180 struct __ecereNameSpace__ecere__com__ClassTemplateArgument arg = tClass->templateArgs[id];
18181 struct Context * context = SetupTemplatesContext(tClass);
18182 unsigned int constant = exp->expType->constant;
18183 unsigned int passAsTemplate = 0;
18184 struct __ecereNameSpace__ecere__com__Class * thisClassFrom = (((void *)0));
18185 struct Type * t = ProcessTypeString(exp->expType->__anon1.templateParameter->dataTypeString, 0);
18186
18187 if(t && t->kind == 8 && t->__anon1._class)
18188 thisClassFrom = t->__anon1._class->__anon1.registered;
18189 else
18190 thisClassFrom = __ecereNameSpace__ecere__com__eSystem_FindClass(GetPrivateModule(), "class");
18191 FreeType(t);
18192 passAsTemplate = tClass->templateClass && (exp->expType->kind != 20 || (!exp->expType->__anon1.templateParameter || (!exp->expType->__anon1.templateParameter->dataTypeString && !exp->expType->__anon1.templateParameter->__anon1.dataType)));
18193 FreeType(exp->expType);
18194 exp->expType = ProcessTypeString(arg.__anon1.__anon1.dataTypeString, 0);
18195 exp->expType->thisClassFrom = thisClassFrom;
18196 if(exp->expType->kind == 8 && constant)
18197 exp->expType->constant = 1;
18198 else if(exp->expType->kind == 13)
18199 {
18200 struct Type * t = exp->expType->__anon1.type;
18201
18202 while(t->kind == 13)
18203 t = t->__anon1.type;
18204 if(constant)
18205 t->constant = constant;
18206 }
18207 if(exp->expType)
18208 {
18209 if(exp->expType->kind == 21)
18210 {
18211 FreeType(exp->expType);
18212 exp->expType = ReplaceThisClassType(_class);
18213 }
18214 if(passAsTemplate)
18215 exp->expType->passAsTemplate = 1;
18216 if(!exp->destType)
18217 {
18218 exp->destType = ProcessTypeString(arg.__anon1.__anon1.dataTypeString, 0);
18219 if(exp->destType->kind == 8 && constant)
18220 exp->destType->constant = 1;
18221 else if(exp->destType->kind == 13)
18222 {
18223 struct Type * t = exp->destType->__anon1.type;
18224
18225 while(t->kind == 13)
18226 t = t->__anon1.type;
18227 if(constant)
18228 t->constant = constant;
18229 }
18230 if(exp->destType->kind == 21)
18231 {
18232 FreeType(exp->destType);
18233 exp->destType = ReplaceThisClassType(_class);
18234 }
18235 }
18236 }
18237 FinishTemplatesContext(context);
18238 }
18239 }
18240 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)
18241 {
18242 int id = 0;
18243 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * curParam = (((void *)0));
18244 struct __ecereNameSpace__ecere__com__Class * sClass;
18245
18246 for(sClass = tClass; sClass; sClass = sClass->base)
18247 {
18248 id = 0;
18249 if(sClass->templateClass)
18250 sClass = sClass->templateClass;
18251 for(curParam = sClass->templateParams.first; curParam; curParam = curParam->next)
18252 {
18253 if(curParam->type == 0 && !strcmp(exp->expType->__anon1.type->__anon1.templateParameter->identifier->string, curParam->name))
18254 {
18255 for(sClass = sClass->base; sClass; sClass = sClass->base)
18256 id += sClass->templateParams.count;
18257 break;
18258 }
18259 id++;
18260 }
18261 if(curParam)
18262 break;
18263 }
18264 if(curParam)
18265 {
18266 struct __ecereNameSpace__ecere__com__ClassTemplateArgument arg = tClass->templateArgs[id];
18267 struct Context * context = SetupTemplatesContext(tClass);
18268 struct Type * basicType;
18269
18270 basicType = ProcessTypeString(arg.__anon1.__anon1.dataTypeString, 0);
18271 if(basicType)
18272 {
18273 if(basicType->kind == 21)
18274 {
18275 FreeType(basicType);
18276 basicType = ReplaceThisClassType(_class);
18277 }
18278 FreeType(exp->expType);
18279 exp->expType = __extension__ ({
18280 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
18281
18282 __ecereInstance1->refCount = 1, __ecereInstance1->kind = 13, __ecereInstance1->__anon1.type = basicType, __ecereInstance1;
18283 });
18284 if(!exp->destType)
18285 {
18286 exp->destType = exp->expType;
18287 exp->destType->refCount++;
18288 }
18289 {
18290 struct Expression * newExp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression);
18291 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
18292 struct Declarator * decl;
18293
18294 decl = SpecDeclFromString(arg.__anon1.__anon1.dataTypeString, specs, (((void *)0)));
18295 *newExp = *exp;
18296 if(exp->destType)
18297 exp->destType->refCount++;
18298 if(exp->expType)
18299 exp->expType->refCount++;
18300 exp->type = 11;
18301 exp->__anon1.cast.typeName = MkTypeName(specs, MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), decl));
18302 exp->__anon1.cast.exp = newExp;
18303 }
18304 }
18305 FinishTemplatesContext(context);
18306 }
18307 }
18308 else if(tClass && exp->expType->kind == 8 && exp->expType->__anon1._class && strchr(exp->expType->__anon1._class->string, '<'))
18309 {
18310 struct __ecereNameSpace__ecere__com__Class * expClass = exp->expType->__anon1._class->__anon1.registered;
18311
18312 if(expClass)
18313 {
18314 struct __ecereNameSpace__ecere__com__Class * cClass = (((void *)0));
18315 int p = 0;
18316 int paramCount = 0;
18317 int lastParam = -1;
18318 char templateString[1024];
18319 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * param;
18320
18321 sprintf(templateString, "%s<", expClass->templateClass->fullName);
18322 while(cClass != expClass)
18323 {
18324 struct __ecereNameSpace__ecere__com__Class * sClass;
18325
18326 for(sClass = expClass; sClass && sClass->base != cClass; sClass = sClass->base)
18327 ;
18328 cClass = sClass;
18329 for(param = cClass->templateParams.first; param; param = param->next)
18330 {
18331 struct __ecereNameSpace__ecere__com__Class * cClassCur = (((void *)0));
18332 int cp = 0;
18333 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * paramCur = (((void *)0));
18334 struct __ecereNameSpace__ecere__com__ClassTemplateArgument arg;
18335
18336 while(cClassCur != tClass && !paramCur)
18337 {
18338 struct __ecereNameSpace__ecere__com__Class * sClassCur;
18339
18340 for(sClassCur = tClass; sClassCur && sClassCur->base != cClassCur; sClassCur = sClassCur->base)
18341 ;
18342 cClassCur = sClassCur;
18343 for(paramCur = cClassCur->templateParams.first; paramCur; paramCur = paramCur->next)
18344 {
18345 if(!strcmp(paramCur->name, param->name))
18346 {
18347 break;
18348 }
18349 cp++;
18350 }
18351 }
18352 if(paramCur && paramCur->type == 0)
18353 arg = tClass->templateArgs[cp];
18354 else
18355 arg = expClass->templateArgs[p];
18356 {
18357 char argument[256];
18358
18359 argument[0] = '\0';
18360 switch(param->type)
18361 {
18362 case 2:
18363 {
18364 char expString[1024];
18365 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
18366 struct Declarator * decl = SpecDeclFromString(param->__anon1.dataTypeString, specs, (((void *)0)));
18367 struct Expression * exp;
18368 char * string = PrintHexUInt64(arg.__anon1.expression.__anon1.ui64);
18369
18370 exp = MkExpCast(MkTypeName(specs, decl), MkExpConstant(string));
18371 (__ecereNameSpace__ecere__com__eSystem_Delete(string), string = 0);
18372 ProcessExpressionType(exp);
18373 ComputeExpression(exp);
18374 expString[0] = '\0';
18375 PrintExpression(exp, expString);
18376 strcat(argument, expString);
18377 FreeExpression(exp);
18378 break;
18379 }
18380 case 1:
18381 {
18382 strcat(argument, arg.__anon1.__anon2.__anon1.member->name);
18383 break;
18384 }
18385 case 0:
18386 {
18387 if(arg.__anon1.__anon1.dataTypeString && (!param->defaultArg.__anon1.__anon1.dataTypeString || strcmp(arg.__anon1.__anon1.dataTypeString, param->defaultArg.__anon1.__anon1.dataTypeString)))
18388 strcat(argument, arg.__anon1.__anon1.dataTypeString);
18389 break;
18390 }
18391 }
18392 if(argument[0])
18393 {
18394 if(paramCount)
18395 strcat(templateString, ", ");
18396 if(lastParam != p - 1)
18397 {
18398 strcat(templateString, param->name);
18399 strcat(templateString, " = ");
18400 }
18401 strcat(templateString, argument);
18402 paramCount++;
18403 lastParam = p;
18404 }
18405 }
18406 p++;
18407 }
18408 }
18409 {
18410 int len = strlen(templateString);
18411
18412 if(templateString[len - 1] == '>')
18413 templateString[len++] = ' ';
18414 templateString[len++] = '>';
18415 templateString[len++] = '\0';
18416 }
18417 FreeType(exp->expType);
18418 {
18419 struct Context * context = SetupTemplatesContext(tClass);
18420
18421 exp->expType = ProcessTypeString(templateString, 0);
18422 FinishTemplatesContext(context);
18423 }
18424 }
18425 }
18426 }
18427 }
18428 else
18429 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)");
18430 }
18431 else if(type && (type->kind == 9 || type->kind == 10))
18432 {
18433 struct Type * memberType = exp->__anon1.member.member ? FindMember(type, exp->__anon1.member.member->string) : (((void *)0));
18434
18435 if(memberType)
18436 {
18437 exp->expType = memberType;
18438 if(memberType)
18439 memberType->refCount++;
18440 }
18441 }
18442 else
18443 {
18444 char expString[10240];
18445
18446 expString[0] = '\0';
18447 if(inCompiler)
18448 {
18449 PrintExpression(exp, expString);
18450 __ecereNameSpace__ecere__sys__ChangeCh(expString, '\n', ' ');
18451 }
18452 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "member operator on non-structure type expression %s\n", (((void *)0))), expString);
18453 }
18454 if(exp->expType && exp->expType->kind == 21 && (!exp->destType || exp->destType->kind != 21))
18455 {
18456 if(type && (type->kind == 8 || type->kind == 19 || type->kind == 3 || type->kind == 15))
18457 {
18458 struct Identifier * id = exp->__anon1.member.member;
18459 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));
18460
18461 if(_class)
18462 {
18463 FreeType(exp->expType);
18464 exp->expType = ReplaceThisClassType(_class);
18465 }
18466 }
18467 }
18468 yylloc = oldyylloc;
18469 break;
18470 }
18471 case 9:
18472 {
18473 struct Type * destType = exp->destType;
18474
18475 if(exp->__anon1.member.member && exp->__anon1.member.member->_class && exp->__anon1.member.member->_class->__anon1.__anon1.name)
18476 {
18477 exp->__anon1.member.member->classSym = exp->__anon1.member.member->_class->__anon1.__anon1.symbol;
18478 }
18479 exp->__anon1.member.exp = MkExpBrackets(MkListOne(MkExpOp((((void *)0)), '*', exp->__anon1.member.exp)));
18480 exp->type = 8;
18481 if(destType)
18482 destType->count++;
18483 ProcessExpressionType(exp);
18484 if(destType)
18485 destType->count--;
18486 break;
18487 }
18488 case 15:
18489 {
18490 struct Symbol * classSym = exp->__anon1._class->__anon1.__anon1.symbol;
18491
18492 if(classSym && classSym->__anon1.registered)
18493 {
18494 if(classSym->__anon1.registered->type == 5 || (classSym->__anon1.registered->fixed && classSym->__anon1.registered->structSize))
18495 {
18496 char name[1024];
18497 struct __ecereNameSpace__ecere__com__Class * b = classSym->__anon1.registered;
18498
18499 name[0] = '\0';
18500 DeclareStruct(curExternal, classSym->string, 0, 1);
18501 FreeSpecifier(exp->__anon1._class);
18502 FullClassNameCat(name, classSym->string, 0);
18503 if(b->offset == 0)
18504 {
18505 exp->type = 10;
18506 exp->__anon1.typeName = MkTypeName(MkListOne(MkStructOrUnion(3, MkIdentifier(name), (((void *)0)))), (((void *)0)));
18507 }
18508 else
18509 {
18510 struct Expression * e;
18511
18512 exp->type = 4;
18513 if(b->structSize == b->offset)
18514 exp->__anon1.op.exp1 = MkExpConstant("0");
18515 else
18516 exp->__anon1.op.exp1 = MkExpTypeSize(MkTypeName(MkListOne(MkStructOrUnion(3, MkIdentifier(name), (((void *)0)))), (((void *)0))));
18517 exp->__anon1.op.op = '+';
18518 e = exp;
18519 while(b->offset != 0)
18520 {
18521 struct Symbol * sym;
18522 struct Expression * typeSize;
18523
18524 b = b->base;
18525 sym = FindClass(b->fullName);
18526 name[0] = '\0';
18527 DeclareStruct(curExternal, sym->string, 0, 1);
18528 FullClassNameCat(name, sym->string, 0);
18529 if(b->structSize == b->offset)
18530 typeSize = MkExpConstant("0");
18531 else
18532 typeSize = MkExpTypeSize(MkTypeName(MkListOne(MkStructOrUnion(3, MkIdentifier(name), (((void *)0)))), (((void *)0))));
18533 e->__anon1.op.exp2 = b->offset ? MkExpOp(typeSize, '+', (((void *)0))) : typeSize;
18534 e = e->__anon1.op.exp2;
18535 }
18536 }
18537 }
18538 else
18539 {
18540 if(classSym->__anon1.registered->fixed && !classSym->__anon1.registered->structSize)
18541 {
18542 FreeSpecifier(exp->__anon1._class);
18543 exp->__anon1.__anon1.constant = PrintUInt(classSym->__anon1.registered->templateClass ? classSym->__anon1.registered->templateClass->structSize : classSym->__anon1.registered->structSize);
18544 exp->type = 2;
18545 }
18546 else
18547 {
18548 char className[1024];
18549
18550 strcpy(className, "__ecereClass_");
18551 FullClassNameCat(className, classSym->string, 1);
18552 DeclareClass(curExternal, classSym, className);
18553 FreeExpContents(exp);
18554 exp->type = 9;
18555 exp->__anon1.member.exp = MkExpIdentifier(MkIdentifier(className));
18556 exp->__anon1.member.member = MkIdentifier("structSize");
18557 }
18558 }
18559 }
18560 exp->expType = __extension__ ({
18561 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
18562
18563 __ecereInstance1->refCount = 1, __ecereInstance1->kind = 23, __ecereInstance1;
18564 });
18565 break;
18566 }
18567 case 10:
18568 {
18569 struct Type * type = ProcessType(exp->__anon1.typeName->qualifiers, exp->__anon1.typeName->declarator);
18570
18571 exp->expType = __extension__ ({
18572 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
18573
18574 __ecereInstance1->refCount = 1, __ecereInstance1->kind = 23, __ecereInstance1;
18575 });
18576 exp->isConstant = 1;
18577 DeclareType(curExternal, type, 1, 0);
18578 FreeType(type);
18579 break;
18580 }
18581 case 11:
18582 {
18583 struct Type * type = ProcessType(exp->__anon1.cast.typeName->qualifiers, exp->__anon1.cast.typeName->declarator);
18584
18585 type->count = 1;
18586 FreeType(exp->__anon1.cast.exp->destType);
18587 exp->__anon1.cast.exp->destType = type;
18588 type->refCount++;
18589 type->casted = 1;
18590 ProcessExpressionType(exp->__anon1.cast.exp);
18591 type->casted = 0;
18592 type->count = 0;
18593 exp->expType = type;
18594 if(!exp->__anon1.cast.exp->needCast && !NeedCast(exp->__anon1.cast.exp->expType, type))
18595 {
18596 void * prev = exp->prev, * next = exp->next;
18597 struct Type * expType = exp->__anon1.cast.exp->destType;
18598 struct Expression * castExp = exp->__anon1.cast.exp;
18599 struct Type * destType = exp->destType;
18600
18601 if(expType)
18602 expType->refCount++;
18603 FreeType(exp->expType);
18604 FreeTypeName(exp->__anon1.cast.typeName);
18605 *exp = *castExp;
18606 FreeType(exp->expType);
18607 FreeType(exp->destType);
18608 exp->expType = expType;
18609 exp->destType = destType;
18610 ((castExp ? __extension__ ({
18611 void * __ecerePtrToDelete = (castExp);
18612
18613 __ecereClass_Expression->Destructor ? __ecereClass_Expression->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete);
18614 }) : 0), castExp = 0);
18615 exp->prev = prev;
18616 exp->next = next;
18617 }
18618 else
18619 {
18620 exp->isConstant = exp->__anon1.cast.exp->isConstant;
18621 }
18622 break;
18623 }
18624 case 33:
18625 {
18626 struct Type * type = ProcessType(exp->__anon1.initializer.typeName->qualifiers, exp->__anon1.initializer.typeName->declarator);
18627
18628 exp->expType = type;
18629 break;
18630 }
18631 case 34:
18632 {
18633 struct Type * type = ProcessType(exp->__anon1.vaArg.typeName->qualifiers, exp->__anon1.vaArg.typeName->declarator);
18634
18635 ProcessExpressionType(exp->__anon1.vaArg.exp);
18636 exp->expType = type;
18637 break;
18638 }
18639 case 12:
18640 {
18641 struct Expression * e;
18642 struct Type * t = exp->destType;
18643
18644 if(t && !exp->destType->casted)
18645 {
18646 t = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
18647 CopyTypeInto(t, exp->destType);
18648 t->count = 0;
18649 }
18650 else if(t)
18651 t->refCount++;
18652 exp->isConstant = 1;
18653 FreeType(exp->__anon1.cond.cond->destType);
18654 exp->__anon1.cond.cond->destType = MkClassType("bool");
18655 exp->__anon1.cond.cond->destType->truth = 1;
18656 ProcessExpressionType(exp->__anon1.cond.cond);
18657 if(!exp->__anon1.cond.cond->isConstant)
18658 exp->isConstant = 0;
18659 for(e = (*exp->__anon1.cond.exp).first; e; e = e->next)
18660 {
18661 if(!e->next)
18662 {
18663 FreeType(e->destType);
18664 e->destType = t;
18665 if(e->destType)
18666 e->destType->refCount++;
18667 }
18668 ProcessExpressionType(e);
18669 if(!e->next)
18670 {
18671 exp->expType = e->expType;
18672 if(e->expType)
18673 e->expType->refCount++;
18674 }
18675 if(!e->isConstant)
18676 exp->isConstant = 0;
18677 }
18678 FreeType(exp->__anon1.cond.elseExp->destType);
18679 exp->__anon1.cond.elseExp->destType = t ? t : exp->expType;
18680 if(exp->__anon1.cond.elseExp->destType)
18681 exp->__anon1.cond.elseExp->destType->refCount++;
18682 ProcessExpressionType(exp->__anon1.cond.elseExp);
18683 if(!exp->__anon1.cond.elseExp->isConstant)
18684 exp->isConstant = 0;
18685 FreeType(t);
18686 break;
18687 }
18688 case 23:
18689 {
18690 if(exp->__anon1.compound && exp->__anon1.compound->__anon1.compound.statements && (*exp->__anon1.compound->__anon1.compound.statements).last)
18691 {
18692 struct Statement * last = (*exp->__anon1.compound->__anon1.compound.statements).last;
18693
18694 if(last->type == 3 && last->__anon1.expressions && (*last->__anon1.expressions).last)
18695 {
18696 ((struct Expression *)(*last->__anon1.expressions).last)->destType = exp->destType;
18697 if(exp->destType)
18698 exp->destType->refCount++;
18699 }
18700 ProcessStatement(exp->__anon1.compound);
18701 exp->expType = (last->__anon1.expressions && (*last->__anon1.expressions).last) ? ((struct Expression *)(*last->__anon1.expressions).last)->expType : (((void *)0));
18702 if(exp->expType)
18703 exp->expType->refCount++;
18704 }
18705 break;
18706 }
18707 case 24:
18708 {
18709 struct Specifier * spec = (*exp->__anon1._classExp.specifiers).first;
18710
18711 if(spec && spec->type == 1)
18712 {
18713 exp->expType = MkClassType(spec->__anon1.__anon1.name);
18714 exp->expType->kind = 19;
18715 exp->byReference = 1;
18716 }
18717 else
18718 {
18719 exp->expType = MkClassType("ecere::com::Class");
18720 exp->byReference = 1;
18721 }
18722 break;
18723 }
18724 case 25:
18725 {
18726 struct __ecereNameSpace__ecere__com__Class * _class = thisClass ? thisClass : currentClass;
18727
18728 if(_class)
18729 {
18730 struct Identifier * id = exp->__anon1.classData.id;
18731 char structName[1024];
18732 struct Expression * classExp;
18733
18734 strcpy(structName, "__ecereClassData_");
18735 FullClassNameCat(structName, _class->fullName, 0);
18736 exp->type = 9;
18737 exp->__anon1.member.member = id;
18738 if(curCompound && FindSymbol("this", curContext, curCompound->__anon1.compound.context, 0, 0))
18739 classExp = MkExpMember(MkExpIdentifier(MkIdentifier("this")), MkIdentifier("_class"));
18740 else
18741 classExp = MkExpIdentifier(MkIdentifier("class"));
18742 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"))))))));
18743 ProcessExpressionType(exp);
18744 return ;
18745 }
18746 break;
18747 }
18748 case 35:
18749 {
18750 struct Type * type = (((void *)0));
18751 const char * typeString = (((void *)0));
18752 char typeStringBuf[1024];
18753
18754 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))
18755 {
18756 struct __ecereNameSpace__ecere__com__Class * templateClass = exp->destType->__anon1._class->__anon1.registered;
18757
18758 typeString = templateClass->templateArgs[2].__anon1.__anon1.dataTypeString;
18759 }
18760 else if(exp->__anon1.list)
18761 {
18762 struct Expression * e;
18763
18764 for(e = (*exp->__anon1.list).first; e; e = e->next)
18765 {
18766 ProcessExpressionType(e);
18767 if(e->expType)
18768 {
18769 if(!type)
18770 {
18771 type = e->expType;
18772 type->refCount++;
18773 }
18774 else
18775 {
18776 if(!MatchTypeExpression(e, type, (((void *)0)), 0, 1))
18777 {
18778 FreeType(type);
18779 type = e->expType;
18780 e->expType = (((void *)0));
18781 e = (*exp->__anon1.list).first;
18782 ProcessExpressionType(e);
18783 if(e->expType)
18784 {
18785 if(!MatchTypeExpression(e, type, (((void *)0)), 0, 1))
18786 {
18787 FreeType(e->expType);
18788 e->expType = (((void *)0));
18789 FreeType(type);
18790 type = (((void *)0));
18791 break;
18792 }
18793 }
18794 }
18795 }
18796 if(e->expType)
18797 {
18798 FreeType(e->expType);
18799 e->expType = (((void *)0));
18800 }
18801 }
18802 }
18803 if(type)
18804 {
18805 typeStringBuf[0] = '\0';
18806 PrintTypeNoConst(type, typeStringBuf, 0, 1);
18807 typeString = typeStringBuf;
18808 FreeType(type);
18809 type = (((void *)0));
18810 }
18811 }
18812 if(typeString)
18813 {
18814 char templateString[1024];
18815 struct __ecereNameSpace__ecere__sys__OldList * initializers = MkList();
18816 struct __ecereNameSpace__ecere__sys__OldList * structInitializers = MkList();
18817 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
18818 struct Expression * expExt;
18819 struct Declarator * decl = SpecDeclFromString(typeString, specs, (((void *)0)));
18820
18821 sprintf(templateString, "Container<%s>", typeString);
18822 if(exp->__anon1.list)
18823 {
18824 struct Expression * e;
18825
18826 type = ProcessTypeString(typeString, 0);
18827 while((e = (*exp->__anon1.list).first))
18828 {
18829 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove((&*exp->__anon1.list), e);
18830 e->destType = type;
18831 type->refCount++;
18832 ProcessExpressionType(e);
18833 ListAdd(initializers, MkInitializerAssignment(e));
18834 }
18835 FreeType(type);
18836 (__ecereNameSpace__ecere__com__eSystem_Delete(exp->__anon1.list), exp->__anon1.list = 0);
18837 }
18838 DeclareStruct(curExternal, "ecere::com::BuiltInContainer", 0, 1);
18839 ListAdd(structInitializers, MkInitializerAssignment(MkExpMember(MkExpClass(MkListOne(MkSpecifierName("BuiltInContainer")), (((void *)0))), MkIdentifier("_vTbl"))));
18840 ProcessExpressionType(((struct Initializer *)(*structInitializers).last)->__anon1.exp);
18841 ListAdd(structInitializers, MkInitializerAssignment(MkExpClass(MkListOne(MkSpecifierName("BuiltInContainer")), (((void *)0)))));
18842 ProcessExpressionType(((struct Initializer *)(*structInitializers).last)->__anon1.exp);
18843 ListAdd(structInitializers, MkInitializerAssignment(MkExpConstant("0")));
18844 ProcessExpressionType(((struct Initializer *)(*structInitializers).last)->__anon1.exp);
18845 ListAdd(structInitializers, MkInitializerAssignment(MkExpExtensionInitializer(MkTypeName(specs, MkDeclaratorArray(decl, (((void *)0)))), MkInitializerList(initializers))));
18846 ProcessExpressionType(((struct Initializer *)(*structInitializers).last)->__anon1.exp);
18847 ListAdd(structInitializers, MkInitializerAssignment(__extension__ ({
18848 struct Expression * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression);
18849
18850 __ecereInstance1->type = 2, __ecereInstance1->__anon1.__anon1.constant = __ecereNameSpace__ecere__com__PrintString(__ecereClass_int, (void *)&(*initializers).count, (void *)0), __ecereInstance1;
18851 })));
18852 ProcessExpressionType(((struct Initializer *)(*structInitializers).last)->__anon1.exp);
18853 ListAdd(structInitializers, MkInitializerAssignment(MkExpClass(CopyList(specs, (void *)(CopySpecifier)), CopyDeclarator(decl))));
18854 ProcessExpressionType(((struct Initializer *)(*structInitializers).last)->__anon1.exp);
18855 exp->expType = ProcessTypeString(templateString, 0);
18856 exp->type = 5;
18857 exp->__anon1.list = MkListOne(MkExpCast(MkTypeName(MkListOne(MkSpecifierName(templateString)), (((void *)0))), MkExpOp((((void *)0)), '&', expExt = MkExpExtensionInitializer(MkTypeName(MkListOne(MkSpecifierName("BuiltInContainer")), (((void *)0))), MkInitializerList(structInitializers)))));
18858 ProcessExpressionType(expExt);
18859 }
18860 else
18861 {
18862 exp->expType = ProcessTypeString("Container", 0);
18863 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Couldn't determine type of array elements\n", (((void *)0))));
18864 }
18865 break;
18866 }
18867 }
18868 if(exp->expType && exp->expType->kind == 21 && thisClass && (!exp->destType || exp->destType->kind != 21))
18869 {
18870 FreeType(exp->expType);
18871 exp->expType = ReplaceThisClassType(thisClass);
18872 }
18873 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)
18874 {
18875 struct Symbol * symbol = FindSymbol(exp->expType->__anon1.__anon1.enumName, curContext, globalContext, 1, 0);
18876
18877 if(symbol)
18878 {
18879 if(exp->expType->kind != 15)
18880 {
18881 struct Type * member;
18882 char * enumName = __ecereNameSpace__ecere__sys__CopyString(exp->expType->__anon1.__anon1.enumName);
18883
18884 FreeType(exp->expType);
18885 exp->expType = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
18886 exp->expType->kind = symbol->type->kind;
18887 exp->expType->refCount++;
18888 exp->expType->__anon1.__anon1.enumName = enumName;
18889 exp->expType->__anon1.__anon1.members = symbol->type->__anon1.__anon1.members;
18890 for(member = symbol->type->__anon1.__anon1.members.first; member; member = member->next)
18891 member->refCount++;
18892 }
18893 else
18894 {
18895 struct __ecereNameSpace__ecere__sys__NamedLink64 * member;
18896
18897 for(member = symbol->type->__anon1.__anon1.members.first; member; member = member->next)
18898 {
18899 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);
18900
18901 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(&exp->expType->__anon1.__anon1.members, value);
18902 }
18903 }
18904 }
18905 }
18906 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)))
18907 {
18908 exp->byReference = 1;
18909 }
18910 yylloc = exp->loc;
18911 if(exp->destType && (exp->destType->kind == 18))
18912 ;
18913 else if(exp->destType && !exp->destType->keepCast)
18914 {
18915 if(!exp->needTemplateCast && exp->expType && (exp->expType->kind == 20 || exp->expType->passAsTemplate))
18916 exp->needTemplateCast = 1;
18917 if(exp->destType->kind == 0)
18918 ;
18919 else if(!CheckExpressionType(exp, exp->destType, 0, !exp->destType->casted))
18920 {
18921 unsigned int invalidCast = 0;
18922
18923 if(inCompiler && exp->destType->count && exp->expType)
18924 {
18925 struct __ecereNameSpace__ecere__com__Class * c1 = (exp->expType->kind == 8 && exp->expType->__anon1._class) ? exp->expType->__anon1._class->__anon1.registered : (((void *)0));
18926 struct __ecereNameSpace__ecere__com__Class * c2 = (exp->destType->kind == 8 && exp->destType->__anon1._class) ? exp->destType->__anon1._class->__anon1.registered : (((void *)0));
18927
18928 if(c1 && c1->type != 1)
18929 c1 = (((void *)0));
18930 if(c2 && c2->type != 1)
18931 c2 = (((void *)0));
18932 if((c1 && !exp->expType->byReference && !c2 && !__ecereProp_Type_Get_isPointerType(exp->destType)) || (c2 && !exp->destType->byReference && !c1 && !__ecereProp_Type_Get_isPointerType(exp->expType)))
18933 invalidCast = 1;
18934 }
18935 if(!exp->destType->count || unresolved || invalidCast)
18936 {
18937 if(!exp->expType)
18938 {
18939 yylloc = exp->loc;
18940 if(exp->destType->kind != 14)
18941 {
18942 char type2[1024];
18943
18944 type2[0] = '\0';
18945 if(inCompiler)
18946 {
18947 char expString[10240];
18948
18949 expString[0] = '\0';
18950 PrintType(exp->destType, type2, 0, 1);
18951 if(inCompiler)
18952 {
18953 PrintExpression(exp, expString);
18954 __ecereNameSpace__ecere__sys__ChangeCh(expString, '\n', ' ');
18955 }
18956 if(unresolved)
18957 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "unresolved identifier %s; expected %s\n", (((void *)0))), expString, type2);
18958 else if(exp->type != 16)
18959 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "couldn't determine type of %s; expected %s\n", (((void *)0))), expString, type2);
18960 }
18961 }
18962 else
18963 {
18964 char expString[10240];
18965
18966 expString[0] = '\0';
18967 if(inCompiler)
18968 {
18969 PrintExpression(exp, expString);
18970 __ecereNameSpace__ecere__sys__ChangeCh(expString, '\n', ' ');
18971 }
18972 if(unresolved)
18973 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "unresolved identifier %s\n", (((void *)0))), expString);
18974 else if(exp->type != 16)
18975 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "couldn't determine type of %s\n", (((void *)0))), expString);
18976 }
18977 }
18978 else
18979 {
18980 char type1[1024];
18981 char type2[1024];
18982
18983 type1[0] = '\0';
18984 type2[0] = '\0';
18985 if(inCompiler)
18986 {
18987 PrintType(exp->expType, type1, 0, 1);
18988 PrintType(exp->destType, type2, 0, 1);
18989 }
18990 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)))
18991 ;
18992 else
18993 {
18994 struct Expression * nbExp = GetNonBracketsExp(exp);
18995 unsigned int skipWarning = 0;
18996 int kind = exp->destType->kind;
18997
18998 if(nbExp->type == 12 && nbExp->destType && !nbExp->destType->casted && nbExp->destType->kind == exp->destType->kind)
18999 skipWarning = 1;
19000 if((kind == 1 || kind == 2) && exp->destType->isSigned == exp->expType->signedBeforePromotion && nbExp->type == 4 && nbExp->__anon1.op.exp1 && nbExp->__anon1.op.exp2)
19001 {
19002 int op = nbExp->__anon1.op.op;
19003 struct Expression * nbExp1, * nbExp2;
19004 int from;
19005
19006 switch(op)
19007 {
19008 case '%':
19009 case '/':
19010 nbExp1 = GetNonBracketsExp(nbExp->__anon1.op.exp1);
19011 from = nbExp1->expType->promotedFrom;
19012 if(from == 1 || (kind == 2 && from == 2))
19013 skipWarning = 1;
19014 break;
19015 case LEFT_OP:
19016 case RIGHT_OP:
19017 nbExp1 = GetNonBracketsExp(nbExp->__anon1.op.exp1);
19018 nbExp2 = GetNonBracketsExp(nbExp->__anon1.op.exp2);
19019 from = nbExp1->expType->promotedFrom;
19020 if(op == RIGHT_OP && (from == 1 || (kind == 2 && from == 2)))
19021 skipWarning = 1;
19022 else if(nbExp2->isConstant && nbExp2->type == 2 && (nbExp->__anon1.op.op == RIGHT_OP || nbExp1->expType->bitMemberSize))
19023 {
19024 int n = strtol(nbExp2->__anon1.__anon1.constant, (((void *)0)), 0);
19025 int s = from == 1 ? 8 : 16;
19026
19027 if(nbExp1->expType->bitMemberSize && nbExp1->expType->bitMemberSize < s)
19028 s = nbExp1->expType->bitMemberSize;
19029 if(nbExp->__anon1.op.op == RIGHT_OP)
19030 s -= n;
19031 else
19032 s += n;
19033 if(s <= (kind == 1 ? 8 : 16))
19034 skipWarning = 1;
19035 }
19036 break;
19037 case '-':
19038 if(!exp->destType->isSigned)
19039 {
19040 nbExp1 = GetNonBracketsExp(nbExp->__anon1.op.exp1);
19041 nbExp2 = GetNonBracketsExp(nbExp->__anon1.op.exp2);
19042 from = nbExp2->expType->promotedFrom;
19043 if((from == 1 || from == 2) && nbExp1->isConstant && nbExp1->type == 2)
19044 {
19045 int n = strtol(nbExp1->__anon1.__anon1.constant, (((void *)0)), 0);
19046
19047 if(n == (from == 1 ? 255 : 65535))
19048 skipWarning = 1;
19049 }
19050 }
19051 break;
19052 case '|':
19053 {
19054 int kind1, kind2;
19055
19056 nbExp1 = GetNonBracketsExp(nbExp->__anon1.op.exp1);
19057 nbExp2 = GetNonBracketsExp(nbExp->__anon1.op.exp2);
19058 kind1 = nbExp1->expType->promotedFrom ? nbExp1->expType->promotedFrom : nbExp1->expType->kind;
19059 kind2 = nbExp2->expType->promotedFrom ? nbExp2->expType->promotedFrom : nbExp2->expType->kind;
19060 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)))
19061 skipWarning = 1;
19062 break;
19063 }
19064 case '&':
19065 {
19066 int kind1, kind2;
19067
19068 nbExp1 = GetNonBracketsExp(nbExp->__anon1.op.exp1);
19069 nbExp2 = GetNonBracketsExp(nbExp->__anon1.op.exp2);
19070 kind1 = nbExp1->expType->promotedFrom ? nbExp1->expType->promotedFrom : nbExp1->expType->kind;
19071 kind2 = nbExp2->expType->promotedFrom ? nbExp2->expType->promotedFrom : nbExp2->expType->kind;
19072 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)))
19073 skipWarning = 1;
19074 break;
19075 }
19076 }
19077 }
19078 if(!skipWarning)
19079 {
19080 char expString[10240];
19081
19082 expString[0] = '\0';
19083 if(inCompiler)
19084 {
19085 PrintExpression(exp, expString);
19086 __ecereNameSpace__ecere__sys__ChangeCh(expString, '\n', ' ');
19087 }
19088 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")))
19089 {
19090 if(invalidCast)
19091 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "incompatible expression %s (%s); expected %s\n", (((void *)0))), expString, type1, type2);
19092 else
19093 Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "incompatible expression %s (%s); expected %s\n", (((void *)0))), expString, type1, type2);
19094 }
19095 }
19096 if(!inCompiler)
19097 {
19098 FreeType(exp->expType);
19099 exp->destType->refCount++;
19100 exp->expType = exp->destType;
19101 }
19102 }
19103 }
19104 }
19105 }
19106 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))
19107 {
19108 struct Expression * nbExp = GetNonBracketsExp(exp);
19109
19110 if(nbExp->type != 11 || !IsVoidPtrCast(nbExp->__anon1.cast.typeName))
19111 {
19112 struct Expression * e = MoveExpContents(exp);
19113
19114 exp->__anon1.cast.exp = MkExpBrackets(MkListOne(e));
19115 exp->type = 11;
19116 exp->__anon1.cast.exp->destType = exp->destType;
19117 if(exp->destType)
19118 exp->destType->refCount++;
19119 exp->__anon1.cast.typeName = MkTypeName(MkListOne(MkSpecifier(VOID)), MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), (((void *)0))));
19120 }
19121 }
19122 }
19123 else if(unresolved)
19124 {
19125 if(exp->__anon1.__anon1.identifier->_class && exp->__anon1.__anon1.identifier->_class->__anon1.__anon1.name)
19126 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);
19127 else if(exp->__anon1.__anon1.identifier->string && exp->__anon1.__anon1.identifier->string[0])
19128 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "unresolved identifier %s\n", (((void *)0))), exp->__anon1.__anon1.identifier->string);
19129 }
19130 else if(!exp->expType && exp->type != 16)
19131 {
19132 char expString[10240];
19133
19134 expString[0] = '\0';
19135 if(inCompiler)
19136 {
19137 PrintExpression(exp, expString);
19138 __ecereNameSpace__ecere__sys__ChangeCh(expString, '\n', ' ');
19139 }
19140 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "couldn't determine type of %s\n", (((void *)0))), expString);
19141 }
19142 if(inCompiler)
19143 ApplyAnyObjectLogic(exp);
19144 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)))
19145 {
19146 exp->byReference = 1;
19147 }
19148 yylloc = oldyylloc;
19149 }
19150
19151 static void ProcessFunction(struct FunctionDefinition * function)
19152 {
19153 struct Identifier * id = GetDeclId(function->declarator);
19154 struct Symbol * symbol = function->declarator ? function->declarator->symbol : (((void *)0));
19155 struct Type * type = symbol ? symbol->type : (((void *)0));
19156 struct __ecereNameSpace__ecere__com__Class * oldThisClass = thisClass;
19157 struct Context * oldTopContext = topContext;
19158
19159 yylloc = function->loc;
19160 if(type && type->__anon1.__anon2.thisClass)
19161 {
19162 struct Symbol * classSym = type->__anon1.__anon2.thisClass;
19163 struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1.__anon2.thisClass->__anon1.registered;
19164 char className[1024];
19165 char structName[1024];
19166 struct Declarator * funcDecl;
19167 struct Symbol * thisSymbol;
19168 unsigned int typedObject = 0;
19169
19170 if(_class && !_class->base)
19171 {
19172 _class = currentClass;
19173 if(_class && !_class->symbol)
19174 _class->symbol = FindClass(_class->fullName);
19175 classSym = _class ? _class->symbol : (((void *)0));
19176 typedObject = 1;
19177 }
19178 thisClass = _class;
19179 if(inCompiler && _class)
19180 {
19181 if(type->kind == 11)
19182 {
19183 if(symbol->type->__anon1.__anon2.params.count == 1 && ((struct Type *)symbol->type->__anon1.__anon2.params.first)->kind == 0)
19184 {
19185 struct Type * param = symbol->type->__anon1.__anon2.params.first;
19186
19187 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove(&symbol->type->__anon1.__anon2.params, param);
19188 FreeType(param);
19189 }
19190 if(type->classObjectType != 1)
19191 {
19192 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert(&symbol->type->__anon1.__anon2.params, (((void *)0)), MkClassType(_class->fullName));
19193 symbol->type->__anon1.__anon2.staticMethod = 1;
19194 symbol->type->__anon1.__anon2.thisClass = (((void *)0));
19195 symbol->type->extraParam = 0;
19196 }
19197 }
19198 strcpy(className, "__ecereClass_");
19199 FullClassNameCat(className, _class->fullName, 1);
19200 structName[0] = 0;
19201 FullClassNameCat(structName, _class->fullName, 0);
19202 funcDecl = GetFuncDecl(function->declarator);
19203 if(funcDecl)
19204 {
19205 if(funcDecl->__anon1.function.parameters && (*funcDecl->__anon1.function.parameters).count == 1)
19206 {
19207 struct TypeName * param = (*funcDecl->__anon1.function.parameters).first;
19208
19209 if(param->qualifiers && (*param->qualifiers).count == 1 && ((struct Specifier *)(*param->qualifiers).first)->__anon1.specifier == VOID && !param->declarator)
19210 {
19211 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove((&*funcDecl->__anon1.function.parameters), param);
19212 FreeTypeName(param);
19213 }
19214 }
19215 if(!function->propertyNoThis)
19216 {
19217 struct TypeName * thisParam = (((void *)0));
19218
19219 if(type->classObjectType != 1)
19220 {
19221 thisParam = QMkClass(_class->fullName, MkDeclaratorIdentifier(MkIdentifier("this")));
19222 if(!funcDecl->__anon1.function.parameters)
19223 funcDecl->__anon1.function.parameters = MkList();
19224 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*funcDecl->__anon1.function.parameters), (((void *)0)), thisParam);
19225 }
19226 if(typedObject)
19227 {
19228 if(type->classObjectType != 1)
19229 {
19230 if(type->byReference || _class->type == 3 || _class->type == 1000 || _class->type == 4 || _class->type == 2)
19231 thisParam->declarator = MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), thisParam->declarator);
19232 }
19233 thisParam = __extension__ ({
19234 struct TypeName * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_TypeName);
19235
19236 __ecereInstance1->declarator = MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), MkDeclaratorIdentifier(MkIdentifier("class"))), __ecereInstance1->qualifiers = MkListOne(MkStructOrUnion(3, MkIdentifier("__ecereNameSpace__ecere__com__Class"), (((void *)0)))), __ecereInstance1;
19237 });
19238 DeclareStruct(curExternal, "ecere::com::Class", 0, 1);
19239 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*funcDecl->__anon1.function.parameters), (((void *)0)), thisParam);
19240 }
19241 }
19242 }
19243 if(symbol && symbol->__anon2.__anon1.pointerExternal && symbol->__anon2.__anon1.pointerExternal->type == 1)
19244 {
19245 struct InitDeclarator * initDecl = (*symbol->__anon2.__anon1.pointerExternal->__anon1.declaration->__anon1.__anon1.declarators).first;
19246
19247 funcDecl = GetFuncDecl(initDecl->declarator);
19248 if(funcDecl)
19249 {
19250 if(funcDecl->__anon1.function.parameters && (*funcDecl->__anon1.function.parameters).count == 1)
19251 {
19252 struct TypeName * param = (*funcDecl->__anon1.function.parameters).first;
19253
19254 if(param->qualifiers && (*param->qualifiers).count == 1 && ((struct Specifier *)(*param->qualifiers).first)->__anon1.specifier == VOID && !param->declarator)
19255 {
19256 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove((&*funcDecl->__anon1.function.parameters), param);
19257 FreeTypeName(param);
19258 }
19259 }
19260 if(type->classObjectType != 1)
19261 {
19262 if((_class->type != 2 && _class->type != 3 && _class->type != 4) || function != (struct FunctionDefinition *)symbol->__anon2.__anon2.externalSet)
19263 {
19264 struct TypeName * thisParam = QMkClass(_class->fullName, MkDeclaratorIdentifier(MkIdentifier("this")));
19265
19266 if(!funcDecl->__anon1.function.parameters)
19267 funcDecl->__anon1.function.parameters = MkList();
19268 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*funcDecl->__anon1.function.parameters), (((void *)0)), thisParam);
19269 }
19270 }
19271 }
19272 }
19273 }
19274 if(function->body)
19275 {
19276 if(type->classObjectType != 1)
19277 {
19278 thisSymbol = __extension__ ({
19279 struct Symbol * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Symbol);
19280
19281 __ecereInstance1->string = __ecereNameSpace__ecere__sys__CopyString("this"), __ecereInstance1->type = classSym ? MkClassType(classSym->string) : (((void *)0)), __ecereInstance1;
19282 });
19283 __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Add(&function->body->__anon1.compound.context->symbols, (struct __ecereNameSpace__ecere__sys__BTNode *)thisSymbol);
19284 if(typedObject && thisSymbol->type)
19285 {
19286 thisSymbol->type->classObjectType = 2;
19287 thisSymbol->type->byReference = type->byReference;
19288 thisSymbol->type->typedByReference = type->byReference;
19289 }
19290 }
19291 }
19292 if(inCompiler && _class && _class->type == 0 && type->classObjectType != 1)
19293 {
19294 struct __ecereNameSpace__ecere__com__DataMember * member = (((void *)0));
19295
19296 {
19297 struct __ecereNameSpace__ecere__com__Class * base;
19298
19299 for(base = _class; base && base->type != 1000; base = base->next)
19300 {
19301 for(member = base->membersAndProperties.first; member; member = member->next)
19302 if(!member->isProperty)
19303 break;
19304 if(member)
19305 break;
19306 }
19307 }
19308 for(member = _class->membersAndProperties.first; member; member = member->next)
19309 if(!member->isProperty)
19310 break;
19311 if(member)
19312 {
19313 char pointerName[1024];
19314 struct Declaration * decl;
19315 struct Initializer * initializer;
19316 struct Expression * exp, * bytePtr;
19317
19318 strcpy(pointerName, "__ecerePointer_");
19319 FullClassNameCat(pointerName, _class->fullName, 0);
19320 {
19321 char className[1024];
19322
19323 strcpy(className, "__ecereClass_");
19324 FullClassNameCat(className, classSym->string, 1);
19325 DeclareClass(curExternal, classSym, className);
19326 }
19327 bytePtr = QBrackets(MkExpCast(QMkType("char", QMkPtrDecl((((void *)0)))), QMkExpId("this")));
19328 if(_class->fixed)
19329 {
19330 struct Expression * e;
19331
19332 if(_class->offset && _class->offset == (_class->base->type == 5 ? _class->base->memberOffset : _class->base->structSize))
19333 {
19334 e = MkExpClassSize(MkSpecifierName(_class->base->fullName));
19335 ProcessExpressionType(e);
19336 }
19337 else
19338 {
19339 char string[256];
19340
19341 sprintf(string, "%d", _class->offset);
19342 e = MkExpConstant(string);
19343 }
19344 exp = QBrackets(MkExpOp(bytePtr, '+', e));
19345 }
19346 else
19347 {
19348 exp = QBrackets(MkExpOp(bytePtr, '+', MkExpPointer(QMkExpId(className), MkIdentifier("offset"))));
19349 }
19350 exp = QBrackets(QMkExpCond(QMkExpId("this"), exp, MkExpConstant("0")));
19351 exp->expType = __extension__ ({
19352 struct Type * __ecereInstance2 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
19353
19354 __ecereInstance2->refCount = 1, __ecereInstance2->kind = 13, __ecereInstance2->__anon1.type = __extension__ ({
19355 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
19356
19357 __ecereInstance1->refCount = 1, __ecereInstance1->kind = 0, __ecereInstance1;
19358 }), __ecereInstance2;
19359 });
19360 if(function->body)
19361 {
19362 yylloc = function->body->loc;
19363 initializer = MkInitializerAssignment(MkExpCast(MkTypeName(MkListOne(MkStructOrUnion(3, MkIdentifier(structName), (((void *)0)))), MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), (((void *)0)))), exp));
19364 {
19365 struct Context * prevContext = curContext;
19366 struct __ecereNameSpace__ecere__sys__OldList * list;
19367
19368 curContext = function->body->__anon1.compound.context;
19369 decl = MkDeclaration((list = MkListOne(MkStructOrUnion(3, MkIdentifier(structName), (((void *)0))))), MkListOne(MkInitDeclarator(QMkPtrDecl(pointerName), initializer)));
19370 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*list), (((void *)0)), MkSpecifierExtended(MkExtDeclAttrib(MkAttrib(ATTRIB, MkListOne(MkAttribute(__ecereNameSpace__ecere__sys__CopyString("unused"), (((void *)0))))))));
19371 curContext = prevContext;
19372 }
19373 decl->symbol = (((void *)0));
19374 if(!function->body->__anon1.compound.declarations)
19375 function->body->__anon1.compound.declarations = MkList();
19376 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*function->body->__anon1.compound.declarations), (((void *)0)), decl);
19377 }
19378 }
19379 }
19380 }
19381 else
19382 thisClass = (((void *)0));
19383 if(id)
19384 {
19385 FreeSpecifier(id->_class);
19386 id->_class = (((void *)0));
19387 if(symbol && symbol->__anon2.__anon1.pointerExternal && symbol->__anon2.__anon1.pointerExternal->type == 1)
19388 {
19389 struct InitDeclarator * initDecl = (*symbol->__anon2.__anon1.pointerExternal->__anon1.declaration->__anon1.__anon1.declarators).first;
19390
19391 id = GetDeclId(initDecl->declarator);
19392 FreeSpecifier(id->_class);
19393 id->_class = (((void *)0));
19394 }
19395 }
19396 if(function->body)
19397 topContext = function->body->__anon1.compound.context;
19398 {
19399 struct FunctionDefinition * oldFunction = curFunction;
19400
19401 curFunction = function;
19402 if(function->body)
19403 ProcessStatement(function->body);
19404 if(inCompiler && function->propSet && !function->propSet->fireWatchersDone)
19405 {
19406 struct Statement * prevCompound = curCompound;
19407 struct Context * prevContext = curContext;
19408 struct Statement * fireWatchers = MkFireWatchersStmt((((void *)0)), (((void *)0)));
19409
19410 if(!function->body->__anon1.compound.statements)
19411 function->body->__anon1.compound.statements = MkList();
19412 ListAdd(function->body->__anon1.compound.statements, fireWatchers);
19413 curCompound = function->body;
19414 curContext = function->body->__anon1.compound.context;
19415 ProcessStatement(fireWatchers);
19416 curContext = prevContext;
19417 curCompound = prevCompound;
19418 }
19419 curFunction = oldFunction;
19420 }
19421 if(function->declarator)
19422 {
19423 ProcessDeclarator(function->declarator, 1);
19424 }
19425 topContext = oldTopContext;
19426 thisClass = oldThisClass;
19427 }
19428
19429 static void ProcessClass(struct __ecereNameSpace__ecere__sys__OldList * definitions, struct Symbol * symbol)
19430 {
19431 struct ClassDef * def;
19432 struct External * external = curExternal;
19433 struct __ecereNameSpace__ecere__com__Class * regClass = symbol ? symbol->__anon1.registered : (((void *)0));
19434
19435 for(def = definitions->first; def; def = def->next)
19436 {
19437 if(def->type == 0)
19438 {
19439 if(def->__anon1.function->declarator)
19440 curExternal = def->__anon1.function->declarator->symbol->__anon2.__anon1.pointerExternal;
19441 else
19442 curExternal = external;
19443 ProcessFunction((struct FunctionDefinition *)def->__anon1.function);
19444 }
19445 else if(def->type == 2)
19446 {
19447 if(def->__anon1.decl->type == 2)
19448 {
19449 thisClass = regClass;
19450 ProcessInstantiationType(def->__anon1.decl->__anon1.inst);
19451 thisClass = (((void *)0));
19452 }
19453 else
19454 {
19455 struct __ecereNameSpace__ecere__com__Class * backThisClass = thisClass;
19456
19457 if(regClass)
19458 thisClass = regClass;
19459 ProcessDeclaration(def->__anon1.decl, symbol ? 1 : 0);
19460 thisClass = backThisClass;
19461 }
19462 }
19463 else if(def->type == 1 && def->__anon1.defProperties)
19464 {
19465 struct MemberInit * defProperty;
19466 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);
19467
19468 __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Add(&globalContext->symbols, (struct __ecereNameSpace__ecere__sys__BTNode *)thisSymbol);
19469 for(defProperty = (*def->__anon1.defProperties).first; defProperty; defProperty = defProperty->next)
19470 {
19471 thisClass = regClass;
19472 ProcessMemberInitData(defProperty, regClass, (((void *)0)), (((void *)0)), (((void *)0)), (((void *)0)));
19473 thisClass = (((void *)0));
19474 }
19475 __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Remove(&globalContext->symbols, (struct __ecereNameSpace__ecere__sys__BTNode *)thisSymbol);
19476 FreeSymbol(thisSymbol);
19477 }
19478 else if(def->type == 3 && def->__anon1.propertyDef)
19479 {
19480 struct PropertyDef * prop = def->__anon1.propertyDef;
19481
19482 thisClass = regClass;
19483 if(prop->setStmt)
19484 {
19485 if(regClass)
19486 {
19487 struct Symbol * thisSymbol = (thisSymbol = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Symbol), thisSymbol->string = __ecereNameSpace__ecere__sys__CopyString("this"), thisSymbol->type = MkClassType(regClass->fullName), thisSymbol);
19488
19489 __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Add(&prop->setStmt->__anon1.compound.context->symbols, (struct __ecereNameSpace__ecere__sys__BTNode *)thisSymbol);
19490 }
19491 curExternal = prop->symbol ? prop->symbol->__anon2.__anon2.externalSet : (((void *)0));
19492 ProcessStatement(prop->setStmt);
19493 }
19494 if(prop->getStmt)
19495 {
19496 if(regClass)
19497 {
19498 struct Symbol * thisSymbol = (thisSymbol = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Symbol), thisSymbol->string = __ecereNameSpace__ecere__sys__CopyString("this"), thisSymbol->type = MkClassType(regClass->fullName), thisSymbol);
19499
19500 __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Add(&prop->getStmt->__anon1.compound.context->symbols, (struct __ecereNameSpace__ecere__sys__BTNode *)thisSymbol);
19501 }
19502 curExternal = prop->symbol ? prop->symbol->__anon2.__anon2.externalGet : (((void *)0));
19503 ProcessStatement(prop->getStmt);
19504 }
19505 if(prop->issetStmt)
19506 {
19507 if(regClass)
19508 {
19509 struct Symbol * thisSymbol = (thisSymbol = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Symbol), thisSymbol->string = __ecereNameSpace__ecere__sys__CopyString("this"), thisSymbol->type = MkClassType(regClass->fullName), thisSymbol);
19510
19511 __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Add(&prop->issetStmt->__anon1.compound.context->symbols, (struct __ecereNameSpace__ecere__sys__BTNode *)thisSymbol);
19512 }
19513 curExternal = prop->symbol ? prop->symbol->__anon2.__anon2.externalIsSet : (((void *)0));
19514 ProcessStatement(prop->issetStmt);
19515 }
19516 thisClass = (((void *)0));
19517 }
19518 else if(def->type == 4 && def->__anon1.propertyWatch)
19519 {
19520 struct PropertyWatch * propertyWatch = def->__anon1.propertyWatch;
19521
19522 thisClass = regClass;
19523 if(propertyWatch->compound)
19524 {
19525 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);
19526
19527 __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Add(&propertyWatch->compound->__anon1.compound.context->symbols, (struct __ecereNameSpace__ecere__sys__BTNode *)thisSymbol);
19528 curExternal = (((void *)0));
19529 ProcessStatement(propertyWatch->compound);
19530 }
19531 thisClass = (((void *)0));
19532 }
19533 }
19534 }
19535
19536 void __ecereRegisterModule_pass15(struct __ecereNameSpace__ecere__com__Instance * module)
19537 {
19538 struct __ecereNameSpace__ecere__com__Class __attribute__((unused)) * class;
19539
19540 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("SetYydebug", "void SetYydebug(bool b)", SetYydebug, module, 1);
19541 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("SetThisClass", "void SetThisClass(ecere::com::Class c)", SetThisClass, module, 1);
19542 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetThisClass", "ecere::com::Class GetThisClass(void)", GetThisClass, module, 1);
19543 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintExpression", "void PrintExpression(Expression exp, char * string)", PrintExpression, module, 1);
19544 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ProcessTemplateParameterType", "Type ProcessTemplateParameterType(TemplateParameter param)", ProcessTemplateParameterType, module, 2);
19545 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("NeedCast", "bool NeedCast(Type type1, Type type2)", NeedCast, module, 2);
19546 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintInt", "char * PrintInt(int64 result)", PrintInt, module, 1);
19547 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintUInt", "char * PrintUInt(uint64 result)", PrintUInt, module, 1);
19548 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintInt64", "char * PrintInt64(int64 result)", PrintInt64, module, 1);
19549 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintUInt64", "char * PrintUInt64(uint64 result)", PrintUInt64, module, 1);
19550 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintHexUInt", "char * PrintHexUInt(uint64 result)", PrintHexUInt, module, 1);
19551 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintHexUInt64", "char * PrintHexUInt64(uint64 result)", PrintHexUInt64, module, 1);
19552 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintShort", "char * PrintShort(short result)", PrintShort, module, 1);
19553 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintUShort", "char * PrintUShort(uint16 result)", PrintUShort, module, 1);
19554 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintChar", "char * PrintChar(char result)", PrintChar, module, 1);
19555 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintUChar", "char * PrintUChar(byte result)", PrintUChar, module, 1);
19556 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintFloat", "char * PrintFloat(float result)", PrintFloat, module, 1);
19557 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintDouble", "char * PrintDouble(double result)", PrintDouble, module, 1);
19558 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpInt", "bool GetOpInt(Operand op2, int * value2)", GetOpInt, module, 1);
19559 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetInt", "bool GetInt(Expression exp, int * value2)", GetInt, module, 1);
19560 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpUInt", "bool GetOpUInt(Operand op2, uint * value2)", GetOpUInt, module, 1);
19561 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetUInt", "bool GetUInt(Expression exp, uint * value2)", GetUInt, module, 1);
19562 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpInt64", "bool GetOpInt64(Operand op2, int64 * value2)", GetOpInt64, module, 1);
19563 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetInt64", "bool GetInt64(Expression exp, int64 * value2)", GetInt64, module, 1);
19564 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpUInt64", "bool GetOpUInt64(Operand op2, uint64 * value2)", GetOpUInt64, module, 1);
19565 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetUInt64", "bool GetUInt64(Expression exp, uint64 * value2)", GetUInt64, module, 1);
19566 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpIntPtr", "bool GetOpIntPtr(Operand op2, intptr * value2)", GetOpIntPtr, module, 1);
19567 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetIntPtr", "bool GetIntPtr(Expression exp, intptr * value2)", GetIntPtr, module, 1);
19568 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpUIntPtr", "bool GetOpUIntPtr(Operand op2, uintptr * value2)", GetOpUIntPtr, module, 1);
19569 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetUIntPtr", "bool GetUIntPtr(Expression exp, uintptr * value2)", GetUIntPtr, module, 1);
19570 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpIntSize", "bool GetOpIntSize(Operand op2, intsize * value2)", GetOpIntSize, module, 1);
19571 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetIntSize", "bool GetIntSize(Expression exp, intsize * value2)", GetIntSize, module, 1);
19572 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpUIntSize", "bool GetOpUIntSize(Operand op2, uintsize * value2)", GetOpUIntSize, module, 1);
19573 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetUIntSize", "bool GetUIntSize(Expression exp, uintsize * value2)", GetUIntSize, module, 1);
19574 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpShort", "bool GetOpShort(Operand op2, short * value2)", GetOpShort, module, 1);
19575 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetShort", "bool GetShort(Expression exp, short * value2)", GetShort, module, 1);
19576 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpUShort", "bool GetOpUShort(Operand op2, uint16 * value2)", GetOpUShort, module, 1);
19577 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetUShort", "bool GetUShort(Expression exp, uint16 * value2)", GetUShort, module, 1);
19578 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpChar", "bool GetOpChar(Operand op2, char * value2)", GetOpChar, module, 1);
19579 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetChar", "bool GetChar(Expression exp, char * value2)", GetChar, module, 1);
19580 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpUChar", "bool GetOpUChar(Operand op2, byte * value2)", GetOpUChar, module, 1);
19581 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetUChar", "bool GetUChar(Expression exp, byte * value2)", GetUChar, module, 1);
19582 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpFloat", "bool GetOpFloat(Operand op2, float * value2)", GetOpFloat, module, 1);
19583 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetFloat", "bool GetFloat(Expression exp, float * value2)", GetFloat, module, 1);
19584 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpDouble", "bool GetOpDouble(Operand op2, double * value2)", GetOpDouble, module, 1);
19585 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetDouble", "bool GetDouble(Expression exp, double * value2)", GetDouble, module, 1);
19586 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ComputeClassMembers", "void ComputeClassMembers(ecere::com::Class _class, bool isMember)", ComputeClassMembers, module, 2);
19587 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ComputeModuleClasses", "void ComputeModuleClasses(ecere::com::Module module)", ComputeModuleClasses, module, 1);
19588 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ComputeTypeSize", "int ComputeTypeSize(Type type)", ComputeTypeSize, module, 1);
19589 __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);
19590 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("DeclareStruct", "External DeclareStruct(External neededBy, const char * name, bool skipNoHead, bool needDereference)", DeclareStruct, module, 2);
19591 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("_DeclareStruct", "External _DeclareStruct(External neededBy, const char * name, bool skipNoHead, bool needDereference, bool fwdDecl)", _DeclareStruct, module, 2);
19592 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("DeclareProperty", "void DeclareProperty(External neededBy, ecere::com::Property prop, char * setName, char * getName)", DeclareProperty, module, 2);
19593 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("Dereference", "Type Dereference(Type source)", Dereference, module, 1);
19594 __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);
19595 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ProcessInstantiationType", "void ProcessInstantiationType(Instantiation inst)", ProcessInstantiationType, module, 2);
19596 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("DeclareType", "void DeclareType(External neededFor, Type type, bool needDereference, bool forFunctionDef)", DeclareType, module, 2);
19597 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("DeclareTypeForwardDeclare", "void DeclareTypeForwardDeclare(External neededFor, Type type, bool needDereference, bool forFunctionDef)", DeclareTypeForwardDeclare, module, 2);
19598 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("FindTemplateArg", "ecere::com::ClassTemplateArgument * FindTemplateArg(ecere::com::Class _class, TemplateParameter param)", FindTemplateArg, module, 2);
19599 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("SetupTemplatesContext", "Context SetupTemplatesContext(ecere::com::Class _class)", SetupTemplatesContext, module, 1);
19600 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("FinishTemplatesContext", "void FinishTemplatesContext(Context context)", FinishTemplatesContext, module, 1);
19601 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ProcessMethodType", "void ProcessMethodType(ecere::com::Method method)", ProcessMethodType, module, 1);
19602 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ProcessPropertyType", "void ProcessPropertyType(ecere::com::Property prop)", ProcessPropertyType, module, 1);
19603 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("DeclareMethod", "void DeclareMethod(External neededFor, ecere::com::Method method, const char * name)", DeclareMethod, module, 1);
19604 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ReplaceThisClass", "char * ReplaceThisClass(ecere::com::Class _class)", ReplaceThisClass, module, 2);
19605 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ReplaceThisClassType", "Type ReplaceThisClassType(ecere::com::Class _class)", ReplaceThisClassType, module, 2);
19606 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ReplaceThisClassSpecifiers", "void ReplaceThisClassSpecifiers(ecere::sys::OldList specs, ecere::com::Class _class)", ReplaceThisClassSpecifiers, module, 2);
19607 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("DeclareFunction", "bool DeclareFunction(External neededFor, ecere::com::GlobalFunction function, char * name)", DeclareFunction, module, 2);
19608 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("DeclareGlobalData", "void DeclareGlobalData(External neededFor, GlobalData data)", DeclareGlobalData, module, 2);
19609 class = __ecereNameSpace__ecere__com__eSystem_RegisterClass(5, "Conversion", 0, sizeof(struct Conversion), 0, (void *)0, (void *)0, module, 2, 1);
19610 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)
19611 __ecereClass_Conversion = class;
19612 __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);
19613 __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);
19614 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ModuleVisibility", "bool ModuleVisibility(ecere::com::Module searchIn, ecere::com::Module searchFor)", ModuleVisibility, module, 1);
19615 __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);
19616 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("MatchTypeExpression", "bool MatchTypeExpression(Expression sourceExp, Type dest, ecere::sys::OldList conversions, bool skipUnitBla, bool warnConst)", MatchTypeExpression, module, 2);
19617 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ReadString", "void ReadString(char * output, char * string)", ReadString, module, 1);
19618 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("UnescapeString", "int UnescapeString(char * d, char * s, int len)", UnescapeString, module, 1);
19619 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("OffsetEscapedString", "char * OffsetEscapedString(char * s, int len, int offset)", OffsetEscapedString, module, 1);
19620 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOperand", "Operand GetOperand(Expression exp)", GetOperand, module, 1);
19621 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PopulateInstance", "void PopulateInstance(Instantiation inst)", PopulateInstance, module, 1);
19622 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ComputeInstantiation", "void ComputeInstantiation(Expression exp)", ComputeInstantiation, module, 1);
19623 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("CallOperator", "void CallOperator(Expression exp, Expression exp1, Expression exp2, Operand op1, Operand op2)", CallOperator, module, 1);
19624 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ComputeExpression", "void ComputeExpression(Expression exp)", ComputeExpression, module, 1);
19625 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("CheckTemplateTypes", "void CheckTemplateTypes(Expression exp)", CheckTemplateTypes, module, 1);
19626 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("FindSymbol", "Symbol FindSymbol(const char * name, Context startContext, Context endContext, bool isStruct, bool globalNameSpace)", FindSymbol, module, 1);
19627 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintType", "void PrintType(Type type, char * string, bool printName, bool fullName)", PrintType, module, 1);
19628 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintTypeNoConst", "void PrintTypeNoConst(Type type, char * string, bool printName, bool fullName)", PrintTypeNoConst, module, 1);
19629 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("FindMemberAndOffset", "Type FindMemberAndOffset(Type type, char * string, uint * offset)", FindMemberAndOffset, module, 1);
19630 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetParseError", "bool GetParseError(void)", GetParseError, module, 1);
19631 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ParseExpressionString", "Expression ParseExpressionString(char * expression)", ParseExpressionString, module, 1);
19632 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ReplaceExpContents", "void ReplaceExpContents(Expression checkedExp, Expression newExp)", ReplaceExpContents, module, 1);
19633 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ApplyAnyObjectLogic", "void ApplyAnyObjectLogic(Expression e)", ApplyAnyObjectLogic, module, 1);
19634 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ApplyLocation", "void ApplyLocation(Expression exp, Location loc)", ApplyLocation, module, 1);
19635 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("RelatedUnits", "bool RelatedUnits(ecere::com::Class c1, ecere::com::Class c2)", RelatedUnits, module, 1);
19636 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ProcessExpressionType", "void ProcessExpressionType(Expression exp)", ProcessExpressionType, module, 1);
19637 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("DeclareFunctionUtil", "void DeclareFunctionUtil(External neededBy, const String s)", DeclareFunctionUtil, module, 1);
19638 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ComputeDataTypes", "void ComputeDataTypes(void)", ComputeDataTypes, module, 1);
19639 }
19640