673703f04d3f01750f5a3b978f8a899ad3d7465f
[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 #include <stdint.h>
39 #include <sys/types.h>
40 enum yytokentype
41 {
42 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
43 };
44
45 extern int returnCode;
46
47 extern unsigned int yydebug;
48
49 extern unsigned int echoOn;
50
51 void resetScanner();
52
53 int propWatcherID;
54
55 int expression_yyparse();
56
57 static char * thisNameSpace;
58
59 unsigned int thisClassParams = 1;
60
61 unsigned int internalValueCounter;
62
63 extern unsigned int outputLineNumbers;
64
65 extern struct __ecereNameSpace__ecere__com__Property * __ecereProp_float_isInf;
66
67 extern struct __ecereNameSpace__ecere__com__Property * __ecereProp_float_signBit;
68
69 extern struct __ecereNameSpace__ecere__com__Property * __ecereProp_float_isNan;
70
71 extern struct __ecereNameSpace__ecere__com__Property * __ecereProp_double_isInf;
72
73 extern struct __ecereNameSpace__ecere__com__Property * __ecereProp_double_signBit;
74
75 extern struct __ecereNameSpace__ecere__com__Property * __ecereProp_double_isNan;
76
77 extern int targetBits;
78
79 extern unsigned int inCompiler;
80
81 extern unsigned int inPreCompiler;
82
83 extern unsigned int inDebugger;
84
85 extern struct __ecereNameSpace__ecere__com__Property * __ecereProp___ecereNameSpace__ecere__sys__BinaryTree_first;
86
87 extern struct __ecereNameSpace__ecere__com__Property * __ecereProp___ecereNameSpace__ecere__sys__BTNode_next;
88
89 int UnescapeString(char * d, char * s, int len)
90 {
91 int j = 0, k = 0;
92 char ch;
93
94 while(j < len && (ch = s[j]))
95 {
96 switch(ch)
97 {
98 case '\\':
99 switch((ch = s[++j]))
100 {
101 case 'n':
102 d[k] = '\n';
103 break;
104 case 't':
105 d[k] = '\t';
106 break;
107 case 'a':
108 d[k] = '\a';
109 break;
110 case 'b':
111 d[k] = '\b';
112 break;
113 case 'f':
114 d[k] = '\f';
115 break;
116 case 'r':
117 d[k] = '\r';
118 break;
119 case 'v':
120 d[k] = '\v';
121 break;
122 case '\\':
123 d[k] = '\\';
124 break;
125 case '\"':
126 d[k] = '\"';
127 break;
128 case '\'':
129 d[k] = '\'';
130 break;
131 default:
132 d[k] = '\\';
133 d[k] = ch;
134 }
135 break;
136 default:
137 d[k] = ch;
138 }
139 j++, k++;
140 }
141 d[k] = '\0';
142 return k;
143 }
144
145 char * OffsetEscapedString(char * s, int len, int offset)
146 {
147 char ch;
148 int j = 0, k = 0;
149
150 while(j < len && k < offset && (ch = s[j]))
151 {
152 if(ch == '\\')
153 ++j;
154 j++, k++;
155 }
156 return (k == offset) ? s + j : (((void *)0));
157 }
158
159 extern int __ecereVMethodID_class_OnGetString;
160
161 extern struct __ecereNameSpace__ecere__com__Property * __ecereProp_Type_isPointerType;
162
163 extern unsigned int parseError;
164
165 static int definedExpStackPos;
166
167 static void * definedExpStack[512];
168
169 extern const char *  sourceFile;
170
171 extern struct __ecereNameSpace__ecere__com__Property * __ecereProp_Type_specConst;
172
173 extern unsigned int memoryGuard;
174
175 struct __ecereNameSpace__ecere__sys__OldList
176 {
177 void *  first;
178 void *  last;
179 int count;
180 unsigned int offset;
181 unsigned int circ;
182 } __attribute__ ((gcc_struct));
183
184 struct __ecereNameSpace__ecere__com__DataValue
185 {
186 union
187 {
188 char c;
189 unsigned char uc;
190 short s;
191 unsigned short us;
192 int i;
193 unsigned int ui;
194 void *  p;
195 float f;
196 double d;
197 long long i64;
198 uint64 ui64;
199 } __attribute__ ((gcc_struct)) __anon1;
200 } __attribute__ ((gcc_struct));
201
202 struct __ecereNameSpace__ecere__com__SerialBuffer
203 {
204 unsigned char *  _buffer;
205 unsigned int count;
206 unsigned int _size;
207 unsigned int pos;
208 } __attribute__ ((gcc_struct));
209
210 extern void *  __ecereNameSpace__ecere__com__eSystem_New(unsigned int size);
211
212 extern void *  __ecereNameSpace__ecere__com__eSystem_New0(unsigned int size);
213
214 extern void *  __ecereNameSpace__ecere__com__eSystem_Renew(void *  memory, unsigned int size);
215
216 extern void *  __ecereNameSpace__ecere__com__eSystem_Renew0(void *  memory, unsigned int size);
217
218 extern void __ecereNameSpace__ecere__com__eSystem_Delete(void *  memory);
219
220 struct Pointer;
221
222 struct Attrib;
223
224 struct Attribute;
225
226 struct TemplateArgument;
227
228 struct DBTableEntry;
229
230 struct DBIndexItem;
231
232 struct DBTableDef;
233
234 struct CodePosition
235 {
236 int line;
237 int charPos;
238 int pos;
239 int included;
240 } __attribute__ ((gcc_struct));
241
242 extern size_t strlen(const char * );
243
244 extern int strcmp(const char * , const char * );
245
246 extern int sprintf(char * , const char * , ...);
247
248 extern char *  strcat(char * , const char * );
249
250 extern char *  __ecereNameSpace__ecere__sys__CopyString(const char *  string);
251
252 extern int isprint(int c);
253
254 extern char *  strcpy(char * , const char * );
255
256 extern void Compiler_Error(const char *  format, ...);
257
258 extern const char *  __ecereNameSpace__ecere__GetTranslatedString(const char * name, const char *  string, const char *  stringAndContext);
259
260 struct __ecereNameSpace__ecere__com__LinkList
261 {
262 void * first;
263 void * last;
264 int count;
265 } __attribute__ ((gcc_struct));
266
267 extern char *  strchr(const char * , int);
268
269 extern void FullClassNameCat(char *  output, const char *  className, unsigned int includeTemplateParams);
270
271 extern void *  memcpy(void * , const void * , size_t size);
272
273 extern void __ecereNameSpace__ecere__sys__ChangeCh(char *  string, char ch1, char ch2);
274
275 extern void Compiler_Warning(const char *  format, ...);
276
277 extern unsigned long strtoul(const char *  nptr, char * *  endptr, int base);
278
279 extern long long strtoll(const char *  nptr, char * *  endptr, int base);
280
281 extern uint64 strtoull(const char *  nptr, char * *  endptr, int base);
282
283 extern int strtol(const char * , char * * , int base);
284
285 extern long long __ecereNameSpace__ecere__com___strtoi64(const char *  string, const char * *  endString, int base);
286
287 extern uint64 __ecereNameSpace__ecere__com___strtoui64(const char *  string, const char * *  endString, int base);
288
289 extern double strtod(const char * , char * * );
290
291 extern int strncmp(const char * , const char * , size_t n);
292
293 extern char *  __ecereNameSpace__ecere__sys__RSearchString(const char *  buffer, const char *  subStr, int maxLen, unsigned int matchCase, unsigned int matchWord);
294
295 extern char *  QMkString(const char *  source);
296
297 extern char *  strncpy(char * , const char * , size_t n);
298
299 extern int printf(const char * , ...);
300
301 extern char *  strstr(const char * , const char * );
302
303 extern unsigned int __ecereNameSpace__ecere__sys__UTF8GetChar(const char *  string, int *  numBytes);
304
305 extern unsigned int (* __ecereProp_float_Get_isInf)(float this);
306
307 extern int (* __ecereProp_float_Get_signBit)(float this);
308
309 extern unsigned int (* __ecereProp_float_Get_isNan)(float this);
310
311 extern unsigned int (* __ecereProp_double_Get_isInf)(double this);
312
313 extern int (* __ecereProp_double_Get_signBit)(double this);
314
315 extern unsigned int (* __ecereProp_double_Get_isNan)(double this);
316
317 extern float (* __ecereMethod_float_inf)(void);
318
319 extern float (* __ecereMethod_float_nan)(void);
320
321 extern double (* __ecereMethod_double_inf)(void);
322
323 extern double (* __ecereMethod_double_nan)(void);
324
325 int __ecereVMethodID_class_OnGetString;
326
327 void SetYydebug(unsigned int b)
328 {
329 yydebug = b;
330 }
331
332 unsigned int GetParseError()
333 {
334 return parseError;
335 }
336
337 extern struct __ecereNameSpace__ecere__sys__OldList * ast;
338
339 extern struct __ecereNameSpace__ecere__sys__OldList *  MkList(void);
340
341 extern struct __ecereNameSpace__ecere__sys__OldList *  MkListOne(void *  item);
342
343 extern void ListAdd(struct __ecereNameSpace__ecere__sys__OldList * list, void *  item);
344
345 extern void FreeList(struct __ecereNameSpace__ecere__sys__OldList * list, void (*  FreeFunction)(void * ));
346
347 struct __ecereNameSpace__ecere__com__EnumClassData
348 {
349 struct __ecereNameSpace__ecere__sys__OldList values;
350 long long largest;
351 } __attribute__ ((gcc_struct));
352
353 extern struct __ecereNameSpace__ecere__sys__OldList *  CopyList(struct __ecereNameSpace__ecere__sys__OldList *  source, void *  (*  CopyFunction)(void * ));
354
355 void __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(struct __ecereNameSpace__ecere__sys__OldList * this, void *  item);
356
357 unsigned int __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert(struct __ecereNameSpace__ecere__sys__OldList * this, void *  prevItem, void *  item);
358
359 void __ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove(struct __ecereNameSpace__ecere__sys__OldList * this, void *  item);
360
361 void __ecereMethod___ecereNameSpace__ecere__sys__OldList_Free(struct __ecereNameSpace__ecere__sys__OldList * this, void (*  freeFn)(void * ));
362
363 void __ecereMethod___ecereNameSpace__ecere__sys__OldList_Clear(struct __ecereNameSpace__ecere__sys__OldList * this);
364
365 extern struct Pointer * MkPointer(struct __ecereNameSpace__ecere__sys__OldList * qualifiers, struct Pointer * pointer);
366
367 extern struct Attrib * MkAttrib(int type, struct __ecereNameSpace__ecere__sys__OldList *  attribs);
368
369 struct Location
370 {
371 struct CodePosition start;
372 struct CodePosition end;
373 } __attribute__ ((gcc_struct));
374
375 void ReadString(char * output, char * string)
376 {
377 int len = strlen(string);
378 int c, d = 0;
379 unsigned int quoted = 0, escaped = 0;
380
381 for(c = 0; c < len; c++)
382 {
383 char ch = string[c];
384
385 if(escaped)
386 {
387 switch(ch)
388 {
389 case 'n':
390 output[d] = '\n';
391 break;
392 case 't':
393 output[d] = '\t';
394 break;
395 case 'a':
396 output[d] = '\a';
397 break;
398 case 'b':
399 output[d] = '\b';
400 break;
401 case 'f':
402 output[d] = '\f';
403 break;
404 case 'r':
405 output[d] = '\r';
406 break;
407 case 'v':
408 output[d] = '\v';
409 break;
410 case '\\':
411 output[d] = '\\';
412 break;
413 case '\"':
414 output[d] = '\"';
415 break;
416 case '\'':
417 output[d] = '\'';
418 break;
419 default:
420 output[d] = ch;
421 }
422 d++;
423 escaped = 0;
424 }
425 else
426 {
427 if(ch == '\"')
428 quoted ^= 1;
429 else if(quoted)
430 {
431 if(ch == '\\')
432 escaped = 1;
433 else
434 output[d++] = ch;
435 }
436 }
437 }
438 output[d] = '\0';
439 }
440
441 char * PrintInt(long long result)
442 {
443 char temp[100];
444
445 if(result > (((int)0x7fffffff)))
446 sprintf(temp, ((__runtimePlatform == 1) ? "0x%I64X" : "0x%llX"), result);
447 else
448 sprintf(temp, ((__runtimePlatform == 1) ? "%I64d" : "%lld"), result);
449 if(result > (((int)0x7fffffff)) || result < (((int)0x80000000)))
450 strcat(temp, "LL");
451 return __ecereNameSpace__ecere__sys__CopyString(temp);
452 }
453
454 char * PrintUInt(uint64 result)
455 {
456 char temp[100];
457
458 if(result > (0xffffffff))
459 sprintf(temp, ((__runtimePlatform == 1) ? "0x%I64XLL" : "0x%llXLL"), result);
460 else if(result > (((int)0x7fffffff)))
461 sprintf(temp, ((__runtimePlatform == 1) ? "0x%I64X" : "0x%llX"), result);
462 else
463 sprintf(temp, ((__runtimePlatform == 1) ? "%I64d" : "%lld"), result);
464 return __ecereNameSpace__ecere__sys__CopyString(temp);
465 }
466
467 char * PrintInt64(long long result)
468 {
469 char temp[100];
470
471 if(result > (((int)0x7fffffff)) || result < (((int)0x80000000)))
472 sprintf(temp, ((__runtimePlatform == 1) ? "%I64dLL" : "%lldLL"), result);
473 else
474 sprintf(temp, ((__runtimePlatform == 1) ? "%I64d" : "%lld"), result);
475 return __ecereNameSpace__ecere__sys__CopyString(temp);
476 }
477
478 char * PrintUInt64(uint64 result)
479 {
480 char temp[100];
481
482 if(result > (0xffffffff))
483 sprintf(temp, ((__runtimePlatform == 1) ? "0x%I64XLL" : "0x%llXLL"), result);
484 else if(result > (((int)0x7fffffff)))
485 sprintf(temp, ((__runtimePlatform == 1) ? "0x%I64X" : "0x%llX"), result);
486 else
487 sprintf(temp, ((__runtimePlatform == 1) ? "%I64d" : "%lld"), result);
488 return __ecereNameSpace__ecere__sys__CopyString(temp);
489 }
490
491 char * PrintHexUInt(uint64 result)
492 {
493 char temp[100];
494
495 if(result > (0xffffffff))
496 sprintf(temp, ((__runtimePlatform == 1) ? "0x%I64X" : "0x%llX"), result);
497 else
498 sprintf(temp, ((__runtimePlatform == 1) ? "0x%I64X" : "0x%llX"), result);
499 if(result > (0xffffffff))
500 strcat(temp, "LL");
501 return __ecereNameSpace__ecere__sys__CopyString(temp);
502 }
503
504 char * PrintHexUInt64(uint64 result)
505 {
506 char temp[100];
507
508 if(result > (0xffffffff))
509 sprintf(temp, ((__runtimePlatform == 1) ? "0x%I64XLL" : "0x%llXLL"), result);
510 else
511 sprintf(temp, ((__runtimePlatform == 1) ? "0x%I64X" : "0x%llX"), result);
512 return __ecereNameSpace__ecere__sys__CopyString(temp);
513 }
514
515 char * PrintShort(short result)
516 {
517 char temp[100];
518
519 sprintf(temp, "%d", (unsigned short)result);
520 return __ecereNameSpace__ecere__sys__CopyString(temp);
521 }
522
523 char * PrintUShort(unsigned short result)
524 {
525 char temp[100];
526
527 if(result > (unsigned short)32767)
528 sprintf(temp, "0x%X", (int)result);
529 else
530 sprintf(temp, "%d", (int)result);
531 return __ecereNameSpace__ecere__sys__CopyString(temp);
532 }
533
534 char * PrintUChar(unsigned char result)
535 {
536 char temp[100];
537
538 sprintf(temp, "0x%X", result);
539 return __ecereNameSpace__ecere__sys__CopyString(temp);
540 }
541
542 char * PrintChar(char result)
543 {
544 char temp[100];
545
546 if(result > (char)0 && isprint(result))
547 sprintf(temp, "'%c'", result);
548 else if(result < (char)0)
549 sprintf(temp, "%d", (int)result);
550 else
551 sprintf(temp, "0x%X", (unsigned char)result);
552 return __ecereNameSpace__ecere__sys__CopyString(temp);
553 }
554
555 char * PrintFloat(float result)
556 {
557 char temp[350];
558
559 if(__ecereProp_float_Get_isInf(result))
560 {
561 if(__ecereProp_float_Get_signBit(result))
562 strcpy(temp, "-inf");
563 else
564 strcpy(temp, "inf");
565 }
566 else if(__ecereProp_float_Get_isNan(result))
567 {
568 if(__ecereProp_float_Get_signBit(result))
569 strcpy(temp, "-nan");
570 else
571 strcpy(temp, "nan");
572 }
573 else
574 sprintf(temp, "%.16ff", result);
575 return __ecereNameSpace__ecere__sys__CopyString(temp);
576 }
577
578 char * PrintDouble(double result)
579 {
580 char temp[350];
581
582 if(__ecereProp_double_Get_isInf(result))
583 {
584 if(__ecereProp_double_Get_signBit(result))
585 strcpy(temp, "-inf");
586 else
587 strcpy(temp, "inf");
588 }
589 else if(__ecereProp_double_Get_isNan(result))
590 {
591 if(__ecereProp_double_Get_signBit(result))
592 strcpy(temp, "-nan");
593 else
594 strcpy(temp, "nan");
595 }
596 else
597 sprintf(temp, "%.16f", result);
598 return __ecereNameSpace__ecere__sys__CopyString(temp);
599 }
600
601 extern struct Location yylloc;
602
603 struct ExtDecl
604 {
605 struct Location loc;
606 int type;
607 union
608 {
609 char * s;
610 struct Attrib * attr;
611 } __attribute__ ((gcc_struct)) __anon1;
612 } __attribute__ ((gcc_struct));
613
614 extern struct ExtDecl * MkExtDeclAttrib(struct Attrib * attr);
615
616 struct Expression;
617
618 extern struct Expression * parsedExpression;
619
620 extern struct Expression * QMkExpId(const char *  id);
621
622 extern struct Expression * MkExpOp(struct Expression * exp1, int op, struct Expression * exp2);
623
624 void ComputeExpression(struct Expression * exp);
625
626 extern struct Expression * MkExpConstant(const char *  string);
627
628 extern struct Attribute * MkAttribute(char * attr, struct Expression * exp);
629
630 extern void FreeExpression(struct Expression * exp);
631
632 extern void FreeExpContents(struct Expression * exp);
633
634 extern struct Expression * CopyExpression(struct Expression * exp);
635
636 extern struct Expression * MkExpBrackets(struct __ecereNameSpace__ecere__sys__OldList * expressions);
637
638 extern struct Expression * GetNonBracketsExp(struct Expression * exp);
639
640 extern struct Expression * MkExpCall(struct Expression * expression, struct __ecereNameSpace__ecere__sys__OldList * arguments);
641
642 extern struct Expression * MkExpCondition(struct Expression * cond, struct __ecereNameSpace__ecere__sys__OldList * expressions, struct Expression * elseExp);
643
644 extern struct Expression * MoveExpContents(struct Expression * exp);
645
646 extern struct Expression * QBrackets(struct Expression * exp);
647
648 extern struct Expression * QMkExpCond(struct Expression * cond, struct Expression * exp, struct Expression * elseExp);
649
650 struct Statement;
651
652 static struct Statement * curCompound;
653
654 extern struct Statement * MkCompoundStmt(struct __ecereNameSpace__ecere__sys__OldList * declarations, struct __ecereNameSpace__ecere__sys__OldList * statements);
655
656 extern struct Statement * MkExpressionStmt(struct __ecereNameSpace__ecere__sys__OldList * expressions);
657
658 extern struct Statement * MkIfStmt(struct __ecereNameSpace__ecere__sys__OldList * exp, struct Statement * statement, struct Statement * elseStmt);
659
660 extern struct Statement * MkForStmt(struct Statement * init, struct Statement * check, struct __ecereNameSpace__ecere__sys__OldList * inc, struct Statement * statement);
661
662 extern struct Statement * MkWhileStmt(struct __ecereNameSpace__ecere__sys__OldList * exp, struct Statement * statement);
663
664 extern struct Statement * MkFireWatchersStmt(struct Expression * object, struct __ecereNameSpace__ecere__sys__OldList * watches);
665
666 struct External;
667
668 struct External * curExternal, * afterExternal;
669
670 extern void FreeExternal(struct External * external);
671
672 struct Type;
673
674 static struct Type * curSwitchType;
675
676 extern struct Type * ProcessTypeString(const char *  string, unsigned int staticMethod);
677
678 extern void FreeType(struct Type * type);
679
680 extern struct Type * MkClassType(const char *  name);
681
682 extern void CopyTypeInto(struct Type * type, struct Type * src);
683
684 struct __ecereNameSpace__ecere__com__Class;
685
686 struct __ecereNameSpace__ecere__com__Instance
687 {
688 void * *  _vTbl;
689 struct __ecereNameSpace__ecere__com__Class * _class;
690 int _refCount;
691 } __attribute__ ((gcc_struct));
692
693 extern long long __ecereNameSpace__ecere__com__eClass_GetProperty(struct __ecereNameSpace__ecere__com__Class * _class, const char *  name);
694
695 extern void __ecereNameSpace__ecere__com__eClass_SetProperty(struct __ecereNameSpace__ecere__com__Class * _class, const char *  name, long long value);
696
697 static struct __ecereNameSpace__ecere__com__Class * currentClass;
698
699 struct __ecereNameSpace__ecere__com__Class * thisClass;
700
701 struct __ecereNameSpace__ecere__com__Class * containerClass;
702
703 extern unsigned int __ecereNameSpace__ecere__com__eClass_IsDerived(struct __ecereNameSpace__ecere__com__Class * _class, struct __ecereNameSpace__ecere__com__Class * from);
704
705 extern struct Expression * GetTemplateArgExpByName(const char *  paramName, struct __ecereNameSpace__ecere__com__Class * curClass, int tplType);
706
707 extern void *  __ecereNameSpace__ecere__com__eInstance_New(struct __ecereNameSpace__ecere__com__Class * _class);
708
709 extern void __ecereNameSpace__ecere__com__eInstance_SetMethod(struct __ecereNameSpace__ecere__com__Instance * instance, const char *  name, void *  function);
710
711 extern void __ecereNameSpace__ecere__com__eInstance_IncRef(struct __ecereNameSpace__ecere__com__Instance * instance);
712
713 extern void OutputExpression(struct Expression * exp, struct __ecereNameSpace__ecere__com__Instance * f);
714
715 extern struct __ecereNameSpace__ecere__com__Instance * fileInput;
716
717 int __ecereVMethodID___ecereNameSpace__ecere__sys__File_Seek;
718
719 int __ecereVMethodID___ecereNameSpace__ecere__sys__File_Read;
720
721 extern void __ecereNameSpace__ecere__com__eInstance_DecRef(struct __ecereNameSpace__ecere__com__Instance * instance);
722
723 int __ecereVMethodID___ecereNameSpace__ecere__sys__File_Write;
724
725 void SetThisClass(struct __ecereNameSpace__ecere__com__Class * c)
726 {
727 thisClass = c;
728 }
729
730 struct __ecereNameSpace__ecere__com__Class * GetThisClass()
731 {
732 return thisClass;
733 }
734
735 struct Context;
736
737 extern struct Context * curContext;
738
739 extern struct Context * topContext;
740
741 extern struct Context * PushContext(void);
742
743 extern void PopContext(struct Context * ctx);
744
745 extern void FreeContext(struct Context * context);
746
747 extern struct Context * globalContext;
748
749 struct ModuleImport;
750
751 extern struct ModuleImport * mainModule;
752
753 struct ModuleImport
754 {
755 struct ModuleImport * prev;
756 struct ModuleImport * next;
757 char *  name;
758 struct __ecereNameSpace__ecere__sys__OldList classes;
759 struct __ecereNameSpace__ecere__sys__OldList functions;
760 int importType;
761 int importAccess;
762 } __attribute__ ((gcc_struct));
763
764 struct Declaration;
765
766 extern struct External * MkExternalDeclaration(struct Declaration * declaration);
767
768 extern struct Declaration * MkDeclaration(struct __ecereNameSpace__ecere__sys__OldList * specifiers, struct __ecereNameSpace__ecere__sys__OldList * initDeclarators);
769
770 static void ProcessDeclaration(struct Declaration * decl);
771
772 struct __ecereNameSpace__ecere__com__NameSpace;
773
774 extern struct __ecereNameSpace__ecere__com__NameSpace *  globalData;
775
776 struct FunctionDefinition;
777
778 static struct FunctionDefinition * curFunction;
779
780 struct __ecereNameSpace__ecere__sys__BTNode;
781
782 struct __ecereNameSpace__ecere__sys__BTNode
783 {
784 uintptr_t key;
785 struct __ecereNameSpace__ecere__sys__BTNode * parent;
786 struct __ecereNameSpace__ecere__sys__BTNode * left;
787 struct __ecereNameSpace__ecere__sys__BTNode * right;
788 int depth;
789 } __attribute__ ((gcc_struct));
790
791 struct __ecereNameSpace__ecere__sys__BTNode * __ecereProp___ecereNameSpace__ecere__sys__BTNode_Get_next(struct __ecereNameSpace__ecere__sys__BTNode * this);
792
793 struct __ecereNameSpace__ecere__com__Property;
794
795 struct __ecereNameSpace__ecere__com__Property
796 {
797 struct __ecereNameSpace__ecere__com__Property * prev;
798 struct __ecereNameSpace__ecere__com__Property * next;
799 const char *  name;
800 unsigned int isProperty;
801 int memberAccess;
802 int id;
803 struct __ecereNameSpace__ecere__com__Class * _class;
804 const char *  dataTypeString;
805 struct __ecereNameSpace__ecere__com__Class * dataTypeClass;
806 struct Type * dataType;
807 void (*  Set)(void * , int);
808 int (*  Get)(void * );
809 unsigned int (*  IsSet)(void * );
810 void *  data;
811 void *  symbol;
812 int vid;
813 unsigned int conversion;
814 unsigned int watcherOffset;
815 const char *  category;
816 unsigned int compiled;
817 unsigned int selfWatchable;
818 unsigned int isWatchable;
819 } __attribute__ ((gcc_struct));
820
821 extern void __ecereNameSpace__ecere__com__eInstance_FireSelfWatchers(struct __ecereNameSpace__ecere__com__Instance * instance, struct __ecereNameSpace__ecere__com__Property * _property);
822
823 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);
824
825 extern void __ecereNameSpace__ecere__com__eInstance_Watch(void *  instance, struct __ecereNameSpace__ecere__com__Property * _property, void *  object, void (*  callback)(void * , void * ));
826
827 extern void __ecereNameSpace__ecere__com__eInstance_FireWatchers(struct __ecereNameSpace__ecere__com__Instance * instance, struct __ecereNameSpace__ecere__com__Property * _property);
828
829 struct Identifier;
830
831 extern void FreeIdentifier(struct Identifier * id);
832
833 extern struct Identifier * MkIdentifier(const char *  string);
834
835 extern struct Expression * MkExpIdentifier(struct Identifier * id);
836
837 extern struct Expression * MkExpMember(struct Expression * expression, struct Identifier * member);
838
839 extern struct Identifier * CopyIdentifier(struct Identifier * id);
840
841 extern struct Expression * MkExpPointer(struct Expression * expression, struct Identifier * member);
842
843 struct __ecereNameSpace__ecere__sys__OldLink;
844
845 struct __ecereNameSpace__ecere__sys__OldLink
846 {
847 struct __ecereNameSpace__ecere__sys__OldLink * prev;
848 struct __ecereNameSpace__ecere__sys__OldLink * next;
849 void *  data;
850 } __attribute__ ((gcc_struct));
851
852 struct Specifier;
853
854 extern struct Declaration * MkStructDeclaration(struct __ecereNameSpace__ecere__sys__OldList * specifiers, struct __ecereNameSpace__ecere__sys__OldList * declarators, struct Specifier * extStorage);
855
856 extern struct Specifier * MkStructOrUnion(int type, struct Identifier * id, struct __ecereNameSpace__ecere__sys__OldList * definitions);
857
858 extern struct Specifier * MkSpecifier(int specifier);
859
860 extern struct Specifier * MkSpecifierName(const char *  name);
861
862 extern struct Specifier * MkSpecifierExtended(struct ExtDecl * extDecl);
863
864 extern void FreeSpecifier(struct Specifier * spec);
865
866 extern struct Specifier * MkEnum(struct Identifier * id, struct __ecereNameSpace__ecere__sys__OldList * list);
867
868 struct Statement
869 {
870 struct Statement * prev;
871 struct Statement * next;
872 struct Location loc;
873 int type;
874 union
875 {
876 struct __ecereNameSpace__ecere__sys__OldList *  expressions;
877 struct
878 {
879 struct Identifier * id;
880 struct Statement * stmt;
881 } __attribute__ ((gcc_struct)) labeled;
882 struct
883 {
884 struct Expression * exp;
885 struct Statement * stmt;
886 } __attribute__ ((gcc_struct)) caseStmt;
887 struct
888 {
889 struct __ecereNameSpace__ecere__sys__OldList * declarations;
890 struct __ecereNameSpace__ecere__sys__OldList * statements;
891 struct Context * context;
892 unsigned int isSwitch;
893 } __attribute__ ((gcc_struct)) compound;
894 struct
895 {
896 struct __ecereNameSpace__ecere__sys__OldList * exp;
897 struct Statement * stmt;
898 struct Statement * elseStmt;
899 } __attribute__ ((gcc_struct)) ifStmt;
900 struct
901 {
902 struct __ecereNameSpace__ecere__sys__OldList * exp;
903 struct Statement * stmt;
904 } __attribute__ ((gcc_struct)) switchStmt;
905 struct
906 {
907 struct __ecereNameSpace__ecere__sys__OldList * exp;
908 struct Statement * stmt;
909 } __attribute__ ((gcc_struct)) whileStmt;
910 struct
911 {
912 struct __ecereNameSpace__ecere__sys__OldList * exp;
913 struct Statement * stmt;
914 } __attribute__ ((gcc_struct)) doWhile;
915 struct
916 {
917 struct Statement * init;
918 struct Statement * check;
919 struct __ecereNameSpace__ecere__sys__OldList * increment;
920 struct Statement * stmt;
921 } __attribute__ ((gcc_struct)) forStmt;
922 struct
923 {
924 struct Identifier * id;
925 } __attribute__ ((gcc_struct)) gotoStmt;
926 struct
927 {
928 struct Specifier * spec;
929 char * statements;
930 struct __ecereNameSpace__ecere__sys__OldList * inputFields;
931 struct __ecereNameSpace__ecere__sys__OldList * outputFields;
932 struct __ecereNameSpace__ecere__sys__OldList * clobberedFields;
933 } __attribute__ ((gcc_struct)) asmStmt;
934 struct
935 {
936 struct Expression * watcher;
937 struct Expression * object;
938 struct __ecereNameSpace__ecere__sys__OldList * watches;
939 } __attribute__ ((gcc_struct)) _watch;
940 struct
941 {
942 struct Identifier * id;
943 struct __ecereNameSpace__ecere__sys__OldList * exp;
944 struct __ecereNameSpace__ecere__sys__OldList * filter;
945 struct Statement * stmt;
946 } __attribute__ ((gcc_struct)) forEachStmt;
947 struct Declaration * decl;
948 } __attribute__ ((gcc_struct)) __anon1;
949 } __attribute__ ((gcc_struct));
950
951 extern struct Specifier * CopySpecifier(struct Specifier * spec);
952
953 extern struct Expression * MkExpClassSize(struct Specifier * _class);
954
955 struct Symbol;
956
957 struct Identifier
958 {
959 struct Identifier * prev;
960 struct Identifier * next;
961 struct Location loc;
962 struct Symbol * classSym;
963 struct Specifier * _class;
964 char *  string;
965 struct Identifier * badID;
966 } __attribute__ ((gcc_struct));
967
968 extern struct Symbol * FindStruct(struct Context * ctx, const char *  name);
969
970 extern struct Symbol * FindClass(const char *  name);
971
972 extern void DeclareClass(struct External * neededFor, struct Symbol * classSym, const char *  className);
973
974 extern struct Symbol * FindType(struct Context * ctx, const char *  name);
975
976 extern void FreeSymbol(struct Symbol * symbol);
977
978 struct ClassDef;
979
980 extern struct ClassDef * MkClassDefDeclaration(struct Declaration * decl);
981
982 extern void FreeClassDef(struct ClassDef * def);
983
984 struct Declarator;
985
986 extern struct Type * ProcessType(struct __ecereNameSpace__ecere__sys__OldList * specs, struct Declarator * decl);
987
988 struct TemplateDatatype
989 {
990 struct __ecereNameSpace__ecere__sys__OldList *  specifiers;
991 struct Declarator * decl;
992 } __attribute__ ((gcc_struct));
993
994 extern struct Declarator * SpecDeclFromString(const char *  string, struct __ecereNameSpace__ecere__sys__OldList *  specs, struct Declarator * baseDecl);
995
996 extern struct Declarator * MkDeclaratorPointer(struct Pointer * pointer, struct Declarator * declarator);
997
998 extern struct Declarator * MkDeclaratorIdentifier(struct Identifier * id);
999
1000 extern struct Declarator * MkStructDeclarator(struct Declarator * declarator, struct Expression * exp);
1001
1002 extern struct Declarator * MkDeclaratorArray(struct Declarator * declarator, struct Expression * exp);
1003
1004 struct Declarator
1005 {
1006 struct Declarator * prev;
1007 struct Declarator * next;
1008 struct Location loc;
1009 int type;
1010 struct Symbol * symbol;
1011 struct Declarator * declarator;
1012 union
1013 {
1014 struct Identifier * identifier;
1015 struct
1016 {
1017 struct Expression * exp;
1018 struct Expression * posExp;
1019 struct Attrib * attrib;
1020 } __attribute__ ((gcc_struct)) structDecl;
1021 struct
1022 {
1023 struct Expression * exp;
1024 struct Specifier * enumClass;
1025 } __attribute__ ((gcc_struct)) array;
1026 struct
1027 {
1028 struct __ecereNameSpace__ecere__sys__OldList * parameters;
1029 } __attribute__ ((gcc_struct)) function;
1030 struct
1031 {
1032 struct Pointer * pointer;
1033 } __attribute__ ((gcc_struct)) pointer;
1034 struct
1035 {
1036 struct ExtDecl * extended;
1037 } __attribute__ ((gcc_struct)) extended;
1038 } __attribute__ ((gcc_struct)) __anon1;
1039 } __attribute__ ((gcc_struct));
1040
1041 extern struct Identifier * GetDeclId(struct Declarator * decl);
1042
1043 extern struct Declarator * MkDeclaratorBrackets(struct Declarator * declarator);
1044
1045 extern struct Declarator * PlugDeclarator(struct Declarator * decl, struct Declarator * baseDecl);
1046
1047 extern struct Declarator * MkDeclaratorFunction(struct Declarator * declarator, struct __ecereNameSpace__ecere__sys__OldList * parameters);
1048
1049 extern void FreeDeclarator(struct Declarator * decl);
1050
1051 extern struct Declarator * GetFuncDecl(struct Declarator * decl);
1052
1053 extern struct Expression * MkExpClass(struct __ecereNameSpace__ecere__sys__OldList *  specifiers, struct Declarator * decl);
1054
1055 extern struct Declarator * CopyDeclarator(struct Declarator * declarator);
1056
1057 struct FunctionDefinition
1058 {
1059 struct FunctionDefinition * prev;
1060 struct FunctionDefinition * next;
1061 struct Location loc;
1062 struct __ecereNameSpace__ecere__sys__OldList *  specifiers;
1063 struct Declarator * declarator;
1064 struct __ecereNameSpace__ecere__sys__OldList *  declarations;
1065 struct Statement * body;
1066 struct __ecereNameSpace__ecere__com__Class * _class;
1067 struct __ecereNameSpace__ecere__sys__OldList attached;
1068 int declMode;
1069 struct Type * type;
1070 struct Symbol * propSet;
1071 int tempCount;
1072 unsigned int propertyNoThis;
1073 } __attribute__ ((gcc_struct));
1074
1075 extern struct Declarator * QMkPtrDecl(const char *  id);
1076
1077 struct ClassFunction;
1078
1079 struct ClassFunction
1080 {
1081 struct ClassFunction * prev;
1082 struct ClassFunction * next;
1083 struct Location loc;
1084 struct __ecereNameSpace__ecere__sys__OldList *  specifiers;
1085 struct Declarator * declarator;
1086 struct __ecereNameSpace__ecere__sys__OldList *  declarations;
1087 struct Statement * body;
1088 struct __ecereNameSpace__ecere__com__Class * _class;
1089 struct __ecereNameSpace__ecere__sys__OldList attached;
1090 int declMode;
1091 struct Type * type;
1092 struct Symbol * propSet;
1093 unsigned int isVirtual;
1094 unsigned int isConstructor;
1095 unsigned int isDestructor;
1096 unsigned int dontMangle;
1097 int id;
1098 int idCode;
1099 } __attribute__ ((gcc_struct));
1100
1101 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);
1102
1103 extern void FreeClassFunction(struct ClassFunction * func);
1104
1105 extern struct ClassFunction * MkClassFunction(struct __ecereNameSpace__ecere__sys__OldList * specifiers, struct Specifier * _class, struct Declarator * decl, struct __ecereNameSpace__ecere__sys__OldList * declList);
1106
1107 extern void ProcessClassFunctionBody(struct ClassFunction * func, struct Statement * body);
1108
1109 struct TypeName;
1110
1111 extern struct Expression * MkExpCast(struct TypeName * typeName, struct Expression * expression);
1112
1113 extern struct TypeName * MkTypeName(struct __ecereNameSpace__ecere__sys__OldList * qualifiers, struct Declarator * declarator);
1114
1115 struct TypeName
1116 {
1117 struct TypeName * prev;
1118 struct TypeName * next;
1119 struct Location loc;
1120 struct __ecereNameSpace__ecere__sys__OldList *  qualifiers;
1121 struct Declarator * declarator;
1122 int classObjectType;
1123 struct Expression * bitCount;
1124 } __attribute__ ((gcc_struct));
1125
1126 extern void FreeTypeName(struct TypeName * typeName);
1127
1128 extern struct TypeName * QMkClass(const char *  spec, struct Declarator * decl);
1129
1130 extern struct Expression * MkExpTypeSize(struct TypeName * typeName);
1131
1132 extern unsigned int IsVoidPtrCast(struct TypeName * typeName);
1133
1134 extern struct TypeName * QMkType(const char *  spec, struct Declarator * decl);
1135
1136 struct __ecereNameSpace__ecere__com__BTNamedLink;
1137
1138 struct __ecereNameSpace__ecere__com__BTNamedLink
1139 {
1140 const char *  name;
1141 struct __ecereNameSpace__ecere__com__BTNamedLink * parent;
1142 struct __ecereNameSpace__ecere__com__BTNamedLink * left;
1143 struct __ecereNameSpace__ecere__com__BTNamedLink * right;
1144 int depth;
1145 void *  data;
1146 } __attribute__ ((gcc_struct));
1147
1148 struct __ecereNameSpace__ecere__sys__NamedLink64;
1149
1150 struct __ecereNameSpace__ecere__sys__NamedLink64
1151 {
1152 struct __ecereNameSpace__ecere__sys__NamedLink64 * prev;
1153 struct __ecereNameSpace__ecere__sys__NamedLink64 * next;
1154 char *  name;
1155 long long data;
1156 } __attribute__ ((gcc_struct));
1157
1158 struct Instantiation;
1159
1160 struct Declaration
1161 {
1162 struct Declaration * prev;
1163 struct Declaration * next;
1164 struct Location loc;
1165 int type;
1166 union
1167 {
1168 struct
1169 {
1170 struct __ecereNameSpace__ecere__sys__OldList *  specifiers;
1171 struct __ecereNameSpace__ecere__sys__OldList *  declarators;
1172 } __attribute__ ((gcc_struct)) __anon1;
1173 struct Instantiation * inst;
1174 struct
1175 {
1176 struct Identifier * id;
1177 struct Expression * exp;
1178 } __attribute__ ((gcc_struct)) __anon2;
1179 } __attribute__ ((gcc_struct)) __anon1;
1180 struct Specifier * extStorage;
1181 struct Symbol * symbol;
1182 int declMode;
1183 } __attribute__ ((gcc_struct));
1184
1185 struct Instantiation
1186 {
1187 struct Instantiation * prev;
1188 struct Instantiation * next;
1189 struct Location loc;
1190 struct Specifier * _class;
1191 struct Expression * exp;
1192 struct __ecereNameSpace__ecere__sys__OldList *  members;
1193 struct Symbol * symbol;
1194 unsigned int fullSet;
1195 unsigned int isConstant;
1196 unsigned char *  data;
1197 struct Location nameLoc;
1198 struct Location insideLoc;
1199 unsigned int built;
1200 } __attribute__ ((gcc_struct));
1201
1202 extern void FreeInstance(struct Instantiation * inst);
1203
1204 extern struct Declaration * MkDeclarationInst(struct Instantiation * inst);
1205
1206 extern struct Instantiation * MkInstantiationNamed(struct __ecereNameSpace__ecere__sys__OldList * specs, struct Expression * exp, struct __ecereNameSpace__ecere__sys__OldList * members);
1207
1208 struct InitDeclarator;
1209
1210 extern void FreeInitDeclarator(struct InitDeclarator * decl);
1211
1212 struct PropertyWatch;
1213
1214 struct PropertyWatch
1215 {
1216 struct PropertyWatch * prev;
1217 struct PropertyWatch * next;
1218 struct Location loc;
1219 struct Statement * compound;
1220 struct __ecereNameSpace__ecere__sys__OldList *  properties;
1221 unsigned int deleteWatch;
1222 } __attribute__ ((gcc_struct));
1223
1224 extern void FreePropertyWatch(struct PropertyWatch * watcher);
1225
1226 struct PropertyImport;
1227
1228 struct PropertyImport
1229 {
1230 struct PropertyImport * prev;
1231 struct PropertyImport * next;
1232 char *  name;
1233 unsigned int isVirtual;
1234 unsigned int hasSet;
1235 unsigned int hasGet;
1236 } __attribute__ ((gcc_struct));
1237
1238 struct MethodImport;
1239
1240 struct MethodImport
1241 {
1242 struct MethodImport * prev;
1243 struct MethodImport * next;
1244 char *  name;
1245 unsigned int isVirtual;
1246 } __attribute__ ((gcc_struct));
1247
1248 struct FunctionImport;
1249
1250 struct FunctionImport
1251 {
1252 struct FunctionImport * prev;
1253 struct FunctionImport * next;
1254 char *  name;
1255 } __attribute__ ((gcc_struct));
1256
1257 struct ClassImport;
1258
1259 struct ClassImport
1260 {
1261 struct ClassImport * prev;
1262 struct ClassImport * next;
1263 char *  name;
1264 struct __ecereNameSpace__ecere__sys__OldList methods;
1265 struct __ecereNameSpace__ecere__sys__OldList properties;
1266 unsigned int itself;
1267 int isRemote;
1268 } __attribute__ ((gcc_struct));
1269
1270 struct Initializer;
1271
1272 struct Expression
1273 {
1274 struct Expression * prev;
1275 struct Expression * next;
1276 struct Location loc;
1277 int type;
1278 union
1279 {
1280 struct
1281 {
1282 char *  constant;
1283 struct Identifier * identifier;
1284 } __attribute__ ((gcc_struct)) __anon1;
1285 struct Statement * compound;
1286 struct Instantiation * instance;
1287 struct
1288 {
1289 char *  string;
1290 unsigned int intlString;
1291 unsigned int wideString;
1292 } __attribute__ ((gcc_struct)) __anon2;
1293 struct __ecereNameSpace__ecere__sys__OldList *  list;
1294 struct
1295 {
1296 struct __ecereNameSpace__ecere__sys__OldList * specifiers;
1297 struct Declarator * decl;
1298 } __attribute__ ((gcc_struct)) _classExp;
1299 struct
1300 {
1301 struct Identifier * id;
1302 } __attribute__ ((gcc_struct)) classData;
1303 struct
1304 {
1305 struct Expression * exp;
1306 struct __ecereNameSpace__ecere__sys__OldList * arguments;
1307 struct Location argLoc;
1308 } __attribute__ ((gcc_struct)) call;
1309 struct
1310 {
1311 struct Expression * exp;
1312 struct __ecereNameSpace__ecere__sys__OldList * index;
1313 } __attribute__ ((gcc_struct)) index;
1314 struct
1315 {
1316 struct Expression * exp;
1317 struct Identifier * member;
1318 int memberType;
1319 unsigned int thisPtr;
1320 } __attribute__ ((gcc_struct)) member;
1321 struct
1322 {
1323 int op;
1324 struct Expression * exp1;
1325 struct Expression * exp2;
1326 } __attribute__ ((gcc_struct)) op;
1327 struct TypeName * typeName;
1328 struct Specifier * _class;
1329 struct
1330 {
1331 struct TypeName * typeName;
1332 struct Expression * exp;
1333 } __attribute__ ((gcc_struct)) cast;
1334 struct
1335 {
1336 struct Expression * cond;
1337 struct __ecereNameSpace__ecere__sys__OldList * exp;
1338 struct Expression * elseExp;
1339 } __attribute__ ((gcc_struct)) cond;
1340 struct
1341 {
1342 struct TypeName * typeName;
1343 struct Expression * size;
1344 } __attribute__ ((gcc_struct)) _new;
1345 struct
1346 {
1347 struct TypeName * typeName;
1348 struct Expression * size;
1349 struct Expression * exp;
1350 } __attribute__ ((gcc_struct)) _renew;
1351 struct
1352 {
1353 char * table;
1354 struct Identifier * id;
1355 } __attribute__ ((gcc_struct)) db;
1356 struct
1357 {
1358 struct Expression * ds;
1359 struct Expression * name;
1360 } __attribute__ ((gcc_struct)) dbopen;
1361 struct
1362 {
1363 struct TypeName * typeName;
1364 struct Initializer * initializer;
1365 } __attribute__ ((gcc_struct)) initializer;
1366 struct
1367 {
1368 struct Expression * exp;
1369 struct TypeName * typeName;
1370 } __attribute__ ((gcc_struct)) vaArg;
1371 } __attribute__ ((gcc_struct)) __anon1;
1372 unsigned int debugValue;
1373 struct __ecereNameSpace__ecere__com__DataValue val;
1374 uint64 address;
1375 unsigned int hasAddress;
1376 struct Type * expType;
1377 struct Type * destType;
1378 unsigned int usage;
1379 int tempCount;
1380 unsigned int byReference;
1381 unsigned int isConstant;
1382 unsigned int addedThis;
1383 unsigned int needCast;
1384 unsigned int thisPtr;
1385 unsigned int opDestType;
1386 unsigned int needTemplateCast;
1387 } __attribute__ ((gcc_struct));
1388
1389 extern struct InitDeclarator * MkInitDeclarator(struct Declarator * declarator, struct Initializer * initializer);
1390
1391 struct Initializer
1392 {
1393 struct Initializer * prev;
1394 struct Initializer * next;
1395 struct Location loc;
1396 int type;
1397 union
1398 {
1399 struct Expression * exp;
1400 struct __ecereNameSpace__ecere__sys__OldList *  list;
1401 } __attribute__ ((gcc_struct)) __anon1;
1402 unsigned int isConstant;
1403 struct Identifier * id;
1404 } __attribute__ ((gcc_struct));
1405
1406 extern struct Initializer * MkInitializerAssignment(struct Expression * exp);
1407
1408 extern struct Expression * MkExpExtensionInitializer(struct TypeName * typeName, struct Initializer * initializer);
1409
1410 extern struct Initializer * MkInitializerList(struct __ecereNameSpace__ecere__sys__OldList * list);
1411
1412 struct InitDeclarator
1413 {
1414 struct InitDeclarator * prev;
1415 struct InitDeclarator * next;
1416 struct Location loc;
1417 struct Declarator * declarator;
1418 struct Initializer * initializer;
1419 } __attribute__ ((gcc_struct));
1420
1421 void ApplyLocation(struct Expression * exp, struct Location * loc)
1422 {
1423 exp->loc = *loc;
1424 switch(exp->type)
1425 {
1426 case 4:
1427 if(exp->__anon1.op.exp1)
1428 ApplyLocation(exp->__anon1.op.exp1, loc);
1429 if(exp->__anon1.op.exp2)
1430 ApplyLocation(exp->__anon1.op.exp2, loc);
1431 break;
1432 case 5:
1433 if(exp->__anon1.list)
1434 {
1435 struct Expression * e;
1436
1437 for(e = (*exp->__anon1.list).first; e; e = e->next)
1438 ApplyLocation(e, loc);
1439 }
1440 break;
1441 case 6:
1442 if(exp->__anon1.index.index)
1443 {
1444 struct Expression * e;
1445
1446 for(e = (*exp->__anon1.index.index).first; e; e = e->next)
1447 ApplyLocation(e, loc);
1448 }
1449 if(exp->__anon1.index.exp)
1450 ApplyLocation(exp->__anon1.index.exp, loc);
1451 break;
1452 case 7:
1453 if(exp->__anon1.call.arguments)
1454 {
1455 struct Expression * arg;
1456
1457 for(arg = (*exp->__anon1.call.arguments).first; arg; arg = arg->next)
1458 ApplyLocation(arg, loc);
1459 }
1460 if(exp->__anon1.call.exp)
1461 ApplyLocation(exp->__anon1.call.exp, loc);
1462 break;
1463 case 8:
1464 case 9:
1465 if(exp->__anon1.member.exp)
1466 ApplyLocation(exp->__anon1.member.exp, loc);
1467 break;
1468 case 11:
1469 if(exp->__anon1.cast.exp)
1470 ApplyLocation(exp->__anon1.cast.exp, loc);
1471 break;
1472 case 12:
1473 if(exp->__anon1.cond.exp)
1474 {
1475 struct Expression * e;
1476
1477 for(e = (*exp->__anon1.cond.exp).first; e; e = e->next)
1478 ApplyLocation(e, loc);
1479 }
1480 if(exp->__anon1.cond.cond)
1481 ApplyLocation(exp->__anon1.cond.cond, loc);
1482 if(exp->__anon1.cond.elseExp)
1483 ApplyLocation(exp->__anon1.cond.elseExp, loc);
1484 break;
1485 case 34:
1486 if(exp->__anon1.vaArg.exp)
1487 ApplyLocation(exp->__anon1.vaArg.exp, loc);
1488 break;
1489 default:
1490 break;
1491 }
1492 }
1493
1494 void __ecereMethod_Expression_Clear();
1495
1496 struct MembersInit;
1497
1498 struct MembersInit
1499 {
1500 struct MembersInit * prev;
1501 struct MembersInit * next;
1502 struct Location loc;
1503 int type;
1504 union
1505 {
1506 struct __ecereNameSpace__ecere__sys__OldList *  dataMembers;
1507 struct ClassFunction * function;
1508 } __attribute__ ((gcc_struct)) __anon1;
1509 } __attribute__ ((gcc_struct));
1510
1511 extern struct MembersInit * MkMembersInitList(struct __ecereNameSpace__ecere__sys__OldList * dataMembers);
1512
1513 struct Operand;
1514
1515 struct OpTable
1516 {
1517 unsigned int (*  Add)(struct Expression *, struct Operand *, struct Operand *);
1518 unsigned int (*  Sub)(struct Expression *, struct Operand *, struct Operand *);
1519 unsigned int (*  Mul)(struct Expression *, struct Operand *, struct Operand *);
1520 unsigned int (*  Div)(struct Expression *, struct Operand *, struct Operand *);
1521 unsigned int (*  Mod)(struct Expression *, struct Operand *, struct Operand *);
1522 unsigned int (*  Neg)(struct Expression *, struct Operand *);
1523 unsigned int (*  Inc)(struct Expression *, struct Operand *);
1524 unsigned int (*  Dec)(struct Expression *, struct Operand *);
1525 unsigned int (*  Asign)(struct Expression *, struct Operand *, struct Operand *);
1526 unsigned int (*  AddAsign)(struct Expression *, struct Operand *, struct Operand *);
1527 unsigned int (*  SubAsign)(struct Expression *, struct Operand *, struct Operand *);
1528 unsigned int (*  MulAsign)(struct Expression *, struct Operand *, struct Operand *);
1529 unsigned int (*  DivAsign)(struct Expression *, struct Operand *, struct Operand *);
1530 unsigned int (*  ModAsign)(struct Expression *, struct Operand *, struct Operand *);
1531 unsigned int (*  BitAnd)(struct Expression *, struct Operand *, struct Operand *);
1532 unsigned int (*  BitOr)(struct Expression *, struct Operand *, struct Operand *);
1533 unsigned int (*  BitXor)(struct Expression *, struct Operand *, struct Operand *);
1534 unsigned int (*  LShift)(struct Expression *, struct Operand *, struct Operand *);
1535 unsigned int (*  RShift)(struct Expression *, struct Operand *, struct Operand *);
1536 unsigned int (*  BitNot)(struct Expression *, struct Operand *);
1537 unsigned int (*  AndAsign)(struct Expression *, struct Operand *, struct Operand *);
1538 unsigned int (*  OrAsign)(struct Expression *, struct Operand *, struct Operand *);
1539 unsigned int (*  XorAsign)(struct Expression *, struct Operand *, struct Operand *);
1540 unsigned int (*  LShiftAsign)(struct Expression *, struct Operand *, struct Operand *);
1541 unsigned int (*  RShiftAsign)(struct Expression *, struct Operand *, struct Operand *);
1542 unsigned int (*  Not)(struct Expression *, struct Operand *);
1543 unsigned int (*  Equ)(struct Expression *, struct Operand *, struct Operand *);
1544 unsigned int (*  Nqu)(struct Expression *, struct Operand *, struct Operand *);
1545 unsigned int (*  And)(struct Expression *, struct Operand *, struct Operand *);
1546 unsigned int (*  Or)(struct Expression *, struct Operand *, struct Operand *);
1547 unsigned int (*  Grt)(struct Expression *, struct Operand *, struct Operand *);
1548 unsigned int (*  Sma)(struct Expression *, struct Operand *, struct Operand *);
1549 unsigned int (*  GrtEqu)(struct Expression *, struct Operand *, struct Operand *);
1550 unsigned int (*  SmaEqu)(struct Expression *, struct Operand *, struct Operand *);
1551 unsigned int (*  Cond)(struct Expression *, struct Operand *, struct Operand *, struct Operand *);
1552 } __attribute__ ((gcc_struct));
1553
1554 struct Operand
1555 {
1556 int kind;
1557 struct Type * type;
1558 unsigned int ptrSize;
1559 union
1560 {
1561 char c;
1562 unsigned char uc;
1563 short s;
1564 unsigned short us;
1565 int i;
1566 unsigned int ui;
1567 float f;
1568 double d;
1569 long long i64;
1570 uint64 ui64;
1571 } __attribute__ ((gcc_struct)) __anon1;
1572 struct OpTable ops;
1573 } __attribute__ ((gcc_struct));
1574
1575 struct External *  _DeclareStruct(struct External *  neededBy, const char *  name, unsigned int skipNoHead, unsigned int needDereference, unsigned int fwdDecl);
1576
1577 struct External * DeclareStruct(struct External * neededBy, const char * name, unsigned int skipNoHead, unsigned int needDereference)
1578 {
1579 return _DeclareStruct(neededBy, name, skipNoHead, needDereference, 0);
1580 }
1581
1582 static void _DeclareType(struct External *  neededFor, struct Type *  type, unsigned int needDereference, unsigned int forFunctionDef, unsigned int fwdDecl);
1583
1584 void DeclareType(struct External * neededFor, struct Type * type, unsigned int needDereference, unsigned int forFunctionDef)
1585 {
1586 _DeclareType(neededFor, type, needDereference, forFunctionDef, 0);
1587 }
1588
1589 void DeclareTypeForwardDeclare(struct External * neededFor, struct Type * type, unsigned int needDereference, unsigned int forFunctionDef)
1590 {
1591 _DeclareType(neededFor, type, needDereference, forFunctionDef, 1);
1592 }
1593
1594 static void _PrintType(struct Type *  type, char *  string, unsigned int printName, unsigned int fullName, unsigned int printConst);
1595
1596 void PrintType(struct Type * type, char * string, unsigned int printName, unsigned int fullName)
1597 {
1598 _PrintType(type, string, printName, fullName, 1);
1599 }
1600
1601 void PrintTypeNoConst(struct Type * type, char * string, unsigned int printName, unsigned int fullName)
1602 {
1603 _PrintType(type, string, printName, fullName, 0);
1604 }
1605
1606 struct __ecereNameSpace__ecere__com__Method;
1607
1608 struct __ecereNameSpace__ecere__com__Method
1609 {
1610 const char *  name;
1611 struct __ecereNameSpace__ecere__com__Method * parent;
1612 struct __ecereNameSpace__ecere__com__Method * left;
1613 struct __ecereNameSpace__ecere__com__Method * right;
1614 int depth;
1615 int (*  function)();
1616 int vid;
1617 int type;
1618 struct __ecereNameSpace__ecere__com__Class * _class;
1619 void *  symbol;
1620 const char *  dataTypeString;
1621 struct Type * dataType;
1622 int memberAccess;
1623 } __attribute__ ((gcc_struct));
1624
1625 struct Symbol
1626 {
1627 char *  string;
1628 struct Symbol * parent;
1629 struct Symbol * left;
1630 struct Symbol * right;
1631 int depth;
1632 struct Type * type;
1633 union
1634 {
1635 struct __ecereNameSpace__ecere__com__Method * method;
1636 struct __ecereNameSpace__ecere__com__Property * _property;
1637 struct __ecereNameSpace__ecere__com__Class * registered;
1638 } __attribute__ ((gcc_struct)) __anon1;
1639 unsigned int notYetDeclared;
1640 union
1641 {
1642 struct
1643 {
1644 struct External * pointerExternal;
1645 struct External * structExternal;
1646 } __attribute__ ((gcc_struct)) __anon1;
1647 struct
1648 {
1649 struct External * externalGet;
1650 struct External * externalSet;
1651 struct External * externalPtr;
1652 struct External * externalIsSet;
1653 } __attribute__ ((gcc_struct)) __anon2;
1654 struct
1655 {
1656 struct External * methodExternal;
1657 struct External * methodCodeExternal;
1658 } __attribute__ ((gcc_struct)) __anon3;
1659 } __attribute__ ((gcc_struct)) __anon2;
1660 unsigned int imported;
1661 unsigned int declaredStructSym;
1662 struct __ecereNameSpace__ecere__com__Class * _class;
1663 unsigned int declaredStruct;
1664 unsigned int needConstructor;
1665 unsigned int needDestructor;
1666 char *  constructorName;
1667 char *  structName;
1668 char *  className;
1669 char *  destructorName;
1670 struct ModuleImport * module;
1671 struct ClassImport * _import;
1672 struct Location nameLoc;
1673 unsigned int isParam;
1674 unsigned int isRemote;
1675 unsigned int isStruct;
1676 unsigned int fireWatchersDone;
1677 int declaring;
1678 unsigned int classData;
1679 unsigned int isStatic;
1680 char *  shortName;
1681 struct __ecereNameSpace__ecere__sys__OldList *  templateParams;
1682 struct __ecereNameSpace__ecere__sys__OldList templatedClasses;
1683 struct Context * ctx;
1684 int isIterator;
1685 struct Expression * propCategory;
1686 } __attribute__ ((gcc_struct));
1687
1688 struct __ecereNameSpace__ecere__com__ClassProperty;
1689
1690 extern struct __ecereNameSpace__ecere__com__ClassProperty * __ecereNameSpace__ecere__com__eClass_FindClassProperty(struct __ecereNameSpace__ecere__com__Class * _class, const char *  name);
1691
1692 struct __ecereNameSpace__ecere__com__ClassProperty
1693 {
1694 const char *  name;
1695 struct __ecereNameSpace__ecere__com__ClassProperty * parent;
1696 struct __ecereNameSpace__ecere__com__ClassProperty * left;
1697 struct __ecereNameSpace__ecere__com__ClassProperty * right;
1698 int depth;
1699 void (*  Set)(struct __ecereNameSpace__ecere__com__Class *, long long);
1700 long long (*  Get)(struct __ecereNameSpace__ecere__com__Class *);
1701 const char *  dataTypeString;
1702 struct Type * dataType;
1703 unsigned int constant;
1704 } __attribute__ ((gcc_struct));
1705
1706 struct __ecereNameSpace__ecere__com__BitMember;
1707
1708 struct __ecereNameSpace__ecere__com__BitMember
1709 {
1710 struct __ecereNameSpace__ecere__com__BitMember * prev;
1711 struct __ecereNameSpace__ecere__com__BitMember * next;
1712 const char *  name;
1713 unsigned int isProperty;
1714 int memberAccess;
1715 int id;
1716 struct __ecereNameSpace__ecere__com__Class * _class;
1717 const char *  dataTypeString;
1718 struct __ecereNameSpace__ecere__com__Class * dataTypeClass;
1719 struct Type * dataType;
1720 int type;
1721 int size;
1722 int pos;
1723 uint64 mask;
1724 } __attribute__ ((gcc_struct));
1725
1726 struct __ecereNameSpace__ecere__com__DataMember;
1727
1728 struct __ecereNameSpace__ecere__com__ClassTemplateArgument
1729 {
1730 union
1731 {
1732 struct
1733 {
1734 const char *  dataTypeString;
1735 struct __ecereNameSpace__ecere__com__Class * dataTypeClass;
1736 } __attribute__ ((gcc_struct)) __anon1;
1737 struct __ecereNameSpace__ecere__com__DataValue expression;
1738 struct
1739 {
1740 const char *  memberString;
1741 union
1742 {
1743 struct __ecereNameSpace__ecere__com__DataMember * member;
1744 struct __ecereNameSpace__ecere__com__Property * prop;
1745 struct __ecereNameSpace__ecere__com__Method * method;
1746 } __attribute__ ((gcc_struct)) __anon1;
1747 } __attribute__ ((gcc_struct)) __anon2;
1748 } __attribute__ ((gcc_struct)) __anon1;
1749 } __attribute__ ((gcc_struct));
1750
1751 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);
1752
1753 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);
1754
1755 struct TemplateParameter;
1756
1757 struct TemplateParameter
1758 {
1759 struct TemplateParameter * prev;
1760 struct TemplateParameter * next;
1761 struct Location loc;
1762 int type;
1763 struct Identifier * identifier;
1764 union
1765 {
1766 struct TemplateDatatype * dataType;
1767 int memberType;
1768 } __attribute__ ((gcc_struct)) __anon1;
1769 struct TemplateArgument * defaultArgument;
1770 const char *  dataTypeString;
1771 struct Type * baseType;
1772 } __attribute__ ((gcc_struct));
1773
1774 struct Type
1775 {
1776 struct Type * prev;
1777 struct Type * next;
1778 int refCount;
1779 union
1780 {
1781 struct Symbol * _class;
1782 struct
1783 {
1784 struct __ecereNameSpace__ecere__sys__OldList members;
1785 char *  enumName;
1786 } __attribute__ ((gcc_struct)) __anon1;
1787 struct
1788 {
1789 struct Type * returnType;
1790 struct __ecereNameSpace__ecere__sys__OldList params;
1791 struct Symbol * thisClass;
1792 unsigned int staticMethod;
1793 struct TemplateParameter * thisClassTemplate;
1794 } __attribute__ ((gcc_struct)) __anon2;
1795 struct
1796 {
1797 struct __ecereNameSpace__ecere__com__Method * method;
1798 struct __ecereNameSpace__ecere__com__Class * methodClass;
1799 struct __ecereNameSpace__ecere__com__Class * usedClass;
1800 } __attribute__ ((gcc_struct)) __anon3;
1801 struct
1802 {
1803 struct Type * arrayType;
1804 int arraySize;
1805 struct Expression * arraySizeExp;
1806 unsigned int freeExp;
1807 struct Symbol * enumClass;
1808 } __attribute__ ((gcc_struct)) __anon4;
1809 struct Type * type;
1810 struct TemplateParameter * templateParameter;
1811 } __attribute__ ((gcc_struct)) __anon1;
1812 int kind;
1813 unsigned int size;
1814 char *  name;
1815 char *  typeName;
1816 struct __ecereNameSpace__ecere__com__Class * thisClassFrom;
1817 int classObjectType;
1818 int alignment;
1819 unsigned int offset;
1820 int bitFieldCount;
1821 int count;
1822 unsigned int isSigned : 1;
1823 unsigned int constant : 1;
1824 unsigned int truth : 1;
1825 unsigned int byReference : 1;
1826 unsigned int extraParam : 1;
1827 unsigned int directClassAccess : 1;
1828 unsigned int computing : 1;
1829 unsigned int keepCast : 1;
1830 unsigned int passAsTemplate : 1;
1831 unsigned int dllExport : 1;
1832 unsigned int attrStdcall : 1;
1833 unsigned int declaredWithStruct : 1;
1834 unsigned int typedByReference : 1;
1835 unsigned int casted : 1;
1836 unsigned int pointerAlignment : 1;
1837 } __attribute__ ((gcc_struct));
1838
1839 struct Specifier
1840 {
1841 struct Specifier * prev;
1842 struct Specifier * next;
1843 struct Location loc;
1844 int type;
1845 union
1846 {
1847 int specifier;
1848 struct
1849 {
1850 struct ExtDecl * extDecl;
1851 char *  name;
1852 struct Symbol * symbol;
1853 struct __ecereNameSpace__ecere__sys__OldList *  templateArgs;
1854 } __attribute__ ((gcc_struct)) __anon1;
1855 struct
1856 {
1857 struct Identifier * id;
1858 struct __ecereNameSpace__ecere__sys__OldList *  list;
1859 struct __ecereNameSpace__ecere__sys__OldList *  baseSpecs;
1860 struct __ecereNameSpace__ecere__sys__OldList *  definitions;
1861 unsigned int addNameSpace;
1862 struct Context * ctx;
1863 struct ExtDecl * extDeclStruct;
1864 } __attribute__ ((gcc_struct)) __anon2;
1865 struct Expression * expression;
1866 struct Specifier * _class;
1867 struct TemplateParameter * templateParameter;
1868 } __attribute__ ((gcc_struct)) __anon1;
1869 } __attribute__ ((gcc_struct));
1870
1871 extern struct Expression * GetTemplateArgExp(struct TemplateParameter * param, struct __ecereNameSpace__ecere__com__Class * curClass, unsigned int pointer);
1872
1873 struct TemplatedType
1874 {
1875 uintptr_t key;
1876 struct __ecereNameSpace__ecere__sys__BTNode * parent;
1877 struct __ecereNameSpace__ecere__sys__BTNode * left;
1878 struct __ecereNameSpace__ecere__sys__BTNode * right;
1879 int depth;
1880 struct TemplateParameter * param;
1881 } __attribute__ ((gcc_struct));
1882
1883 struct Type * ProcessTemplateParameterType(struct TemplateParameter * param)
1884 {
1885 if(param && param->type == 0 && (param->__anon1.dataType || param->dataTypeString))
1886 {
1887 if(!param->baseType)
1888 {
1889 if(param->dataTypeString)
1890 param->baseType = ProcessTypeString(param->dataTypeString, 0);
1891 else
1892 param->baseType = ProcessType(param->__anon1.dataType->specifiers, param->__anon1.dataType->decl);
1893 }
1894 return param->baseType;
1895 }
1896 return (((void *)0));
1897 }
1898
1899 unsigned int NeedCast(struct Type * type1, struct Type * type2)
1900 {
1901 if(!type1 || !type2 || type1->keepCast || type2->keepCast)
1902 return 1;
1903 if(type1->kind == 20 && type2->kind == 4 && type2->passAsTemplate == 0)
1904 {
1905 return 0;
1906 }
1907 if(type1->kind == type2->kind)
1908 {
1909 switch(type1->kind)
1910 {
1911 case 24:
1912 case 1:
1913 case 2:
1914 case 3:
1915 case 4:
1916 case 22:
1917 case 23:
1918 if(type1->passAsTemplate && !type2->passAsTemplate)
1919 return 1;
1920 return type1->isSigned != type2->isSigned;
1921 case 8:
1922 return type1->__anon1._class != type2->__anon1._class;
1923 case 13:
1924 return (type1->__anon1.type && type2->__anon1.type && type1->__anon1.type->constant != type2->__anon1.type->constant) || NeedCast(type1->__anon1.type, type2->__anon1.type);
1925 default:
1926 return 1;
1927 }
1928 }
1929 return 1;
1930 }
1931
1932 unsigned int GetOpInt(struct Operand * op2, int * value2)
1933 {
1934 if(op2->kind == 3 && op2->type->isSigned)
1935 *value2 = op2->__anon1.i;
1936 else if(op2->kind == 3)
1937 *value2 = (int)op2->__anon1.ui;
1938 else if(op2->kind == 4 && op2->type->isSigned)
1939 *value2 = (int)op2->__anon1.i64;
1940 else if(op2->kind == 4)
1941 *value2 = (int)op2->__anon1.ui64;
1942 else if(op2->kind == 23 && op2->type->isSigned)
1943 *value2 = (int)op2->__anon1.i64;
1944 else if(op2->kind == 23)
1945 *value2 = (int)op2->__anon1.ui64;
1946 else if(op2->kind == 22 && op2->type->isSigned)
1947 *value2 = (int)op2->__anon1.i64;
1948 else if(op2->kind == 22)
1949 *value2 = (int)op2->__anon1.ui64;
1950 else if(op2->kind == 2 && op2->type->isSigned)
1951 *value2 = (int)op2->__anon1.s;
1952 else if(op2->kind == 2)
1953 *value2 = (int)op2->__anon1.us;
1954 else if(op2->kind == 1 && op2->type->isSigned)
1955 *value2 = (int)op2->__anon1.c;
1956 else if(op2->kind == 24 || op2->kind == 1)
1957 *value2 = (int)op2->__anon1.uc;
1958 else if(op2->kind == 6)
1959 *value2 = (int)op2->__anon1.f;
1960 else if(op2->kind == 7)
1961 *value2 = (int)op2->__anon1.d;
1962 else if(op2->kind == 13)
1963 *value2 = (int)op2->__anon1.ui64;
1964 else
1965 return 0;
1966 return 1;
1967 }
1968
1969 unsigned int GetOpUInt(struct Operand * op2, unsigned int * value2)
1970 {
1971 if(op2->kind == 3 && op2->type->isSigned)
1972 *value2 = (unsigned int)op2->__anon1.i;
1973 else if(op2->kind == 3)
1974 *value2 = op2->__anon1.ui;
1975 else if(op2->kind == 4 && op2->type->isSigned)
1976 *value2 = (unsigned int)op2->__anon1.i64;
1977 else if(op2->kind == 4)
1978 *value2 = (unsigned int)op2->__anon1.ui64;
1979 else if(op2->kind == 23 && op2->type->isSigned)
1980 *value2 = (unsigned int)op2->__anon1.i64;
1981 else if(op2->kind == 23)
1982 *value2 = (unsigned int)op2->__anon1.ui64;
1983 else if(op2->kind == 22 && op2->type->isSigned)
1984 *value2 = (unsigned int)op2->__anon1.i64;
1985 else if(op2->kind == 22)
1986 *value2 = (unsigned int)op2->__anon1.ui64;
1987 else if(op2->kind == 2 && op2->type->isSigned)
1988 *value2 = (unsigned int)op2->__anon1.s;
1989 else if(op2->kind == 2)
1990 *value2 = (unsigned int)op2->__anon1.us;
1991 else if(op2->kind == 1 && op2->type->isSigned)
1992 *value2 = (unsigned int)op2->__anon1.c;
1993 else if(op2->kind == 24 || op2->kind == 1)
1994 *value2 = (unsigned int)op2->__anon1.uc;
1995 else if(op2->kind == 6)
1996 *value2 = (unsigned int)op2->__anon1.f;
1997 else if(op2->kind == 7)
1998 *value2 = (unsigned int)op2->__anon1.d;
1999 else if(op2->kind == 13)
2000 *value2 = (unsigned int)op2->__anon1.ui64;
2001 else
2002 return 0;
2003 return 1;
2004 }
2005
2006 unsigned int GetOpInt64(struct Operand * op2, long long * value2)
2007 {
2008 if(op2->kind == 3 && op2->type->isSigned)
2009 *value2 = (long long)op2->__anon1.i;
2010 else if(op2->kind == 3)
2011 *value2 = (long long)op2->__anon1.ui;
2012 else if(op2->kind == 4 && op2->type->isSigned)
2013 *value2 = op2->__anon1.i64;
2014 else if(op2->kind == 4)
2015 *value2 = (long long)op2->__anon1.ui64;
2016 else if(op2->kind == 23 && op2->type->isSigned)
2017 *value2 = op2->__anon1.i64;
2018 else if(op2->kind == 23)
2019 *value2 = (long long)op2->__anon1.ui64;
2020 else if(op2->kind == 22 && op2->type->isSigned)
2021 *value2 = op2->__anon1.i64;
2022 else if(op2->kind == 22)
2023 *value2 = (long long)op2->__anon1.ui64;
2024 else if(op2->kind == 2 && op2->type->isSigned)
2025 *value2 = (long long)op2->__anon1.s;
2026 else if(op2->kind == 2)
2027 *value2 = (long long)op2->__anon1.us;
2028 else if(op2->kind == 1 && op2->type->isSigned)
2029 *value2 = (long long)op2->__anon1.c;
2030 else if(op2->kind == 24 || op2->kind == 1)
2031 *value2 = (long long)op2->__anon1.uc;
2032 else if(op2->kind == 6)
2033 *value2 = (long long)op2->__anon1.f;
2034 else if(op2->kind == 7)
2035 *value2 = (long long)op2->__anon1.d;
2036 else if(op2->kind == 13)
2037 *value2 = (long long)op2->__anon1.ui64;
2038 else
2039 return 0;
2040 return 1;
2041 }
2042
2043 unsigned int GetOpUInt64(struct Operand * op2, uint64 * value2)
2044 {
2045 if(op2->kind == 3 && op2->type->isSigned)
2046 *value2 = (uint64)op2->__anon1.i;
2047 else if(op2->kind == 3)
2048 *value2 = (uint64)op2->__anon1.ui;
2049 else if(op2->kind == 4 && op2->type->isSigned)
2050 *value2 = (uint64)op2->__anon1.i64;
2051 else if(op2->kind == 4)
2052 *value2 = op2->__anon1.ui64;
2053 else if(op2->kind == 23 && op2->type->isSigned)
2054 *value2 = (uint64)op2->__anon1.i64;
2055 else if(op2->kind == 23)
2056 *value2 = op2->__anon1.ui64;
2057 else if(op2->kind == 22 && op2->type->isSigned)
2058 *value2 = (uint64)op2->__anon1.i64;
2059 else if(op2->kind == 22)
2060 *value2 = op2->__anon1.ui64;
2061 else if(op2->kind == 2 && op2->type->isSigned)
2062 *value2 = (uint64)op2->__anon1.s;
2063 else if(op2->kind == 2)
2064 *value2 = (uint64)op2->__anon1.us;
2065 else if(op2->kind == 1 && op2->type->isSigned)
2066 *value2 = (uint64)op2->__anon1.c;
2067 else if(op2->kind == 24 || op2->kind == 1)
2068 *value2 = (uint64)op2->__anon1.uc;
2069 else if(op2->kind == 6)
2070 *value2 = (uint64)op2->__anon1.f;
2071 else if(op2->kind == 7)
2072 *value2 = (uint64)op2->__anon1.d;
2073 else if(op2->kind == 13)
2074 *value2 = op2->__anon1.ui64;
2075 else
2076 return 0;
2077 return 1;
2078 }
2079
2080 unsigned int GetOpIntPtr(struct Operand * op2, intptr_t * value2)
2081 {
2082 if(op2->kind == 3 && op2->type->isSigned)
2083 *value2 = (intptr_t)op2->__anon1.i;
2084 else if(op2->kind == 3)
2085 *value2 = (intptr_t)op2->__anon1.ui;
2086 else if(op2->kind == 4 && op2->type->isSigned)
2087 *value2 = (intptr_t)op2->__anon1.i64;
2088 else if(op2->kind == 4)
2089 *value2 = (intptr_t)op2->__anon1.ui64;
2090 else if(op2->kind == 23 && op2->type->isSigned)
2091 *value2 = (intptr_t)op2->__anon1.i64;
2092 else if(op2->kind == 23)
2093 *value2 = (intptr_t)op2->__anon1.ui64;
2094 else if(op2->kind == 22 && op2->type->isSigned)
2095 *value2 = (intptr_t)op2->__anon1.i64;
2096 else if(op2->kind == 22)
2097 *value2 = (intptr_t)op2->__anon1.ui64;
2098 else if(op2->kind == 2 && op2->type->isSigned)
2099 *value2 = (intptr_t)op2->__anon1.s;
2100 else if(op2->kind == 2)
2101 *value2 = (intptr_t)op2->__anon1.us;
2102 else if(op2->kind == 1 && op2->type->isSigned)
2103 *value2 = (intptr_t)op2->__anon1.c;
2104 else if(op2->kind == 24 || op2->kind == 1)
2105 *value2 = (intptr_t)op2->__anon1.uc;
2106 else if(op2->kind == 6)
2107 *value2 = (intptr_t)op2->__anon1.f;
2108 else if(op2->kind == 7)
2109 *value2 = (intptr_t)op2->__anon1.d;
2110 else if(op2->kind == 13)
2111 *value2 = (intptr_t)op2->__anon1.ui64;
2112 else
2113 return 0;
2114 return 1;
2115 }
2116
2117 unsigned int GetOpUIntPtr(struct Operand * op2, uintptr_t * value2)
2118 {
2119 if(op2->kind == 3 && op2->type->isSigned)
2120 *value2 = (uintptr_t)op2->__anon1.i;
2121 else if(op2->kind == 3)
2122 *value2 = (uintptr_t)op2->__anon1.ui;
2123 else if(op2->kind == 4 && op2->type->isSigned)
2124 *value2 = (uintptr_t)op2->__anon1.i64;
2125 else if(op2->kind == 4)
2126 *value2 = (uintptr_t)op2->__anon1.ui64;
2127 else if(op2->kind == 23 && op2->type->isSigned)
2128 *value2 = (uintptr_t)op2->__anon1.i64;
2129 else if(op2->kind == 23)
2130 *value2 = (uintptr_t)op2->__anon1.ui64;
2131 else if(op2->kind == 22 && op2->type->isSigned)
2132 *value2 = (uintptr_t)op2->__anon1.i64;
2133 else if(op2->kind == 22)
2134 *value2 = (uintptr_t)op2->__anon1.ui64;
2135 else if(op2->kind == 2 && op2->type->isSigned)
2136 *value2 = (uintptr_t)op2->__anon1.s;
2137 else if(op2->kind == 2)
2138 *value2 = (uintptr_t)op2->__anon1.us;
2139 else if(op2->kind == 1 && op2->type->isSigned)
2140 *value2 = (uintptr_t)op2->__anon1.c;
2141 else if(op2->kind == 24 || op2->kind == 1)
2142 *value2 = (uintptr_t)op2->__anon1.uc;
2143 else if(op2->kind == 6)
2144 *value2 = (uintptr_t)op2->__anon1.f;
2145 else if(op2->kind == 7)
2146 *value2 = (uintptr_t)op2->__anon1.d;
2147 else if(op2->kind == 13)
2148 *value2 = (uintptr_t)op2->__anon1.ui64;
2149 else
2150 return 0;
2151 return 1;
2152 }
2153
2154 unsigned int GetOpIntSize(struct Operand * op2, ssize_t * value2)
2155 {
2156 if(op2->kind == 3 && op2->type->isSigned)
2157 *value2 = (ssize_t)op2->__anon1.i;
2158 else if(op2->kind == 3)
2159 *value2 = (ssize_t)op2->__anon1.ui;
2160 else if(op2->kind == 4 && op2->type->isSigned)
2161 *value2 = (ssize_t)op2->__anon1.i64;
2162 else if(op2->kind == 4)
2163 *value2 = (ssize_t)op2->__anon1.ui64;
2164 else if(op2->kind == 23 && op2->type->isSigned)
2165 *value2 = (ssize_t)op2->__anon1.i64;
2166 else if(op2->kind == 23)
2167 *value2 = (ssize_t)op2->__anon1.ui64;
2168 else if(op2->kind == 22 && op2->type->isSigned)
2169 *value2 = (ssize_t)op2->__anon1.i64;
2170 else if(op2->kind == 22)
2171 *value2 = (ssize_t)op2->__anon1.ui64;
2172 else if(op2->kind == 2 && op2->type->isSigned)
2173 *value2 = (ssize_t)op2->__anon1.s;
2174 else if(op2->kind == 2)
2175 *value2 = (ssize_t)op2->__anon1.us;
2176 else if(op2->kind == 1 && op2->type->isSigned)
2177 *value2 = (ssize_t)op2->__anon1.c;
2178 else if(op2->kind == 24 || op2->kind == 1)
2179 *value2 = (ssize_t)op2->__anon1.uc;
2180 else if(op2->kind == 6)
2181 *value2 = (ssize_t)op2->__anon1.f;
2182 else if(op2->kind == 7)
2183 *value2 = (ssize_t)op2->__anon1.d;
2184 else if(op2->kind == 13)
2185 *value2 = (ssize_t)op2->__anon1.ui64;
2186 else
2187 return 0;
2188 return 1;
2189 }
2190
2191 unsigned int GetOpUIntSize(struct Operand * op2, size_t * value2)
2192 {
2193 if(op2->kind == 3 && op2->type->isSigned)
2194 *value2 = (size_t)op2->__anon1.i;
2195 else if(op2->kind == 3)
2196 *value2 = (size_t)op2->__anon1.ui;
2197 else if(op2->kind == 4 && op2->type->isSigned)
2198 *value2 = (size_t)op2->__anon1.i64;
2199 else if(op2->kind == 4)
2200 *value2 = (size_t)op2->__anon1.ui64;
2201 else if(op2->kind == 23 && op2->type->isSigned)
2202 *value2 = (size_t)op2->__anon1.i64;
2203 else if(op2->kind == 23)
2204 *value2 = (size_t)op2->__anon1.ui64;
2205 else if(op2->kind == 22 && op2->type->isSigned)
2206 *value2 = (size_t)op2->__anon1.i64;
2207 else if(op2->kind == 22)
2208 *value2 = (size_t)op2->__anon1.ui64;
2209 else if(op2->kind == 2 && op2->type->isSigned)
2210 *value2 = (size_t)op2->__anon1.s;
2211 else if(op2->kind == 2)
2212 *value2 = (size_t)op2->__anon1.us;
2213 else if(op2->kind == 1 && op2->type->isSigned)
2214 *value2 = (size_t)op2->__anon1.c;
2215 else if(op2->kind == 24 || op2->kind == 1)
2216 *value2 = (size_t)op2->__anon1.uc;
2217 else if(op2->kind == 6)
2218 *value2 = (size_t)op2->__anon1.f;
2219 else if(op2->kind == 7)
2220 *value2 = (size_t)op2->__anon1.d;
2221 else if(op2->kind == 13)
2222 *value2 = (size_t)op2->__anon1.ui64;
2223 else
2224 return 0;
2225 return 1;
2226 }
2227
2228 unsigned int GetOpShort(struct Operand * op2, short * value2)
2229 {
2230 if(op2->kind == 3 && op2->type->isSigned)
2231 *value2 = (short)op2->__anon1.i;
2232 else if(op2->kind == 3)
2233 *value2 = (short)op2->__anon1.ui;
2234 else if(op2->kind == 4 && op2->type->isSigned)
2235 *value2 = (short)op2->__anon1.i64;
2236 else if(op2->kind == 4)
2237 *value2 = (short)op2->__anon1.ui64;
2238 else if(op2->kind == 23 && op2->type->isSigned)
2239 *value2 = (short)op2->__anon1.i64;
2240 else if(op2->kind == 23)
2241 *value2 = (short)op2->__anon1.ui64;
2242 else if(op2->kind == 22 && op2->type->isSigned)
2243 *value2 = (short)op2->__anon1.i64;
2244 else if(op2->kind == 22)
2245 *value2 = (short)op2->__anon1.ui64;
2246 else if(op2->kind == 2 && op2->type->isSigned)
2247 *value2 = op2->__anon1.s;
2248 else if(op2->kind == 2)
2249 *value2 = (short)op2->__anon1.us;
2250 else if(op2->kind == 1 && op2->type->isSigned)
2251 *value2 = (short)op2->__anon1.c;
2252 else if(op2->kind == 24 || op2->kind == 1)
2253 *value2 = (short)op2->__anon1.uc;
2254 else if(op2->kind == 6)
2255 *value2 = (short)op2->__anon1.f;
2256 else if(op2->kind == 7)
2257 *value2 = (short)op2->__anon1.d;
2258 else if(op2->kind == 13)
2259 *value2 = (short)op2->__anon1.ui64;
2260 else
2261 return 0;
2262 return 1;
2263 }
2264
2265 unsigned int GetOpUShort(struct Operand * op2, unsigned short * value2)
2266 {
2267 if(op2->kind == 3 && op2->type->isSigned)
2268 *value2 = (unsigned short)op2->__anon1.i;
2269 else if(op2->kind == 3)
2270 *value2 = (unsigned short)op2->__anon1.ui;
2271 else if(op2->kind == 4 && op2->type->isSigned)
2272 *value2 = (unsigned short)op2->__anon1.i64;
2273 else if(op2->kind == 4)
2274 *value2 = (unsigned short)op2->__anon1.ui64;
2275 else if(op2->kind == 23 && op2->type->isSigned)
2276 *value2 = (unsigned short)op2->__anon1.i64;
2277 else if(op2->kind == 23)
2278 *value2 = (unsigned short)op2->__anon1.ui64;
2279 else if(op2->kind == 22 && op2->type->isSigned)
2280 *value2 = (unsigned short)op2->__anon1.i64;
2281 else if(op2->kind == 22)
2282 *value2 = (unsigned short)op2->__anon1.ui64;
2283 else if(op2->kind == 2 && op2->type->isSigned)
2284 *value2 = (unsigned short)op2->__anon1.s;
2285 else if(op2->kind == 2)
2286 *value2 = op2->__anon1.us;
2287 else if(op2->kind == 1 && op2->type->isSigned)
2288 *value2 = (unsigned short)op2->__anon1.c;
2289 else if(op2->kind == 24 || op2->kind == 1)
2290 *value2 = (unsigned short)op2->__anon1.uc;
2291 else if(op2->kind == 6)
2292 *value2 = (unsigned short)op2->__anon1.f;
2293 else if(op2->kind == 7)
2294 *value2 = (unsigned short)op2->__anon1.d;
2295 else if(op2->kind == 13)
2296 *value2 = (unsigned short)op2->__anon1.ui64;
2297 else
2298 return 0;
2299 return 1;
2300 }
2301
2302 unsigned int GetOpChar(struct Operand * op2, char * value2)
2303 {
2304 if(op2->kind == 3 && op2->type->isSigned)
2305 *value2 = (char)op2->__anon1.i;
2306 else if(op2->kind == 3)
2307 *value2 = (char)op2->__anon1.ui;
2308 else if(op2->kind == 4 && op2->type->isSigned)
2309 *value2 = (char)op2->__anon1.i64;
2310 else if(op2->kind == 4)
2311 *value2 = (char)op2->__anon1.ui64;
2312 else if(op2->kind == 23 && op2->type->isSigned)
2313 *value2 = (char)op2->__anon1.i64;
2314 else if(op2->kind == 23)
2315 *value2 = (char)op2->__anon1.ui64;
2316 else if(op2->kind == 22 && op2->type->isSigned)
2317 *value2 = (char)op2->__anon1.i64;
2318 else if(op2->kind == 22)
2319 *value2 = (char)op2->__anon1.ui64;
2320 else if(op2->kind == 2 && op2->type->isSigned)
2321 *value2 = (char)op2->__anon1.s;
2322 else if(op2->kind == 2)
2323 *value2 = (char)op2->__anon1.us;
2324 else if(op2->kind == 1 && op2->type->isSigned)
2325 *value2 = op2->__anon1.c;
2326 else if(op2->kind == 24 || op2->kind == 1)
2327 *value2 = (char)op2->__anon1.uc;
2328 else if(op2->kind == 6)
2329 *value2 = (char)op2->__anon1.f;
2330 else if(op2->kind == 7)
2331 *value2 = (char)op2->__anon1.d;
2332 else if(op2->kind == 13)
2333 *value2 = (char)op2->__anon1.ui64;
2334 else
2335 return 0;
2336 return 1;
2337 }
2338
2339 unsigned int GetOpUChar(struct Operand * op2, unsigned char * value2)
2340 {
2341 if(op2->kind == 3 && op2->type->isSigned)
2342 *value2 = (unsigned char)op2->__anon1.i;
2343 else if(op2->kind == 3)
2344 *value2 = (unsigned char)op2->__anon1.ui;
2345 else if(op2->kind == 4 && op2->type->isSigned)
2346 *value2 = (unsigned char)op2->__anon1.i64;
2347 else if(op2->kind == 4)
2348 *value2 = (unsigned char)op2->__anon1.ui64;
2349 else if(op2->kind == 23 && op2->type->isSigned)
2350 *value2 = (unsigned char)op2->__anon1.i64;
2351 else if(op2->kind == 23)
2352 *value2 = (unsigned char)op2->__anon1.ui64;
2353 else if(op2->kind == 22 && op2->type->isSigned)
2354 *value2 = (unsigned char)op2->__anon1.i64;
2355 else if(op2->kind == 22)
2356 *value2 = (unsigned char)op2->__anon1.ui64;
2357 else if(op2->kind == 2 && op2->type->isSigned)
2358 *value2 = (unsigned char)op2->__anon1.s;
2359 else if(op2->kind == 2)
2360 *value2 = (unsigned char)op2->__anon1.us;
2361 else if(op2->kind == 1 && op2->type->isSigned)
2362 *value2 = (unsigned char)op2->__anon1.c;
2363 else if(op2->kind == 24 || op2->kind == 1)
2364 *value2 = op2->__anon1.uc;
2365 else if(op2->kind == 6)
2366 *value2 = (unsigned char)op2->__anon1.f;
2367 else if(op2->kind == 7)
2368 *value2 = (unsigned char)op2->__anon1.d;
2369 else if(op2->kind == 13)
2370 *value2 = (unsigned char)op2->__anon1.ui64;
2371 else
2372 return 0;
2373 return 1;
2374 }
2375
2376 unsigned int GetOpFloat(struct Operand * op2, float * value2)
2377 {
2378 if(op2->kind == 3 && op2->type->isSigned)
2379 *value2 = (float)(float)op2->__anon1.i;
2380 else if(op2->kind == 3)
2381 *value2 = (float)(float)op2->__anon1.ui;
2382 else if(op2->kind == 4 && op2->type->isSigned)
2383 *value2 = (float)(float)op2->__anon1.i64;
2384 else if(op2->kind == 4)
2385 *value2 = (float)(float)op2->__anon1.ui64;
2386 else if(op2->kind == 23 && op2->type->isSigned)
2387 *value2 = (float)(float)op2->__anon1.i64;
2388 else if(op2->kind == 23)
2389 *value2 = (float)(float)op2->__anon1.ui64;
2390 else if(op2->kind == 22 && op2->type->isSigned)
2391 *value2 = (float)(float)op2->__anon1.i64;
2392 else if(op2->kind == 22)
2393 *value2 = (float)(float)op2->__anon1.ui64;
2394 else if(op2->kind == 2 && op2->type->isSigned)
2395 *value2 = (float)(float)op2->__anon1.s;
2396 else if(op2->kind == 2)
2397 *value2 = (float)(float)op2->__anon1.us;
2398 else if(op2->kind == 1 && op2->type->isSigned)
2399 *value2 = (float)(float)op2->__anon1.c;
2400 else if(op2->kind == 24 || op2->kind == 1)
2401 *value2 = (float)(float)op2->__anon1.uc;
2402 else if(op2->kind == 6)
2403 *value2 = (float)op2->__anon1.f;
2404 else if(op2->kind == 7)
2405 *value2 = (float)op2->__anon1.d;
2406 else if(op2->kind == 13)
2407 *value2 = (float)(float)op2->__anon1.ui64;
2408 else
2409 return 0;
2410 return 1;
2411 }
2412
2413 unsigned int GetOpDouble(struct Operand * op2, double * value2)
2414 {
2415 if(op2->kind == 3 && op2->type->isSigned)
2416 *value2 = (double)(double)op2->__anon1.i;
2417 else if(op2->kind == 3)
2418 *value2 = (double)(double)op2->__anon1.ui;
2419 else if(op2->kind == 4 && op2->type->isSigned)
2420 *value2 = (double)(double)op2->__anon1.i64;
2421 else if(op2->kind == 4)
2422 *value2 = (double)(double)op2->__anon1.ui64;
2423 else if(op2->kind == 23 && op2->type->isSigned)
2424 *value2 = (double)(double)op2->__anon1.i64;
2425 else if(op2->kind == 23)
2426 *value2 = (double)(double)op2->__anon1.ui64;
2427 else if(op2->kind == 22 && op2->type->isSigned)
2428 *value2 = (double)(double)op2->__anon1.i64;
2429 else if(op2->kind == 22)
2430 *value2 = (double)(double)op2->__anon1.ui64;
2431 else if(op2->kind == 2 && op2->type->isSigned)
2432 *value2 = (double)(double)op2->__anon1.s;
2433 else if(op2->kind == 2)
2434 *value2 = (double)(double)op2->__anon1.us;
2435 else if(op2->kind == 1 && op2->type->isSigned)
2436 *value2 = (double)(double)op2->__anon1.c;
2437 else if(op2->kind == 24 || op2->kind == 1)
2438 *value2 = (double)(double)op2->__anon1.uc;
2439 else if(op2->kind == 6)
2440 *value2 = (double)op2->__anon1.f;
2441 else if(op2->kind == 7)
2442 *value2 = (double)op2->__anon1.d;
2443 else if(op2->kind == 13)
2444 *value2 = (double)(double)op2->__anon1.ui64;
2445 else
2446 return 0;
2447 return 1;
2448 }
2449
2450 static unsigned int IntAdd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2451 {
2452 int value2 = op2->__anon1.i;
2453
2454 exp->type = 2;
2455 exp->__anon1.__anon2.string = PrintInt((op1->__anon1.i + value2));
2456 if(!exp->expType)
2457 {
2458 exp->expType = op1->type;
2459 if(op1->type)
2460 op1->type->refCount++;
2461 }
2462 return 1;
2463 }
2464
2465 static unsigned int UIntAdd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2466 {
2467 unsigned int value2 = op2->__anon1.ui;
2468
2469 exp->type = 2;
2470 exp->__anon1.__anon2.string = PrintUInt((op1->__anon1.ui + value2));
2471 if(!exp->expType)
2472 {
2473 exp->expType = op1->type;
2474 if(op1->type)
2475 op1->type->refCount++;
2476 }
2477 return 1;
2478 }
2479
2480 static unsigned int Int64Add(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2481 {
2482 long long value2 = op2->__anon1.i64;
2483
2484 exp->type = 2;
2485 exp->__anon1.__anon2.string = PrintInt64((op1->__anon1.i64 + value2));
2486 if(!exp->expType)
2487 {
2488 exp->expType = op1->type;
2489 if(op1->type)
2490 op1->type->refCount++;
2491 }
2492 return 1;
2493 }
2494
2495 static unsigned int UInt64Add(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2496 {
2497 uint64 value2 = op2->__anon1.ui64;
2498
2499 exp->type = 2;
2500 exp->__anon1.__anon2.string = PrintUInt64((op1->__anon1.ui64 + value2));
2501 if(!exp->expType)
2502 {
2503 exp->expType = op1->type;
2504 if(op1->type)
2505 op1->type->refCount++;
2506 }
2507 return 1;
2508 }
2509
2510 static unsigned int ShortAdd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2511 {
2512 short value2 = op2->__anon1.s;
2513
2514 exp->type = 2;
2515 exp->__anon1.__anon2.string = PrintShort((op1->__anon1.s + value2));
2516 if(!exp->expType)
2517 {
2518 exp->expType = op1->type;
2519 if(op1->type)
2520 op1->type->refCount++;
2521 }
2522 return 1;
2523 }
2524
2525 static unsigned int UShortAdd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2526 {
2527 unsigned short value2 = op2->__anon1.us;
2528
2529 exp->type = 2;
2530 exp->__anon1.__anon2.string = PrintUShort((op1->__anon1.us + value2));
2531 if(!exp->expType)
2532 {
2533 exp->expType = op1->type;
2534 if(op1->type)
2535 op1->type->refCount++;
2536 }
2537 return 1;
2538 }
2539
2540 static unsigned int CharAdd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2541 {
2542 char value2 = op2->__anon1.c;
2543
2544 exp->type = 2;
2545 exp->__anon1.__anon2.string = PrintChar((op1->__anon1.c + value2));
2546 if(!exp->expType)
2547 {
2548 exp->expType = op1->type;
2549 if(op1->type)
2550 op1->type->refCount++;
2551 }
2552 return 1;
2553 }
2554
2555 static unsigned int UCharAdd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2556 {
2557 unsigned char value2 = op2->__anon1.uc;
2558
2559 exp->type = 2;
2560 exp->__anon1.__anon2.string = PrintUChar((op1->__anon1.uc + value2));
2561 if(!exp->expType)
2562 {
2563 exp->expType = op1->type;
2564 if(op1->type)
2565 op1->type->refCount++;
2566 }
2567 return 1;
2568 }
2569
2570 static unsigned int FloatAdd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2571 {
2572 float value2 = op2->__anon1.f;
2573
2574 exp->type = 2;
2575 exp->__anon1.__anon2.string = PrintFloat((float)(op1->__anon1.f + value2));
2576 if(!exp->expType)
2577 {
2578 exp->expType = op1->type;
2579 if(op1->type)
2580 op1->type->refCount++;
2581 }
2582 return 1;
2583 }
2584
2585 static unsigned int DoubleAdd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2586 {
2587 double value2 = op2->__anon1.d;
2588
2589 exp->type = 2;
2590 exp->__anon1.__anon2.string = PrintDouble((double)(op1->__anon1.d + value2));
2591 if(!exp->expType)
2592 {
2593 exp->expType = op1->type;
2594 if(op1->type)
2595 op1->type->refCount++;
2596 }
2597 return 1;
2598 }
2599
2600 static unsigned int IntSub(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2601 {
2602 int value2 = op2->__anon1.i;
2603
2604 exp->type = 2;
2605 exp->__anon1.__anon2.string = PrintInt((op1->__anon1.i - value2));
2606 if(!exp->expType)
2607 {
2608 exp->expType = op1->type;
2609 if(op1->type)
2610 op1->type->refCount++;
2611 }
2612 return 1;
2613 }
2614
2615 static unsigned int UIntSub(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2616 {
2617 unsigned int value2 = op2->__anon1.ui;
2618
2619 exp->type = 2;
2620 exp->__anon1.__anon2.string = PrintUInt((op1->__anon1.ui - value2));
2621 if(!exp->expType)
2622 {
2623 exp->expType = op1->type;
2624 if(op1->type)
2625 op1->type->refCount++;
2626 }
2627 return 1;
2628 }
2629
2630 static unsigned int Int64Sub(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2631 {
2632 long long value2 = op2->__anon1.i64;
2633
2634 exp->type = 2;
2635 exp->__anon1.__anon2.string = PrintInt64((op1->__anon1.i64 - value2));
2636 if(!exp->expType)
2637 {
2638 exp->expType = op1->type;
2639 if(op1->type)
2640 op1->type->refCount++;
2641 }
2642 return 1;
2643 }
2644
2645 static unsigned int UInt64Sub(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2646 {
2647 uint64 value2 = op2->__anon1.ui64;
2648
2649 exp->type = 2;
2650 exp->__anon1.__anon2.string = PrintUInt64((op1->__anon1.ui64 - value2));
2651 if(!exp->expType)
2652 {
2653 exp->expType = op1->type;
2654 if(op1->type)
2655 op1->type->refCount++;
2656 }
2657 return 1;
2658 }
2659
2660 static unsigned int ShortSub(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2661 {
2662 short value2 = op2->__anon1.s;
2663
2664 exp->type = 2;
2665 exp->__anon1.__anon2.string = PrintShort((op1->__anon1.s - value2));
2666 if(!exp->expType)
2667 {
2668 exp->expType = op1->type;
2669 if(op1->type)
2670 op1->type->refCount++;
2671 }
2672 return 1;
2673 }
2674
2675 static unsigned int UShortSub(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2676 {
2677 unsigned short value2 = op2->__anon1.us;
2678
2679 exp->type = 2;
2680 exp->__anon1.__anon2.string = PrintUShort((op1->__anon1.us - value2));
2681 if(!exp->expType)
2682 {
2683 exp->expType = op1->type;
2684 if(op1->type)
2685 op1->type->refCount++;
2686 }
2687 return 1;
2688 }
2689
2690 static unsigned int CharSub(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2691 {
2692 char value2 = op2->__anon1.c;
2693
2694 exp->type = 2;
2695 exp->__anon1.__anon2.string = PrintChar((op1->__anon1.c - value2));
2696 if(!exp->expType)
2697 {
2698 exp->expType = op1->type;
2699 if(op1->type)
2700 op1->type->refCount++;
2701 }
2702 return 1;
2703 }
2704
2705 static unsigned int UCharSub(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2706 {
2707 unsigned char value2 = op2->__anon1.uc;
2708
2709 exp->type = 2;
2710 exp->__anon1.__anon2.string = PrintUChar((op1->__anon1.uc - value2));
2711 if(!exp->expType)
2712 {
2713 exp->expType = op1->type;
2714 if(op1->type)
2715 op1->type->refCount++;
2716 }
2717 return 1;
2718 }
2719
2720 static unsigned int FloatSub(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2721 {
2722 float value2 = op2->__anon1.f;
2723
2724 exp->type = 2;
2725 exp->__anon1.__anon2.string = PrintFloat((float)(op1->__anon1.f - value2));
2726 if(!exp->expType)
2727 {
2728 exp->expType = op1->type;
2729 if(op1->type)
2730 op1->type->refCount++;
2731 }
2732 return 1;
2733 }
2734
2735 static unsigned int DoubleSub(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2736 {
2737 double value2 = op2->__anon1.d;
2738
2739 exp->type = 2;
2740 exp->__anon1.__anon2.string = PrintDouble((double)(op1->__anon1.d - value2));
2741 if(!exp->expType)
2742 {
2743 exp->expType = op1->type;
2744 if(op1->type)
2745 op1->type->refCount++;
2746 }
2747 return 1;
2748 }
2749
2750 static unsigned int IntMul(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2751 {
2752 int value2 = op2->__anon1.i;
2753
2754 exp->type = 2;
2755 exp->__anon1.__anon2.string = PrintInt((op1->__anon1.i * value2));
2756 if(!exp->expType)
2757 {
2758 exp->expType = op1->type;
2759 if(op1->type)
2760 op1->type->refCount++;
2761 }
2762 return 1;
2763 }
2764
2765 static unsigned int UIntMul(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2766 {
2767 unsigned int value2 = op2->__anon1.ui;
2768
2769 exp->type = 2;
2770 exp->__anon1.__anon2.string = PrintUInt((op1->__anon1.ui * value2));
2771 if(!exp->expType)
2772 {
2773 exp->expType = op1->type;
2774 if(op1->type)
2775 op1->type->refCount++;
2776 }
2777 return 1;
2778 }
2779
2780 static unsigned int Int64Mul(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2781 {
2782 long long value2 = op2->__anon1.i64;
2783
2784 exp->type = 2;
2785 exp->__anon1.__anon2.string = PrintInt64((op1->__anon1.i64 * value2));
2786 if(!exp->expType)
2787 {
2788 exp->expType = op1->type;
2789 if(op1->type)
2790 op1->type->refCount++;
2791 }
2792 return 1;
2793 }
2794
2795 static unsigned int UInt64Mul(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2796 {
2797 uint64 value2 = op2->__anon1.ui64;
2798
2799 exp->type = 2;
2800 exp->__anon1.__anon2.string = PrintUInt64((op1->__anon1.ui64 * value2));
2801 if(!exp->expType)
2802 {
2803 exp->expType = op1->type;
2804 if(op1->type)
2805 op1->type->refCount++;
2806 }
2807 return 1;
2808 }
2809
2810 static unsigned int ShortMul(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2811 {
2812 short value2 = op2->__anon1.s;
2813
2814 exp->type = 2;
2815 exp->__anon1.__anon2.string = PrintShort((op1->__anon1.s * value2));
2816 if(!exp->expType)
2817 {
2818 exp->expType = op1->type;
2819 if(op1->type)
2820 op1->type->refCount++;
2821 }
2822 return 1;
2823 }
2824
2825 static unsigned int UShortMul(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2826 {
2827 unsigned short value2 = op2->__anon1.us;
2828
2829 exp->type = 2;
2830 exp->__anon1.__anon2.string = PrintUShort((op1->__anon1.us * value2));
2831 if(!exp->expType)
2832 {
2833 exp->expType = op1->type;
2834 if(op1->type)
2835 op1->type->refCount++;
2836 }
2837 return 1;
2838 }
2839
2840 static unsigned int CharMul(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2841 {
2842 char value2 = op2->__anon1.c;
2843
2844 exp->type = 2;
2845 exp->__anon1.__anon2.string = PrintChar((op1->__anon1.c * value2));
2846 if(!exp->expType)
2847 {
2848 exp->expType = op1->type;
2849 if(op1->type)
2850 op1->type->refCount++;
2851 }
2852 return 1;
2853 }
2854
2855 static unsigned int UCharMul(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2856 {
2857 unsigned char value2 = op2->__anon1.uc;
2858
2859 exp->type = 2;
2860 exp->__anon1.__anon2.string = PrintUChar((op1->__anon1.uc * value2));
2861 if(!exp->expType)
2862 {
2863 exp->expType = op1->type;
2864 if(op1->type)
2865 op1->type->refCount++;
2866 }
2867 return 1;
2868 }
2869
2870 static unsigned int FloatMul(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2871 {
2872 float value2 = op2->__anon1.f;
2873
2874 exp->type = 2;
2875 exp->__anon1.__anon2.string = PrintFloat((float)(op1->__anon1.f * value2));
2876 if(!exp->expType)
2877 {
2878 exp->expType = op1->type;
2879 if(op1->type)
2880 op1->type->refCount++;
2881 }
2882 return 1;
2883 }
2884
2885 static unsigned int DoubleMul(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2886 {
2887 double value2 = op2->__anon1.d;
2888
2889 exp->type = 2;
2890 exp->__anon1.__anon2.string = PrintDouble((double)(op1->__anon1.d * value2));
2891 if(!exp->expType)
2892 {
2893 exp->expType = op1->type;
2894 if(op1->type)
2895 op1->type->refCount++;
2896 }
2897 return 1;
2898 }
2899
2900 static unsigned int IntDiv(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2901 {
2902 int value2 = op2->__anon1.i;
2903
2904 exp->type = 2;
2905 exp->__anon1.__anon2.string = PrintInt(value2 ? (op1->__anon1.i / value2) : 0);
2906 if(!exp->expType)
2907 {
2908 exp->expType = op1->type;
2909 if(op1->type)
2910 op1->type->refCount++;
2911 }
2912 return 1;
2913 }
2914
2915 static unsigned int UIntDiv(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2916 {
2917 unsigned int value2 = op2->__anon1.ui;
2918
2919 exp->type = 2;
2920 exp->__anon1.__anon2.string = PrintUInt(value2 ? (op1->__anon1.ui / value2) : 0);
2921 if(!exp->expType)
2922 {
2923 exp->expType = op1->type;
2924 if(op1->type)
2925 op1->type->refCount++;
2926 }
2927 return 1;
2928 }
2929
2930 static unsigned int Int64Div(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2931 {
2932 long long value2 = op2->__anon1.i64;
2933
2934 exp->type = 2;
2935 exp->__anon1.__anon2.string = PrintInt64(value2 ? (op1->__anon1.i64 / value2) : 0);
2936 if(!exp->expType)
2937 {
2938 exp->expType = op1->type;
2939 if(op1->type)
2940 op1->type->refCount++;
2941 }
2942 return 1;
2943 }
2944
2945 static unsigned int UInt64Div(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2946 {
2947 uint64 value2 = op2->__anon1.ui64;
2948
2949 exp->type = 2;
2950 exp->__anon1.__anon2.string = PrintUInt64(value2 ? (op1->__anon1.ui64 / value2) : 0);
2951 if(!exp->expType)
2952 {
2953 exp->expType = op1->type;
2954 if(op1->type)
2955 op1->type->refCount++;
2956 }
2957 return 1;
2958 }
2959
2960 static unsigned int ShortDiv(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2961 {
2962 short value2 = op2->__anon1.s;
2963
2964 exp->type = 2;
2965 exp->__anon1.__anon2.string = PrintShort(value2 ? (op1->__anon1.s / value2) : (short)0);
2966 if(!exp->expType)
2967 {
2968 exp->expType = op1->type;
2969 if(op1->type)
2970 op1->type->refCount++;
2971 }
2972 return 1;
2973 }
2974
2975 static unsigned int UShortDiv(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2976 {
2977 unsigned short value2 = op2->__anon1.us;
2978
2979 exp->type = 2;
2980 exp->__anon1.__anon2.string = PrintUShort(value2 ? (op1->__anon1.us / value2) : (unsigned short)0);
2981 if(!exp->expType)
2982 {
2983 exp->expType = op1->type;
2984 if(op1->type)
2985 op1->type->refCount++;
2986 }
2987 return 1;
2988 }
2989
2990 static unsigned int CharDiv(struct Expression * exp, struct Operand * op1, struct Operand * op2)
2991 {
2992 char value2 = op2->__anon1.c;
2993
2994 exp->type = 2;
2995 exp->__anon1.__anon2.string = PrintChar(value2 ? (op1->__anon1.c / value2) : (char)0);
2996 if(!exp->expType)
2997 {
2998 exp->expType = op1->type;
2999 if(op1->type)
3000 op1->type->refCount++;
3001 }
3002 return 1;
3003 }
3004
3005 static unsigned int UCharDiv(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3006 {
3007 unsigned char value2 = op2->__anon1.uc;
3008
3009 exp->type = 2;
3010 exp->__anon1.__anon2.string = PrintUChar(value2 ? (op1->__anon1.uc / value2) : (unsigned char)0);
3011 if(!exp->expType)
3012 {
3013 exp->expType = op1->type;
3014 if(op1->type)
3015 op1->type->refCount++;
3016 }
3017 return 1;
3018 }
3019
3020 static unsigned int FloatDiv(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3021 {
3022 float value2 = op2->__anon1.f;
3023
3024 exp->type = 2;
3025 exp->__anon1.__anon2.string = PrintFloat(op1->__anon1.f / value2);
3026 if(!exp->expType)
3027 {
3028 exp->expType = op1->type;
3029 if(op1->type)
3030 op1->type->refCount++;
3031 }
3032 return 1;
3033 }
3034
3035 static unsigned int DoubleDiv(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3036 {
3037 double value2 = op2->__anon1.d;
3038
3039 exp->type = 2;
3040 exp->__anon1.__anon2.string = PrintDouble(op1->__anon1.d / value2);
3041 if(!exp->expType)
3042 {
3043 exp->expType = op1->type;
3044 if(op1->type)
3045 op1->type->refCount++;
3046 }
3047 return 1;
3048 }
3049
3050 static unsigned int IntMod(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3051 {
3052 int value2 = op2->__anon1.i;
3053
3054 exp->type = 2;
3055 exp->__anon1.__anon2.string = PrintInt(value2 ? (op1->__anon1.i % value2) : 0);
3056 if(!exp->expType)
3057 {
3058 exp->expType = op1->type;
3059 if(op1->type)
3060 op1->type->refCount++;
3061 }
3062 return 1;
3063 }
3064
3065 static unsigned int UIntMod(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3066 {
3067 unsigned int value2 = op2->__anon1.ui;
3068
3069 exp->type = 2;
3070 exp->__anon1.__anon2.string = PrintUInt(value2 ? (op1->__anon1.ui % value2) : 0);
3071 if(!exp->expType)
3072 {
3073 exp->expType = op1->type;
3074 if(op1->type)
3075 op1->type->refCount++;
3076 }
3077 return 1;
3078 }
3079
3080 static unsigned int Int64Mod(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3081 {
3082 long long value2 = op2->__anon1.i64;
3083
3084 exp->type = 2;
3085 exp->__anon1.__anon2.string = PrintInt64(value2 ? (op1->__anon1.i64 % value2) : 0);
3086 if(!exp->expType)
3087 {
3088 exp->expType = op1->type;
3089 if(op1->type)
3090 op1->type->refCount++;
3091 }
3092 return 1;
3093 }
3094
3095 static unsigned int UInt64Mod(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3096 {
3097 uint64 value2 = op2->__anon1.ui64;
3098
3099 exp->type = 2;
3100 exp->__anon1.__anon2.string = PrintUInt64(value2 ? (op1->__anon1.ui64 % value2) : 0);
3101 if(!exp->expType)
3102 {
3103 exp->expType = op1->type;
3104 if(op1->type)
3105 op1->type->refCount++;
3106 }
3107 return 1;
3108 }
3109
3110 static unsigned int ShortMod(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3111 {
3112 short value2 = op2->__anon1.s;
3113
3114 exp->type = 2;
3115 exp->__anon1.__anon2.string = PrintShort(value2 ? (op1->__anon1.s % value2) : (short)0);
3116 if(!exp->expType)
3117 {
3118 exp->expType = op1->type;
3119 if(op1->type)
3120 op1->type->refCount++;
3121 }
3122 return 1;
3123 }
3124
3125 static unsigned int UShortMod(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3126 {
3127 unsigned short value2 = op2->__anon1.us;
3128
3129 exp->type = 2;
3130 exp->__anon1.__anon2.string = PrintUShort(value2 ? (op1->__anon1.us % value2) : (unsigned short)0);
3131 if(!exp->expType)
3132 {
3133 exp->expType = op1->type;
3134 if(op1->type)
3135 op1->type->refCount++;
3136 }
3137 return 1;
3138 }
3139
3140 static unsigned int CharMod(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3141 {
3142 char value2 = op2->__anon1.c;
3143
3144 exp->type = 2;
3145 exp->__anon1.__anon2.string = PrintChar(value2 ? (op1->__anon1.c % value2) : (char)0);
3146 if(!exp->expType)
3147 {
3148 exp->expType = op1->type;
3149 if(op1->type)
3150 op1->type->refCount++;
3151 }
3152 return 1;
3153 }
3154
3155 static unsigned int UCharMod(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3156 {
3157 unsigned char value2 = op2->__anon1.uc;
3158
3159 exp->type = 2;
3160 exp->__anon1.__anon2.string = PrintUChar(value2 ? (op1->__anon1.uc % value2) : (unsigned char)0);
3161 if(!exp->expType)
3162 {
3163 exp->expType = op1->type;
3164 if(op1->type)
3165 op1->type->refCount++;
3166 }
3167 return 1;
3168 }
3169
3170 static unsigned int IntNeg(struct Expression * exp, struct Operand * op1)
3171 {
3172 exp->type = 2;
3173 exp->__anon1.__anon2.string = PrintInt((-op1->__anon1.i));
3174 if(!exp->expType)
3175 {
3176 exp->expType = op1->type;
3177 if(op1->type)
3178 op1->type->refCount++;
3179 }
3180 return 1;
3181 }
3182
3183 static unsigned int UIntNeg(struct Expression * exp, struct Operand * op1)
3184 {
3185 exp->type = 2;
3186 exp->__anon1.__anon2.string = PrintUInt((unsigned int)(-op1->__anon1.ui));
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 Int64Neg(struct Expression * exp, struct Operand * op1)
3197 {
3198 exp->type = 2;
3199 exp->__anon1.__anon2.string = PrintInt64((-op1->__anon1.i64));
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 UInt64Neg(struct Expression * exp, struct Operand * op1)
3210 {
3211 exp->type = 2;
3212 exp->__anon1.__anon2.string = PrintUInt64((uint64)(-op1->__anon1.ui64));
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 ShortNeg(struct Expression * exp, struct Operand * op1)
3223 {
3224 exp->type = 2;
3225 exp->__anon1.__anon2.string = PrintShort((-op1->__anon1.s));
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 UShortNeg(struct Expression * exp, struct Operand * op1)
3236 {
3237 exp->type = 2;
3238 exp->__anon1.__anon2.string = PrintUShort((unsigned short)(-op1->__anon1.us));
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 CharNeg(struct Expression * exp, struct Operand * op1)
3249 {
3250 exp->type = 2;
3251 exp->__anon1.__anon2.string = PrintChar((-op1->__anon1.c));
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 UCharNeg(struct Expression * exp, struct Operand * op1)
3262 {
3263 exp->type = 2;
3264 exp->__anon1.__anon2.string = PrintUChar((unsigned char)(-op1->__anon1.uc));
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 FloatNeg(struct Expression * exp, struct Operand * op1)
3275 {
3276 exp->type = 2;
3277 exp->__anon1.__anon2.string = PrintFloat((float)(-op1->__anon1.f));
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 DoubleNeg(struct Expression * exp, struct Operand * op1)
3288 {
3289 exp->type = 2;
3290 exp->__anon1.__anon2.string = PrintDouble((double)(-op1->__anon1.d));
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 IntInc(struct Expression * exp, struct Operand * op1)
3301 {
3302 exp->type = 2;
3303 exp->__anon1.__anon2.string = PrintInt((++op1->__anon1.i));
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 UIntInc(struct Expression * exp, struct Operand * op1)
3314 {
3315 exp->type = 2;
3316 exp->__anon1.__anon2.string = PrintUInt((++op1->__anon1.ui));
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 Int64Inc(struct Expression * exp, struct Operand * op1)
3327 {
3328 exp->type = 2;
3329 exp->__anon1.__anon2.string = PrintInt64((++op1->__anon1.i64));
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 UInt64Inc(struct Expression * exp, struct Operand * op1)
3340 {
3341 exp->type = 2;
3342 exp->__anon1.__anon2.string = PrintUInt64((++op1->__anon1.ui64));
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 ShortInc(struct Expression * exp, struct Operand * op1)
3353 {
3354 exp->type = 2;
3355 exp->__anon1.__anon2.string = PrintShort((++op1->__anon1.s));
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 UShortInc(struct Expression * exp, struct Operand * op1)
3366 {
3367 exp->type = 2;
3368 exp->__anon1.__anon2.string = PrintUShort((++op1->__anon1.us));
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 CharInc(struct Expression * exp, struct Operand * op1)
3379 {
3380 exp->type = 2;
3381 exp->__anon1.__anon2.string = PrintChar((++op1->__anon1.c));
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 UCharInc(struct Expression * exp, struct Operand * op1)
3392 {
3393 exp->type = 2;
3394 exp->__anon1.__anon2.string = PrintUChar((++op1->__anon1.uc));
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 FloatInc(struct Expression * exp, struct Operand * op1)
3405 {
3406 exp->type = 2;
3407 exp->__anon1.__anon2.string = PrintFloat((float)(++op1->__anon1.f));
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 DoubleInc(struct Expression * exp, struct Operand * op1)
3418 {
3419 exp->type = 2;
3420 exp->__anon1.__anon2.string = PrintDouble((double)(++op1->__anon1.d));
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 IntDec(struct Expression * exp, struct Operand * op1)
3431 {
3432 exp->type = 2;
3433 exp->__anon1.__anon2.string = PrintInt((--op1->__anon1.i));
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 UIntDec(struct Expression * exp, struct Operand * op1)
3444 {
3445 exp->type = 2;
3446 exp->__anon1.__anon2.string = PrintUInt((--op1->__anon1.ui));
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 Int64Dec(struct Expression * exp, struct Operand * op1)
3457 {
3458 exp->type = 2;
3459 exp->__anon1.__anon2.string = PrintInt64((--op1->__anon1.i64));
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 UInt64Dec(struct Expression * exp, struct Operand * op1)
3470 {
3471 exp->type = 2;
3472 exp->__anon1.__anon2.string = PrintUInt64((--op1->__anon1.ui64));
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 ShortDec(struct Expression * exp, struct Operand * op1)
3483 {
3484 exp->type = 2;
3485 exp->__anon1.__anon2.string = PrintShort((--op1->__anon1.s));
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 UShortDec(struct Expression * exp, struct Operand * op1)
3496 {
3497 exp->type = 2;
3498 exp->__anon1.__anon2.string = PrintUShort((--op1->__anon1.us));
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 CharDec(struct Expression * exp, struct Operand * op1)
3509 {
3510 exp->type = 2;
3511 exp->__anon1.__anon2.string = PrintChar((--op1->__anon1.c));
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 UCharDec(struct Expression * exp, struct Operand * op1)
3522 {
3523 exp->type = 2;
3524 exp->__anon1.__anon2.string = PrintUChar((--op1->__anon1.uc));
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 FloatDec(struct Expression * exp, struct Operand * op1)
3535 {
3536 exp->type = 2;
3537 exp->__anon1.__anon2.string = PrintFloat((float)(--op1->__anon1.f));
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 DoubleDec(struct Expression * exp, struct Operand * op1)
3548 {
3549 exp->type = 2;
3550 exp->__anon1.__anon2.string = PrintDouble((double)(--op1->__anon1.d));
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 IntAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3561 {
3562 int value2 = op2->__anon1.i;
3563
3564 exp->type = 2;
3565 exp->__anon1.__anon2.string = PrintInt((op1->__anon1.i = value2));
3566 if(!exp->expType)
3567 {
3568 exp->expType = op1->type;
3569 if(op1->type)
3570 op1->type->refCount++;
3571 }
3572 return 1;
3573 }
3574
3575 static unsigned int UIntAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3576 {
3577 unsigned int value2 = op2->__anon1.ui;
3578
3579 exp->type = 2;
3580 exp->__anon1.__anon2.string = PrintUInt((op1->__anon1.ui = value2));
3581 if(!exp->expType)
3582 {
3583 exp->expType = op1->type;
3584 if(op1->type)
3585 op1->type->refCount++;
3586 }
3587 return 1;
3588 }
3589
3590 static unsigned int Int64Asign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3591 {
3592 long long value2 = op2->__anon1.i64;
3593
3594 exp->type = 2;
3595 exp->__anon1.__anon2.string = PrintInt64((op1->__anon1.i64 = value2));
3596 if(!exp->expType)
3597 {
3598 exp->expType = op1->type;
3599 if(op1->type)
3600 op1->type->refCount++;
3601 }
3602 return 1;
3603 }
3604
3605 static unsigned int UInt64Asign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3606 {
3607 uint64 value2 = op2->__anon1.ui64;
3608
3609 exp->type = 2;
3610 exp->__anon1.__anon2.string = PrintUInt64((op1->__anon1.ui64 = value2));
3611 if(!exp->expType)
3612 {
3613 exp->expType = op1->type;
3614 if(op1->type)
3615 op1->type->refCount++;
3616 }
3617 return 1;
3618 }
3619
3620 static unsigned int ShortAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3621 {
3622 short value2 = op2->__anon1.s;
3623
3624 exp->type = 2;
3625 exp->__anon1.__anon2.string = PrintShort((op1->__anon1.s = value2));
3626 if(!exp->expType)
3627 {
3628 exp->expType = op1->type;
3629 if(op1->type)
3630 op1->type->refCount++;
3631 }
3632 return 1;
3633 }
3634
3635 static unsigned int UShortAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3636 {
3637 unsigned short value2 = op2->__anon1.us;
3638
3639 exp->type = 2;
3640 exp->__anon1.__anon2.string = PrintUShort((op1->__anon1.us = value2));
3641 if(!exp->expType)
3642 {
3643 exp->expType = op1->type;
3644 if(op1->type)
3645 op1->type->refCount++;
3646 }
3647 return 1;
3648 }
3649
3650 static unsigned int CharAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3651 {
3652 char value2 = op2->__anon1.c;
3653
3654 exp->type = 2;
3655 exp->__anon1.__anon2.string = PrintChar((op1->__anon1.c = value2));
3656 if(!exp->expType)
3657 {
3658 exp->expType = op1->type;
3659 if(op1->type)
3660 op1->type->refCount++;
3661 }
3662 return 1;
3663 }
3664
3665 static unsigned int UCharAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3666 {
3667 unsigned char value2 = op2->__anon1.uc;
3668
3669 exp->type = 2;
3670 exp->__anon1.__anon2.string = PrintUChar((op1->__anon1.uc = value2));
3671 if(!exp->expType)
3672 {
3673 exp->expType = op1->type;
3674 if(op1->type)
3675 op1->type->refCount++;
3676 }
3677 return 1;
3678 }
3679
3680 static unsigned int FloatAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3681 {
3682 float value2 = op2->__anon1.f;
3683
3684 exp->type = 2;
3685 exp->__anon1.__anon2.string = PrintFloat((float)(op1->__anon1.f = value2));
3686 if(!exp->expType)
3687 {
3688 exp->expType = op1->type;
3689 if(op1->type)
3690 op1->type->refCount++;
3691 }
3692 return 1;
3693 }
3694
3695 static unsigned int DoubleAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3696 {
3697 double value2 = op2->__anon1.d;
3698
3699 exp->type = 2;
3700 exp->__anon1.__anon2.string = PrintDouble((double)(op1->__anon1.d = value2));
3701 if(!exp->expType)
3702 {
3703 exp->expType = op1->type;
3704 if(op1->type)
3705 op1->type->refCount++;
3706 }
3707 return 1;
3708 }
3709
3710 static unsigned int IntAddAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3711 {
3712 int value2 = op2->__anon1.i;
3713
3714 exp->type = 2;
3715 exp->__anon1.__anon2.string = PrintInt((op1->__anon1.i += value2));
3716 if(!exp->expType)
3717 {
3718 exp->expType = op1->type;
3719 if(op1->type)
3720 op1->type->refCount++;
3721 }
3722 return 1;
3723 }
3724
3725 static unsigned int UIntAddAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3726 {
3727 unsigned int value2 = op2->__anon1.ui;
3728
3729 exp->type = 2;
3730 exp->__anon1.__anon2.string = PrintUInt((op1->__anon1.ui += value2));
3731 if(!exp->expType)
3732 {
3733 exp->expType = op1->type;
3734 if(op1->type)
3735 op1->type->refCount++;
3736 }
3737 return 1;
3738 }
3739
3740 static unsigned int Int64AddAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3741 {
3742 long long value2 = op2->__anon1.i64;
3743
3744 exp->type = 2;
3745 exp->__anon1.__anon2.string = PrintInt64((op1->__anon1.i64 += value2));
3746 if(!exp->expType)
3747 {
3748 exp->expType = op1->type;
3749 if(op1->type)
3750 op1->type->refCount++;
3751 }
3752 return 1;
3753 }
3754
3755 static unsigned int UInt64AddAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3756 {
3757 uint64 value2 = op2->__anon1.ui64;
3758
3759 exp->type = 2;
3760 exp->__anon1.__anon2.string = PrintUInt64((op1->__anon1.ui64 += value2));
3761 if(!exp->expType)
3762 {
3763 exp->expType = op1->type;
3764 if(op1->type)
3765 op1->type->refCount++;
3766 }
3767 return 1;
3768 }
3769
3770 static unsigned int ShortAddAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3771 {
3772 short value2 = op2->__anon1.s;
3773
3774 exp->type = 2;
3775 exp->__anon1.__anon2.string = PrintShort((op1->__anon1.s += value2));
3776 if(!exp->expType)
3777 {
3778 exp->expType = op1->type;
3779 if(op1->type)
3780 op1->type->refCount++;
3781 }
3782 return 1;
3783 }
3784
3785 static unsigned int UShortAddAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3786 {
3787 unsigned short value2 = op2->__anon1.us;
3788
3789 exp->type = 2;
3790 exp->__anon1.__anon2.string = PrintUShort((op1->__anon1.us += value2));
3791 if(!exp->expType)
3792 {
3793 exp->expType = op1->type;
3794 if(op1->type)
3795 op1->type->refCount++;
3796 }
3797 return 1;
3798 }
3799
3800 static unsigned int CharAddAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3801 {
3802 char value2 = op2->__anon1.c;
3803
3804 exp->type = 2;
3805 exp->__anon1.__anon2.string = PrintChar((op1->__anon1.c += value2));
3806 if(!exp->expType)
3807 {
3808 exp->expType = op1->type;
3809 if(op1->type)
3810 op1->type->refCount++;
3811 }
3812 return 1;
3813 }
3814
3815 static unsigned int UCharAddAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3816 {
3817 unsigned char value2 = op2->__anon1.uc;
3818
3819 exp->type = 2;
3820 exp->__anon1.__anon2.string = PrintUChar((op1->__anon1.uc += value2));
3821 if(!exp->expType)
3822 {
3823 exp->expType = op1->type;
3824 if(op1->type)
3825 op1->type->refCount++;
3826 }
3827 return 1;
3828 }
3829
3830 static unsigned int FloatAddAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3831 {
3832 float value2 = op2->__anon1.f;
3833
3834 exp->type = 2;
3835 exp->__anon1.__anon2.string = PrintFloat((float)(op1->__anon1.f += value2));
3836 if(!exp->expType)
3837 {
3838 exp->expType = op1->type;
3839 if(op1->type)
3840 op1->type->refCount++;
3841 }
3842 return 1;
3843 }
3844
3845 static unsigned int DoubleAddAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3846 {
3847 double value2 = op2->__anon1.d;
3848
3849 exp->type = 2;
3850 exp->__anon1.__anon2.string = PrintDouble((double)(op1->__anon1.d += value2));
3851 if(!exp->expType)
3852 {
3853 exp->expType = op1->type;
3854 if(op1->type)
3855 op1->type->refCount++;
3856 }
3857 return 1;
3858 }
3859
3860 static unsigned int IntSubAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3861 {
3862 int value2 = op2->__anon1.i;
3863
3864 exp->type = 2;
3865 exp->__anon1.__anon2.string = PrintInt((op1->__anon1.i -= value2));
3866 if(!exp->expType)
3867 {
3868 exp->expType = op1->type;
3869 if(op1->type)
3870 op1->type->refCount++;
3871 }
3872 return 1;
3873 }
3874
3875 static unsigned int UIntSubAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3876 {
3877 unsigned int value2 = op2->__anon1.ui;
3878
3879 exp->type = 2;
3880 exp->__anon1.__anon2.string = PrintUInt((op1->__anon1.ui -= value2));
3881 if(!exp->expType)
3882 {
3883 exp->expType = op1->type;
3884 if(op1->type)
3885 op1->type->refCount++;
3886 }
3887 return 1;
3888 }
3889
3890 static unsigned int Int64SubAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3891 {
3892 long long value2 = op2->__anon1.i64;
3893
3894 exp->type = 2;
3895 exp->__anon1.__anon2.string = PrintInt64((op1->__anon1.i64 -= value2));
3896 if(!exp->expType)
3897 {
3898 exp->expType = op1->type;
3899 if(op1->type)
3900 op1->type->refCount++;
3901 }
3902 return 1;
3903 }
3904
3905 static unsigned int UInt64SubAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3906 {
3907 uint64 value2 = op2->__anon1.ui64;
3908
3909 exp->type = 2;
3910 exp->__anon1.__anon2.string = PrintUInt64((op1->__anon1.ui64 -= value2));
3911 if(!exp->expType)
3912 {
3913 exp->expType = op1->type;
3914 if(op1->type)
3915 op1->type->refCount++;
3916 }
3917 return 1;
3918 }
3919
3920 static unsigned int ShortSubAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3921 {
3922 short value2 = op2->__anon1.s;
3923
3924 exp->type = 2;
3925 exp->__anon1.__anon2.string = PrintShort((op1->__anon1.s -= value2));
3926 if(!exp->expType)
3927 {
3928 exp->expType = op1->type;
3929 if(op1->type)
3930 op1->type->refCount++;
3931 }
3932 return 1;
3933 }
3934
3935 static unsigned int UShortSubAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3936 {
3937 unsigned short value2 = op2->__anon1.us;
3938
3939 exp->type = 2;
3940 exp->__anon1.__anon2.string = PrintUShort((op1->__anon1.us -= value2));
3941 if(!exp->expType)
3942 {
3943 exp->expType = op1->type;
3944 if(op1->type)
3945 op1->type->refCount++;
3946 }
3947 return 1;
3948 }
3949
3950 static unsigned int CharSubAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3951 {
3952 char value2 = op2->__anon1.c;
3953
3954 exp->type = 2;
3955 exp->__anon1.__anon2.string = PrintChar((op1->__anon1.c -= value2));
3956 if(!exp->expType)
3957 {
3958 exp->expType = op1->type;
3959 if(op1->type)
3960 op1->type->refCount++;
3961 }
3962 return 1;
3963 }
3964
3965 static unsigned int UCharSubAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3966 {
3967 unsigned char value2 = op2->__anon1.uc;
3968
3969 exp->type = 2;
3970 exp->__anon1.__anon2.string = PrintUChar((op1->__anon1.uc -= value2));
3971 if(!exp->expType)
3972 {
3973 exp->expType = op1->type;
3974 if(op1->type)
3975 op1->type->refCount++;
3976 }
3977 return 1;
3978 }
3979
3980 static unsigned int FloatSubAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3981 {
3982 float value2 = op2->__anon1.f;
3983
3984 exp->type = 2;
3985 exp->__anon1.__anon2.string = PrintFloat((float)(op1->__anon1.f -= value2));
3986 if(!exp->expType)
3987 {
3988 exp->expType = op1->type;
3989 if(op1->type)
3990 op1->type->refCount++;
3991 }
3992 return 1;
3993 }
3994
3995 static unsigned int DoubleSubAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
3996 {
3997 double value2 = op2->__anon1.d;
3998
3999 exp->type = 2;
4000 exp->__anon1.__anon2.string = PrintDouble((double)(op1->__anon1.d -= value2));
4001 if(!exp->expType)
4002 {
4003 exp->expType = op1->type;
4004 if(op1->type)
4005 op1->type->refCount++;
4006 }
4007 return 1;
4008 }
4009
4010 static unsigned int IntMulAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4011 {
4012 int value2 = op2->__anon1.i;
4013
4014 exp->type = 2;
4015 exp->__anon1.__anon2.string = PrintInt((op1->__anon1.i *= value2));
4016 if(!exp->expType)
4017 {
4018 exp->expType = op1->type;
4019 if(op1->type)
4020 op1->type->refCount++;
4021 }
4022 return 1;
4023 }
4024
4025 static unsigned int UIntMulAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4026 {
4027 unsigned int value2 = op2->__anon1.ui;
4028
4029 exp->type = 2;
4030 exp->__anon1.__anon2.string = PrintUInt((op1->__anon1.ui *= value2));
4031 if(!exp->expType)
4032 {
4033 exp->expType = op1->type;
4034 if(op1->type)
4035 op1->type->refCount++;
4036 }
4037 return 1;
4038 }
4039
4040 static unsigned int Int64MulAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4041 {
4042 long long value2 = op2->__anon1.i64;
4043
4044 exp->type = 2;
4045 exp->__anon1.__anon2.string = PrintInt64((op1->__anon1.i64 *= value2));
4046 if(!exp->expType)
4047 {
4048 exp->expType = op1->type;
4049 if(op1->type)
4050 op1->type->refCount++;
4051 }
4052 return 1;
4053 }
4054
4055 static unsigned int UInt64MulAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4056 {
4057 uint64 value2 = op2->__anon1.ui64;
4058
4059 exp->type = 2;
4060 exp->__anon1.__anon2.string = PrintUInt64((op1->__anon1.ui64 *= value2));
4061 if(!exp->expType)
4062 {
4063 exp->expType = op1->type;
4064 if(op1->type)
4065 op1->type->refCount++;
4066 }
4067 return 1;
4068 }
4069
4070 static unsigned int ShortMulAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4071 {
4072 short value2 = op2->__anon1.s;
4073
4074 exp->type = 2;
4075 exp->__anon1.__anon2.string = PrintShort((op1->__anon1.s *= value2));
4076 if(!exp->expType)
4077 {
4078 exp->expType = op1->type;
4079 if(op1->type)
4080 op1->type->refCount++;
4081 }
4082 return 1;
4083 }
4084
4085 static unsigned int UShortMulAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4086 {
4087 unsigned short value2 = op2->__anon1.us;
4088
4089 exp->type = 2;
4090 exp->__anon1.__anon2.string = PrintUShort((op1->__anon1.us *= value2));
4091 if(!exp->expType)
4092 {
4093 exp->expType = op1->type;
4094 if(op1->type)
4095 op1->type->refCount++;
4096 }
4097 return 1;
4098 }
4099
4100 static unsigned int CharMulAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4101 {
4102 char value2 = op2->__anon1.c;
4103
4104 exp->type = 2;
4105 exp->__anon1.__anon2.string = PrintChar((op1->__anon1.c *= value2));
4106 if(!exp->expType)
4107 {
4108 exp->expType = op1->type;
4109 if(op1->type)
4110 op1->type->refCount++;
4111 }
4112 return 1;
4113 }
4114
4115 static unsigned int UCharMulAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4116 {
4117 unsigned char value2 = op2->__anon1.uc;
4118
4119 exp->type = 2;
4120 exp->__anon1.__anon2.string = PrintUChar((op1->__anon1.uc *= value2));
4121 if(!exp->expType)
4122 {
4123 exp->expType = op1->type;
4124 if(op1->type)
4125 op1->type->refCount++;
4126 }
4127 return 1;
4128 }
4129
4130 static unsigned int FloatMulAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4131 {
4132 float value2 = op2->__anon1.f;
4133
4134 exp->type = 2;
4135 exp->__anon1.__anon2.string = PrintFloat((float)(op1->__anon1.f *= value2));
4136 if(!exp->expType)
4137 {
4138 exp->expType = op1->type;
4139 if(op1->type)
4140 op1->type->refCount++;
4141 }
4142 return 1;
4143 }
4144
4145 static unsigned int DoubleMulAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4146 {
4147 double value2 = op2->__anon1.d;
4148
4149 exp->type = 2;
4150 exp->__anon1.__anon2.string = PrintDouble((double)(op1->__anon1.d *= value2));
4151 if(!exp->expType)
4152 {
4153 exp->expType = op1->type;
4154 if(op1->type)
4155 op1->type->refCount++;
4156 }
4157 return 1;
4158 }
4159
4160 static unsigned int IntDivAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4161 {
4162 int value2 = op2->__anon1.i;
4163
4164 exp->type = 2;
4165 exp->__anon1.__anon2.string = PrintInt(value2 ? (op1->__anon1.i /= value2) : 0);
4166 if(!exp->expType)
4167 {
4168 exp->expType = op1->type;
4169 if(op1->type)
4170 op1->type->refCount++;
4171 }
4172 return 1;
4173 }
4174
4175 static unsigned int UIntDivAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4176 {
4177 unsigned int value2 = op2->__anon1.ui;
4178
4179 exp->type = 2;
4180 exp->__anon1.__anon2.string = PrintUInt(value2 ? (op1->__anon1.ui /= value2) : 0);
4181 if(!exp->expType)
4182 {
4183 exp->expType = op1->type;
4184 if(op1->type)
4185 op1->type->refCount++;
4186 }
4187 return 1;
4188 }
4189
4190 static unsigned int Int64DivAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4191 {
4192 long long value2 = op2->__anon1.i64;
4193
4194 exp->type = 2;
4195 exp->__anon1.__anon2.string = PrintInt64(value2 ? (op1->__anon1.i64 /= value2) : 0);
4196 if(!exp->expType)
4197 {
4198 exp->expType = op1->type;
4199 if(op1->type)
4200 op1->type->refCount++;
4201 }
4202 return 1;
4203 }
4204
4205 static unsigned int UInt64DivAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4206 {
4207 uint64 value2 = op2->__anon1.ui64;
4208
4209 exp->type = 2;
4210 exp->__anon1.__anon2.string = PrintUInt64(value2 ? (op1->__anon1.ui64 /= value2) : 0);
4211 if(!exp->expType)
4212 {
4213 exp->expType = op1->type;
4214 if(op1->type)
4215 op1->type->refCount++;
4216 }
4217 return 1;
4218 }
4219
4220 static unsigned int ShortDivAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4221 {
4222 short value2 = op2->__anon1.s;
4223
4224 exp->type = 2;
4225 exp->__anon1.__anon2.string = PrintShort(value2 ? (op1->__anon1.s /= value2) : (short)0);
4226 if(!exp->expType)
4227 {
4228 exp->expType = op1->type;
4229 if(op1->type)
4230 op1->type->refCount++;
4231 }
4232 return 1;
4233 }
4234
4235 static unsigned int UShortDivAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4236 {
4237 unsigned short value2 = op2->__anon1.us;
4238
4239 exp->type = 2;
4240 exp->__anon1.__anon2.string = PrintUShort(value2 ? (op1->__anon1.us /= value2) : (unsigned short)0);
4241 if(!exp->expType)
4242 {
4243 exp->expType = op1->type;
4244 if(op1->type)
4245 op1->type->refCount++;
4246 }
4247 return 1;
4248 }
4249
4250 static unsigned int CharDivAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4251 {
4252 char value2 = op2->__anon1.c;
4253
4254 exp->type = 2;
4255 exp->__anon1.__anon2.string = PrintChar(value2 ? (op1->__anon1.c /= value2) : (char)0);
4256 if(!exp->expType)
4257 {
4258 exp->expType = op1->type;
4259 if(op1->type)
4260 op1->type->refCount++;
4261 }
4262 return 1;
4263 }
4264
4265 static unsigned int UCharDivAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4266 {
4267 unsigned char value2 = op2->__anon1.uc;
4268
4269 exp->type = 2;
4270 exp->__anon1.__anon2.string = PrintUChar(value2 ? (op1->__anon1.uc /= value2) : (unsigned char)0);
4271 if(!exp->expType)
4272 {
4273 exp->expType = op1->type;
4274 if(op1->type)
4275 op1->type->refCount++;
4276 }
4277 return 1;
4278 }
4279
4280 static unsigned int FloatDivAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4281 {
4282 float value2 = op2->__anon1.f;
4283
4284 exp->type = 2;
4285 exp->__anon1.__anon2.string = PrintFloat(op1->__anon1.f /= value2);
4286 if(!exp->expType)
4287 {
4288 exp->expType = op1->type;
4289 if(op1->type)
4290 op1->type->refCount++;
4291 }
4292 return 1;
4293 }
4294
4295 static unsigned int DoubleDivAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4296 {
4297 double value2 = op2->__anon1.d;
4298
4299 exp->type = 2;
4300 exp->__anon1.__anon2.string = PrintDouble(op1->__anon1.d /= value2);
4301 if(!exp->expType)
4302 {
4303 exp->expType = op1->type;
4304 if(op1->type)
4305 op1->type->refCount++;
4306 }
4307 return 1;
4308 }
4309
4310 static unsigned int IntModAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4311 {
4312 int value2 = op2->__anon1.i;
4313
4314 exp->type = 2;
4315 exp->__anon1.__anon2.string = PrintInt(value2 ? (op1->__anon1.i %= value2) : 0);
4316 if(!exp->expType)
4317 {
4318 exp->expType = op1->type;
4319 if(op1->type)
4320 op1->type->refCount++;
4321 }
4322 return 1;
4323 }
4324
4325 static unsigned int UIntModAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4326 {
4327 unsigned int value2 = op2->__anon1.ui;
4328
4329 exp->type = 2;
4330 exp->__anon1.__anon2.string = PrintUInt(value2 ? (op1->__anon1.ui %= value2) : 0);
4331 if(!exp->expType)
4332 {
4333 exp->expType = op1->type;
4334 if(op1->type)
4335 op1->type->refCount++;
4336 }
4337 return 1;
4338 }
4339
4340 static unsigned int Int64ModAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4341 {
4342 long long value2 = op2->__anon1.i64;
4343
4344 exp->type = 2;
4345 exp->__anon1.__anon2.string = PrintInt64(value2 ? (op1->__anon1.i64 %= value2) : 0);
4346 if(!exp->expType)
4347 {
4348 exp->expType = op1->type;
4349 if(op1->type)
4350 op1->type->refCount++;
4351 }
4352 return 1;
4353 }
4354
4355 static unsigned int UInt64ModAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4356 {
4357 uint64 value2 = op2->__anon1.ui64;
4358
4359 exp->type = 2;
4360 exp->__anon1.__anon2.string = PrintUInt64(value2 ? (op1->__anon1.ui64 %= value2) : 0);
4361 if(!exp->expType)
4362 {
4363 exp->expType = op1->type;
4364 if(op1->type)
4365 op1->type->refCount++;
4366 }
4367 return 1;
4368 }
4369
4370 static unsigned int ShortModAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4371 {
4372 short value2 = op2->__anon1.s;
4373
4374 exp->type = 2;
4375 exp->__anon1.__anon2.string = PrintShort(value2 ? (op1->__anon1.s %= value2) : (short)0);
4376 if(!exp->expType)
4377 {
4378 exp->expType = op1->type;
4379 if(op1->type)
4380 op1->type->refCount++;
4381 }
4382 return 1;
4383 }
4384
4385 static unsigned int UShortModAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4386 {
4387 unsigned short value2 = op2->__anon1.us;
4388
4389 exp->type = 2;
4390 exp->__anon1.__anon2.string = PrintUShort(value2 ? (op1->__anon1.us %= value2) : (unsigned short)0);
4391 if(!exp->expType)
4392 {
4393 exp->expType = op1->type;
4394 if(op1->type)
4395 op1->type->refCount++;
4396 }
4397 return 1;
4398 }
4399
4400 static unsigned int CharModAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4401 {
4402 char value2 = op2->__anon1.c;
4403
4404 exp->type = 2;
4405 exp->__anon1.__anon2.string = PrintChar(value2 ? (op1->__anon1.c %= value2) : (char)0);
4406 if(!exp->expType)
4407 {
4408 exp->expType = op1->type;
4409 if(op1->type)
4410 op1->type->refCount++;
4411 }
4412 return 1;
4413 }
4414
4415 static unsigned int UCharModAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4416 {
4417 unsigned char value2 = op2->__anon1.uc;
4418
4419 exp->type = 2;
4420 exp->__anon1.__anon2.string = PrintUChar(value2 ? (op1->__anon1.uc %= value2) : (unsigned char)0);
4421 if(!exp->expType)
4422 {
4423 exp->expType = op1->type;
4424 if(op1->type)
4425 op1->type->refCount++;
4426 }
4427 return 1;
4428 }
4429
4430 static unsigned int IntBitAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4431 {
4432 int value2 = op2->__anon1.i;
4433
4434 exp->type = 2;
4435 exp->__anon1.__anon2.string = PrintInt((op1->__anon1.i & value2));
4436 if(!exp->expType)
4437 {
4438 exp->expType = op1->type;
4439 if(op1->type)
4440 op1->type->refCount++;
4441 }
4442 return 1;
4443 }
4444
4445 static unsigned int UIntBitAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4446 {
4447 unsigned int value2 = op2->__anon1.ui;
4448
4449 exp->type = 2;
4450 exp->__anon1.__anon2.string = PrintUInt((op1->__anon1.ui & value2));
4451 if(!exp->expType)
4452 {
4453 exp->expType = op1->type;
4454 if(op1->type)
4455 op1->type->refCount++;
4456 }
4457 return 1;
4458 }
4459
4460 static unsigned int Int64BitAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4461 {
4462 long long value2 = op2->__anon1.i64;
4463
4464 exp->type = 2;
4465 exp->__anon1.__anon2.string = PrintInt64((op1->__anon1.i64 & value2));
4466 if(!exp->expType)
4467 {
4468 exp->expType = op1->type;
4469 if(op1->type)
4470 op1->type->refCount++;
4471 }
4472 return 1;
4473 }
4474
4475 static unsigned int UInt64BitAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4476 {
4477 uint64 value2 = op2->__anon1.ui64;
4478
4479 exp->type = 2;
4480 exp->__anon1.__anon2.string = PrintUInt64((op1->__anon1.ui64 & value2));
4481 if(!exp->expType)
4482 {
4483 exp->expType = op1->type;
4484 if(op1->type)
4485 op1->type->refCount++;
4486 }
4487 return 1;
4488 }
4489
4490 static unsigned int ShortBitAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4491 {
4492 short value2 = op2->__anon1.s;
4493
4494 exp->type = 2;
4495 exp->__anon1.__anon2.string = PrintShort((op1->__anon1.s & value2));
4496 if(!exp->expType)
4497 {
4498 exp->expType = op1->type;
4499 if(op1->type)
4500 op1->type->refCount++;
4501 }
4502 return 1;
4503 }
4504
4505 static unsigned int UShortBitAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4506 {
4507 unsigned short value2 = op2->__anon1.us;
4508
4509 exp->type = 2;
4510 exp->__anon1.__anon2.string = PrintUShort((op1->__anon1.us & value2));
4511 if(!exp->expType)
4512 {
4513 exp->expType = op1->type;
4514 if(op1->type)
4515 op1->type->refCount++;
4516 }
4517 return 1;
4518 }
4519
4520 static unsigned int CharBitAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4521 {
4522 char value2 = op2->__anon1.c;
4523
4524 exp->type = 2;
4525 exp->__anon1.__anon2.string = PrintChar((op1->__anon1.c & value2));
4526 if(!exp->expType)
4527 {
4528 exp->expType = op1->type;
4529 if(op1->type)
4530 op1->type->refCount++;
4531 }
4532 return 1;
4533 }
4534
4535 static unsigned int UCharBitAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4536 {
4537 unsigned char value2 = op2->__anon1.uc;
4538
4539 exp->type = 2;
4540 exp->__anon1.__anon2.string = PrintUChar((op1->__anon1.uc & value2));
4541 if(!exp->expType)
4542 {
4543 exp->expType = op1->type;
4544 if(op1->type)
4545 op1->type->refCount++;
4546 }
4547 return 1;
4548 }
4549
4550 static unsigned int IntBitOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4551 {
4552 int value2 = op2->__anon1.i;
4553
4554 exp->type = 2;
4555 exp->__anon1.__anon2.string = PrintInt((op1->__anon1.i | value2));
4556 if(!exp->expType)
4557 {
4558 exp->expType = op1->type;
4559 if(op1->type)
4560 op1->type->refCount++;
4561 }
4562 return 1;
4563 }
4564
4565 static unsigned int UIntBitOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4566 {
4567 unsigned int value2 = op2->__anon1.ui;
4568
4569 exp->type = 2;
4570 exp->__anon1.__anon2.string = PrintUInt((op1->__anon1.ui | value2));
4571 if(!exp->expType)
4572 {
4573 exp->expType = op1->type;
4574 if(op1->type)
4575 op1->type->refCount++;
4576 }
4577 return 1;
4578 }
4579
4580 static unsigned int Int64BitOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4581 {
4582 long long value2 = op2->__anon1.i64;
4583
4584 exp->type = 2;
4585 exp->__anon1.__anon2.string = PrintInt64((op1->__anon1.i64 | value2));
4586 if(!exp->expType)
4587 {
4588 exp->expType = op1->type;
4589 if(op1->type)
4590 op1->type->refCount++;
4591 }
4592 return 1;
4593 }
4594
4595 static unsigned int UInt64BitOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4596 {
4597 uint64 value2 = op2->__anon1.ui64;
4598
4599 exp->type = 2;
4600 exp->__anon1.__anon2.string = PrintUInt64((op1->__anon1.ui64 | value2));
4601 if(!exp->expType)
4602 {
4603 exp->expType = op1->type;
4604 if(op1->type)
4605 op1->type->refCount++;
4606 }
4607 return 1;
4608 }
4609
4610 static unsigned int ShortBitOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4611 {
4612 short value2 = op2->__anon1.s;
4613
4614 exp->type = 2;
4615 exp->__anon1.__anon2.string = PrintShort((op1->__anon1.s | value2));
4616 if(!exp->expType)
4617 {
4618 exp->expType = op1->type;
4619 if(op1->type)
4620 op1->type->refCount++;
4621 }
4622 return 1;
4623 }
4624
4625 static unsigned int UShortBitOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4626 {
4627 unsigned short value2 = op2->__anon1.us;
4628
4629 exp->type = 2;
4630 exp->__anon1.__anon2.string = PrintUShort((op1->__anon1.us | value2));
4631 if(!exp->expType)
4632 {
4633 exp->expType = op1->type;
4634 if(op1->type)
4635 op1->type->refCount++;
4636 }
4637 return 1;
4638 }
4639
4640 static unsigned int CharBitOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4641 {
4642 char value2 = op2->__anon1.c;
4643
4644 exp->type = 2;
4645 exp->__anon1.__anon2.string = PrintChar((op1->__anon1.c | value2));
4646 if(!exp->expType)
4647 {
4648 exp->expType = op1->type;
4649 if(op1->type)
4650 op1->type->refCount++;
4651 }
4652 return 1;
4653 }
4654
4655 static unsigned int UCharBitOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4656 {
4657 unsigned char value2 = op2->__anon1.uc;
4658
4659 exp->type = 2;
4660 exp->__anon1.__anon2.string = PrintUChar((op1->__anon1.uc | value2));
4661 if(!exp->expType)
4662 {
4663 exp->expType = op1->type;
4664 if(op1->type)
4665 op1->type->refCount++;
4666 }
4667 return 1;
4668 }
4669
4670 static unsigned int IntBitXor(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4671 {
4672 int value2 = op2->__anon1.i;
4673
4674 exp->type = 2;
4675 exp->__anon1.__anon2.string = PrintInt((op1->__anon1.i ^ value2));
4676 if(!exp->expType)
4677 {
4678 exp->expType = op1->type;
4679 if(op1->type)
4680 op1->type->refCount++;
4681 }
4682 return 1;
4683 }
4684
4685 static unsigned int UIntBitXor(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4686 {
4687 unsigned int value2 = op2->__anon1.ui;
4688
4689 exp->type = 2;
4690 exp->__anon1.__anon2.string = PrintUInt((op1->__anon1.ui ^ value2));
4691 if(!exp->expType)
4692 {
4693 exp->expType = op1->type;
4694 if(op1->type)
4695 op1->type->refCount++;
4696 }
4697 return 1;
4698 }
4699
4700 static unsigned int Int64BitXor(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4701 {
4702 long long value2 = op2->__anon1.i64;
4703
4704 exp->type = 2;
4705 exp->__anon1.__anon2.string = PrintInt64((op1->__anon1.i64 ^ value2));
4706 if(!exp->expType)
4707 {
4708 exp->expType = op1->type;
4709 if(op1->type)
4710 op1->type->refCount++;
4711 }
4712 return 1;
4713 }
4714
4715 static unsigned int UInt64BitXor(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4716 {
4717 uint64 value2 = op2->__anon1.ui64;
4718
4719 exp->type = 2;
4720 exp->__anon1.__anon2.string = PrintUInt64((op1->__anon1.ui64 ^ value2));
4721 if(!exp->expType)
4722 {
4723 exp->expType = op1->type;
4724 if(op1->type)
4725 op1->type->refCount++;
4726 }
4727 return 1;
4728 }
4729
4730 static unsigned int ShortBitXor(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4731 {
4732 short value2 = op2->__anon1.s;
4733
4734 exp->type = 2;
4735 exp->__anon1.__anon2.string = PrintShort((op1->__anon1.s ^ value2));
4736 if(!exp->expType)
4737 {
4738 exp->expType = op1->type;
4739 if(op1->type)
4740 op1->type->refCount++;
4741 }
4742 return 1;
4743 }
4744
4745 static unsigned int UShortBitXor(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4746 {
4747 unsigned short value2 = op2->__anon1.us;
4748
4749 exp->type = 2;
4750 exp->__anon1.__anon2.string = PrintUShort((op1->__anon1.us ^ value2));
4751 if(!exp->expType)
4752 {
4753 exp->expType = op1->type;
4754 if(op1->type)
4755 op1->type->refCount++;
4756 }
4757 return 1;
4758 }
4759
4760 static unsigned int CharBitXor(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4761 {
4762 char value2 = op2->__anon1.c;
4763
4764 exp->type = 2;
4765 exp->__anon1.__anon2.string = PrintChar((op1->__anon1.c ^ value2));
4766 if(!exp->expType)
4767 {
4768 exp->expType = op1->type;
4769 if(op1->type)
4770 op1->type->refCount++;
4771 }
4772 return 1;
4773 }
4774
4775 static unsigned int UCharBitXor(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4776 {
4777 unsigned char value2 = op2->__anon1.uc;
4778
4779 exp->type = 2;
4780 exp->__anon1.__anon2.string = PrintUChar((op1->__anon1.uc ^ value2));
4781 if(!exp->expType)
4782 {
4783 exp->expType = op1->type;
4784 if(op1->type)
4785 op1->type->refCount++;
4786 }
4787 return 1;
4788 }
4789
4790 static unsigned int IntLShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4791 {
4792 int value2 = op2->__anon1.i;
4793
4794 exp->type = 2;
4795 exp->__anon1.__anon2.string = PrintInt((op1->__anon1.i << value2));
4796 if(!exp->expType)
4797 {
4798 exp->expType = op1->type;
4799 if(op1->type)
4800 op1->type->refCount++;
4801 }
4802 return 1;
4803 }
4804
4805 static unsigned int UIntLShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4806 {
4807 unsigned int value2 = op2->__anon1.ui;
4808
4809 exp->type = 2;
4810 exp->__anon1.__anon2.string = PrintUInt((op1->__anon1.ui << value2));
4811 if(!exp->expType)
4812 {
4813 exp->expType = op1->type;
4814 if(op1->type)
4815 op1->type->refCount++;
4816 }
4817 return 1;
4818 }
4819
4820 static unsigned int Int64LShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4821 {
4822 long long value2 = op2->__anon1.i64;
4823
4824 exp->type = 2;
4825 exp->__anon1.__anon2.string = PrintInt64((op1->__anon1.i64 << value2));
4826 if(!exp->expType)
4827 {
4828 exp->expType = op1->type;
4829 if(op1->type)
4830 op1->type->refCount++;
4831 }
4832 return 1;
4833 }
4834
4835 static unsigned int UInt64LShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4836 {
4837 uint64 value2 = op2->__anon1.ui64;
4838
4839 exp->type = 2;
4840 exp->__anon1.__anon2.string = PrintUInt64((op1->__anon1.ui64 << value2));
4841 if(!exp->expType)
4842 {
4843 exp->expType = op1->type;
4844 if(op1->type)
4845 op1->type->refCount++;
4846 }
4847 return 1;
4848 }
4849
4850 static unsigned int ShortLShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4851 {
4852 short value2 = op2->__anon1.s;
4853
4854 exp->type = 2;
4855 exp->__anon1.__anon2.string = PrintShort((op1->__anon1.s << value2));
4856 if(!exp->expType)
4857 {
4858 exp->expType = op1->type;
4859 if(op1->type)
4860 op1->type->refCount++;
4861 }
4862 return 1;
4863 }
4864
4865 static unsigned int UShortLShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4866 {
4867 unsigned short value2 = op2->__anon1.us;
4868
4869 exp->type = 2;
4870 exp->__anon1.__anon2.string = PrintUShort((op1->__anon1.us << value2));
4871 if(!exp->expType)
4872 {
4873 exp->expType = op1->type;
4874 if(op1->type)
4875 op1->type->refCount++;
4876 }
4877 return 1;
4878 }
4879
4880 static unsigned int CharLShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4881 {
4882 char value2 = op2->__anon1.c;
4883
4884 exp->type = 2;
4885 exp->__anon1.__anon2.string = PrintChar((op1->__anon1.c << value2));
4886 if(!exp->expType)
4887 {
4888 exp->expType = op1->type;
4889 if(op1->type)
4890 op1->type->refCount++;
4891 }
4892 return 1;
4893 }
4894
4895 static unsigned int UCharLShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4896 {
4897 unsigned char value2 = op2->__anon1.uc;
4898
4899 exp->type = 2;
4900 exp->__anon1.__anon2.string = PrintUChar((op1->__anon1.uc << value2));
4901 if(!exp->expType)
4902 {
4903 exp->expType = op1->type;
4904 if(op1->type)
4905 op1->type->refCount++;
4906 }
4907 return 1;
4908 }
4909
4910 static unsigned int IntRShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4911 {
4912 int value2 = op2->__anon1.i;
4913
4914 exp->type = 2;
4915 exp->__anon1.__anon2.string = PrintInt((op1->__anon1.i >> value2));
4916 if(!exp->expType)
4917 {
4918 exp->expType = op1->type;
4919 if(op1->type)
4920 op1->type->refCount++;
4921 }
4922 return 1;
4923 }
4924
4925 static unsigned int UIntRShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4926 {
4927 unsigned int value2 = op2->__anon1.ui;
4928
4929 exp->type = 2;
4930 exp->__anon1.__anon2.string = PrintUInt((op1->__anon1.ui >> value2));
4931 if(!exp->expType)
4932 {
4933 exp->expType = op1->type;
4934 if(op1->type)
4935 op1->type->refCount++;
4936 }
4937 return 1;
4938 }
4939
4940 static unsigned int Int64RShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4941 {
4942 long long value2 = op2->__anon1.i64;
4943
4944 exp->type = 2;
4945 exp->__anon1.__anon2.string = PrintInt64((op1->__anon1.i64 >> value2));
4946 if(!exp->expType)
4947 {
4948 exp->expType = op1->type;
4949 if(op1->type)
4950 op1->type->refCount++;
4951 }
4952 return 1;
4953 }
4954
4955 static unsigned int UInt64RShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4956 {
4957 uint64 value2 = op2->__anon1.ui64;
4958
4959 exp->type = 2;
4960 exp->__anon1.__anon2.string = PrintUInt64((op1->__anon1.ui64 >> value2));
4961 if(!exp->expType)
4962 {
4963 exp->expType = op1->type;
4964 if(op1->type)
4965 op1->type->refCount++;
4966 }
4967 return 1;
4968 }
4969
4970 static unsigned int ShortRShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4971 {
4972 short value2 = op2->__anon1.s;
4973
4974 exp->type = 2;
4975 exp->__anon1.__anon2.string = PrintShort((op1->__anon1.s >> value2));
4976 if(!exp->expType)
4977 {
4978 exp->expType = op1->type;
4979 if(op1->type)
4980 op1->type->refCount++;
4981 }
4982 return 1;
4983 }
4984
4985 static unsigned int UShortRShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
4986 {
4987 unsigned short value2 = op2->__anon1.us;
4988
4989 exp->type = 2;
4990 exp->__anon1.__anon2.string = PrintUShort((op1->__anon1.us >> value2));
4991 if(!exp->expType)
4992 {
4993 exp->expType = op1->type;
4994 if(op1->type)
4995 op1->type->refCount++;
4996 }
4997 return 1;
4998 }
4999
5000 static unsigned int CharRShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5001 {
5002 char value2 = op2->__anon1.c;
5003
5004 exp->type = 2;
5005 exp->__anon1.__anon2.string = PrintChar((op1->__anon1.c >> value2));
5006 if(!exp->expType)
5007 {
5008 exp->expType = op1->type;
5009 if(op1->type)
5010 op1->type->refCount++;
5011 }
5012 return 1;
5013 }
5014
5015 static unsigned int UCharRShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5016 {
5017 unsigned char value2 = op2->__anon1.uc;
5018
5019 exp->type = 2;
5020 exp->__anon1.__anon2.string = PrintUChar((op1->__anon1.uc >> value2));
5021 if(!exp->expType)
5022 {
5023 exp->expType = op1->type;
5024 if(op1->type)
5025 op1->type->refCount++;
5026 }
5027 return 1;
5028 }
5029
5030 static unsigned int IntBitNot(struct Expression * exp, struct Operand * op1)
5031 {
5032 exp->type = 2;
5033 exp->__anon1.__anon2.string = PrintInt((~op1->__anon1.i));
5034 if(!exp->expType)
5035 {
5036 exp->expType = op1->type;
5037 if(op1->type)
5038 op1->type->refCount++;
5039 }
5040 return 1;
5041 }
5042
5043 static unsigned int UIntBitNot(struct Expression * exp, struct Operand * op1)
5044 {
5045 exp->type = 2;
5046 exp->__anon1.__anon2.string = PrintUInt((unsigned int)(~op1->__anon1.ui));
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 Int64BitNot(struct Expression * exp, struct Operand * op1)
5057 {
5058 exp->type = 2;
5059 exp->__anon1.__anon2.string = PrintInt64((long long)(~op1->__anon1.i64));
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 UInt64BitNot(struct Expression * exp, struct Operand * op1)
5070 {
5071 exp->type = 2;
5072 exp->__anon1.__anon2.string = PrintUInt64((uint64)(~op1->__anon1.ui64));
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 ShortBitNot(struct Expression * exp, struct Operand * op1)
5083 {
5084 exp->type = 2;
5085 exp->__anon1.__anon2.string = PrintShort((short)(~op1->__anon1.s));
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 UShortBitNot(struct Expression * exp, struct Operand * op1)
5096 {
5097 exp->type = 2;
5098 exp->__anon1.__anon2.string = PrintUShort((unsigned short)(~op1->__anon1.us));
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 CharBitNot(struct Expression * exp, struct Operand * op1)
5109 {
5110 exp->type = 2;
5111 exp->__anon1.__anon2.string = PrintChar((char)(~op1->__anon1.c));
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 UCharBitNot(struct Expression * exp, struct Operand * op1)
5122 {
5123 exp->type = 2;
5124 exp->__anon1.__anon2.string = PrintUChar((unsigned char)(~op1->__anon1.uc));
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 IntAndAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5135 {
5136 int value2 = op2->__anon1.i;
5137
5138 exp->type = 2;
5139 exp->__anon1.__anon2.string = PrintInt((op1->__anon1.i &= value2));
5140 if(!exp->expType)
5141 {
5142 exp->expType = op1->type;
5143 if(op1->type)
5144 op1->type->refCount++;
5145 }
5146 return 1;
5147 }
5148
5149 static unsigned int UIntAndAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5150 {
5151 unsigned int value2 = op2->__anon1.ui;
5152
5153 exp->type = 2;
5154 exp->__anon1.__anon2.string = PrintUInt((op1->__anon1.ui &= value2));
5155 if(!exp->expType)
5156 {
5157 exp->expType = op1->type;
5158 if(op1->type)
5159 op1->type->refCount++;
5160 }
5161 return 1;
5162 }
5163
5164 static unsigned int Int64AndAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5165 {
5166 long long value2 = op2->__anon1.i64;
5167
5168 exp->type = 2;
5169 exp->__anon1.__anon2.string = PrintInt64((op1->__anon1.i64 &= value2));
5170 if(!exp->expType)
5171 {
5172 exp->expType = op1->type;
5173 if(op1->type)
5174 op1->type->refCount++;
5175 }
5176 return 1;
5177 }
5178
5179 static unsigned int UInt64AndAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5180 {
5181 uint64 value2 = op2->__anon1.ui64;
5182
5183 exp->type = 2;
5184 exp->__anon1.__anon2.string = PrintUInt64((op1->__anon1.ui64 &= value2));
5185 if(!exp->expType)
5186 {
5187 exp->expType = op1->type;
5188 if(op1->type)
5189 op1->type->refCount++;
5190 }
5191 return 1;
5192 }
5193
5194 static unsigned int ShortAndAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5195 {
5196 short value2 = op2->__anon1.s;
5197
5198 exp->type = 2;
5199 exp->__anon1.__anon2.string = PrintShort((op1->__anon1.s &= value2));
5200 if(!exp->expType)
5201 {
5202 exp->expType = op1->type;
5203 if(op1->type)
5204 op1->type->refCount++;
5205 }
5206 return 1;
5207 }
5208
5209 static unsigned int UShortAndAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5210 {
5211 unsigned short value2 = op2->__anon1.us;
5212
5213 exp->type = 2;
5214 exp->__anon1.__anon2.string = PrintUShort((op1->__anon1.us &= value2));
5215 if(!exp->expType)
5216 {
5217 exp->expType = op1->type;
5218 if(op1->type)
5219 op1->type->refCount++;
5220 }
5221 return 1;
5222 }
5223
5224 static unsigned int CharAndAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5225 {
5226 char value2 = op2->__anon1.c;
5227
5228 exp->type = 2;
5229 exp->__anon1.__anon2.string = PrintChar((op1->__anon1.c &= value2));
5230 if(!exp->expType)
5231 {
5232 exp->expType = op1->type;
5233 if(op1->type)
5234 op1->type->refCount++;
5235 }
5236 return 1;
5237 }
5238
5239 static unsigned int UCharAndAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5240 {
5241 unsigned char value2 = op2->__anon1.uc;
5242
5243 exp->type = 2;
5244 exp->__anon1.__anon2.string = PrintUChar((op1->__anon1.uc &= value2));
5245 if(!exp->expType)
5246 {
5247 exp->expType = op1->type;
5248 if(op1->type)
5249 op1->type->refCount++;
5250 }
5251 return 1;
5252 }
5253
5254 static unsigned int IntOrAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5255 {
5256 int value2 = op2->__anon1.i;
5257
5258 exp->type = 2;
5259 exp->__anon1.__anon2.string = PrintInt((op1->__anon1.i |= value2));
5260 if(!exp->expType)
5261 {
5262 exp->expType = op1->type;
5263 if(op1->type)
5264 op1->type->refCount++;
5265 }
5266 return 1;
5267 }
5268
5269 static unsigned int UIntOrAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5270 {
5271 unsigned int value2 = op2->__anon1.ui;
5272
5273 exp->type = 2;
5274 exp->__anon1.__anon2.string = PrintUInt((op1->__anon1.ui |= value2));
5275 if(!exp->expType)
5276 {
5277 exp->expType = op1->type;
5278 if(op1->type)
5279 op1->type->refCount++;
5280 }
5281 return 1;
5282 }
5283
5284 static unsigned int Int64OrAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5285 {
5286 long long value2 = op2->__anon1.i64;
5287
5288 exp->type = 2;
5289 exp->__anon1.__anon2.string = PrintInt64((op1->__anon1.i64 |= value2));
5290 if(!exp->expType)
5291 {
5292 exp->expType = op1->type;
5293 if(op1->type)
5294 op1->type->refCount++;
5295 }
5296 return 1;
5297 }
5298
5299 static unsigned int UInt64OrAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5300 {
5301 uint64 value2 = op2->__anon1.ui64;
5302
5303 exp->type = 2;
5304 exp->__anon1.__anon2.string = PrintUInt64((op1->__anon1.ui64 |= value2));
5305 if(!exp->expType)
5306 {
5307 exp->expType = op1->type;
5308 if(op1->type)
5309 op1->type->refCount++;
5310 }
5311 return 1;
5312 }
5313
5314 static unsigned int ShortOrAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5315 {
5316 short value2 = op2->__anon1.s;
5317
5318 exp->type = 2;
5319 exp->__anon1.__anon2.string = PrintShort((op1->__anon1.s |= value2));
5320 if(!exp->expType)
5321 {
5322 exp->expType = op1->type;
5323 if(op1->type)
5324 op1->type->refCount++;
5325 }
5326 return 1;
5327 }
5328
5329 static unsigned int UShortOrAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5330 {
5331 unsigned short value2 = op2->__anon1.us;
5332
5333 exp->type = 2;
5334 exp->__anon1.__anon2.string = PrintUShort((op1->__anon1.us |= value2));
5335 if(!exp->expType)
5336 {
5337 exp->expType = op1->type;
5338 if(op1->type)
5339 op1->type->refCount++;
5340 }
5341 return 1;
5342 }
5343
5344 static unsigned int CharOrAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5345 {
5346 char value2 = op2->__anon1.c;
5347
5348 exp->type = 2;
5349 exp->__anon1.__anon2.string = PrintChar((op1->__anon1.c |= value2));
5350 if(!exp->expType)
5351 {
5352 exp->expType = op1->type;
5353 if(op1->type)
5354 op1->type->refCount++;
5355 }
5356 return 1;
5357 }
5358
5359 static unsigned int UCharOrAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5360 {
5361 unsigned char value2 = op2->__anon1.uc;
5362
5363 exp->type = 2;
5364 exp->__anon1.__anon2.string = PrintUChar((op1->__anon1.uc |= value2));
5365 if(!exp->expType)
5366 {
5367 exp->expType = op1->type;
5368 if(op1->type)
5369 op1->type->refCount++;
5370 }
5371 return 1;
5372 }
5373
5374 static unsigned int IntXorAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5375 {
5376 int value2 = op2->__anon1.i;
5377
5378 exp->type = 2;
5379 exp->__anon1.__anon2.string = PrintInt((op1->__anon1.i ^= value2));
5380 if(!exp->expType)
5381 {
5382 exp->expType = op1->type;
5383 if(op1->type)
5384 op1->type->refCount++;
5385 }
5386 return 1;
5387 }
5388
5389 static unsigned int UIntXorAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5390 {
5391 unsigned int value2 = op2->__anon1.ui;
5392
5393 exp->type = 2;
5394 exp->__anon1.__anon2.string = PrintUInt((op1->__anon1.ui ^= value2));
5395 if(!exp->expType)
5396 {
5397 exp->expType = op1->type;
5398 if(op1->type)
5399 op1->type->refCount++;
5400 }
5401 return 1;
5402 }
5403
5404 static unsigned int Int64XorAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5405 {
5406 long long value2 = op2->__anon1.i64;
5407
5408 exp->type = 2;
5409 exp->__anon1.__anon2.string = PrintInt64((op1->__anon1.i64 ^= value2));
5410 if(!exp->expType)
5411 {
5412 exp->expType = op1->type;
5413 if(op1->type)
5414 op1->type->refCount++;
5415 }
5416 return 1;
5417 }
5418
5419 static unsigned int UInt64XorAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5420 {
5421 uint64 value2 = op2->__anon1.ui64;
5422
5423 exp->type = 2;
5424 exp->__anon1.__anon2.string = PrintUInt64((op1->__anon1.ui64 ^= value2));
5425 if(!exp->expType)
5426 {
5427 exp->expType = op1->type;
5428 if(op1->type)
5429 op1->type->refCount++;
5430 }
5431 return 1;
5432 }
5433
5434 static unsigned int ShortXorAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5435 {
5436 short value2 = op2->__anon1.s;
5437
5438 exp->type = 2;
5439 exp->__anon1.__anon2.string = PrintShort((op1->__anon1.s ^= value2));
5440 if(!exp->expType)
5441 {
5442 exp->expType = op1->type;
5443 if(op1->type)
5444 op1->type->refCount++;
5445 }
5446 return 1;
5447 }
5448
5449 static unsigned int UShortXorAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5450 {
5451 unsigned short value2 = op2->__anon1.us;
5452
5453 exp->type = 2;
5454 exp->__anon1.__anon2.string = PrintUShort((op1->__anon1.us ^= value2));
5455 if(!exp->expType)
5456 {
5457 exp->expType = op1->type;
5458 if(op1->type)
5459 op1->type->refCount++;
5460 }
5461 return 1;
5462 }
5463
5464 static unsigned int CharXorAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5465 {
5466 char value2 = op2->__anon1.c;
5467
5468 exp->type = 2;
5469 exp->__anon1.__anon2.string = PrintChar((op1->__anon1.c ^= value2));
5470 if(!exp->expType)
5471 {
5472 exp->expType = op1->type;
5473 if(op1->type)
5474 op1->type->refCount++;
5475 }
5476 return 1;
5477 }
5478
5479 static unsigned int UCharXorAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5480 {
5481 unsigned char value2 = op2->__anon1.uc;
5482
5483 exp->type = 2;
5484 exp->__anon1.__anon2.string = PrintUChar((op1->__anon1.uc ^= value2));
5485 if(!exp->expType)
5486 {
5487 exp->expType = op1->type;
5488 if(op1->type)
5489 op1->type->refCount++;
5490 }
5491 return 1;
5492 }
5493
5494 static unsigned int IntLShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5495 {
5496 int value2 = op2->__anon1.i;
5497
5498 exp->type = 2;
5499 exp->__anon1.__anon2.string = PrintInt((op1->__anon1.i <<= value2));
5500 if(!exp->expType)
5501 {
5502 exp->expType = op1->type;
5503 if(op1->type)
5504 op1->type->refCount++;
5505 }
5506 return 1;
5507 }
5508
5509 static unsigned int UIntLShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5510 {
5511 unsigned int value2 = op2->__anon1.ui;
5512
5513 exp->type = 2;
5514 exp->__anon1.__anon2.string = PrintUInt((op1->__anon1.ui <<= value2));
5515 if(!exp->expType)
5516 {
5517 exp->expType = op1->type;
5518 if(op1->type)
5519 op1->type->refCount++;
5520 }
5521 return 1;
5522 }
5523
5524 static unsigned int Int64LShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5525 {
5526 long long value2 = op2->__anon1.i64;
5527
5528 exp->type = 2;
5529 exp->__anon1.__anon2.string = PrintInt64((op1->__anon1.i64 <<= value2));
5530 if(!exp->expType)
5531 {
5532 exp->expType = op1->type;
5533 if(op1->type)
5534 op1->type->refCount++;
5535 }
5536 return 1;
5537 }
5538
5539 static unsigned int UInt64LShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5540 {
5541 uint64 value2 = op2->__anon1.ui64;
5542
5543 exp->type = 2;
5544 exp->__anon1.__anon2.string = PrintUInt64((op1->__anon1.ui64 <<= value2));
5545 if(!exp->expType)
5546 {
5547 exp->expType = op1->type;
5548 if(op1->type)
5549 op1->type->refCount++;
5550 }
5551 return 1;
5552 }
5553
5554 static unsigned int ShortLShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5555 {
5556 short value2 = op2->__anon1.s;
5557
5558 exp->type = 2;
5559 exp->__anon1.__anon2.string = PrintShort((op1->__anon1.s <<= value2));
5560 if(!exp->expType)
5561 {
5562 exp->expType = op1->type;
5563 if(op1->type)
5564 op1->type->refCount++;
5565 }
5566 return 1;
5567 }
5568
5569 static unsigned int UShortLShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5570 {
5571 unsigned short value2 = op2->__anon1.us;
5572
5573 exp->type = 2;
5574 exp->__anon1.__anon2.string = PrintUShort((op1->__anon1.us <<= value2));
5575 if(!exp->expType)
5576 {
5577 exp->expType = op1->type;
5578 if(op1->type)
5579 op1->type->refCount++;
5580 }
5581 return 1;
5582 }
5583
5584 static unsigned int CharLShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5585 {
5586 char value2 = op2->__anon1.c;
5587
5588 exp->type = 2;
5589 exp->__anon1.__anon2.string = PrintChar((op1->__anon1.c <<= value2));
5590 if(!exp->expType)
5591 {
5592 exp->expType = op1->type;
5593 if(op1->type)
5594 op1->type->refCount++;
5595 }
5596 return 1;
5597 }
5598
5599 static unsigned int UCharLShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5600 {
5601 unsigned char value2 = op2->__anon1.uc;
5602
5603 exp->type = 2;
5604 exp->__anon1.__anon2.string = PrintUChar((op1->__anon1.uc <<= value2));
5605 if(!exp->expType)
5606 {
5607 exp->expType = op1->type;
5608 if(op1->type)
5609 op1->type->refCount++;
5610 }
5611 return 1;
5612 }
5613
5614 static unsigned int IntRShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5615 {
5616 int value2 = op2->__anon1.i;
5617
5618 exp->type = 2;
5619 exp->__anon1.__anon2.string = PrintInt((op1->__anon1.i >>= value2));
5620 if(!exp->expType)
5621 {
5622 exp->expType = op1->type;
5623 if(op1->type)
5624 op1->type->refCount++;
5625 }
5626 return 1;
5627 }
5628
5629 static unsigned int UIntRShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5630 {
5631 unsigned int value2 = op2->__anon1.ui;
5632
5633 exp->type = 2;
5634 exp->__anon1.__anon2.string = PrintUInt((op1->__anon1.ui >>= value2));
5635 if(!exp->expType)
5636 {
5637 exp->expType = op1->type;
5638 if(op1->type)
5639 op1->type->refCount++;
5640 }
5641 return 1;
5642 }
5643
5644 static unsigned int Int64RShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5645 {
5646 long long value2 = op2->__anon1.i64;
5647
5648 exp->type = 2;
5649 exp->__anon1.__anon2.string = PrintInt64((op1->__anon1.i64 >>= value2));
5650 if(!exp->expType)
5651 {
5652 exp->expType = op1->type;
5653 if(op1->type)
5654 op1->type->refCount++;
5655 }
5656 return 1;
5657 }
5658
5659 static unsigned int UInt64RShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5660 {
5661 uint64 value2 = op2->__anon1.ui64;
5662
5663 exp->type = 2;
5664 exp->__anon1.__anon2.string = PrintUInt64((op1->__anon1.ui64 >>= value2));
5665 if(!exp->expType)
5666 {
5667 exp->expType = op1->type;
5668 if(op1->type)
5669 op1->type->refCount++;
5670 }
5671 return 1;
5672 }
5673
5674 static unsigned int ShortRShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5675 {
5676 short value2 = op2->__anon1.s;
5677
5678 exp->type = 2;
5679 exp->__anon1.__anon2.string = PrintShort((op1->__anon1.s >>= value2));
5680 if(!exp->expType)
5681 {
5682 exp->expType = op1->type;
5683 if(op1->type)
5684 op1->type->refCount++;
5685 }
5686 return 1;
5687 }
5688
5689 static unsigned int UShortRShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5690 {
5691 unsigned short value2 = op2->__anon1.us;
5692
5693 exp->type = 2;
5694 exp->__anon1.__anon2.string = PrintUShort((op1->__anon1.us >>= value2));
5695 if(!exp->expType)
5696 {
5697 exp->expType = op1->type;
5698 if(op1->type)
5699 op1->type->refCount++;
5700 }
5701 return 1;
5702 }
5703
5704 static unsigned int CharRShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5705 {
5706 char value2 = op2->__anon1.c;
5707
5708 exp->type = 2;
5709 exp->__anon1.__anon2.string = PrintChar((op1->__anon1.c >>= value2));
5710 if(!exp->expType)
5711 {
5712 exp->expType = op1->type;
5713 if(op1->type)
5714 op1->type->refCount++;
5715 }
5716 return 1;
5717 }
5718
5719 static unsigned int UCharRShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5720 {
5721 unsigned char value2 = op2->__anon1.uc;
5722
5723 exp->type = 2;
5724 exp->__anon1.__anon2.string = PrintUChar((op1->__anon1.uc >>= value2));
5725 if(!exp->expType)
5726 {
5727 exp->expType = op1->type;
5728 if(op1->type)
5729 op1->type->refCount++;
5730 }
5731 return 1;
5732 }
5733
5734 static unsigned int IntNot(struct Expression * exp, struct Operand * op1)
5735 {
5736 exp->type = 2;
5737 exp->__anon1.__anon2.string = PrintInt((int)(!op1->__anon1.i));
5738 if(!exp->expType)
5739 {
5740 exp->expType = op1->type;
5741 if(op1->type)
5742 op1->type->refCount++;
5743 }
5744 return 1;
5745 }
5746
5747 static unsigned int UIntNot(struct Expression * exp, struct Operand * op1)
5748 {
5749 exp->type = 2;
5750 exp->__anon1.__anon2.string = PrintUInt((unsigned int)(!op1->__anon1.ui));
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 Int64Not(struct Expression * exp, struct Operand * op1)
5761 {
5762 exp->type = 2;
5763 exp->__anon1.__anon2.string = PrintInt64((long long)(!op1->__anon1.i64));
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 UInt64Not(struct Expression * exp, struct Operand * op1)
5774 {
5775 exp->type = 2;
5776 exp->__anon1.__anon2.string = PrintUInt64((uint64)(!op1->__anon1.ui64));
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 ShortNot(struct Expression * exp, struct Operand * op1)
5787 {
5788 exp->type = 2;
5789 exp->__anon1.__anon2.string = PrintShort((short)(!op1->__anon1.s));
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 UShortNot(struct Expression * exp, struct Operand * op1)
5800 {
5801 exp->type = 2;
5802 exp->__anon1.__anon2.string = PrintUShort((unsigned short)(!op1->__anon1.us));
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 CharNot(struct Expression * exp, struct Operand * op1)
5813 {
5814 exp->type = 2;
5815 exp->__anon1.__anon2.string = PrintChar((char)(!op1->__anon1.c));
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 UCharNot(struct Expression * exp, struct Operand * op1)
5826 {
5827 exp->type = 2;
5828 exp->__anon1.__anon2.string = PrintUChar((unsigned char)(!op1->__anon1.uc));
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 IntEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5839 {
5840 int value2 = op2->__anon1.i;
5841
5842 exp->type = 2;
5843 exp->__anon1.__anon2.string = PrintInt((int)(op1->__anon1.i == value2));
5844 if(!exp->expType)
5845 {
5846 exp->expType = op1->type;
5847 if(op1->type)
5848 op1->type->refCount++;
5849 }
5850 return 1;
5851 }
5852
5853 static unsigned int UIntEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5854 {
5855 unsigned int value2 = op2->__anon1.ui;
5856
5857 exp->type = 2;
5858 exp->__anon1.__anon2.string = PrintUInt((unsigned int)(op1->__anon1.ui == value2));
5859 if(!exp->expType)
5860 {
5861 exp->expType = op1->type;
5862 if(op1->type)
5863 op1->type->refCount++;
5864 }
5865 return 1;
5866 }
5867
5868 static unsigned int Int64Equ(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5869 {
5870 long long value2 = op2->__anon1.i64;
5871
5872 exp->type = 2;
5873 exp->__anon1.__anon2.string = PrintInt64((long long)(op1->__anon1.i64 == value2));
5874 if(!exp->expType)
5875 {
5876 exp->expType = op1->type;
5877 if(op1->type)
5878 op1->type->refCount++;
5879 }
5880 return 1;
5881 }
5882
5883 static unsigned int UInt64Equ(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5884 {
5885 uint64 value2 = op2->__anon1.ui64;
5886
5887 exp->type = 2;
5888 exp->__anon1.__anon2.string = PrintUInt64((uint64)(op1->__anon1.ui64 == value2));
5889 if(!exp->expType)
5890 {
5891 exp->expType = op1->type;
5892 if(op1->type)
5893 op1->type->refCount++;
5894 }
5895 return 1;
5896 }
5897
5898 static unsigned int ShortEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5899 {
5900 short value2 = op2->__anon1.s;
5901
5902 exp->type = 2;
5903 exp->__anon1.__anon2.string = PrintShort((short)(op1->__anon1.s == value2));
5904 if(!exp->expType)
5905 {
5906 exp->expType = op1->type;
5907 if(op1->type)
5908 op1->type->refCount++;
5909 }
5910 return 1;
5911 }
5912
5913 static unsigned int UShortEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5914 {
5915 unsigned short value2 = op2->__anon1.us;
5916
5917 exp->type = 2;
5918 exp->__anon1.__anon2.string = PrintUShort((unsigned short)(op1->__anon1.us == value2));
5919 if(!exp->expType)
5920 {
5921 exp->expType = op1->type;
5922 if(op1->type)
5923 op1->type->refCount++;
5924 }
5925 return 1;
5926 }
5927
5928 static unsigned int CharEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5929 {
5930 char value2 = op2->__anon1.c;
5931
5932 exp->type = 2;
5933 exp->__anon1.__anon2.string = PrintChar((char)(op1->__anon1.c == value2));
5934 if(!exp->expType)
5935 {
5936 exp->expType = op1->type;
5937 if(op1->type)
5938 op1->type->refCount++;
5939 }
5940 return 1;
5941 }
5942
5943 static unsigned int UCharEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5944 {
5945 unsigned char value2 = op2->__anon1.uc;
5946
5947 exp->type = 2;
5948 exp->__anon1.__anon2.string = PrintUChar((unsigned char)(op1->__anon1.uc == value2));
5949 if(!exp->expType)
5950 {
5951 exp->expType = op1->type;
5952 if(op1->type)
5953 op1->type->refCount++;
5954 }
5955 return 1;
5956 }
5957
5958 static unsigned int FloatEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5959 {
5960 float value2 = op2->__anon1.f;
5961
5962 exp->type = 2;
5963 exp->__anon1.__anon2.string = PrintFloat((float)(op1->__anon1.f == value2));
5964 if(!exp->expType)
5965 {
5966 exp->expType = op1->type;
5967 if(op1->type)
5968 op1->type->refCount++;
5969 }
5970 return 1;
5971 }
5972
5973 static unsigned int DoubleEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5974 {
5975 double value2 = op2->__anon1.d;
5976
5977 exp->type = 2;
5978 exp->__anon1.__anon2.string = PrintDouble((double)(op1->__anon1.d == value2));
5979 if(!exp->expType)
5980 {
5981 exp->expType = op1->type;
5982 if(op1->type)
5983 op1->type->refCount++;
5984 }
5985 return 1;
5986 }
5987
5988 static unsigned int IntNqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
5989 {
5990 int value2 = op2->__anon1.i;
5991
5992 exp->type = 2;
5993 exp->__anon1.__anon2.string = PrintInt((int)(op1->__anon1.i != value2));
5994 if(!exp->expType)
5995 {
5996 exp->expType = op1->type;
5997 if(op1->type)
5998 op1->type->refCount++;
5999 }
6000 return 1;
6001 }
6002
6003 static unsigned int UIntNqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6004 {
6005 unsigned int value2 = op2->__anon1.ui;
6006
6007 exp->type = 2;
6008 exp->__anon1.__anon2.string = PrintUInt((unsigned int)(op1->__anon1.ui != value2));
6009 if(!exp->expType)
6010 {
6011 exp->expType = op1->type;
6012 if(op1->type)
6013 op1->type->refCount++;
6014 }
6015 return 1;
6016 }
6017
6018 static unsigned int Int64Nqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6019 {
6020 long long value2 = op2->__anon1.i64;
6021
6022 exp->type = 2;
6023 exp->__anon1.__anon2.string = PrintInt64((long long)(op1->__anon1.i64 != value2));
6024 if(!exp->expType)
6025 {
6026 exp->expType = op1->type;
6027 if(op1->type)
6028 op1->type->refCount++;
6029 }
6030 return 1;
6031 }
6032
6033 static unsigned int UInt64Nqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6034 {
6035 uint64 value2 = op2->__anon1.ui64;
6036
6037 exp->type = 2;
6038 exp->__anon1.__anon2.string = PrintUInt64((uint64)(op1->__anon1.ui64 != value2));
6039 if(!exp->expType)
6040 {
6041 exp->expType = op1->type;
6042 if(op1->type)
6043 op1->type->refCount++;
6044 }
6045 return 1;
6046 }
6047
6048 static unsigned int ShortNqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6049 {
6050 short value2 = op2->__anon1.s;
6051
6052 exp->type = 2;
6053 exp->__anon1.__anon2.string = PrintShort((short)(op1->__anon1.s != value2));
6054 if(!exp->expType)
6055 {
6056 exp->expType = op1->type;
6057 if(op1->type)
6058 op1->type->refCount++;
6059 }
6060 return 1;
6061 }
6062
6063 static unsigned int UShortNqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6064 {
6065 unsigned short value2 = op2->__anon1.us;
6066
6067 exp->type = 2;
6068 exp->__anon1.__anon2.string = PrintUShort((unsigned short)(op1->__anon1.us != value2));
6069 if(!exp->expType)
6070 {
6071 exp->expType = op1->type;
6072 if(op1->type)
6073 op1->type->refCount++;
6074 }
6075 return 1;
6076 }
6077
6078 static unsigned int CharNqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6079 {
6080 char value2 = op2->__anon1.c;
6081
6082 exp->type = 2;
6083 exp->__anon1.__anon2.string = PrintChar((char)(op1->__anon1.c != value2));
6084 if(!exp->expType)
6085 {
6086 exp->expType = op1->type;
6087 if(op1->type)
6088 op1->type->refCount++;
6089 }
6090 return 1;
6091 }
6092
6093 static unsigned int UCharNqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6094 {
6095 unsigned char value2 = op2->__anon1.uc;
6096
6097 exp->type = 2;
6098 exp->__anon1.__anon2.string = PrintUChar((unsigned char)(op1->__anon1.uc != value2));
6099 if(!exp->expType)
6100 {
6101 exp->expType = op1->type;
6102 if(op1->type)
6103 op1->type->refCount++;
6104 }
6105 return 1;
6106 }
6107
6108 static unsigned int FloatNqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6109 {
6110 float value2 = op2->__anon1.f;
6111
6112 exp->type = 2;
6113 exp->__anon1.__anon2.string = PrintFloat((float)(op1->__anon1.f != value2));
6114 if(!exp->expType)
6115 {
6116 exp->expType = op1->type;
6117 if(op1->type)
6118 op1->type->refCount++;
6119 }
6120 return 1;
6121 }
6122
6123 static unsigned int DoubleNqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6124 {
6125 double value2 = op2->__anon1.d;
6126
6127 exp->type = 2;
6128 exp->__anon1.__anon2.string = PrintDouble((double)(op1->__anon1.d != value2));
6129 if(!exp->expType)
6130 {
6131 exp->expType = op1->type;
6132 if(op1->type)
6133 op1->type->refCount++;
6134 }
6135 return 1;
6136 }
6137
6138 static unsigned int IntAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6139 {
6140 int value2 = op2->__anon1.i;
6141
6142 exp->type = 2;
6143 exp->__anon1.__anon2.string = PrintInt((int)(op1->__anon1.i && value2));
6144 if(!exp->expType)
6145 {
6146 exp->expType = op1->type;
6147 if(op1->type)
6148 op1->type->refCount++;
6149 }
6150 return 1;
6151 }
6152
6153 static unsigned int UIntAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6154 {
6155 unsigned int value2 = op2->__anon1.ui;
6156
6157 exp->type = 2;
6158 exp->__anon1.__anon2.string = PrintUInt((unsigned int)(op1->__anon1.ui && value2));
6159 if(!exp->expType)
6160 {
6161 exp->expType = op1->type;
6162 if(op1->type)
6163 op1->type->refCount++;
6164 }
6165 return 1;
6166 }
6167
6168 static unsigned int Int64And(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6169 {
6170 long long value2 = op2->__anon1.i64;
6171
6172 exp->type = 2;
6173 exp->__anon1.__anon2.string = PrintInt64((long long)(op1->__anon1.i64 && value2));
6174 if(!exp->expType)
6175 {
6176 exp->expType = op1->type;
6177 if(op1->type)
6178 op1->type->refCount++;
6179 }
6180 return 1;
6181 }
6182
6183 static unsigned int UInt64And(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6184 {
6185 uint64 value2 = op2->__anon1.ui64;
6186
6187 exp->type = 2;
6188 exp->__anon1.__anon2.string = PrintUInt64((uint64)(op1->__anon1.ui64 && value2));
6189 if(!exp->expType)
6190 {
6191 exp->expType = op1->type;
6192 if(op1->type)
6193 op1->type->refCount++;
6194 }
6195 return 1;
6196 }
6197
6198 static unsigned int ShortAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6199 {
6200 short value2 = op2->__anon1.s;
6201
6202 exp->type = 2;
6203 exp->__anon1.__anon2.string = PrintShort((short)(op1->__anon1.s && value2));
6204 if(!exp->expType)
6205 {
6206 exp->expType = op1->type;
6207 if(op1->type)
6208 op1->type->refCount++;
6209 }
6210 return 1;
6211 }
6212
6213 static unsigned int UShortAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6214 {
6215 unsigned short value2 = op2->__anon1.us;
6216
6217 exp->type = 2;
6218 exp->__anon1.__anon2.string = PrintUShort((unsigned short)(op1->__anon1.us && value2));
6219 if(!exp->expType)
6220 {
6221 exp->expType = op1->type;
6222 if(op1->type)
6223 op1->type->refCount++;
6224 }
6225 return 1;
6226 }
6227
6228 static unsigned int CharAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6229 {
6230 char value2 = op2->__anon1.c;
6231
6232 exp->type = 2;
6233 exp->__anon1.__anon2.string = PrintChar((char)(op1->__anon1.c && value2));
6234 if(!exp->expType)
6235 {
6236 exp->expType = op1->type;
6237 if(op1->type)
6238 op1->type->refCount++;
6239 }
6240 return 1;
6241 }
6242
6243 static unsigned int UCharAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6244 {
6245 unsigned char value2 = op2->__anon1.uc;
6246
6247 exp->type = 2;
6248 exp->__anon1.__anon2.string = PrintUChar((unsigned char)(op1->__anon1.uc && value2));
6249 if(!exp->expType)
6250 {
6251 exp->expType = op1->type;
6252 if(op1->type)
6253 op1->type->refCount++;
6254 }
6255 return 1;
6256 }
6257
6258 static unsigned int FloatAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6259 {
6260 float value2 = op2->__anon1.f;
6261
6262 exp->type = 2;
6263 exp->__anon1.__anon2.string = PrintFloat((float)(op1->__anon1.f && value2));
6264 if(!exp->expType)
6265 {
6266 exp->expType = op1->type;
6267 if(op1->type)
6268 op1->type->refCount++;
6269 }
6270 return 1;
6271 }
6272
6273 static unsigned int DoubleAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6274 {
6275 double value2 = op2->__anon1.d;
6276
6277 exp->type = 2;
6278 exp->__anon1.__anon2.string = PrintDouble((double)(op1->__anon1.d && value2));
6279 if(!exp->expType)
6280 {
6281 exp->expType = op1->type;
6282 if(op1->type)
6283 op1->type->refCount++;
6284 }
6285 return 1;
6286 }
6287
6288 static unsigned int IntOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6289 {
6290 int value2 = op2->__anon1.i;
6291
6292 exp->type = 2;
6293 exp->__anon1.__anon2.string = PrintInt((int)(op1->__anon1.i || value2));
6294 if(!exp->expType)
6295 {
6296 exp->expType = op1->type;
6297 if(op1->type)
6298 op1->type->refCount++;
6299 }
6300 return 1;
6301 }
6302
6303 static unsigned int UIntOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6304 {
6305 unsigned int value2 = op2->__anon1.ui;
6306
6307 exp->type = 2;
6308 exp->__anon1.__anon2.string = PrintUInt((unsigned int)(op1->__anon1.ui || value2));
6309 if(!exp->expType)
6310 {
6311 exp->expType = op1->type;
6312 if(op1->type)
6313 op1->type->refCount++;
6314 }
6315 return 1;
6316 }
6317
6318 static unsigned int Int64Or(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6319 {
6320 long long value2 = op2->__anon1.i64;
6321
6322 exp->type = 2;
6323 exp->__anon1.__anon2.string = PrintInt64((long long)(op1->__anon1.i64 || value2));
6324 if(!exp->expType)
6325 {
6326 exp->expType = op1->type;
6327 if(op1->type)
6328 op1->type->refCount++;
6329 }
6330 return 1;
6331 }
6332
6333 static unsigned int UInt64Or(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6334 {
6335 uint64 value2 = op2->__anon1.ui64;
6336
6337 exp->type = 2;
6338 exp->__anon1.__anon2.string = PrintUInt64((uint64)(op1->__anon1.ui64 || value2));
6339 if(!exp->expType)
6340 {
6341 exp->expType = op1->type;
6342 if(op1->type)
6343 op1->type->refCount++;
6344 }
6345 return 1;
6346 }
6347
6348 static unsigned int ShortOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6349 {
6350 short value2 = op2->__anon1.s;
6351
6352 exp->type = 2;
6353 exp->__anon1.__anon2.string = PrintShort((short)(op1->__anon1.s || value2));
6354 if(!exp->expType)
6355 {
6356 exp->expType = op1->type;
6357 if(op1->type)
6358 op1->type->refCount++;
6359 }
6360 return 1;
6361 }
6362
6363 static unsigned int UShortOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6364 {
6365 unsigned short value2 = op2->__anon1.us;
6366
6367 exp->type = 2;
6368 exp->__anon1.__anon2.string = PrintUShort((unsigned short)(op1->__anon1.us || value2));
6369 if(!exp->expType)
6370 {
6371 exp->expType = op1->type;
6372 if(op1->type)
6373 op1->type->refCount++;
6374 }
6375 return 1;
6376 }
6377
6378 static unsigned int CharOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6379 {
6380 char value2 = op2->__anon1.c;
6381
6382 exp->type = 2;
6383 exp->__anon1.__anon2.string = PrintChar((char)(op1->__anon1.c || value2));
6384 if(!exp->expType)
6385 {
6386 exp->expType = op1->type;
6387 if(op1->type)
6388 op1->type->refCount++;
6389 }
6390 return 1;
6391 }
6392
6393 static unsigned int UCharOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6394 {
6395 unsigned char value2 = op2->__anon1.uc;
6396
6397 exp->type = 2;
6398 exp->__anon1.__anon2.string = PrintUChar((unsigned char)(op1->__anon1.uc || value2));
6399 if(!exp->expType)
6400 {
6401 exp->expType = op1->type;
6402 if(op1->type)
6403 op1->type->refCount++;
6404 }
6405 return 1;
6406 }
6407
6408 static unsigned int FloatOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6409 {
6410 float value2 = op2->__anon1.f;
6411
6412 exp->type = 2;
6413 exp->__anon1.__anon2.string = PrintFloat((float)(op1->__anon1.f || value2));
6414 if(!exp->expType)
6415 {
6416 exp->expType = op1->type;
6417 if(op1->type)
6418 op1->type->refCount++;
6419 }
6420 return 1;
6421 }
6422
6423 static unsigned int DoubleOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6424 {
6425 double value2 = op2->__anon1.d;
6426
6427 exp->type = 2;
6428 exp->__anon1.__anon2.string = PrintDouble((double)(op1->__anon1.d || value2));
6429 if(!exp->expType)
6430 {
6431 exp->expType = op1->type;
6432 if(op1->type)
6433 op1->type->refCount++;
6434 }
6435 return 1;
6436 }
6437
6438 static unsigned int IntGrt(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6439 {
6440 int value2 = op2->__anon1.i;
6441
6442 exp->type = 2;
6443 exp->__anon1.__anon2.string = PrintInt((int)(op1->__anon1.i > value2));
6444 if(!exp->expType)
6445 {
6446 exp->expType = op1->type;
6447 if(op1->type)
6448 op1->type->refCount++;
6449 }
6450 return 1;
6451 }
6452
6453 static unsigned int UIntGrt(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6454 {
6455 unsigned int value2 = op2->__anon1.ui;
6456
6457 exp->type = 2;
6458 exp->__anon1.__anon2.string = PrintUInt((unsigned int)(op1->__anon1.ui > value2));
6459 if(!exp->expType)
6460 {
6461 exp->expType = op1->type;
6462 if(op1->type)
6463 op1->type->refCount++;
6464 }
6465 return 1;
6466 }
6467
6468 static unsigned int Int64Grt(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6469 {
6470 long long value2 = op2->__anon1.i64;
6471
6472 exp->type = 2;
6473 exp->__anon1.__anon2.string = PrintInt64((long long)(op1->__anon1.i64 > value2));
6474 if(!exp->expType)
6475 {
6476 exp->expType = op1->type;
6477 if(op1->type)
6478 op1->type->refCount++;
6479 }
6480 return 1;
6481 }
6482
6483 static unsigned int UInt64Grt(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6484 {
6485 uint64 value2 = op2->__anon1.ui64;
6486
6487 exp->type = 2;
6488 exp->__anon1.__anon2.string = PrintUInt64((uint64)(op1->__anon1.ui64 > value2));
6489 if(!exp->expType)
6490 {
6491 exp->expType = op1->type;
6492 if(op1->type)
6493 op1->type->refCount++;
6494 }
6495 return 1;
6496 }
6497
6498 static unsigned int ShortGrt(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6499 {
6500 short value2 = op2->__anon1.s;
6501
6502 exp->type = 2;
6503 exp->__anon1.__anon2.string = PrintShort((short)(op1->__anon1.s > value2));
6504 if(!exp->expType)
6505 {
6506 exp->expType = op1->type;
6507 if(op1->type)
6508 op1->type->refCount++;
6509 }
6510 return 1;
6511 }
6512
6513 static unsigned int UShortGrt(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6514 {
6515 unsigned short value2 = op2->__anon1.us;
6516
6517 exp->type = 2;
6518 exp->__anon1.__anon2.string = PrintUShort((unsigned short)(op1->__anon1.us > value2));
6519 if(!exp->expType)
6520 {
6521 exp->expType = op1->type;
6522 if(op1->type)
6523 op1->type->refCount++;
6524 }
6525 return 1;
6526 }
6527
6528 static unsigned int CharGrt(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6529 {
6530 char value2 = op2->__anon1.c;
6531
6532 exp->type = 2;
6533 exp->__anon1.__anon2.string = PrintChar((char)(op1->__anon1.c > value2));
6534 if(!exp->expType)
6535 {
6536 exp->expType = op1->type;
6537 if(op1->type)
6538 op1->type->refCount++;
6539 }
6540 return 1;
6541 }
6542
6543 static unsigned int UCharGrt(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6544 {
6545 unsigned char value2 = op2->__anon1.uc;
6546
6547 exp->type = 2;
6548 exp->__anon1.__anon2.string = PrintUChar((unsigned char)(op1->__anon1.uc > value2));
6549 if(!exp->expType)
6550 {
6551 exp->expType = op1->type;
6552 if(op1->type)
6553 op1->type->refCount++;
6554 }
6555 return 1;
6556 }
6557
6558 static unsigned int FloatGrt(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6559 {
6560 float value2 = op2->__anon1.f;
6561
6562 exp->type = 2;
6563 exp->__anon1.__anon2.string = PrintFloat((float)(op1->__anon1.f > value2));
6564 if(!exp->expType)
6565 {
6566 exp->expType = op1->type;
6567 if(op1->type)
6568 op1->type->refCount++;
6569 }
6570 return 1;
6571 }
6572
6573 static unsigned int DoubleGrt(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6574 {
6575 double value2 = op2->__anon1.d;
6576
6577 exp->type = 2;
6578 exp->__anon1.__anon2.string = PrintDouble((double)(op1->__anon1.d > value2));
6579 if(!exp->expType)
6580 {
6581 exp->expType = op1->type;
6582 if(op1->type)
6583 op1->type->refCount++;
6584 }
6585 return 1;
6586 }
6587
6588 static unsigned int IntSma(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6589 {
6590 int value2 = op2->__anon1.i;
6591
6592 exp->type = 2;
6593 exp->__anon1.__anon2.string = PrintInt((int)(op1->__anon1.i < value2));
6594 if(!exp->expType)
6595 {
6596 exp->expType = op1->type;
6597 if(op1->type)
6598 op1->type->refCount++;
6599 }
6600 return 1;
6601 }
6602
6603 static unsigned int UIntSma(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6604 {
6605 unsigned int value2 = op2->__anon1.ui;
6606
6607 exp->type = 2;
6608 exp->__anon1.__anon2.string = PrintUInt((unsigned int)(op1->__anon1.ui < value2));
6609 if(!exp->expType)
6610 {
6611 exp->expType = op1->type;
6612 if(op1->type)
6613 op1->type->refCount++;
6614 }
6615 return 1;
6616 }
6617
6618 static unsigned int Int64Sma(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6619 {
6620 long long value2 = op2->__anon1.i64;
6621
6622 exp->type = 2;
6623 exp->__anon1.__anon2.string = PrintInt64((long long)(op1->__anon1.i64 < value2));
6624 if(!exp->expType)
6625 {
6626 exp->expType = op1->type;
6627 if(op1->type)
6628 op1->type->refCount++;
6629 }
6630 return 1;
6631 }
6632
6633 static unsigned int UInt64Sma(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6634 {
6635 uint64 value2 = op2->__anon1.ui64;
6636
6637 exp->type = 2;
6638 exp->__anon1.__anon2.string = PrintUInt64((uint64)(op1->__anon1.ui64 < value2));
6639 if(!exp->expType)
6640 {
6641 exp->expType = op1->type;
6642 if(op1->type)
6643 op1->type->refCount++;
6644 }
6645 return 1;
6646 }
6647
6648 static unsigned int ShortSma(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6649 {
6650 short value2 = op2->__anon1.s;
6651
6652 exp->type = 2;
6653 exp->__anon1.__anon2.string = PrintShort((short)(op1->__anon1.s < value2));
6654 if(!exp->expType)
6655 {
6656 exp->expType = op1->type;
6657 if(op1->type)
6658 op1->type->refCount++;
6659 }
6660 return 1;
6661 }
6662
6663 static unsigned int UShortSma(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6664 {
6665 unsigned short value2 = op2->__anon1.us;
6666
6667 exp->type = 2;
6668 exp->__anon1.__anon2.string = PrintUShort((unsigned short)(op1->__anon1.us < value2));
6669 if(!exp->expType)
6670 {
6671 exp->expType = op1->type;
6672 if(op1->type)
6673 op1->type->refCount++;
6674 }
6675 return 1;
6676 }
6677
6678 static unsigned int CharSma(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6679 {
6680 char value2 = op2->__anon1.c;
6681
6682 exp->type = 2;
6683 exp->__anon1.__anon2.string = PrintChar((char)(op1->__anon1.c < value2));
6684 if(!exp->expType)
6685 {
6686 exp->expType = op1->type;
6687 if(op1->type)
6688 op1->type->refCount++;
6689 }
6690 return 1;
6691 }
6692
6693 static unsigned int UCharSma(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6694 {
6695 unsigned char value2 = op2->__anon1.uc;
6696
6697 exp->type = 2;
6698 exp->__anon1.__anon2.string = PrintUChar((unsigned char)(op1->__anon1.uc < value2));
6699 if(!exp->expType)
6700 {
6701 exp->expType = op1->type;
6702 if(op1->type)
6703 op1->type->refCount++;
6704 }
6705 return 1;
6706 }
6707
6708 static unsigned int FloatSma(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6709 {
6710 float value2 = op2->__anon1.f;
6711
6712 exp->type = 2;
6713 exp->__anon1.__anon2.string = PrintFloat((float)(op1->__anon1.f < value2));
6714 if(!exp->expType)
6715 {
6716 exp->expType = op1->type;
6717 if(op1->type)
6718 op1->type->refCount++;
6719 }
6720 return 1;
6721 }
6722
6723 static unsigned int DoubleSma(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6724 {
6725 double value2 = op2->__anon1.d;
6726
6727 exp->type = 2;
6728 exp->__anon1.__anon2.string = PrintDouble((double)(op1->__anon1.d < value2));
6729 if(!exp->expType)
6730 {
6731 exp->expType = op1->type;
6732 if(op1->type)
6733 op1->type->refCount++;
6734 }
6735 return 1;
6736 }
6737
6738 static unsigned int IntGrtEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6739 {
6740 int value2 = op2->__anon1.i;
6741
6742 exp->type = 2;
6743 exp->__anon1.__anon2.string = PrintInt((int)(op1->__anon1.i >= value2));
6744 if(!exp->expType)
6745 {
6746 exp->expType = op1->type;
6747 if(op1->type)
6748 op1->type->refCount++;
6749 }
6750 return 1;
6751 }
6752
6753 static unsigned int UIntGrtEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6754 {
6755 unsigned int value2 = op2->__anon1.ui;
6756
6757 exp->type = 2;
6758 exp->__anon1.__anon2.string = PrintUInt((unsigned int)(op1->__anon1.ui >= value2));
6759 if(!exp->expType)
6760 {
6761 exp->expType = op1->type;
6762 if(op1->type)
6763 op1->type->refCount++;
6764 }
6765 return 1;
6766 }
6767
6768 static unsigned int Int64GrtEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6769 {
6770 long long value2 = op2->__anon1.i64;
6771
6772 exp->type = 2;
6773 exp->__anon1.__anon2.string = PrintInt64((long long)(op1->__anon1.i64 >= value2));
6774 if(!exp->expType)
6775 {
6776 exp->expType = op1->type;
6777 if(op1->type)
6778 op1->type->refCount++;
6779 }
6780 return 1;
6781 }
6782
6783 static unsigned int UInt64GrtEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6784 {
6785 uint64 value2 = op2->__anon1.ui64;
6786
6787 exp->type = 2;
6788 exp->__anon1.__anon2.string = PrintUInt64((uint64)(op1->__anon1.ui64 >= value2));
6789 if(!exp->expType)
6790 {
6791 exp->expType = op1->type;
6792 if(op1->type)
6793 op1->type->refCount++;
6794 }
6795 return 1;
6796 }
6797
6798 static unsigned int ShortGrtEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6799 {
6800 short value2 = op2->__anon1.s;
6801
6802 exp->type = 2;
6803 exp->__anon1.__anon2.string = PrintShort((short)(op1->__anon1.s >= value2));
6804 if(!exp->expType)
6805 {
6806 exp->expType = op1->type;
6807 if(op1->type)
6808 op1->type->refCount++;
6809 }
6810 return 1;
6811 }
6812
6813 static unsigned int UShortGrtEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6814 {
6815 unsigned short value2 = op2->__anon1.us;
6816
6817 exp->type = 2;
6818 exp->__anon1.__anon2.string = PrintUShort((unsigned short)(op1->__anon1.us >= value2));
6819 if(!exp->expType)
6820 {
6821 exp->expType = op1->type;
6822 if(op1->type)
6823 op1->type->refCount++;
6824 }
6825 return 1;
6826 }
6827
6828 static unsigned int CharGrtEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6829 {
6830 char value2 = op2->__anon1.c;
6831
6832 exp->type = 2;
6833 exp->__anon1.__anon2.string = PrintChar((char)(op1->__anon1.c >= value2));
6834 if(!exp->expType)
6835 {
6836 exp->expType = op1->type;
6837 if(op1->type)
6838 op1->type->refCount++;
6839 }
6840 return 1;
6841 }
6842
6843 static unsigned int UCharGrtEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6844 {
6845 unsigned char value2 = op2->__anon1.uc;
6846
6847 exp->type = 2;
6848 exp->__anon1.__anon2.string = PrintUChar((unsigned char)(op1->__anon1.uc >= value2));
6849 if(!exp->expType)
6850 {
6851 exp->expType = op1->type;
6852 if(op1->type)
6853 op1->type->refCount++;
6854 }
6855 return 1;
6856 }
6857
6858 static unsigned int FloatGrtEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6859 {
6860 float value2 = op2->__anon1.f;
6861
6862 exp->type = 2;
6863 exp->__anon1.__anon2.string = PrintFloat((float)(op1->__anon1.f >= value2));
6864 if(!exp->expType)
6865 {
6866 exp->expType = op1->type;
6867 if(op1->type)
6868 op1->type->refCount++;
6869 }
6870 return 1;
6871 }
6872
6873 static unsigned int DoubleGrtEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6874 {
6875 double value2 = op2->__anon1.d;
6876
6877 exp->type = 2;
6878 exp->__anon1.__anon2.string = PrintDouble((double)(op1->__anon1.d >= value2));
6879 if(!exp->expType)
6880 {
6881 exp->expType = op1->type;
6882 if(op1->type)
6883 op1->type->refCount++;
6884 }
6885 return 1;
6886 }
6887
6888 static unsigned int IntSmaEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6889 {
6890 int value2 = op2->__anon1.i;
6891
6892 exp->type = 2;
6893 exp->__anon1.__anon2.string = PrintInt((int)(op1->__anon1.i <= value2));
6894 if(!exp->expType)
6895 {
6896 exp->expType = op1->type;
6897 if(op1->type)
6898 op1->type->refCount++;
6899 }
6900 return 1;
6901 }
6902
6903 static unsigned int UIntSmaEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6904 {
6905 unsigned int value2 = op2->__anon1.ui;
6906
6907 exp->type = 2;
6908 exp->__anon1.__anon2.string = PrintUInt((unsigned int)(op1->__anon1.ui <= value2));
6909 if(!exp->expType)
6910 {
6911 exp->expType = op1->type;
6912 if(op1->type)
6913 op1->type->refCount++;
6914 }
6915 return 1;
6916 }
6917
6918 static unsigned int Int64SmaEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6919 {
6920 long long value2 = op2->__anon1.i64;
6921
6922 exp->type = 2;
6923 exp->__anon1.__anon2.string = PrintInt64((long long)(op1->__anon1.i64 <= value2));
6924 if(!exp->expType)
6925 {
6926 exp->expType = op1->type;
6927 if(op1->type)
6928 op1->type->refCount++;
6929 }
6930 return 1;
6931 }
6932
6933 static unsigned int UInt64SmaEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6934 {
6935 uint64 value2 = op2->__anon1.ui64;
6936
6937 exp->type = 2;
6938 exp->__anon1.__anon2.string = PrintUInt64((uint64)(op1->__anon1.ui64 <= value2));
6939 if(!exp->expType)
6940 {
6941 exp->expType = op1->type;
6942 if(op1->type)
6943 op1->type->refCount++;
6944 }
6945 return 1;
6946 }
6947
6948 static unsigned int ShortSmaEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6949 {
6950 short value2 = op2->__anon1.s;
6951
6952 exp->type = 2;
6953 exp->__anon1.__anon2.string = PrintShort((short)(op1->__anon1.s <= value2));
6954 if(!exp->expType)
6955 {
6956 exp->expType = op1->type;
6957 if(op1->type)
6958 op1->type->refCount++;
6959 }
6960 return 1;
6961 }
6962
6963 static unsigned int UShortSmaEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6964 {
6965 unsigned short value2 = op2->__anon1.us;
6966
6967 exp->type = 2;
6968 exp->__anon1.__anon2.string = PrintUShort((unsigned short)(op1->__anon1.us <= value2));
6969 if(!exp->expType)
6970 {
6971 exp->expType = op1->type;
6972 if(op1->type)
6973 op1->type->refCount++;
6974 }
6975 return 1;
6976 }
6977
6978 static unsigned int CharSmaEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6979 {
6980 char value2 = op2->__anon1.c;
6981
6982 exp->type = 2;
6983 exp->__anon1.__anon2.string = PrintChar((char)(op1->__anon1.c <= value2));
6984 if(!exp->expType)
6985 {
6986 exp->expType = op1->type;
6987 if(op1->type)
6988 op1->type->refCount++;
6989 }
6990 return 1;
6991 }
6992
6993 static unsigned int UCharSmaEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
6994 {
6995 unsigned char value2 = op2->__anon1.uc;
6996
6997 exp->type = 2;
6998 exp->__anon1.__anon2.string = PrintUChar((unsigned char)(op1->__anon1.uc <= value2));
6999 if(!exp->expType)
7000 {
7001 exp->expType = op1->type;
7002 if(op1->type)
7003 op1->type->refCount++;
7004 }
7005 return 1;
7006 }
7007
7008 static unsigned int FloatSmaEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
7009 {
7010 float value2 = op2->__anon1.f;
7011
7012 exp->type = 2;
7013 exp->__anon1.__anon2.string = PrintFloat((float)(op1->__anon1.f <= value2));
7014 if(!exp->expType)
7015 {
7016 exp->expType = op1->type;
7017 if(op1->type)
7018 op1->type->refCount++;
7019 }
7020 return 1;
7021 }
7022
7023 static unsigned int DoubleSmaEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
7024 {
7025 double value2 = op2->__anon1.d;
7026
7027 exp->type = 2;
7028 exp->__anon1.__anon2.string = PrintDouble((double)(op1->__anon1.d <= value2));
7029 if(!exp->expType)
7030 {
7031 exp->expType = op1->type;
7032 if(op1->type)
7033 op1->type->refCount++;
7034 }
7035 return 1;
7036 }
7037
7038 static unsigned int IntCond(struct Expression * exp, struct Operand * op1, struct Operand * op2, struct Operand * op3)
7039 {
7040 exp->type = 2;
7041 exp->__anon1.__anon2.string = PrintInt(op1->__anon1.i ? op2->__anon1.i : op3->__anon1.i);
7042 if(!exp->expType)
7043 {
7044 exp->expType = op1->type;
7045 if(op1->type)
7046 op1->type->refCount++;
7047 }
7048 return 1;
7049 }
7050
7051 static unsigned int UIntCond(struct Expression * exp, struct Operand * op1, struct Operand * op2, struct Operand * op3)
7052 {
7053 exp->type = 2;
7054 exp->__anon1.__anon2.string = PrintUInt(op1->__anon1.ui ? op2->__anon1.ui : op3->__anon1.ui);
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 Int64Cond(struct Expression * exp, struct Operand * op1, struct Operand * op2, struct Operand * op3)
7065 {
7066 exp->type = 2;
7067 exp->__anon1.__anon2.string = PrintInt64(op1->__anon1.i64 ? op2->__anon1.i64 : op3->__anon1.i64);
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 UInt64Cond(struct Expression * exp, struct Operand * op1, struct Operand * op2, struct Operand * op3)
7078 {
7079 exp->type = 2;
7080 exp->__anon1.__anon2.string = PrintUInt64(op1->__anon1.ui64 ? op2->__anon1.ui64 : op3->__anon1.ui64);
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 ShortCond(struct Expression * exp, struct Operand * op1, struct Operand * op2, struct Operand * op3)
7091 {
7092 exp->type = 2;
7093 exp->__anon1.__anon2.string = PrintShort(op1->__anon1.s ? op2->__anon1.s : op3->__anon1.s);
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 UShortCond(struct Expression * exp, struct Operand * op1, struct Operand * op2, struct Operand * op3)
7104 {
7105 exp->type = 2;
7106 exp->__anon1.__anon2.string = PrintUShort(op1->__anon1.us ? op2->__anon1.us : op3->__anon1.us);
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 CharCond(struct Expression * exp, struct Operand * op1, struct Operand * op2, struct Operand * op3)
7117 {
7118 exp->type = 2;
7119 exp->__anon1.__anon2.string = PrintChar(op1->__anon1.c ? op2->__anon1.c : op3->__anon1.c);
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 UCharCond(struct Expression * exp, struct Operand * op1, struct Operand * op2, struct Operand * op3)
7130 {
7131 exp->type = 2;
7132 exp->__anon1.__anon2.string = PrintUChar(op1->__anon1.uc ? op2->__anon1.uc : op3->__anon1.uc);
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 void PrintName(struct Type * type, char * string, unsigned int fullName)
7143 {
7144 if(type->name && type->name[0])
7145 {
7146 if(fullName)
7147 strcat(string, type->name);
7148 else
7149 {
7150 char * name = __ecereNameSpace__ecere__sys__RSearchString(type->name, "::", strlen(type->name), 1, 0);
7151
7152 if(name)
7153 name += 2;
7154 else
7155 name = type->name;
7156 strcat(string, name);
7157 }
7158 }
7159 }
7160
7161 static void PrintAttribs(struct Type * type, char * string)
7162 {
7163 if(type)
7164 {
7165 if(type->dllExport)
7166 strcat(string, "dllexport ");
7167 if(type->attrStdcall)
7168 strcat(string, "stdcall ");
7169 }
7170 }
7171
7172 static struct Type * FindMember(struct Type * type, char * string)
7173 {
7174 struct Type * memberType;
7175
7176 for(memberType = type->__anon1.__anon1.members.first; memberType; memberType = memberType->next)
7177 {
7178 if(!memberType->name)
7179 {
7180 struct Type * subType = FindMember(memberType, string);
7181
7182 if(subType)
7183 return subType;
7184 }
7185 else if(!strcmp(memberType->name, string))
7186 return memberType;
7187 }
7188 return (((void *)0));
7189 }
7190
7191 unsigned int __ecereProp_Type_Get_isPointerType(struct Type * this);
7192
7193 unsigned int __ecereProp_Type_Get_specConst(struct Type * this);
7194
7195 static unsigned int Promote(struct Operand * op, int kind, unsigned int isSigned)
7196 {
7197 unsigned int result = 0;
7198
7199 switch(kind)
7200 {
7201 case 2:
7202 if(op->kind == 1 || op->kind == 15 || op->kind == 24)
7203 result = isSigned ? GetOpShort(op, &op->__anon1.s) : GetOpUShort(op, &op->__anon1.us);
7204 break;
7205 case 3:
7206 case 5:
7207 if(op->kind == 1 || op->kind == 2 || op->kind == 15 || op->kind == 24)
7208 result = isSigned ? GetOpInt(op, &op->__anon1.i) : GetOpUInt(op, &op->__anon1.ui);
7209 break;
7210 case 4:
7211 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)
7212 result = isSigned ? GetOpInt64(op, &op->__anon1.i64) : GetOpUInt64(op, &op->__anon1.ui64);
7213 break;
7214 case 6:
7215 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)
7216 result = GetOpFloat(op, &op->__anon1.f);
7217 break;
7218 case 7:
7219 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)
7220 result = GetOpDouble(op, &op->__anon1.d);
7221 break;
7222 case 13:
7223 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)
7224 result = GetOpUInt64(op, &op->__anon1.ui64);
7225 break;
7226 case 15:
7227 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)
7228 result = isSigned ? GetOpInt(op, &op->__anon1.i) : GetOpUInt(op, &op->__anon1.ui);
7229 break;
7230 case 22:
7231 if(op->kind == 1 || op->kind == 2 || op->kind == 3 || op->kind == 5 || op->kind == 15 || op->kind == 24)
7232 result = isSigned ? GetOpInt64(op, &op->__anon1.i64) : GetOpUInt64(op, &op->__anon1.ui64);
7233 break;
7234 case 23:
7235 if(op->kind == 1 || op->kind == 2 || op->kind == 3 || op->kind == 5 || op->kind == 15 || op->kind == 24)
7236 result = isSigned ? GetOpInt64(op, &op->__anon1.i64) : GetOpUInt64(op, &op->__anon1.ui64);
7237 break;
7238 }
7239 return result;
7240 }
7241
7242 struct OpTable floatOps =
7243 {
7244 (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)
7245 };
7246
7247 struct OpTable doubleOps =
7248 {
7249 (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)
7250 };
7251
7252 struct OpTable intOps =
7253 {
7254 (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)
7255 };
7256
7257 struct OpTable uintOps =
7258 {
7259 (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)
7260 };
7261
7262 struct OpTable int64Ops =
7263 {
7264 (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)
7265 };
7266
7267 struct OpTable uint64Ops =
7268 {
7269 (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)
7270 };
7271
7272 struct OpTable shortOps =
7273 {
7274 (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)
7275 };
7276
7277 struct OpTable ushortOps =
7278 {
7279 (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)
7280 };
7281
7282 struct OpTable charOps =
7283 {
7284 (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)
7285 };
7286
7287 struct OpTable ucharOps =
7288 {
7289 (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)
7290 };
7291
7292 struct Type * FindMemberAndOffset(struct Type * type, char * string, unsigned int * offset)
7293 {
7294 struct Type * memberType;
7295
7296 for(memberType = type->__anon1.__anon1.members.first; memberType; memberType = memberType->next)
7297 {
7298 if(!memberType->name)
7299 {
7300 struct Type * subType = FindMember(memberType, string);
7301
7302 if(subType)
7303 {
7304 *offset += memberType->offset;
7305 return subType;
7306 }
7307 }
7308 else if(!strcmp(memberType->name, string))
7309 {
7310 *offset += memberType->offset;
7311 return memberType;
7312 }
7313 }
7314 return (((void *)0));
7315 }
7316
7317 struct __ecereNameSpace__ecere__com__Module;
7318
7319 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);
7320
7321 extern struct __ecereNameSpace__ecere__com__Instance * privateModule;
7322
7323 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);
7324
7325 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);
7326
7327 extern struct ModuleImport * FindModule(struct __ecereNameSpace__ecere__com__Instance * moduleToFind);
7328
7329 extern struct __ecereNameSpace__ecere__com__Class * __ecereNameSpace__ecere__com__eSystem_FindClass(struct __ecereNameSpace__ecere__com__Instance * module, const char *  name);
7330
7331 struct GlobalData
7332 {
7333 uintptr_t key;
7334 struct __ecereNameSpace__ecere__sys__BTNode * parent;
7335 struct __ecereNameSpace__ecere__sys__BTNode * left;
7336 struct __ecereNameSpace__ecere__sys__BTNode * right;
7337 int depth;
7338 struct __ecereNameSpace__ecere__com__Instance * module;
7339 char *  dataTypeString;
7340 struct Type * dataType;
7341 void *  symbol;
7342 char *  fullName;
7343 } __attribute__ ((gcc_struct));
7344
7345 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);
7346
7347 extern struct __ecereNameSpace__ecere__com__Instance * GetPrivateModule(void);
7348
7349 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);
7350
7351 extern struct __ecereNameSpace__ecere__com__Instance * __thisModule;
7352
7353 struct __ecereNameSpace__ecere__com__DefinedExpression;
7354
7355 extern struct __ecereNameSpace__ecere__com__DefinedExpression * __ecereNameSpace__ecere__com__eSystem_FindDefine(struct __ecereNameSpace__ecere__com__Instance * module, const char *  name);
7356
7357 struct __ecereNameSpace__ecere__com__DefinedExpression
7358 {
7359 struct __ecereNameSpace__ecere__com__DefinedExpression * prev;
7360 struct __ecereNameSpace__ecere__com__DefinedExpression * next;
7361 const char *  name;
7362 const char *  value;
7363 struct __ecereNameSpace__ecere__com__NameSpace *  nameSpace;
7364 } __attribute__ ((gcc_struct));
7365
7366 struct __ecereNameSpace__ecere__sys__BinaryTree;
7367
7368 struct __ecereNameSpace__ecere__sys__BinaryTree
7369 {
7370 struct __ecereNameSpace__ecere__sys__BTNode * root;
7371 int count;
7372 int (*  CompareKey)(struct __ecereNameSpace__ecere__sys__BinaryTree * tree, uintptr_t a, uintptr_t b);
7373 void (*  FreeKey)(void *  key);
7374 } __attribute__ ((gcc_struct));
7375
7376 struct __ecereNameSpace__ecere__com__Class
7377 {
7378 struct __ecereNameSpace__ecere__com__Class * prev;
7379 struct __ecereNameSpace__ecere__com__Class * next;
7380 const char *  name;
7381 int offset;
7382 int structSize;
7383 void * *  _vTbl;
7384 int vTblSize;
7385 unsigned int (*  Constructor)(void * );
7386 void (*  Destructor)(void * );
7387 int offsetClass;
7388 int sizeClass;
7389 struct __ecereNameSpace__ecere__com__Class * base;
7390 struct __ecereNameSpace__ecere__sys__BinaryTree methods;
7391 struct __ecereNameSpace__ecere__sys__BinaryTree members;
7392 struct __ecereNameSpace__ecere__sys__BinaryTree prop;
7393 struct __ecereNameSpace__ecere__sys__OldList membersAndProperties;
7394 struct __ecereNameSpace__ecere__sys__BinaryTree classProperties;
7395 struct __ecereNameSpace__ecere__sys__OldList derivatives;
7396 int memberID;
7397 int startMemberID;
7398 int type;
7399 struct __ecereNameSpace__ecere__com__Instance * module;
7400 struct __ecereNameSpace__ecere__com__NameSpace *  nameSpace;
7401 const char *  dataTypeString;
7402 struct Type * dataType;
7403 int typeSize;
7404 int defaultAlignment;
7405 void (*  Initialize)();
7406 int memberOffset;
7407 struct __ecereNameSpace__ecere__sys__OldList selfWatchers;
7408 const char *  designerClass;
7409 unsigned int noExpansion;
7410 const char *  defaultProperty;
7411 unsigned int comRedefinition;
7412 int count;
7413 int isRemote;
7414 unsigned int internalDecl;
7415 void *  data;
7416 unsigned int computeSize;
7417 short structAlignment;
7418 short pointerAlignment;
7419 int destructionWatchOffset;
7420 unsigned int fixed;
7421 struct __ecereNameSpace__ecere__sys__OldList delayedCPValues;
7422 int inheritanceAccess;
7423 const char *  fullName;
7424 void *  symbol;
7425 struct __ecereNameSpace__ecere__sys__OldList conversions;
7426 struct __ecereNameSpace__ecere__sys__OldList templateParams;
7427 struct __ecereNameSpace__ecere__com__ClassTemplateArgument *  templateArgs;
7428 struct __ecereNameSpace__ecere__com__Class * templateClass;
7429 struct __ecereNameSpace__ecere__sys__OldList templatized;
7430 int numParams;
7431 unsigned int isInstanceClass;
7432 unsigned int byValueSystemClass;
7433 } __attribute__ ((gcc_struct));
7434
7435 struct __ecereNameSpace__ecere__com__NameSpace
7436 {
7437 const char *  name;
7438 struct __ecereNameSpace__ecere__com__NameSpace *  btParent;
7439 struct __ecereNameSpace__ecere__com__NameSpace *  left;
7440 struct __ecereNameSpace__ecere__com__NameSpace *  right;
7441 int depth;
7442 struct __ecereNameSpace__ecere__com__NameSpace *  parent;
7443 struct __ecereNameSpace__ecere__sys__BinaryTree nameSpaces;
7444 struct __ecereNameSpace__ecere__sys__BinaryTree classes;
7445 struct __ecereNameSpace__ecere__sys__BinaryTree defines;
7446 struct __ecereNameSpace__ecere__sys__BinaryTree functions;
7447 } __attribute__ ((gcc_struct));
7448
7449 struct __ecereNameSpace__ecere__com__DataMember
7450 {
7451 struct __ecereNameSpace__ecere__com__DataMember * prev;
7452 struct __ecereNameSpace__ecere__com__DataMember * next;
7453 const char *  name;
7454 unsigned int isProperty;
7455 int memberAccess;
7456 int id;
7457 struct __ecereNameSpace__ecere__com__Class * _class;
7458 const char *  dataTypeString;
7459 struct __ecereNameSpace__ecere__com__Class * dataTypeClass;
7460 struct Type * dataType;
7461 int type;
7462 int offset;
7463 int memberID;
7464 struct __ecereNameSpace__ecere__sys__OldList members;
7465 struct __ecereNameSpace__ecere__sys__BinaryTree membersAlpha;
7466 int memberOffset;
7467 short structAlignment;
7468 short pointerAlignment;
7469 } __attribute__ ((gcc_struct));
7470
7471 struct __ecereNameSpace__ecere__sys__BTNode * __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindString(struct __ecereNameSpace__ecere__sys__BinaryTree * this, const char *  key);
7472
7473 unsigned int __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Add(struct __ecereNameSpace__ecere__sys__BinaryTree * this, struct __ecereNameSpace__ecere__sys__BTNode * node);
7474
7475 struct __ecereNameSpace__ecere__sys__BTNode * __ecereProp___ecereNameSpace__ecere__sys__BinaryTree_Get_first(struct __ecereNameSpace__ecere__sys__BinaryTree * this);
7476
7477 struct __ecereNameSpace__ecere__sys__BTNode * __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindPrefix(struct __ecereNameSpace__ecere__sys__BinaryTree * this, const char *  key);
7478
7479 void __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Remove(struct __ecereNameSpace__ecere__sys__BinaryTree * this, struct __ecereNameSpace__ecere__sys__BTNode * node);
7480
7481 static struct __ecereNameSpace__ecere__com__Class * __ecereClass_Conversion;
7482
7483 static void _DeclareType(struct External * neededFor, struct Type * type, unsigned int needDereference, unsigned int forFunctionDef, unsigned int fwdDecl)
7484 {
7485 if(inCompiler)
7486 {
7487 if(type->kind == 11)
7488 {
7489 struct Type * param;
7490
7491 for(param = type->__anon1.__anon2.params.first; param; param = param->next)
7492 _DeclareType(neededFor, param, forFunctionDef, 0, fwdDecl);
7493 _DeclareType(neededFor, type->__anon1.__anon2.returnType, forFunctionDef, 0, fwdDecl);
7494 }
7495 else if(type->kind == 13)
7496 _DeclareType(neededFor, type->__anon1.type, 0, 0, fwdDecl);
7497 else if(type->kind == 8)
7498 {
7499 struct __ecereNameSpace__ecere__com__Class * c = type->__anon1._class->__anon1.registered;
7500
7501 _DeclareStruct(neededFor, c ? c->fullName : "ecere::com::Instance", c ? c->type == 5 : 0, needDereference && c && c->type == 1, fwdDecl);
7502 }
7503 else if(type->kind == 9 || type->kind == 10)
7504 {
7505 struct Type * member;
7506
7507 for(member = type->__anon1.__anon1.members.first; member; member = member->next)
7508 _DeclareType(neededFor, member, needDereference, forFunctionDef, fwdDecl);
7509 }
7510 else if(type->kind == 12)
7511 _DeclareType(neededFor, type->__anon1.__anon4.arrayType, 1, 0, fwdDecl);
7512 }
7513 }
7514
7515 static unsigned int CheckConstCompatibility(struct Type * source, struct Type * dest, unsigned int warn)
7516 {
7517 unsigned int status = 1;
7518
7519 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))
7520 {
7521 struct __ecereNameSpace__ecere__com__Class * sourceClass = source->kind == 8 ? source->__anon1._class->__anon1.registered : (((void *)0));
7522 struct __ecereNameSpace__ecere__com__Class * destClass = dest->kind == 8 ? dest->__anon1._class->__anon1.registered : (((void *)0));
7523
7524 if((!sourceClass || (sourceClass && sourceClass->type == 0 && !sourceClass->structSize)) && (!destClass || (destClass && destClass->type == 0 && !destClass->structSize)))
7525 {
7526 struct Type * sourceType = source, * destType = dest;
7527
7528 while((sourceType->kind == 13 || sourceType->kind == 12) && sourceType->__anon1.type)
7529 sourceType = sourceType->__anon1.type;
7530 while((destType->kind == 13 || destType->kind == 12) && destType->__anon1.type)
7531 destType = destType->__anon1.type;
7532 if(!destType->constant && sourceType->constant)
7533 {
7534 status = 0;
7535 if(warn)
7536 Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "discarding const qualifier\n", (((void *)0))));
7537 }
7538 }
7539 }
7540 return status;
7541 }
7542
7543 struct Operand GetOperand(struct Expression * exp)
7544 {
7545 struct Operand op =
7546 {
7547 0, 0, 0,
7548 .__anon1 = {
7549 .c = 0
7550 },
7551 {
7552 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
7553 }
7554 };
7555 struct Type * type = exp->expType;
7556
7557 if(type)
7558 {
7559 while(type->kind == 8 && type->__anon1._class->__anon1.registered && (type->__anon1._class->__anon1.registered->type == 2 || type->__anon1._class->__anon1.registered->type == 3 || type->__anon1._class->__anon1.registered->type == 4))
7560 {
7561 if(!type->__anon1._class->__anon1.registered->dataType)
7562 type->__anon1._class->__anon1.registered->dataType = ProcessTypeString(type->__anon1._class->__anon1.registered->dataTypeString, 0);
7563 type = type->__anon1._class->__anon1.registered->dataType;
7564 }
7565 if(exp->type == 3 && op.kind == 13)
7566 {
7567 op.__anon1.ui64 = (uint64)(uintptr_t)exp->__anon1.__anon2.string;
7568 op.kind = 13;
7569 op.ops = uint64Ops;
7570 }
7571 else if(exp->isConstant && exp->type == 2)
7572 {
7573 op.kind = type->kind;
7574 op.type = type;
7575 switch(op.kind)
7576 {
7577 case 24:
7578 case 1:
7579 {
7580 if(exp->__anon1.__anon1.constant[0] == '\'')
7581 {
7582 op.__anon1.c = exp->__anon1.__anon1.constant[1];
7583 op.ops = charOps;
7584 }
7585 else if(type->isSigned)
7586 {
7587 op.__anon1.c = (char)strtol(exp->__anon1.__anon1.constant, (((void *)0)), 0);
7588 op.ops = charOps;
7589 }
7590 else
7591 {
7592 op.__anon1.uc = (unsigned char)strtoul(exp->__anon1.__anon1.constant, (((void *)0)), 0);
7593 op.ops = ucharOps;
7594 }
7595 break;
7596 }
7597 case 2:
7598 if(type->isSigned)
7599 {
7600 op.__anon1.s = (short)strtol(exp->__anon1.__anon1.constant, (((void *)0)), 0);
7601 op.ops = shortOps;
7602 }
7603 else
7604 {
7605 op.__anon1.us = (unsigned short)strtoul(exp->__anon1.__anon1.constant, (((void *)0)), 0);
7606 op.ops = ushortOps;
7607 }
7608 break;
7609 case 3:
7610 case 5:
7611 if(type->isSigned)
7612 {
7613 op.__anon1.i = strtol(exp->__anon1.__anon1.constant, (((void *)0)), 0);
7614 op.ops = intOps;
7615 }
7616 else
7617 {
7618 op.__anon1.ui = strtoul(exp->__anon1.__anon1.constant, (((void *)0)), 0);
7619 op.ops = uintOps;
7620 }
7621 op.kind = 3;
7622 break;
7623 case 4:
7624 if(type->isSigned)
7625 {
7626 op.__anon1.i64 = __ecereNameSpace__ecere__com___strtoi64(exp->__anon1.__anon1.constant, (((void *)0)), 0);
7627 op.ops = int64Ops;
7628 }
7629 else
7630 {
7631 op.__anon1.ui64 = __ecereNameSpace__ecere__com___strtoui64(exp->__anon1.__anon1.constant, (((void *)0)), 0);
7632 op.ops = uint64Ops;
7633 }
7634 op.kind = 4;
7635 break;
7636 case 22:
7637 if(type->isSigned)
7638 {
7639 op.__anon1.i64 = __ecereNameSpace__ecere__com___strtoi64(exp->__anon1.__anon1.constant, (((void *)0)), 0);
7640 op.ops = int64Ops;
7641 }
7642 else
7643 {
7644 op.__anon1.ui64 = __ecereNameSpace__ecere__com___strtoui64(exp->__anon1.__anon1.constant, (((void *)0)), 0);
7645 op.ops = uint64Ops;
7646 }
7647 op.kind = 4;
7648 break;
7649 case 23:
7650 if(type->isSigned)
7651 {
7652 op.__anon1.i64 = __ecereNameSpace__ecere__com___strtoi64(exp->__anon1.__anon1.constant, (((void *)0)), 0);
7653 op.ops = int64Ops;
7654 }
7655 else
7656 {
7657 op.__anon1.ui64 = __ecereNameSpace__ecere__com___strtoui64(exp->__anon1.__anon1.constant, (((void *)0)), 0);
7658 op.ops = uint64Ops;
7659 }
7660 op.kind = 4;
7661 break;
7662 case 6:
7663 if(!strcmp(exp->__anon1.__anon1.constant, "inf"))
7664 op.__anon1.f = __ecereMethod_float_inf();
7665 else if(!strcmp(exp->__anon1.__anon1.constant, "-inf"))
7666 op.__anon1.f = -__ecereMethod_float_inf();
7667 else if(!strcmp(exp->__anon1.__anon1.constant, "nan"))
7668 op.__anon1.f = __ecereMethod_float_nan();
7669 else if(!strcmp(exp->__anon1.__anon1.constant, "-nan"))
7670 op.__anon1.f = -__ecereMethod_float_nan();
7671 else
7672 op.__anon1.f = (float)strtod(exp->__anon1.__anon1.constant, (((void *)0)));
7673 op.ops = floatOps;
7674 break;
7675 case 7:
7676 if(!strcmp(exp->__anon1.__anon1.constant, "inf"))
7677 op.__anon1.d = __ecereMethod_double_inf();
7678 else if(!strcmp(exp->__anon1.__anon1.constant, "-inf"))
7679 op.__anon1.d = -__ecereMethod_double_inf();
7680 else if(!strcmp(exp->__anon1.__anon1.constant, "nan"))
7681 op.__anon1.d = __ecereMethod_double_nan();
7682 else if(!strcmp(exp->__anon1.__anon1.constant, "-nan"))
7683 op.__anon1.d = -__ecereMethod_double_nan();
7684 else
7685 op.__anon1.d = (double)strtod(exp->__anon1.__anon1.constant, (((void *)0)));
7686 op.ops = doubleOps;
7687 break;
7688 case 12:
7689 case 13:
7690 case 8:
7691 op.__anon1.ui64 = __ecereNameSpace__ecere__com___strtoui64(exp->__anon1.__anon1.constant, (((void *)0)), 0);
7692 op.kind = 13;
7693 op.ops = uint64Ops;
7694 break;
7695 }
7696 }
7697 }
7698 return op;
7699 }
7700
7701 static long long GetEnumValue(struct __ecereNameSpace__ecere__com__Class * _class, void * ptr)
7702 {
7703 long long v = 0;
7704
7705 switch(_class->typeSize)
7706 {
7707 case 8:
7708 if(!strcmp(_class->dataTypeString, "uint64"))
7709 v = (long long)*(uint64 *)ptr;
7710 else
7711 v = *(long long *)ptr;
7712 break;
7713 case 4:
7714 if(!strcmp(_class->dataTypeString, "uint"))
7715 v = (long long)*(unsigned int *)ptr;
7716 else
7717 v = (long long)*(int *)ptr;
7718 break;
7719 case 2:
7720 if(!strcmp(_class->dataTypeString, "uint16"))
7721 v = (long long)*(unsigned short *)ptr;
7722 else
7723 v = (long long)*(short *)ptr;
7724 break;
7725 case 1:
7726 if(!strcmp(_class->dataTypeString, "byte"))
7727 v = (long long)*(unsigned char *)ptr;
7728 else
7729 v = (long long)*(char *)ptr;
7730 break;
7731 }
7732 return v;
7733 }
7734
7735 static void GetTypeSpecs(struct Type * type, struct __ecereNameSpace__ecere__sys__OldList * specs)
7736 {
7737 if(!type->isSigned && type->kind != 22 && type->kind != 23)
7738 ListAdd(specs, MkSpecifier(UNSIGNED));
7739 switch(type->kind)
7740 {
7741 case 8:
7742 {
7743 if(type->__anon1._class->__anon1.registered)
7744 {
7745 if(!type->__anon1._class->__anon1.registered->dataType)
7746 type->__anon1._class->__anon1.registered->dataType = ProcessTypeString(type->__anon1._class->__anon1.registered->dataTypeString, 0);
7747 GetTypeSpecs(type->__anon1._class->__anon1.registered->dataType, specs);
7748 }
7749 break;
7750 }
7751 case 7:
7752 ListAdd(specs, MkSpecifier(DOUBLE));
7753 break;
7754 case 6:
7755 ListAdd(specs, MkSpecifier(FLOAT));
7756 break;
7757 case 1:
7758 ListAdd(specs, MkSpecifier(CHAR));
7759 break;
7760 case 24:
7761 ListAdd(specs, MkSpecifier(_BOOL));
7762 break;
7763 case 2:
7764 ListAdd(specs, MkSpecifier(SHORT));
7765 break;
7766 case 4:
7767 ListAdd(specs, MkSpecifier(INT64));
7768 break;
7769 case 22:
7770 ListAdd(specs, MkSpecifierName(type->isSigned ? "intptr" : "uintptr"));
7771 break;
7772 case 23:
7773 ListAdd(specs, MkSpecifierName(type->isSigned ? "intsize" : "uintsize"));
7774 break;
7775 case 3:
7776 default:
7777 ListAdd(specs, MkSpecifier(INT));
7778 break;
7779 }
7780 }
7781
7782 static void PrintTypeSpecs(struct Type * type, char * string, unsigned int fullName, unsigned int printConst)
7783 {
7784 if(type)
7785 {
7786 if(printConst && type->constant)
7787 strcat(string, "const ");
7788 switch(type->kind)
7789 {
7790 case 8:
7791 {
7792 struct Symbol * c = type->__anon1._class;
7793 unsigned int isObjectBaseClass = !c || !c->string || !strcmp(c->string, "class");
7794
7795 if(type->classObjectType == 2 && isObjectBaseClass)
7796 strcat(string, "typed_object");
7797 else if(type->classObjectType == 3 && isObjectBaseClass)
7798 strcat(string, "any_object");
7799 else
7800 {
7801 if(c && c->string)
7802 strcat(string, (fullName || !c->__anon1.registered) ? c->string : c->__anon1.registered->name);
7803 }
7804 if(type->byReference)
7805 strcat(string, " &");
7806 break;
7807 }
7808 case 0:
7809 strcat(string, "void");
7810 break;
7811 case 3:
7812 strcat(string, type->isSigned ? "int" : "uint");
7813 break;
7814 case 4:
7815 strcat(string, type->isSigned ? "int64" : "uint64");
7816 break;
7817 case 22:
7818 strcat(string, type->isSigned ? "intptr" : "uintptr");
7819 break;
7820 case 23:
7821 strcat(string, type->isSigned ? "intsize" : "uintsize");
7822 break;
7823 case 1:
7824 strcat(string, type->isSigned ? "char" : "byte");
7825 break;
7826 case 24:
7827 strcat(string, "_Bool");
7828 break;
7829 case 2:
7830 strcat(string, type->isSigned ? "short" : "uint16");
7831 break;
7832 case 6:
7833 strcat(string, "float");
7834 break;
7835 case 7:
7836 strcat(string, "double");
7837 break;
7838 case 9:
7839 if(type->__anon1.__anon1.enumName)
7840 {
7841 strcat(string, "struct ");
7842 strcat(string, type->__anon1.__anon1.enumName);
7843 }
7844 else if(type->typeName)
7845 strcat(string, type->typeName);
7846 else
7847 {
7848 struct Type * member;
7849
7850 strcat(string, "struct { ");
7851 for(member = type->__anon1.__anon1.members.first; member; member = member->next)
7852 {
7853 PrintType(member, string, 1, fullName);
7854 strcat(string, "; ");
7855 }
7856 strcat(string, "}");
7857 }
7858 break;
7859 case 10:
7860 if(type->__anon1.__anon1.enumName)
7861 {
7862 strcat(string, "union ");
7863 strcat(string, type->__anon1.__anon1.enumName);
7864 }
7865 else if(type->typeName)
7866 strcat(string, type->typeName);
7867 else
7868 {
7869 strcat(string, "union ");
7870 strcat(string, "(unnamed)");
7871 }
7872 break;
7873 case 15:
7874 if(type->__anon1.__anon1.enumName)
7875 {
7876 strcat(string, "enum ");
7877 strcat(string, type->__anon1.__anon1.enumName);
7878 }
7879 else if(type->typeName)
7880 strcat(string, type->typeName);
7881 else
7882 strcat(string, "int");
7883 break;
7884 case 14:
7885 strcat(string, "...");
7886 break;
7887 case 19:
7888 strcat(string, "subclass(");
7889 strcat(string, type->__anon1._class ? type->__anon1._class->string : "int");
7890 strcat(string, ")");
7891 break;
7892 case 20:
7893 strcat(string, type->__anon1.templateParameter->identifier->string);
7894 break;
7895 case 21:
7896 strcat(string, "thisclass");
7897 break;
7898 case 17:
7899 strcat(string, "__builtin_va_list");
7900 break;
7901 }
7902 }
7903 }
7904
7905 extern char *  __ecereNameSpace__ecere__com__PrintString(struct __ecereNameSpace__ecere__com__Class * class, const void * object, ...);
7906
7907 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass___ecereNameSpace__ecere__sys__TempFile;
7908
7909 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_ClassImport;
7910
7911 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_Symbol;
7912
7913 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_PropertyImport;
7914
7915 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_Type;
7916
7917 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_TemplatedType;
7918
7919 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_TemplateParameter;
7920
7921 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_MethodImport;
7922
7923 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_FunctionImport;
7924
7925 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_Expression;
7926
7927 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_Instantiation;
7928
7929 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass___ecereNameSpace__ecere__sys__NamedLink64;
7930
7931 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_TypeName;
7932
7933 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_Context;
7934
7935 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass___ecereNameSpace__ecere__com__Module;
7936
7937 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass___ecereNameSpace__ecere__com__LinkList;
7938
7939 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass___ecereNameSpace__ecere__com__Application;
7940
7941 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_int;
7942
7943 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass___ecereNameSpace__ecere__com__Instance;
7944
7945 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass___ecereNameSpace__ecere__sys__File;
7946
7947 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_External;
7948
7949 struct __ecereNameSpace__ecere__com__Application
7950 {
7951 int argc;
7952 const char * *  argv;
7953 int exitCode;
7954 unsigned int isGUIApp;
7955 struct __ecereNameSpace__ecere__sys__OldList allModules;
7956 char *  parsedCommand;
7957 struct __ecereNameSpace__ecere__com__NameSpace systemNameSpace;
7958 } __attribute__ ((gcc_struct));
7959
7960 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)
7961 {
7962 if(*curMember)
7963 {
7964 *curMember = (*curMember)->next;
7965 if(subMemberStackPos && *subMemberStackPos > 0 && subMemberStack[*subMemberStackPos - 1]->type == 1)
7966 {
7967 *curMember = subMemberStack[--(*subMemberStackPos)];
7968 *curMember = (*curMember)->next;
7969 }
7970 while((*curMember) && (*curMember)->isProperty)
7971 *curMember = (*curMember)->next;
7972 if(subMemberStackPos)
7973 {
7974 while((*curMember) && !(*curMember)->isProperty && !(*curMember)->name && ((*curMember)->type == 2 || (*curMember)->type == 1))
7975 {
7976 subMemberStack[(*subMemberStackPos)++] = *curMember;
7977 *curMember = (*curMember)->members.first;
7978 while(*curMember && (*curMember)->isProperty)
7979 *curMember = (*curMember)->next;
7980 }
7981 }
7982 }
7983 while(!*curMember)
7984 {
7985 if(!*curMember)
7986 {
7987 if(subMemberStackPos && *subMemberStackPos)
7988 {
7989 *curMember = subMemberStack[--(*subMemberStackPos)];
7990 *curMember = (*curMember)->next;
7991 }
7992 else
7993 {
7994 struct __ecereNameSpace__ecere__com__Class * lastCurClass = *curClass;
7995
7996 if(*curClass == _class)
7997 break;
7998 for(*curClass = _class; (*curClass)->base != lastCurClass && (*curClass)->base->type != 1000; *curClass = (*curClass)->base)
7999 ;
8000 *curMember = (*curClass)->membersAndProperties.first;
8001 }
8002 while((*curMember) && (*curMember)->isProperty)
8003 *curMember = (*curMember)->next;
8004 if(subMemberStackPos)
8005 {
8006 while((*curMember) && !(*curMember)->isProperty && !(*curMember)->name && ((*curMember)->type == 2 || (*curMember)->type == 1))
8007 {
8008 subMemberStack[(*subMemberStackPos)++] = *curMember;
8009 *curMember = (*curMember)->members.first;
8010 while(*curMember && (*curMember)->isProperty)
8011 *curMember = (*curMember)->next;
8012 }
8013 }
8014 }
8015 }
8016 }
8017
8018 static struct GlobalData * ScanGlobalData(struct __ecereNameSpace__ecere__com__NameSpace * nameSpace, char * name)
8019 {
8020 struct __ecereNameSpace__ecere__sys__BinaryTree * tree = &nameSpace->functions;
8021 struct GlobalData * data = (struct GlobalData *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindString((&*tree), name);
8022 struct __ecereNameSpace__ecere__com__NameSpace * child;
8023
8024 if(!data)
8025 {
8026 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)))
8027 {
8028 data = ScanGlobalData(child, name);
8029 if(data)
8030 break;
8031 }
8032 }
8033 return data;
8034 }
8035
8036 static struct Symbol * ScanWithNameSpace(struct __ecereNameSpace__ecere__sys__BinaryTree * tree, const char * nameSpace, const char * name)
8037 {
8038 int nsLen = strlen(nameSpace);
8039 struct Symbol * symbol;
8040
8041 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)))
8042 {
8043 char * s = symbol->string;
8044
8045 if(!strncmp(s, nameSpace, nsLen))
8046 {
8047 int c;
8048 char * namePart;
8049
8050 for(c = strlen(s) - 1; c >= 0; c--)
8051 if(s[c] == ':')
8052 break;
8053 namePart = s + c + 1;
8054 if(!strcmp(namePart, name))
8055 {
8056 return symbol;
8057 }
8058 }
8059 else
8060 break;
8061 }
8062 return (((void *)0));
8063 }
8064
8065 unsigned int GetInt(struct Expression * exp, int * value2)
8066 {
8067 struct Operand op2 = GetOperand(exp);
8068
8069 return GetOpInt(&op2, value2);
8070 }
8071
8072 unsigned int GetUInt(struct Expression * exp, unsigned int * value2)
8073 {
8074 struct Operand op2 = GetOperand(exp);
8075
8076 return GetOpUInt(&op2, value2);
8077 }
8078
8079 unsigned int GetInt64(struct Expression * exp, long long * value2)
8080 {
8081 struct Operand op2 = GetOperand(exp);
8082
8083 return GetOpInt64(&op2, value2);
8084 }
8085
8086 unsigned int GetUInt64(struct Expression * exp, uint64 * value2)
8087 {
8088 struct Operand op2 = GetOperand(exp);
8089
8090 return GetOpUInt64(&op2, value2);
8091 }
8092
8093 unsigned int GetIntPtr(struct Expression * exp, intptr_t * value2)
8094 {
8095 struct Operand op2 = GetOperand(exp);
8096
8097 return GetOpIntPtr(&op2, value2);
8098 }
8099
8100 unsigned int GetUIntPtr(struct Expression * exp, uintptr_t * value2)
8101 {
8102 struct Operand op2 = GetOperand(exp);
8103
8104 return GetOpUIntPtr(&op2, value2);
8105 }
8106
8107 unsigned int GetIntSize(struct Expression * exp, ssize_t * value2)
8108 {
8109 struct Operand op2 = GetOperand(exp);
8110
8111 return GetOpIntSize(&op2, value2);
8112 }
8113
8114 unsigned int GetUIntSize(struct Expression * exp, size_t * value2)
8115 {
8116 struct Operand op2 = GetOperand(exp);
8117
8118 return GetOpUIntSize(&op2, value2);
8119 }
8120
8121 unsigned int GetShort(struct Expression * exp, short * value2)
8122 {
8123 struct Operand op2 = GetOperand(exp);
8124
8125 return GetOpShort(&op2, value2);
8126 }
8127
8128 unsigned int GetUShort(struct Expression * exp, unsigned short * value2)
8129 {
8130 struct Operand op2 = GetOperand(exp);
8131
8132 return GetOpUShort(&op2, value2);
8133 }
8134
8135 unsigned int GetChar(struct Expression * exp, char * value2)
8136 {
8137 struct Operand op2 = GetOperand(exp);
8138
8139 return GetOpChar(&op2, value2);
8140 }
8141
8142 unsigned int GetUChar(struct Expression * exp, unsigned char * value2)
8143 {
8144 struct Operand op2 = GetOperand(exp);
8145
8146 return GetOpUChar(&op2, value2);
8147 }
8148
8149 unsigned int GetFloat(struct Expression * exp, float * value2)
8150 {
8151 struct Operand op2 = GetOperand(exp);
8152
8153 return GetOpFloat(&op2, value2);
8154 }
8155
8156 unsigned int GetDouble(struct Expression * exp, double * value2)
8157 {
8158 struct Operand op2 = GetOperand(exp);
8159
8160 return GetOpDouble(&op2, value2);
8161 }
8162
8163 static void PrePrintType(struct Type * type, char * string, unsigned int fullName, struct Type * parentType, unsigned int printConst)
8164 {
8165 if(type->kind == 12 || type->kind == 13 || type->kind == 11 || type->kind == 16)
8166 {
8167 if((type->kind == 11 || type->kind == 16) && (!parentType || parentType->kind != 13))
8168 PrintAttribs(type, string);
8169 if(printConst && type->constant && (type->kind == 11 || type->kind == 16))
8170 strcat(string, " const");
8171 PrePrintType(type->kind == 16 ? type->__anon1.__anon3.method->dataType : type->__anon1.type, string, fullName, type, printConst);
8172 if(type->kind == 13 && (type->__anon1.type->kind == 12 || type->__anon1.type->kind == 11 || type->__anon1.type->kind == 16))
8173 strcat(string, " (");
8174 if(type->kind == 13)
8175 {
8176 if(type->__anon1.type->kind == 11 || type->__anon1.type->kind == 16)
8177 PrintAttribs(type->__anon1.type, string);
8178 }
8179 if(type->kind == 13)
8180 {
8181 if(type->__anon1.type->kind == 11 || type->__anon1.type->kind == 16 || type->__anon1.type->kind == 12)
8182 strcat(string, "*");
8183 else
8184 strcat(string, " *");
8185 }
8186 if(printConst && type->constant && type->kind == 13)
8187 strcat(string, " const");
8188 }
8189 else
8190 PrintTypeSpecs(type, string, fullName, printConst);
8191 }
8192
8193 void PrintExpression(struct Expression * exp, char * string)
8194 {
8195 {
8196 struct __ecereNameSpace__ecere__com__Instance * f = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass___ecereNameSpace__ecere__sys__TempFile);
8197 int count;
8198 unsigned int backOutputLineNumbers = outputLineNumbers;
8199
8200 outputLineNumbers = 0;
8201 if(exp)
8202 OutputExpression(exp, f);
8203 ((unsigned int (*)(struct __ecereNameSpace__ecere__com__Instance *, int pos, int mode))__extension__ ({
8204 struct __ecereNameSpace__ecere__com__Instance * __internal_ClassInst = f;
8205
8206 __internal_ClassInst ? __internal_ClassInst->_vTbl : __ecereClass___ecereNameSpace__ecere__sys__TempFile->_vTbl;
8207 })[__ecereVMethodID___ecereNameSpace__ecere__sys__File_Seek])(f, 0, 0);
8208 count = strlen(string);
8209 count += ((int (*)(struct __ecereNameSpace__ecere__com__Instance *, void *  buffer, unsigned int size, unsigned int count))__extension__ ({
8210 struct __ecereNameSpace__ecere__com__Instance * __internal_ClassInst = f;
8211
8212 __internal_ClassInst ? __internal_ClassInst->_vTbl : __ecereClass___ecereNameSpace__ecere__sys__TempFile->_vTbl;
8213 })[__ecereVMethodID___ecereNameSpace__ecere__sys__File_Read])(f, string + count, 1, 1023);
8214 string[count] = '\0';
8215 (__ecereNameSpace__ecere__com__eInstance_DecRef(f), f = 0);
8216 outputLineNumbers = backOutputLineNumbers;
8217 }
8218 }
8219
8220 struct Type * Dereference(struct Type * source)
8221 {
8222 struct Type * type = (((void *)0));
8223
8224 if(source)
8225 {
8226 if(source->kind == 13 || source->kind == 12)
8227 {
8228 type = source->__anon1.type;
8229 source->__anon1.type->refCount++;
8230 }
8231 else if(source->kind == 8 && !strcmp(source->__anon1._class->string, "String"))
8232 {
8233 type = __extension__ ({
8234 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
8235
8236 __ecereInstance1->kind = 1, __ecereInstance1->refCount = 1, __ecereInstance1;
8237 });
8238 }
8239 else if(source->kind == 8 && source->__anon1._class && source->__anon1._class->__anon1.registered && source->__anon1._class->__anon1.registered->type == 5)
8240 {
8241 type = source;
8242 source->refCount++;
8243 }
8244 else
8245 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "cannot dereference type\n", (((void *)0))));
8246 }
8247 return type;
8248 }
8249
8250 static struct Type * Reference(struct Type * source)
8251 {
8252 struct Type * type = (((void *)0));
8253
8254 if(source)
8255 {
8256 type = __extension__ ({
8257 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
8258
8259 __ecereInstance1->kind = 13, __ecereInstance1->__anon1.type = source, __ecereInstance1->refCount = 1, __ecereInstance1;
8260 });
8261 source->refCount++;
8262 }
8263 return type;
8264 }
8265
8266 void ReplaceExpContents(struct Expression * checkedExp, struct Expression * newExp)
8267 {
8268 struct Expression * prev = checkedExp->prev, * next = checkedExp->next;
8269
8270 FreeExpContents(checkedExp);
8271 FreeType(checkedExp->expType);
8272 FreeType(checkedExp->destType);
8273 *checkedExp = *newExp;
8274 ((newExp ? (__ecereClass_Expression->Destructor ? __ecereClass_Expression->Destructor((void *)newExp) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(newExp)) : 0), newExp = 0);
8275 checkedExp->prev = prev;
8276 checkedExp->next = next;
8277 }
8278
8279 void FinishTemplatesContext(struct Context * context)
8280 {
8281 PopContext(context);
8282 FreeContext(context);
8283 ((context ? (__ecereClass_Context->Destructor ? __ecereClass_Context->Destructor((void *)context) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(context)) : 0), context = 0);
8284 }
8285
8286 static __attribute__((unused)) void UnusedFunction()
8287 {
8288 int a;
8289
8290 ((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);
8291 }
8292
8293 struct Expression * ParseExpressionString(char * expression)
8294 {
8295 parseError = 0;
8296 fileInput = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass___ecereNameSpace__ecere__sys__TempFile);
8297 ((int (*)(struct __ecereNameSpace__ecere__com__Instance *, const void *  buffer, unsigned int size, unsigned int count))__extension__ ({
8298 struct __ecereNameSpace__ecere__com__Instance * __internal_ClassInst = fileInput;
8299
8300 __internal_ClassInst ? __internal_ClassInst->_vTbl : __ecereClass___ecereNameSpace__ecere__sys__File->_vTbl;
8301 })[__ecereVMethodID___ecereNameSpace__ecere__sys__File_Write])(fileInput, expression, 1, strlen(expression));
8302 ((unsigned int (*)(struct __ecereNameSpace__ecere__com__Instance *, int pos, int mode))__extension__ ({
8303 struct __ecereNameSpace__ecere__com__Instance * __internal_ClassInst = fileInput;
8304
8305 __internal_ClassInst ? __internal_ClassInst->_vTbl : __ecereClass___ecereNameSpace__ecere__sys__File->_vTbl;
8306 })[__ecereVMethodID___ecereNameSpace__ecere__sys__File_Seek])(fileInput, 0, 0);
8307 echoOn = 0;
8308 parsedExpression = (((void *)0));
8309 resetScanner();
8310 expression_yyparse();
8311 (__ecereNameSpace__ecere__com__eInstance_DecRef(fileInput), fileInput = 0);
8312 return parsedExpression;
8313 }
8314
8315 struct __ecereNameSpace__ecere__com__Module
8316 {
8317 struct __ecereNameSpace__ecere__com__Instance * application;
8318 struct __ecereNameSpace__ecere__sys__OldList classes;
8319 struct __ecereNameSpace__ecere__sys__OldList defines;
8320 struct __ecereNameSpace__ecere__sys__OldList functions;
8321 struct __ecereNameSpace__ecere__sys__OldList modules;
8322 struct __ecereNameSpace__ecere__com__Instance * prev;
8323 struct __ecereNameSpace__ecere__com__Instance * next;
8324 const char *  name;
8325 void *  library;
8326 void *  Unload;
8327 int importType;
8328 int origImportType;
8329 struct __ecereNameSpace__ecere__com__NameSpace privateNameSpace;
8330 struct __ecereNameSpace__ecere__com__NameSpace publicNameSpace;
8331 } __attribute__ ((gcc_struct));
8332
8333 static struct GlobalData * FindGlobalData(char * name)
8334 {
8335 int start = 0, c;
8336 struct __ecereNameSpace__ecere__com__NameSpace * nameSpace;
8337
8338 nameSpace = globalData;
8339 for(c = 0; name[c]; c++)
8340 {
8341 if(name[c] == '.' || (name[c] == ':' && name[c + 1] == ':'))
8342 {
8343 struct __ecereNameSpace__ecere__com__NameSpace * newSpace;
8344 char * spaceName = __ecereNameSpace__ecere__com__eSystem_New(sizeof(char) * (c - start + 1));
8345
8346 strncpy(spaceName, name + start, c - start);
8347 spaceName[c - start] = '\0';
8348 newSpace = (struct __ecereNameSpace__ecere__com__NameSpace *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindString(&(*nameSpace).nameSpaces, spaceName);
8349 (__ecereNameSpace__ecere__com__eSystem_Delete(spaceName), spaceName = 0);
8350 if(!newSpace)
8351 return (((void *)0));
8352 nameSpace = newSpace;
8353 if(name[c] == ':')
8354 c++;
8355 start = c + 1;
8356 }
8357 }
8358 if(c - start)
8359 {
8360 return ScanGlobalData(nameSpace, name + start);
8361 }
8362 return (((void *)0));
8363 }
8364
8365 static struct Symbol * FindWithNameSpace(struct __ecereNameSpace__ecere__sys__BinaryTree * tree, const char * name)
8366 {
8367 int c;
8368 char nameSpace[1024];
8369 const char * namePart;
8370 unsigned int gotColon = 0;
8371
8372 nameSpace[0] = '\0';
8373 for(c = strlen(name) - 1; c >= 0; c--)
8374 if(name[c] == ':')
8375 {
8376 gotColon = 1;
8377 break;
8378 }
8379 namePart = name + c + 1;
8380 while(c >= 0 && name[c] == ':')
8381 c--;
8382 if(c >= 0)
8383 {
8384 struct Symbol * symbol = (struct Symbol *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindString(tree, name);
8385
8386 if(symbol)
8387 return symbol;
8388 memcpy(nameSpace, name, c + 1);
8389 nameSpace[c + 1] = (char)0;
8390 return ScanWithNameSpace(tree, nameSpace, namePart);
8391 }
8392 else if(gotColon)
8393 {
8394 struct Symbol * symbol = (struct Symbol *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindString(tree, namePart);
8395
8396 return symbol;
8397 }
8398 else
8399 {
8400 struct Symbol * symbol = (struct Symbol *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindString(tree, namePart);
8401
8402 if(symbol)
8403 return symbol;
8404 return ScanWithNameSpace(tree, "", namePart);
8405 }
8406 return (((void *)0));
8407 }
8408
8409 static void PrintArraySize(struct Type * arrayType, char * string)
8410 {
8411 char size[256];
8412
8413 size[0] = '\0';
8414 strcat(size, "[");
8415 if(arrayType->__anon1.__anon4.enumClass)
8416 strcat(size, arrayType->__anon1.__anon4.enumClass->string);
8417 else if(arrayType->__anon1.__anon4.arraySizeExp)
8418 PrintExpression(arrayType->__anon1.__anon4.arraySizeExp, size);
8419 strcat(size, "]");
8420 strcat(string, size);
8421 }
8422
8423 void __ecereUnregisterModule_pass15(struct __ecereNameSpace__ecere__com__Instance * module)
8424 {
8425
8426 }
8427
8428 static void PostPrintType(struct Type * type, char * string, unsigned int fullName)
8429 {
8430 if(type->kind == 13 && (type->__anon1.type->kind == 12 || type->__anon1.type->kind == 11 || type->__anon1.type->kind == 16))
8431 strcat(string, ")");
8432 if(type->kind == 12)
8433 PrintArraySize(type, string);
8434 else if(type->kind == 11)
8435 {
8436 struct Type * param;
8437
8438 strcat(string, "(");
8439 for(param = type->__anon1.__anon2.params.first; param; param = param->next)
8440 {
8441 PrintType(param, string, 1, fullName);
8442 if(param->next)
8443 strcat(string, ", ");
8444 }
8445 strcat(string, ")");
8446 }
8447 if(type->kind == 12 || type->kind == 13 || type->kind == 11 || type->kind == 16)
8448 PostPrintType(type->kind == 16 ? type->__anon1.__anon3.method->dataType : type->__anon1.type, string, fullName);
8449 }
8450
8451 static void _PrintType(struct Type * type, char * string, unsigned int printName, unsigned int fullName, unsigned int printConst)
8452 {
8453 PrePrintType(type, string, fullName, (((void *)0)), printConst);
8454 if(type->__anon1.__anon2.thisClass || (printName && type->name && type->name[0]))
8455 strcat(string, " ");
8456 if((type->__anon1.__anon2.thisClass || type->__anon1.__anon2.staticMethod))
8457 {
8458 struct Symbol * _class = type->__anon1.__anon2.thisClass;
8459
8460 if((type->classObjectType == 2 || type->classObjectType == 1) || (_class && !strcmp(_class->string, "class")))
8461 {
8462 if(type->classObjectType == 1)
8463 strcat(string, "class");
8464 else
8465 strcat(string, type->byReference ? "typed_object&" : "typed_object");
8466 }
8467 else if(_class && _class->string)
8468 {
8469 char * s = _class->string;
8470
8471 if(fullName)
8472 strcat(string, s);
8473 else
8474 {
8475 char * name = __ecereNameSpace__ecere__sys__RSearchString(s, "::", strlen(s), 1, 0);
8476
8477 if(name)
8478 name += 2;
8479 else
8480 name = s;
8481 strcat(string, name);
8482 }
8483 }
8484 strcat(string, "::");
8485 }
8486 if(printName && type->name)
8487 PrintName(type, string, fullName);
8488 PostPrintType(type, string, fullName);
8489 if(type->bitFieldCount)
8490 {
8491 char count[100];
8492
8493 sprintf(count, ":%d", type->bitFieldCount);
8494 strcat(string, count);
8495 }
8496 }
8497
8498 struct Conversion;
8499
8500 struct Conversion
8501 {
8502 struct Conversion * prev, * next;
8503 struct __ecereNameSpace__ecere__com__Property * convert;
8504 unsigned int isGet;
8505 struct Type * resultType;
8506 } __attribute__ ((gcc_struct));
8507
8508 static void FreeConvert(struct Conversion * convert)
8509 {
8510 if(convert->resultType)
8511 FreeType(convert->resultType);
8512 }
8513
8514 struct Enumerator;
8515
8516 struct Enumerator
8517 {
8518 struct Enumerator * prev;
8519 struct Enumerator * next;
8520 struct Location loc;
8521 struct Identifier * id;
8522 struct Expression * exp;
8523 } __attribute__ ((gcc_struct));
8524
8525 struct AsmField;
8526
8527 struct AsmField
8528 {
8529 struct AsmField * prev;
8530 struct AsmField * next;
8531 struct Location loc;
8532 char *  command;
8533 struct Expression * expression;
8534 struct Identifier * symbolic;
8535 } __attribute__ ((gcc_struct));
8536
8537 struct ClassDefinition;
8538
8539 struct Context
8540 {
8541 struct Context * parent;
8542 struct __ecereNameSpace__ecere__sys__BinaryTree types;
8543 struct __ecereNameSpace__ecere__sys__BinaryTree classes;
8544 struct __ecereNameSpace__ecere__sys__BinaryTree symbols;
8545 struct __ecereNameSpace__ecere__sys__BinaryTree structSymbols;
8546 int nextID;
8547 int simpleID;
8548 struct __ecereNameSpace__ecere__sys__BinaryTree templateTypes;
8549 struct ClassDefinition * classDef;
8550 unsigned int templateTypesOnly;
8551 unsigned int hasNameSpace;
8552 } __attribute__ ((gcc_struct));
8553
8554 struct External
8555 {
8556 struct External * prev;
8557 struct External * next;
8558 struct Location loc;
8559 int type;
8560 struct Symbol * symbol;
8561 union
8562 {
8563 struct FunctionDefinition * function;
8564 struct ClassDefinition * _class;
8565 struct Declaration * declaration;
8566 char *  importString;
8567 struct Identifier * id;
8568 struct DBTableDef * table;
8569 } __attribute__ ((gcc_struct)) __anon1;
8570 int importType;
8571 struct External * fwdDecl;
8572 struct __ecereNameSpace__ecere__com__Instance * outgoing;
8573 struct __ecereNameSpace__ecere__com__Instance * incoming;
8574 int nonBreakableIncoming;
8575 } __attribute__ ((gcc_struct));
8576
8577 struct ClassDefinition
8578 {
8579 struct ClassDefinition * prev;
8580 struct ClassDefinition * next;
8581 struct Location loc;
8582 struct Specifier * _class;
8583 struct __ecereNameSpace__ecere__sys__OldList *  baseSpecs;
8584 struct __ecereNameSpace__ecere__sys__OldList *  definitions;
8585 struct Symbol * symbol;
8586 struct Location blockStart;
8587 struct Location nameLoc;
8588 int declMode;
8589 unsigned int deleteWatchable;
8590 } __attribute__ ((gcc_struct));
8591
8592 void __ecereMethod_External_CreateUniqueEdge(struct External * this, struct External * from, unsigned int soft);
8593
8594 void __ecereMethod_External_CreateEdge(struct External * this, struct External * from, unsigned int soft);
8595
8596 void DeclareGlobalData(struct External * neededFor, struct GlobalData * data)
8597 {
8598 struct Symbol * symbol = data->symbol;
8599
8600 if(!symbol || !symbol->__anon2.__anon1.pointerExternal)
8601 {
8602 if(inCompiler)
8603 {
8604 if(!symbol)
8605 symbol = data->symbol = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Symbol);
8606 }
8607 if(!data->dataType)
8608 data->dataType = ProcessTypeString(data->dataTypeString, 0);
8609 if(inCompiler)
8610 {
8611 struct Declaration * decl;
8612 struct __ecereNameSpace__ecere__sys__OldList * specifiers, * declarators;
8613 struct Declarator * d;
8614 struct External * external;
8615
8616 specifiers = MkList();
8617 declarators = MkList();
8618 ListAdd(specifiers, MkSpecifier(EXTERN));
8619 d = MkDeclaratorIdentifier(MkIdentifier(data->fullName));
8620 d = SpecDeclFromString(data->dataTypeString, specifiers, d);
8621 ListAdd(declarators, MkInitDeclarator(d, (((void *)0))));
8622 decl = MkDeclaration(specifiers, declarators);
8623 external = MkExternalDeclaration(decl);
8624 if(curExternal)
8625 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*ast), curExternal->prev, external);
8626 external->symbol = symbol;
8627 symbol->__anon2.__anon1.pointerExternal = external;
8628 DeclareType(external, data->dataType, 1, 1);
8629 }
8630 }
8631 if(inCompiler && neededFor && symbol && symbol->__anon2.__anon1.pointerExternal)
8632 __ecereMethod_External_CreateUniqueEdge(neededFor, symbol->__anon2.__anon1.pointerExternal, 0);
8633 }
8634
8635 struct Symbol * FindSymbol(const char * name, struct Context * startContext, struct Context * endContext, unsigned int isStruct, unsigned int globalNameSpace)
8636 {
8637 struct Context * ctx;
8638 struct Symbol * symbol = (((void *)0));
8639
8640 for(ctx = startContext; ctx && !symbol; ctx = ctx->parent)
8641 {
8642 if(ctx == globalContext && !globalNameSpace && ctx->hasNameSpace)
8643 {
8644 symbol = (((void *)0));
8645 if(thisNameSpace)
8646 {
8647 char curName[1024];
8648
8649 strcpy(curName, thisNameSpace);
8650 strcat(curName, "::");
8651 strcat(curName, name);
8652 symbol = FindWithNameSpace(isStruct ? &ctx->structSymbols : &ctx->symbols, curName);
8653 }
8654 if(!symbol)
8655 symbol = FindWithNameSpace(isStruct ? &ctx->structSymbols : &ctx->symbols, name);
8656 }
8657 else
8658 symbol = (struct Symbol *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindString((isStruct ? &ctx->structSymbols : &ctx->symbols), name);
8659 if(symbol || ctx == endContext)
8660 break;
8661 }
8662 if(inCompiler && symbol && ctx == globalContext && symbol->__anon2.__anon1.pointerExternal && curExternal && symbol->__anon2.__anon1.pointerExternal != curExternal)
8663 __ecereMethod_External_CreateUniqueEdge(curExternal, symbol->__anon2.__anon1.pointerExternal, symbol->__anon2.__anon1.pointerExternal->type == 0);
8664 return symbol;
8665 }
8666
8667 struct PropertyDef;
8668
8669 struct ClassDef
8670 {
8671 struct ClassDef * prev;
8672 struct ClassDef * next;
8673 struct Location loc;
8674 int type;
8675 union
8676 {
8677 struct Declaration * decl;
8678 struct ClassFunction * function;
8679 struct __ecereNameSpace__ecere__sys__OldList *  defProperties;
8680 struct PropertyDef * propertyDef;
8681 struct PropertyWatch * propertyWatch;
8682 char *  designer;
8683 struct Identifier * defaultProperty;
8684 struct
8685 {
8686 struct Identifier * id;
8687 struct Initializer * initializer;
8688 } __attribute__ ((gcc_struct)) __anon1;
8689 } __attribute__ ((gcc_struct)) __anon1;
8690 int memberAccess;
8691 void *  object;
8692 } __attribute__ ((gcc_struct));
8693
8694 struct PropertyDef
8695 {
8696 struct PropertyDef * prev;
8697 struct PropertyDef * next;
8698 struct Location loc;
8699 struct __ecereNameSpace__ecere__sys__OldList *  specifiers;
8700 struct Declarator * declarator;
8701 struct Identifier * id;
8702 struct Statement * getStmt;
8703 struct Statement * setStmt;
8704 struct Statement * issetStmt;
8705 struct Symbol * symbol;
8706 struct Expression * category;
8707 struct
8708 {
8709 unsigned int conversion : 1;
8710 unsigned int isWatchable : 1;
8711 unsigned int isDBProp : 1;
8712 } __attribute__ ((gcc_struct)) __anon1;
8713 } __attribute__ ((gcc_struct));
8714
8715 static void IdentifyAnonStructs(struct __ecereNameSpace__ecere__sys__OldList * definitions)
8716 {
8717 struct ClassDef * def;
8718 int anonID = 1;
8719
8720 for(def = (*definitions).first; def; def = def->next)
8721 {
8722 if(def->type == 2)
8723 {
8724 struct Declaration * decl = def->__anon1.decl;
8725
8726 if(decl && decl->__anon1.__anon1.specifiers)
8727 {
8728 struct Specifier * spec;
8729 unsigned int isStruct = 0;
8730
8731 for(spec = (*decl->__anon1.__anon1.specifiers).first; spec; spec = spec->next)
8732 {
8733 if(spec->type == 3 || spec->type == 4)
8734 {
8735 if(spec->__anon1.__anon2.definitions)
8736 IdentifyAnonStructs(spec->__anon1.__anon2.definitions);
8737 isStruct = 1;
8738 }
8739 }
8740 if(isStruct)
8741 {
8742 struct Declarator * d = (((void *)0));
8743
8744 if(decl->__anon1.__anon1.declarators)
8745 {
8746 for(d = (*decl->__anon1.__anon1.declarators).first; d; d = d->next)
8747 {
8748 struct Identifier * idDecl = GetDeclId(d);
8749
8750 if(idDecl)
8751 break;
8752 }
8753 }
8754 if(!d)
8755 {
8756 char id[100];
8757
8758 sprintf(id, "__anon%d", anonID++);
8759 if(!decl->__anon1.__anon1.declarators)
8760 decl->__anon1.__anon1.declarators = MkList();
8761 ListAdd(decl->__anon1.__anon1.declarators, MkDeclaratorIdentifier(MkIdentifier(id)));
8762 }
8763 }
8764 }
8765 }
8766 }
8767 }
8768
8769 struct MemberInit;
8770
8771 typedef union YYSTYPE
8772 {
8773 int specifierType;
8774 int i;
8775 int declMode;
8776 struct Identifier * id;
8777 struct Expression * exp;
8778 struct Specifier * specifier;
8779 struct __ecereNameSpace__ecere__sys__OldList * list;
8780 struct Enumerator * enumerator;
8781 struct Declarator * declarator;
8782 struct Pointer * pointer;
8783 struct Initializer * initializer;
8784 struct InitDeclarator * initDeclarator;
8785 struct TypeName * typeName;
8786 struct Declaration * declaration;
8787 struct Statement * stmt;
8788 struct FunctionDefinition * function;
8789 struct External * external;
8790 struct Context * context;
8791 struct AsmField * asmField;
8792 struct Attrib * attrib;
8793 struct ExtDecl * extDecl;
8794 struct Attribute * attribute;
8795 struct Instantiation * instance;
8796 struct MembersInit * membersInit;
8797 struct MemberInit * memberInit;
8798 struct ClassFunction * classFunction;
8799 struct ClassDefinition * _class;
8800 struct ClassDef * classDef;
8801 struct PropertyDef * prop;
8802 char * string;
8803 struct Symbol * symbol;
8804 struct PropertyWatch * propertyWatch;
8805 struct TemplateParameter * templateParameter;
8806 struct TemplateArgument * templateArgument;
8807 struct TemplateDatatype * templateDatatype;
8808 struct DBTableEntry * dbtableEntry;
8809 struct DBIndexItem * dbindexItem;
8810 struct DBTableDef * dbtableDef;
8811 } __attribute__ ((gcc_struct)) YYSTYPE;
8812
8813 extern YYSTYPE yylval;
8814
8815 struct MemberInit
8816 {
8817 struct MemberInit * prev;
8818 struct MemberInit * next;
8819 struct Location loc;
8820 struct Location realLoc;
8821 struct __ecereNameSpace__ecere__sys__OldList *  identifiers;
8822 struct Initializer * initializer;
8823 unsigned int used;
8824 unsigned int variable;
8825 unsigned int takeOutExp;
8826 } __attribute__ ((gcc_struct));
8827
8828 extern struct MemberInit * MkMemberInit(struct __ecereNameSpace__ecere__sys__OldList * ids, struct Initializer * initializer);
8829
8830 struct __ecereNameSpace__ecere__com__ClassTemplateParameter;
8831
8832 struct __ecereNameSpace__ecere__com__ClassTemplateParameter
8833 {
8834 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * prev;
8835 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * next;
8836 const char *  name;
8837 int type;
8838 union
8839 {
8840 const char *  dataTypeString;
8841 int memberType;
8842 } __attribute__ ((gcc_struct)) __anon1;
8843 struct __ecereNameSpace__ecere__com__ClassTemplateArgument defaultArg;
8844 void *  param;
8845 } __attribute__ ((gcc_struct));
8846
8847 struct __ecereNameSpace__ecere__com__ClassTemplateArgument * FindTemplateArg(struct __ecereNameSpace__ecere__com__Class * _class, struct TemplateParameter * param)
8848 {
8849 struct __ecereNameSpace__ecere__com__ClassTemplateArgument * arg = (((void *)0));
8850 int id = 0;
8851 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * curParam = (((void *)0));
8852 struct __ecereNameSpace__ecere__com__Class * sClass;
8853
8854 for(sClass = _class; sClass; sClass = sClass->base)
8855 {
8856 id = 0;
8857 if(sClass->templateClass)
8858 sClass = sClass->templateClass;
8859 for(curParam = sClass->templateParams.first; curParam; curParam = curParam->next)
8860 {
8861 if(curParam->type == 0 && !strcmp(param->identifier->string, curParam->name))
8862 {
8863 for(sClass = sClass->base; sClass; sClass = sClass->base)
8864 {
8865 if(sClass->templateClass)
8866 sClass = sClass->templateClass;
8867 id += sClass->templateParams.count;
8868 }
8869 break;
8870 }
8871 id++;
8872 }
8873 if(curParam)
8874 break;
8875 }
8876 if(curParam)
8877 {
8878 arg = &_class->templateArgs[id];
8879 if(arg && param->type == 0)
8880 (*arg).__anon1.__anon1.dataTypeClass = __ecereNameSpace__ecere__com__eSystem_FindClass(_class->module, (*arg).__anon1.__anon1.dataTypeString);
8881 }
8882 return arg;
8883 }
8884
8885 struct Context * SetupTemplatesContext(struct __ecereNameSpace__ecere__com__Class * _class)
8886 {
8887 struct Context * context = PushContext();
8888
8889 context->templateTypesOnly = 1;
8890 if(_class->symbol && ((struct Symbol *)_class->symbol)->templateParams)
8891 {
8892 struct TemplateParameter * param = (*((struct Symbol *)_class->symbol)->templateParams).first;
8893
8894 for(; param; param = param->next)
8895 {
8896 if(param->type == 0 && param->identifier)
8897 {
8898 struct TemplatedType * type = (type = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_TemplatedType), type->key = (uintptr_t)param->identifier->string, type->param = param, type);
8899
8900 __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Add(&curContext->templateTypes, (struct __ecereNameSpace__ecere__sys__BTNode *)type);
8901 }
8902 }
8903 }
8904 else if(_class)
8905 {
8906 struct __ecereNameSpace__ecere__com__Class * sClass;
8907
8908 for(sClass = _class; sClass; sClass = sClass->base)
8909 {
8910 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * p;
8911
8912 for(p = sClass->templateParams.first; p; p = p->next)
8913 {
8914 if(p->type == 0)
8915 {
8916 struct TemplateParameter * param = p->param;
8917 struct TemplatedType * type;
8918
8919 if(!param)
8920 {
8921 p->param = param = __extension__ ({
8922 struct TemplateParameter * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_TemplateParameter);
8923
8924 __ecereInstance1->identifier = MkIdentifier(p->name), __ecereInstance1->type = p->type, __ecereInstance1->dataTypeString = p->__anon1.dataTypeString, __ecereInstance1;
8925 });
8926 }
8927 type = __extension__ ({
8928 struct TemplatedType * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_TemplatedType);
8929
8930 __ecereInstance1->key = (uintptr_t)p->name, __ecereInstance1->param = param, __ecereInstance1;
8931 });
8932 __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Add(&curContext->templateTypes, (struct __ecereNameSpace__ecere__sys__BTNode *)type);
8933 }
8934 }
8935 }
8936 }
8937 return context;
8938 }
8939
8940 char * ReplaceThisClass(struct __ecereNameSpace__ecere__com__Class * _class)
8941 {
8942 if(thisClassParams && _class->templateParams.count && !_class->templateClass)
8943 {
8944 unsigned int first = 1;
8945 int p = 0;
8946 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * param;
8947 int lastParam = -1;
8948 char className[1024];
8949
8950 strcpy(className, _class->fullName);
8951 for(param = _class->templateParams.first; param; param = param->next)
8952 {
8953 {
8954 if(first)
8955 strcat(className, "<");
8956 if(!first)
8957 strcat(className, ", ");
8958 if(lastParam + 1 != p)
8959 {
8960 strcat(className, param->name);
8961 strcat(className, " = ");
8962 }
8963 strcat(className, param->name);
8964 first = 0;
8965 lastParam = p;
8966 }
8967 p++;
8968 }
8969 if(!first)
8970 {
8971 int len = strlen(className);
8972
8973 if(className[len - 1] == '>')
8974 className[len++] = ' ';
8975 className[len++] = '>';
8976 className[len++] = '\0';
8977 }
8978 return __ecereNameSpace__ecere__sys__CopyString(className);
8979 }
8980 else
8981 return __ecereNameSpace__ecere__sys__CopyString(_class->fullName);
8982 }
8983
8984 struct Type * ReplaceThisClassType(struct __ecereNameSpace__ecere__com__Class * _class)
8985 {
8986 struct Type * type;
8987
8988 if(thisClassParams && _class->templateParams.count && !_class->templateClass)
8989 {
8990 unsigned int first = 1;
8991 int p = 0;
8992 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * param;
8993 int lastParam = -1;
8994 char className[1024];
8995
8996 strcpy(className, _class->fullName);
8997 for(param = _class->templateParams.first; param; param = param->next)
8998 {
8999 {
9000 if(first)
9001 strcat(className, "<");
9002 if(!first)
9003 strcat(className, ", ");
9004 if(lastParam + 1 != p)
9005 {
9006 strcat(className, param->name);
9007 strcat(className, " = ");
9008 }
9009 strcat(className, param->name);
9010 first = 0;
9011 lastParam = p;
9012 }
9013 p++;
9014 }
9015 if(!first)
9016 {
9017 int len = strlen(className);
9018
9019 if(className[len - 1] == '>')
9020 className[len++] = ' ';
9021 className[len++] = '>';
9022 className[len++] = '\0';
9023 }
9024 type = MkClassType(className);
9025 }
9026 else
9027 {
9028 type = MkClassType(_class->fullName);
9029 }
9030 return type;
9031 }
9032
9033 static int DeclareMembers(struct External * neededBy, struct __ecereNameSpace__ecere__com__Class * _class, unsigned int isMember)
9034 {
9035 struct __ecereNameSpace__ecere__com__DataMember * topMember = isMember ? (struct __ecereNameSpace__ecere__com__DataMember *)_class : (((void *)0));
9036 struct __ecereNameSpace__ecere__com__DataMember * member;
9037 struct Context * context = isMember ? (((void *)0)) : SetupTemplatesContext(_class);
9038
9039 if(!isMember && (_class->type == 1 || _class->type == 5) && _class->base->type != 1000)
9040 DeclareMembers(neededBy, _class->base, 0);
9041 for(member = isMember ? topMember->members.first : _class->membersAndProperties.first; member; member = member->next)
9042 {
9043 if(!member->isProperty)
9044 {
9045 switch(member->type)
9046 {
9047 case 0:
9048 {
9049 if(!member->dataType && member->dataTypeString)
9050 member->dataType = ProcessTypeString(member->dataTypeString, 0);
9051 if(member->dataType)
9052 DeclareType(neededBy, member->dataType, 1, 0);
9053 break;
9054 }
9055 case 1:
9056 case 2:
9057 {
9058 DeclareMembers(neededBy, (struct __ecereNameSpace__ecere__com__Class *)member, 1);
9059 break;
9060 }
9061 }
9062 }
9063 }
9064 if(context)
9065 FinishTemplatesContext(context);
9066 return topMember ? topMember->memberID : _class->memberID;
9067 }
9068
9069 void ProcessMethodType(struct __ecereNameSpace__ecere__com__Method * method)
9070 {
9071 if(!method->dataType)
9072 {
9073 struct Context * context = SetupTemplatesContext(method->_class);
9074
9075 method->dataType = ProcessTypeString(method->dataTypeString, 0);
9076 FinishTemplatesContext(context);
9077 if(method->type != 1 && method->dataType)
9078 {
9079 if(!method->dataType->__anon1.__anon2.thisClass && !method->dataType->__anon1.__anon2.staticMethod)
9080 {
9081 if(!method->_class->symbol)
9082 method->_class->symbol = FindClass(method->_class->fullName);
9083 method->dataType->__anon1.__anon2.thisClass = method->_class->symbol;
9084 }
9085 }
9086 }
9087 }
9088
9089 void ProcessPropertyType(struct __ecereNameSpace__ecere__com__Property * prop)
9090 {
9091 if(!prop->dataType)
9092 {
9093 struct Context * context = SetupTemplatesContext(prop->_class);
9094
9095 prop->dataType = ProcessTypeString(prop->dataTypeString, 0);
9096 FinishTemplatesContext(context);
9097 }
9098 }
9099
9100 void ReplaceThisClassSpecifiers(struct __ecereNameSpace__ecere__sys__OldList * specs, struct __ecereNameSpace__ecere__com__Class * _class)
9101 {
9102 if(specs != (((void *)0)) && _class)
9103 {
9104 struct Specifier * spec;
9105
9106 for(spec = specs->first; spec; spec = spec->next)
9107 {
9108 if(spec->type == 0 && spec->__anon1.specifier == THISCLASS)
9109 {
9110 spec->type = 1;
9111 spec->__anon1.__anon1.name = ReplaceThisClass(_class);
9112 spec->__anon1.__anon1.symbol = FindClass(spec->__anon1.__anon1.name);
9113 }
9114 }
9115 }
9116 }
9117
9118 static unsigned int ResolveIdWithClass(struct Expression * exp, struct __ecereNameSpace__ecere__com__Class * _class, unsigned int skipIDClassCheck)
9119 {
9120 struct Identifier * id = exp->__anon1.__anon1.identifier;
9121 struct __ecereNameSpace__ecere__com__Method * method = (((void *)0));
9122 struct __ecereNameSpace__ecere__com__Property * prop = (((void *)0));
9123 struct __ecereNameSpace__ecere__com__DataMember * member = (((void *)0));
9124 struct __ecereNameSpace__ecere__com__ClassProperty * classProp = (((void *)0));
9125
9126 if(_class && _class->type == 4)
9127 {
9128 struct __ecereNameSpace__ecere__sys__NamedLink64 * value = (((void *)0));
9129 struct __ecereNameSpace__ecere__com__Class * enumClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "enum");
9130
9131 if(enumClass)
9132 {
9133 struct __ecereNameSpace__ecere__com__Class * baseClass;
9134
9135 for(baseClass = _class; baseClass && baseClass->type == 4; baseClass = baseClass->base)
9136 {
9137 struct __ecereNameSpace__ecere__com__EnumClassData * e = (baseClass ? ((void *)(((char *)baseClass->data) + enumClass->offsetClass)) : (((void *)0)));
9138
9139 for(value = e->values.first; value; value = value->next)
9140 {
9141 if(!strcmp(value->name, id->string))
9142 break;
9143 }
9144 if(value)
9145 {
9146 exp->isConstant = 1;
9147 if(inCompiler || inPreCompiler || inDebugger)
9148 {
9149 char constant[256];
9150
9151 FreeExpContents(exp);
9152 exp->type = 2;
9153 if(!strcmp(baseClass->dataTypeString, "int") || !strcmp(baseClass->dataTypeString, "int64") || !strcmp(baseClass->dataTypeString, "char") || !strcmp(baseClass->dataTypeString, "short"))
9154 sprintf(constant, ((__runtimePlatform == 1) ? "%I64d" : "%lld"), value->data);
9155 else
9156 sprintf(constant, ((__runtimePlatform == 1) ? "0x%I64X" : "0x%llX"), value->data);
9157 exp->__anon1.__anon1.constant = __ecereNameSpace__ecere__sys__CopyString(constant);
9158 }
9159 exp->expType = MkClassType(baseClass->fullName);
9160 break;
9161 }
9162 }
9163 }
9164 if(value)
9165 return 1;
9166 }
9167 if((method = __ecereNameSpace__ecere__com__eClass_FindMethod(_class, id->string, privateModule)))
9168 {
9169 ProcessMethodType(method);
9170 exp->expType = __extension__ ({
9171 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
9172
9173 __ecereInstance1->refCount = 1, __ecereInstance1->kind = 16, __ecereInstance1->__anon1.__anon3.method = method, __ecereInstance1->__anon1.__anon3.methodClass = (skipIDClassCheck || (id && id->_class)) ? _class : (((void *)0)), __ecereInstance1;
9174 });
9175 return 1;
9176 }
9177 else if((prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, id->string, privateModule)))
9178 {
9179 if(!prop->dataType)
9180 ProcessPropertyType(prop);
9181 exp->expType = prop->dataType;
9182 if(prop->dataType)
9183 prop->dataType->refCount++;
9184 return 1;
9185 }
9186 else if((member = __ecereNameSpace__ecere__com__eClass_FindDataMember(_class, id->string, privateModule, (((void *)0)), (((void *)0)))))
9187 {
9188 if(!member->dataType)
9189 member->dataType = ProcessTypeString(member->dataTypeString, 0);
9190 exp->expType = member->dataType;
9191 if(member->dataType)
9192 member->dataType->refCount++;
9193 return 1;
9194 }
9195 else if((classProp = __ecereNameSpace__ecere__com__eClass_FindClassProperty(_class, id->string)))
9196 {
9197 if(!classProp->dataType)
9198 classProp->dataType = ProcessTypeString(classProp->dataTypeString, 0);
9199 if(classProp->constant)
9200 {
9201 FreeExpContents(exp);
9202 exp->isConstant = 1;
9203 if(classProp->dataType->kind == 13 && classProp->dataType->__anon1.type->kind == 1)
9204 {
9205 exp->type = 3;
9206 exp->__anon1.__anon1.constant = QMkString((char *)(uintptr_t)classProp->Get(_class));
9207 }
9208 else
9209 {
9210 char constant[256];
9211
9212 exp->type = 2;
9213 sprintf(constant, "%d", (int)classProp->Get(_class));
9214 exp->__anon1.__anon1.constant = __ecereNameSpace__ecere__sys__CopyString(constant);
9215 }
9216 }
9217 else
9218 {
9219 }
9220 exp->expType = classProp->dataType;
9221 if(classProp->dataType)
9222 classProp->dataType->refCount++;
9223 return 1;
9224 }
9225 return 0;
9226 }
9227
9228 void DeclareProperty(struct External * neededBy, struct __ecereNameSpace__ecere__com__Property * prop, char * setName, char * getName)
9229 {
9230 struct Symbol * symbol = prop->symbol;
9231 unsigned int imported = 0;
9232 unsigned int dllImport = 0;
9233 struct External * structExternal = (((void *)0));
9234 struct External * instExternal = (((void *)0));
9235
9236 strcpy(setName, "__ecereProp_");
9237 FullClassNameCat(setName, prop->_class->fullName, 0);
9238 strcat(setName, "_Set_");
9239 FullClassNameCat(setName, prop->name, 1);
9240 strcpy(getName, "__ecereProp_");
9241 FullClassNameCat(getName, prop->_class->fullName, 0);
9242 strcat(getName, "_Get_");
9243 FullClassNameCat(getName, prop->name, 1);
9244 if(!symbol || symbol->_import)
9245 {
9246 if(!symbol)
9247 {
9248 struct Symbol * classSym;
9249
9250 if(!prop->_class->symbol)
9251 prop->_class->symbol = FindClass(prop->_class->fullName);
9252 classSym = prop->_class->symbol;
9253 if(classSym && !classSym->_import)
9254 {
9255 struct ModuleImport * module;
9256
9257 if(prop->_class->module)
9258 module = FindModule(prop->_class->module);
9259 else
9260 module = mainModule;
9261 classSym->_import = __extension__ ({
9262 struct ClassImport * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_ClassImport);
9263
9264 __ecereInstance1->name = __ecereNameSpace__ecere__sys__CopyString(prop->_class->fullName), __ecereInstance1->isRemote = prop->_class->isRemote, __ecereInstance1;
9265 });
9266 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(&module->classes, classSym->_import);
9267 }
9268 symbol = prop->symbol = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Symbol);
9269 symbol->_import = (struct ClassImport *)__extension__ ({
9270 struct PropertyImport * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_PropertyImport);
9271
9272 __ecereInstance1->name = __ecereNameSpace__ecere__sys__CopyString(prop->name), __ecereInstance1->isVirtual = 0, __ecereInstance1->hasSet = prop->Set ? 1 : 0, __ecereInstance1->hasGet = prop->Get ? 1 : 0, __ecereInstance1;
9273 });
9274 if(classSym)
9275 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(&classSym->_import->properties, symbol->_import);
9276 }
9277 imported = 1;
9278 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)
9279 dllImport = 1;
9280 }
9281 if(!symbol->type)
9282 {
9283 struct Context * context = SetupTemplatesContext(prop->_class);
9284
9285 symbol->type = ProcessTypeString(prop->dataTypeString, 0);
9286 FinishTemplatesContext(context);
9287 }
9288 if((prop->Get && !symbol->__anon2.__anon2.externalGet) || (prop->Set && !symbol->__anon2.__anon2.externalSet))
9289 {
9290 if(prop->_class->type == 0 && prop->_class->structSize)
9291 instExternal = DeclareStruct((((void *)0)), "ecere::com::Instance", 0, 1);
9292 structExternal = DeclareStruct((((void *)0)), prop->_class->fullName, prop->_class->type != 1, 0);
9293 }
9294 if(prop->Get && !symbol->__anon2.__anon2.externalGet)
9295 {
9296 struct Declaration * decl;
9297 struct __ecereNameSpace__ecere__sys__OldList * specifiers, * declarators;
9298 struct Declarator * d;
9299 struct __ecereNameSpace__ecere__sys__OldList * params;
9300 struct Specifier * spec = (((void *)0));
9301 struct External * external;
9302 struct Declarator * typeDecl;
9303 unsigned int simple = 0;
9304 unsigned int needReference;
9305
9306 specifiers = MkList();
9307 declarators = MkList();
9308 params = MkList();
9309 ListAdd(params, MkTypeName(MkListOne(MkSpecifierName(prop->_class->fullName)), MkDeclaratorIdentifier(MkIdentifier("this"))));
9310 d = MkDeclaratorIdentifier(MkIdentifier(getName));
9311 if(dllImport)
9312 d = MkDeclaratorBrackets(MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), d));
9313 {
9314 struct Context * context = SetupTemplatesContext(prop->_class);
9315
9316 typeDecl = SpecDeclFromString(prop->dataTypeString, specifiers, (((void *)0)));
9317 FinishTemplatesContext(context);
9318 }
9319 needReference = !typeDecl || typeDecl->type == 1;
9320 for(spec = (*specifiers).first; spec; spec = spec->next)
9321 {
9322 if(spec->type == 1)
9323 {
9324 struct Symbol * classSym = spec->__anon1.__anon1.symbol;
9325
9326 if(needReference)
9327 {
9328 symbol->_class = classSym->__anon1.registered;
9329 if(classSym->__anon1.registered && classSym->__anon1.registered->type == 1)
9330 simple = 1;
9331 }
9332 break;
9333 }
9334 }
9335 if(!simple)
9336 d = PlugDeclarator(typeDecl, d);
9337 else
9338 {
9339 ListAdd(params, MkTypeName(specifiers, PlugDeclarator(typeDecl, MkDeclaratorIdentifier(MkIdentifier("value")))));
9340 specifiers = MkList();
9341 }
9342 d = MkDeclaratorFunction(d, params);
9343 if(dllImport)
9344 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*specifiers), (((void *)0)), MkSpecifier(EXTERN));
9345 else if(prop->_class->symbol && ((struct Symbol *)prop->_class->symbol)->isStatic)
9346 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*specifiers), (((void *)0)), MkSpecifier(STATIC));
9347 if(simple)
9348 ListAdd(specifiers, MkSpecifier(VOID));
9349 ListAdd(declarators, MkInitDeclarator(d, (((void *)0))));
9350 decl = MkDeclaration(specifiers, declarators);
9351 external = MkExternalDeclaration(decl);
9352 if(structExternal)
9353 __ecereMethod_External_CreateEdge(external, structExternal, 0);
9354 if(instExternal)
9355 __ecereMethod_External_CreateEdge(external, instExternal, 0);
9356 if(spec)
9357 DeclareStruct(external, spec->__anon1.__anon1.name, 0, needReference);
9358 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add((&*ast), external);
9359 external->symbol = symbol;
9360 symbol->__anon2.__anon2.externalGet = external;
9361 ReplaceThisClassSpecifiers(specifiers, prop->_class);
9362 if(typeDecl)
9363 FreeDeclarator(typeDecl);
9364 }
9365 if(prop->Set && !symbol->__anon2.__anon2.externalSet)
9366 {
9367 struct Declaration * decl;
9368 struct __ecereNameSpace__ecere__sys__OldList * specifiers, * declarators;
9369 struct Declarator * d;
9370 struct __ecereNameSpace__ecere__sys__OldList * params;
9371 struct Specifier * spec = (((void *)0));
9372 struct External * external;
9373 struct Declarator * typeDecl;
9374 unsigned int needReference;
9375
9376 declarators = MkList();
9377 params = MkList();
9378 if(!prop->conversion || prop->_class->type == 1)
9379 {
9380 ListAdd(params, MkTypeName(MkListOne(MkSpecifierName(prop->_class->fullName)), MkDeclaratorIdentifier(MkIdentifier("this"))));
9381 }
9382 specifiers = MkList();
9383 {
9384 struct Context * context = SetupTemplatesContext(prop->_class);
9385
9386 typeDecl = d = SpecDeclFromString(prop->dataTypeString, specifiers, MkDeclaratorIdentifier(MkIdentifier("value")));
9387 FinishTemplatesContext(context);
9388 }
9389 if(!strcmp(prop->_class->base->fullName, "eda::Row") || !strcmp(prop->_class->base->fullName, "eda::Id"))
9390 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*specifiers), (((void *)0)), MkSpecifier(CONST));
9391 ListAdd(params, MkTypeName(specifiers, d));
9392 d = MkDeclaratorIdentifier(MkIdentifier(setName));
9393 if(dllImport)
9394 d = MkDeclaratorBrackets(MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), d));
9395 d = MkDeclaratorFunction(d, params);
9396 needReference = !typeDecl || typeDecl->type == 1;
9397 for(spec = (*specifiers).first; spec; spec = spec->next)
9398 {
9399 if(spec->type == 1)
9400 {
9401 struct Symbol * classSym = spec->__anon1.__anon1.symbol;
9402
9403 if(needReference)
9404 symbol->_class = classSym->__anon1.registered;
9405 break;
9406 }
9407 }
9408 ListAdd(declarators, MkInitDeclarator(d, (((void *)0))));
9409 specifiers = MkList();
9410 if(dllImport)
9411 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*specifiers), (((void *)0)), MkSpecifier(EXTERN));
9412 else if(prop->_class->symbol && ((struct Symbol *)prop->_class->symbol)->isStatic)
9413 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*specifiers), (((void *)0)), MkSpecifier(STATIC));
9414 if(!prop->conversion || prop->_class->type == 1)
9415 ListAdd(specifiers, MkSpecifier(VOID));
9416 else
9417 ListAdd(specifiers, MkSpecifierName(prop->_class->fullName));
9418 decl = MkDeclaration(specifiers, declarators);
9419 external = MkExternalDeclaration(decl);
9420 if(structExternal)
9421 __ecereMethod_External_CreateEdge(external, structExternal, 0);
9422 if(instExternal)
9423 __ecereMethod_External_CreateEdge(external, instExternal, 0);
9424 if(spec)
9425 DeclareStruct(external, spec->__anon1.__anon1.name, 0, needReference);
9426 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add((&*ast), external);
9427 external->symbol = symbol;
9428 symbol->__anon2.__anon2.externalSet = external;
9429 ReplaceThisClassSpecifiers(specifiers, prop->_class);
9430 }
9431 if(!symbol->__anon2.__anon2.externalPtr)
9432 {
9433 struct Declaration * decl;
9434 struct External * external;
9435 struct __ecereNameSpace__ecere__sys__OldList * specifiers = MkList();
9436 char propName[1024];
9437
9438 if(imported)
9439 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*specifiers), (((void *)0)), MkSpecifier(EXTERN));
9440 else
9441 {
9442 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*specifiers), (((void *)0)), MkSpecifier(STATIC));
9443 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add((&*specifiers), MkSpecifierExtended(MkExtDeclAttrib(MkAttrib(ATTRIB, MkListOne(MkAttribute(__ecereNameSpace__ecere__sys__CopyString("unused"), (((void *)0))))))));
9444 }
9445 ListAdd(specifiers, MkSpecifierName("Property"));
9446 strcpy(propName, "__ecereProp_");
9447 FullClassNameCat(propName, prop->_class->fullName, 0);
9448 strcat(propName, "_");
9449 FullClassNameCat(propName, prop->name, 1);
9450 {
9451 struct __ecereNameSpace__ecere__sys__OldList * list = MkList();
9452
9453 ListAdd(list, MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier(propName)), (((void *)0))));
9454 if(!imported)
9455 {
9456 strcpy(propName, "__ecerePropM_");
9457 FullClassNameCat(propName, prop->_class->fullName, 0);
9458 strcat(propName, "_");
9459 FullClassNameCat(propName, prop->name, 1);
9460 ListAdd(list, MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier(propName)), (((void *)0))));
9461 }
9462 decl = MkDeclaration(specifiers, list);
9463 }
9464 external = MkExternalDeclaration(decl);
9465 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*ast), curExternal->prev, external);
9466 external->symbol = symbol;
9467 symbol->__anon2.__anon2.externalPtr = external;
9468 }
9469 if(inCompiler && neededBy)
9470 {
9471 if(symbol->__anon2.__anon2.externalPtr)
9472 __ecereMethod_External_CreateUniqueEdge(neededBy, symbol->__anon2.__anon2.externalPtr, 0);
9473 if(symbol->__anon2.__anon2.externalGet)
9474 __ecereMethod_External_CreateUniqueEdge(neededBy, symbol->__anon2.__anon2.externalGet, symbol->__anon2.__anon2.externalGet->type == 0);
9475 if(symbol->__anon2.__anon2.externalSet)
9476 __ecereMethod_External_CreateUniqueEdge(neededBy, symbol->__anon2.__anon2.externalSet, symbol->__anon2.__anon2.externalSet->type == 0);
9477 }
9478 }
9479
9480 static void ProcessDeclarator(struct Declarator *  decl, unsigned int isFunction);
9481
9482 void DeclareMethod(struct External * neededFor, struct __ecereNameSpace__ecere__com__Method * method, const char * name)
9483 {
9484 struct Symbol * symbol = method->symbol;
9485
9486 if(!symbol || (!symbol->__anon2.__anon1.pointerExternal && (!symbol->__anon2.__anon3.methodCodeExternal || method->type == 1)))
9487 {
9488 unsigned int dllImport = 0;
9489
9490 if(!method->dataType)
9491 method->dataType = ProcessTypeString(method->dataTypeString, 0);
9492 {
9493 if(!symbol || method->type == 1)
9494 {
9495 struct Symbol * classSym;
9496
9497 if(!method->_class->symbol)
9498 method->_class->symbol = FindClass(method->_class->fullName);
9499 classSym = method->_class->symbol;
9500 if(!classSym->_import)
9501 {
9502 struct ModuleImport * module;
9503
9504 if(method->_class->module && ((struct __ecereNameSpace__ecere__com__Module *)(((char *)method->_class->module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->name)
9505 module = FindModule(method->_class->module);
9506 else
9507 module = mainModule;
9508 classSym->_import = __extension__ ({
9509 struct ClassImport * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_ClassImport);
9510
9511 __ecereInstance1->name = __ecereNameSpace__ecere__sys__CopyString(method->_class->fullName), __ecereInstance1->isRemote = method->_class->isRemote, __ecereInstance1;
9512 });
9513 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(&module->classes, classSym->_import);
9514 }
9515 if(!symbol)
9516 {
9517 symbol = method->symbol = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Symbol);
9518 }
9519 if(!symbol->_import)
9520 {
9521 symbol->_import = (struct ClassImport *)__extension__ ({
9522 struct MethodImport * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_MethodImport);
9523
9524 __ecereInstance1->name = __ecereNameSpace__ecere__sys__CopyString(method->name), __ecereInstance1->isVirtual = method->type == 1, __ecereInstance1;
9525 });
9526 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(&classSym->_import->methods, symbol->_import);
9527 }
9528 if(!symbol)
9529 {
9530 symbol->type = method->dataType;
9531 if(symbol->type)
9532 symbol->type->refCount++;
9533 }
9534 }
9535 if(!method->dataType->dllExport)
9536 {
9537 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)
9538 dllImport = 1;
9539 }
9540 }
9541 if(inCompiler)
9542 {
9543 struct Declaration * decl;
9544 struct __ecereNameSpace__ecere__sys__OldList * specifiers, * declarators;
9545 struct Declarator * d;
9546 struct Declarator * funcDecl;
9547 struct External * external;
9548
9549 specifiers = MkList();
9550 declarators = MkList();
9551 if(dllImport)
9552 ListAdd(specifiers, MkSpecifier(EXTERN));
9553 else if(method->_class->symbol && ((struct Symbol *)method->_class->symbol)->isStatic)
9554 ListAdd(specifiers, MkSpecifier(STATIC));
9555 if(method->type == 1)
9556 {
9557 ListAdd(specifiers, MkSpecifier(INT));
9558 d = MkDeclaratorIdentifier(MkIdentifier(name));
9559 }
9560 else
9561 {
9562 d = MkDeclaratorIdentifier(MkIdentifier(name));
9563 if(dllImport)
9564 d = MkDeclaratorBrackets(MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), d));
9565 {
9566 struct Context * context = SetupTemplatesContext(method->_class);
9567
9568 d = SpecDeclFromString(method->dataTypeString, specifiers, d);
9569 FinishTemplatesContext(context);
9570 }
9571 funcDecl = GetFuncDecl(d);
9572 if(dllImport)
9573 {
9574 struct Specifier * spec, * next;
9575
9576 for(spec = (*specifiers).first; spec; spec = next)
9577 {
9578 next = spec->next;
9579 if(spec->type == 5)
9580 {
9581 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove((&*specifiers), spec);
9582 FreeSpecifier(spec);
9583 }
9584 }
9585 }
9586 if(method->dataType && !method->dataType->__anon1.__anon2.staticMethod)
9587 {
9588 if(funcDecl && funcDecl->__anon1.function.parameters && (*funcDecl->__anon1.function.parameters).count)
9589 {
9590 struct __ecereNameSpace__ecere__com__Class * _class = method->dataType->__anon1.__anon2.thisClass ? method->dataType->__anon1.__anon2.thisClass->__anon1.registered : method->_class;
9591 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")));
9592 struct TypeName * firstParam = ((struct TypeName *)(*funcDecl->__anon1.function.parameters).first);
9593 struct Specifier * firstSpec = firstParam->qualifiers ? (*firstParam->qualifiers).first : (((void *)0));
9594
9595 if(firstSpec && firstSpec->type == 0 && firstSpec->__anon1.specifier == VOID && !firstParam->declarator)
9596 {
9597 struct TypeName * param = (*funcDecl->__anon1.function.parameters).first;
9598
9599 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove((&*funcDecl->__anon1.function.parameters), param);
9600 FreeTypeName(param);
9601 }
9602 if(!funcDecl->__anon1.function.parameters)
9603 funcDecl->__anon1.function.parameters = MkList();
9604 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*funcDecl->__anon1.function.parameters), (((void *)0)), thisParam);
9605 }
9606 }
9607 }
9608 ProcessDeclarator(d, 1);
9609 ListAdd(declarators, MkInitDeclarator(d, (((void *)0))));
9610 decl = MkDeclaration(specifiers, declarators);
9611 ReplaceThisClassSpecifiers(specifiers, method->_class);
9612 external = MkExternalDeclaration(decl);
9613 external->symbol = symbol;
9614 symbol->__anon2.__anon1.pointerExternal = external;
9615 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add((&*ast), external);
9616 DeclareStruct(external, method->_class->fullName, 1, 1);
9617 if(method->dataType)
9618 DeclareType(external, method->dataType, 1, 1);
9619 }
9620 }
9621 if(inCompiler && neededFor)
9622 {
9623 struct External * external = symbol->__anon2.__anon1.pointerExternal ? symbol->__anon2.__anon1.pointerExternal : symbol->__anon2.__anon3.methodCodeExternal;
9624
9625 __ecereMethod_External_CreateUniqueEdge(neededFor, external, external->type == 0);
9626 }
9627 }
9628
9629 struct __ecereNameSpace__ecere__com__GlobalFunction;
9630
9631 struct __ecereNameSpace__ecere__com__GlobalFunction
9632 {
9633 struct __ecereNameSpace__ecere__com__GlobalFunction * prev;
9634 struct __ecereNameSpace__ecere__com__GlobalFunction * next;
9635 const char *  name;
9636 int (*  function)();
9637 struct __ecereNameSpace__ecere__com__Instance * module;
9638 struct __ecereNameSpace__ecere__com__NameSpace *  nameSpace;
9639 const char *  dataTypeString;
9640 struct Type * dataType;
9641 void *  symbol;
9642 } __attribute__ ((gcc_struct));
9643
9644 extern struct __ecereNameSpace__ecere__com__GlobalFunction * __ecereNameSpace__ecere__com__eSystem_FindFunction(struct __ecereNameSpace__ecere__com__Instance * module, const char *  name);
9645
9646 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);
9647
9648 unsigned int DeclareFunction(struct External * neededFor, struct __ecereNameSpace__ecere__com__GlobalFunction * function, char * name)
9649 {
9650 struct Symbol * symbol = function->symbol;
9651
9652 if(!symbol || !symbol->__anon2.__anon1.pointerExternal)
9653 {
9654 unsigned int imported = 0;
9655 unsigned int dllImport = 0;
9656
9657 if(!function->dataType)
9658 {
9659 function->dataType = ProcessTypeString(function->dataTypeString, 0);
9660 if(!function->dataType->__anon1.__anon2.thisClass)
9661 function->dataType->__anon1.__anon2.staticMethod = 1;
9662 }
9663 if(inCompiler)
9664 {
9665 if(!symbol)
9666 {
9667 struct ModuleImport * module = FindModule(function->module);
9668
9669 symbol = function->symbol = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Symbol);
9670 if(module->name)
9671 {
9672 if(!function->dataType->dllExport)
9673 {
9674 symbol->_import = (struct ClassImport *)__extension__ ({
9675 struct FunctionImport * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_FunctionImport);
9676
9677 __ecereInstance1->name = __ecereNameSpace__ecere__sys__CopyString(function->name), __ecereInstance1;
9678 });
9679 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(&module->functions, symbol->_import);
9680 }
9681 }
9682 {
9683 symbol->type = ProcessTypeString(function->dataTypeString, 0);
9684 if(!symbol->type->__anon1.__anon2.thisClass)
9685 symbol->type->__anon1.__anon2.staticMethod = 1;
9686 }
9687 }
9688 imported = symbol->_import ? 1 : 0;
9689 if(imported && function->module != privateModule && ((struct __ecereNameSpace__ecere__com__Module *)(((char *)function->module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->importType != 1)
9690 dllImport = 1;
9691 }
9692 if(inCompiler)
9693 {
9694 {
9695 struct Declaration * decl;
9696 struct __ecereNameSpace__ecere__sys__OldList * specifiers, * declarators;
9697 struct Declarator * d;
9698 struct Declarator * funcDecl;
9699 struct External * external;
9700
9701 specifiers = MkList();
9702 declarators = MkList();
9703 ListAdd(specifiers, MkSpecifier(EXTERN));
9704 d = MkDeclaratorIdentifier(MkIdentifier(imported ? name : function->name));
9705 if(dllImport)
9706 d = MkDeclaratorBrackets(MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), d));
9707 d = SpecDeclFromString(function->dataTypeString, specifiers, d);
9708 if(((struct __ecereNameSpace__ecere__com__Module *)(((char *)function->module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->importType == 1)
9709 {
9710 struct Specifier * spec;
9711
9712 for(spec = (*specifiers).first; spec; spec = spec->next)
9713 if(spec->type == 5 && spec->__anon1.__anon1.extDecl && spec->__anon1.__anon1.extDecl->type == 0 && !strcmp(spec->__anon1.__anon1.extDecl->__anon1.s, "dllexport"))
9714 {
9715 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove((&*specifiers), spec);
9716 FreeSpecifier(spec);
9717 break;
9718 }
9719 }
9720 funcDecl = GetFuncDecl(d);
9721 if(funcDecl && !funcDecl->__anon1.function.parameters)
9722 {
9723 funcDecl->__anon1.function.parameters = MkList();
9724 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*funcDecl->__anon1.function.parameters), (((void *)0)), MkTypeName(MkListOne(MkSpecifier(VOID)), (((void *)0))));
9725 }
9726 ListAdd(declarators, MkInitDeclarator(d, (((void *)0))));
9727 {
9728 struct Context * oldCtx = curContext;
9729
9730 curContext = globalContext;
9731 decl = MkDeclaration(specifiers, declarators);
9732 curContext = oldCtx;
9733 }
9734 external = MkExternalDeclaration(decl);
9735 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add((&*ast), external);
9736 external->symbol = symbol;
9737 symbol->__anon2.__anon1.pointerExternal = external;
9738 DeclareType(external, function->dataType, 1, 1);
9739 }
9740 }
9741 }
9742 if(inCompiler && neededFor && symbol && symbol->__anon2.__anon1.pointerExternal)
9743 __ecereMethod_External_CreateUniqueEdge(neededFor, symbol->__anon2.__anon1.pointerExternal, symbol->__anon2.__anon1.pointerExternal->type == 0);
9744 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;
9745 }
9746
9747 void DeclareFunctionUtil(struct External * neededBy, const char * s)
9748 {
9749 struct __ecereNameSpace__ecere__com__GlobalFunction * function = __ecereNameSpace__ecere__com__eSystem_FindFunction(privateModule, s);
9750
9751 if(function)
9752 {
9753 char name[1024];
9754
9755 name[0] = (char)0;
9756 if(((struct __ecereNameSpace__ecere__com__Module *)(((char *)function->module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->importType != 1 && (!function->dataType || !function->dataType->dllExport))
9757 strcpy(name, "__ecereFunction_");
9758 FullClassNameCat(name, s, 0);
9759 DeclareFunction(neededBy, function, name);
9760 }
9761 else if(neededBy)
9762 FindSymbol(s, globalContext, globalContext, 0, 0);
9763 }
9764
9765 static void CreateFireWatcher(struct __ecereNameSpace__ecere__com__Property * prop, struct Expression * object, struct Statement * stmt)
9766 {
9767 char propName[1024], propNameM[1024];
9768 char getName[1024], setName[1024];
9769 struct __ecereNameSpace__ecere__sys__OldList * args;
9770
9771 DeclareProperty(curExternal, prop, setName, getName);
9772 strcpy(propName, "__ecereProp_");
9773 FullClassNameCat(propName, prop->_class->fullName, 0);
9774 strcat(propName, "_");
9775 FullClassNameCat(propName, prop->name, 1);
9776 strcpy(propNameM, "__ecerePropM_");
9777 FullClassNameCat(propNameM, prop->_class->fullName, 0);
9778 strcat(propNameM, "_");
9779 FullClassNameCat(propNameM, prop->name, 1);
9780 if(prop->isWatchable)
9781 {
9782 args = MkList();
9783 ListAdd(args, object ? CopyExpression(object) : MkExpIdentifier(MkIdentifier("this")));
9784 ListAdd(args, MkExpIdentifier(MkIdentifier(propName)));
9785 ListAdd(stmt->__anon1.expressions, MkExpCall(MkExpIdentifier(MkIdentifier("ecere::com::eInstance_FireWatchers")), args));
9786 args = MkList();
9787 ListAdd(args, object ? CopyExpression(object) : MkExpIdentifier(MkIdentifier("this")));
9788 ListAdd(args, MkExpIdentifier(MkIdentifier(propNameM)));
9789 ListAdd(stmt->__anon1.expressions, MkExpCall(MkExpIdentifier(MkIdentifier("ecere::com::eInstance_FireWatchers")), args));
9790 DeclareFunctionUtil(curExternal, "eInstance_FireWatchers");
9791 }
9792 {
9793 args = MkList();
9794 ListAdd(args, object ? CopyExpression(object) : MkExpIdentifier(MkIdentifier("this")));
9795 ListAdd(args, MkExpIdentifier(MkIdentifier(propName)));
9796 ListAdd(stmt->__anon1.expressions, MkExpCall(MkExpIdentifier(MkIdentifier("ecere::com::eInstance_FireSelfWatchers")), args));
9797 args = MkList();
9798 ListAdd(args, object ? CopyExpression(object) : MkExpIdentifier(MkIdentifier("this")));
9799 ListAdd(args, MkExpIdentifier(MkIdentifier(propNameM)));
9800 ListAdd(stmt->__anon1.expressions, MkExpCall(MkExpIdentifier(MkIdentifier("ecere::com::eInstance_FireSelfWatchers")), args));
9801 DeclareFunctionUtil(curExternal, "eInstance_FireSelfWatchers");
9802 }
9803 if(curFunction->propSet && !strcmp(curFunction->propSet->string, prop->name) && (!object || (object->type == 0 && !strcmp(object->__anon1.__anon1.identifier->string, "this"))))
9804 curFunction->propSet->fireWatchersDone = 1;
9805 }
9806
9807 struct __ecereNameSpace__ecere__com__SubModule;
9808
9809 struct __ecereNameSpace__ecere__com__SubModule
9810 {
9811 struct __ecereNameSpace__ecere__com__SubModule * prev;
9812 struct __ecereNameSpace__ecere__com__SubModule * next;
9813 struct __ecereNameSpace__ecere__com__Instance * module;
9814 int importMode;
9815 } __attribute__ ((gcc_struct));
9816
9817 unsigned int ModuleVisibility(struct __ecereNameSpace__ecere__com__Instance * searchIn, struct __ecereNameSpace__ecere__com__Instance * searchFor)
9818 {
9819 struct __ecereNameSpace__ecere__com__SubModule * subModule;
9820
9821 if(searchFor == searchIn)
9822 return 1;
9823 for(subModule = ((struct __ecereNameSpace__ecere__com__Module *)(((char *)searchIn + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->modules.first; subModule; subModule = subModule->next)
9824 {
9825 if(subModule->importMode == 1 || searchIn == ((struct __ecereNameSpace__ecere__com__Module *)(((char *)searchIn + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->application)
9826 {
9827 if(ModuleVisibility(subModule->module, searchFor))
9828 return 1;
9829 }
9830 }
9831 return 0;
9832 }
9833
9834 void ProcessExpressionType(struct Expression *  exp);
9835
9836 static void ReplaceClassMembers(struct Expression * exp, struct __ecereNameSpace__ecere__com__Class * _class)
9837 {
9838 if(exp->type == 0 && exp->__anon1.__anon1.identifier)
9839 {
9840 struct Identifier * id = exp->__anon1.__anon1.identifier;
9841 struct Context * ctx;
9842 struct Symbol * symbol = (((void *)0));
9843
9844 if(!id->_class || !id->_class->__anon1.__anon1.name || strcmp(id->_class->__anon1.__anon1.name, "property"))
9845 {
9846 for(ctx = curContext; ctx != topContext->parent && !symbol; ctx = ctx->parent)
9847 {
9848 symbol = (struct Symbol *)__ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindString(&ctx->symbols, id->string);
9849 if(symbol)
9850 break;
9851 }
9852 }
9853 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))))
9854 {
9855 struct __ecereNameSpace__ecere__com__Property * prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, id->string, privateModule);
9856 struct __ecereNameSpace__ecere__com__Method * method = (((void *)0));
9857 struct __ecereNameSpace__ecere__com__DataMember * member = (((void *)0));
9858 struct __ecereNameSpace__ecere__com__ClassProperty * classProp = (((void *)0));
9859
9860 if(!prop)
9861 {
9862 method = __ecereNameSpace__ecere__com__eClass_FindMethod(_class, id->string, privateModule);
9863 }
9864 if(!prop && !method)
9865 member = __ecereNameSpace__ecere__com__eClass_FindDataMember(_class, id->string, privateModule, (((void *)0)), (((void *)0)));
9866 if(!prop && !method && !member)
9867 {
9868 classProp = __ecereNameSpace__ecere__com__eClass_FindClassProperty(_class, id->string);
9869 }
9870 if(prop || method || member || classProp)
9871 {
9872 exp->type = 8;
9873 exp->__anon1.member.member = id;
9874 exp->__anon1.member.memberType = 0;
9875 exp->__anon1.member.exp = QMkExpId("this");
9876 exp->addedThis = 1;
9877 }
9878 else if(_class && _class->templateParams.first)
9879 {
9880 struct __ecereNameSpace__ecere__com__Class * sClass;
9881
9882 for(sClass = _class; sClass; sClass = sClass->base)
9883 {
9884 if(sClass->templateParams.first)
9885 {
9886 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * param;
9887
9888 for(param = sClass->templateParams.first; param; param = param->next)
9889 {
9890 if(param->type == 2 && !strcmp(param->name, id->string))
9891 {
9892 struct Expression * argExp = GetTemplateArgExpByName(param->name, _class, 2);
9893
9894 if(argExp)
9895 {
9896 struct Declarator * decl;
9897 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
9898
9899 FreeIdentifier(exp->__anon1.member.member);
9900 ProcessExpressionType(argExp);
9901 decl = SpecDeclFromString(param->__anon1.dataTypeString, specs, (((void *)0)));
9902 exp->expType = ProcessType(specs, decl);
9903 exp->type = 5;
9904 exp->__anon1.list = MkListOne(MkExpOp((((void *)0)), '*', MkExpCast(MkTypeName(specs, MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), decl)), MkExpOp((((void *)0)), '&', argExp))));
9905 }
9906 }
9907 }
9908 }
9909 }
9910 }
9911 }
9912 }
9913 }
9914
9915 static void PopulateInstanceProcessMember(struct Instantiation * inst, struct __ecereNameSpace__ecere__sys__OldList * memberList, struct __ecereNameSpace__ecere__com__DataMember * parentDataMember, unsigned int offset)
9916 {
9917 struct __ecereNameSpace__ecere__com__DataMember * dataMember;
9918
9919 for(dataMember = parentDataMember->members.first; dataMember; dataMember = dataMember->next)
9920 {
9921 if(!dataMember->name && (dataMember->type == 2 || dataMember->type == 1))
9922 PopulateInstanceProcessMember(inst, memberList, dataMember, offset + dataMember->offset);
9923 else
9924 {
9925 struct Expression * exp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression);
9926 struct MemberInit * member = MkMemberInit(MkListOne(MkIdentifier(dataMember->name)), MkInitializerAssignment(exp));
9927 struct Type * type;
9928 void * ptr = inst->data + dataMember->offset + offset;
9929 char * result = (((void *)0));
9930
9931 exp->loc = member->loc = inst->loc;
9932 ((struct Identifier *)(*member->identifiers).first)->loc = inst->loc;
9933 if(!dataMember->dataType)
9934 dataMember->dataType = ProcessTypeString(dataMember->dataTypeString, 0);
9935 type = dataMember->dataType;
9936 if(type->kind == 8)
9937 {
9938 struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class->__anon1.registered;
9939
9940 if(_class->type == 4)
9941 {
9942 struct __ecereNameSpace__ecere__com__Class * enumClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "enum");
9943
9944 if(enumClass)
9945 {
9946 struct __ecereNameSpace__ecere__com__EnumClassData * e = (_class ? ((void *)(((char *)_class->data) + enumClass->offsetClass)) : (((void *)0)));
9947 struct __ecereNameSpace__ecere__sys__NamedLink64 * item;
9948
9949 for(item = e->values.first; item; item = item->next)
9950 {
9951 if(item->data == GetEnumValue(_class, ptr))
9952 {
9953 result = item->name;
9954 break;
9955 }
9956 }
9957 if(result)
9958 {
9959 exp->__anon1.__anon1.identifier = MkIdentifier(result);
9960 exp->type = 0;
9961 exp->destType = MkClassType(_class->fullName);
9962 ProcessExpressionType(exp);
9963 }
9964 }
9965 }
9966 if(_class->type == 4 || _class->type == 3 || _class->type == 2)
9967 {
9968 if(!_class->dataType)
9969 _class->dataType = ProcessTypeString(_class->dataTypeString, 0);
9970 type = _class->dataType;
9971 }
9972 }
9973 if(!result)
9974 {
9975 switch(type->kind)
9976 {
9977 case 6:
9978 {
9979 FreeExpContents(exp);
9980 exp->__anon1.__anon1.constant = PrintFloat(*(float *)ptr);
9981 exp->type = 2;
9982 break;
9983 }
9984 case 7:
9985 {
9986 FreeExpContents(exp);
9987 exp->__anon1.__anon1.constant = PrintDouble(*(double *)ptr);
9988 exp->type = 2;
9989 break;
9990 }
9991 case 3:
9992 {
9993 FreeExpContents(exp);
9994 exp->__anon1.__anon1.constant = PrintInt(*(int *)ptr);
9995 exp->type = 2;
9996 break;
9997 }
9998 case 4:
9999 {
10000 FreeExpContents(exp);
10001 exp->__anon1.__anon1.constant = PrintInt64(*(long long *)ptr);
10002 exp->type = 2;
10003 break;
10004 }
10005 case 22:
10006 {
10007 FreeExpContents(exp);
10008 exp->__anon1.__anon1.constant = PrintInt64((long long)*(intptr_t *)ptr);
10009 exp->type = 2;
10010 break;
10011 }
10012 case 23:
10013 {
10014 FreeExpContents(exp);
10015 exp->__anon1.__anon1.constant = PrintInt64((long long)*(ssize_t *)ptr);
10016 exp->type = 2;
10017 break;
10018 }
10019 default:
10020 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Unhandled type populating instance\n", (((void *)0))));
10021 }
10022 }
10023 ListAdd(memberList, member);
10024 }
10025 if(parentDataMember->type == 1)
10026 break;
10027 }
10028 }
10029
10030 void CheckTemplateTypes(struct Expression * exp)
10031 {
10032 struct Expression * nbExp = GetNonBracketsExp(exp);
10033
10034 if(exp->destType && exp->destType->passAsTemplate && exp->expType && exp->expType->kind != 20 && !exp->expType->passAsTemplate && (nbExp == exp || nbExp->type != 11))
10035 {
10036 struct Expression * newExp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression);
10037 struct Context * context;
10038 int kind = exp->expType->kind;
10039
10040 *newExp = *exp;
10041 if(exp->destType)
10042 exp->destType->refCount++;
10043 if(exp->expType)
10044 exp->expType->refCount++;
10045 newExp->prev = (((void *)0));
10046 newExp->next = (((void *)0));
10047 if(exp->expType->kind == 8 && exp->expType->__anon1._class && exp->expType->__anon1._class->__anon1.registered)
10048 {
10049 struct __ecereNameSpace__ecere__com__Class * c = exp->expType->__anon1._class->__anon1.registered;
10050
10051 if(c->type == 2 || c->type == 4 || c->type == 3)
10052 {
10053 if(!c->dataType)
10054 c->dataType = ProcessTypeString(c->dataTypeString, 0);
10055 kind = c->dataType->kind;
10056 }
10057 }
10058 switch(kind)
10059 {
10060 case 7:
10061 if(exp->destType->classObjectType)
10062 {
10063 if(exp->destType)
10064 exp->destType->refCount--;
10065 if(exp->expType)
10066 exp->expType->refCount--;
10067 ((newExp ? (__ecereClass_Expression->Destructor ? __ecereClass_Expression->Destructor((void *)newExp) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(newExp)) : 0), newExp = 0);
10068 }
10069 else
10070 {
10071 struct __ecereNameSpace__ecere__sys__OldList * specs;
10072 struct __ecereNameSpace__ecere__sys__OldList * unionDefs = MkList();
10073 struct __ecereNameSpace__ecere__sys__OldList * statements = MkList();
10074
10075 context = PushContext();
10076 ListAdd(unionDefs, MkClassDefDeclaration(MkStructDeclaration(MkListOne(MkSpecifier(DOUBLE)), MkListOne(MkDeclaratorIdentifier(MkIdentifier("d"))), (((void *)0)))));
10077 ListAdd(unionDefs, MkClassDefDeclaration(MkStructDeclaration(MkListOne(MkSpecifierName("uint64")), MkListOne(MkDeclaratorIdentifier(MkIdentifier("i"))), (((void *)0)))));
10078 specs = MkListOne(MkStructOrUnion(4, (((void *)0)), unionDefs));
10079 exp->type = 23;
10080 exp->__anon1.compound = MkCompoundStmt(MkListOne(MkDeclaration(specs, MkListOne(MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier("__internal_union")), (((void *)0)))))), statements);
10081 ListAdd(statements, MkExpressionStmt(MkListOne(MkExpOp(MkExpMember(MkExpIdentifier(MkIdentifier("__internal_union")), MkIdentifier("d")), '=', newExp))));
10082 ListAdd(statements, MkExpressionStmt(MkListOne(MkExpMember(MkExpIdentifier(MkIdentifier("__internal_union")), MkIdentifier("i")))));
10083 exp->__anon1.compound->__anon1.compound.context = context;
10084 PopContext(context);
10085 }
10086 break;
10087 default:
10088 exp->type = 11;
10089 exp->__anon1.cast.typeName = MkTypeName(MkListOne(MkSpecifierName("uint64")), (((void *)0)));
10090 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))
10091 exp->__anon1.cast.exp = MkExpCast(MkTypeName(MkListOne(MkSpecifierName("uintptr")), (((void *)0))), MkExpBrackets(MkListOne(newExp)));
10092 else
10093 exp->__anon1.cast.exp = MkExpBrackets(MkListOne(newExp));
10094 exp->needCast = 1;
10095 break;
10096 }
10097 }
10098 else if(exp->expType && exp->expType->passAsTemplate && exp->destType && ((unsigned int)((exp->usage & 0x1) >> 0)) && exp->destType->kind != 20 && !exp->destType->passAsTemplate)
10099 {
10100 struct Expression * newExp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression);
10101 struct Context * context;
10102 int kind = exp->expType->kind;
10103
10104 *newExp = *exp;
10105 if(exp->destType)
10106 exp->destType->refCount++;
10107 if(exp->expType)
10108 exp->expType->refCount++;
10109 newExp->prev = (((void *)0));
10110 newExp->next = (((void *)0));
10111 if(exp->expType->kind == 8 && exp->expType->__anon1._class && exp->expType->__anon1._class->__anon1.registered)
10112 {
10113 struct __ecereNameSpace__ecere__com__Class * c = exp->expType->__anon1._class->__anon1.registered;
10114
10115 if(c->type == 2 || c->type == 4 || c->type == 3)
10116 {
10117 if(!c->dataType)
10118 c->dataType = ProcessTypeString(c->dataTypeString, 0);
10119 kind = c->dataType->kind;
10120 }
10121 }
10122 switch(kind)
10123 {
10124 case 7:
10125 if(exp->destType->classObjectType)
10126 {
10127 if(exp->destType)
10128 exp->destType->refCount--;
10129 if(exp->expType)
10130 exp->expType->refCount--;
10131 ((newExp ? (__ecereClass_Expression->Destructor ? __ecereClass_Expression->Destructor((void *)newExp) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(newExp)) : 0), newExp = 0);
10132 }
10133 else
10134 {
10135 struct __ecereNameSpace__ecere__sys__OldList * specs;
10136 struct __ecereNameSpace__ecere__sys__OldList * unionDefs = MkList();
10137 struct __ecereNameSpace__ecere__sys__OldList * statements = MkList();
10138
10139 context = PushContext();
10140 ListAdd(unionDefs, MkClassDefDeclaration(MkStructDeclaration(MkListOne(MkSpecifier(DOUBLE)), MkListOne(MkDeclaratorIdentifier(MkIdentifier("d"))), (((void *)0)))));
10141 ListAdd(unionDefs, MkClassDefDeclaration(MkStructDeclaration(MkListOne(MkSpecifierName("uint64")), MkListOne(MkDeclaratorIdentifier(MkIdentifier("i"))), (((void *)0)))));
10142 specs = MkListOne(MkStructOrUnion(4, (((void *)0)), unionDefs));
10143 exp->type = 23;
10144 exp->__anon1.compound = MkCompoundStmt(MkListOne(MkDeclaration(specs, MkListOne(MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier("__internal_union")), (((void *)0)))))), statements);
10145 ListAdd(statements, MkExpressionStmt(MkListOne(MkExpOp(MkExpMember(MkExpIdentifier(MkIdentifier("__internal_union")), MkIdentifier("i")), '=', newExp))));
10146 ListAdd(statements, MkExpressionStmt(MkListOne(MkExpMember(MkExpIdentifier(MkIdentifier("__internal_union")), MkIdentifier("d")))));
10147 exp->__anon1.compound->__anon1.compound.context = context;
10148 PopContext(context);
10149 }
10150 break;
10151 case 8:
10152 {
10153 if(exp->expType->__anon1._class && exp->expType->__anon1._class->__anon1.registered && exp->expType->__anon1._class->__anon1.registered->type == 1)
10154 {
10155 exp->type = 5;
10156 newExp = MkExpCast(MkTypeName(MkListOne(MkSpecifierName("uintptr")), (((void *)0))), newExp);
10157 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)));
10158 ProcessExpressionType((*exp->__anon1.list).first);
10159 break;
10160 }
10161 else
10162 {
10163 exp->type = 5;
10164 if(__ecereProp_Type_Get_isPointerType(exp->expType))
10165 {
10166 exp->needTemplateCast = 2;
10167 newExp->needCast = 1;
10168 newExp->needTemplateCast = 2;
10169 newExp = MkExpCast(MkTypeName(MkListOne(MkSpecifierName("uintptr")), (((void *)0))), newExp);
10170 }
10171 exp->__anon1.list = MkListOne(MkExpCast(MkTypeName(MkListOne(MkSpecifierName(exp->expType->__anon1._class->string)), (((void *)0))), newExp));
10172 exp->needTemplateCast = 2;
10173 newExp->needCast = 1;
10174 newExp->needTemplateCast = 2;
10175 ProcessExpressionType((*exp->__anon1.list).first);
10176 break;
10177 }
10178 }
10179 default:
10180 {
10181 if(exp->expType->kind == 20)
10182 {
10183 struct Type * type = ProcessTemplateParameterType(exp->expType->__anon1.templateParameter);
10184
10185 if(type)
10186 {
10187 FreeType(exp->destType);
10188 FreeType(exp->expType);
10189 ((newExp ? (__ecereClass_Expression->Destructor ? __ecereClass_Expression->Destructor((void *)newExp) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(newExp)) : 0), newExp = 0);
10190 break;
10191 }
10192 }
10193 if(newExp->type == 8 && newExp->__anon1.member.memberType == 3)
10194 {
10195 exp->type = 4;
10196 exp->__anon1.op.op = '*';
10197 exp->__anon1.op.exp1 = (((void *)0));
10198 exp->__anon1.op.exp2 = MkExpCast(MkTypeName(MkListOne(MkSpecifierName("uint64")), MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), (((void *)0)))), MkExpBrackets(MkListOne(MkExpOp((((void *)0)), '&', newExp))));
10199 }
10200 else
10201 {
10202 char typeString[1024];
10203 struct Declarator * decl;
10204 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
10205
10206 typeString[0] = '\0';
10207 PrintType(exp->expType, typeString, 0, 0);
10208 decl = SpecDeclFromString(typeString, specs, (((void *)0)));
10209 exp->type = 11;
10210 exp->__anon1.cast.typeName = MkTypeName(specs, decl);
10211 exp->__anon1.cast.exp = MkExpBrackets(MkListOne(newExp));
10212 exp->__anon1.cast.exp->needCast = 1;
10213 }
10214 break;
10215 }
10216 }
10217 }
10218 }
10219
10220 static void ProcessInitializer(struct Initializer * init, struct Type * type)
10221 {
10222 switch(init->type)
10223 {
10224 case 0:
10225 if(!init->__anon1.exp || init->__anon1.exp->type != 1 || !init->__anon1.exp->__anon1.instance || init->__anon1.exp->__anon1.instance->_class || !type || type->kind == 8)
10226 {
10227 if(init->__anon1.exp && !init->__anon1.exp->destType)
10228 {
10229 FreeType(init->__anon1.exp->destType);
10230 init->__anon1.exp->destType = type;
10231 if(type)
10232 type->refCount++;
10233 }
10234 if(init->__anon1.exp)
10235 {
10236 ProcessExpressionType(init->__anon1.exp);
10237 init->isConstant = init->__anon1.exp->isConstant;
10238 }
10239 break;
10240 }
10241 else
10242 {
10243 struct Expression * exp = init->__anon1.exp;
10244 struct Instantiation * inst = exp->__anon1.instance;
10245 struct MembersInit * members;
10246
10247 init->type = 1;
10248 init->__anon1.list = MkList();
10249 if(inst->members)
10250 {
10251 for(members = (*inst->members).first; members; members = members->next)
10252 {
10253 if(members->type == 0)
10254 {
10255 struct MemberInit * member;
10256
10257 for(member = (*members->__anon1.dataMembers).first; member; member = member->next)
10258 {
10259 ListAdd(init->__anon1.list, member->initializer);
10260 member->initializer = (((void *)0));
10261 }
10262 }
10263 }
10264 }
10265 FreeExpression(exp);
10266 }
10267 case 1:
10268 {
10269 struct Initializer * i;
10270 struct Type * initializerType = (((void *)0));
10271 struct __ecereNameSpace__ecere__com__Class * curClass = (((void *)0));
10272 struct __ecereNameSpace__ecere__com__DataMember * curMember = (((void *)0));
10273 struct __ecereNameSpace__ecere__com__DataMember * subMemberStack[256];
10274 int subMemberStackPos = 0;
10275
10276 if(type && type->kind == 12)
10277 initializerType = Dereference(type);
10278 else if(type && (type->kind == 9 || type->kind == 10))
10279 initializerType = type->__anon1.__anon1.members.first;
10280 for(i = (*init->__anon1.list).first; i; i = i->next)
10281 {
10282 if(type && type->kind == 8 && type->__anon1._class && type->__anon1._class->__anon1.registered)
10283 {
10284 FindNextDataMember(type->__anon1._class->__anon1.registered, &curClass, &curMember, subMemberStack, &subMemberStackPos);
10285 if(curMember)
10286 {
10287 if(!curMember->dataType)
10288 curMember->dataType = ProcessTypeString(curMember->dataTypeString, 0);
10289 initializerType = curMember->dataType;
10290 }
10291 }
10292 ProcessInitializer(i, initializerType);
10293 if(initializerType && type && (type->kind == 9 || type->kind == 10))
10294 initializerType = initializerType->next;
10295 if(!i->isConstant)
10296 init->isConstant = 0;
10297 }
10298 if(type && type->kind == 12)
10299 FreeType(initializerType);
10300 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))
10301 {
10302 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Assigning list initializer to non list\n", (((void *)0))));
10303 }
10304 break;
10305 }
10306 }
10307 }
10308
10309 void PopulateInstance(struct Instantiation * inst)
10310 {
10311 struct Symbol * classSym = inst->_class->__anon1.__anon1.symbol;
10312 struct __ecereNameSpace__ecere__com__Class * _class = classSym->__anon1.registered;
10313 struct __ecereNameSpace__ecere__com__DataMember * dataMember;
10314 struct __ecereNameSpace__ecere__sys__OldList * memberList = MkList();
10315
10316 if(!inst->members)
10317 inst->members = MkListOne(MkMembersInitList(memberList));
10318 else
10319 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add((&*inst->members), MkMembersInitList(memberList));
10320 for(dataMember = _class->membersAndProperties.first; dataMember; dataMember = dataMember->next)
10321 {
10322 if(!dataMember->isProperty)
10323 {
10324 if(!dataMember->name && (dataMember->type == 2 || dataMember->type == 1))
10325 PopulateInstanceProcessMember(inst, memberList, dataMember, dataMember->offset);
10326 else
10327 {
10328 struct Expression * exp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression);
10329 struct MemberInit * member = MkMemberInit(MkListOne(MkIdentifier(dataMember->name)), MkInitializerAssignment(exp));
10330 struct Type * type;
10331 void * ptr = inst->data + dataMember->offset;
10332 char * result = (((void *)0));
10333
10334 exp->loc = member->loc = inst->loc;
10335 ((struct Identifier *)(*member->identifiers).first)->loc = inst->loc;
10336 if(!dataMember->dataType)
10337 dataMember->dataType = ProcessTypeString(dataMember->dataTypeString, 0);
10338 type = dataMember->dataType;
10339 if(type->kind == 8)
10340 {
10341 struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class->__anon1.registered;
10342
10343 if(_class->type == 4)
10344 {
10345 struct __ecereNameSpace__ecere__com__Class * enumClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "enum");
10346
10347 if(enumClass)
10348 {
10349 struct __ecereNameSpace__ecere__com__EnumClassData * e = (_class ? ((void *)(((char *)_class->data) + enumClass->offsetClass)) : (((void *)0)));
10350 struct __ecereNameSpace__ecere__sys__NamedLink64 * item;
10351
10352 for(item = e->values.first; item; item = item->next)
10353 {
10354 if(item->data == GetEnumValue(_class, ptr))
10355 {
10356 result = item->name;
10357 break;
10358 }
10359 }
10360 }
10361 if(result)
10362 {
10363 exp->__anon1.__anon1.identifier = MkIdentifier(result);
10364 exp->type = 0;
10365 exp->destType = MkClassType(_class->fullName);
10366 ProcessExpressionType(exp);
10367 }
10368 }
10369 if(_class->type == 4 || _class->type == 3 || _class->type == 2)
10370 {
10371 if(!_class->dataType)
10372 _class->dataType = ProcessTypeString(_class->dataTypeString, 0);
10373 type = _class->dataType;
10374 }
10375 }
10376 if(!result)
10377 {
10378 switch(type->kind)
10379 {
10380 case 6:
10381 {
10382 exp->__anon1.__anon1.constant = PrintFloat(*(float *)ptr);
10383 exp->type = 2;
10384 break;
10385 }
10386 case 7:
10387 {
10388 exp->__anon1.__anon1.constant = PrintDouble(*(double *)ptr);
10389 exp->type = 2;
10390 break;
10391 }
10392 case 3:
10393 {
10394 exp->__anon1.__anon1.constant = PrintInt(*(int *)ptr);
10395 exp->type = 2;
10396 break;
10397 }
10398 case 4:
10399 {
10400 exp->__anon1.__anon1.constant = PrintInt64(*(long long *)ptr);
10401 exp->type = 2;
10402 break;
10403 }
10404 case 22:
10405 {
10406 exp->__anon1.__anon1.constant = PrintInt64((long long)*(intptr_t *)ptr);
10407 exp->type = 2;
10408 break;
10409 }
10410 default:
10411 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Unhandled type populating instance\n", (((void *)0))));
10412 }
10413 }
10414 ListAdd(memberList, member);
10415 }
10416 }
10417 }
10418 }
10419
10420 int ComputeTypeSize(struct Type *  type);
10421
10422 void ComputeClassMembers(struct __ecereNameSpace__ecere__com__Class * _class, unsigned int isMember)
10423 {
10424 struct __ecereNameSpace__ecere__com__DataMember * member = isMember ? (struct __ecereNameSpace__ecere__com__DataMember *)_class : (((void *)0));
10425 struct Context * context = isMember ? (((void *)0)) : SetupTemplatesContext(_class);
10426
10427 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))
10428 {
10429 int unionMemberOffset = 0;
10430 int bitFields = 0;
10431
10432 if(member)
10433 {
10434 member->memberOffset = 0;
10435 if(targetBits < sizeof(void *) * 8)
10436 member->structAlignment = (short)0;
10437 }
10438 else if(targetBits < sizeof(void *) * 8)
10439 _class->structAlignment = (short)0;
10440 if(!member && ((_class->type == 0 || _class->type == 5) || (_class->type == 1 && _class->memberOffset && _class->memberOffset > _class->base->structSize)))
10441 _class->memberOffset = (_class->base && _class->type == 1) ? _class->base->structSize : 0;
10442 if(!member && _class->destructionWatchOffset)
10443 _class->memberOffset += sizeof(struct __ecereNameSpace__ecere__sys__OldList);
10444 {
10445 struct __ecereNameSpace__ecere__com__DataMember * dataMember;
10446
10447 for(dataMember = member ? member->members.first : _class->membersAndProperties.first; dataMember; dataMember = dataMember->next)
10448 {
10449 if(!dataMember->isProperty)
10450 {
10451 if(dataMember->type == 0 && dataMember->dataTypeString && !dataMember->dataType)
10452 {
10453 dataMember->dataType = ProcessTypeString(dataMember->dataTypeString, 0);
10454 }
10455 }
10456 }
10457 }
10458 {
10459 struct __ecereNameSpace__ecere__com__DataMember * dataMember;
10460
10461 for(dataMember = member ? member->members.first : _class->membersAndProperties.first; dataMember; dataMember = dataMember->next)
10462 {
10463 if(!dataMember->isProperty && (dataMember->type != 0 || dataMember->dataTypeString))
10464 {
10465 if(!isMember && _class->type == 2 && dataMember->dataType)
10466 {
10467 struct __ecereNameSpace__ecere__com__BitMember * bitMember = (struct __ecereNameSpace__ecere__com__BitMember *)dataMember;
10468 uint64 mask = 0;
10469 int d;
10470
10471 ComputeTypeSize(dataMember->dataType);
10472 if(bitMember->pos == -1)
10473 bitMember->pos = _class->memberOffset;
10474 if(!bitMember->size)
10475 bitMember->size = dataMember->dataType->size * 8;
10476 _class->memberOffset = bitMember->pos + bitMember->size;
10477 for(d = 0; d < bitMember->size; d++)
10478 {
10479 if(d)
10480 mask <<= 1;
10481 mask |= 1;
10482 }
10483 bitMember->mask = mask << bitMember->pos;
10484 }
10485 else if(dataMember->type == 0 && dataMember->dataType)
10486 {
10487 int size;
10488 int alignment = 0;
10489
10490 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)))
10491 ComputeTypeSize(dataMember->dataType);
10492 if(dataMember->dataType->bitFieldCount)
10493 {
10494 bitFields += dataMember->dataType->bitFieldCount;
10495 size = 0;
10496 }
10497 else
10498 {
10499 if(bitFields)
10500 {
10501 int size = (bitFields + 7) / 8;
10502
10503 if(isMember)
10504 {
10505 int __simpleStruct0;
10506
10507 if(alignment)
10508 {
10509 short __simpleStruct0;
10510
10511 member->structAlignment = (__simpleStruct0 = member->structAlignment, (__simpleStruct0 > alignment) ? __simpleStruct0 : alignment);
10512 if(member->memberOffset % alignment)
10513 member->memberOffset += alignment - (member->memberOffset % alignment);
10514 }
10515 dataMember->offset = member->memberOffset;
10516 if(member->type == 1)
10517 unionMemberOffset = (__simpleStruct0 = dataMember->dataType->size, (unionMemberOffset > __simpleStruct0) ? unionMemberOffset : __simpleStruct0);
10518 else
10519 {
10520 member->memberOffset += size;
10521 }
10522 }
10523 else
10524 {
10525 if(alignment)
10526 {
10527 short __simpleStruct0;
10528
10529 _class->structAlignment = (__simpleStruct0 = _class->structAlignment, (__simpleStruct0 > alignment) ? __simpleStruct0 : alignment);
10530 if(_class->memberOffset % alignment)
10531 _class->memberOffset += alignment - (_class->memberOffset % alignment);
10532 }
10533 dataMember->offset = _class->memberOffset;
10534 _class->memberOffset += size;
10535 }
10536 bitFields = 0;
10537 }
10538 size = dataMember->dataType->size;
10539 alignment = dataMember->dataType->alignment;
10540 }
10541 if(isMember)
10542 {
10543 int __simpleStruct0;
10544
10545 if(alignment)
10546 {
10547 short __simpleStruct0;
10548
10549 member->structAlignment = (__simpleStruct0 = member->structAlignment, (__simpleStruct0 > alignment) ? __simpleStruct0 : alignment);
10550 if(member->memberOffset % alignment)
10551 member->memberOffset += alignment - (member->memberOffset % alignment);
10552 }
10553 dataMember->offset = member->memberOffset;
10554 if(member->type == 1)
10555 unionMemberOffset = (__simpleStruct0 = dataMember->dataType->size, (unionMemberOffset > __simpleStruct0) ? unionMemberOffset : __simpleStruct0);
10556 else
10557 {
10558 member->memberOffset += size;
10559 }
10560 }
10561 else
10562 {
10563 if(alignment)
10564 {
10565 short __simpleStruct0;
10566
10567 _class->structAlignment = (__simpleStruct0 = _class->structAlignment, (__simpleStruct0 > alignment) ? __simpleStruct0 : alignment);
10568 if(_class->memberOffset % alignment)
10569 _class->memberOffset += alignment - (_class->memberOffset % alignment);
10570 }
10571 dataMember->offset = _class->memberOffset;
10572 _class->memberOffset += size;
10573 }
10574 }
10575 else
10576 {
10577 int alignment;
10578
10579 ComputeClassMembers((struct __ecereNameSpace__ecere__com__Class *)dataMember, 1);
10580 alignment = dataMember->structAlignment;
10581 if(isMember)
10582 {
10583 int __simpleStruct0;
10584
10585 if(alignment)
10586 {
10587 short __simpleStruct0;
10588
10589 if(member->memberOffset % alignment)
10590 member->memberOffset += alignment - (member->memberOffset % alignment);
10591 member->structAlignment = (__simpleStruct0 = member->structAlignment, (__simpleStruct0 > alignment) ? __simpleStruct0 : alignment);
10592 }
10593 dataMember->offset = member->memberOffset;
10594 if(member->type == 1)
10595 unionMemberOffset = (__simpleStruct0 = dataMember->memberOffset, (unionMemberOffset > __simpleStruct0) ? unionMemberOffset : __simpleStruct0);
10596 else
10597 member->memberOffset += dataMember->memberOffset;
10598 }
10599 else
10600 {
10601 if(alignment)
10602 {
10603 short __simpleStruct0;
10604
10605 if(_class->memberOffset % alignment)
10606 _class->memberOffset += alignment - (_class->memberOffset % alignment);
10607 _class->structAlignment = (__simpleStruct0 = _class->structAlignment, (__simpleStruct0 > alignment) ? __simpleStruct0 : alignment);
10608 }
10609 dataMember->offset = _class->memberOffset;
10610 _class->memberOffset += dataMember->memberOffset;
10611 }
10612 }
10613 }
10614 }
10615 if(bitFields)
10616 {
10617 int alignment = 0;
10618 int size = (bitFields + 7) / 8;
10619
10620 if(isMember)
10621 {
10622 int __simpleStruct0;
10623
10624 if(alignment)
10625 {
10626 short __simpleStruct0;
10627
10628 member->structAlignment = (__simpleStruct0 = member->structAlignment, (__simpleStruct0 > alignment) ? __simpleStruct0 : alignment);
10629 if(member->memberOffset % alignment)
10630 member->memberOffset += alignment - (member->memberOffset % alignment);
10631 }
10632 if(member->type == 1)
10633 unionMemberOffset = (__simpleStruct0 = dataMember->dataType->size, (unionMemberOffset > __simpleStruct0) ? unionMemberOffset : __simpleStruct0);
10634 else
10635 {
10636 member->memberOffset += size;
10637 }
10638 }
10639 else
10640 {
10641 if(alignment)
10642 {
10643 short __simpleStruct0;
10644
10645 _class->structAlignment = (__simpleStruct0 = _class->structAlignment, (__simpleStruct0 > alignment) ? __simpleStruct0 : alignment);
10646 if(_class->memberOffset % alignment)
10647 _class->memberOffset += alignment - (_class->memberOffset % alignment);
10648 }
10649 _class->memberOffset += size;
10650 }
10651 bitFields = 0;
10652 }
10653 }
10654 if(member && member->type == 1)
10655 {
10656 member->memberOffset = unionMemberOffset;
10657 }
10658 if(!isMember)
10659 {
10660 if(_class->type != 2)
10661 {
10662 int extra = 0;
10663
10664 if(_class->structAlignment)
10665 {
10666 if(_class->memberOffset % _class->structAlignment)
10667 extra += _class->structAlignment - (_class->memberOffset % _class->structAlignment);
10668 }
10669 _class->structSize = (_class->base ? (_class->base->templateClass ? _class->base->templateClass->structSize : _class->base->structSize) : 0) + _class->memberOffset + extra;
10670 if(!member)
10671 {
10672 struct __ecereNameSpace__ecere__com__Property * prop;
10673
10674 for(prop = _class->membersAndProperties.first; prop; prop = prop->next)
10675 {
10676 if(prop->isProperty && prop->isWatchable)
10677 {
10678 prop->watcherOffset = _class->structSize;
10679 _class->structSize += sizeof(struct __ecereNameSpace__ecere__sys__OldList);
10680 }
10681 }
10682 }
10683 {
10684 struct __ecereNameSpace__ecere__sys__OldLink * derivative;
10685
10686 for(derivative = _class->derivatives.first; derivative; derivative = derivative->next)
10687 {
10688 struct __ecereNameSpace__ecere__com__Class * deriv = derivative->data;
10689
10690 if(deriv->computeSize)
10691 {
10692 deriv->offset = _class->structSize;
10693 deriv->memberOffset = 0;
10694 deriv->structSize = deriv->offset;
10695 ComputeClassMembers(deriv, 0);
10696 }
10697 }
10698 }
10699 }
10700 }
10701 }
10702 if(context)
10703 FinishTemplatesContext(context);
10704 }
10705
10706 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)
10707 {
10708 struct __ecereNameSpace__ecere__com__DataMember * topMember = isMember ? (struct __ecereNameSpace__ecere__com__DataMember *)_class : (((void *)0));
10709 unsigned int totalSize = 0;
10710 unsigned int maxSize = 0;
10711 int alignment;
10712 unsigned int size;
10713 struct __ecereNameSpace__ecere__com__DataMember * member;
10714 int anonID = 1;
10715 struct Context * context = isMember ? (((void *)0)) : SetupTemplatesContext(_class);
10716
10717 if(addedPadding)
10718 *addedPadding = 0;
10719 if(!isMember && _class->base)
10720 {
10721 maxSize = _class->structSize;
10722 {
10723 if(_class->type == 1 || _class->type == 5)
10724 AddMembers(neededBy, declarations, _class->base, 0, &totalSize, topClass, (((void *)0)));
10725 else
10726 {
10727 unsigned int baseSize = _class->base->templateClass ? _class->base->templateClass->structSize : _class->base->structSize;
10728
10729 if(maxSize > baseSize)
10730 maxSize -= baseSize;
10731 else
10732 maxSize = 0;
10733 }
10734 }
10735 }
10736 for(member = isMember ? topMember->members.first : _class->membersAndProperties.first; member; member = member->next)
10737 {
10738 if(!member->isProperty)
10739 {
10740 switch(member->type)
10741 {
10742 case 0:
10743 {
10744 if(member->dataTypeString)
10745 {
10746 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList(), * decls = MkList();
10747 struct Declarator * decl;
10748
10749 decl = SpecDeclFromString(member->dataTypeString, specs, MkDeclaratorIdentifier(MkIdentifier(member->name)));
10750 ListAdd(decls, MkStructDeclarator(decl, (((void *)0))));
10751 ListAdd(declarations, MkClassDefDeclaration(MkStructDeclaration(specs, decls, (((void *)0)))));
10752 if(!member->dataType)
10753 member->dataType = ProcessType(specs, decl);
10754 ReplaceThisClassSpecifiers(specs, topClass);
10755 {
10756 struct Type * type = ProcessType(specs, decl);
10757
10758 DeclareType(neededBy, member->dataType, 1, 0);
10759 FreeType(type);
10760 }
10761 ComputeTypeSize(member->dataType);
10762 size = member->dataType->size;
10763 alignment = member->dataType->alignment;
10764 if(alignment)
10765 {
10766 if(totalSize % alignment)
10767 totalSize += alignment - (totalSize % alignment);
10768 }
10769 totalSize += size;
10770 }
10771 break;
10772 }
10773 case 1:
10774 case 2:
10775 {
10776 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList(), * list = MkList();
10777 char id[100];
10778
10779 sprintf(id, "__anon%d", anonID++);
10780 size = 0;
10781 AddMembers(neededBy, list, (struct __ecereNameSpace__ecere__com__Class *)member, 1, &size, topClass, (((void *)0)));
10782 ListAdd(specs, MkStructOrUnion((member->type == 1) ? 4 : 3, (((void *)0)), list));
10783 ListAdd(declarations, MkClassDefDeclaration(MkStructDeclaration(specs, MkListOne(MkDeclaratorIdentifier(MkIdentifier(id))), (((void *)0)))));
10784 alignment = member->structAlignment;
10785 if(alignment)
10786 {
10787 if(totalSize % alignment)
10788 totalSize += alignment - (totalSize % alignment);
10789 }
10790 totalSize += size;
10791 break;
10792 }
10793 }
10794 }
10795 }
10796 if(retSize)
10797 {
10798 unsigned int __simpleStruct0;
10799
10800 if(topMember && topMember->type == 1)
10801 *retSize = (__simpleStruct0 = *retSize, (__simpleStruct0 > totalSize) ? __simpleStruct0 : totalSize);
10802 else
10803 *retSize += totalSize;
10804 }
10805 else if(totalSize < maxSize && _class->type != 1000)
10806 {
10807 int autoPadding = 0;
10808
10809 if(!isMember && _class->structAlignment && totalSize % _class->structAlignment)
10810 autoPadding = _class->structAlignment - (totalSize % _class->structAlignment);
10811 if(totalSize + autoPadding < maxSize)
10812 {
10813 char sizeString[50];
10814
10815 sprintf(sizeString, "%d", maxSize - totalSize);
10816 ListAdd(declarations, MkClassDefDeclaration(MkStructDeclaration(MkListOne(MkSpecifier(CHAR)), MkListOne(MkDeclaratorArray(MkDeclaratorIdentifier(MkIdentifier("__ecere_padding")), MkExpConstant(sizeString))), (((void *)0)))));
10817 if(addedPadding)
10818 *addedPadding = 1;
10819 }
10820 }
10821 if(context)
10822 FinishTemplatesContext(context);
10823 return topMember ? topMember->memberID : _class->memberID;
10824 }
10825
10826 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)
10827 {
10828 if(source && dest)
10829 {
10830 if(warnConst)
10831 CheckConstCompatibility(source, dest, 1);
10832 if(source->kind == 20 && dest->kind != 20)
10833 {
10834 struct Type * type = ProcessTemplateParameterType(source->__anon1.templateParameter);
10835
10836 if(type)
10837 source = type;
10838 }
10839 if(dest->kind == 20 && source->kind != 20)
10840 {
10841 struct Type * type = ProcessTemplateParameterType(dest->__anon1.templateParameter);
10842
10843 if(type)
10844 dest = type;
10845 }
10846 if(dest->classObjectType == 2 && dest->kind != 11)
10847 {
10848 if(source->classObjectType != 3)
10849 return 1;
10850 else
10851 {
10852 if((dest->__anon1._class && strcmp(dest->__anon1._class->string, "class")) || (source->__anon1._class && strcmp(source->__anon1._class->string, "class")))
10853 {
10854 return 1;
10855 }
10856 }
10857 }
10858 else
10859 {
10860 if(source->kind != 11 && source->classObjectType == 3)
10861 return 1;
10862 if(dest->kind != 11 && dest->classObjectType == 3 && source->classObjectType != 2)
10863 return 1;
10864 }
10865 if((dest->kind == 9 && source->kind == 9) || (dest->kind == 10 && source->kind == 10))
10866 {
10867 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))
10868 return 1;
10869 }
10870 if(dest->kind == 14 && source->kind != 0)
10871 return 1;
10872 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))
10873 return 1;
10874 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))
10875 return 1;
10876 if(((source->kind == 8 && dest->kind == 8) || (source->kind == 19 && dest->kind == 19)) && source->__anon1._class)
10877 {
10878 if(source->__anon1._class->__anon1.registered && source->__anon1._class->__anon1.registered->type == 3)
10879 {
10880 if(conversions != (((void *)0)))
10881 {
10882 if(source->__anon1._class->__anon1.registered == dest->__anon1._class->__anon1.registered)
10883 return 1;
10884 }
10885 else
10886 {
10887 struct __ecereNameSpace__ecere__com__Class * sourceBase, * destBase;
10888
10889 for(sourceBase = source->__anon1._class->__anon1.registered; sourceBase && sourceBase->base->type != 1000; sourceBase = sourceBase->base)
10890 ;
10891 for(destBase = dest->__anon1._class->__anon1.registered; destBase && destBase->base->type != 1000; destBase = destBase->base)
10892 ;
10893 if(sourceBase == destBase)
10894 return 1;
10895 }
10896 }
10897 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))
10898 return 1;
10899 else
10900 {
10901 if(enumBaseType && dest->__anon1._class && dest->__anon1._class->__anon1.registered && dest->__anon1._class->__anon1.registered->type == 4 && ((source->__anon1._class && source->__anon1._class->__anon1.registered && source->__anon1._class->__anon1.registered->type != 4) || source->kind == 8))
10902 {
10903 if(__ecereNameSpace__ecere__com__eClass_IsDerived(dest->__anon1._class->__anon1.registered, source->__anon1._class->__anon1.registered))
10904 {
10905 return 1;
10906 }
10907 }
10908 }
10909 }
10910 if(source->kind == 19 && dest->kind == 8 && dest->__anon1._class && !strcmp(dest->__anon1._class->string, "ecere::com::Class"))
10911 return 1;
10912 if(doConversion)
10913 {
10914 if(source->kind == 8)
10915 {
10916 struct __ecereNameSpace__ecere__com__Class * _class;
10917
10918 for(_class = source->__anon1._class ? source->__anon1._class->__anon1.registered : (((void *)0)); _class; _class = _class->base)
10919 {
10920 struct __ecereNameSpace__ecere__com__Property * convert;
10921
10922 for(convert = _class->conversions.first; convert; convert = convert->next)
10923 {
10924 if(convert->memberAccess == 1 || _class->module == privateModule)
10925 {
10926 struct Conversion * after = (conversions != (((void *)0))) ? conversions->last : (((void *)0));
10927
10928 if(!convert->dataType)
10929 convert->dataType = ProcessTypeString(convert->dataTypeString, 0);
10930 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))
10931 {
10932 if(!conversions && !convert->Get)
10933 return 1;
10934 else if(conversions != (((void *)0)))
10935 {
10936 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))
10937 return 1;
10938 else
10939 {
10940 struct Conversion * conv = (conv = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Conversion), conv->convert = convert, conv->isGet = 1, conv);
10941
10942 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert(conversions, after, conv);
10943 return 1;
10944 }
10945 }
10946 }
10947 }
10948 }
10949 }
10950 }
10951 if(dest->kind == 8)
10952 {
10953 struct __ecereNameSpace__ecere__com__Class * _class;
10954
10955 for(_class = dest->__anon1._class ? dest->__anon1._class->__anon1.registered : (((void *)0)); _class; _class = _class->base)
10956 {
10957 struct __ecereNameSpace__ecere__com__Property * convert;
10958
10959 for(convert = _class->conversions.first; convert; convert = convert->next)
10960 {
10961 if(convert->memberAccess == 1 || _class->module == privateModule)
10962 {
10963 struct Type * constType = (((void *)0));
10964 unsigned int success = 0;
10965
10966 if(!convert->dataType)
10967 convert->dataType = ProcessTypeString(convert->dataTypeString, 0);
10968 if(warnConst && convert->dataType->kind == 13 && convert->dataType->__anon1.type && dest->constant)
10969 {
10970 struct Type * ptrType = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
10971
10972 constType = __extension__ ({
10973 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
10974
10975 __ecereInstance1->kind = 13, __ecereInstance1->refCount = 1, __ecereInstance1->__anon1.type = ptrType, __ecereInstance1;
10976 });
10977 CopyTypeInto(ptrType, convert->dataType->__anon1.type);
10978 ptrType->constant = 1;
10979 }
10980 if((constType || convert->dataType != dest) && MatchTypes(source, constType ? constType : convert->dataType, conversions, (((void *)0)), (((void *)0)), 1, 0, 0, 1, warnConst))
10981 {
10982 if(!conversions && !convert->Set)
10983 success = 1;
10984 else if(conversions != (((void *)0)))
10985 {
10986 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))
10987 success = 1;
10988 else
10989 {
10990 struct Conversion * conv = (conv = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Conversion), conv->convert = convert, conv);
10991
10992 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(conversions, conv);
10993 success = 1;
10994 }
10995 }
10996 }
10997 if(constType)
10998 FreeType(constType);
10999 if(success)
11000 return 1;
11001 }
11002 }
11003 }
11004 if(enumBaseType && dest->__anon1._class && dest->__anon1._class->__anon1.registered && dest->__anon1._class->__anon1.registered->type == 4)
11005 {
11006 if(!dest->__anon1._class->__anon1.registered->dataType)
11007 dest->__anon1._class->__anon1.registered->dataType = ProcessTypeString(dest->__anon1._class->__anon1.registered->dataTypeString, 0);
11008 if(dest->__anon1._class->__anon1.registered->dataType->kind == 8 || source->truth || dest->truth)
11009 {
11010 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))
11011 {
11012 return 1;
11013 }
11014 }
11015 }
11016 }
11017 if(source->kind == 8)
11018 {
11019 struct __ecereNameSpace__ecere__com__Class * _class;
11020
11021 for(_class = source->__anon1._class ? source->__anon1._class->__anon1.registered : (((void *)0)); _class; _class = _class->base)
11022 {
11023 struct __ecereNameSpace__ecere__com__Property * convert;
11024
11025 for(convert = _class->conversions.first; convert; convert = convert->next)
11026 {
11027 if(convert->memberAccess == 1 || _class->module == privateModule)
11028 {
11029 struct Conversion * after = (conversions != (((void *)0))) ? conversions->last : (((void *)0));
11030
11031 if(!convert->dataType)
11032 convert->dataType = ProcessTypeString(convert->dataTypeString, 0);
11033 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))
11034 {
11035 if(!conversions && !convert->Get)
11036 return 1;
11037 else if(conversions != (((void *)0)))
11038 {
11039 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))
11040 return 1;
11041 else
11042 {
11043 struct Conversion * conv = (conv = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Conversion), conv->convert = convert, conv->isGet = 1, conv);
11044
11045 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert(conversions, after, conv);
11046 return 1;
11047 }
11048 }
11049 }
11050 }
11051 }
11052 }
11053 if(enumBaseType && source->__anon1._class && source->__anon1._class->__anon1.registered && source->__anon1._class->__anon1.registered->type == 4)
11054 {
11055 if(!source->__anon1._class->__anon1.registered->dataType)
11056 source->__anon1._class->__anon1.registered->dataType = ProcessTypeString(source->__anon1._class->__anon1.registered->dataTypeString, 0);
11057 if(!isConversionExploration || source->__anon1._class->__anon1.registered->dataType->kind == 8 || !strcmp(source->__anon1._class->__anon1.registered->name, "String"))
11058 {
11059 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))
11060 return 1;
11061 else if(MatchTypes(dest, source->__anon1._class->__anon1.registered->dataType, (((void *)0)), (((void *)0)), (((void *)0)), 0, 0, 0, 0, warnConst))
11062 return 1;
11063 }
11064 }
11065 }
11066 }
11067 if(source->kind == 8 || source->kind == 19)
11068 ;
11069 else if(dest->kind == source->kind && (dest->kind != 9 && dest->kind != 10 && dest->kind != 11 && dest->kind != 12 && dest->kind != 13 && dest->kind != 16))
11070 return 1;
11071 else if(dest->kind == 7 && source->kind == 6)
11072 return 1;
11073 else if(dest->kind == 2 && (source->kind == 1 || source->kind == 24))
11074 return 1;
11075 else if(dest->kind == 3 && (source->kind == 2 || source->kind == 1 || source->kind == 24 || source->kind == 23))
11076 return 1;
11077 else if(dest->kind == 4 && (source->kind == 2 || source->kind == 1 || source->kind == 24 || source->kind == 3 || source->kind == 22 || source->kind == 23))
11078 return 1;
11079 else if(dest->kind == 22 && (source->kind == 2 || source->kind == 1 || source->kind == 24 || source->kind == 3 || source->kind == 23 || source->kind == 4))
11080 return 1;
11081 else if(dest->kind == 23 && (source->kind == 2 || source->kind == 1 || source->kind == 24 || source->kind == 3 || source->kind == 4 || source->kind == 22))
11082 return 1;
11083 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))
11084 return 1;
11085 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))
11086 return 1;
11087 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)))
11088 {
11089 struct Type * paramSource, * paramDest;
11090
11091 if(dest->kind == 16)
11092 owningClassDest = dest->__anon1.__anon3.methodClass ? dest->__anon1.__anon3.methodClass : dest->__anon1.__anon3.method->_class;
11093 if(source->kind == 16)
11094 owningClassSource = source->__anon1.__anon3.methodClass ? source->__anon1.__anon3.methodClass : source->__anon1.__anon3.method->_class;
11095 if(dest->kind == 13 && dest->__anon1.type->kind == 11)
11096 dest = dest->__anon1.type;
11097 if(source->kind == 13 && source->__anon1.type->kind == 11)
11098 source = source->__anon1.type;
11099 if(dest->kind == 16)
11100 dest = dest->__anon1.__anon3.method->dataType;
11101 if(source->kind == 16)
11102 source = source->__anon1.__anon3.method->dataType;
11103 paramSource = source->__anon1.__anon2.params.first;
11104 if(paramSource && paramSource->kind == 0)
11105 paramSource = (((void *)0));
11106 paramDest = dest->__anon1.__anon2.params.first;
11107 if(paramDest && paramDest->kind == 0)
11108 paramDest = (((void *)0));
11109 if((dest->__anon1.__anon2.staticMethod || (!dest->__anon1.__anon2.thisClass && !owningClassDest)) && !(source->__anon1.__anon2.staticMethod || (!source->__anon1.__anon2.thisClass && !owningClassSource)))
11110 {
11111 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))))
11112 {
11113 if(paramDest && paramDest->kind == 8)
11114 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "method class must be derived from %s\n", (((void *)0))), paramDest->__anon1._class->string);
11115 else
11116 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "method class should not take an object\n", (((void *)0))));
11117 return 0;
11118 }
11119 paramDest = paramDest->next;
11120 }
11121 else if(!dest->__anon1.__anon2.staticMethod && (dest->__anon1.__anon2.thisClass || owningClassDest))
11122 {
11123 if((source->__anon1.__anon2.staticMethod || (!source->__anon1.__anon2.thisClass && !owningClassSource)))
11124 {
11125 if(dest->__anon1.__anon2.thisClass)
11126 {
11127 if(!paramSource || paramSource->kind != 8 || !__ecereNameSpace__ecere__com__eClass_IsDerived(paramSource->__anon1._class->__anon1.registered, dest->__anon1.__anon2.thisClass->__anon1.registered))
11128 {
11129 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "method class must be derived from %s\n", (((void *)0))), dest->__anon1.__anon2.thisClass->string);
11130 return 0;
11131 }
11132 }
11133 else
11134 {
11135 if(!paramSource || paramSource->kind != 8 || (owningClassDest && !__ecereNameSpace__ecere__com__eClass_IsDerived(paramSource->__anon1._class->__anon1.registered, owningClassDest)))
11136 {
11137 if(owningClassDest)
11138 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "%s expected to be derived from method class\n", (((void *)0))), owningClassDest->fullName);
11139 else
11140 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "overriding class expected to be derived from method class\n", (((void *)0))));
11141 return 0;
11142 }
11143 }
11144 paramSource = paramSource->next;
11145 }
11146 else
11147 {
11148 if(dest->__anon1.__anon2.thisClass)
11149 {
11150 if(!__ecereNameSpace__ecere__com__eClass_IsDerived(source->__anon1.__anon2.thisClass ? source->__anon1.__anon2.thisClass->__anon1.registered : owningClassSource, dest->__anon1.__anon2.thisClass->__anon1.registered))
11151 {
11152 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "method class must be derived from %s\n", (((void *)0))), dest->__anon1.__anon2.thisClass->string);
11153 return 0;
11154 }
11155 }
11156 else
11157 {
11158 if(source->__anon1.__anon2.thisClass && source->__anon1.__anon2.thisClass->__anon1.registered && owningClassDest && !__ecereNameSpace__ecere__com__eClass_IsDerived(source->__anon1.__anon2.thisClass->__anon1.registered, owningClassDest))
11159 {
11160 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "%s expected to be derived from method class\n", (((void *)0))), source->__anon1.__anon2.thisClass->__anon1.registered->fullName);
11161 return 0;
11162 }
11163 }
11164 }
11165 }
11166 if(!MatchTypes(source->__anon1.__anon2.returnType, dest->__anon1.__anon2.returnType, (((void *)0)), (((void *)0)), (((void *)0)), 1, 1, 0, 0, warnConst))
11167 {
11168 Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "incompatible return type for function\n", (((void *)0))));
11169 return 0;
11170 }
11171 else
11172 CheckConstCompatibility(dest->__anon1.__anon2.returnType, source->__anon1.__anon2.returnType, 1);
11173 for(; paramDest; paramDest = paramDest->next)
11174 {
11175 if(!paramSource)
11176 {
11177 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "not enough parameters\n", (((void *)0))));
11178 return 0;
11179 }
11180 {
11181 struct Type * paramDestType = paramDest;
11182 struct Type * paramSourceType = paramSource;
11183 struct Type * type = paramDestType;
11184
11185 if(paramDest->kind == 20 && paramDest->__anon1.templateParameter->type == 0 && owningClassSource && paramSource->kind != 20)
11186 {
11187 int id = 0;
11188 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * curParam = (((void *)0));
11189 struct __ecereNameSpace__ecere__com__Class * sClass;
11190
11191 for(sClass = owningClassSource; sClass; sClass = sClass->base)
11192 {
11193 id = 0;
11194 if(sClass->templateClass)
11195 sClass = sClass->templateClass;
11196 for(curParam = sClass->templateParams.first; curParam; curParam = curParam->next)
11197 {
11198 if(curParam->type == 0 && !strcmp(type->__anon1.templateParameter->identifier->string, curParam->name))
11199 {
11200 for(sClass = sClass->base; sClass; sClass = sClass->base)
11201 {
11202 if(sClass->templateClass)
11203 sClass = sClass->templateClass;
11204 id += sClass->templateParams.count;
11205 }
11206 break;
11207 }
11208 id++;
11209 }
11210 if(curParam)
11211 break;
11212 }
11213 if(curParam)
11214 {
11215 struct __ecereNameSpace__ecere__com__ClassTemplateArgument arg = owningClassSource->templateArgs[id];
11216
11217 paramDestType = type = ProcessTypeString(arg.__anon1.__anon1.dataTypeString, 0);
11218 }
11219 }
11220 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)))
11221 {
11222 char type[1024];
11223
11224 type[0] = (char)0;
11225 PrintType(paramDest, type, 0, 1);
11226 Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "incompatible parameter %s (expected %s)\n", (((void *)0))), paramSource->name, type);
11227 if(paramDestType != paramDest)
11228 FreeType(paramDestType);
11229 return 0;
11230 }
11231 if(paramDestType != paramDest)
11232 FreeType(paramDestType);
11233 }
11234 paramSource = paramSource->next;
11235 }
11236 if(paramSource)
11237 {
11238 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "too many parameters\n", (((void *)0))));
11239 return 0;
11240 }
11241 return 1;
11242 }
11243 else if((dest->kind == 11 || (dest->kind == 13 && dest->__anon1.type->kind == 11) || dest->kind == 16) && (source->kind == 13 && source->__anon1.type->kind == 0))
11244 {
11245 return 1;
11246 }
11247 else if((dest->kind == 13 || dest->kind == 12) && (source->kind == 12 || source->kind == 13))
11248 {
11249 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))
11250 {
11251 ComputeTypeSize(source->__anon1.type);
11252 ComputeTypeSize(dest->__anon1.type);
11253 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))
11254 return 1;
11255 }
11256 }
11257 }
11258 return 0;
11259 }
11260
11261 void ComputeInstantiation(struct Expression * exp)
11262 {
11263 struct Instantiation * inst = exp->__anon1.instance;
11264 struct MembersInit * members;
11265 struct Symbol * classSym = inst->_class ? inst->_class->__anon1.__anon1.symbol : (((void *)0));
11266 struct __ecereNameSpace__ecere__com__Class * _class = classSym ? classSym->__anon1.registered : (((void *)0));
11267 struct __ecereNameSpace__ecere__com__DataMember * curMember = (((void *)0));
11268 struct __ecereNameSpace__ecere__com__Class * curClass = (((void *)0));
11269 struct __ecereNameSpace__ecere__com__DataMember * subMemberStack[256];
11270 int subMemberStackPos = 0;
11271 uint64 bits = 0;
11272
11273 if(_class && (_class->type == 1 || _class->type == 0 || _class->type == 5))
11274 {
11275 if(inst->data)
11276 return ;
11277 if(_class->type == 0 || _class->type == 5)
11278 {
11279 inst->data = (unsigned char *)__ecereNameSpace__ecere__com__eInstance_New(_class);
11280 if(_class->type == 0)
11281 ((struct __ecereNameSpace__ecere__com__Instance *)(char *)((struct __ecereNameSpace__ecere__com__Instance *)inst->data))->_refCount++;
11282 }
11283 else
11284 inst->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize));
11285 }
11286 if(inst->members)
11287 {
11288 for(members = (*inst->members).first; members; members = members->next)
11289 {
11290 switch(members->type)
11291 {
11292 case 0:
11293 {
11294 if(members->__anon1.dataMembers)
11295 {
11296 struct MemberInit * member;
11297
11298 for(member = (*members->__anon1.dataMembers).first; member; member = member->next)
11299 {
11300 struct Identifier * ident = member->identifiers ? (*member->identifiers).first : (((void *)0));
11301 unsigned int found = 0;
11302 struct __ecereNameSpace__ecere__com__Property * prop = (((void *)0));
11303 struct __ecereNameSpace__ecere__com__DataMember * dataMember = (((void *)0));
11304 unsigned int dataMemberOffset;
11305
11306 if(!ident)
11307 {
11308 __ecereNameSpace__ecere__com__eClass_FindNextMember(_class, &curClass, &curMember, subMemberStack, &subMemberStackPos);
11309 if(curMember)
11310 {
11311 if(curMember->isProperty)
11312 prop = (struct __ecereNameSpace__ecere__com__Property *)curMember;
11313 else
11314 {
11315 dataMember = curMember;
11316 __ecereNameSpace__ecere__com__eClass_FindDataMemberAndOffset(_class, dataMember->name, &dataMemberOffset, privateModule, (((void *)0)), (((void *)0)));
11317 if(_class->type == 0)
11318 dataMemberOffset += _class->base->structSize;
11319 }
11320 found = 1;
11321 }
11322 }
11323 else
11324 {
11325 prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, ident->string, privateModule);
11326 if(prop)
11327 {
11328 found = 1;
11329 if(prop->memberAccess == 1)
11330 {
11331 curMember = (struct __ecereNameSpace__ecere__com__DataMember *)prop;
11332 curClass = prop->_class;
11333 }
11334 }
11335 else
11336 {
11337 struct __ecereNameSpace__ecere__com__DataMember * _subMemberStack[256];
11338 int _subMemberStackPos = 0;
11339
11340 dataMember = __ecereNameSpace__ecere__com__eClass_FindDataMemberAndOffset(_class, ident->string, &dataMemberOffset, privateModule, _subMemberStack, &_subMemberStackPos);
11341 if(dataMember)
11342 {
11343 found = 1;
11344 if(dataMember->memberAccess == 1)
11345 {
11346 curMember = dataMember;
11347 curClass = dataMember->_class;
11348 memcpy(subMemberStack, _subMemberStack, sizeof(struct __ecereNameSpace__ecere__com__DataMember *) * _subMemberStackPos);
11349 subMemberStackPos = _subMemberStackPos;
11350 }
11351 }
11352 }
11353 }
11354 if(found && member->initializer && member->initializer->type == 0)
11355 {
11356 struct Expression * value = member->initializer->__anon1.exp;
11357 struct Type * type = (((void *)0));
11358 unsigned int deepMember = 0;
11359
11360 if(prop)
11361 {
11362 type = prop->dataType;
11363 }
11364 else if(dataMember)
11365 {
11366 if(!dataMember->dataType)
11367 dataMember->dataType = ProcessTypeString(dataMember->dataTypeString, 0);
11368 type = dataMember->dataType;
11369 }
11370 if(ident && ident->next)
11371 {
11372 deepMember = 1;
11373 for(ident = ident->next; ident && type; ident = ident->next)
11374 {
11375 if(type->kind == 8)
11376 {
11377 prop = __ecereNameSpace__ecere__com__eClass_FindProperty(type->__anon1._class->__anon1.registered, ident->string, privateModule);
11378 if(prop)
11379 type = prop->dataType;
11380 else
11381 {
11382 dataMember = __ecereNameSpace__ecere__com__eClass_FindDataMemberAndOffset(type->__anon1._class->__anon1.registered, ident->string, &dataMemberOffset, privateModule, (((void *)0)), (((void *)0)));
11383 if(dataMember)
11384 type = dataMember->dataType;
11385 }
11386 }
11387 else if(type->kind == 9 || type->kind == 10)
11388 {
11389 struct Type * memberType;
11390
11391 for(memberType = type->__anon1.__anon1.members.first; memberType; memberType = memberType->next)
11392 {
11393 if(!strcmp(memberType->name, ident->string))
11394 {
11395 type = memberType;
11396 break;
11397 }
11398 }
11399 }
11400 }
11401 }
11402 if(value)
11403 {
11404 FreeType(value->destType);
11405 value->destType = type;
11406 if(type)
11407 type->refCount++;
11408 ComputeExpression(value);
11409 }
11410 if(!deepMember && type && value && (_class->type == 1 || _class->type == 0 || _class->type == 5))
11411 {
11412 if(type->kind == 8)
11413 {
11414 struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class->__anon1.registered;
11415
11416 if(_class && (_class->type == 2 || _class->type == 3 || _class->type == 4))
11417 {
11418 if(!_class->dataType)
11419 _class->dataType = ProcessTypeString(_class->dataTypeString, 0);
11420 type = _class->dataType;
11421 }
11422 }
11423 if(dataMember)
11424 {
11425 void * ptr = inst->data + dataMemberOffset;
11426
11427 if(value->type == 2)
11428 {
11429 switch(type->kind)
11430 {
11431 case 3:
11432 {
11433 GetInt(value, (int *)ptr);
11434 break;
11435 }
11436 case 4:
11437 {
11438 GetInt64(value, (long long *)ptr);
11439 break;
11440 }
11441 case 22:
11442 {
11443 GetIntPtr(value, (intptr_t *)ptr);
11444 break;
11445 }
11446 case 23:
11447 {
11448 GetIntSize(value, (ssize_t *)ptr);
11449 break;
11450 }
11451 case 6:
11452 {
11453 GetFloat(value, (float *)ptr);
11454 break;
11455 }
11456 case 7:
11457 {
11458 GetDouble(value, (double *)ptr);
11459 break;
11460 }
11461 }
11462 }
11463 else if(value->type == 1)
11464 {
11465 if(type->kind == 8)
11466 {
11467 struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class->__anon1.registered;
11468
11469 if(_class->type == 1)
11470 {
11471 ComputeTypeSize(type);
11472 if(value->__anon1.instance->data)
11473 memcpy(ptr, value->__anon1.instance->data, type->size);
11474 }
11475 }
11476 }
11477 }
11478 else if(prop && prop->Set != (void *)(intptr_t)1)
11479 {
11480 if(value->type == 1 && value->__anon1.instance->data)
11481 {
11482 if(type->kind == 8)
11483 {
11484 struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class->__anon1.registered;
11485
11486 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)))
11487 {
11488 void (* Set)(void *, void *) = (void *)prop->Set;
11489
11490 Set(inst->data, value->__anon1.instance->data);
11491 PopulateInstance(inst);
11492 }
11493 }
11494 }
11495 else if(value->type == 2)
11496 {
11497 switch(type->kind)
11498 {
11499 case 7:
11500 {
11501 void (* Set)(void *, double) = (void *)prop->Set;
11502
11503 Set(inst->data, strtod(value->__anon1.__anon1.constant, (((void *)0))));
11504 break;
11505 }
11506 case 6:
11507 {
11508 void (* Set)(void *, float) = (void *)prop->Set;
11509
11510 Set(inst->data, (float)(strtod(value->__anon1.__anon1.constant, (((void *)0)))));
11511 break;
11512 }
11513 case 3:
11514 {
11515 void (* Set)(void *, int) = (void *)prop->Set;
11516
11517 Set(inst->data, strtol(value->__anon1.__anon1.constant, (((void *)0)), 0));
11518 break;
11519 }
11520 case 4:
11521 {
11522 void (* Set)(void *, long long) = (void *)prop->Set;
11523
11524 Set(inst->data, __ecereNameSpace__ecere__com___strtoi64(value->__anon1.__anon1.constant, (((void *)0)), 0));
11525 break;
11526 }
11527 case 22:
11528 {
11529 void (* Set)(void *, intptr_t) = (void *)prop->Set;
11530
11531 Set(inst->data, (intptr_t)__ecereNameSpace__ecere__com___strtoi64(value->__anon1.__anon1.constant, (((void *)0)), 0));
11532 break;
11533 }
11534 case 23:
11535 {
11536 void (* Set)(void *, ssize_t) = (void *)prop->Set;
11537
11538 Set(inst->data, (ssize_t)__ecereNameSpace__ecere__com___strtoi64(value->__anon1.__anon1.constant, (((void *)0)), 0));
11539 break;
11540 }
11541 }
11542 }
11543 else if(value->type == 3)
11544 {
11545 char temp[1024];
11546
11547 ReadString(temp, value->__anon1.__anon2.string);
11548 ((void (*)(void *, void *))(void *)prop->Set)(inst->data, temp);
11549 }
11550 }
11551 }
11552 else if(!deepMember && type && _class->type == 3)
11553 {
11554 if(prop)
11555 {
11556 if(value->type == 2)
11557 {
11558 if(type->kind == 8)
11559 {
11560 struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class->__anon1.registered;
11561
11562 if(_class->type == 3)
11563 {
11564 if(!_class->dataType)
11565 _class->dataType = ProcessTypeString(_class->dataTypeString, 0);
11566 type = _class->dataType;
11567 }
11568 }
11569 switch(type->kind)
11570 {
11571 case 6:
11572 {
11573 float fValue;
11574 float (* Set)(float) = (void *)prop->Set;
11575
11576 GetFloat(member->initializer->__anon1.exp, &fValue);
11577 exp->__anon1.__anon1.constant = PrintFloat(Set(fValue));
11578 exp->type = 2;
11579 break;
11580 }
11581 case 7:
11582 {
11583 double dValue;
11584 double (* Set)(double) = (void *)prop->Set;
11585
11586 GetDouble(member->initializer->__anon1.exp, &dValue);
11587 exp->__anon1.__anon1.constant = PrintDouble(Set(dValue));
11588 exp->type = 2;
11589 break;
11590 }
11591 }
11592 }
11593 }
11594 }
11595 else if(!deepMember && type && _class->type == 2)
11596 {
11597 if(prop)
11598 {
11599 if(value->type == 1 && value->__anon1.instance->data)
11600 {
11601 unsigned int (* Set)(void *) = (void *)prop->Set;
11602
11603 bits = Set(value->__anon1.instance->data);
11604 }
11605 else if(value->type == 2)
11606 {
11607 }
11608 }
11609 else if(dataMember)
11610 {
11611 struct __ecereNameSpace__ecere__com__BitMember * bitMember = (struct __ecereNameSpace__ecere__com__BitMember *)dataMember;
11612 struct Type * type;
11613 uint64 part = 0;
11614
11615 bits = (bits & ~bitMember->mask);
11616 if(!bitMember->dataType)
11617 bitMember->dataType = ProcessTypeString(bitMember->dataTypeString, 0);
11618 type = bitMember->dataType;
11619 if(type->kind == 8 && type->__anon1._class && type->__anon1._class->__anon1.registered)
11620 {
11621 if(!type->__anon1._class->__anon1.registered->dataType)
11622 type->__anon1._class->__anon1.registered->dataType = ProcessTypeString(type->__anon1._class->__anon1.registered->dataTypeString, 0);
11623 type = type->__anon1._class->__anon1.registered->dataType;
11624 }
11625 switch(type->kind)
11626 {
11627 case 24:
11628 case 1:
11629 {
11630 unsigned char v;
11631
11632 type->isSigned ? GetChar(value, (char *)&v) : GetUChar(value, &v);
11633 part = (uint64)v;
11634 break;
11635 }
11636 case 2:
11637 {
11638 unsigned short v;
11639
11640 type->isSigned ? GetShort(value, (short *)&v) : GetUShort(value, &v);
11641 part = (uint64)v;
11642 break;
11643 }
11644 case 3:
11645 case 5:
11646 {
11647 unsigned int v;
11648
11649 type->isSigned ? GetInt(value, (int *)&v) : GetUInt(value, &v);
11650 part = (uint64)v;
11651 break;
11652 }
11653 case 4:
11654 {
11655 uint64 v;
11656
11657 type->isSigned ? GetInt64(value, (long long *)&v) : GetUInt64(value, &v);
11658 part = v;
11659 break;
11660 }
11661 case 22:
11662 {
11663 uintptr_t v;
11664
11665 type->isSigned ? GetIntPtr(value, (intptr_t *)&v) : GetUIntPtr(value, &v);
11666 part = (uint64)v;
11667 break;
11668 }
11669 case 23:
11670 {
11671 size_t v;
11672
11673 type->isSigned ? GetIntSize(value, (ssize_t *)&v) : GetUIntSize(value, &v);
11674 part = (uint64)v;
11675 break;
11676 }
11677 }
11678 bits |= part << bitMember->pos;
11679 }
11680 }
11681 }
11682 else
11683 {
11684 if(_class && _class->type == 3)
11685 {
11686 ComputeExpression(member->initializer->__anon1.exp);
11687 exp->__anon1.__anon1.constant = member->initializer->__anon1.exp->__anon1.__anon1.constant;
11688 exp->type = 2;
11689 member->initializer->__anon1.exp->__anon1.__anon1.constant = (((void *)0));
11690 }
11691 }
11692 }
11693 }
11694 break;
11695 }
11696 }
11697 }
11698 }
11699 if(_class && _class->type == 2)
11700 {
11701 exp->__anon1.__anon1.constant = PrintHexUInt(bits);
11702 exp->type = 2;
11703 }
11704 if(exp->type != 1)
11705 {
11706 FreeInstance(inst);
11707 }
11708 }
11709
11710 void CallOperator(struct Expression * exp, struct Expression * exp1, struct Expression * exp2, struct Operand * op1, struct Operand * op2)
11711 {
11712 if(exp->__anon1.op.op == SIZEOF)
11713 {
11714 FreeExpContents(exp);
11715 exp->type = 2;
11716 exp->__anon1.__anon1.constant = PrintUInt(ComputeTypeSize(op1->type));
11717 }
11718 else
11719 {
11720 if(!exp->__anon1.op.exp1)
11721 {
11722 switch(exp->__anon1.op.op)
11723 {
11724 case '+':
11725 {
11726 struct Expression * exp2 = exp->__anon1.op.exp2;
11727
11728 exp->__anon1.op.exp2 = (((void *)0));
11729 FreeExpContents(exp);
11730 FreeType(exp->expType);
11731 FreeType(exp->destType);
11732 *exp = *exp2;
11733 ((exp2 ? (__ecereClass_Expression->Destructor ? __ecereClass_Expression->Destructor((void *)exp2) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(exp2)) : 0), exp2 = 0);
11734 break;
11735 }
11736 case '-':
11737 if(op1->ops.Neg)
11738 {
11739 FreeExpContents(exp);
11740 op1->ops.Neg(exp, op1);
11741 }
11742 break;
11743 case '~':
11744 if(op1->ops.BitNot)
11745 {
11746 FreeExpContents(exp);
11747 op1->ops.BitNot(exp, op1);
11748 }
11749 break;
11750 case '!':
11751 if(op1->ops.Not)
11752 {
11753 FreeExpContents(exp);
11754 op1->ops.Not(exp, op1);
11755 }
11756 break;
11757 }
11758 }
11759 else
11760 {
11761 if(op1 && op2 && op1->type && op2->type && op1->kind != op2->kind)
11762 {
11763 if(Promote(op2, op1->kind, op1->type->isSigned))
11764 op2->kind = op1->kind, op2->ops = op1->ops;
11765 else if(Promote(op1, op2->kind, op2->type->isSigned))
11766 op1->kind = op2->kind, op1->ops = op2->ops;
11767 }
11768 switch(exp->__anon1.op.op)
11769 {
11770 case '+':
11771 if(op1->ops.Add)
11772 {
11773 FreeExpContents(exp);
11774 op1->ops.Add(exp, op1, op2);
11775 }
11776 break;
11777 case '-':
11778 if(op1->ops.Sub)
11779 {
11780 FreeExpContents(exp);
11781 op1->ops.Sub(exp, op1, op2);
11782 }
11783 break;
11784 case '*':
11785 if(op1->ops.Mul)
11786 {
11787 FreeExpContents(exp);
11788 op1->ops.Mul(exp, op1, op2);
11789 }
11790 break;
11791 case '/':
11792 if(op1->ops.Div)
11793 {
11794 FreeExpContents(exp);
11795 op1->ops.Div(exp, op1, op2);
11796 }
11797 break;
11798 case '%':
11799 if(op1->ops.Mod)
11800 {
11801 FreeExpContents(exp);
11802 op1->ops.Mod(exp, op1, op2);
11803 }
11804 break;
11805 case '&':
11806 if(exp->__anon1.op.exp2)
11807 {
11808 if(op1->ops.BitAnd)
11809 {
11810 FreeExpContents(exp);
11811 op1->ops.BitAnd(exp, op1, op2);
11812 }
11813 }
11814 break;
11815 case '|':
11816 if(op1->ops.BitOr)
11817 {
11818 FreeExpContents(exp);
11819 op1->ops.BitOr(exp, op1, op2);
11820 }
11821 break;
11822 case '^':
11823 if(op1->ops.BitXor)
11824 {
11825 FreeExpContents(exp);
11826 op1->ops.BitXor(exp, op1, op2);
11827 }
11828 break;
11829 case LEFT_OP:
11830 if(op1->ops.LShift)
11831 {
11832 FreeExpContents(exp);
11833 op1->ops.LShift(exp, op1, op2);
11834 }
11835 break;
11836 case RIGHT_OP:
11837 if(op1->ops.RShift)
11838 {
11839 FreeExpContents(exp);
11840 op1->ops.RShift(exp, op1, op2);
11841 }
11842 break;
11843 case EQ_OP:
11844 if(op1->ops.Equ)
11845 {
11846 FreeExpContents(exp);
11847 op1->ops.Equ(exp, op1, op2);
11848 }
11849 break;
11850 case NE_OP:
11851 if(op1->ops.Nqu)
11852 {
11853 FreeExpContents(exp);
11854 op1->ops.Nqu(exp, op1, op2);
11855 }
11856 break;
11857 case AND_OP:
11858 if(op1->ops.And)
11859 {
11860 FreeExpContents(exp);
11861 op1->ops.And(exp, op1, op2);
11862 }
11863 break;
11864 case OR_OP:
11865 if(op1->ops.Or)
11866 {
11867 FreeExpContents(exp);
11868 op1->ops.Or(exp, op1, op2);
11869 }
11870 break;
11871 case '>':
11872 if(op1->ops.Grt)
11873 {
11874 FreeExpContents(exp);
11875 op1->ops.Grt(exp, op1, op2);
11876 }
11877 break;
11878 case '<':
11879 if(op1->ops.Sma)
11880 {
11881 FreeExpContents(exp);
11882 op1->ops.Sma(exp, op1, op2);
11883 }
11884 break;
11885 case GE_OP:
11886 if(op1->ops.GrtEqu)
11887 {
11888 FreeExpContents(exp);
11889 op1->ops.GrtEqu(exp, op1, op2);
11890 }
11891 break;
11892 case LE_OP:
11893 if(op1->ops.SmaEqu)
11894 {
11895 FreeExpContents(exp);
11896 op1->ops.SmaEqu(exp, op1, op2);
11897 }
11898 break;
11899 }
11900 }
11901 }
11902 }
11903
11904 void ApplyAnyObjectLogic(struct Expression * e)
11905 {
11906 struct Type * destType = e->destType;
11907
11908 if(destType && (destType->classObjectType == 3))
11909 {
11910 if(e && e->expType)
11911 {
11912 struct Type * type = e->expType;
11913 struct __ecereNameSpace__ecere__com__Class * _class = (((void *)0));
11914
11915 if(type->kind == 8 && type->__anon1._class && type->__anon1._class->__anon1.registered)
11916 {
11917 _class = type->__anon1._class->__anon1.registered;
11918 }
11919 else if(type->kind == 19)
11920 {
11921 _class = FindClass("ecere::com::Class")->__anon1.registered;
11922 }
11923 else
11924 {
11925 char string[1024] = "";
11926 struct Symbol * classSym;
11927
11928 PrintTypeNoConst(type, string, 0, 1);
11929 classSym = FindClass(string);
11930 if(classSym)
11931 _class = classSym->__anon1.registered;
11932 }
11933 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)))
11934 {
11935 if(!_class || strcmp(_class->fullName, "char *"))
11936 {
11937 struct Expression * checkedExp = e, * newExp;
11938
11939 while(((checkedExp->type == 5 || checkedExp->type == 32 || checkedExp->type == 23) && checkedExp->__anon1.list) || checkedExp->type == 11)
11940 {
11941 if(checkedExp->type == 5 || checkedExp->type == 32 || checkedExp->type == 23)
11942 {
11943 if(checkedExp->type == 23)
11944 {
11945 checkedExp = (*((struct Statement *)(*checkedExp->__anon1.compound->__anon1.compound.statements).last)->__anon1.expressions).last;
11946 }
11947 else
11948 checkedExp = (*checkedExp->__anon1.list).last;
11949 }
11950 else if(checkedExp->type == 11)
11951 checkedExp = checkedExp->__anon1.cast.exp;
11952 }
11953 if(checkedExp && checkedExp->type == 4 && checkedExp->__anon1.op.op == '*' && !checkedExp->__anon1.op.exp1)
11954 {
11955 newExp = checkedExp->__anon1.op.exp2;
11956 checkedExp->__anon1.op.exp2 = (((void *)0));
11957 FreeExpContents(checkedExp);
11958 if(e->expType && e->expType->passAsTemplate)
11959 {
11960 char size[100];
11961
11962 ComputeTypeSize(e->expType);
11963 sprintf(size, "%d", e->expType->size);
11964 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))))));
11965 }
11966 ReplaceExpContents(checkedExp, newExp);
11967 e->byReference = 1;
11968 }
11969 else if(!e->byReference || (_class && _class->type == 5))
11970 {
11971 struct Expression * checkedExp;
11972
11973 {
11974 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;
11975
11976 if(_class && _class->type != 5 && _class->type != 0 && _class->type != 1 && !hasAddress)
11977 {
11978 struct Context * context = PushContext();
11979 struct Declarator * decl;
11980 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
11981 char typeString[1024];
11982 struct Expression * newExp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression);
11983
11984 typeString[0] = '\0';
11985 *newExp = *e;
11986 newExp->prev = (((void *)0));
11987 newExp->next = (((void *)0));
11988 newExp->expType = (((void *)0));
11989 PrintTypeNoConst(e->expType, typeString, 0, 1);
11990 decl = SpecDeclFromString(typeString, specs, (((void *)0)));
11991 newExp->destType = ProcessType(specs, decl);
11992 curContext = context;
11993 if(curCompound)
11994 {
11995 char name[100];
11996 struct __ecereNameSpace__ecere__sys__OldList * stmts = MkList();
11997
11998 e->type = 23;
11999 sprintf(name, "__internalValue%03X", internalValueCounter++);
12000 if(!curCompound->__anon1.compound.declarations)
12001 curCompound->__anon1.compound.declarations = MkList();
12002 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*curCompound->__anon1.compound.declarations), (((void *)0)), MkDeclaration(specs, MkListOne(MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier(name)), (((void *)0))))));
12003 ListAdd(stmts, MkExpressionStmt(MkListOne(MkExpOp(MkExpIdentifier(MkIdentifier(name)), '=', newExp))));
12004 ListAdd(stmts, MkExpressionStmt(MkListOne(MkExpIdentifier(MkIdentifier(name)))));
12005 e->__anon1.compound = MkCompoundStmt((((void *)0)), stmts);
12006 }
12007 else
12008 printf("libec: compiler error, curCompound is null in ApplyAnyObjectLogic\n");
12009 {
12010 struct Type * type = e->destType;
12011
12012 e->destType = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
12013 CopyTypeInto(e->destType, type);
12014 e->destType->refCount = 1;
12015 e->destType->classObjectType = 0;
12016 FreeType(type);
12017 }
12018 e->__anon1.compound->__anon1.compound.context = context;
12019 PopContext(context);
12020 curContext = context->parent;
12021 }
12022 }
12023 checkedExp = e;
12024 while(((checkedExp->type == 5 || checkedExp->type == 32 || checkedExp->type == 23) && checkedExp->__anon1.list) || checkedExp->type == 11)
12025 {
12026 if(checkedExp->type == 5 || checkedExp->type == 32 || checkedExp->type == 23)
12027 {
12028 if(checkedExp->type == 23)
12029 {
12030 checkedExp = (*((struct Statement *)(*checkedExp->__anon1.compound->__anon1.compound.statements).last)->__anon1.expressions).last;
12031 }
12032 else
12033 checkedExp = (*checkedExp->__anon1.list).last;
12034 }
12035 else if(checkedExp->type == 11)
12036 checkedExp = checkedExp->__anon1.cast.exp;
12037 }
12038 {
12039 struct Expression * operand = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression);
12040
12041 *operand = *checkedExp;
12042 __ecereMethod_Expression_Clear(checkedExp);
12043 checkedExp->destType = ProcessTypeString("void *", 0);
12044 checkedExp->expType = checkedExp->destType;
12045 checkedExp->destType->refCount++;
12046 checkedExp->type = 4;
12047 checkedExp->__anon1.op.op = '&';
12048 checkedExp->__anon1.op.exp1 = (((void *)0));
12049 checkedExp->__anon1.op.exp2 = operand;
12050 }
12051 }
12052 }
12053 }
12054 }
12055 }
12056 {
12057 }
12058 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))))
12059 {
12060 if(e->expType->classObjectType && destType && destType->classObjectType)
12061 {
12062 return ;
12063 }
12064 else
12065 {
12066 struct Expression * thisExp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression);
12067
12068 *thisExp = *e;
12069 thisExp->prev = (((void *)0));
12070 thisExp->next = (((void *)0));
12071 __ecereMethod_Expression_Clear(e);
12072 e->type = 5;
12073 e->__anon1.list = MkListOne(MkExpOp((((void *)0)), '*', thisExp->type == 0 ? thisExp : MkExpBrackets(MkListOne(thisExp))));
12074 if(thisExp->expType->kind == 8 && thisExp->expType->__anon1._class && thisExp->expType->__anon1._class->__anon1.registered && thisExp->expType->__anon1._class->__anon1.registered->type == 5)
12075 ((struct Expression *)(*e->__anon1.list).first)->byReference = 1;
12076 {
12077 e->expType = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
12078 CopyTypeInto(e->expType, thisExp->expType);
12079 e->expType->byReference = 0;
12080 e->expType->refCount = 1;
12081 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))
12082 {
12083 e->expType->classObjectType = 0;
12084 }
12085 }
12086 }
12087 }
12088 else if(destType && e->expType && (e->expType->classObjectType == 3 || e->expType->classObjectType == 2) && !destType->classObjectType && destType->kind != 0)
12089 {
12090 if(destType->kind == 14)
12091 {
12092 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Unspecified type\n", (((void *)0))));
12093 }
12094 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))
12095 {
12096 unsigned int byReference = e->expType->byReference;
12097 struct Expression * thisExp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression);
12098 struct Declarator * decl;
12099 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
12100 char typeString[1024];
12101 struct Type * type;
12102 int backupClassObjectType;
12103 unsigned int backupByReference;
12104
12105 if(e->expType->kind == 8 && e->expType->__anon1._class && e->expType->__anon1._class->__anon1.registered && strcmp(e->expType->__anon1._class->__anon1.registered->name, "class"))
12106 type = e->expType;
12107 else
12108 type = destType;
12109 backupClassObjectType = type->classObjectType;
12110 backupByReference = type->byReference;
12111 type->classObjectType = 0;
12112 type->byReference = 0;
12113 typeString[0] = '\0';
12114 PrintType(type, typeString, 0, 1);
12115 decl = SpecDeclFromString(typeString, specs, (((void *)0)));
12116 type->classObjectType = backupClassObjectType;
12117 type->byReference = backupByReference;
12118 *thisExp = *e;
12119 thisExp->prev = (((void *)0));
12120 thisExp->next = (((void *)0));
12121 __ecereMethod_Expression_Clear(e);
12122 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)))
12123 {
12124 unsigned int passAsTemplate = thisExp->destType->passAsTemplate;
12125 struct Type * t;
12126
12127 destType->refCount++;
12128 e->type = 4;
12129 e->__anon1.op.op = '*';
12130 e->__anon1.op.exp1 = (((void *)0));
12131 e->__anon1.op.exp2 = MkExpCast(MkTypeName(specs, MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), decl)), thisExp);
12132 t = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
12133 CopyTypeInto(t, thisExp->destType);
12134 t->passAsTemplate = 0;
12135 FreeType(thisExp->destType);
12136 thisExp->destType = t;
12137 t = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
12138 CopyTypeInto(t, destType);
12139 t->passAsTemplate = passAsTemplate;
12140 FreeType(destType);
12141 destType = t;
12142 destType->refCount = 0;
12143 e->expType = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
12144 CopyTypeInto(e->expType, type);
12145 if(type->passAsTemplate)
12146 {
12147 e->expType->classObjectType = 0;
12148 e->expType->passAsTemplate = 0;
12149 }
12150 e->expType->byReference = 0;
12151 e->expType->refCount = 1;
12152 }
12153 else
12154 {
12155 e->type = 11;
12156 e->__anon1.cast.typeName = MkTypeName(specs, decl);
12157 e->__anon1.cast.exp = thisExp;
12158 e->byReference = 1;
12159 e->expType = type;
12160 type->refCount++;
12161 }
12162 if(e->destType)
12163 FreeType(e->destType);
12164 e->destType = destType;
12165 destType->refCount++;
12166 }
12167 }
12168 }
12169
12170 void ComputeModuleClasses(struct __ecereNameSpace__ecere__com__Instance * module)
12171 {
12172 struct __ecereNameSpace__ecere__com__Class * _class;
12173 struct __ecereNameSpace__ecere__sys__OldLink * subModule;
12174
12175 for(subModule = ((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->modules.first; subModule; subModule = subModule->next)
12176 ComputeModuleClasses(subModule->data);
12177 for(_class = ((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->classes.first; _class; _class = _class->next)
12178 ComputeClassMembers(_class, 0);
12179 }
12180
12181 int ComputeTypeSize(struct Type * type)
12182 {
12183 unsigned int size = type ? type->size : 0;
12184
12185 if(!size && type && !type->computing)
12186 {
12187 type->computing = 1;
12188 switch(type->kind)
12189 {
12190 case 24:
12191 type->alignment = size = sizeof(char);
12192 break;
12193 case 1:
12194 type->alignment = size = sizeof(char);
12195 break;
12196 case 3:
12197 type->alignment = size = sizeof(int);
12198 break;
12199 case 4:
12200 type->alignment = size = sizeof(long long);
12201 break;
12202 case 22:
12203 type->alignment = size = targetBits / 8;
12204 type->pointerAlignment = 1;
12205 break;
12206 case 23:
12207 type->alignment = size = targetBits / 8;
12208 type->pointerAlignment = 1;
12209 break;
12210 case 5:
12211 type->alignment = size = sizeof(long);
12212 break;
12213 case 2:
12214 type->alignment = size = sizeof(short);
12215 break;
12216 case 6:
12217 type->alignment = size = sizeof(float);
12218 break;
12219 case 7:
12220 type->alignment = size = sizeof(double);
12221 break;
12222 case 8:
12223 {
12224 struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class ? type->__anon1._class->__anon1.registered : (((void *)0));
12225
12226 if(_class && _class->type == 1)
12227 {
12228 ComputeClassMembers(_class, 0);
12229 type->alignment = _class->structAlignment;
12230 type->pointerAlignment = (unsigned int)_class->pointerAlignment;
12231 size = _class->structSize;
12232 if(type->alignment && size % type->alignment)
12233 size += type->alignment - (size % type->alignment);
12234 }
12235 else if(_class && (_class->type == 3 || _class->type == 4 || _class->type == 2))
12236 {
12237 if(!_class->dataType)
12238 _class->dataType = ProcessTypeString(_class->dataTypeString, 0);
12239 size = type->alignment = ComputeTypeSize(_class->dataType);
12240 }
12241 else
12242 {
12243 size = type->alignment = targetBits / 8;
12244 type->pointerAlignment = 1;
12245 }
12246 break;
12247 }
12248 case 13:
12249 case 19:
12250 size = type->alignment = targetBits / 8;
12251 type->pointerAlignment = 1;
12252 break;
12253 case 12:
12254 if(type->__anon1.__anon4.arraySizeExp)
12255 {
12256 ProcessExpressionType(type->__anon1.__anon4.arraySizeExp);
12257 ComputeExpression(type->__anon1.__anon4.arraySizeExp);
12258 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)))
12259 {
12260 struct Location oldLoc = yylloc;
12261 char expression[10240];
12262
12263 expression[0] = '\0';
12264 type->__anon1.__anon4.arraySizeExp->expType = (((void *)0));
12265 yylloc = type->__anon1.__anon4.arraySizeExp->loc;
12266 if(inCompiler)
12267 PrintExpression(type->__anon1.__anon4.arraySizeExp, expression);
12268 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Array size not constant int (%s)\n", (((void *)0))), expression);
12269 yylloc = oldLoc;
12270 }
12271 GetInt(type->__anon1.__anon4.arraySizeExp, &type->__anon1.__anon4.arraySize);
12272 }
12273 else if(type->__anon1.__anon4.enumClass)
12274 {
12275 if(type->__anon1.__anon4.enumClass && type->__anon1.__anon4.enumClass->__anon1.registered && type->__anon1.__anon4.enumClass->__anon1.registered->type == 4)
12276 {
12277 type->__anon1.__anon4.arraySize = (int)__ecereNameSpace__ecere__com__eClass_GetProperty(type->__anon1.__anon4.enumClass->__anon1.registered, "enumSize");
12278 }
12279 else
12280 type->__anon1.__anon4.arraySize = 0;
12281 }
12282 else
12283 {
12284 type->__anon1.__anon4.arraySize = 0;
12285 }
12286 size = ComputeTypeSize(type->__anon1.type) * type->__anon1.__anon4.arraySize;
12287 if(type->__anon1.type)
12288 {
12289 type->alignment = type->__anon1.type->alignment;
12290 type->pointerAlignment = type->__anon1.type->pointerAlignment;
12291 }
12292 break;
12293 case 9:
12294 {
12295 if(!type->__anon1.__anon1.members.first && type->__anon1.__anon1.enumName)
12296 {
12297 struct Symbol * symbol = FindStruct(curContext, type->__anon1.__anon1.enumName);
12298
12299 if(symbol && symbol->type)
12300 {
12301 ComputeTypeSize(symbol->type);
12302 size = symbol->type->size;
12303 }
12304 }
12305 else
12306 {
12307 struct Type * member;
12308
12309 for(member = type->__anon1.__anon1.members.first; member; member = member->next)
12310 {
12311 int __simpleStruct0, __simpleStruct1;
12312 unsigned int addSize = ComputeTypeSize(member);
12313
12314 member->offset = size;
12315 if(member->alignment && size % member->alignment)
12316 member->offset += member->alignment - (size % member->alignment);
12317 size = member->offset;
12318 if(member->pointerAlignment && type->size <= 4)
12319 type->pointerAlignment = 1;
12320 else if(!member->pointerAlignment && member->alignment >= 8)
12321 type->pointerAlignment = 0;
12322 type->alignment = (__simpleStruct0 = type->alignment, __simpleStruct1 = member->alignment, (__simpleStruct0 > __simpleStruct1) ? __simpleStruct0 : __simpleStruct1);
12323 size += addSize;
12324 }
12325 if(type->alignment && size % type->alignment)
12326 size += type->alignment - (size % type->alignment);
12327 }
12328 break;
12329 }
12330 case 10:
12331 {
12332 if(!type->__anon1.__anon1.members.first && type->__anon1.__anon1.enumName)
12333 {
12334 struct Symbol * symbol = FindStruct(curContext, type->__anon1.__anon1.enumName);
12335
12336 if(symbol && symbol->type)
12337 {
12338 ComputeTypeSize(symbol->type);
12339 size = symbol->type->size;
12340 type->alignment = symbol->type->alignment;
12341 }
12342 }
12343 else
12344 {
12345 struct Type * member;
12346
12347 for(member = type->__anon1.__anon1.members.first; member; member = member->next)
12348 {
12349 int __simpleStruct0, __simpleStruct1;
12350 unsigned int addSize = ComputeTypeSize(member);
12351
12352 member->offset = size;
12353 if(member->alignment && size % member->alignment)
12354 member->offset += member->alignment - (size % member->alignment);
12355 size = member->offset;
12356 if(member->pointerAlignment && type->size <= 4)
12357 type->pointerAlignment = 1;
12358 else if(!member->pointerAlignment && member->alignment >= 8)
12359 type->pointerAlignment = 0;
12360 type->alignment = (__simpleStruct0 = type->alignment, __simpleStruct1 = member->alignment, (__simpleStruct0 > __simpleStruct1) ? __simpleStruct0 : __simpleStruct1);
12361 size = ((size > addSize) ? size : addSize);
12362 }
12363 if(type->alignment && size % type->alignment)
12364 size += type->alignment - (size % type->alignment);
12365 }
12366 break;
12367 }
12368 case 20:
12369 {
12370 struct TemplateParameter * param = type->__anon1.templateParameter;
12371 struct Type * baseType = ProcessTemplateParameterType(param);
12372
12373 if(baseType)
12374 {
12375 size = ComputeTypeSize(baseType);
12376 type->alignment = baseType->alignment;
12377 type->pointerAlignment = baseType->pointerAlignment;
12378 }
12379 else
12380 type->alignment = size = sizeof(uint64);
12381 break;
12382 }
12383 case 15:
12384 {
12385 type->alignment = size = sizeof(enum
12386 {
12387 test
12388 });
12389 break;
12390 }
12391 case 21:
12392 {
12393 type->alignment = size = targetBits / 8;
12394 type->pointerAlignment = 1;
12395 break;
12396 }
12397 }
12398 type->size = size;
12399 type->computing = 0;
12400 }
12401 return size;
12402 }
12403
12404 struct External * _DeclareStruct(struct External * neededBy, const char * name, unsigned int skipNoHead, unsigned int needDereference, unsigned int fwdDecl)
12405 {
12406 struct External * external = (((void *)0));
12407 struct Symbol * classSym = FindClass(name);
12408 struct __ecereNameSpace__ecere__sys__OldList * curDeclarations = (((void *)0));
12409 struct Specifier * curSpec = (((void *)0));
12410
12411 if(!inCompiler || !classSym)
12412 return (((void *)0));
12413 if(classSym->__anon1.registered && (classSym->__anon1.registered->type == 2 || classSym->__anon1.registered->type == 3 || classSym->__anon1.registered->type == 4))
12414 return (((void *)0));
12415 if(!classSym->__anon1.registered || (classSym->__anon1.registered->type == 0 && classSym->__anon1.registered->structSize && classSym->__anon1.registered->base && classSym->__anon1.registered->base->base))
12416 _DeclareStruct(neededBy, "ecere::com::Instance", 0, 1, fwdDecl);
12417 external = classSym->__anon2.__anon1.structExternal;
12418 if(external && external->__anon1.declaration)
12419 {
12420 struct Specifier * spec;
12421
12422 for(spec = external->__anon1.declaration->__anon1.__anon1.specifiers ? (*external->__anon1.declaration->__anon1.__anon1.specifiers).first : (((void *)0)); spec; spec = spec->next)
12423 if(spec->type == 3 || spec->type == 4)
12424 {
12425 curSpec = spec;
12426 curDeclarations = spec->__anon1.__anon2.definitions;
12427 break;
12428 }
12429 }
12430 if(classSym->__anon1.registered && !classSym->declaring && classSym->imported && (!classSym->declaredStructSym || (classSym->__anon1.registered->type == 5 && !skipNoHead && external && !curDeclarations)))
12431 {
12432 struct __ecereNameSpace__ecere__sys__OldList * specifiers, * declarators;
12433 struct __ecereNameSpace__ecere__sys__OldList * declarations = (((void *)0));
12434 char structName[1024];
12435 unsigned int addedPadding = 0;
12436
12437 classSym->declaring++;
12438 if(strchr(classSym->string, '<'))
12439 {
12440 if(classSym->__anon1.registered->templateClass)
12441 {
12442 external = _DeclareStruct(neededBy, classSym->__anon1.registered->templateClass->fullName, skipNoHead, needDereference, fwdDecl);
12443 classSym->declaring--;
12444 }
12445 return external;
12446 }
12447 structName[0] = (char)0;
12448 FullClassNameCat(structName, name, 0);
12449 classSym->declaredStructSym = 1;
12450 if(!external || (classSym->__anon1.registered->type == 5 && !skipNoHead && !curDeclarations))
12451 {
12452 unsigned int add = 0;
12453
12454 if(!external)
12455 {
12456 external = MkExternalDeclaration((((void *)0)));
12457 classSym->__anon2.__anon1.structExternal = external;
12458 external->symbol = classSym;
12459 add = 1;
12460 }
12461 if(!skipNoHead)
12462 {
12463 declarations = MkList();
12464 AddMembers(external, declarations, classSym->__anon1.registered, 0, (((void *)0)), classSym->__anon1.registered, &addedPadding);
12465 }
12466 if(declarations && (!(*declarations).count || ((*declarations).count == 1 && addedPadding)))
12467 {
12468 FreeList(declarations, (void *)(FreeClassDef));
12469 declarations = (((void *)0));
12470 }
12471 if(classSym->__anon1.registered->type != 5 && !declarations)
12472 {
12473 FreeExternal(external);
12474 external = (((void *)0));
12475 classSym->__anon2.__anon1.structExternal = (((void *)0));
12476 }
12477 else
12478 {
12479 if(curSpec)
12480 curSpec->__anon1.__anon2.definitions = declarations;
12481 else
12482 {
12483 char className[1024];
12484
12485 strcpy(className, "__ecereClass_");
12486 FullClassNameCat(className, classSym->string, 1);
12487 specifiers = MkList();
12488 declarators = MkList();
12489 ListAdd(specifiers, MkStructOrUnion(3, MkIdentifier(structName), declarations));
12490 external->__anon1.declaration = MkDeclaration(specifiers, declarators);
12491 }
12492 if(add)
12493 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add((&*ast), external);
12494 }
12495 }
12496 classSym->declaring--;
12497 }
12498 else if(!classSym->declaredStructSym && classSym->__anon2.__anon1.structExternal)
12499 {
12500 classSym->declaredStructSym = 1;
12501 if(classSym->__anon1.registered)
12502 DeclareMembers(classSym->__anon2.__anon1.structExternal, classSym->__anon1.registered, 0);
12503 if(classSym->__anon2.__anon1.structExternal->__anon1.declaration && classSym->__anon2.__anon1.structExternal->__anon1.declaration->__anon1.__anon1.specifiers)
12504 {
12505 struct Specifier * spec;
12506
12507 for(spec = (*classSym->__anon2.__anon1.structExternal->__anon1.declaration->__anon1.__anon1.specifiers).first; spec; spec = spec->next)
12508 {
12509 if(spec->__anon1.__anon2.definitions)
12510 IdentifyAnonStructs(spec->__anon1.__anon2.definitions);
12511 }
12512 }
12513 }
12514 if(inCompiler && neededBy && (external || !classSym->imported))
12515 {
12516 if(!external)
12517 {
12518 classSym->__anon2.__anon1.structExternal = external = MkExternalDeclaration((((void *)0)));
12519 external->symbol = classSym;
12520 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add((&*ast), external);
12521 }
12522 if(fwdDecl)
12523 {
12524 struct External * e = external->fwdDecl ? external->fwdDecl : external;
12525
12526 if(((struct __ecereNameSpace__ecere__com__LinkList *)(((char *)e->incoming + 0 + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->count)
12527 __ecereMethod_External_CreateUniqueEdge(neededBy, e, !needDereference && !external->fwdDecl);
12528 }
12529 else
12530 __ecereMethod_External_CreateUniqueEdge(neededBy, external, !needDereference);
12531 }
12532 return external;
12533 }
12534
12535 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)
12536 {
12537 struct Identifier * ident = member->identifiers ? (*member->identifiers).first : (((void *)0));
12538 unsigned int found = 0;
12539 struct __ecereNameSpace__ecere__com__DataMember * dataMember = (((void *)0));
12540 struct __ecereNameSpace__ecere__com__Method * method = (((void *)0));
12541 unsigned int freeType = 0;
12542
12543 yylloc = member->loc;
12544 if(!ident)
12545 {
12546 if(curMember)
12547 {
12548 __ecereNameSpace__ecere__com__eClass_FindNextMember(_class, curClass, curMember, subMemberStack, subMemberStackPos);
12549 if(*curMember)
12550 {
12551 found = 1;
12552 dataMember = *curMember;
12553 }
12554 }
12555 }
12556 else
12557 {
12558 struct __ecereNameSpace__ecere__com__DataMember * thisMember = (struct __ecereNameSpace__ecere__com__DataMember *)__ecereNameSpace__ecere__com__eClass_FindProperty(_class, ident->string, privateModule);
12559 struct __ecereNameSpace__ecere__com__DataMember * _subMemberStack[256];
12560 int _subMemberStackPos = 0;
12561
12562 if(!thisMember)
12563 thisMember = __ecereNameSpace__ecere__com__eClass_FindDataMember(_class, ident->string, privateModule, _subMemberStack, &_subMemberStackPos);
12564 if(thisMember)
12565 {
12566 dataMember = thisMember;
12567 if(curMember && thisMember->memberAccess == 1)
12568 {
12569 *curMember = thisMember;
12570 *curClass = thisMember->_class;
12571 memcpy(subMemberStack, _subMemberStack, sizeof(struct __ecereNameSpace__ecere__com__DataMember *) * _subMemberStackPos);
12572 *subMemberStackPos = _subMemberStackPos;
12573 }
12574 found = 1;
12575 }
12576 else
12577 {
12578 method = __ecereNameSpace__ecere__com__eClass_FindMethod(_class, ident->string, privateModule);
12579 if(method && method->type == 1)
12580 found = 1;
12581 else
12582 method = (((void *)0));
12583 }
12584 }
12585 if(found)
12586 {
12587 struct Type * type = (((void *)0));
12588
12589 if(dataMember)
12590 {
12591 if(!dataMember->dataType && dataMember->dataTypeString)
12592 {
12593 struct Context * context = SetupTemplatesContext(_class);
12594
12595 dataMember->dataType = ProcessTypeString(dataMember->dataTypeString, 0);
12596 FinishTemplatesContext(context);
12597 }
12598 type = dataMember->dataType;
12599 }
12600 else if(method)
12601 {
12602 if(!method->dataType)
12603 ProcessMethodType(method);
12604 type = method->dataType;
12605 }
12606 if(ident && ident->next)
12607 {
12608 for(ident = ident->next; ident && type; ident = ident->next)
12609 {
12610 if(type->kind == 8)
12611 {
12612 dataMember = (struct __ecereNameSpace__ecere__com__DataMember *)__ecereNameSpace__ecere__com__eClass_FindProperty(type->__anon1._class->__anon1.registered, ident->string, privateModule);
12613 if(!dataMember)
12614 dataMember = __ecereNameSpace__ecere__com__eClass_FindDataMember(type->__anon1._class->__anon1.registered, ident->string, privateModule, (((void *)0)), (((void *)0)));
12615 if(dataMember)
12616 type = dataMember->dataType;
12617 }
12618 else if(type->kind == 9 || type->kind == 10)
12619 {
12620 struct Type * memberType;
12621
12622 for(memberType = type->__anon1.__anon1.members.first; memberType; memberType = memberType->next)
12623 {
12624 if(!strcmp(memberType->name, ident->string))
12625 {
12626 type = memberType;
12627 break;
12628 }
12629 }
12630 }
12631 }
12632 }
12633 if(type && type->kind == 20 && type->__anon1.templateParameter->type == 0 && _class->templateArgs)
12634 {
12635 int id = 0;
12636 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * curParam = (((void *)0));
12637 struct __ecereNameSpace__ecere__com__Class * sClass;
12638
12639 for(sClass = _class; sClass; sClass = sClass->base)
12640 {
12641 id = 0;
12642 if(sClass->templateClass)
12643 sClass = sClass->templateClass;
12644 for(curParam = sClass->templateParams.first; curParam; curParam = curParam->next)
12645 {
12646 if(curParam->type == 0 && !strcmp(type->__anon1.templateParameter->identifier->string, curParam->name))
12647 {
12648 for(sClass = sClass->base; sClass; sClass = sClass->base)
12649 {
12650 if(sClass->templateClass)
12651 sClass = sClass->templateClass;
12652 id += sClass->templateParams.count;
12653 }
12654 break;
12655 }
12656 id++;
12657 }
12658 if(curParam)
12659 break;
12660 }
12661 if(curParam)
12662 {
12663 struct __ecereNameSpace__ecere__com__ClassTemplateArgument arg = _class->templateArgs[id];
12664
12665 if(arg.__anon1.__anon1.dataTypeString)
12666 {
12667 unsigned int constant = type->constant;
12668
12669 type = ProcessTypeString(arg.__anon1.__anon1.dataTypeString, 0);
12670 if(type->kind == 8 && constant)
12671 type->constant = 1;
12672 else if(type->kind == 13)
12673 {
12674 struct Type * t = type->__anon1.type;
12675
12676 while(t->kind == 13)
12677 t = t->__anon1.type;
12678 if(constant)
12679 t->constant = constant;
12680 }
12681 freeType = 1;
12682 if(type && _class->templateClass)
12683 type->passAsTemplate = 1;
12684 if(type)
12685 {
12686 }
12687 }
12688 }
12689 }
12690 if(type && type->kind == 8 && type->__anon1._class && type->__anon1._class->__anon1.registered && strchr(type->__anon1._class->__anon1.registered->fullName, '<'))
12691 {
12692 struct __ecereNameSpace__ecere__com__Class * expClass = type->__anon1._class->__anon1.registered;
12693 struct __ecereNameSpace__ecere__com__Class * cClass = (((void *)0));
12694 int paramCount = 0;
12695 int lastParam = -1;
12696 char templateString[1024];
12697 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * param;
12698
12699 sprintf(templateString, "%s<", expClass->templateClass->fullName);
12700 for(cClass = expClass; cClass; cClass = cClass->base)
12701 {
12702 int p = 0;
12703
12704 if(cClass->templateClass)
12705 cClass = cClass->templateClass;
12706 for(param = cClass->templateParams.first; param; param = param->next)
12707 {
12708 int id = p;
12709 struct __ecereNameSpace__ecere__com__Class * sClass;
12710 struct __ecereNameSpace__ecere__com__ClassTemplateArgument arg;
12711
12712 for(sClass = cClass->base; sClass; sClass = sClass->base)
12713 {
12714 if(sClass->templateClass)
12715 sClass = sClass->templateClass;
12716 id += sClass->templateParams.count;
12717 }
12718 arg = expClass->templateArgs[id];
12719 for(sClass = _class; sClass; sClass = sClass->base)
12720 {
12721 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * cParam;
12722 int p = 0;
12723 struct __ecereNameSpace__ecere__com__Class * nextClass;
12724
12725 if(sClass->templateClass)
12726 sClass = sClass->templateClass;
12727 for(nextClass = sClass->base; nextClass; nextClass = nextClass->base)
12728 {
12729 if(nextClass->templateClass)
12730 nextClass = nextClass->templateClass;
12731 p += nextClass->templateParams.count;
12732 }
12733 for(cParam = sClass->templateParams.first; cParam; cParam = cParam->next, p++)
12734 {
12735 if(cParam->type == 0 && arg.__anon1.__anon1.dataTypeString && !strcmp(cParam->name, arg.__anon1.__anon1.dataTypeString))
12736 {
12737 if(_class->templateArgs && arg.__anon1.__anon1.dataTypeString && (!param->defaultArg.__anon1.__anon1.dataTypeString || strcmp(arg.__anon1.__anon1.dataTypeString, param->defaultArg.__anon1.__anon1.dataTypeString)))
12738 {
12739 arg.__anon1.__anon1.dataTypeString = _class->templateArgs[p].__anon1.__anon1.dataTypeString;
12740 arg.__anon1.__anon1.dataTypeClass = _class->templateArgs[p].__anon1.__anon1.dataTypeClass;
12741 break;
12742 }
12743 }
12744 }
12745 }
12746 {
12747 char argument[256];
12748
12749 argument[0] = '\0';
12750 switch(param->type)
12751 {
12752 case 2:
12753 {
12754 char expString[1024];
12755 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
12756 struct Declarator * decl = SpecDeclFromString(param->__anon1.dataTypeString, specs, (((void *)0)));
12757 struct Expression * exp;
12758 char * string = PrintHexUInt64(arg.__anon1.expression.__anon1.ui64);
12759
12760 exp = MkExpCast(MkTypeName(specs, decl), MkExpConstant(string));
12761 (__ecereNameSpace__ecere__com__eSystem_Delete(string), string = 0);
12762 ProcessExpressionType(exp);
12763 ComputeExpression(exp);
12764 expString[0] = '\0';
12765 PrintExpression(exp, expString);
12766 strcat(argument, expString);
12767 FreeExpression(exp);
12768 break;
12769 }
12770 case 1:
12771 {
12772 strcat(argument, arg.__anon1.__anon2.__anon1.member->name);
12773 break;
12774 }
12775 case 0:
12776 {
12777 if(arg.__anon1.__anon1.dataTypeString && (!param->defaultArg.__anon1.__anon1.dataTypeString || strcmp(arg.__anon1.__anon1.dataTypeString, param->defaultArg.__anon1.__anon1.dataTypeString)))
12778 strcat(argument, arg.__anon1.__anon1.dataTypeString);
12779 break;
12780 }
12781 }
12782 if(argument[0])
12783 {
12784 if(paramCount)
12785 strcat(templateString, ", ");
12786 if(lastParam != p - 1)
12787 {
12788 strcat(templateString, param->name);
12789 strcat(templateString, " = ");
12790 }
12791 strcat(templateString, argument);
12792 paramCount++;
12793 lastParam = p;
12794 }
12795 p++;
12796 }
12797 }
12798 }
12799 {
12800 int len = strlen(templateString);
12801
12802 if(templateString[len - 1] == '<')
12803 len--;
12804 else
12805 {
12806 if(templateString[len - 1] == '>')
12807 templateString[len++] = ' ';
12808 templateString[len++] = '>';
12809 }
12810 templateString[len++] = '\0';
12811 }
12812 {
12813 struct Context * context = SetupTemplatesContext(_class);
12814
12815 if(freeType)
12816 FreeType(type);
12817 type = ProcessTypeString(templateString, 0);
12818 freeType = 1;
12819 FinishTemplatesContext(context);
12820 }
12821 }
12822 if(method && member->initializer && member->initializer->type == 0 && member->initializer->__anon1.exp)
12823 {
12824 ProcessExpressionType(member->initializer->__anon1.exp);
12825 if(!member->initializer->__anon1.exp->expType)
12826 {
12827 if(inCompiler)
12828 {
12829 char expString[10240];
12830
12831 expString[0] = '\0';
12832 PrintExpression(member->initializer->__anon1.exp, expString);
12833 __ecereNameSpace__ecere__sys__ChangeCh(expString, '\n', ' ');
12834 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "unresolved symbol used as an instance method %s\n", (((void *)0))), expString);
12835 }
12836 }
12837 else if(!MatchTypes(member->initializer->__anon1.exp->expType, type, (((void *)0)), (((void *)0)), _class, 1, 1, 0, 0, 1))
12838 {
12839 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "incompatible instance method %s\n", (((void *)0))), ident->string);
12840 }
12841 }
12842 else if(member->initializer)
12843 {
12844 ProcessInitializer(member->initializer, type);
12845 }
12846 if(freeType)
12847 FreeType(type);
12848 }
12849 else
12850 {
12851 if(_class && _class->type == 3)
12852 {
12853 if(member->initializer)
12854 {
12855 struct Type * type = MkClassType(_class->fullName);
12856
12857 ProcessInitializer(member->initializer, type);
12858 FreeType(type);
12859 }
12860 }
12861 else
12862 {
12863 if(member->initializer)
12864 {
12865 ProcessInitializer(member->initializer, (((void *)0)));
12866 }
12867 if(ident)
12868 {
12869 if(method)
12870 {
12871 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "couldn't find virtual method %s in class %s\n", (((void *)0))), ident->string, _class->fullName);
12872 }
12873 else if(_class)
12874 {
12875 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "couldn't find member %s in class %s\n", (((void *)0))), ident->string, _class->fullName);
12876 if(inCompiler)
12877 __ecereNameSpace__ecere__com__eClass_AddDataMember(_class, ident->string, "int", 0, 0, 1);
12878 }
12879 }
12880 else if(_class)
12881 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "too many initializers for instantiation of class %s\n", (((void *)0))), _class->fullName);
12882 }
12883 }
12884 }
12885
12886 unsigned int MatchWithEnums_NameSpace(struct __ecereNameSpace__ecere__com__NameSpace * nameSpace, struct Expression * sourceExp, struct Type * dest, char * string, struct __ecereNameSpace__ecere__sys__OldList * conversions)
12887 {
12888 struct __ecereNameSpace__ecere__com__BTNamedLink * link;
12889
12890 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)))
12891 {
12892 struct __ecereNameSpace__ecere__com__Class * _class = link->data;
12893
12894 if(_class->type == 4)
12895 {
12896 struct __ecereNameSpace__ecere__sys__OldList converts =
12897 {
12898 0, 0, 0, 0, 0
12899 };
12900 struct Type * type = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
12901
12902 type->kind = 8;
12903 if(!_class->symbol)
12904 _class->symbol = FindClass(_class->fullName);
12905 type->__anon1._class = _class->symbol;
12906 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))
12907 {
12908 struct __ecereNameSpace__ecere__sys__NamedLink64 * value;
12909 struct __ecereNameSpace__ecere__com__Class * enumClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "enum");
12910
12911 if(enumClass)
12912 {
12913 struct __ecereNameSpace__ecere__com__Class * baseClass;
12914
12915 for(baseClass = _class; baseClass && baseClass->type == 4; baseClass = baseClass->base)
12916 {
12917 struct __ecereNameSpace__ecere__com__EnumClassData * e = (baseClass ? ((void *)(((char *)baseClass->data) + enumClass->offsetClass)) : (((void *)0)));
12918
12919 for(value = e->values.first; value; value = value->next)
12920 {
12921 if(!strcmp(value->name, string))
12922 break;
12923 }
12924 if(value)
12925 {
12926 FreeType(sourceExp->expType);
12927 sourceExp->isConstant = 1;
12928 sourceExp->expType = MkClassType(baseClass->fullName);
12929 if(inCompiler || inPreCompiler || inDebugger)
12930 {
12931 char constant[256];
12932
12933 FreeExpContents(sourceExp);
12934 sourceExp->type = 2;
12935 if(!strcmp(baseClass->dataTypeString, "int") || !strcmp(baseClass->dataTypeString, "int64") || !strcmp(baseClass->dataTypeString, "short") || !strcmp(baseClass->dataTypeString, "char"))
12936 sprintf(constant, ((__runtimePlatform == 1) ? "%I64d" : "%lld"), value->data);
12937 else
12938 sprintf(constant, ((__runtimePlatform == 1) ? "0x%I64XLL" : "0x%llXLL"), value->data);
12939 sourceExp->__anon1.__anon1.constant = __ecereNameSpace__ecere__sys__CopyString(constant);
12940 }
12941 while(converts.first)
12942 {
12943 struct Conversion * convert = converts.first;
12944
12945 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove(&converts, convert);
12946 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(conversions, convert);
12947 }
12948 ((type ? (__ecereClass_Type->Destructor ? __ecereClass_Type->Destructor((void *)type) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(type)) : 0), type = 0);
12949 return 1;
12950 }
12951 }
12952 }
12953 }
12954 if(converts.first)
12955 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Free(&converts, (void *)(FreeConvert));
12956 ((type ? (__ecereClass_Type->Destructor ? __ecereClass_Type->Destructor((void *)type) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(type)) : 0), type = 0);
12957 }
12958 }
12959 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)))
12960 if(MatchWithEnums_NameSpace(nameSpace, sourceExp, dest, string, conversions))
12961 return 1;
12962 return 0;
12963 }
12964
12965 void ComputeExpression(struct Expression * exp)
12966 {
12967 switch(exp->type)
12968 {
12969 case 0:
12970 {
12971 struct Identifier * id = exp->__anon1.__anon1.identifier;
12972
12973 if(id && exp->isConstant && !inCompiler && !inPreCompiler && !inDebugger)
12974 {
12975 struct __ecereNameSpace__ecere__com__Class * c = (exp->expType && exp->expType->kind == 8 && exp->expType->__anon1._class) ? exp->expType->__anon1._class->__anon1.registered : (((void *)0));
12976
12977 if(c && c->type == 4)
12978 {
12979 struct __ecereNameSpace__ecere__com__Class * enumClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "enum");
12980
12981 if(enumClass)
12982 {
12983 struct __ecereNameSpace__ecere__sys__NamedLink64 * value;
12984 struct __ecereNameSpace__ecere__com__EnumClassData * e = (c ? ((void *)(((char *)c->data) + enumClass->offsetClass)) : (((void *)0)));
12985
12986 for(value = e->values.first; value; value = value->next)
12987 {
12988 if(!strcmp(value->name, id->string))
12989 break;
12990 }
12991 if(value)
12992 {
12993 const char * dts = c->dataTypeString;
12994
12995 FreeExpContents(exp);
12996 exp->type = 2;
12997 exp->__anon1.__anon1.constant = (dts && (!strcmp(dts, "int") || !strcmp(dts, "int64") || !strcmp(dts, "short") || !strcmp(dts, "char"))) ? PrintInt64(value->data) : PrintUInt64(value->data);
12998 }
12999 }
13000 }
13001 }
13002 break;
13003 }
13004 case 1:
13005 {
13006 ComputeInstantiation(exp);
13007 break;
13008 }
13009 case 4:
13010 {
13011 struct Expression * exp1, * exp2 = (((void *)0));
13012 struct Operand op1 =
13013 {
13014 0, 0, 0,
13015 .__anon1 = {
13016 .c = 0
13017 },
13018 {
13019 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
13020 }
13021 };
13022 struct Operand op2 =
13023 {
13024 0, 0, 0,
13025 .__anon1 = {
13026 .c = 0
13027 },
13028 {
13029 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
13030 }
13031 };
13032
13033 if(exp->__anon1.op.exp2)
13034 {
13035 struct Expression * e = exp->__anon1.op.exp2;
13036
13037 while((e->type == 5 || e->type == 32 || e->type == 23) && e->__anon1.list)
13038 {
13039 if(e->type == 5 || e->type == 32 || e->type == 23)
13040 {
13041 if(e->type == 23)
13042 e = (*((struct Statement *)(*e->__anon1.compound->__anon1.compound.statements).last)->__anon1.expressions).last;
13043 else
13044 e = (*e->__anon1.list).last;
13045 }
13046 }
13047 if(exp->__anon1.op.op == 261 && e && e->expType)
13048 {
13049 if(e->type == 3 && e->__anon1.__anon2.string)
13050 {
13051 char * string = e->__anon1.__anon2.string;
13052 int len = strlen(string);
13053 char * tmp = __ecereNameSpace__ecere__com__eSystem_New(sizeof(char) * (len - 2 + 1));
13054
13055 len = UnescapeString(tmp, string + 1, len - 2);
13056 (__ecereNameSpace__ecere__com__eSystem_Delete(tmp), tmp = 0);
13057 FreeExpContents(exp);
13058 exp->type = 2;
13059 exp->__anon1.__anon1.constant = PrintUInt(len + 1);
13060 }
13061 else
13062 {
13063 struct Type * type = e->expType;
13064
13065 type->refCount++;
13066 FreeExpContents(exp);
13067 exp->type = 2;
13068 exp->__anon1.__anon1.constant = PrintUInt(ComputeTypeSize(type));
13069 FreeType(type);
13070 }
13071 break;
13072 }
13073 else
13074 ComputeExpression(exp->__anon1.op.exp2);
13075 }
13076 if(exp->__anon1.op.exp1)
13077 {
13078 ComputeExpression(exp->__anon1.op.exp1);
13079 exp1 = exp->__anon1.op.exp1;
13080 exp2 = exp->__anon1.op.exp2;
13081 op1 = GetOperand(exp1);
13082 if(op1.type)
13083 op1.type->refCount++;
13084 if(exp2)
13085 {
13086 op2 = GetOperand(exp2);
13087 if(op2.type)
13088 op2.type->refCount++;
13089 }
13090 }
13091 else
13092 {
13093 exp1 = exp->__anon1.op.exp2;
13094 op1 = GetOperand(exp1);
13095 if(op1.type)
13096 op1.type->refCount++;
13097 }
13098 CallOperator(exp, exp1, exp2, &op1, &op2);
13099 if(op1.type)
13100 FreeType(op1.type);
13101 if(op2.type)
13102 FreeType(op2.type);
13103 break;
13104 }
13105 case 5:
13106 case 32:
13107 {
13108 struct Expression * e, * n;
13109
13110 for(e = (*exp->__anon1.list).first; e; e = n)
13111 {
13112 n = e->next;
13113 if(!n)
13114 {
13115 struct __ecereNameSpace__ecere__sys__OldList * list = exp->__anon1.list;
13116 struct Expression * prev = exp->prev;
13117 struct Expression * next = exp->next;
13118
13119 ComputeExpression(e);
13120 FreeType(exp->expType);
13121 FreeType(exp->destType);
13122 *exp = *e;
13123 exp->prev = prev;
13124 exp->next = next;
13125 ((e ? (__ecereClass_Expression->Destructor ? __ecereClass_Expression->Destructor((void *)e) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(e)) : 0), e = 0);
13126 (__ecereNameSpace__ecere__com__eSystem_Delete(list), list = 0);
13127 }
13128 else
13129 {
13130 FreeExpression(e);
13131 }
13132 }
13133 break;
13134 }
13135 case 8:
13136 {
13137 struct Expression * memberExp = exp->__anon1.member.exp;
13138 struct Identifier * memberID = exp->__anon1.member.member;
13139 struct Type * type;
13140
13141 ComputeExpression(exp->__anon1.member.exp);
13142 type = exp->__anon1.member.exp->expType;
13143 if(type)
13144 {
13145 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)));
13146 struct __ecereNameSpace__ecere__com__Property * prop = (((void *)0));
13147 struct __ecereNameSpace__ecere__com__DataMember * member = (((void *)0));
13148 struct __ecereNameSpace__ecere__com__Class * convertTo = (((void *)0));
13149
13150 if(type->kind == 19 && exp->__anon1.member.exp->type == 24)
13151 _class = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "ecere::com::Class");
13152 if(!_class)
13153 {
13154 char string[256];
13155 struct Symbol * classSym;
13156
13157 string[0] = '\0';
13158 PrintTypeNoConst(type, string, 0, 1);
13159 classSym = FindClass(string);
13160 _class = classSym ? classSym->__anon1.registered : (((void *)0));
13161 }
13162 if(exp->__anon1.member.member)
13163 {
13164 prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, exp->__anon1.member.member->string, privateModule);
13165 if(!prop)
13166 member = __ecereNameSpace__ecere__com__eClass_FindDataMember(_class, exp->__anon1.member.member->string, privateModule, (((void *)0)), (((void *)0)));
13167 }
13168 if(!prop && !member && _class && exp->__anon1.member.member)
13169 {
13170 struct Symbol * classSym = FindClass(exp->__anon1.member.member->string);
13171
13172 convertTo = _class;
13173 _class = classSym ? classSym->__anon1.registered : (((void *)0));
13174 prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, convertTo->fullName, privateModule);
13175 }
13176 if(prop)
13177 {
13178 if(prop->compiled)
13179 {
13180 struct Type * type = prop->dataType;
13181
13182 if(_class->type == 3)
13183 {
13184 if(type->kind == 8)
13185 {
13186 struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class->__anon1.registered;
13187
13188 if(_class->type == 3)
13189 {
13190 if(!_class->dataType)
13191 _class->dataType = ProcessTypeString(_class->dataTypeString, 0);
13192 type = _class->dataType;
13193 }
13194 }
13195 switch(type->kind)
13196 {
13197 case 6:
13198 {
13199 float value;
13200 float (* Get)(float) = (void *)prop->Get;
13201
13202 GetFloat(exp->__anon1.member.exp, &value);
13203 exp->__anon1.__anon1.constant = PrintFloat(Get ? Get(value) : value);
13204 exp->type = 2;
13205 break;
13206 }
13207 case 7:
13208 {
13209 double value;
13210 double (* Get)(double);
13211
13212 GetDouble(exp->__anon1.member.exp, &value);
13213 if(convertTo)
13214 Get = (void *)prop->Set;
13215 else
13216 Get = (void *)prop->Get;
13217 exp->__anon1.__anon1.constant = PrintDouble(Get ? Get(value) : value);
13218 exp->type = 2;
13219 break;
13220 }
13221 }
13222 }
13223 else
13224 {
13225 if(convertTo)
13226 {
13227 struct Expression * value = exp->__anon1.member.exp;
13228 struct Type * type;
13229
13230 if(!prop->dataType)
13231 ProcessPropertyType(prop);
13232 type = prop->dataType;
13233 if(!type)
13234 {
13235 }
13236 else if(_class->type == 1)
13237 {
13238 switch(type->kind)
13239 {
13240 case 8:
13241 {
13242 struct __ecereNameSpace__ecere__com__Class * propertyClass = type->__anon1._class->__anon1.registered;
13243
13244 if(propertyClass->type == 1 && value->type == 1)
13245 {
13246 void (* Set)(void *, void *) = (void *)prop->Set;
13247
13248 exp->__anon1.instance = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Instantiation);
13249 exp->__anon1.instance->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize));
13250 exp->__anon1.instance->_class = MkSpecifierName(_class->fullName);
13251 exp->__anon1.instance->loc = exp->loc;
13252 exp->type = 1;
13253 Set(exp->__anon1.instance->data, value->__anon1.instance->data);
13254 PopulateInstance(exp->__anon1.instance);
13255 }
13256 break;
13257 }
13258 case 3:
13259 {
13260 int intValue;
13261 void (* Set)(void *, int) = (void *)prop->Set;
13262
13263 exp->__anon1.instance = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Instantiation);
13264 exp->__anon1.instance->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize));
13265 exp->__anon1.instance->_class = MkSpecifierName(_class->fullName);
13266 exp->__anon1.instance->loc = exp->loc;
13267 exp->type = 1;
13268 GetInt(value, &intValue);
13269 Set(exp->__anon1.instance->data, intValue);
13270 PopulateInstance(exp->__anon1.instance);
13271 break;
13272 }
13273 case 4:
13274 {
13275 long long intValue;
13276 void (* Set)(void *, long long) = (void *)prop->Set;
13277
13278 exp->__anon1.instance = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Instantiation);
13279 exp->__anon1.instance->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize));
13280 exp->__anon1.instance->_class = MkSpecifierName(_class->fullName);
13281 exp->__anon1.instance->loc = exp->loc;
13282 exp->type = 1;
13283 GetInt64(value, &intValue);
13284 Set(exp->__anon1.instance->data, intValue);
13285 PopulateInstance(exp->__anon1.instance);
13286 break;
13287 }
13288 case 22:
13289 {
13290 intptr_t intValue;
13291 void (* Set)(void *, intptr_t) = (void *)prop->Set;
13292
13293 exp->__anon1.instance = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Instantiation);
13294 exp->__anon1.instance->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize));
13295 exp->__anon1.instance->_class = MkSpecifierName(_class->fullName);
13296 exp->__anon1.instance->loc = exp->loc;
13297 exp->type = 1;
13298 GetIntPtr(value, &intValue);
13299 Set(exp->__anon1.instance->data, intValue);
13300 PopulateInstance(exp->__anon1.instance);
13301 break;
13302 }
13303 case 23:
13304 {
13305 ssize_t intValue;
13306 void (* Set)(void *, ssize_t) = (void *)prop->Set;
13307
13308 exp->__anon1.instance = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Instantiation);
13309 exp->__anon1.instance->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize));
13310 exp->__anon1.instance->_class = MkSpecifierName(_class->fullName);
13311 exp->__anon1.instance->loc = exp->loc;
13312 exp->type = 1;
13313 GetIntSize(value, &intValue);
13314 Set(exp->__anon1.instance->data, intValue);
13315 PopulateInstance(exp->__anon1.instance);
13316 break;
13317 }
13318 case 6:
13319 {
13320 float floatValue;
13321 void (* Set)(void *, float) = (void *)prop->Set;
13322
13323 exp->__anon1.instance = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Instantiation);
13324 exp->__anon1.instance->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize));
13325 exp->__anon1.instance->_class = MkSpecifierName(_class->fullName);
13326 exp->__anon1.instance->loc = exp->loc;
13327 exp->type = 1;
13328 GetFloat(value, &floatValue);
13329 Set(exp->__anon1.instance->data, floatValue);
13330 PopulateInstance(exp->__anon1.instance);
13331 break;
13332 }
13333 case 7:
13334 {
13335 double doubleValue;
13336 void (* Set)(void *, double) = (void *)prop->Set;
13337
13338 exp->__anon1.instance = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Instantiation);
13339 exp->__anon1.instance->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize));
13340 exp->__anon1.instance->_class = MkSpecifierName(_class->fullName);
13341 exp->__anon1.instance->loc = exp->loc;
13342 exp->type = 1;
13343 GetDouble(value, &doubleValue);
13344 Set(exp->__anon1.instance->data, doubleValue);
13345 PopulateInstance(exp->__anon1.instance);
13346 break;
13347 }
13348 }
13349 }
13350 else if(_class->type == 2)
13351 {
13352 switch(type->kind)
13353 {
13354 case 8:
13355 {
13356 struct __ecereNameSpace__ecere__com__Class * propertyClass = type->__anon1._class->__anon1.registered;
13357
13358 if(propertyClass->type == 1 && value->__anon1.instance->data)
13359 {
13360 unsigned int (* Set)(void *) = (void *)prop->Set;
13361 unsigned int bits = Set(value->__anon1.instance->data);
13362
13363 exp->__anon1.__anon1.constant = PrintHexUInt(bits);
13364 exp->type = 2;
13365 break;
13366 }
13367 else if(_class->type == 2)
13368 {
13369 unsigned int value;
13370 unsigned int (* Set)(unsigned int) = (void *)prop->Set;
13371 unsigned int bits;
13372
13373 GetUInt(exp->__anon1.member.exp, &value);
13374 bits = Set(value);
13375 exp->__anon1.__anon1.constant = PrintHexUInt(bits);
13376 exp->type = 2;
13377 }
13378 }
13379 }
13380 }
13381 }
13382 else
13383 {
13384 if(_class->type == 2)
13385 {
13386 unsigned int value;
13387
13388 GetUInt(exp->__anon1.member.exp, &value);
13389 switch(type->kind)
13390 {
13391 case 8:
13392 {
13393 struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class->__anon1.registered;
13394
13395 if(_class->type == 1)
13396 {
13397 void (* Get)(unsigned int, void *) = (void *)prop->Get;
13398
13399 exp->__anon1.instance = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Instantiation);
13400 exp->__anon1.instance->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize));
13401 exp->__anon1.instance->_class = MkSpecifierName(_class->fullName);
13402 exp->__anon1.instance->loc = exp->loc;
13403 exp->type = 1;
13404 Get(value, exp->__anon1.instance->data);
13405 PopulateInstance(exp->__anon1.instance);
13406 }
13407 else if(_class->type == 2)
13408 {
13409 unsigned int (* Get)(unsigned int) = (void *)prop->Get;
13410 uint64 bits = Get(value);
13411
13412 exp->__anon1.__anon1.constant = PrintHexUInt64(bits);
13413 exp->type = 2;
13414 }
13415 break;
13416 }
13417 }
13418 }
13419 else if(_class->type == 1)
13420 {
13421 unsigned char * value = (exp->__anon1.member.exp->type == 1) ? exp->__anon1.member.exp->__anon1.instance->data : (((void *)0));
13422
13423 switch(type->kind)
13424 {
13425 case 8:
13426 {
13427 struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class->__anon1.registered;
13428
13429 if(_class->type == 1 && value)
13430 {
13431 void (* Get)(void *, void *) = (void *)prop->Get;
13432
13433 exp->__anon1.instance = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Instantiation);
13434 exp->__anon1.instance->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize));
13435 exp->__anon1.instance->_class = MkSpecifierName(_class->fullName);
13436 exp->__anon1.instance->loc = exp->loc;
13437 exp->type = 1;
13438 Get(value, exp->__anon1.instance->data);
13439 PopulateInstance(exp->__anon1.instance);
13440 }
13441 break;
13442 }
13443 }
13444 }
13445 }
13446 }
13447 }
13448 else
13449 {
13450 exp->isConstant = 0;
13451 }
13452 }
13453 else if(member)
13454 {
13455 }
13456 }
13457 if(exp->type != 8)
13458 {
13459 FreeExpression(memberExp);
13460 FreeIdentifier(memberID);
13461 }
13462 break;
13463 }
13464 case 10:
13465 {
13466 struct Type * type = ProcessType(exp->__anon1.typeName->qualifiers, exp->__anon1.typeName->declarator);
13467
13468 FreeExpContents(exp);
13469 exp->__anon1.__anon1.constant = PrintUInt(ComputeTypeSize(type));
13470 exp->type = 2;
13471 FreeType(type);
13472 break;
13473 }
13474 case 15:
13475 {
13476 struct Symbol * classSym = exp->__anon1._class->__anon1.__anon1.symbol;
13477
13478 if(classSym && classSym->__anon1.registered)
13479 {
13480 if(classSym->__anon1.registered->fixed)
13481 {
13482 FreeSpecifier(exp->__anon1._class);
13483 exp->__anon1.__anon1.constant = PrintUInt(classSym->__anon1.registered->templateClass ? classSym->__anon1.registered->templateClass->structSize : classSym->__anon1.registered->structSize);
13484 exp->type = 2;
13485 }
13486 else
13487 {
13488 char className[1024];
13489
13490 strcpy(className, "__ecereClass_");
13491 FullClassNameCat(className, classSym->string, 1);
13492 DeclareClass(curExternal, classSym, className);
13493 FreeExpContents(exp);
13494 exp->type = 9;
13495 exp->__anon1.member.exp = MkExpIdentifier(MkIdentifier(className));
13496 exp->__anon1.member.member = MkIdentifier("structSize");
13497 }
13498 }
13499 break;
13500 }
13501 case 11:
13502 {
13503 struct Type * type;
13504 struct Expression * e = exp;
13505
13506 if(exp->type == 11)
13507 {
13508 if(exp->__anon1.cast.exp)
13509 ComputeExpression(exp->__anon1.cast.exp);
13510 e = exp->__anon1.cast.exp;
13511 }
13512 if(e && exp->expType)
13513 {
13514 type = exp->expType;
13515 if(type->kind == 8)
13516 {
13517 struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1._class->__anon1.registered;
13518
13519 if(_class && (_class->type == 3 || _class->type == 2))
13520 {
13521 if(!_class->dataType)
13522 _class->dataType = ProcessTypeString(_class->dataTypeString, 0);
13523 type = _class->dataType;
13524 }
13525 }
13526 switch(type->kind)
13527 {
13528 case 24:
13529 case 1:
13530 if(type->isSigned)
13531 {
13532 char value = (char)0;
13533
13534 if(GetChar(e, &value))
13535 {
13536 FreeExpContents(exp);
13537 exp->__anon1.__anon1.constant = PrintChar(value);
13538 exp->type = 2;
13539 }
13540 }
13541 else
13542 {
13543 unsigned char value = (unsigned char)0;
13544
13545 if(GetUChar(e, &value))
13546 {
13547 FreeExpContents(exp);
13548 exp->__anon1.__anon1.constant = PrintUChar(value);
13549 exp->type = 2;
13550 }
13551 }
13552 break;
13553 case 2:
13554 if(type->isSigned)
13555 {
13556 short value = (short)0;
13557
13558 if(GetShort(e, &value))
13559 {
13560 FreeExpContents(exp);
13561 exp->__anon1.__anon1.constant = PrintShort(value);
13562 exp->type = 2;
13563 }
13564 }
13565 else
13566 {
13567 unsigned short value = (unsigned short)0;
13568
13569 if(GetUShort(e, &value))
13570 {
13571 FreeExpContents(exp);
13572 exp->__anon1.__anon1.constant = PrintUShort(value);
13573 exp->type = 2;
13574 }
13575 }
13576 break;
13577 case 3:
13578 if(type->isSigned)
13579 {
13580 int value = 0;
13581
13582 if(GetInt(e, &value))
13583 {
13584 FreeExpContents(exp);
13585 exp->__anon1.__anon1.constant = PrintInt(value);
13586 exp->type = 2;
13587 }
13588 }
13589 else
13590 {
13591 unsigned int value = 0;
13592
13593 if(GetUInt(e, &value))
13594 {
13595 FreeExpContents(exp);
13596 exp->__anon1.__anon1.constant = PrintUInt(value);
13597 exp->type = 2;
13598 }
13599 }
13600 break;
13601 case 4:
13602 if(type->isSigned)
13603 {
13604 long long value = 0;
13605
13606 if(GetInt64(e, &value))
13607 {
13608 FreeExpContents(exp);
13609 exp->__anon1.__anon1.constant = PrintInt64(value);
13610 exp->type = 2;
13611 }
13612 }
13613 else
13614 {
13615 uint64 value = 0;
13616
13617 if(GetUInt64(e, &value))
13618 {
13619 FreeExpContents(exp);
13620 exp->__anon1.__anon1.constant = PrintUInt64(value);
13621 exp->type = 2;
13622 }
13623 }
13624 break;
13625 case 22:
13626 if(type->isSigned)
13627 {
13628 intptr_t value = 0;
13629
13630 if(GetIntPtr(e, &value))
13631 {
13632 FreeExpContents(exp);
13633 exp->__anon1.__anon1.constant = PrintInt64((long long)value);
13634 exp->type = 2;
13635 }
13636 }
13637 else
13638 {
13639 uintptr_t value = 0;
13640
13641 if(GetUIntPtr(e, &value))
13642 {
13643 FreeExpContents(exp);
13644 exp->__anon1.__anon1.constant = PrintUInt64((uint64)value);
13645 exp->type = 2;
13646 }
13647 }
13648 break;
13649 case 23:
13650 if(type->isSigned)
13651 {
13652 ssize_t value = 0;
13653
13654 if(GetIntSize(e, &value))
13655 {
13656 FreeExpContents(exp);
13657 exp->__anon1.__anon1.constant = PrintInt64((long long)value);
13658 exp->type = 2;
13659 }
13660 }
13661 else
13662 {
13663 size_t value = 0;
13664
13665 if(GetUIntSize(e, &value))
13666 {
13667 FreeExpContents(exp);
13668 exp->__anon1.__anon1.constant = PrintUInt64((uint64)value);
13669 exp->type = 2;
13670 }
13671 }
13672 break;
13673 case 6:
13674 {
13675 float value = 0;
13676
13677 if(GetFloat(e, &value))
13678 {
13679 FreeExpContents(exp);
13680 exp->__anon1.__anon1.constant = PrintFloat(value);
13681 exp->type = 2;
13682 }
13683 break;
13684 }
13685 case 7:
13686 {
13687 double value = 0;
13688
13689 if(GetDouble(e, &value))
13690 {
13691 FreeExpContents(exp);
13692 exp->__anon1.__anon1.constant = PrintDouble(value);
13693 exp->type = 2;
13694 }
13695 break;
13696 }
13697 }
13698 }
13699 break;
13700 }
13701 case 12:
13702 {
13703 struct Operand op1 =
13704 {
13705 0, 0, 0,
13706 .__anon1 = {
13707 .c = 0
13708 },
13709 {
13710 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
13711 }
13712 };
13713 struct Operand op2 =
13714 {
13715 0, 0, 0,
13716 .__anon1 = {
13717 .c = 0
13718 },
13719 {
13720 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
13721 }
13722 };
13723 struct Operand op3 =
13724 {
13725 0, 0, 0,
13726 .__anon1 = {
13727 .c = 0
13728 },
13729 {
13730 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
13731 }
13732 };
13733
13734 if(exp->__anon1.cond.exp)
13735 ComputeExpression((*exp->__anon1.cond.exp).last);
13736 if(exp->__anon1.cond.elseExp)
13737 ComputeExpression(exp->__anon1.cond.elseExp);
13738 if(exp->__anon1.cond.cond)
13739 ComputeExpression(exp->__anon1.cond.cond);
13740 op1 = GetOperand(exp->__anon1.cond.cond);
13741 if(op1.type)
13742 op1.type->refCount++;
13743 op2 = GetOperand((*exp->__anon1.cond.exp).last);
13744 if(op2.type)
13745 op2.type->refCount++;
13746 op3 = GetOperand(exp->__anon1.cond.elseExp);
13747 if(op3.type)
13748 op3.type->refCount++;
13749 if(op1.ops.Cond)
13750 {
13751 FreeExpContents(exp);
13752 op1.ops.Cond(exp, &op1, &op2, &op3);
13753 }
13754 if(op1.type)
13755 FreeType(op1.type);
13756 if(op2.type)
13757 FreeType(op2.type);
13758 if(op3.type)
13759 FreeType(op3.type);
13760 break;
13761 }
13762 }
13763 }
13764
13765 unsigned int MatchWithEnums_Module(struct __ecereNameSpace__ecere__com__Instance * mainModule, struct Expression * sourceExp, struct Type * dest, char * string, struct __ecereNameSpace__ecere__sys__OldList * conversions)
13766 {
13767 struct __ecereNameSpace__ecere__com__Instance * module;
13768
13769 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))
13770 return 1;
13771 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))
13772 return 1;
13773 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))
13774 return 1;
13775 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)
13776 {
13777 if(ModuleVisibility(mainModule, module) && MatchWithEnums_NameSpace(&((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->publicNameSpace, sourceExp, dest, string, conversions))
13778 return 1;
13779 }
13780 return 0;
13781 }
13782
13783 unsigned int MatchTypeExpression(struct Expression * sourceExp, struct Type * dest, struct __ecereNameSpace__ecere__sys__OldList * conversions, unsigned int skipUnitBla, unsigned int warnConst)
13784 {
13785 struct Type * source;
13786 struct Type * realDest = dest;
13787 struct Type * backupSourceExpType = (((void *)0));
13788 struct Expression * computedExp = sourceExp;
13789
13790 dest->refCount++;
13791 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)
13792 {
13793 computedExp = CopyExpression(sourceExp);
13794 ComputeExpression(computedExp);
13795 }
13796 source = sourceExp->expType;
13797 if(dest->kind == 13 && sourceExp->type == 2 && !strtoul(sourceExp->__anon1.__anon1.constant, (((void *)0)), 0))
13798 {
13799 if(computedExp != sourceExp)
13800 {
13801 FreeExpression(computedExp);
13802 computedExp = sourceExp;
13803 }
13804 FreeType(dest);
13805 return 1;
13806 }
13807 if(!skipUnitBla && source && dest && source->kind == 8 && dest->kind == 8)
13808 {
13809 if(source->__anon1._class && source->__anon1._class->__anon1.registered && source->__anon1._class->__anon1.registered->type == 3)
13810 {
13811 struct __ecereNameSpace__ecere__com__Class * sourceBase, * destBase;
13812
13813 for(sourceBase = source->__anon1._class->__anon1.registered; sourceBase && sourceBase->base && sourceBase->base->type != 1000; sourceBase = sourceBase->base)
13814 ;
13815 for(destBase = dest->__anon1._class->__anon1.registered; destBase && destBase->base && destBase->base->type != 1000; destBase = destBase->base)
13816 ;
13817 if(sourceBase == destBase)
13818 {
13819 if(computedExp != sourceExp)
13820 {
13821 FreeExpression(computedExp);
13822 computedExp = sourceExp;
13823 }
13824 FreeType(dest);
13825 return 1;
13826 }
13827 }
13828 }
13829 if(source)
13830 {
13831 struct __ecereNameSpace__ecere__sys__OldList * specs;
13832 unsigned int flag = 0;
13833 long long value = (((int)0x7fffffff));
13834
13835 source->refCount++;
13836 if(computedExp->type == 2)
13837 {
13838 if(source->isSigned)
13839 value = strtoll(computedExp->__anon1.__anon1.constant, (((void *)0)), 0);
13840 else
13841 value = strtoull(computedExp->__anon1.__anon1.constant, (((void *)0)), 0);
13842 }
13843 else if(computedExp->type == 4 && sourceExp->__anon1.op.op == '-' && !computedExp->__anon1.op.exp1 && computedExp->__anon1.op.exp2 && computedExp->__anon1.op.exp2->type == 2)
13844 {
13845 if(source->isSigned)
13846 value = -strtoll(computedExp->__anon1.op.exp2->__anon1.__anon1.constant, (((void *)0)), 0);
13847 else
13848 value = -strtoull(computedExp->__anon1.op.exp2->__anon1.__anon1.constant, (((void *)0)), 0);
13849 }
13850 if(computedExp != sourceExp)
13851 {
13852 FreeExpression(computedExp);
13853 computedExp = sourceExp;
13854 }
13855 if(dest->kind != 8 && source->kind == 8 && source->__anon1._class && source->__anon1._class->__anon1.registered && !strcmp(source->__anon1._class->__anon1.registered->fullName, "ecere::com::unichar"))
13856 {
13857 FreeType(source);
13858 source = __extension__ ({
13859 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
13860
13861 __ecereInstance1->kind = 3, __ecereInstance1->isSigned = 0, __ecereInstance1->refCount = 1, __ecereInstance1;
13862 });
13863 }
13864 if(dest->kind == 8)
13865 {
13866 struct __ecereNameSpace__ecere__com__Class * _class = dest->__anon1._class ? dest->__anon1._class->__anon1.registered : (((void *)0));
13867
13868 if(_class && _class->type == 3)
13869 {
13870 if(source->kind != 8)
13871 {
13872 struct Type * tempType = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
13873 struct Type * tempDest, * tempSource;
13874
13875 for(; _class->base->type != 1000; _class = _class->base)
13876 ;
13877 tempSource = dest;
13878 tempDest = tempType;
13879 tempType->kind = 8;
13880 if(!_class->symbol)
13881 _class->symbol = FindClass(_class->fullName);
13882 tempType->__anon1._class = _class->symbol;
13883 tempType->truth = dest->truth;
13884 if(tempType->__anon1._class)
13885 MatchTypes(tempSource, tempDest, conversions, (((void *)0)), (((void *)0)), 1, 1, 0, 0, warnConst);
13886 backupSourceExpType = sourceExp->expType;
13887 if(dest->passAsTemplate)
13888 {
13889 sourceExp->expType = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
13890 CopyTypeInto(sourceExp->expType, dest);
13891 sourceExp->expType->passAsTemplate = 0;
13892 }
13893 else
13894 {
13895 sourceExp->expType = dest;
13896 dest->refCount++;
13897 }
13898 flag = 1;
13899 ((tempType ? (__ecereClass_Type->Destructor ? __ecereClass_Type->Destructor((void *)tempType) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(tempType)) : 0), tempType = 0);
13900 }
13901 }
13902 if(_class && _class->type == 2 && source->kind != 8)
13903 {
13904 if(!dest->__anon1._class->__anon1.registered->dataType)
13905 dest->__anon1._class->__anon1.registered->dataType = ProcessTypeString(dest->__anon1._class->__anon1.registered->dataTypeString, 0);
13906 if(MatchTypes(source, dest->__anon1._class->__anon1.registered->dataType, conversions, (((void *)0)), (((void *)0)), 1, 1, 0, 0, warnConst))
13907 {
13908 FreeType(source);
13909 FreeType(sourceExp->expType);
13910 source = sourceExp->expType = MkClassType(dest->__anon1._class->string);
13911 source->refCount++;
13912 }
13913 }
13914 if(_class && !strcmp(_class->fullName, "ecere::com::Class") && source->kind == 13 && source->__anon1.type && source->__anon1.type->kind == 1 && sourceExp->type == 3)
13915 {
13916 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
13917 struct Declarator * decl;
13918 char string[1024];
13919
13920 ReadString(string, sourceExp->__anon1.__anon2.string);
13921 decl = SpecDeclFromString(string, specs, (((void *)0)));
13922 FreeExpContents(sourceExp);
13923 FreeType(sourceExp->expType);
13924 sourceExp->type = 24;
13925 sourceExp->__anon1._classExp.specifiers = specs;
13926 sourceExp->__anon1._classExp.decl = decl;
13927 sourceExp->expType = dest;
13928 dest->refCount++;
13929 FreeType(source);
13930 FreeType(dest);
13931 if(backupSourceExpType)
13932 FreeType(backupSourceExpType);
13933 return 1;
13934 }
13935 }
13936 else if(source->kind == 8)
13937 {
13938 struct __ecereNameSpace__ecere__com__Class * _class = source->__anon1._class ? source->__anon1._class->__anon1.registered : (((void *)0));
13939
13940 if(_class && (_class->type == 3 || _class->type == 2))
13941 {
13942 if(dest->kind != 8)
13943 {
13944 struct Type * tempType = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
13945 struct Type * tempDest, * tempSource;
13946
13947 if(!source->__anon1._class->__anon1.registered->dataType)
13948 source->__anon1._class->__anon1.registered->dataType = ProcessTypeString(source->__anon1._class->__anon1.registered->dataTypeString, 0);
13949 for(; _class->base->type != 1000; _class = _class->base)
13950 ;
13951 tempDest = source;
13952 tempSource = tempType;
13953 tempType->kind = 8;
13954 tempType->__anon1._class = FindClass(_class->fullName);
13955 tempType->truth = source->truth;
13956 tempType->classObjectType = source->classObjectType;
13957 if(tempType->__anon1._class)
13958 MatchTypes(tempSource, tempDest, conversions, (((void *)0)), (((void *)0)), 1, 1, 0, 0, warnConst);
13959 if(conversions && conversions->last)
13960 {
13961 ((struct Conversion *)conversions->last)->resultType = dest;
13962 dest->refCount++;
13963 }
13964 FreeType(sourceExp->expType);
13965 sourceExp->expType = MkClassType(_class->fullName);
13966 sourceExp->expType->truth = source->truth;
13967 sourceExp->expType->classObjectType = source->classObjectType;
13968 if(!sourceExp->destType)
13969 {
13970 FreeType(sourceExp->destType);
13971 sourceExp->destType = sourceExp->expType;
13972 if(sourceExp->expType)
13973 sourceExp->expType->refCount++;
13974 }
13975 if(!_class->dataType)
13976 _class->dataType = ProcessTypeString(_class->dataTypeString, 0);
13977 FreeType(dest);
13978 dest = MkClassType(source->__anon1._class->string);
13979 dest->truth = source->truth;
13980 dest->classObjectType = source->classObjectType;
13981 FreeType(source);
13982 source = _class->dataType;
13983 source->refCount++;
13984 ((tempType ? (__ecereClass_Type->Destructor ? __ecereClass_Type->Destructor((void *)tempType) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(tempType)) : 0), tempType = 0);
13985 }
13986 }
13987 }
13988 if(!flag)
13989 {
13990 if(MatchTypes(source, dest, conversions, (((void *)0)), (((void *)0)), 1, 1, 0, 0, warnConst))
13991 {
13992 FreeType(source);
13993 FreeType(dest);
13994 return 1;
13995 }
13996 }
13997 if(dest->kind == 8)
13998 {
13999 struct __ecereNameSpace__ecere__com__Class * _class = dest->__anon1._class ? dest->__anon1._class->__anon1.registered : (((void *)0));
14000 unsigned int fittingValue = 0;
14001
14002 if(_class && _class->type == 4)
14003 {
14004 struct __ecereNameSpace__ecere__com__Class * enumClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "enum");
14005 struct __ecereNameSpace__ecere__com__EnumClassData * c = (_class ? ((void *)(((char *)_class->data) + enumClass->offsetClass)) : (((void *)0)));
14006
14007 if(c && value >= 0 && value <= c->largest)
14008 fittingValue = 1;
14009 }
14010 if(_class && !dest->truth && (_class->type == 3 || fittingValue || (_class->type != 1 && !value && source->kind == 3) || _class->type == 2))
14011 {
14012 if(_class->type == 0 || _class->type == 5)
14013 {
14014 struct Expression * newExp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression);
14015
14016 *newExp = *sourceExp;
14017 if(sourceExp->destType)
14018 sourceExp->destType->refCount++;
14019 if(sourceExp->expType)
14020 sourceExp->expType->refCount++;
14021 sourceExp->type = 11;
14022 sourceExp->__anon1.cast.typeName = MkTypeName(MkListOne(MkSpecifier(VOID)), MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), (((void *)0))));
14023 sourceExp->__anon1.cast.exp = newExp;
14024 FreeType(sourceExp->expType);
14025 sourceExp->expType = (((void *)0));
14026 ProcessExpressionType(sourceExp);
14027 if(!inCompiler)
14028 {
14029 FreeType(sourceExp->expType);
14030 sourceExp->expType = dest;
14031 }
14032 FreeType(source);
14033 if(inCompiler)
14034 FreeType(dest);
14035 if(backupSourceExpType)
14036 FreeType(backupSourceExpType);
14037 return 1;
14038 }
14039 if(!_class->dataType)
14040 _class->dataType = ProcessTypeString(_class->dataTypeString, 0);
14041 FreeType(dest);
14042 dest = _class->dataType;
14043 dest->refCount++;
14044 }
14045 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))
14046 {
14047 specs = MkListOne(MkSpecifier(DOUBLE));
14048 }
14049 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))
14050 {
14051 specs = MkListOne(MkSpecifier(FLOAT));
14052 }
14053 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))
14054 {
14055 specs = MkList();
14056 if(!dest->isSigned)
14057 ListAdd(specs, MkSpecifier(UNSIGNED));
14058 ListAdd(specs, MkSpecifier(INT64));
14059 }
14060 else if(dest->kind == 3 && (source->kind == 3 || source->kind == 2 || source->kind == 1 || source->kind == 24 || source->kind == 6 || source->kind == 7))
14061 {
14062 specs = MkList();
14063 if(!dest->isSigned)
14064 ListAdd(specs, MkSpecifier(UNSIGNED));
14065 ListAdd(specs, MkSpecifier(INT));
14066 }
14067 else if(dest->kind == 2 && (source->kind == 2 || source->kind == 1 || source->kind == 24 || source->kind == 3 || source->kind == 6 || source->kind == 7))
14068 {
14069 specs = MkList();
14070 if(!dest->isSigned)
14071 ListAdd(specs, MkSpecifier(UNSIGNED));
14072 ListAdd(specs, MkSpecifier(SHORT));
14073 }
14074 else if(dest->kind == 1 && (source->kind == 1 || source->kind == 24 || source->kind == 2 || source->kind == 3 || source->kind == 6 || source->kind == 7))
14075 {
14076 specs = MkList();
14077 if(!dest->isSigned)
14078 ListAdd(specs, MkSpecifier(UNSIGNED));
14079 ListAdd(specs, MkSpecifier(CHAR));
14080 }
14081 else
14082 {
14083 FreeType(source);
14084 FreeType(dest);
14085 if(backupSourceExpType)
14086 {
14087 if(sourceExp->expType)
14088 FreeType(sourceExp->expType);
14089 sourceExp->expType = backupSourceExpType;
14090 }
14091 return 0;
14092 }
14093 }
14094 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))
14095 {
14096 specs = MkListOne(MkSpecifier(DOUBLE));
14097 }
14098 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))
14099 {
14100 specs = MkListOne(MkSpecifier(FLOAT));
14101 }
14102 else if(dest->kind == 24 && (source->kind == 24 || source->kind == 1 || source->kind == 15 || source->kind == 2 || source->kind == 3) && (value == 1 || value == 0))
14103 {
14104 specs = MkList();
14105 ListAdd(specs, MkSpecifier(BOOL));
14106 }
14107 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)))
14108 {
14109 specs = MkList();
14110 if(!dest->isSigned)
14111 ListAdd(specs, MkSpecifier(UNSIGNED));
14112 ListAdd(specs, MkSpecifier(CHAR));
14113 }
14114 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)))))
14115 {
14116 specs = MkList();
14117 if(!dest->isSigned)
14118 ListAdd(specs, MkSpecifier(UNSIGNED));
14119 ListAdd(specs, MkSpecifier(SHORT));
14120 }
14121 else if(dest->kind == 3 && (source->kind == 15 || source->kind == 2 || source->kind == 24 || source->kind == 1 || source->kind == 3))
14122 {
14123 specs = MkList();
14124 if(!dest->isSigned)
14125 ListAdd(specs, MkSpecifier(UNSIGNED));
14126 ListAdd(specs, MkSpecifier(INT));
14127 }
14128 else if(dest->kind == 4 && (source->kind == 15 || source->kind == 2 || source->kind == 24 || source->kind == 1 || source->kind == 3 || source->kind == 4))
14129 {
14130 specs = MkList();
14131 if(!dest->isSigned)
14132 ListAdd(specs, MkSpecifier(UNSIGNED));
14133 ListAdd(specs, MkSpecifier(INT64));
14134 }
14135 else if(dest->kind == 15 && (source->kind == 4 || source->kind == 3 || source->kind == 2 || source->kind == 24 || source->kind == 1))
14136 {
14137 specs = MkListOne(MkEnum(MkIdentifier(dest->__anon1.__anon1.enumName), (((void *)0))));
14138 }
14139 else
14140 {
14141 FreeType(source);
14142 FreeType(dest);
14143 if(backupSourceExpType)
14144 {
14145 if(sourceExp->expType)
14146 FreeType(sourceExp->expType);
14147 sourceExp->expType = backupSourceExpType;
14148 }
14149 return 0;
14150 }
14151 if(!flag && !sourceExp->opDestType)
14152 {
14153 struct Expression * newExp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression);
14154
14155 *newExp = *sourceExp;
14156 newExp->prev = (((void *)0));
14157 newExp->next = (((void *)0));
14158 if(sourceExp->destType)
14159 sourceExp->destType->refCount++;
14160 if(sourceExp->expType)
14161 sourceExp->expType->refCount++;
14162 sourceExp->type = 11;
14163 if(realDest->kind == 8)
14164 {
14165 sourceExp->__anon1.cast.typeName = QMkClass(realDest->__anon1._class->string, (((void *)0)));
14166 FreeList(specs, (void *)(FreeSpecifier));
14167 }
14168 else
14169 sourceExp->__anon1.cast.typeName = MkTypeName(specs, (((void *)0)));
14170 if(newExp->type == 4)
14171 {
14172 sourceExp->__anon1.cast.exp = MkExpBrackets(MkListOne(newExp));
14173 }
14174 else
14175 sourceExp->__anon1.cast.exp = newExp;
14176 FreeType(sourceExp->expType);
14177 sourceExp->expType = (((void *)0));
14178 ProcessExpressionType(sourceExp);
14179 }
14180 else
14181 FreeList(specs, (void *)(FreeSpecifier));
14182 FreeType(dest);
14183 FreeType(source);
14184 if(backupSourceExpType)
14185 FreeType(backupSourceExpType);
14186 return 1;
14187 }
14188 else
14189 {
14190 if(computedExp != sourceExp)
14191 {
14192 FreeExpression(computedExp);
14193 computedExp = sourceExp;
14194 }
14195 while((sourceExp->type == 5 || sourceExp->type == 32) && sourceExp->__anon1.list)
14196 sourceExp = (*sourceExp->__anon1.list).last;
14197 if(sourceExp->type == 0)
14198 {
14199 struct Identifier * id = sourceExp->__anon1.__anon1.identifier;
14200
14201 if(dest->kind == 8)
14202 {
14203 if(dest->__anon1._class && dest->__anon1._class->__anon1.registered && dest->__anon1._class->__anon1.registered->type == 4)
14204 {
14205 struct __ecereNameSpace__ecere__com__Class * _class = dest->__anon1._class->__anon1.registered;
14206 struct __ecereNameSpace__ecere__com__Class * enumClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "enum");
14207
14208 if(enumClass)
14209 {
14210 for(; _class && _class->type == 4; _class = _class->base)
14211 {
14212 struct __ecereNameSpace__ecere__sys__NamedLink64 * value;
14213 struct __ecereNameSpace__ecere__com__EnumClassData * e = (_class ? ((void *)(((char *)_class->data) + enumClass->offsetClass)) : (((void *)0)));
14214
14215 for(value = e->values.first; value; value = value->next)
14216 {
14217 if(!strcmp(value->name, id->string))
14218 break;
14219 }
14220 if(value)
14221 {
14222 FreeType(sourceExp->expType);
14223 sourceExp->isConstant = 1;
14224 sourceExp->expType = MkClassType(_class->fullName);
14225 if(inCompiler || inPreCompiler || inDebugger)
14226 {
14227 FreeExpContents(sourceExp);
14228 sourceExp->type = 2;
14229 if(_class->dataTypeString && (!strcmp(_class->dataTypeString, "int") || !strcmp(_class->dataTypeString, "int64") || !strcmp(_class->dataTypeString, "short") || !strcmp(_class->dataTypeString, "char")))
14230 sourceExp->__anon1.__anon1.constant = PrintInt64(value->data);
14231 else
14232 sourceExp->__anon1.__anon1.constant = PrintUInt64(value->data);
14233 }
14234 FreeType(dest);
14235 return 1;
14236 }
14237 }
14238 }
14239 }
14240 }
14241 if(dest->classObjectType != 2 && dest->kind == 8 && MatchWithEnums_Module(privateModule, sourceExp, dest, id->string, conversions))
14242 {
14243 FreeType(dest);
14244 return 1;
14245 }
14246 }
14247 FreeType(dest);
14248 }
14249 return 0;
14250 }
14251
14252 static unsigned int CheckExpressionType(struct Expression * exp, struct Type * destType, unsigned int skipUnitBla, unsigned int warnConst)
14253 {
14254 unsigned int result = 1;
14255
14256 if(destType)
14257 {
14258 struct __ecereNameSpace__ecere__sys__OldList converts =
14259 {
14260 0, 0, 0, 0, 0
14261 };
14262 struct Conversion * convert;
14263
14264 if(destType->kind == 0)
14265 return 0;
14266 if(!MatchTypeExpression(exp, destType, &converts, skipUnitBla, warnConst))
14267 result = 0;
14268 if(converts.count)
14269 {
14270 for(convert = converts.first; convert; convert = convert->next)
14271 {
14272 unsigned int empty = !(convert->isGet ? (void *)convert->convert->Get : (void *)convert->convert->Set);
14273
14274 if(!empty)
14275 {
14276 struct Expression * newExp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression);
14277 int objectType = exp->expType ? exp->expType->classObjectType : 0;
14278
14279 *newExp = *exp;
14280 newExp->prev = (((void *)0));
14281 newExp->next = (((void *)0));
14282 newExp->destType = (((void *)0));
14283 if(convert->isGet)
14284 {
14285 exp->type = 8;
14286 exp->addedThis = 1;
14287 exp->__anon1.member.exp = newExp;
14288 FreeType(exp->__anon1.member.exp->expType);
14289 exp->__anon1.member.exp->expType = MkClassType(convert->convert->_class->fullName);
14290 exp->__anon1.member.exp->expType->classObjectType = objectType;
14291 exp->__anon1.member.member = MkIdentifier(convert->convert->dataTypeString);
14292 exp->__anon1.member.memberType = 1;
14293 exp->expType = convert->resultType ? convert->resultType : convert->convert->dataType;
14294 exp->needCast = 1;
14295 if(exp->expType)
14296 exp->expType->refCount++;
14297 ApplyAnyObjectLogic(exp->__anon1.member.exp);
14298 }
14299 else
14300 {
14301 {
14302 exp->type = 8;
14303 exp->addedThis = 1;
14304 exp->__anon1.member.exp = newExp;
14305 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)
14306 {
14307 newExp->byReference = 1;
14308 }
14309 FreeType(exp->__anon1.member.exp->expType);
14310 exp->__anon1.member.exp->expType = (((void *)0));
14311 if(convert->convert->dataType)
14312 {
14313 exp->__anon1.member.exp->expType = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
14314 CopyTypeInto(exp->__anon1.member.exp->expType, convert->convert->dataType);
14315 exp->__anon1.member.exp->expType->refCount = 1;
14316 exp->__anon1.member.exp->expType->classObjectType = objectType;
14317 ApplyAnyObjectLogic(exp->__anon1.member.exp);
14318 }
14319 exp->__anon1.member.member = MkIdentifier(convert->convert->_class->fullName);
14320 exp->__anon1.member.memberType = 4;
14321 exp->expType = convert->resultType ? convert->resultType : MkClassType(convert->convert->_class->fullName);
14322 exp->needCast = 1;
14323 if(convert->resultType)
14324 convert->resultType->refCount++;
14325 }
14326 }
14327 }
14328 else
14329 {
14330 FreeType(exp->expType);
14331 if(convert->isGet)
14332 {
14333 exp->expType = convert->resultType ? convert->resultType : convert->convert->dataType;
14334 if(exp->destType->casted)
14335 exp->needCast = 1;
14336 if(exp->expType)
14337 exp->expType->refCount++;
14338 }
14339 else
14340 {
14341 exp->expType = convert->resultType ? convert->resultType : MkClassType(convert->convert->_class->fullName);
14342 if(exp->destType->casted)
14343 exp->needCast = 1;
14344 if(convert->resultType)
14345 convert->resultType->refCount++;
14346 }
14347 }
14348 }
14349 if(exp->isConstant && inCompiler)
14350 ComputeExpression(exp);
14351 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Free(&converts, (void *)(FreeConvert));
14352 }
14353 if(!result && exp->expType && converts.count)
14354 {
14355 result = MatchTypes(exp->expType, exp->destType, (((void *)0)), (((void *)0)), (((void *)0)), 1, 1, 0, 0, warnConst);
14356 }
14357 if(!result && exp->expType && exp->destType)
14358 {
14359 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))
14360 result = 1;
14361 }
14362 }
14363 return result;
14364 }
14365
14366 static void ProcessFunction(struct FunctionDefinition *  function);
14367
14368 void ProcessInstantiationType(struct Instantiation * inst)
14369 {
14370 yylloc = inst->loc;
14371 if(inst->_class)
14372 {
14373 struct MembersInit * members;
14374 struct Symbol * classSym;
14375 struct __ecereNameSpace__ecere__com__Class * _class;
14376
14377 classSym = inst->_class->__anon1.__anon1.symbol;
14378 _class = classSym ? classSym->__anon1.registered : (((void *)0));
14379 if(!_class || _class->type != 5)
14380 DeclareStruct(curExternal, inst->_class->__anon1.__anon1.name, 0, 1);
14381 afterExternal = afterExternal ? afterExternal : curExternal;
14382 if(inst->exp)
14383 ProcessExpressionType(inst->exp);
14384 inst->isConstant = 1;
14385 if(inst->members)
14386 {
14387 struct __ecereNameSpace__ecere__com__DataMember * curMember = (((void *)0));
14388 struct __ecereNameSpace__ecere__com__Class * curClass = (((void *)0));
14389 struct __ecereNameSpace__ecere__com__DataMember * subMemberStack[256];
14390 int subMemberStackPos = 0;
14391
14392 for(members = (*inst->members).first; members; members = members->next)
14393 {
14394 switch(members->type)
14395 {
14396 case 1:
14397 {
14398 char name[1024];
14399 static unsigned int instMethodID = 0;
14400 struct External * external = curExternal;
14401 struct Context * context = curContext;
14402 struct Declarator * declarator = members->__anon1.function->declarator;
14403 struct Identifier * nameID = GetDeclId(declarator);
14404 char * unmangled = nameID ? nameID->string : (((void *)0));
14405 struct Expression * exp;
14406 struct External * createdExternal = (((void *)0));
14407
14408 if(inCompiler)
14409 {
14410 char number[16];
14411
14412 strcpy(name, "__ecereInstMeth_");
14413 FullClassNameCat(name, _class ? _class->fullName : "_UNKNOWNCLASS", 0);
14414 strcat(name, "_");
14415 strcat(name, nameID->string);
14416 strcat(name, "_");
14417 sprintf(number, "_%08d", instMethodID++);
14418 strcat(name, number);
14419 nameID->string = __ecereNameSpace__ecere__sys__CopyString(name);
14420 }
14421 if(declarator)
14422 {
14423 struct Symbol * symbol = declarator->symbol;
14424 struct __ecereNameSpace__ecere__com__Method * method = __ecereNameSpace__ecere__com__eClass_FindMethod(_class, unmangled, privateModule);
14425
14426 if(method && method->type == 1)
14427 {
14428 symbol->__anon1.method = method;
14429 ProcessMethodType(method);
14430 if(!symbol->type->__anon1.__anon2.thisClass)
14431 {
14432 if(method->dataType->__anon1.__anon2.thisClass && currentClass && __ecereNameSpace__ecere__com__eClass_IsDerived(currentClass, method->dataType->__anon1.__anon2.thisClass->__anon1.registered))
14433 {
14434 if(!currentClass->symbol)
14435 currentClass->symbol = FindClass(currentClass->fullName);
14436 symbol->type->__anon1.__anon2.thisClass = currentClass->symbol;
14437 }
14438 else
14439 {
14440 if(!_class->symbol)
14441 _class->symbol = FindClass(_class->fullName);
14442 symbol->type->__anon1.__anon2.thisClass = _class->symbol;
14443 }
14444 }
14445 DeclareType(curExternal, symbol->type, 1, 1);
14446 }
14447 else if(classSym)
14448 {
14449 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "couldn't find virtual method %s in class %s\n", (((void *)0))), unmangled, classSym->string);
14450 }
14451 }
14452 createdExternal = ProcessClassFunction(classSym ? classSym->__anon1.registered : (((void *)0)), members->__anon1.function, ast, afterExternal, 1);
14453 if(nameID)
14454 {
14455 FreeSpecifier(nameID->_class);
14456 nameID->_class = (((void *)0));
14457 }
14458 curExternal = createdExternal;
14459 if(inCompiler)
14460 {
14461 if(createdExternal->__anon1.function)
14462 ProcessFunction(createdExternal->__anon1.function);
14463 }
14464 else if(declarator)
14465 {
14466 curExternal = declarator->symbol->__anon2.__anon1.pointerExternal;
14467 ProcessFunction((struct FunctionDefinition *)members->__anon1.function);
14468 }
14469 curExternal = external;
14470 curContext = context;
14471 if(inCompiler)
14472 {
14473 FreeClassFunction(members->__anon1.function);
14474 exp = QMkExpId(name);
14475 members->type = 0;
14476 members->__anon1.dataMembers = MkListOne(MkMemberInit(MkListOne(MkIdentifier(unmangled)), MkInitializerAssignment(exp)));
14477 (__ecereNameSpace__ecere__com__eSystem_Delete(unmangled), unmangled = 0);
14478 }
14479 break;
14480 }
14481 case 0:
14482 {
14483 if(members->__anon1.dataMembers && classSym)
14484 {
14485 struct MemberInit * member;
14486 struct Location oldyyloc = yylloc;
14487
14488 for(member = (*members->__anon1.dataMembers).first; member; member = member->next)
14489 {
14490 ProcessMemberInitData(member, classSym->__anon1.registered, &curClass, &curMember, subMemberStack, &subMemberStackPos);
14491 if(member->initializer && !member->initializer->isConstant)
14492 inst->isConstant = 0;
14493 }
14494 yylloc = oldyyloc;
14495 }
14496 break;
14497 }
14498 }
14499 }
14500 }
14501 }
14502 }
14503
14504 static void ProcessStatement(struct Statement * stmt)
14505 {
14506 yylloc = stmt->loc;
14507 switch(stmt->type)
14508 {
14509 case 0:
14510 ProcessStatement(stmt->__anon1.labeled.stmt);
14511 break;
14512 case 1:
14513 if(stmt->__anon1.caseStmt.exp)
14514 {
14515 FreeType(stmt->__anon1.caseStmt.exp->destType);
14516 stmt->__anon1.caseStmt.exp->destType = curSwitchType;
14517 if(curSwitchType)
14518 curSwitchType->refCount++;
14519 ProcessExpressionType(stmt->__anon1.caseStmt.exp);
14520 ComputeExpression(stmt->__anon1.caseStmt.exp);
14521 }
14522 if(stmt->__anon1.caseStmt.stmt)
14523 ProcessStatement(stmt->__anon1.caseStmt.stmt);
14524 break;
14525 case 2:
14526 {
14527 if(stmt->__anon1.compound.context)
14528 {
14529 struct Declaration * decl;
14530 struct Statement * s;
14531 struct Statement * prevCompound = curCompound;
14532 struct Context * prevContext = curContext;
14533
14534 if(!stmt->__anon1.compound.isSwitch)
14535 curCompound = stmt;
14536 curContext = stmt->__anon1.compound.context;
14537 if(stmt->__anon1.compound.declarations)
14538 {
14539 for(decl = (*stmt->__anon1.compound.declarations).first; decl; decl = decl->next)
14540 ProcessDeclaration(decl);
14541 }
14542 if(stmt->__anon1.compound.statements)
14543 {
14544 for(s = (*stmt->__anon1.compound.statements).first; s; s = s->next)
14545 ProcessStatement(s);
14546 }
14547 curContext = prevContext;
14548 curCompound = prevCompound;
14549 }
14550 break;
14551 }
14552 case 3:
14553 {
14554 struct Expression * exp;
14555
14556 if(stmt->__anon1.expressions)
14557 {
14558 for(exp = (*stmt->__anon1.expressions).first; exp; exp = exp->next)
14559 ProcessExpressionType(exp);
14560 }
14561 break;
14562 }
14563 case 4:
14564 {
14565 struct Expression * exp;
14566
14567 FreeType(((struct Expression *)(*stmt->__anon1.ifStmt.exp).last)->destType);
14568 ((struct Expression *)(*stmt->__anon1.ifStmt.exp).last)->destType = MkClassType("bool");
14569 ((struct Expression *)(*stmt->__anon1.ifStmt.exp).last)->destType->truth = 1;
14570 for(exp = (*stmt->__anon1.ifStmt.exp).first; exp; exp = exp->next)
14571 {
14572 ProcessExpressionType(exp);
14573 }
14574 if(stmt->__anon1.ifStmt.stmt)
14575 ProcessStatement(stmt->__anon1.ifStmt.stmt);
14576 if(stmt->__anon1.ifStmt.elseStmt)
14577 ProcessStatement(stmt->__anon1.ifStmt.elseStmt);
14578 break;
14579 }
14580 case 5:
14581 {
14582 struct Type * oldSwitchType = curSwitchType;
14583
14584 if(stmt->__anon1.switchStmt.exp)
14585 {
14586 struct Expression * exp;
14587
14588 for(exp = (*stmt->__anon1.switchStmt.exp).first; exp; exp = exp->next)
14589 {
14590 if(!exp->next)
14591 {
14592 ProcessExpressionType(exp);
14593 }
14594 if(!exp->next)
14595 curSwitchType = exp->expType;
14596 }
14597 }
14598 ProcessStatement(stmt->__anon1.switchStmt.stmt);
14599 curSwitchType = oldSwitchType;
14600 break;
14601 }
14602 case 6:
14603 {
14604 if(stmt->__anon1.whileStmt.exp)
14605 {
14606 struct Expression * exp;
14607
14608 FreeType(((struct Expression *)(*stmt->__anon1.whileStmt.exp).last)->destType);
14609 ((struct Expression *)(*stmt->__anon1.whileStmt.exp).last)->destType = MkClassType("bool");
14610 ((struct Expression *)(*stmt->__anon1.whileStmt.exp).last)->destType->truth = 1;
14611 for(exp = (*stmt->__anon1.whileStmt.exp).first; exp; exp = exp->next)
14612 {
14613 ProcessExpressionType(exp);
14614 }
14615 }
14616 if(stmt->__anon1.whileStmt.stmt)
14617 ProcessStatement(stmt->__anon1.whileStmt.stmt);
14618 break;
14619 }
14620 case 7:
14621 {
14622 if(stmt->__anon1.doWhile.exp)
14623 {
14624 struct Expression * exp;
14625
14626 if((*stmt->__anon1.doWhile.exp).last)
14627 {
14628 FreeType(((struct Expression *)(*stmt->__anon1.doWhile.exp).last)->destType);
14629 ((struct Expression *)(*stmt->__anon1.doWhile.exp).last)->destType = MkClassType("bool");
14630 ((struct Expression *)(*stmt->__anon1.doWhile.exp).last)->destType->truth = 1;
14631 }
14632 for(exp = (*stmt->__anon1.doWhile.exp).first; exp; exp = exp->next)
14633 {
14634 ProcessExpressionType(exp);
14635 }
14636 }
14637 if(stmt->__anon1.doWhile.stmt)
14638 ProcessStatement(stmt->__anon1.doWhile.stmt);
14639 break;
14640 }
14641 case 8:
14642 {
14643 struct Expression * exp;
14644
14645 if(stmt->__anon1.forStmt.init)
14646 ProcessStatement(stmt->__anon1.forStmt.init);
14647 if(stmt->__anon1.forStmt.check && stmt->__anon1.forStmt.check->__anon1.expressions)
14648 {
14649 FreeType(((struct Expression *)(*stmt->__anon1.forStmt.check->__anon1.expressions).last)->destType);
14650 ((struct Expression *)(*stmt->__anon1.forStmt.check->__anon1.expressions).last)->destType = MkClassType("bool");
14651 ((struct Expression *)(*stmt->__anon1.forStmt.check->__anon1.expressions).last)->destType->truth = 1;
14652 }
14653 if(stmt->__anon1.forStmt.check)
14654 ProcessStatement(stmt->__anon1.forStmt.check);
14655 if(stmt->__anon1.forStmt.increment)
14656 {
14657 for(exp = (*stmt->__anon1.forStmt.increment).first; exp; exp = exp->next)
14658 ProcessExpressionType(exp);
14659 }
14660 if(stmt->__anon1.forStmt.stmt)
14661 ProcessStatement(stmt->__anon1.forStmt.stmt);
14662 break;
14663 }
14664 case 18:
14665 {
14666 struct Identifier * id = stmt->__anon1.forEachStmt.id;
14667 struct __ecereNameSpace__ecere__sys__OldList * exp = stmt->__anon1.forEachStmt.exp;
14668 struct __ecereNameSpace__ecere__sys__OldList * filter = stmt->__anon1.forEachStmt.filter;
14669 struct Statement * block = stmt->__anon1.forEachStmt.stmt;
14670 char iteratorType[1024];
14671 struct Type * source;
14672 struct Expression * e;
14673 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));
14674 struct Expression * arrayExp;
14675 const char * typeString = (((void *)0));
14676 int builtinCount = 0;
14677
14678 for(e = exp ? (*exp).first : (((void *)0)); e; e = e->next)
14679 {
14680 if(!e->next)
14681 {
14682 FreeType(e->destType);
14683 e->destType = ProcessTypeString("Container", 0);
14684 }
14685 if(!isBuiltin || e->next)
14686 ProcessExpressionType(e);
14687 }
14688 source = (exp && (*exp).last) ? ((struct Expression *)(*exp).last)->expType : (((void *)0));
14689 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)))
14690 {
14691 struct __ecereNameSpace__ecere__com__Class * _class = source ? source->__anon1._class->__anon1.registered : (((void *)0));
14692 struct Symbol * symbol;
14693 struct Expression * expIt = (((void *)0));
14694 unsigned int isMap = 0, isArray = 0, isLinkList = 0, isList = 0, isCustomAVLTree = 0;
14695 struct __ecereNameSpace__ecere__com__Class * arrayClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "Array");
14696 struct __ecereNameSpace__ecere__com__Class * linkListClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "LinkList");
14697 struct __ecereNameSpace__ecere__com__Class * customAVLTreeClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "CustomAVLTree");
14698
14699 if(inCompiler)
14700 {
14701 stmt->type = 2;
14702 stmt->__anon1.compound.context = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Context);
14703 stmt->__anon1.compound.context->parent = curContext;
14704 curContext = stmt->__anon1.compound.context;
14705 }
14706 if(source && __ecereNameSpace__ecere__com__eClass_IsDerived(source->__anon1._class->__anon1.registered, customAVLTreeClass))
14707 {
14708 struct __ecereNameSpace__ecere__com__Class * mapClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "Map");
14709
14710 isCustomAVLTree = 1;
14711 if(__ecereNameSpace__ecere__com__eClass_IsDerived(source->__anon1._class->__anon1.registered, mapClass))
14712 isMap = 1;
14713 }
14714 else if(source && __ecereNameSpace__ecere__com__eClass_IsDerived(source->__anon1._class->__anon1.registered, arrayClass))
14715 isArray = 1;
14716 else if(source && __ecereNameSpace__ecere__com__eClass_IsDerived(source->__anon1._class->__anon1.registered, linkListClass))
14717 {
14718 struct __ecereNameSpace__ecere__com__Class * listClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "List");
14719
14720 isLinkList = 1;
14721 isList = __ecereNameSpace__ecere__com__eClass_IsDerived(source->__anon1._class->__anon1.registered, listClass);
14722 }
14723 if(inCompiler && isArray)
14724 {
14725 struct Declarator * decl;
14726 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
14727
14728 decl = SpecDeclFromString(_class->templateArgs[2].__anon1.__anon1.dataTypeString, specs, MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), MkDeclaratorIdentifier(id)));
14729 stmt->__anon1.compound.declarations = MkListOne(MkDeclaration(specs, MkListOne(MkInitDeclarator(decl, (((void *)0))))));
14730 ListAdd(stmt->__anon1.compound.declarations, MkDeclaration(MkListOne(MkSpecifierName(source->__anon1._class->__anon1.registered->fullName)), MkListOne(MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier("__internalArray")), MkInitializerAssignment(MkExpBrackets(exp))))));
14731 }
14732 else if(isBuiltin)
14733 {
14734 struct Type * type = (((void *)0));
14735 char typeStringBuf[1024];
14736
14737 arrayExp = (((struct Expression *)(*exp).last)->type == 35) ? (struct Expression *)(*exp).last : ((struct Expression *)(*exp).last)->__anon1.cast.exp;
14738 if(((struct Expression *)(*exp).last)->type == 11)
14739 {
14740 struct TypeName * typeName = ((struct Expression *)(*exp).last)->__anon1.cast.typeName;
14741
14742 if(typeName)
14743 arrayExp->destType = ProcessType(typeName->qualifiers, typeName->declarator);
14744 }
14745 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)
14746 {
14747 struct __ecereNameSpace__ecere__com__Class * templateClass = arrayExp->destType->__anon1._class->__anon1.registered;
14748
14749 typeString = templateClass->templateArgs[2].__anon1.__anon1.dataTypeString;
14750 }
14751 else if(arrayExp->__anon1.list)
14752 {
14753 struct Expression * e;
14754
14755 for(e = (*arrayExp->__anon1.list).first; e; e = e->next)
14756 {
14757 ProcessExpressionType(e);
14758 if(e->expType)
14759 {
14760 if(!type)
14761 {
14762 type = e->expType;
14763 type->refCount++;
14764 }
14765 else
14766 {
14767 if(!MatchTypeExpression(e, type, (((void *)0)), 0, 1))
14768 {
14769 FreeType(type);
14770 type = e->expType;
14771 e->expType = (((void *)0));
14772 e = (*arrayExp->__anon1.list).first;
14773 ProcessExpressionType(e);
14774 if(e->expType)
14775 {
14776 if(!MatchTypeExpression(e, type, (((void *)0)), 0, 1))
14777 {
14778 FreeType(e->expType);
14779 e->expType = (((void *)0));
14780 FreeType(type);
14781 type = (((void *)0));
14782 break;
14783 }
14784 }
14785 }
14786 }
14787 if(e->expType)
14788 {
14789 FreeType(e->expType);
14790 e->expType = (((void *)0));
14791 }
14792 }
14793 }
14794 if(type)
14795 {
14796 typeStringBuf[0] = '\0';
14797 PrintType(type, typeStringBuf, 0, 1);
14798 typeString = typeStringBuf;
14799 FreeType(type);
14800 }
14801 }
14802 if(typeString)
14803 {
14804 if(inCompiler)
14805 {
14806 struct __ecereNameSpace__ecere__sys__OldList * initializers = MkList();
14807 struct Declarator * decl;
14808 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
14809
14810 if(arrayExp->__anon1.list)
14811 {
14812 struct Expression * e;
14813
14814 builtinCount = (*arrayExp->__anon1.list).count;
14815 type = ProcessTypeString(typeString, 0);
14816 while((e = (*arrayExp->__anon1.list).first))
14817 {
14818 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove((&*arrayExp->__anon1.list), e);
14819 e->destType = type;
14820 type->refCount++;
14821 ProcessExpressionType(e);
14822 if(inCompiler)
14823 ListAdd(initializers, MkInitializerAssignment(e));
14824 }
14825 FreeType(type);
14826 (__ecereNameSpace__ecere__com__eSystem_Delete(arrayExp->__anon1.list), arrayExp->__anon1.list = 0);
14827 }
14828 decl = SpecDeclFromString(typeString, specs, MkDeclaratorIdentifier(id));
14829 stmt->__anon1.compound.declarations = MkListOne(MkDeclaration(CopyList(specs, (void *)(CopySpecifier)), MkListOne(MkInitDeclarator(MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), decl), (((void *)0))))));
14830 ListAdd(stmt->__anon1.compound.declarations, MkDeclaration(specs, MkListOne(MkInitDeclarator(PlugDeclarator(decl, MkDeclaratorArray(MkDeclaratorIdentifier(MkIdentifier("__internalArray")), (((void *)0)))), MkInitializerList(initializers)))));
14831 FreeList(exp, (void *)(FreeExpression));
14832 }
14833 else if(arrayExp->__anon1.list)
14834 {
14835 struct Expression * e;
14836
14837 type = ProcessTypeString(typeString, 0);
14838 for(e = (*arrayExp->__anon1.list).first; e; e = e->next)
14839 {
14840 e->destType = type;
14841 type->refCount++;
14842 ProcessExpressionType(e);
14843 }
14844 FreeType(type);
14845 }
14846 }
14847 else
14848 {
14849 arrayExp->expType = ProcessTypeString("Container", 0);
14850 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Couldn't determine type of array elements\n", (((void *)0))));
14851 }
14852 }
14853 else if(inCompiler && isLinkList && !isList)
14854 {
14855 struct Declarator * decl;
14856 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
14857
14858 decl = SpecDeclFromString(_class->templateArgs[3].__anon1.__anon1.dataTypeString, specs, MkDeclaratorIdentifier(id));
14859 stmt->__anon1.compound.declarations = MkListOne(MkDeclaration(specs, MkListOne(MkInitDeclarator(decl, (((void *)0))))));
14860 ListAdd(stmt->__anon1.compound.declarations, MkDeclaration(MkListOne(MkSpecifierName(source->__anon1._class->__anon1.registered->fullName)), MkListOne(MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier("__internalLinkList")), MkInitializerAssignment(MkExpBrackets(exp))))));
14861 }
14862 else if(inCompiler && _class->templateArgs)
14863 {
14864 if(isMap)
14865 sprintf(iteratorType, "MapIterator<%s, %s >", _class->templateArgs[5].__anon1.__anon1.dataTypeString, _class->templateArgs[6].__anon1.__anon1.dataTypeString);
14866 else
14867 sprintf(iteratorType, "Iterator<%s, %s >", _class->templateArgs[2].__anon1.__anon1.dataTypeString, _class->templateArgs[1].__anon1.__anon1.dataTypeString);
14868 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)))))))));
14869 }
14870 if(inCompiler)
14871 {
14872 symbol = FindSymbol(id->string, curContext, curContext, 0, 0);
14873 if(block)
14874 {
14875 switch(block->type)
14876 {
14877 case 2:
14878 if(block->__anon1.compound.context)
14879 block->__anon1.compound.context->parent = stmt->__anon1.compound.context;
14880 break;
14881 case 4:
14882 if(block->__anon1.ifStmt.stmt && block->__anon1.ifStmt.stmt->type == 2 && block->__anon1.ifStmt.stmt->__anon1.compound.context)
14883 block->__anon1.ifStmt.stmt->__anon1.compound.context->parent = stmt->__anon1.compound.context;
14884 if(block->__anon1.ifStmt.elseStmt && block->__anon1.ifStmt.elseStmt->type == 2 && block->__anon1.ifStmt.elseStmt->__anon1.compound.context)
14885 block->__anon1.ifStmt.elseStmt->__anon1.compound.context->parent = stmt->__anon1.compound.context;
14886 break;
14887 case 5:
14888 if(block->__anon1.switchStmt.stmt && block->__anon1.switchStmt.stmt->type == 2 && block->__anon1.switchStmt.stmt->__anon1.compound.context)
14889 block->__anon1.switchStmt.stmt->__anon1.compound.context->parent = stmt->__anon1.compound.context;
14890 break;
14891 case 6:
14892 if(block->__anon1.whileStmt.stmt && block->__anon1.whileStmt.stmt->type == 2 && block->__anon1.whileStmt.stmt->__anon1.compound.context)
14893 block->__anon1.whileStmt.stmt->__anon1.compound.context->parent = stmt->__anon1.compound.context;
14894 break;
14895 case 7:
14896 if(block->__anon1.doWhile.stmt && block->__anon1.doWhile.stmt->type == 2 && block->__anon1.doWhile.stmt->__anon1.compound.context)
14897 block->__anon1.doWhile.stmt->__anon1.compound.context->parent = stmt->__anon1.compound.context;
14898 break;
14899 case 8:
14900 if(block->__anon1.forStmt.stmt && block->__anon1.forStmt.stmt->type == 2 && block->__anon1.forStmt.stmt->__anon1.compound.context)
14901 block->__anon1.forStmt.stmt->__anon1.compound.context->parent = stmt->__anon1.compound.context;
14902 break;
14903 case 18:
14904 if(block->__anon1.forEachStmt.stmt && block->__anon1.forEachStmt.stmt->type == 2 && block->__anon1.forEachStmt.stmt->__anon1.compound.context)
14905 block->__anon1.forEachStmt.stmt->__anon1.compound.context->parent = stmt->__anon1.compound.context;
14906 break;
14907 }
14908 }
14909 if(filter)
14910 {
14911 block = MkIfStmt(filter, block, (((void *)0)));
14912 }
14913 if(isArray)
14914 {
14915 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));
14916 ProcessStatement(((struct Statement *)(*stmt->__anon1.compound.statements).first)->__anon1.forStmt.init);
14917 ProcessStatement(((struct Statement *)(*stmt->__anon1.compound.statements).first)->__anon1.forStmt.check);
14918 ProcessExpressionType((*((struct Statement *)(*stmt->__anon1.compound.statements).first)->__anon1.forStmt.increment).first);
14919 }
14920 else if(isBuiltin)
14921 {
14922 char count[128];
14923
14924 sprintf(count, "%d", builtinCount);
14925 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));
14926 ProcessStatement(((struct Statement *)(*stmt->__anon1.compound.statements).first)->__anon1.forStmt.init);
14927 ProcessStatement(((struct Statement *)(*stmt->__anon1.compound.statements).first)->__anon1.forStmt.check);
14928 ProcessExpressionType((*((struct Statement *)(*stmt->__anon1.compound.statements).first)->__anon1.forStmt.increment).first);
14929 }
14930 else if(isLinkList && !isList)
14931 {
14932 struct __ecereNameSpace__ecere__com__Class * typeClass = __ecereNameSpace__ecere__com__eSystem_FindClass(_class->module, _class->templateArgs[3].__anon1.__anon1.dataTypeString);
14933 struct __ecereNameSpace__ecere__com__Class * listItemClass = __ecereNameSpace__ecere__com__eSystem_FindClass(_class->module, "ListItem");
14934
14935 if(typeClass && __ecereNameSpace__ecere__com__eClass_IsDerived(typeClass, listItemClass) && _class->templateArgs[5].__anon1.__anon1.dataTypeString && !strcmp(_class->templateArgs[5].__anon1.__anon1.dataTypeString, "LT::link"))
14936 {
14937 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));
14938 }
14939 else
14940 {
14941 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
14942 struct Declarator * decl = SpecDeclFromString(_class->templateArgs[3].__anon1.__anon1.dataTypeString, specs, (((void *)0)));
14943
14944 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));
14945 }
14946 ProcessStatement(((struct Statement *)(*stmt->__anon1.compound.statements).first)->__anon1.forStmt.init);
14947 ProcessStatement(((struct Statement *)(*stmt->__anon1.compound.statements).first)->__anon1.forStmt.check);
14948 ProcessExpressionType((*((struct Statement *)(*stmt->__anon1.compound.statements).first)->__anon1.forStmt.increment).first);
14949 }
14950 else
14951 {
14952 stmt->__anon1.compound.statements = MkListOne(MkWhileStmt(MkListOne(MkExpCall(MkExpMember(expIt = MkExpIdentifier(CopyIdentifier(id)), MkIdentifier("Next")), (((void *)0)))), block));
14953 }
14954 ProcessExpressionType(expIt);
14955 if((*stmt->__anon1.compound.declarations).first)
14956 ProcessDeclaration((*stmt->__anon1.compound.declarations).first);
14957 if(symbol)
14958 symbol->isIterator = isMap ? 2 : ((isArray || isBuiltin) ? 3 : (isLinkList ? (isList ? 5 : 4) : (isCustomAVLTree ? 6 : 1)));
14959 ProcessStatement(stmt);
14960 }
14961 else
14962 ProcessStatement(stmt->__anon1.forEachStmt.stmt);
14963 if(inCompiler)
14964 curContext = stmt->__anon1.compound.context->parent;
14965 break;
14966 }
14967 else
14968 {
14969 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Expression is not a container\n", (((void *)0))));
14970 }
14971 break;
14972 }
14973 case 9:
14974 break;
14975 case 10:
14976 break;
14977 case 11:
14978 break;
14979 case 12:
14980 {
14981 struct Expression * exp;
14982
14983 if(stmt->__anon1.expressions)
14984 {
14985 for(exp = (*stmt->__anon1.expressions).first; exp; exp = exp->next)
14986 {
14987 if(!exp->next)
14988 {
14989 if(curFunction && !curFunction->type)
14990 curFunction->type = ProcessType(curFunction->specifiers, curFunction->declarator);
14991 FreeType(exp->destType);
14992 exp->destType = (curFunction && curFunction->type && curFunction->type->kind == 11) ? curFunction->type->__anon1.__anon2.returnType : (((void *)0));
14993 if(exp->destType)
14994 exp->destType->refCount++;
14995 }
14996 ProcessExpressionType(exp);
14997 }
14998 }
14999 break;
15000 }
15001 case 14:
15002 {
15003 ProcessDeclaration(stmt->__anon1.decl);
15004 break;
15005 }
15006 case 13:
15007 {
15008 struct AsmField * field;
15009
15010 if(stmt->__anon1.asmStmt.inputFields)
15011 {
15012 for(field = (*stmt->__anon1.asmStmt.inputFields).first; field; field = field->next)
15013 if(field->expression)
15014 ProcessExpressionType(field->expression);
15015 }
15016 if(stmt->__anon1.asmStmt.outputFields)
15017 {
15018 for(field = (*stmt->__anon1.asmStmt.outputFields).first; field; field = field->next)
15019 if(field->expression)
15020 ProcessExpressionType(field->expression);
15021 }
15022 if(stmt->__anon1.asmStmt.clobberedFields)
15023 {
15024 for(field = (*stmt->__anon1.asmStmt.clobberedFields).first; field; field = field->next)
15025 {
15026 if(field->expression)
15027 ProcessExpressionType(field->expression);
15028 }
15029 }
15030 break;
15031 }
15032 case 17:
15033 {
15034 struct PropertyWatch * propWatch;
15035 struct __ecereNameSpace__ecere__sys__OldList * watches = stmt->__anon1._watch.watches;
15036 struct Expression * object = stmt->__anon1._watch.object;
15037 struct Expression * watcher = stmt->__anon1._watch.watcher;
15038
15039 if(watcher)
15040 ProcessExpressionType(watcher);
15041 if(object)
15042 ProcessExpressionType(object);
15043 if(inCompiler)
15044 {
15045 if(watcher || thisClass)
15046 {
15047 struct External * external = curExternal;
15048 struct Context * context = curContext;
15049
15050 stmt->type = 3;
15051 stmt->__anon1.expressions = MkList();
15052 for(propWatch = (*watches).first; propWatch; propWatch = propWatch->next)
15053 {
15054 struct ClassFunction * func;
15055 char watcherName[1024];
15056 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;
15057 struct External * createdExternal;
15058
15059 sprintf(watcherName, "__ecerePropertyWatcher_%d", propWatcherID++);
15060 if(propWatch->deleteWatch)
15061 strcat(watcherName, "_delete");
15062 else
15063 {
15064 struct Identifier * propID;
15065
15066 for(propID = (*propWatch->properties).first; propID; propID = propID->next)
15067 {
15068 strcat(watcherName, "_");
15069 strcat(watcherName, propID->string);
15070 }
15071 }
15072 if(object && object->expType && object->expType->kind == 8 && object->expType->__anon1._class && object->expType->__anon1._class->__anon1.registered)
15073 {
15074 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)));
15075 ProcessClassFunctionBody(func, propWatch->compound);
15076 propWatch->compound = (((void *)0));
15077 createdExternal = ProcessClassFunction(watcherClass, func, ast, curExternal, 1);
15078 curExternal = createdExternal;
15079 ProcessFunction(createdExternal->__anon1.function);
15080 if(propWatch->deleteWatch)
15081 {
15082 struct __ecereNameSpace__ecere__sys__OldList * args = MkList();
15083
15084 ListAdd(args, CopyExpression(object));
15085 ListAdd(args, watcher ? CopyExpression(watcher) : MkExpIdentifier(MkIdentifier("this")));
15086 ListAdd(args, MkExpIdentifier(MkIdentifier(watcherName)));
15087 ListAdd(stmt->__anon1.expressions, MkExpCall(MkExpIdentifier(MkIdentifier("ecere::com::eInstance_WatchDestruction")), args));
15088 }
15089 else
15090 {
15091 struct __ecereNameSpace__ecere__com__Class * _class = object->expType->__anon1._class->__anon1.registered;
15092 struct Identifier * propID;
15093
15094 for(propID = (*propWatch->properties).first; propID; propID = propID->next)
15095 {
15096 char propName[1024];
15097 struct __ecereNameSpace__ecere__com__Property * prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, propID->string, privateModule);
15098
15099 if(prop)
15100 {
15101 char getName[1024], setName[1024];
15102 struct __ecereNameSpace__ecere__sys__OldList * args = MkList();
15103
15104 DeclareProperty(createdExternal, prop, setName, getName);
15105 strcpy(propName, "__ecereProp_");
15106 FullClassNameCat(propName, prop->_class->fullName, 0);
15107 strcat(propName, "_");
15108 FullClassNameCat(propName, prop->name, 1);
15109 ListAdd(args, CopyExpression(object));
15110 ListAdd(args, MkExpIdentifier(MkIdentifier(propName)));
15111 ListAdd(args, watcher ? CopyExpression(watcher) : MkExpIdentifier(MkIdentifier("this")));
15112 ListAdd(args, MkExpCast(MkTypeName(MkListOne(MkSpecifier(VOID)), MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), (((void *)0)))), MkExpIdentifier(MkIdentifier(watcherName))));
15113 ListAdd(stmt->__anon1.expressions, MkExpCall(MkExpIdentifier(MkIdentifier("ecere::com::eInstance_Watch")), args));
15114 __ecereMethod_External_CreateUniqueEdge(external, createdExternal, 1);
15115 }
15116 else
15117 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Property %s not found in class %s\n", (((void *)0))), propID->string, _class->fullName);
15118 }
15119 }
15120 }
15121 else
15122 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Invalid watched object\n", (((void *)0))));
15123 }
15124 curExternal = external;
15125 curContext = context;
15126 if(watcher)
15127 FreeExpression(watcher);
15128 if(object)
15129 FreeExpression(object);
15130 FreeList(watches, (void *)(FreePropertyWatch));
15131 }
15132 else
15133 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "No observer specified and not inside a class\n", (((void *)0))));
15134 }
15135 else
15136 {
15137 for(propWatch = (*watches).first; propWatch; propWatch = propWatch->next)
15138 {
15139 ProcessStatement(propWatch->compound);
15140 }
15141 }
15142 break;
15143 }
15144 case 15:
15145 {
15146 struct __ecereNameSpace__ecere__sys__OldList * watches = stmt->__anon1._watch.watches;
15147 struct Expression * object = stmt->__anon1._watch.object;
15148 struct __ecereNameSpace__ecere__com__Class * _class;
15149
15150 if(object)
15151 ProcessExpressionType(object);
15152 if(inCompiler)
15153 {
15154 _class = object ? ((object->expType && object->expType->kind == 8 && object->expType->__anon1._class) ? object->expType->__anon1._class->__anon1.registered : (((void *)0))) : thisClass;
15155 if(_class)
15156 {
15157 struct Identifier * propID;
15158
15159 stmt->type = 3;
15160 stmt->__anon1.expressions = MkList();
15161 if(!watches && curFunction->propSet && (!object || (object->type == 0 && !strcmp(object->__anon1.__anon1.identifier->string, "this"))))
15162 {
15163 watches = MkListOne(MkIdentifier(curFunction->propSet->string));
15164 }
15165 else if(!watches)
15166 {
15167 }
15168 if(watches)
15169 {
15170 for(propID = (*watches).first; propID; propID = propID->next)
15171 {
15172 struct __ecereNameSpace__ecere__com__Property * prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, propID->string, privateModule);
15173
15174 if(prop)
15175 {
15176 CreateFireWatcher(prop, object, stmt);
15177 }
15178 else
15179 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Property %s not found in class %s\n", (((void *)0))), propID->string, _class->fullName);
15180 }
15181 }
15182 else
15183 {
15184 struct __ecereNameSpace__ecere__com__Property * prop;
15185 struct __ecereNameSpace__ecere__com__Class * base;
15186
15187 for(base = _class; base; base = base->base)
15188 {
15189 for(prop = base->membersAndProperties.first; prop; prop = prop->next)
15190 {
15191 if(prop->isProperty && prop->isWatchable)
15192 {
15193 CreateFireWatcher(prop, object, stmt);
15194 }
15195 }
15196 }
15197 }
15198 if(object)
15199 FreeExpression(object);
15200 FreeList(watches, (void *)(FreeIdentifier));
15201 }
15202 else
15203 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Invalid object specified and not inside a class\n", (((void *)0))));
15204 }
15205 break;
15206 }
15207 case 16:
15208 {
15209 struct __ecereNameSpace__ecere__sys__OldList * watches = stmt->__anon1._watch.watches;
15210 struct Expression * object = stmt->__anon1._watch.object;
15211 struct Expression * watcher = stmt->__anon1._watch.watcher;
15212 struct __ecereNameSpace__ecere__com__Class * _class;
15213
15214 if(object)
15215 ProcessExpressionType(object);
15216 if(watcher)
15217 ProcessExpressionType(watcher);
15218 if(inCompiler)
15219 {
15220 _class = (object && object->expType && object->expType->kind == 8 && object->expType->__anon1._class) ? object->expType->__anon1._class->__anon1.registered : (((void *)0));
15221 if(watcher || thisClass)
15222 {
15223 if(_class)
15224 {
15225 struct Identifier * propID;
15226
15227 stmt->type = 3;
15228 stmt->__anon1.expressions = MkList();
15229 if(!watches)
15230 {
15231 struct __ecereNameSpace__ecere__sys__OldList * args;
15232
15233 args = MkList();
15234 ListAdd(args, CopyExpression(object));
15235 ListAdd(args, MkExpConstant("0"));
15236 ListAdd(args, watcher ? CopyExpression(watcher) : MkExpIdentifier(MkIdentifier("this")));
15237 ListAdd(stmt->__anon1.expressions, MkExpCall(MkExpIdentifier(MkIdentifier("ecere::com::eInstance_StopWatching")), args));
15238 }
15239 else
15240 {
15241 for(propID = (*watches).first; propID; propID = propID->next)
15242 {
15243 char propName[1024];
15244 struct __ecereNameSpace__ecere__com__Property * prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, propID->string, privateModule);
15245
15246 if(prop)
15247 {
15248 char getName[1024], setName[1024];
15249 struct __ecereNameSpace__ecere__sys__OldList * args = MkList();
15250
15251 DeclareProperty(curExternal, prop, setName, getName);
15252 strcpy(propName, "__ecereProp_");
15253 FullClassNameCat(propName, prop->_class->fullName, 0);
15254 strcat(propName, "_");
15255 FullClassNameCat(propName, prop->name, 1);
15256 ListAdd(args, CopyExpression(object));
15257 ListAdd(args, MkExpIdentifier(MkIdentifier(propName)));
15258 ListAdd(args, watcher ? CopyExpression(watcher) : MkExpIdentifier(MkIdentifier("this")));
15259 ListAdd(stmt->__anon1.expressions, MkExpCall(MkExpIdentifier(MkIdentifier("ecere::com::eInstance_StopWatching")), args));
15260 }
15261 else
15262 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Property %s not found in class %s\n", (((void *)0))), propID->string, _class->fullName);
15263 }
15264 }
15265 if(object)
15266 FreeExpression(object);
15267 if(watcher)
15268 FreeExpression(watcher);
15269 FreeList(watches, (void *)(FreeIdentifier));
15270 }
15271 else
15272 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Invalid object specified and not inside a class\n", (((void *)0))));
15273 }
15274 else
15275 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "No observer specified and not inside a class\n", (((void *)0))));
15276 }
15277 break;
15278 }
15279 }
15280 }
15281
15282 void ProcessExpressionType(struct Expression * exp)
15283 {
15284 unsigned int unresolved = 0;
15285 struct Location oldyylloc = yylloc;
15286 unsigned int notByReference = 0;
15287
15288 if(!exp || exp->expType)
15289 return ;
15290 yylloc = exp->loc;
15291 switch(exp->type)
15292 {
15293 case 0:
15294 {
15295 struct Identifier * id = exp->__anon1.__anon1.identifier;
15296
15297 if(!id || !topContext)
15298 return ;
15299 if(id->_class && id->_class->__anon1.__anon1.name)
15300 {
15301 id->classSym = id->_class->__anon1.__anon1.symbol;
15302 }
15303 if(!strcmp(id->string, "__runtimePlatform"))
15304 {
15305 exp->expType = ProcessTypeString("ecere::com::Platform", 1);
15306 break;
15307 }
15308 else if(strstr(id->string, "__ecereClass") == id->string)
15309 {
15310 exp->expType = ProcessTypeString("ecere::com::Class", 1);
15311 break;
15312 }
15313 else if(id->_class && (id->classSym || (id->_class->__anon1.__anon1.name && !strcmp(id->_class->__anon1.__anon1.name, "property"))))
15314 {
15315 ReplaceClassMembers(exp, thisClass);
15316 if(exp->type != 0)
15317 {
15318 ProcessExpressionType(exp);
15319 break;
15320 }
15321 if(id->classSym && ResolveIdWithClass(exp, id->classSym->__anon1.registered, 0))
15322 break;
15323 }
15324 else
15325 {
15326 struct Symbol * symbol = FindSymbol(id->string, curContext, topContext, 0, id->_class && id->_class->__anon1.__anon1.name == (((void *)0)));
15327
15328 if(!symbol)
15329 {
15330 if(exp->destType && CheckExpressionType(exp, exp->destType, 0, 0))
15331 break;
15332 else
15333 {
15334 if(thisClass)
15335 {
15336 ReplaceClassMembers(exp, thisClass ? thisClass : currentClass);
15337 if(exp->type != 0)
15338 {
15339 ProcessExpressionType(exp);
15340 break;
15341 }
15342 }
15343 else if(currentClass && !id->_class)
15344 {
15345 if(ResolveIdWithClass(exp, currentClass, 1))
15346 break;
15347 }
15348 symbol = FindSymbol(id->string, topContext->parent, globalContext, 0, id->_class && id->_class->__anon1.__anon1.name == (((void *)0)));
15349 }
15350 }
15351 if(symbol)
15352 {
15353 struct Type * type = symbol->type;
15354 struct __ecereNameSpace__ecere__com__Class * _class = (type && type->kind == 8 && type->__anon1._class) ? type->__anon1._class->__anon1.registered : (((void *)0));
15355
15356 if(_class && !strcmp(id->string, "this") && !type->classObjectType)
15357 {
15358 struct Context * context = SetupTemplatesContext(_class);
15359
15360 type = ReplaceThisClassType(_class);
15361 FinishTemplatesContext(context);
15362 if(type)
15363 type->refCount = 0;
15364 }
15365 FreeSpecifier(id->_class);
15366 id->_class = (((void *)0));
15367 (__ecereNameSpace__ecere__com__eSystem_Delete(id->string), id->string = 0);
15368 id->string = __ecereNameSpace__ecere__sys__CopyString(symbol->string);
15369 id->classSym = (((void *)0));
15370 exp->expType = type;
15371 if(type)
15372 type->refCount++;
15373 if(type && (type->kind == 15))
15374 exp->isConstant = 1;
15375 if(symbol->isParam || !strcmp(id->string, "this"))
15376 {
15377 if(_class && _class->type == 1 && !type->declaredWithStruct)
15378 exp->byReference = 1;
15379 }
15380 if(symbol->isIterator)
15381 {
15382 if(symbol->isIterator == 3)
15383 {
15384 exp->type = 5;
15385 exp->__anon1.list = MkListOne(MkExpOp((((void *)0)), '*', MkExpIdentifier(exp->__anon1.__anon1.identifier)));
15386 ((struct Expression *)(*exp->__anon1.list).first)->__anon1.op.exp2->expType = exp->expType;
15387 exp->expType = (((void *)0));
15388 ProcessExpressionType(exp);
15389 }
15390 else if(symbol->isIterator != 4)
15391 {
15392 exp->type = 8;
15393 exp->__anon1.member.exp = MkExpIdentifier(exp->__anon1.__anon1.identifier);
15394 exp->__anon1.member.exp->expType = exp->expType;
15395 exp->__anon1.member.member = MkIdentifier("data");
15396 exp->expType = (((void *)0));
15397 ProcessExpressionType(exp);
15398 }
15399 }
15400 break;
15401 }
15402 else
15403 {
15404 struct __ecereNameSpace__ecere__com__DefinedExpression * definedExp = (((void *)0));
15405
15406 if(thisNameSpace && !(id->_class && !id->_class->__anon1.__anon1.name))
15407 {
15408 char name[1024];
15409
15410 strcpy(name, thisNameSpace);
15411 strcat(name, "::");
15412 strcat(name, id->string);
15413 definedExp = __ecereNameSpace__ecere__com__eSystem_FindDefine(privateModule, name);
15414 }
15415 if(!definedExp)
15416 definedExp = __ecereNameSpace__ecere__com__eSystem_FindDefine(privateModule, id->string);
15417 if(definedExp)
15418 {
15419 int c;
15420
15421 for(c = 0; c < definedExpStackPos; c++)
15422 if(definedExpStack[c] == definedExp)
15423 break;
15424 if(c == definedExpStackPos && c < sizeof (definedExpStack) / sizeof(void *))
15425 {
15426 struct Location backupYylloc = yylloc;
15427 struct __ecereNameSpace__ecere__com__Instance * backInput = fileInput;
15428
15429 definedExpStack[definedExpStackPos++] = definedExp;
15430 fileInput = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass___ecereNameSpace__ecere__sys__TempFile);
15431 ((int (*)(struct __ecereNameSpace__ecere__com__Instance *, const void *  buffer, unsigned int size, unsigned int count))__extension__ ({
15432 struct __ecereNameSpace__ecere__com__Instance * __internal_ClassInst = fileInput;
15433
15434 __internal_ClassInst ? __internal_ClassInst->_vTbl : __ecereClass___ecereNameSpace__ecere__sys__File->_vTbl;
15435 })[__ecereVMethodID___ecereNameSpace__ecere__sys__File_Write])(fileInput, definedExp->value, 1, strlen(definedExp->value));
15436 ((unsigned int (*)(struct __ecereNameSpace__ecere__com__Instance *, int pos, int mode))__extension__ ({
15437 struct __ecereNameSpace__ecere__com__Instance * __internal_ClassInst = fileInput;
15438
15439 __internal_ClassInst ? __internal_ClassInst->_vTbl : __ecereClass___ecereNameSpace__ecere__sys__File->_vTbl;
15440 })[__ecereVMethodID___ecereNameSpace__ecere__sys__File_Seek])(fileInput, 0, 0);
15441 echoOn = 0;
15442 parsedExpression = (((void *)0));
15443 resetScanner();
15444 expression_yyparse();
15445 (__ecereNameSpace__ecere__com__eInstance_DecRef(fileInput), fileInput = 0);
15446 if(backInput)
15447 fileInput = backInput;
15448 yylloc = backupYylloc;
15449 if(parsedExpression)
15450 {
15451 FreeIdentifier(id);
15452 exp->type = 5;
15453 exp->__anon1.list = MkListOne(parsedExpression);
15454 ApplyLocation(parsedExpression, &yylloc);
15455 ProcessExpressionType(exp);
15456 definedExpStackPos--;
15457 return ;
15458 }
15459 definedExpStackPos--;
15460 }
15461 else
15462 {
15463 if(inCompiler)
15464 {
15465 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Recursion in defined expression %s\n", (((void *)0))), id->string);
15466 }
15467 }
15468 }
15469 else
15470 {
15471 struct GlobalData * data = (((void *)0));
15472
15473 if(thisNameSpace && !(id->_class && !id->_class->__anon1.__anon1.name))
15474 {
15475 char name[1024];
15476
15477 strcpy(name, thisNameSpace);
15478 strcat(name, "::");
15479 strcat(name, id->string);
15480 data = FindGlobalData(name);
15481 }
15482 if(!data)
15483 data = FindGlobalData(id->string);
15484 if(data)
15485 {
15486 DeclareGlobalData(curExternal, data);
15487 exp->expType = data->dataType;
15488 if(data->dataType)
15489 data->dataType->refCount++;
15490 (__ecereNameSpace__ecere__com__eSystem_Delete(id->string), id->string = 0);
15491 id->string = __ecereNameSpace__ecere__sys__CopyString(data->fullName);
15492 FreeSpecifier(id->_class);
15493 id->_class = (((void *)0));
15494 break;
15495 }
15496 else
15497 {
15498 struct __ecereNameSpace__ecere__com__GlobalFunction * function = (((void *)0));
15499
15500 if(thisNameSpace && !(id->_class && !id->_class->__anon1.__anon1.name))
15501 {
15502 char name[1024];
15503
15504 strcpy(name, thisNameSpace);
15505 strcat(name, "::");
15506 strcat(name, id->string);
15507 function = __ecereNameSpace__ecere__com__eSystem_FindFunction(privateModule, name);
15508 }
15509 if(!function)
15510 function = __ecereNameSpace__ecere__com__eSystem_FindFunction(privateModule, id->string);
15511 if(function)
15512 {
15513 char name[1024];
15514
15515 (__ecereNameSpace__ecere__com__eSystem_Delete(id->string), id->string = 0);
15516 id->string = __ecereNameSpace__ecere__sys__CopyString(function->name);
15517 name[0] = (char)0;
15518 if(((struct __ecereNameSpace__ecere__com__Module *)(((char *)function->module + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->importType != 1 && (!function->dataType || !function->dataType->dllExport))
15519 strcpy(name, "__ecereFunction_");
15520 FullClassNameCat(name, id->string, 0);
15521 if(DeclareFunction(curExternal, function, name))
15522 {
15523 (__ecereNameSpace__ecere__com__eSystem_Delete(id->string), id->string = 0);
15524 id->string = __ecereNameSpace__ecere__sys__CopyString(name);
15525 }
15526 exp->expType = function->dataType;
15527 if(function->dataType)
15528 function->dataType->refCount++;
15529 FreeSpecifier(id->_class);
15530 id->_class = (((void *)0));
15531 break;
15532 }
15533 }
15534 }
15535 }
15536 }
15537 unresolved = 1;
15538 break;
15539 }
15540 case 1:
15541 {
15542 if(!exp->__anon1.instance->_class)
15543 {
15544 if(exp->destType && exp->destType->kind == 8 && exp->destType->__anon1._class)
15545 {
15546 exp->__anon1.instance->_class = MkSpecifierName(exp->destType->__anon1._class->string);
15547 }
15548 }
15549 ProcessInstantiationType(exp->__anon1.instance);
15550 exp->isConstant = exp->__anon1.instance->isConstant;
15551 if(exp->__anon1.instance->_class)
15552 {
15553 exp->expType = MkClassType(exp->__anon1.instance->_class->__anon1.__anon1.name);
15554 }
15555 break;
15556 }
15557 case 2:
15558 {
15559 if(!exp->expType)
15560 {
15561 char * constant = exp->__anon1.__anon1.constant;
15562 struct Type * type = (type = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type), type->refCount = 1, type->constant = 1, type);
15563
15564 exp->expType = type;
15565 if(constant[0] == '\'')
15566 {
15567 if((int)((unsigned char *)constant)[1] > 127)
15568 {
15569 int nb;
15570 unsigned int ch = __ecereNameSpace__ecere__sys__UTF8GetChar(constant + 1, &nb);
15571
15572 if(nb < 2)
15573 ch = constant[1];
15574 (__ecereNameSpace__ecere__com__eSystem_Delete(constant), constant = 0);
15575 exp->__anon1.__anon1.constant = PrintUInt(ch);
15576 type->kind = 8;
15577 type->__anon1._class = FindClass("unichar");
15578 type->isSigned = 0;
15579 }
15580 else
15581 {
15582 type->kind = 1;
15583 type->isSigned = 1;
15584 }
15585 }
15586 else
15587 {
15588 char * dot = strchr(constant, '.');
15589 unsigned int isHex = (constant[0] == '0' && (constant[1] == 'x' || constant[1] == 'X'));
15590 char * exponent;
15591
15592 if(isHex)
15593 {
15594 exponent = strchr(constant, 'p');
15595 if(!exponent)
15596 exponent = strchr(constant, 'P');
15597 }
15598 else
15599 {
15600 exponent = strchr(constant, 'e');
15601 if(!exponent)
15602 exponent = strchr(constant, 'E');
15603 }
15604 if(dot || exponent)
15605 {
15606 if(strchr(constant, 'f') || strchr(constant, 'F'))
15607 type->kind = 6;
15608 else
15609 type->kind = 7;
15610 type->isSigned = 1;
15611 }
15612 else
15613 {
15614 unsigned int isSigned = constant[0] == '-';
15615 char * endP = (((void *)0));
15616 long long i64 = strtoll(constant, &endP, 0);
15617 uint64 ui64 = strtoull(constant, &endP, 0);
15618 unsigned int is64Bit = endP && (!strcmp(endP, "LL") || !strcmp(endP, "ll"));
15619
15620 if(isSigned)
15621 {
15622 if(i64 < (((int)0x80000000)))
15623 is64Bit = 1;
15624 }
15625 else
15626 {
15627 if(ui64 > (((int)0x7fffffff)))
15628 {
15629 if(ui64 > (0xffffffff))
15630 {
15631 is64Bit = 1;
15632 if(ui64 <= (((long long)0x7fffffffffffffffLL)) && (constant[0] != '0' || !constant[1]))
15633 isSigned = 1;
15634 }
15635 }
15636 else if(constant[0] != '0' || !constant[1])
15637 isSigned = 1;
15638 }
15639 type->kind = is64Bit ? 4 : 3;
15640 type->isSigned = isSigned;
15641 }
15642 }
15643 exp->isConstant = 1;
15644 if(exp->destType && exp->destType->kind == 7)
15645 type->kind = 7;
15646 else if(exp->destType && exp->destType->kind == 6)
15647 type->kind = 6;
15648 else if(exp->destType && exp->destType->kind == 4)
15649 type->kind = 4;
15650 }
15651 break;
15652 }
15653 case 3:
15654 {
15655 exp->isConstant = 1;
15656 exp->expType = __extension__ ({
15657 struct Type * __ecereInstance2 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
15658
15659 __ecereInstance2->refCount = 1, __ecereInstance2->kind = 13, __ecereInstance2->__anon1.type = __extension__ ({
15660 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
15661
15662 __ecereInstance1->refCount = 1, __ecereInstance1->kind = exp->__anon1.__anon2.wideString ? 2 : 1, __ecereInstance1->constant = 1, __ecereInstance1->isSigned = exp->__anon1.__anon2.wideString ? 0 : 1, __ecereInstance1;
15663 }), __ecereInstance2;
15664 });
15665 break;
15666 }
15667 case 13:
15668 case 26:
15669 ProcessExpressionType(exp->__anon1._new.size);
15670 exp->expType = __extension__ ({
15671 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
15672
15673 __ecereInstance1->refCount = 1, __ecereInstance1->kind = 13, __ecereInstance1->__anon1.type = ProcessType(exp->__anon1._new.typeName->qualifiers, exp->__anon1._new.typeName->declarator), __ecereInstance1;
15674 });
15675 DeclareType(curExternal, exp->expType->__anon1.type, 1, 0);
15676 break;
15677 case 14:
15678 case 27:
15679 ProcessExpressionType(exp->__anon1._renew.size);
15680 ProcessExpressionType(exp->__anon1._renew.exp);
15681 exp->expType = __extension__ ({
15682 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
15683
15684 __ecereInstance1->refCount = 1, __ecereInstance1->kind = 13, __ecereInstance1->__anon1.type = ProcessType(exp->__anon1._renew.typeName->qualifiers, exp->__anon1._renew.typeName->declarator), __ecereInstance1;
15685 });
15686 DeclareType(curExternal, exp->expType->__anon1.type, 1, 0);
15687 break;
15688 case 4:
15689 {
15690 unsigned int assign = 0, boolResult = 0, boolOps = 0;
15691 struct Type * type1 = (((void *)0)), * type2 = (((void *)0));
15692 unsigned int useDestType = 0, useSideType = 0;
15693 struct Location oldyylloc = yylloc;
15694 unsigned int useSideUnit = 0;
15695 struct __ecereNameSpace__ecere__com__Class * destClass = (exp->destType && exp->destType->kind == 8 && exp->destType->__anon1._class) ? exp->destType->__anon1._class->__anon1.registered : (((void *)0));
15696 struct Type * dummy = (dummy = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type), dummy->count = 1, dummy->refCount = 1, dummy);
15697
15698 switch(exp->__anon1.op.op)
15699 {
15700 case '=':
15701 case MUL_ASSIGN:
15702 case DIV_ASSIGN:
15703 case MOD_ASSIGN:
15704 case ADD_ASSIGN:
15705 case SUB_ASSIGN:
15706 case LEFT_ASSIGN:
15707 case RIGHT_ASSIGN:
15708 case AND_ASSIGN:
15709 case XOR_ASSIGN:
15710 case OR_ASSIGN:
15711 assign = 1;
15712 break;
15713 case '!':
15714 break;
15715 case AND_OP:
15716 case OR_OP:
15717 boolOps = 1;
15718 boolResult = 1;
15719 break;
15720 case EQ_OP:
15721 case '<':
15722 case '>':
15723 case LE_OP:
15724 case GE_OP:
15725 case NE_OP:
15726 boolResult = 1;
15727 useSideType = 1;
15728 break;
15729 case '+':
15730 case '-':
15731 useSideUnit = 1;
15732 useSideType = 1;
15733 useDestType = 1;
15734 break;
15735 case LEFT_OP:
15736 case RIGHT_OP:
15737 useSideType = 1;
15738 useDestType = 1;
15739 break;
15740 case '|':
15741 case '^':
15742 useSideType = 1;
15743 useDestType = 1;
15744 break;
15745 case '/':
15746 case '%':
15747 useSideType = 1;
15748 useDestType = 1;
15749 break;
15750 case '&':
15751 case '*':
15752 if(exp->__anon1.op.exp1)
15753 {
15754 useSideType = 1;
15755 useDestType = 1;
15756 }
15757 break;
15758 }
15759 if(exp->__anon1.op.op == '&')
15760 {
15761 if(!exp->__anon1.op.exp1 && exp->__anon1.op.exp2 && exp->__anon1.op.exp2->type == 0 && exp->__anon1.op.exp2->__anon1.__anon1.identifier)
15762 {
15763 struct Identifier * id = exp->__anon1.op.exp2->__anon1.__anon1.identifier;
15764 struct Symbol * symbol = FindSymbol(id->string, curContext, topContext, 0, id->_class && id->_class->__anon1.__anon1.name == (((void *)0)));
15765
15766 if(symbol && symbol->isIterator == 2)
15767 {
15768 exp->type = 8;
15769 exp->__anon1.member.exp = exp->__anon1.op.exp2;
15770 exp->__anon1.member.member = MkIdentifier("key");
15771 exp->expType = (((void *)0));
15772 exp->__anon1.op.exp2->expType = symbol->type;
15773 symbol->type->refCount++;
15774 ProcessExpressionType(exp);
15775 FreeType(dummy);
15776 break;
15777 }
15778 }
15779 }
15780 if(exp->__anon1.op.exp1)
15781 {
15782 if(exp->__anon1.op.exp2 && useSideUnit && useDestType && destClass && destClass->type == 3 && destClass->base->type != 3)
15783 useDestType = 0;
15784 if(destClass && useDestType && ((destClass->type == 3 && useSideUnit) || destClass->type == 4 || destClass->type == 2))
15785 {
15786 if(exp->__anon1.op.exp1->destType)
15787 FreeType(exp->__anon1.op.exp1->destType);
15788 exp->__anon1.op.exp1->destType = exp->destType;
15789 exp->__anon1.op.exp1->opDestType = 1;
15790 if(exp->destType)
15791 exp->destType->refCount++;
15792 }
15793 else if(!assign)
15794 {
15795 if(exp->__anon1.op.exp1->destType)
15796 FreeType(exp->__anon1.op.exp1->destType);
15797 exp->__anon1.op.exp1->destType = dummy;
15798 dummy->refCount++;
15799 }
15800 if(exp->__anon1.op.exp1->destType && exp->__anon1.op.op != '=')
15801 exp->__anon1.op.exp1->destType->count++;
15802 ProcessExpressionType(exp->__anon1.op.exp1);
15803 if(exp->__anon1.op.exp1->destType && exp->__anon1.op.op != '=')
15804 exp->__anon1.op.exp1->destType->count--;
15805 exp->__anon1.op.exp1->opDestType = 0;
15806 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)
15807 {
15808 exp->__anon1.op.exp2 = MkExpConstant("1");
15809 exp->__anon1.op.op = exp->__anon1.op.op == INC_OP ? ADD_ASSIGN : SUB_ASSIGN;
15810 assign = 1;
15811 }
15812 if(exp->__anon1.op.exp1->destType == dummy)
15813 {
15814 FreeType(dummy);
15815 exp->__anon1.op.exp1->destType = (((void *)0));
15816 }
15817 type1 = exp->__anon1.op.exp1->expType;
15818 }
15819 if(exp->__anon1.op.exp2)
15820 {
15821 char expString[10240];
15822
15823 expString[0] = '\0';
15824 if(exp->__anon1.op.exp2->type == 1 && !exp->__anon1.op.exp2->__anon1.instance->_class)
15825 {
15826 if(exp->__anon1.op.exp1)
15827 {
15828 exp->__anon1.op.exp2->destType = exp->__anon1.op.exp1->expType;
15829 if(exp->__anon1.op.exp1->expType)
15830 exp->__anon1.op.exp1->expType->refCount++;
15831 }
15832 else
15833 {
15834 exp->__anon1.op.exp2->destType = exp->destType;
15835 if(!exp->__anon1.op.exp1 || (exp->__anon1.op.op != '&' && exp->__anon1.op.op != '^'))
15836 exp->__anon1.op.exp2->opDestType = 1;
15837 if(exp->destType)
15838 exp->destType->refCount++;
15839 }
15840 if(type1)
15841 type1->refCount++;
15842 exp->expType = type1;
15843 }
15844 else if(assign)
15845 {
15846 if(inCompiler)
15847 PrintExpression(exp->__anon1.op.exp2, expString);
15848 if(type1 && type1->kind == 13)
15849 {
15850 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)
15851 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "operator %s illegal on pointer\n", (((void *)0))), exp->__anon1.op.op);
15852 else if(exp->__anon1.op.op == '=')
15853 {
15854 if(exp->__anon1.op.exp2->destType)
15855 FreeType(exp->__anon1.op.exp2->destType);
15856 exp->__anon1.op.exp2->destType = type1;
15857 if(type1)
15858 type1->refCount++;
15859 }
15860 }
15861 else
15862 {
15863 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)
15864 ;
15865 else
15866 {
15867 if(exp->__anon1.op.exp2->destType)
15868 FreeType(exp->__anon1.op.exp2->destType);
15869 exp->__anon1.op.exp2->destType = type1;
15870 if(type1)
15871 type1->refCount++;
15872 }
15873 }
15874 if(type1)
15875 type1->refCount++;
15876 exp->expType = type1;
15877 }
15878 else if(destClass && ((destClass->type == 3 && useDestType && useSideUnit) || (destClass->type == 4 && useDestType)))
15879 {
15880 if(exp->__anon1.op.exp2->destType)
15881 FreeType(exp->__anon1.op.exp2->destType);
15882 exp->__anon1.op.exp2->destType = exp->destType;
15883 if(exp->__anon1.op.op != '&' && exp->__anon1.op.op != '^')
15884 exp->__anon1.op.exp2->opDestType = 1;
15885 if(exp->destType)
15886 exp->destType->refCount++;
15887 }
15888 else
15889 {
15890 if(exp->__anon1.op.exp2->destType)
15891 FreeType(exp->__anon1.op.exp2->destType);
15892 exp->__anon1.op.exp2->destType = dummy;
15893 dummy->refCount++;
15894 }
15895 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))
15896 {
15897 FreeType(exp->__anon1.op.exp2->destType);
15898 exp->__anon1.op.exp2->destType = type1;
15899 type1->refCount++;
15900 }
15901 if(exp->__anon1.op.exp2->destType && exp->__anon1.op.op != '=')
15902 exp->__anon1.op.exp2->destType->count++;
15903 if(exp->__anon1.op.op == SIZEOF)
15904 {
15905 struct Expression * e = exp->__anon1.op.exp2;
15906
15907 while((e->type == 5 || e->type == 32 || e->type == 23) && e->__anon1.list)
15908 {
15909 if(e->type == 5 || e->type == 32 || e->type == 23)
15910 {
15911 if(e->type == 23)
15912 e = (*((struct Statement *)(*e->__anon1.compound->__anon1.compound.statements).last)->__anon1.expressions).last;
15913 else
15914 e = (*e->__anon1.list).last;
15915 }
15916 }
15917 if(e->type == 11 && e->__anon1.cast.exp)
15918 e->__anon1.cast.exp->needCast = 1;
15919 }
15920 ProcessExpressionType(exp->__anon1.op.exp2);
15921 exp->__anon1.op.exp2->opDestType = 0;
15922 if(exp->__anon1.op.exp2->destType && exp->__anon1.op.op != '=')
15923 exp->__anon1.op.exp2->destType->count--;
15924 if(assign && type1 && type1->kind == 13 && exp->__anon1.op.exp2->expType)
15925 {
15926 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)
15927 {
15928 if(exp->__anon1.op.op != '=' && type1->__anon1.type->kind == 0)
15929 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "void *: unknown size\n", (((void *)0))));
15930 }
15931 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)))
15932 {
15933 if(exp->__anon1.op.op == ADD_ASSIGN)
15934 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "cannot add two pointers\n", (((void *)0))));
15935 }
15936 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))
15937 {
15938 if(exp->__anon1.op.op == ADD_ASSIGN)
15939 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "cannot add two pointers\n", (((void *)0))));
15940 }
15941 else if(inCompiler)
15942 {
15943 char type1String[1024];
15944 char type2String[1024];
15945
15946 type1String[0] = '\0';
15947 type2String[0] = '\0';
15948 PrintType(exp->__anon1.op.exp2->expType, type1String, 0, 1);
15949 PrintType(type1, type2String, 0, 1);
15950 __ecereNameSpace__ecere__sys__ChangeCh(expString, '\n', ' ');
15951 Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "incompatible expression %s (%s); expected %s\n", (((void *)0))), expString, type1String, type2String);
15952 }
15953 }
15954 if(exp->__anon1.op.exp2->destType == dummy)
15955 {
15956 FreeType(dummy);
15957 exp->__anon1.op.exp2->destType = (((void *)0));
15958 }
15959 if(exp->__anon1.op.op == '-' && !exp->__anon1.op.exp1 && exp->__anon1.op.exp2->expType && !exp->__anon1.op.exp2->expType->isSigned)
15960 {
15961 type2 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
15962 type2->refCount = 1;
15963 CopyTypeInto(type2, exp->__anon1.op.exp2->expType);
15964 type2->isSigned = 1;
15965 }
15966 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))
15967 {
15968 type2 = __extension__ ({
15969 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
15970
15971 __ecereInstance1->kind = 3, __ecereInstance1;
15972 });
15973 type2->refCount = 1;
15974 type2->isSigned = 1;
15975 }
15976 else
15977 {
15978 type2 = exp->__anon1.op.exp2->expType;
15979 if(type2)
15980 type2->refCount++;
15981 }
15982 }
15983 dummy->kind = 0;
15984 if(exp->__anon1.op.op == SIZEOF)
15985 {
15986 exp->expType = __extension__ ({
15987 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
15988
15989 __ecereInstance1->refCount = 1, __ecereInstance1->kind = 23, __ecereInstance1;
15990 });
15991 exp->isConstant = 1;
15992 }
15993 else if(exp->__anon1.op.op == '*' && !exp->__anon1.op.exp1)
15994 {
15995 exp->expType = Dereference(type2);
15996 if(type2 && type2->kind == 8)
15997 notByReference = 1;
15998 }
15999 else if(exp->__anon1.op.op == '&' && !exp->__anon1.op.exp1)
16000 exp->expType = Reference(type2);
16001 else if(!assign)
16002 {
16003 if(boolOps)
16004 {
16005 if(exp->__anon1.op.exp1)
16006 {
16007 if(exp->__anon1.op.exp1->destType)
16008 FreeType(exp->__anon1.op.exp1->destType);
16009 exp->__anon1.op.exp1->destType = MkClassType("bool");
16010 exp->__anon1.op.exp1->destType->truth = 1;
16011 if(!exp->__anon1.op.exp1->expType)
16012 ProcessExpressionType(exp->__anon1.op.exp1);
16013 else
16014 CheckExpressionType(exp->__anon1.op.exp1, exp->__anon1.op.exp1->destType, 0, 0);
16015 FreeType(exp->__anon1.op.exp1->expType);
16016 exp->__anon1.op.exp1->expType = MkClassType("bool");
16017 exp->__anon1.op.exp1->expType->truth = 1;
16018 }
16019 if(exp->__anon1.op.exp2)
16020 {
16021 if(exp->__anon1.op.exp2->destType)
16022 FreeType(exp->__anon1.op.exp2->destType);
16023 exp->__anon1.op.exp2->destType = MkClassType("bool");
16024 exp->__anon1.op.exp2->destType->truth = 1;
16025 if(!exp->__anon1.op.exp2->expType)
16026 ProcessExpressionType(exp->__anon1.op.exp2);
16027 else
16028 CheckExpressionType(exp->__anon1.op.exp2, exp->__anon1.op.exp2->destType, 0, 0);
16029 FreeType(exp->__anon1.op.exp2->expType);
16030 exp->__anon1.op.exp2->expType = MkClassType("bool");
16031 exp->__anon1.op.exp2->expType->truth = 1;
16032 }
16033 }
16034 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")))))
16035 {
16036 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"))))
16037 {
16038 if(exp->__anon1.op.op == '-' && ((type1->kind == 8 && type1->__anon1._class->__anon1.registered && type1->__anon1._class->__anon1.registered->type == 4) || (type2->kind == 8 && type2->__anon1._class->__anon1.registered && type2->__anon1._class->__anon1.registered->type == 4)))
16039 {
16040 struct Type * intType;
16041
16042 if(!type1->__anon1._class->__anon1.registered->dataType)
16043 type1->__anon1._class->__anon1.registered->dataType = ProcessTypeString(type1->__anon1._class->__anon1.registered->dataTypeString, 0);
16044 if(!type2->__anon1._class->__anon1.registered->dataType)
16045 type2->__anon1._class->__anon1.registered->dataType = ProcessTypeString(type2->__anon1._class->__anon1.registered->dataTypeString, 0);
16046 intType = ProcessTypeString((type1->__anon1._class->__anon1.registered->dataType->kind == 4 || type2->__anon1._class->__anon1.registered->dataType->kind == 4) ? "int64" : "int", 0);
16047 if(exp->__anon1.op.exp1->destType)
16048 FreeType(exp->__anon1.op.exp1->destType);
16049 if(exp->__anon1.op.exp2->destType)
16050 FreeType(exp->__anon1.op.exp2->destType);
16051 exp->__anon1.op.exp1->destType = intType;
16052 exp->__anon1.op.exp2->destType = intType;
16053 intType->refCount++;
16054 }
16055 else
16056 {
16057 if(exp->__anon1.op.exp2->destType)
16058 FreeType(exp->__anon1.op.exp2->destType);
16059 exp->__anon1.op.exp2->destType = type1;
16060 type1->refCount++;
16061 if(exp->__anon1.op.exp1->destType)
16062 FreeType(exp->__anon1.op.exp1->destType);
16063 exp->__anon1.op.exp1->destType = type2;
16064 type2->refCount++;
16065 }
16066 if(!boolResult && type1->kind == 8 && (!exp->destType || exp->destType->kind != 8) && type1->__anon1._class->__anon1.registered && type1->__anon1._class->__anon1.registered->type == 3 && type2->__anon1._class->__anon1.registered && type2->__anon1._class->__anon1.registered->type == 3 && type1->__anon1._class->__anon1.registered != type2->__anon1._class->__anon1.registered)
16067 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);
16068 if(type1->kind == 13 && type1->__anon1.type->kind == 20 && type2->kind != 13)
16069 {
16070 struct Expression * argExp = GetTemplateArgExp(type1->__anon1.type->__anon1.templateParameter, thisClass, 1);
16071
16072 if(argExp)
16073 {
16074 struct Expression * classExp = MkExpMember(argExp, MkIdentifier("dataTypeClass"));
16075
16076 exp->__anon1.op.exp1 = MkExpBrackets(MkListOne(MkExpCast(MkTypeName(MkListOne(MkSpecifierName("byte")), MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), (((void *)0)))), exp->__anon1.op.exp1)));
16077 ProcessExpressionType(exp->__anon1.op.exp1);
16078 if(type2->kind != 13)
16079 {
16080 ProcessExpressionType(classExp);
16081 exp->__anon1.op.exp2 = MkExpBrackets(MkListOne(MkExpOp(exp->__anon1.op.exp2, '*', MkExpMember(classExp, MkIdentifier("typeSize")))));
16082 if(!exp->__anon1.op.exp2->expType)
16083 {
16084 if(type2)
16085 FreeType(type2);
16086 type2 = exp->__anon1.op.exp2->expType = ProcessTypeString("int", 0);
16087 type2->refCount++;
16088 }
16089 ProcessExpressionType(exp->__anon1.op.exp2);
16090 }
16091 }
16092 }
16093 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)))
16094 {
16095 if(type1->kind != 8 && type1->__anon1.type->kind == 0)
16096 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "void *: unknown size\n", (((void *)0))));
16097 exp->expType = type1;
16098 if(type1)
16099 type1->refCount++;
16100 }
16101 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)))
16102 {
16103 if(type2->kind != 8 && type2->__anon1.type->kind == 0)
16104 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "void *: unknown size\n", (((void *)0))));
16105 exp->expType = type2;
16106 if(type2)
16107 type2->refCount++;
16108 }
16109 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))
16110 {
16111 Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "different levels of indirection\n", (((void *)0))));
16112 }
16113 else
16114 {
16115 unsigned int success = 0;
16116
16117 if(type1->kind == 13 && type2->kind == 13)
16118 {
16119 if(exp->__anon1.op.op == '+')
16120 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "cannot add two pointers\n", (((void *)0))));
16121 else if(exp->__anon1.op.op == '-')
16122 {
16123 if(MatchTypes(type1->__anon1.type, type2->__anon1.type, (((void *)0)), (((void *)0)), (((void *)0)), 0, 0, 0, 0, 0))
16124 {
16125 exp->expType = __extension__ ({
16126 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
16127
16128 __ecereInstance1->kind = 3, __ecereInstance1->refCount = 1, __ecereInstance1;
16129 });
16130 success = 1;
16131 if(type1->__anon1.type->kind == 20)
16132 {
16133 struct Expression * argExp = GetTemplateArgExp(type1->__anon1.type->__anon1.templateParameter, thisClass, 1);
16134
16135 if(argExp)
16136 {
16137 struct Expression * classExp = MkExpMember(argExp, MkIdentifier("dataTypeClass"));
16138
16139 ProcessExpressionType(classExp);
16140 exp->type = 5;
16141 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"))));
16142 ProcessExpressionType(((struct Expression *)(*exp->__anon1.list).first)->__anon1.op.exp2);
16143 FreeType(dummy);
16144 return ;
16145 }
16146 }
16147 }
16148 }
16149 }
16150 if(!success && exp->__anon1.op.exp1->type == 2)
16151 {
16152 if(CheckExpressionType(exp->__anon1.op.exp1, exp->__anon1.op.exp1->destType, 0, 0))
16153 {
16154 if(exp->expType)
16155 FreeType(exp->expType);
16156 exp->expType = exp->__anon1.op.exp1->destType;
16157 if(exp->__anon1.op.exp1->destType)
16158 exp->__anon1.op.exp1->destType->refCount++;
16159 success = 1;
16160 }
16161 else if(CheckExpressionType(exp->__anon1.op.exp2, exp->__anon1.op.exp2->destType, 0, 0))
16162 {
16163 if(exp->expType)
16164 FreeType(exp->expType);
16165 exp->expType = exp->__anon1.op.exp2->destType;
16166 if(exp->__anon1.op.exp2->destType)
16167 exp->__anon1.op.exp2->destType->refCount++;
16168 success = 1;
16169 }
16170 }
16171 else if(!success)
16172 {
16173 if(CheckExpressionType(exp->__anon1.op.exp2, exp->__anon1.op.exp2->destType, 0, 0))
16174 {
16175 if(exp->expType)
16176 FreeType(exp->expType);
16177 exp->expType = exp->__anon1.op.exp2->destType;
16178 if(exp->__anon1.op.exp2->destType)
16179 exp->__anon1.op.exp2->destType->refCount++;
16180 success = 1;
16181 }
16182 else if(CheckExpressionType(exp->__anon1.op.exp1, exp->__anon1.op.exp1->destType, 0, 0))
16183 {
16184 if(exp->expType)
16185 FreeType(exp->expType);
16186 exp->expType = exp->__anon1.op.exp1->destType;
16187 if(exp->__anon1.op.exp1->destType)
16188 exp->__anon1.op.exp1->destType->refCount++;
16189 success = 1;
16190 }
16191 }
16192 if(!success)
16193 {
16194 char expString1[10240];
16195 char expString2[10240];
16196 char type1[1024];
16197 char type2[1024];
16198
16199 expString1[0] = '\0';
16200 expString2[0] = '\0';
16201 type1[0] = '\0';
16202 type2[0] = '\0';
16203 if(inCompiler)
16204 {
16205 PrintExpression(exp->__anon1.op.exp1, expString1);
16206 __ecereNameSpace__ecere__sys__ChangeCh(expString1, '\n', ' ');
16207 PrintExpression(exp->__anon1.op.exp2, expString2);
16208 __ecereNameSpace__ecere__sys__ChangeCh(expString2, '\n', ' ');
16209 PrintType(exp->__anon1.op.exp1->expType, type1, 0, 1);
16210 PrintType(exp->__anon1.op.exp2->expType, type2, 0, 1);
16211 }
16212 Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "incompatible expressions %s (%s) and %s (%s)\n", (((void *)0))), expString1, type1, expString2, type2);
16213 }
16214 }
16215 }
16216 else if(!boolResult && (!useSideUnit) && type2 && type1 && type2->kind == 8 && type1->kind != 8 && type2->__anon1._class && type2->__anon1._class->__anon1.registered && type2->__anon1._class->__anon1.registered->type == 3)
16217 {
16218 if(exp->__anon1.op.exp1->destType)
16219 FreeType(exp->__anon1.op.exp1->destType);
16220 exp->__anon1.op.exp1->destType = type2->__anon1._class->__anon1.registered->dataType;
16221 if(type2->__anon1._class->__anon1.registered->dataType)
16222 type2->__anon1._class->__anon1.registered->dataType->refCount++;
16223 CheckExpressionType(exp->__anon1.op.exp1, exp->__anon1.op.exp1->destType, 0, 0);
16224 exp->expType = type2;
16225 if(type2)
16226 type2->refCount++;
16227 }
16228 else if(!boolResult && (!useSideUnit) && type1 && type2 && type1->kind == 8 && type2->kind != 8 && type1->__anon1._class && type1->__anon1._class->__anon1.registered && type1->__anon1._class->__anon1.registered->type == 3)
16229 {
16230 if(exp->__anon1.op.exp2->destType)
16231 FreeType(exp->__anon1.op.exp2->destType);
16232 exp->__anon1.op.exp2->destType = type1->__anon1._class->__anon1.registered->dataType;
16233 if(type1->__anon1._class->__anon1.registered->dataType)
16234 type1->__anon1._class->__anon1.registered->dataType->refCount++;
16235 CheckExpressionType(exp->__anon1.op.exp2, exp->__anon1.op.exp2->destType, 0, 0);
16236 exp->expType = type1;
16237 if(type1)
16238 type1->refCount++;
16239 }
16240 else if(type1)
16241 {
16242 unsigned int valid = 0;
16243
16244 if(!boolResult && useSideUnit && type1 && type1->kind == 8 && type1->__anon1._class->__anon1.registered && type1->__anon1._class->__anon1.registered->type == 3 && type2 && type2->kind != 8)
16245 {
16246 if(exp->__anon1.op.exp2->destType)
16247 FreeType(exp->__anon1.op.exp2->destType);
16248 if(!type1->__anon1._class->__anon1.registered->dataType)
16249 type1->__anon1._class->__anon1.registered->dataType = ProcessTypeString(type1->__anon1._class->__anon1.registered->dataTypeString, 0);
16250 exp->__anon1.op.exp2->destType = type1->__anon1._class->__anon1.registered->dataType;
16251 exp->__anon1.op.exp2->destType->refCount++;
16252 CheckExpressionType(exp->__anon1.op.exp2, exp->__anon1.op.exp2->destType, 0, 0);
16253 if(type2)
16254 FreeType(type2);
16255 type2 = exp->__anon1.op.exp2->destType;
16256 if(type2)
16257 type2->refCount++;
16258 exp->expType = type2;
16259 type2->refCount++;
16260 }
16261 if(!boolResult && useSideUnit && type2 && type2->kind == 8 && type2->__anon1._class->__anon1.registered && type2->__anon1._class->__anon1.registered->type == 3 && type1 && type1->kind != 8)
16262 {
16263 if(exp->__anon1.op.exp1->destType)
16264 FreeType(exp->__anon1.op.exp1->destType);
16265 if(!type2->__anon1._class->__anon1.registered->dataType)
16266 type2->__anon1._class->__anon1.registered->dataType = ProcessTypeString(type2->__anon1._class->__anon1.registered->dataTypeString, 0);
16267 exp->__anon1.op.exp1->destType = type2->__anon1._class->__anon1.registered->dataType;
16268 exp->__anon1.op.exp1->destType->refCount++;
16269 CheckExpressionType(exp->__anon1.op.exp1, exp->__anon1.op.exp1->destType, 0, 0);
16270 type1 = exp->__anon1.op.exp1->destType;
16271 exp->expType = type1;
16272 type1->refCount++;
16273 }
16274 if(!boolResult || exp->__anon1.op.op == '>' || exp->__anon1.op.op == '<' || exp->__anon1.op.op == GE_OP || exp->__anon1.op.op == LE_OP)
16275 {
16276 unsigned int op1IsEnum = type1 && type1->kind == 8 && type1->__anon1._class && type1->__anon1._class->__anon1.registered && type1->__anon1._class->__anon1.registered->type == 4;
16277 unsigned int op2IsEnum = type2 && type2->kind == 8 && type2->__anon1._class && type2->__anon1._class->__anon1.registered && type2->__anon1._class->__anon1.registered->type == 4;
16278
16279 if(exp->__anon1.op.op == '*' || exp->__anon1.op.op == '/' || exp->__anon1.op.op == '-' || exp->__anon1.op.op == '|' || exp->__anon1.op.op == '^')
16280 {
16281 if(op1IsEnum && exp->__anon1.op.exp2->expType)
16282 {
16283 if(CheckExpressionType(exp->__anon1.op.exp1, exp->__anon1.op.exp2->expType, 0, 0))
16284 {
16285 if(exp->expType)
16286 FreeType(exp->expType);
16287 exp->expType = exp->__anon1.op.exp2->expType;
16288 if(exp->__anon1.op.exp2->expType)
16289 exp->__anon1.op.exp2->expType->refCount++;
16290 valid = 1;
16291 }
16292 }
16293 else if(op2IsEnum && exp->__anon1.op.exp1->expType)
16294 {
16295 if(CheckExpressionType(exp->__anon1.op.exp2, exp->__anon1.op.exp1->expType, 0, 0))
16296 {
16297 if(exp->expType)
16298 FreeType(exp->expType);
16299 exp->expType = exp->__anon1.op.exp1->expType;
16300 if(exp->__anon1.op.exp1->expType)
16301 exp->__anon1.op.exp1->expType->refCount++;
16302 valid = 1;
16303 }
16304 }
16305 }
16306 else
16307 {
16308 if(op1IsEnum && exp->__anon1.op.exp2->expType)
16309 {
16310 if(CheckExpressionType(exp->__anon1.op.exp1, exp->__anon1.op.exp2->expType, 0, 0))
16311 {
16312 if(exp->expType)
16313 FreeType(exp->expType);
16314 exp->expType = exp->__anon1.op.exp1->expType;
16315 if(exp->__anon1.op.exp1->expType)
16316 exp->__anon1.op.exp1->expType->refCount++;
16317 valid = 1;
16318 }
16319 }
16320 else if(op2IsEnum && exp->__anon1.op.exp1->expType)
16321 {
16322 if(CheckExpressionType(exp->__anon1.op.exp2, exp->__anon1.op.exp1->expType, 0, 0))
16323 {
16324 if(exp->expType)
16325 FreeType(exp->expType);
16326 exp->expType = exp->__anon1.op.exp2->expType;
16327 if(exp->__anon1.op.exp2->expType)
16328 exp->__anon1.op.exp2->expType->refCount++;
16329 valid = 1;
16330 }
16331 }
16332 }
16333 }
16334 if(!valid)
16335 {
16336 if(type2 && type2->kind == 8 && type2->__anon1._class && type2->__anon1._class->__anon1.registered && type2->__anon1._class->__anon1.registered->type == 3 && (type1->kind != 8 || !type1->__anon1._class || !type1->__anon1._class->__anon1.registered || type1->__anon1._class->__anon1.registered->type != 3))
16337 {
16338 if(exp->__anon1.op.exp1->destType)
16339 FreeType(exp->__anon1.op.exp1->destType);
16340 exp->__anon1.op.exp1->destType = type2;
16341 type2->refCount++;
16342 if(CheckExpressionType(exp->__anon1.op.exp1, exp->__anon1.op.exp1->destType, 0, 0))
16343 {
16344 if(exp->expType)
16345 FreeType(exp->expType);
16346 exp->expType = exp->__anon1.op.exp1->destType;
16347 if(exp->__anon1.op.exp1->destType)
16348 exp->__anon1.op.exp1->destType->refCount++;
16349 }
16350 }
16351 else
16352 {
16353 if(exp->__anon1.op.exp2->destType)
16354 FreeType(exp->__anon1.op.exp2->destType);
16355 exp->__anon1.op.exp2->destType = type1;
16356 type1->refCount++;
16357 if(CheckExpressionType(exp->__anon1.op.exp2, exp->__anon1.op.exp2->destType, 0, 0))
16358 {
16359 if(exp->expType)
16360 FreeType(exp->expType);
16361 exp->expType = exp->__anon1.op.exp2->destType;
16362 if(exp->__anon1.op.exp2->destType)
16363 exp->__anon1.op.exp2->destType->refCount++;
16364 }
16365 else if(type1 && type2)
16366 {
16367 char expString1[10240];
16368 char expString2[10240];
16369 char type1String[1024];
16370 char type2String[1024];
16371
16372 expString1[0] = '\0';
16373 expString2[0] = '\0';
16374 type1String[0] = '\0';
16375 type2String[0] = '\0';
16376 if(inCompiler)
16377 {
16378 PrintExpression(exp->__anon1.op.exp1, expString1);
16379 __ecereNameSpace__ecere__sys__ChangeCh(expString1, '\n', ' ');
16380 PrintExpression(exp->__anon1.op.exp2, expString2);
16381 __ecereNameSpace__ecere__sys__ChangeCh(expString2, '\n', ' ');
16382 PrintType(exp->__anon1.op.exp1->expType, type1String, 0, 1);
16383 PrintType(exp->__anon1.op.exp2->expType, type2String, 0, 1);
16384 }
16385 Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "incompatible expressions %s (%s) and %s (%s)\n", (((void *)0))), expString1, type1String, expString2, type2String);
16386 if(type1->kind == 8 && type1->__anon1._class && type1->__anon1._class->__anon1.registered && type1->__anon1._class->__anon1.registered->type == 4)
16387 {
16388 exp->expType = exp->__anon1.op.exp1->expType;
16389 if(exp->__anon1.op.exp1->expType)
16390 exp->__anon1.op.exp1->expType->refCount++;
16391 }
16392 else if(type2->kind == 8 && type2->__anon1._class && type2->__anon1._class->__anon1.registered && type2->__anon1._class->__anon1.registered->type == 4)
16393 {
16394 exp->expType = exp->__anon1.op.exp2->expType;
16395 if(exp->__anon1.op.exp2->expType)
16396 exp->__anon1.op.exp2->expType->refCount++;
16397 }
16398 }
16399 }
16400 }
16401 }
16402 else if(type2)
16403 {
16404 if(type2->kind == 8 && type2->__anon1._class && type2->__anon1._class->__anon1.registered && type2->__anon1._class->__anon1.registered->type == 4)
16405 {
16406 struct Type * oldType = exp->__anon1.op.exp1->expType;
16407
16408 exp->__anon1.op.exp1->expType = (((void *)0));
16409 if(CheckExpressionType(exp->__anon1.op.exp1, exp->__anon1.op.exp1->destType, 0, 0))
16410 FreeType(oldType);
16411 else
16412 exp->__anon1.op.exp1->expType = oldType;
16413 }
16414 if(exp->__anon1.op.exp1->destType)
16415 FreeType(exp->__anon1.op.exp1->destType);
16416 exp->__anon1.op.exp1->destType = type2;
16417 type2->refCount++;
16418 if(CheckExpressionType(exp->__anon1.op.exp1, exp->__anon1.op.exp1->destType, 0, 0))
16419 {
16420 if(exp->expType)
16421 FreeType(exp->expType);
16422 exp->expType = exp->__anon1.op.exp1->destType;
16423 if(exp->__anon1.op.exp1->destType)
16424 exp->__anon1.op.exp1->destType->refCount++;
16425 }
16426 }
16427 }
16428 else if(type2 && (!type1 || (type2->kind == 8 && type1->kind != 8)))
16429 {
16430 if(type1 && type2->__anon1._class && type2->__anon1._class->__anon1.registered && type2->__anon1._class->__anon1.registered->type == 3)
16431 {
16432 if(exp->__anon1.op.exp1->destType)
16433 FreeType(exp->__anon1.op.exp1->destType);
16434 exp->__anon1.op.exp1->destType = type2->__anon1._class->__anon1.registered->dataType;
16435 if(type2->__anon1._class->__anon1.registered->dataType)
16436 type2->__anon1._class->__anon1.registered->dataType->refCount++;
16437 CheckExpressionType(exp->__anon1.op.exp1, exp->__anon1.op.exp1->destType, 0, 0);
16438 }
16439 if(exp->__anon1.op.op == '!')
16440 {
16441 exp->expType = MkClassType("bool");
16442 exp->expType->truth = 1;
16443 }
16444 else
16445 {
16446 exp->expType = type2;
16447 if(type2)
16448 type2->refCount++;
16449 }
16450 }
16451 else if(type1 && (!type2 || (type1->kind == 8 && type2->kind != 8)))
16452 {
16453 if(type2 && type1->__anon1._class && type1->__anon1._class->__anon1.registered && type1->__anon1._class->__anon1.registered->type == 3)
16454 {
16455 if(exp->__anon1.op.exp2->destType)
16456 FreeType(exp->__anon1.op.exp2->destType);
16457 exp->__anon1.op.exp2->destType = type1->__anon1._class->__anon1.registered->dataType;
16458 if(type1->__anon1._class->__anon1.registered->dataType)
16459 type1->__anon1._class->__anon1.registered->dataType->refCount++;
16460 CheckExpressionType(exp->__anon1.op.exp2, exp->__anon1.op.exp2->destType, 0, 0);
16461 }
16462 exp->expType = type1;
16463 if(type1)
16464 type1->refCount++;
16465 }
16466 }
16467 yylloc = exp->loc;
16468 if(exp->__anon1.op.exp1 && !exp->__anon1.op.exp1->expType)
16469 {
16470 char expString[10000];
16471
16472 expString[0] = '\0';
16473 if(inCompiler)
16474 {
16475 PrintExpression(exp->__anon1.op.exp1, expString);
16476 __ecereNameSpace__ecere__sys__ChangeCh(expString, '\n', ' ');
16477 }
16478 if(expString[0])
16479 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "couldn't determine type of %s\n", (((void *)0))), expString);
16480 }
16481 if(exp->__anon1.op.exp2 && !exp->__anon1.op.exp2->expType)
16482 {
16483 char expString[10240];
16484
16485 expString[0] = '\0';
16486 if(inCompiler)
16487 {
16488 PrintExpression(exp->__anon1.op.exp2, expString);
16489 __ecereNameSpace__ecere__sys__ChangeCh(expString, '\n', ' ');
16490 }
16491 if(expString[0])
16492 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "couldn't determine type of %s\n", (((void *)0))), expString);
16493 }
16494 if(boolResult)
16495 {
16496 FreeType(exp->expType);
16497 exp->expType = MkClassType("bool");
16498 exp->expType->truth = 1;
16499 }
16500 if(exp->__anon1.op.op != SIZEOF)
16501 exp->isConstant = (!exp->__anon1.op.exp1 || exp->__anon1.op.exp1->isConstant) && (!exp->__anon1.op.exp2 || exp->__anon1.op.exp2->isConstant);
16502 if(exp->__anon1.op.op == SIZEOF && exp->__anon1.op.exp2->expType)
16503 {
16504 DeclareType(curExternal, exp->__anon1.op.exp2->expType, 1, 0);
16505 }
16506 if(exp->__anon1.op.op == DELETE && exp->__anon1.op.exp2 && exp->__anon1.op.exp2->expType && __ecereProp_Type_Get_specConst(exp->__anon1.op.exp2->expType))
16507 Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "deleting const qualified object\n", (((void *)0))));
16508 yylloc = oldyylloc;
16509 FreeType(dummy);
16510 if(type2)
16511 FreeType(type2);
16512 break;
16513 }
16514 case 5:
16515 case 32:
16516 {
16517 struct Expression * e;
16518
16519 exp->isConstant = 1;
16520 for(e = (*exp->__anon1.list).first; e; e = e->next)
16521 {
16522 if(!e->next)
16523 {
16524 FreeType(e->destType);
16525 e->opDestType = exp->opDestType;
16526 e->destType = exp->destType;
16527 if(e->destType)
16528 {
16529 exp->destType->refCount++;
16530 }
16531 }
16532 ProcessExpressionType(e);
16533 if(!exp->expType && !e->next)
16534 {
16535 exp->expType = e->expType;
16536 if(e->expType)
16537 e->expType->refCount++;
16538 }
16539 if(!e->isConstant)
16540 exp->isConstant = 0;
16541 }
16542 e = (*exp->__anon1.list).first;
16543 if(!e->next && e->type == 8)
16544 {
16545 struct Expression * next = exp->next, * prev = exp->prev;
16546
16547 FreeType(exp->expType);
16548 FreeType(exp->destType);
16549 (__ecereNameSpace__ecere__com__eSystem_Delete(exp->__anon1.list), exp->__anon1.list = 0);
16550 *exp = *e;
16551 exp->prev = prev;
16552 exp->next = next;
16553 ((e ? (__ecereClass_Expression->Destructor ? __ecereClass_Expression->Destructor((void *)e) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(e)) : 0), e = 0);
16554 ProcessExpressionType(exp);
16555 }
16556 break;
16557 }
16558 case 6:
16559 {
16560 struct Expression * e;
16561
16562 exp->isConstant = 1;
16563 ProcessExpressionType(exp->__anon1.index.exp);
16564 if(!exp->__anon1.index.exp->isConstant)
16565 exp->isConstant = 0;
16566 if(exp->__anon1.index.exp->expType)
16567 {
16568 struct Type * source = exp->__anon1.index.exp->expType;
16569
16570 if(source->kind == 8 && source->__anon1._class && source->__anon1._class->__anon1.registered)
16571 {
16572 struct __ecereNameSpace__ecere__com__Class * _class = source->__anon1._class->__anon1.registered;
16573 struct __ecereNameSpace__ecere__com__Class * c = _class->templateClass ? _class->templateClass : _class;
16574
16575 if(_class != containerClass && __ecereNameSpace__ecere__com__eClass_IsDerived(c, containerClass) && _class->templateArgs)
16576 {
16577 exp->expType = ProcessTypeString(_class->templateArgs[2].__anon1.__anon1.dataTypeString, 0);
16578 if(exp->__anon1.index.index && (*exp->__anon1.index.index).last)
16579 {
16580 struct Type * type = ProcessTypeString(_class->templateArgs[1].__anon1.__anon1.dataTypeString, 0);
16581
16582 if(type->kind == 8)
16583 type->constant = 1;
16584 else if(type->kind == 13)
16585 {
16586 struct Type * t = type;
16587
16588 while(t->kind == 13)
16589 t = t->__anon1.type;
16590 t->constant = 1;
16591 }
16592 ((struct Expression *)(*exp->__anon1.index.index).last)->destType = type;
16593 }
16594 }
16595 }
16596 }
16597 for(e = (*exp->__anon1.index.index).first; e; e = e->next)
16598 {
16599 if(!e->next && exp->__anon1.index.exp->expType && exp->__anon1.index.exp->expType->kind == 12 && exp->__anon1.index.exp->expType->__anon1.__anon4.enumClass)
16600 {
16601 if(e->destType)
16602 FreeType(e->destType);
16603 e->destType = MkClassType(exp->__anon1.index.exp->expType->__anon1.__anon4.enumClass->string);
16604 }
16605 ProcessExpressionType(e);
16606 if(!e->next)
16607 {
16608 }
16609 if(!e->isConstant)
16610 exp->isConstant = 0;
16611 }
16612 if(!exp->expType)
16613 exp->expType = Dereference(exp->__anon1.index.exp->expType);
16614 if(exp->expType)
16615 DeclareType(curExternal, exp->expType, 1, 0);
16616 break;
16617 }
16618 case 7:
16619 {
16620 struct Expression * e;
16621 struct Type * functionType;
16622 struct Type * methodType = (((void *)0));
16623 char name[1024];
16624
16625 name[0] = '\0';
16626 if(inCompiler)
16627 {
16628 PrintExpression(exp->__anon1.call.exp, name);
16629 if(exp->__anon1.call.exp->expType && !exp->__anon1.call.exp->expType->__anon1.__anon2.returnType)
16630 {
16631 PrintExpression(exp->__anon1.call.exp, name);
16632 }
16633 }
16634 if(exp->__anon1.call.exp->type == 0)
16635 {
16636 struct Expression * idExp = exp->__anon1.call.exp;
16637 struct Identifier * id = idExp->__anon1.__anon1.identifier;
16638
16639 if(!strcmp(id->string, "__builtin_frame_address"))
16640 {
16641 exp->expType = ProcessTypeString("void *", 1);
16642 if(exp->__anon1.call.arguments && (*exp->__anon1.call.arguments).first)
16643 ProcessExpressionType((*exp->__anon1.call.arguments).first);
16644 break;
16645 }
16646 else if(!strcmp(id->string, "__ENDIAN_PAD"))
16647 {
16648 exp->expType = ProcessTypeString("int", 1);
16649 if(exp->__anon1.call.arguments && (*exp->__anon1.call.arguments).first)
16650 ProcessExpressionType((*exp->__anon1.call.arguments).first);
16651 break;
16652 }
16653 else if(!strcmp(id->string, "Max") || !strcmp(id->string, "Min") || !strcmp(id->string, "Sgn") || !strcmp(id->string, "Abs"))
16654 {
16655 struct Expression * a = (((void *)0));
16656 struct Expression * b = (((void *)0));
16657 struct Expression * tempExp1 = (((void *)0)), * tempExp2 = (((void *)0));
16658
16659 if((!strcmp(id->string, "Max") || !strcmp(id->string, "Min")) && (*exp->__anon1.call.arguments).count == 2)
16660 {
16661 a = (*exp->__anon1.call.arguments).first;
16662 b = (*exp->__anon1.call.arguments).last;
16663 tempExp1 = a;
16664 tempExp2 = b;
16665 }
16666 else if((*exp->__anon1.call.arguments).count == 1)
16667 {
16668 a = (*exp->__anon1.call.arguments).first;
16669 tempExp1 = a;
16670 }
16671 if(a)
16672 {
16673 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Clear((&*exp->__anon1.call.arguments));
16674 idExp->__anon1.__anon1.identifier = (((void *)0));
16675 FreeExpContents(exp);
16676 ProcessExpressionType(a);
16677 if(b)
16678 ProcessExpressionType(b);
16679 exp->type = 5;
16680 exp->__anon1.list = MkList();
16681 if(a->expType && (!b || b->expType))
16682 {
16683 if((!a->isConstant && a->type != 0) || (b && !b->isConstant && b->type != 0))
16684 {
16685 if(inCompiler)
16686 {
16687 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
16688 struct __ecereNameSpace__ecere__sys__OldList * decls = MkList();
16689 struct Declaration * decl;
16690 char temp1[1024], temp2[1024];
16691
16692 GetTypeSpecs(a->expType, specs);
16693 if(a && !a->isConstant && a->type != 0)
16694 {
16695 sprintf(temp1, "__simpleStruct%d", curContext->simpleID++);
16696 ListAdd(decls, MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier(temp1)), (((void *)0))));
16697 tempExp1 = QMkExpId(temp1);
16698 tempExp1->expType = a->expType;
16699 if(a->expType)
16700 a->expType->refCount++;
16701 ListAdd(exp->__anon1.list, MkExpOp(CopyExpression(tempExp1), '=', a));
16702 }
16703 if(b && !b->isConstant && b->type != 0)
16704 {
16705 sprintf(temp2, "__simpleStruct%d", curContext->simpleID++);
16706 ListAdd(decls, MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier(temp2)), (((void *)0))));
16707 tempExp2 = QMkExpId(temp2);
16708 tempExp2->expType = b->expType;
16709 if(b->expType)
16710 b->expType->refCount++;
16711 ListAdd(exp->__anon1.list, MkExpOp(CopyExpression(tempExp2), '=', b));
16712 }
16713 decl = MkDeclaration(specs, decls);
16714 if(!curCompound->__anon1.compound.declarations)
16715 curCompound->__anon1.compound.declarations = MkList();
16716 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*curCompound->__anon1.compound.declarations), (((void *)0)), decl);
16717 }
16718 }
16719 }
16720 if(!strcmp(id->string, "Max") || !strcmp(id->string, "Min"))
16721 {
16722 int op = (!strcmp(id->string, "Max")) ? '>' : '<';
16723
16724 ListAdd(exp->__anon1.list, MkExpCondition(MkExpBrackets(MkListOne(MkExpOp(CopyExpression(tempExp1), op, CopyExpression(tempExp2)))), MkListOne(CopyExpression(tempExp1)), CopyExpression(tempExp2)));
16725 exp->expType = a->expType;
16726 if(a->expType)
16727 a->expType->refCount++;
16728 }
16729 else if(!strcmp(id->string, "Abs"))
16730 {
16731 ListAdd(exp->__anon1.list, MkExpCondition(MkExpBrackets(MkListOne(MkExpOp(CopyExpression(tempExp1), '<', MkExpConstant("0")))), MkListOne(MkExpOp((((void *)0)), '-', CopyExpression(tempExp1))), CopyExpression(tempExp1)));
16732 exp->expType = a->expType;
16733 if(a->expType)
16734 a->expType->refCount++;
16735 }
16736 else if(!strcmp(id->string, "Sgn"))
16737 {
16738 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"))))));
16739 exp->expType = ProcessTypeString("int", 0);
16740 }
16741 FreeExpression(tempExp1);
16742 if(tempExp2)
16743 FreeExpression(tempExp2);
16744 FreeIdentifier(id);
16745 break;
16746 }
16747 }
16748 }
16749 {
16750 struct Type * dummy = (dummy = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type), dummy->count = 1, dummy->refCount = 1, dummy);
16751
16752 if(!exp->__anon1.call.exp->destType)
16753 {
16754 exp->__anon1.call.exp->destType = dummy;
16755 dummy->refCount++;
16756 }
16757 ProcessExpressionType(exp->__anon1.call.exp);
16758 if(exp->__anon1.call.exp->destType == dummy)
16759 {
16760 FreeType(dummy);
16761 exp->__anon1.call.exp->destType = (((void *)0));
16762 }
16763 FreeType(dummy);
16764 }
16765 functionType = exp->__anon1.call.exp->expType;
16766 if(functionType && functionType->kind == 16)
16767 {
16768 methodType = functionType;
16769 functionType = methodType->__anon1.__anon3.method->dataType;
16770 if(exp->__anon1.call.exp->expType->__anon1.__anon3.usedClass)
16771 {
16772 char typeString[1024];
16773
16774 typeString[0] = '\0';
16775 {
16776 struct Symbol * back = functionType->__anon1.__anon2.thisClass;
16777
16778 functionType->__anon1.__anon2.thisClass = (((void *)0));
16779 PrintType(functionType, typeString, 1, 1);
16780 functionType->__anon1.__anon2.thisClass = back;
16781 }
16782 if(strstr(typeString, "thisclass"))
16783 {
16784 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
16785 struct Declarator * decl;
16786
16787 {
16788 struct Context * context = SetupTemplatesContext(exp->__anon1.call.exp->expType->__anon1.__anon3.usedClass);
16789
16790 decl = SpecDeclFromString(typeString, specs, (((void *)0)));
16791 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))
16792 thisClassParams = 0;
16793 ReplaceThisClassSpecifiers(specs, exp->__anon1.call.exp->expType->__anon1.__anon3.usedClass);
16794 {
16795 struct __ecereNameSpace__ecere__com__Class * backupThisClass = thisClass;
16796
16797 thisClass = exp->__anon1.call.exp->expType->__anon1.__anon3.usedClass;
16798 ProcessDeclarator(decl, 1);
16799 thisClass = backupThisClass;
16800 }
16801 thisClassParams = 1;
16802 functionType = ProcessType(specs, decl);
16803 functionType->refCount = 0;
16804 FinishTemplatesContext(context);
16805 {
16806 struct Type * p, * op;
16807
16808 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)
16809 {
16810 if(op->kind == 21)
16811 p->thisClassFrom = methodType->__anon1.__anon3.method->_class;
16812 }
16813 }
16814 if(methodType->__anon1.__anon3.method->dataType->__anon1.__anon2.returnType->kind == 21)
16815 {
16816 functionType->__anon1.__anon2.returnType->thisClassFrom = methodType->__anon1.__anon3.method->_class;
16817 }
16818 }
16819 FreeList(specs, (void *)(FreeSpecifier));
16820 FreeDeclarator(decl);
16821 }
16822 }
16823 }
16824 if(functionType && functionType->kind == 13 && functionType->__anon1.type && functionType->__anon1.type->kind == 11)
16825 {
16826 struct Type * type = functionType->__anon1.type;
16827
16828 if(!functionType->refCount)
16829 {
16830 functionType->__anon1.type = (((void *)0));
16831 FreeType(functionType);
16832 }
16833 functionType = type;
16834 }
16835 if(functionType && functionType->kind != 11)
16836 {
16837 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "called object %s is not a function\n", (((void *)0))), name);
16838 }
16839 else if(functionType)
16840 {
16841 unsigned int emptyParams = 0, noParams = 0;
16842 struct Expression * e = exp->__anon1.call.arguments ? (*exp->__anon1.call.arguments).first : (((void *)0));
16843 struct Type * type = functionType->__anon1.__anon2.params.first;
16844 struct Expression * memberExp = (exp->__anon1.call.exp->type == 8) ? exp->__anon1.call.exp : (((void *)0));
16845 int extra = 0;
16846 struct Location oldyylloc = yylloc;
16847
16848 if(!type)
16849 emptyParams = 1;
16850 if(functionType->extraParam && e && functionType->__anon1.__anon2.thisClass)
16851 {
16852 e->destType = MkClassType(functionType->__anon1.__anon2.thisClass->string);
16853 e = e->next;
16854 }
16855 if(!functionType->__anon1.__anon2.staticMethod && !functionType->extraParam)
16856 {
16857 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)
16858 {
16859 type = MkClassType(memberExp->__anon1.member.exp->expType->__anon1._class->string);
16860 if(e)
16861 {
16862 e->destType = type;
16863 e = e->next;
16864 type = functionType->__anon1.__anon2.params.first;
16865 }
16866 else
16867 type->refCount = 0;
16868 }
16869 else if(!memberExp && (functionType->__anon1.__anon2.thisClass || (methodType && methodType->__anon1.__anon3.methodClass)))
16870 {
16871 type = MkClassType(functionType->__anon1.__anon2.thisClass ? functionType->__anon1.__anon2.thisClass->string : (methodType ? methodType->__anon1.__anon3.methodClass->fullName : (((void *)0))));
16872 type->byReference = functionType->byReference;
16873 type->typedByReference = functionType->typedByReference;
16874 if(e)
16875 {
16876 if(e->next && type->kind == 8 && (functionType && functionType->__anon1.__anon2.thisClass) && functionType->classObjectType == 2)
16877 e = e->next;
16878 e->destType = type;
16879 e = e->next;
16880 type = functionType->__anon1.__anon2.params.first;
16881 }
16882 else
16883 type->refCount = 0;
16884 }
16885 }
16886 if(type && type->kind == 0)
16887 {
16888 noParams = 1;
16889 if(!type->refCount)
16890 FreeType(type);
16891 type = (((void *)0));
16892 }
16893 for(; e; e = e->next)
16894 {
16895 if(!type && !emptyParams)
16896 {
16897 yylloc = e->loc;
16898 if(methodType && methodType->__anon1.__anon3.methodClass)
16899 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);
16900 else
16901 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);
16902 break;
16903 }
16904 if(methodType && type && type->kind == 20 && type->__anon1.templateParameter->type == 0)
16905 {
16906 struct Type * templatedType = (((void *)0));
16907 struct __ecereNameSpace__ecere__com__Class * _class = methodType->__anon1.__anon3.usedClass;
16908 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * curParam = (((void *)0));
16909 int id = 0;
16910
16911 if(_class && _class->templateArgs)
16912 {
16913 struct __ecereNameSpace__ecere__com__Class * sClass;
16914
16915 for(sClass = _class; sClass; sClass = sClass->base)
16916 {
16917 if(sClass->templateClass)
16918 sClass = sClass->templateClass;
16919 id = 0;
16920 for(curParam = sClass->templateParams.first; curParam; curParam = curParam->next)
16921 {
16922 if(curParam->type == 0 && !strcmp(type->__anon1.templateParameter->identifier->string, curParam->name))
16923 {
16924 struct __ecereNameSpace__ecere__com__Class * nextClass;
16925
16926 for(nextClass = sClass->base; nextClass; nextClass = nextClass->base)
16927 {
16928 if(nextClass->templateClass)
16929 nextClass = nextClass->templateClass;
16930 id += nextClass->templateParams.count;
16931 }
16932 break;
16933 }
16934 id++;
16935 }
16936 if(curParam)
16937 break;
16938 }
16939 }
16940 if(curParam && _class->templateArgs[id].__anon1.__anon1.dataTypeString)
16941 {
16942 unsigned int constant = type->constant;
16943 struct __ecereNameSpace__ecere__com__ClassTemplateArgument arg = _class->templateArgs[id];
16944
16945 {
16946 struct Context * context = SetupTemplatesContext(_class);
16947
16948 templatedType = ProcessTypeString(arg.__anon1.__anon1.dataTypeString, 0);
16949 FinishTemplatesContext(context);
16950 }
16951 if(templatedType->kind == 8 && constant)
16952 templatedType->constant = 1;
16953 else if(templatedType->kind == 13)
16954 {
16955 struct Type * t = templatedType->__anon1.type;
16956
16957 while(t->kind == 13)
16958 t = t->__anon1.type;
16959 if(constant)
16960 t->constant = constant;
16961 }
16962 e->destType = templatedType;
16963 if(templatedType)
16964 {
16965 templatedType->passAsTemplate = 1;
16966 }
16967 }
16968 else
16969 {
16970 e->destType = type;
16971 if(type)
16972 type->refCount++;
16973 }
16974 }
16975 else
16976 {
16977 if(type && type->kind == 14 && type->prev && type->prev->kind == 8 && type->prev->classObjectType)
16978 {
16979 e->destType = type->prev;
16980 e->destType->refCount++;
16981 }
16982 else
16983 {
16984 e->destType = type;
16985 if(type)
16986 type->refCount++;
16987 }
16988 }
16989 if(type && type->kind != 14)
16990 {
16991 struct Type * next = type->next;
16992
16993 if(!type->refCount)
16994 FreeType(type);
16995 type = next;
16996 }
16997 }
16998 if(type && type->kind != 14)
16999 {
17000 if(methodType && methodType->__anon1.__anon3.methodClass)
17001 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);
17002 else
17003 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);
17004 }
17005 yylloc = oldyylloc;
17006 if(type && !type->refCount)
17007 FreeType(type);
17008 }
17009 else
17010 {
17011 functionType = __extension__ ({
17012 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
17013
17014 __ecereInstance1->refCount = 0, __ecereInstance1->kind = 11, __ecereInstance1;
17015 });
17016 if(exp->__anon1.call.exp->type == 0)
17017 {
17018 char * string = exp->__anon1.call.exp->__anon1.__anon1.identifier->string;
17019
17020 if(inCompiler)
17021 {
17022 struct Symbol * symbol;
17023 struct Location oldyylloc = yylloc;
17024
17025 yylloc = exp->__anon1.call.exp->__anon1.__anon1.identifier->loc;
17026 if(strstr(string, "__builtin_") == string)
17027 {
17028 if(exp->destType)
17029 {
17030 functionType->__anon1.__anon2.returnType = exp->destType;
17031 exp->destType->refCount++;
17032 }
17033 }
17034 else
17035 Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "%s undefined; assuming extern returning int\n", (((void *)0))), string);
17036 symbol = __extension__ ({
17037 struct Symbol * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Symbol);
17038
17039 __ecereInstance1->string = __ecereNameSpace__ecere__sys__CopyString(string), __ecereInstance1->type = ProcessTypeString("int()", 1), __ecereInstance1;
17040 });
17041 __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Add(&globalContext->symbols, (struct __ecereNameSpace__ecere__sys__BTNode *)symbol);
17042 if(strstr(symbol->string, "::"))
17043 globalContext->hasNameSpace = 1;
17044 yylloc = oldyylloc;
17045 }
17046 }
17047 else if(exp->__anon1.call.exp->type == 8)
17048 {
17049 }
17050 else
17051 Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "callable object undefined; extern assuming returning int\n", (((void *)0))));
17052 if(!functionType->__anon1.__anon2.returnType)
17053 {
17054 functionType->__anon1.__anon2.returnType = __extension__ ({
17055 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
17056
17057 __ecereInstance1->refCount = 1, __ecereInstance1->kind = 3, __ecereInstance1;
17058 });
17059 }
17060 }
17061 if(functionType && functionType->kind == 11)
17062 {
17063 exp->expType = functionType->__anon1.__anon2.returnType;
17064 if(functionType->__anon1.__anon2.returnType)
17065 functionType->__anon1.__anon2.returnType->refCount++;
17066 if(!functionType->refCount)
17067 FreeType(functionType);
17068 }
17069 if(exp->__anon1.call.arguments)
17070 {
17071 for(e = (*exp->__anon1.call.arguments).first; e; e = e->next)
17072 ProcessExpressionType(e);
17073 }
17074 break;
17075 }
17076 case 8:
17077 {
17078 struct Type * type;
17079 struct Location oldyylloc = yylloc;
17080 unsigned int thisPtr;
17081 struct Expression * checkExp = exp->__anon1.member.exp;
17082
17083 while(checkExp)
17084 {
17085 if(checkExp->type == 11)
17086 checkExp = checkExp->__anon1.cast.exp;
17087 else if(checkExp->type == 5)
17088 checkExp = checkExp->__anon1.list ? (*checkExp->__anon1.list).first : (((void *)0));
17089 else
17090 break;
17091 }
17092 thisPtr = (checkExp && checkExp->type == 0 && !strcmp(checkExp->__anon1.__anon1.identifier->string, "this"));
17093 exp->thisPtr = thisPtr;
17094 if(exp->__anon1.member.member && exp->__anon1.member.member->_class && exp->__anon1.member.member->_class->__anon1.__anon1.name)
17095 {
17096 exp->__anon1.member.member->classSym = exp->__anon1.member.member->_class->__anon1.__anon1.symbol;
17097 }
17098 ProcessExpressionType(exp->__anon1.member.exp);
17099 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)
17100 {
17101 exp->isConstant = 0;
17102 }
17103 else
17104 exp->isConstant = exp->__anon1.member.exp->isConstant;
17105 type = exp->__anon1.member.exp->expType;
17106 yylloc = exp->loc;
17107 if(type && (type->kind == 20))
17108 {
17109 struct __ecereNameSpace__ecere__com__Class * _class = thisClass ? thisClass : currentClass;
17110 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * param = (((void *)0));
17111
17112 if(_class)
17113 {
17114 for(param = _class->templateParams.first; param; param = param->next)
17115 {
17116 if(param->type == 1 && exp->__anon1.member.member && exp->__anon1.member.member->string && !strcmp(param->name, exp->__anon1.member.member->string))
17117 break;
17118 }
17119 }
17120 if(param && param->defaultArg.__anon1.__anon2.__anon1.member)
17121 {
17122 struct Expression * argExp = GetTemplateArgExpByName(param->name, thisClass, 1);
17123
17124 if(argExp)
17125 {
17126 struct Expression * expMember = exp->__anon1.member.exp;
17127 struct Declarator * decl;
17128 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
17129 char thisClassTypeString[1024];
17130
17131 FreeIdentifier(exp->__anon1.member.member);
17132 ProcessExpressionType(argExp);
17133 {
17134 char * colon = strstr(param->defaultArg.__anon1.__anon2.memberString, "::");
17135
17136 if(colon)
17137 {
17138 memcpy(thisClassTypeString, param->defaultArg.__anon1.__anon2.memberString, colon - param->defaultArg.__anon1.__anon2.memberString);
17139 thisClassTypeString[colon - param->defaultArg.__anon1.__anon2.memberString] = '\0';
17140 }
17141 else
17142 strcpy(thisClassTypeString, _class->fullName);
17143 }
17144 decl = SpecDeclFromString(param->defaultArg.__anon1.__anon2.__anon1.member->dataTypeString, specs, (((void *)0)));
17145 exp->expType = ProcessType(specs, decl);
17146 if(exp->expType->kind == 8 && exp->expType->__anon1._class && exp->expType->__anon1._class->__anon1.registered && exp->expType->__anon1._class->__anon1.registered->templateClass)
17147 {
17148 struct __ecereNameSpace__ecere__com__Class * expClass = exp->expType->__anon1._class->__anon1.registered;
17149 struct __ecereNameSpace__ecere__com__Class * cClass = (((void *)0));
17150 int paramCount = 0;
17151 int lastParam = -1;
17152 char templateString[1024];
17153 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * param;
17154
17155 sprintf(templateString, "%s<", expClass->templateClass->fullName);
17156 for(cClass = expClass; cClass; cClass = cClass->base)
17157 {
17158 int p = 0;
17159
17160 for(param = cClass->templateParams.first; param; param = param->next)
17161 {
17162 int id = p;
17163 struct __ecereNameSpace__ecere__com__Class * sClass;
17164 struct __ecereNameSpace__ecere__com__ClassTemplateArgument arg;
17165
17166 for(sClass = cClass->base; sClass; sClass = sClass->base)
17167 id += sClass->templateParams.count;
17168 arg = expClass->templateArgs[id];
17169 for(sClass = _class; sClass; sClass = sClass->base)
17170 {
17171 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * cParam;
17172 int p = 0;
17173 struct __ecereNameSpace__ecere__com__Class * nextClass;
17174
17175 for(nextClass = sClass->base; nextClass; nextClass = nextClass->base)
17176 p += nextClass->templateParams.count;
17177 for(cParam = sClass->templateParams.first; cParam; cParam = cParam->next, p++)
17178 {
17179 if(cParam->type == 0 && arg.__anon1.__anon1.dataTypeString && !strcmp(cParam->name, arg.__anon1.__anon1.dataTypeString))
17180 {
17181 if(_class->templateArgs && arg.__anon1.__anon1.dataTypeString && (!param->defaultArg.__anon1.__anon1.dataTypeString || strcmp(arg.__anon1.__anon1.dataTypeString, param->defaultArg.__anon1.__anon1.dataTypeString)))
17182 {
17183 arg.__anon1.__anon1.dataTypeString = _class->templateArgs[p].__anon1.__anon1.dataTypeString;
17184 arg.__anon1.__anon1.dataTypeClass = _class->templateArgs[p].__anon1.__anon1.dataTypeClass;
17185 break;
17186 }
17187 }
17188 }
17189 }
17190 {
17191 char argument[256];
17192
17193 argument[0] = '\0';
17194 switch(param->type)
17195 {
17196 case 2:
17197 {
17198 char expString[1024];
17199 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
17200 struct Declarator * decl = SpecDeclFromString(param->__anon1.dataTypeString, specs, (((void *)0)));
17201 struct Expression * exp;
17202 char * string = PrintHexUInt64(arg.__anon1.expression.__anon1.ui64);
17203
17204 exp = MkExpCast(MkTypeName(specs, decl), MkExpConstant(string));
17205 (__ecereNameSpace__ecere__com__eSystem_Delete(string), string = 0);
17206 ProcessExpressionType(exp);
17207 ComputeExpression(exp);
17208 expString[0] = '\0';
17209 PrintExpression(exp, expString);
17210 strcat(argument, expString);
17211 FreeExpression(exp);
17212 break;
17213 }
17214 case 1:
17215 {
17216 strcat(argument, arg.__anon1.__anon2.__anon1.member->name);
17217 break;
17218 }
17219 case 0:
17220 {
17221 if(arg.__anon1.__anon1.dataTypeString && (!param->defaultArg.__anon1.__anon1.dataTypeString || strcmp(arg.__anon1.__anon1.dataTypeString, param->defaultArg.__anon1.__anon1.dataTypeString)))
17222 {
17223 if(!strcmp(arg.__anon1.__anon1.dataTypeString, "thisclass"))
17224 strcat(argument, thisClassTypeString);
17225 else
17226 strcat(argument, arg.__anon1.__anon1.dataTypeString);
17227 }
17228 break;
17229 }
17230 }
17231 if(argument[0])
17232 {
17233 if(paramCount)
17234 strcat(templateString, ", ");
17235 if(lastParam != p - 1)
17236 {
17237 strcat(templateString, param->name);
17238 strcat(templateString, " = ");
17239 }
17240 strcat(templateString, argument);
17241 paramCount++;
17242 lastParam = p;
17243 }
17244 p++;
17245 }
17246 }
17247 }
17248 {
17249 int len = strlen(templateString);
17250
17251 if(templateString[len - 1] == '>')
17252 templateString[len++] = ' ';
17253 templateString[len++] = '>';
17254 templateString[len++] = '\0';
17255 }
17256 {
17257 struct Context * context = SetupTemplatesContext(_class);
17258
17259 FreeType(exp->expType);
17260 exp->expType = ProcessTypeString(templateString, 0);
17261 FinishTemplatesContext(context);
17262 }
17263 }
17264 if(!__ecereProp_Type_Get_isPointerType(expMember->expType))
17265 expMember = MkExpCast(MkTypeName(MkListOne(MkSpecifierName("uintptr")), (((void *)0))), expMember);
17266 exp->type = 5;
17267 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")))))))));
17268 }
17269 }
17270 else if(type->__anon1.templateParameter && type->__anon1.templateParameter->type == 0 && (type->__anon1.templateParameter->__anon1.dataType || type->__anon1.templateParameter->dataTypeString))
17271 {
17272 type = ProcessTemplateParameterType(type->__anon1.templateParameter);
17273 }
17274 }
17275 if(type && (type->kind == 20))
17276 ;
17277 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)))
17278 {
17279 struct Identifier * id = exp->__anon1.member.member;
17280 int typeKind = type->kind;
17281 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));
17282
17283 if(typeKind == 19 && exp->__anon1.member.exp->type == 24)
17284 {
17285 _class = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "ecere::com::Class");
17286 typeKind = 8;
17287 }
17288 if(id)
17289 {
17290 if(typeKind == 3 || typeKind == 15)
17291 _class = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "int");
17292 else if(!_class)
17293 {
17294 if(type->kind == 8 && type->__anon1._class && type->__anon1._class->__anon1.registered)
17295 {
17296 _class = type->__anon1._class->__anon1.registered;
17297 }
17298 else if((type->kind == 12 || type->kind == 13) && type->__anon1.type && type->__anon1.type->kind == 1)
17299 {
17300 _class = FindClass("char *")->__anon1.registered;
17301 }
17302 else if(type->kind == 13)
17303 {
17304 _class = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "uintptr");
17305 FreeType(exp->expType);
17306 exp->expType = ProcessTypeString("uintptr", 0);
17307 exp->byReference = 1;
17308 }
17309 else
17310 {
17311 char string[1024] = "";
17312 struct Symbol * classSym;
17313
17314 PrintTypeNoConst(type, string, 0, 1);
17315 classSym = FindClass(string);
17316 if(classSym)
17317 _class = classSym->__anon1.registered;
17318 }
17319 }
17320 }
17321 if(_class && id)
17322 {
17323 struct __ecereNameSpace__ecere__com__Property * prop = (((void *)0));
17324 struct __ecereNameSpace__ecere__com__Method * method = (((void *)0));
17325 struct __ecereNameSpace__ecere__com__DataMember * member = (((void *)0));
17326 struct __ecereNameSpace__ecere__com__Property * revConvert = (((void *)0));
17327 struct __ecereNameSpace__ecere__com__ClassProperty * classProp = (((void *)0));
17328
17329 if(id && id->_class && id->_class->__anon1.__anon1.name && !strcmp(id->_class->__anon1.__anon1.name, "property"))
17330 exp->__anon1.member.memberType = 1;
17331 if(id && id->_class && type->__anon1._class && !__ecereNameSpace__ecere__com__eClass_IsDerived(type->__anon1._class->__anon1.registered, _class))
17332 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "invalid class specifier %s for object of class %s\n", (((void *)0))), _class->fullName, type->__anon1._class->string);
17333 if(typeKind != 19)
17334 {
17335 if((exp->__anon1.member.memberType == 0 && thisPtr) || exp->__anon1.member.memberType == 3)
17336 {
17337 member = __ecereNameSpace__ecere__com__eClass_FindDataMember(_class, id->string, privateModule, (((void *)0)), (((void *)0)));
17338 if(member && member->_class != (_class->templateClass ? _class->templateClass : _class) && exp->__anon1.member.memberType != 3)
17339 {
17340 prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, id->string, privateModule);
17341 if(prop)
17342 member = (((void *)0));
17343 }
17344 if(!member && !prop)
17345 prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, id->string, privateModule);
17346 if((member && member->_class == (_class->templateClass ? _class->templateClass : _class)) || (prop && prop->_class == (_class->templateClass ? _class->templateClass : _class)))
17347 exp->__anon1.member.thisPtr = 1;
17348 }
17349 else
17350 {
17351 unsigned int useMemberForNonConst = 0;
17352
17353 if(!id->classSym)
17354 {
17355 prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, id->string, (((void *)0)));
17356 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);
17357 if(useMemberForNonConst || !id->_class || !id->_class->__anon1.__anon1.name || strcmp(id->_class->__anon1.__anon1.name, "property"))
17358 member = __ecereNameSpace__ecere__com__eClass_FindDataMember(_class, id->string, (((void *)0)), (((void *)0)), (((void *)0)));
17359 }
17360 if((!prop || useMemberForNonConst) && !member)
17361 {
17362 method = useMemberForNonConst ? (((void *)0)) : __ecereNameSpace__ecere__com__eClass_FindMethod(_class, id->string, (((void *)0)));
17363 if(!method)
17364 {
17365 prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, id->string, privateModule);
17366 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);
17367 if(useMemberForNonConst || !id->_class || !id->_class->__anon1.__anon1.name || strcmp(id->_class->__anon1.__anon1.name, "property"))
17368 member = __ecereNameSpace__ecere__com__eClass_FindDataMember(_class, id->string, privateModule, (((void *)0)), (((void *)0)));
17369 }
17370 }
17371 if(member && prop)
17372 {
17373 if(useMemberForNonConst || (member->_class != prop->_class && !id->_class && __ecereNameSpace__ecere__com__eClass_IsDerived(member->_class, prop->_class)))
17374 prop = (((void *)0));
17375 else
17376 member = (((void *)0));
17377 }
17378 }
17379 }
17380 if(!prop && !member && !method)
17381 method = __ecereNameSpace__ecere__com__eClass_FindMethod(_class, id->string, privateModule);
17382 if(!prop && !member && !method)
17383 {
17384 if(typeKind == 19)
17385 {
17386 classProp = __ecereNameSpace__ecere__com__eClass_FindClassProperty(type->__anon1._class->__anon1.registered, exp->__anon1.member.member->string);
17387 if(classProp)
17388 {
17389 exp->__anon1.member.memberType = 5;
17390 exp->expType = ProcessTypeString(classProp->dataTypeString, 0);
17391 }
17392 else
17393 {
17394 char structName[1024];
17395 struct Identifier * id = exp->__anon1.member.member;
17396 struct Expression * classExp = exp->__anon1.member.exp;
17397
17398 type->refCount++;
17399 FreeType(classExp->expType);
17400 classExp->expType = ProcessTypeString("ecere::com::Class", 0);
17401 strcpy(structName, "__ecereClassData_");
17402 FullClassNameCat(structName, type->__anon1._class->string, 0);
17403 exp->type = 9;
17404 exp->__anon1.member.member = id;
17405 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"))))))));
17406 FreeType(type);
17407 ProcessExpressionType(exp);
17408 return ;
17409 }
17410 }
17411 else
17412 {
17413 struct Symbol * classSym = FindClass(id->string);
17414
17415 if(classSym)
17416 {
17417 struct __ecereNameSpace__ecere__com__Class * convertClass = classSym->__anon1.registered;
17418
17419 if(convertClass)
17420 revConvert = __ecereNameSpace__ecere__com__eClass_FindProperty(convertClass, _class->fullName, privateModule);
17421 }
17422 }
17423 }
17424 if(exp->__anon1.member.exp->destType)
17425 FreeType(exp->__anon1.member.exp->destType);
17426 {
17427 if(method && !method->_class->symbol)
17428 method->_class->symbol = FindClass(method->_class->fullName);
17429 if(prop && !prop->_class->symbol)
17430 prop->_class->symbol = FindClass(prop->_class->fullName);
17431 exp->__anon1.member.exp->destType = __extension__ ({
17432 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
17433
17434 __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;
17435 });
17436 }
17437 if(prop)
17438 {
17439 exp->__anon1.member.memberType = 1;
17440 if(!prop->dataType)
17441 ProcessPropertyType(prop);
17442 exp->expType = prop->dataType;
17443 if(!strcmp(_class->base->fullName, "eda::Row") && !exp->expType->constant && !exp->destType)
17444 {
17445 struct Type * type = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
17446
17447 CopyTypeInto(type, exp->expType);
17448 type->refCount = 1;
17449 type->constant = 1;
17450 exp->expType = type;
17451 }
17452 else if(prop->dataType)
17453 prop->dataType->refCount++;
17454 }
17455 else if(member)
17456 {
17457 if(exp->__anon1.member.exp->expType->classObjectType == 2 && !strcmp(exp->__anon1.member.member->string, "_class"))
17458 {
17459 FreeExpContents(exp);
17460 exp->type = 0;
17461 exp->__anon1.__anon1.identifier = MkIdentifier("class");
17462 ProcessExpressionType(exp);
17463 return ;
17464 }
17465 exp->__anon1.member.memberType = 3;
17466 DeclareStruct(curExternal, _class->fullName, 0, 1);
17467 if(member->_class != _class)
17468 DeclareStruct(curExternal, member->_class->fullName, 0, 1);
17469 if(!member->dataType)
17470 {
17471 struct Context * context = SetupTemplatesContext(_class);
17472
17473 member->dataType = ProcessTypeString(member->dataTypeString, 0);
17474 FinishTemplatesContext(context);
17475 }
17476 exp->expType = member->dataType;
17477 if(member->dataType)
17478 member->dataType->refCount++;
17479 }
17480 else if(revConvert)
17481 {
17482 exp->__anon1.member.memberType = 4;
17483 exp->expType = MkClassType(revConvert->_class->fullName);
17484 }
17485 else if(method)
17486 {
17487 {
17488 exp->__anon1.member.memberType = 2;
17489 }
17490 if(!method->dataType)
17491 ProcessMethodType(method);
17492 exp->expType = __extension__ ({
17493 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
17494
17495 __ecereInstance1->refCount = 1, __ecereInstance1->kind = 16, __ecereInstance1->__anon1.__anon3.method = method, __ecereInstance1;
17496 });
17497 exp->expType->__anon1.__anon3.methodClass = (id && id->_class) ? _class : (((void *)0));
17498 exp->expType->__anon1.__anon3.usedClass = _class;
17499 }
17500 else if(!classProp)
17501 {
17502 if(exp->__anon1.member.exp->expType->classObjectType == 2 && !strcmp(exp->__anon1.member.member->string, "_class"))
17503 {
17504 FreeExpContents(exp);
17505 exp->type = 0;
17506 exp->__anon1.__anon1.identifier = MkIdentifier("class");
17507 FreeType(exp->expType);
17508 exp->expType = MkClassType("ecere::com::Class");
17509 return ;
17510 }
17511 yylloc = exp->__anon1.member.member->loc;
17512 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "couldn't find member %s in class %s\n", (((void *)0))), id->string, _class->fullName);
17513 if(inCompiler)
17514 __ecereNameSpace__ecere__com__eClass_AddDataMember(_class, id->string, "int", 0, 0, 1);
17515 }
17516 if(_class && exp->expType)
17517 {
17518 struct __ecereNameSpace__ecere__com__Class * tClass;
17519
17520 tClass = type->__anon1._class && type->__anon1._class->__anon1.registered ? type->__anon1._class->__anon1.registered : _class;
17521 while(tClass && !tClass->templateClass)
17522 tClass = tClass->base;
17523 if(tClass && exp->expType->kind == 20 && exp->expType->__anon1.templateParameter->type == 0)
17524 {
17525 int id = 0;
17526 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * curParam = (((void *)0));
17527 struct __ecereNameSpace__ecere__com__Class * sClass;
17528
17529 for(sClass = tClass; sClass; sClass = sClass->base)
17530 {
17531 id = 0;
17532 if(sClass->templateClass)
17533 sClass = sClass->templateClass;
17534 for(curParam = sClass->templateParams.first; curParam; curParam = curParam->next)
17535 {
17536 if(curParam->type == 0 && !strcmp(exp->expType->__anon1.templateParameter->identifier->string, curParam->name))
17537 {
17538 for(sClass = sClass->base; sClass; sClass = sClass->base)
17539 id += sClass->templateParams.count;
17540 break;
17541 }
17542 id++;
17543 }
17544 if(curParam)
17545 break;
17546 }
17547 if(curParam && tClass->templateArgs[id].__anon1.__anon1.dataTypeString)
17548 {
17549 struct __ecereNameSpace__ecere__com__ClassTemplateArgument arg = tClass->templateArgs[id];
17550 struct Context * context = SetupTemplatesContext(tClass);
17551 unsigned int constant = exp->expType->constant;
17552
17553 FreeType(exp->expType);
17554 exp->expType = ProcessTypeString(arg.__anon1.__anon1.dataTypeString, 0);
17555 if(exp->expType->kind == 8 && constant)
17556 exp->expType->constant = 1;
17557 else if(exp->expType->kind == 13)
17558 {
17559 struct Type * t = exp->expType->__anon1.type;
17560
17561 while(t->kind == 13)
17562 t = t->__anon1.type;
17563 if(constant)
17564 t->constant = constant;
17565 }
17566 if(exp->expType)
17567 {
17568 if(exp->expType->kind == 21)
17569 {
17570 FreeType(exp->expType);
17571 exp->expType = ReplaceThisClassType(_class);
17572 }
17573 if(tClass->templateClass && (exp->expType->kind != 20 || (!exp->expType->__anon1.templateParameter || (!exp->expType->__anon1.templateParameter->dataTypeString && !exp->expType->__anon1.templateParameter->__anon1.dataType))))
17574 exp->expType->passAsTemplate = 1;
17575 if(!exp->destType)
17576 {
17577 exp->destType = ProcessTypeString(arg.__anon1.__anon1.dataTypeString, 0);
17578 if(exp->destType->kind == 8 && constant)
17579 exp->destType->constant = 1;
17580 else if(exp->destType->kind == 13)
17581 {
17582 struct Type * t = exp->destType->__anon1.type;
17583
17584 while(t->kind == 13)
17585 t = t->__anon1.type;
17586 if(constant)
17587 t->constant = constant;
17588 }
17589 if(exp->destType->kind == 21)
17590 {
17591 FreeType(exp->destType);
17592 exp->destType = ReplaceThisClassType(_class);
17593 }
17594 }
17595 }
17596 FinishTemplatesContext(context);
17597 }
17598 }
17599 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)
17600 {
17601 int id = 0;
17602 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * curParam = (((void *)0));
17603 struct __ecereNameSpace__ecere__com__Class * sClass;
17604
17605 for(sClass = tClass; sClass; sClass = sClass->base)
17606 {
17607 id = 0;
17608 if(sClass->templateClass)
17609 sClass = sClass->templateClass;
17610 for(curParam = sClass->templateParams.first; curParam; curParam = curParam->next)
17611 {
17612 if(curParam->type == 0 && !strcmp(exp->expType->__anon1.type->__anon1.templateParameter->identifier->string, curParam->name))
17613 {
17614 for(sClass = sClass->base; sClass; sClass = sClass->base)
17615 id += sClass->templateParams.count;
17616 break;
17617 }
17618 id++;
17619 }
17620 if(curParam)
17621 break;
17622 }
17623 if(curParam)
17624 {
17625 struct __ecereNameSpace__ecere__com__ClassTemplateArgument arg = tClass->templateArgs[id];
17626 struct Context * context = SetupTemplatesContext(tClass);
17627 struct Type * basicType;
17628
17629 basicType = ProcessTypeString(arg.__anon1.__anon1.dataTypeString, 0);
17630 if(basicType)
17631 {
17632 if(basicType->kind == 21)
17633 {
17634 FreeType(basicType);
17635 basicType = ReplaceThisClassType(_class);
17636 }
17637 FreeType(exp->expType);
17638 exp->expType = __extension__ ({
17639 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
17640
17641 __ecereInstance1->refCount = 1, __ecereInstance1->kind = 13, __ecereInstance1->__anon1.type = basicType, __ecereInstance1;
17642 });
17643 if(!exp->destType)
17644 {
17645 exp->destType = exp->expType;
17646 exp->destType->refCount++;
17647 }
17648 {
17649 struct Expression * newExp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression);
17650 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
17651 struct Declarator * decl;
17652
17653 decl = SpecDeclFromString(arg.__anon1.__anon1.dataTypeString, specs, (((void *)0)));
17654 *newExp = *exp;
17655 if(exp->destType)
17656 exp->destType->refCount++;
17657 if(exp->expType)
17658 exp->expType->refCount++;
17659 exp->type = 11;
17660 exp->__anon1.cast.typeName = MkTypeName(specs, MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), decl));
17661 exp->__anon1.cast.exp = newExp;
17662 }
17663 }
17664 FinishTemplatesContext(context);
17665 }
17666 }
17667 else if(tClass && exp->expType->kind == 8 && exp->expType->__anon1._class && strchr(exp->expType->__anon1._class->string, '<'))
17668 {
17669 struct __ecereNameSpace__ecere__com__Class * expClass = exp->expType->__anon1._class->__anon1.registered;
17670
17671 if(expClass)
17672 {
17673 struct __ecereNameSpace__ecere__com__Class * cClass = (((void *)0));
17674 int p = 0;
17675 int paramCount = 0;
17676 int lastParam = -1;
17677 char templateString[1024];
17678 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * param;
17679
17680 sprintf(templateString, "%s<", expClass->templateClass->fullName);
17681 while(cClass != expClass)
17682 {
17683 struct __ecereNameSpace__ecere__com__Class * sClass;
17684
17685 for(sClass = expClass; sClass && sClass->base != cClass; sClass = sClass->base)
17686 ;
17687 cClass = sClass;
17688 for(param = cClass->templateParams.first; param; param = param->next)
17689 {
17690 struct __ecereNameSpace__ecere__com__Class * cClassCur = (((void *)0));
17691 int cp = 0;
17692 struct __ecereNameSpace__ecere__com__ClassTemplateParameter * paramCur = (((void *)0));
17693 struct __ecereNameSpace__ecere__com__ClassTemplateArgument arg;
17694
17695 while(cClassCur != tClass && !paramCur)
17696 {
17697 struct __ecereNameSpace__ecere__com__Class * sClassCur;
17698
17699 for(sClassCur = tClass; sClassCur && sClassCur->base != cClassCur; sClassCur = sClassCur->base)
17700 ;
17701 cClassCur = sClassCur;
17702 for(paramCur = cClassCur->templateParams.first; paramCur; paramCur = paramCur->next)
17703 {
17704 if(!strcmp(paramCur->name, param->name))
17705 {
17706 break;
17707 }
17708 cp++;
17709 }
17710 }
17711 if(paramCur && paramCur->type == 0)
17712 arg = tClass->templateArgs[cp];
17713 else
17714 arg = expClass->templateArgs[p];
17715 {
17716 char argument[256];
17717
17718 argument[0] = '\0';
17719 switch(param->type)
17720 {
17721 case 2:
17722 {
17723 char expString[1024];
17724 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
17725 struct Declarator * decl = SpecDeclFromString(param->__anon1.dataTypeString, specs, (((void *)0)));
17726 struct Expression * exp;
17727 char * string = PrintHexUInt64(arg.__anon1.expression.__anon1.ui64);
17728
17729 exp = MkExpCast(MkTypeName(specs, decl), MkExpConstant(string));
17730 (__ecereNameSpace__ecere__com__eSystem_Delete(string), string = 0);
17731 ProcessExpressionType(exp);
17732 ComputeExpression(exp);
17733 expString[0] = '\0';
17734 PrintExpression(exp, expString);
17735 strcat(argument, expString);
17736 FreeExpression(exp);
17737 break;
17738 }
17739 case 1:
17740 {
17741 strcat(argument, arg.__anon1.__anon2.__anon1.member->name);
17742 break;
17743 }
17744 case 0:
17745 {
17746 if(arg.__anon1.__anon1.dataTypeString && (!param->defaultArg.__anon1.__anon1.dataTypeString || strcmp(arg.__anon1.__anon1.dataTypeString, param->defaultArg.__anon1.__anon1.dataTypeString)))
17747 strcat(argument, arg.__anon1.__anon1.dataTypeString);
17748 break;
17749 }
17750 }
17751 if(argument[0])
17752 {
17753 if(paramCount)
17754 strcat(templateString, ", ");
17755 if(lastParam != p - 1)
17756 {
17757 strcat(templateString, param->name);
17758 strcat(templateString, " = ");
17759 }
17760 strcat(templateString, argument);
17761 paramCount++;
17762 lastParam = p;
17763 }
17764 }
17765 p++;
17766 }
17767 }
17768 {
17769 int len = strlen(templateString);
17770
17771 if(templateString[len - 1] == '>')
17772 templateString[len++] = ' ';
17773 templateString[len++] = '>';
17774 templateString[len++] = '\0';
17775 }
17776 FreeType(exp->expType);
17777 {
17778 struct Context * context = SetupTemplatesContext(tClass);
17779
17780 exp->expType = ProcessTypeString(templateString, 0);
17781 FinishTemplatesContext(context);
17782 }
17783 }
17784 }
17785 }
17786 }
17787 else
17788 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)");
17789 }
17790 else if(type && (type->kind == 9 || type->kind == 10))
17791 {
17792 struct Type * memberType = exp->__anon1.member.member ? FindMember(type, exp->__anon1.member.member->string) : (((void *)0));
17793
17794 if(memberType)
17795 {
17796 exp->expType = memberType;
17797 if(memberType)
17798 memberType->refCount++;
17799 }
17800 }
17801 else
17802 {
17803 char expString[10240];
17804
17805 expString[0] = '\0';
17806 if(inCompiler)
17807 {
17808 PrintExpression(exp, expString);
17809 __ecereNameSpace__ecere__sys__ChangeCh(expString, '\n', ' ');
17810 }
17811 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "member operator on non-structure type expression %s\n", (((void *)0))), expString);
17812 }
17813 if(exp->expType && exp->expType->kind == 21 && (!exp->destType || exp->destType->kind != 21))
17814 {
17815 if(type && (type->kind == 8 || type->kind == 19 || type->kind == 3 || type->kind == 15))
17816 {
17817 struct Identifier * id = exp->__anon1.member.member;
17818 struct __ecereNameSpace__ecere__com__Class * _class = (id && (!id->_class || id->_class->__anon1.__anon1.name)) ? (id->classSym ? id->classSym->__anon1.registered : (type->__anon1._class ? type->__anon1._class->__anon1.registered : (((void *)0)))) : (((void *)0));
17819
17820 if(_class)
17821 {
17822 FreeType(exp->expType);
17823 exp->expType = ReplaceThisClassType(_class);
17824 }
17825 }
17826 }
17827 yylloc = oldyylloc;
17828 break;
17829 }
17830 case 9:
17831 {
17832 struct Type * destType = exp->destType;
17833
17834 if(exp->__anon1.member.member && exp->__anon1.member.member->_class && exp->__anon1.member.member->_class->__anon1.__anon1.name)
17835 {
17836 exp->__anon1.member.member->classSym = exp->__anon1.member.member->_class->__anon1.__anon1.symbol;
17837 }
17838 exp->__anon1.member.exp = MkExpBrackets(MkListOne(MkExpOp((((void *)0)), '*', exp->__anon1.member.exp)));
17839 exp->type = 8;
17840 if(destType)
17841 destType->count++;
17842 ProcessExpressionType(exp);
17843 if(destType)
17844 destType->count--;
17845 break;
17846 }
17847 case 15:
17848 {
17849 struct Symbol * classSym = exp->__anon1._class->__anon1.__anon1.symbol;
17850
17851 if(classSym && classSym->__anon1.registered)
17852 {
17853 if(classSym->__anon1.registered->type == 5 || (classSym->__anon1.registered->fixed && classSym->__anon1.registered->structSize))
17854 {
17855 char name[1024];
17856 struct __ecereNameSpace__ecere__com__Class * b = classSym->__anon1.registered;
17857
17858 name[0] = '\0';
17859 DeclareStruct(curExternal, classSym->string, 0, 1);
17860 FreeSpecifier(exp->__anon1._class);
17861 FullClassNameCat(name, classSym->string, 0);
17862 if(b->offset == 0)
17863 {
17864 exp->type = 10;
17865 exp->__anon1.typeName = MkTypeName(MkListOne(MkStructOrUnion(3, MkIdentifier(name), (((void *)0)))), (((void *)0)));
17866 }
17867 else
17868 {
17869 struct Expression * e;
17870
17871 exp->type = 4;
17872 if(b->structSize == b->offset)
17873 exp->__anon1.op.exp1 = MkExpConstant("0");
17874 else
17875 exp->__anon1.op.exp1 = MkExpTypeSize(MkTypeName(MkListOne(MkStructOrUnion(3, MkIdentifier(name), (((void *)0)))), (((void *)0))));
17876 exp->__anon1.op.op = '+';
17877 e = exp;
17878 while(b->offset != 0)
17879 {
17880 struct Symbol * sym;
17881 struct Expression * typeSize;
17882
17883 b = b->base;
17884 sym = FindClass(b->fullName);
17885 name[0] = '\0';
17886 DeclareStruct(curExternal, sym->string, 0, 1);
17887 FullClassNameCat(name, sym->string, 0);
17888 if(b->structSize == b->offset)
17889 typeSize = MkExpConstant("0");
17890 else
17891 typeSize = MkExpTypeSize(MkTypeName(MkListOne(MkStructOrUnion(3, MkIdentifier(name), (((void *)0)))), (((void *)0))));
17892 e->__anon1.op.exp2 = b->offset ? MkExpOp(typeSize, '+', (((void *)0))) : typeSize;
17893 e = e->__anon1.op.exp2;
17894 }
17895 }
17896 }
17897 else
17898 {
17899 if(classSym->__anon1.registered->fixed && !classSym->__anon1.registered->structSize)
17900 {
17901 FreeSpecifier(exp->__anon1._class);
17902 exp->__anon1.__anon1.constant = PrintUInt(classSym->__anon1.registered->templateClass ? classSym->__anon1.registered->templateClass->structSize : classSym->__anon1.registered->structSize);
17903 exp->type = 2;
17904 }
17905 else
17906 {
17907 char className[1024];
17908
17909 strcpy(className, "__ecereClass_");
17910 FullClassNameCat(className, classSym->string, 1);
17911 DeclareClass(curExternal, classSym, className);
17912 FreeExpContents(exp);
17913 exp->type = 9;
17914 exp->__anon1.member.exp = MkExpIdentifier(MkIdentifier(className));
17915 exp->__anon1.member.member = MkIdentifier("structSize");
17916 }
17917 }
17918 }
17919 exp->expType = __extension__ ({
17920 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
17921
17922 __ecereInstance1->refCount = 1, __ecereInstance1->kind = 23, __ecereInstance1;
17923 });
17924 break;
17925 }
17926 case 10:
17927 {
17928 struct Type * type = ProcessType(exp->__anon1.typeName->qualifiers, exp->__anon1.typeName->declarator);
17929
17930 exp->expType = __extension__ ({
17931 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
17932
17933 __ecereInstance1->refCount = 1, __ecereInstance1->kind = 23, __ecereInstance1;
17934 });
17935 exp->isConstant = 1;
17936 DeclareType(curExternal, type, 1, 0);
17937 FreeType(type);
17938 break;
17939 }
17940 case 11:
17941 {
17942 struct Type * type = ProcessType(exp->__anon1.cast.typeName->qualifiers, exp->__anon1.cast.typeName->declarator);
17943
17944 type->count = 1;
17945 FreeType(exp->__anon1.cast.exp->destType);
17946 exp->__anon1.cast.exp->destType = type;
17947 type->refCount++;
17948 type->casted = 1;
17949 ProcessExpressionType(exp->__anon1.cast.exp);
17950 type->casted = 0;
17951 type->count = 0;
17952 exp->expType = type;
17953 if(!exp->__anon1.cast.exp->needCast && !NeedCast(exp->__anon1.cast.exp->expType, type))
17954 {
17955 void * prev = exp->prev, * next = exp->next;
17956 struct Type * expType = exp->__anon1.cast.exp->destType;
17957 struct Expression * castExp = exp->__anon1.cast.exp;
17958 struct Type * destType = exp->destType;
17959
17960 if(expType)
17961 expType->refCount++;
17962 FreeType(exp->expType);
17963 FreeTypeName(exp->__anon1.cast.typeName);
17964 *exp = *castExp;
17965 FreeType(exp->expType);
17966 FreeType(exp->destType);
17967 exp->expType = expType;
17968 exp->destType = destType;
17969 ((castExp ? (__ecereClass_Expression->Destructor ? __ecereClass_Expression->Destructor((void *)castExp) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(castExp)) : 0), castExp = 0);
17970 exp->prev = prev;
17971 exp->next = next;
17972 }
17973 else
17974 {
17975 exp->isConstant = exp->__anon1.cast.exp->isConstant;
17976 }
17977 break;
17978 }
17979 case 33:
17980 {
17981 struct Type * type = ProcessType(exp->__anon1.initializer.typeName->qualifiers, exp->__anon1.initializer.typeName->declarator);
17982
17983 exp->expType = type;
17984 break;
17985 }
17986 case 34:
17987 {
17988 struct Type * type = ProcessType(exp->__anon1.vaArg.typeName->qualifiers, exp->__anon1.vaArg.typeName->declarator);
17989
17990 ProcessExpressionType(exp->__anon1.vaArg.exp);
17991 exp->expType = type;
17992 break;
17993 }
17994 case 12:
17995 {
17996 struct Expression * e;
17997 struct Type * t = exp->destType;
17998
17999 if(t && !exp->destType->casted)
18000 {
18001 t = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
18002 CopyTypeInto(t, exp->destType);
18003 t->count = 0;
18004 }
18005 else if(t)
18006 t->refCount++;
18007 exp->isConstant = 1;
18008 FreeType(exp->__anon1.cond.cond->destType);
18009 exp->__anon1.cond.cond->destType = MkClassType("bool");
18010 exp->__anon1.cond.cond->destType->truth = 1;
18011 ProcessExpressionType(exp->__anon1.cond.cond);
18012 if(!exp->__anon1.cond.cond->isConstant)
18013 exp->isConstant = 0;
18014 for(e = (*exp->__anon1.cond.exp).first; e; e = e->next)
18015 {
18016 if(!e->next)
18017 {
18018 FreeType(e->destType);
18019 e->destType = t;
18020 if(e->destType)
18021 e->destType->refCount++;
18022 }
18023 ProcessExpressionType(e);
18024 if(!e->next)
18025 {
18026 exp->expType = e->expType;
18027 if(e->expType)
18028 e->expType->refCount++;
18029 }
18030 if(!e->isConstant)
18031 exp->isConstant = 0;
18032 }
18033 FreeType(exp->__anon1.cond.elseExp->destType);
18034 exp->__anon1.cond.elseExp->destType = t ? t : exp->expType;
18035 if(exp->__anon1.cond.elseExp->destType)
18036 exp->__anon1.cond.elseExp->destType->refCount++;
18037 ProcessExpressionType(exp->__anon1.cond.elseExp);
18038 if(!exp->__anon1.cond.elseExp->isConstant)
18039 exp->isConstant = 0;
18040 FreeType(t);
18041 break;
18042 }
18043 case 23:
18044 {
18045 if(exp->__anon1.compound && exp->__anon1.compound->__anon1.compound.statements && (*exp->__anon1.compound->__anon1.compound.statements).last)
18046 {
18047 struct Statement * last = (*exp->__anon1.compound->__anon1.compound.statements).last;
18048
18049 if(last->type == 3 && last->__anon1.expressions && (*last->__anon1.expressions).last)
18050 {
18051 ((struct Expression *)(*last->__anon1.expressions).last)->destType = exp->destType;
18052 if(exp->destType)
18053 exp->destType->refCount++;
18054 }
18055 ProcessStatement(exp->__anon1.compound);
18056 exp->expType = (last->__anon1.expressions && (*last->__anon1.expressions).last) ? ((struct Expression *)(*last->__anon1.expressions).last)->expType : (((void *)0));
18057 if(exp->expType)
18058 exp->expType->refCount++;
18059 }
18060 break;
18061 }
18062 case 24:
18063 {
18064 struct Specifier * spec = (*exp->__anon1._classExp.specifiers).first;
18065
18066 if(spec && spec->type == 1)
18067 {
18068 exp->expType = MkClassType(spec->__anon1.__anon1.name);
18069 exp->expType->kind = 19;
18070 exp->byReference = 1;
18071 }
18072 else
18073 {
18074 exp->expType = MkClassType("ecere::com::Class");
18075 exp->byReference = 1;
18076 }
18077 break;
18078 }
18079 case 25:
18080 {
18081 struct __ecereNameSpace__ecere__com__Class * _class = thisClass ? thisClass : currentClass;
18082
18083 if(_class)
18084 {
18085 struct Identifier * id = exp->__anon1.classData.id;
18086 char structName[1024];
18087 struct Expression * classExp;
18088
18089 strcpy(structName, "__ecereClassData_");
18090 FullClassNameCat(structName, _class->fullName, 0);
18091 exp->type = 9;
18092 exp->__anon1.member.member = id;
18093 if(curCompound && FindSymbol("this", curContext, curCompound->__anon1.compound.context, 0, 0))
18094 classExp = MkExpMember(MkExpIdentifier(MkIdentifier("this")), MkIdentifier("_class"));
18095 else
18096 classExp = MkExpIdentifier(MkIdentifier("class"));
18097 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"))))))));
18098 ProcessExpressionType(exp);
18099 return ;
18100 }
18101 break;
18102 }
18103 case 35:
18104 {
18105 struct Type * type = (((void *)0));
18106 const char * typeString = (((void *)0));
18107 char typeStringBuf[1024];
18108
18109 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))
18110 {
18111 struct __ecereNameSpace__ecere__com__Class * templateClass = exp->destType->__anon1._class->__anon1.registered;
18112
18113 typeString = templateClass->templateArgs[2].__anon1.__anon1.dataTypeString;
18114 }
18115 else if(exp->__anon1.list)
18116 {
18117 struct Expression * e;
18118
18119 for(e = (*exp->__anon1.list).first; e; e = e->next)
18120 {
18121 ProcessExpressionType(e);
18122 if(e->expType)
18123 {
18124 if(!type)
18125 {
18126 type = e->expType;
18127 type->refCount++;
18128 }
18129 else
18130 {
18131 if(!MatchTypeExpression(e, type, (((void *)0)), 0, 1))
18132 {
18133 FreeType(type);
18134 type = e->expType;
18135 e->expType = (((void *)0));
18136 e = (*exp->__anon1.list).first;
18137 ProcessExpressionType(e);
18138 if(e->expType)
18139 {
18140 if(!MatchTypeExpression(e, type, (((void *)0)), 0, 1))
18141 {
18142 FreeType(e->expType);
18143 e->expType = (((void *)0));
18144 FreeType(type);
18145 type = (((void *)0));
18146 break;
18147 }
18148 }
18149 }
18150 }
18151 if(e->expType)
18152 {
18153 FreeType(e->expType);
18154 e->expType = (((void *)0));
18155 }
18156 }
18157 }
18158 if(type)
18159 {
18160 typeStringBuf[0] = '\0';
18161 PrintTypeNoConst(type, typeStringBuf, 0, 1);
18162 typeString = typeStringBuf;
18163 FreeType(type);
18164 type = (((void *)0));
18165 }
18166 }
18167 if(typeString)
18168 {
18169 char templateString[1024];
18170 struct __ecereNameSpace__ecere__sys__OldList * initializers = MkList();
18171 struct __ecereNameSpace__ecere__sys__OldList * structInitializers = MkList();
18172 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
18173 struct Expression * expExt;
18174 struct Declarator * decl = SpecDeclFromString(typeString, specs, (((void *)0)));
18175
18176 sprintf(templateString, "Container<%s>", typeString);
18177 if(exp->__anon1.list)
18178 {
18179 struct Expression * e;
18180
18181 type = ProcessTypeString(typeString, 0);
18182 while((e = (*exp->__anon1.list).first))
18183 {
18184 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove((&*exp->__anon1.list), e);
18185 e->destType = type;
18186 type->refCount++;
18187 ProcessExpressionType(e);
18188 ListAdd(initializers, MkInitializerAssignment(e));
18189 }
18190 FreeType(type);
18191 (__ecereNameSpace__ecere__com__eSystem_Delete(exp->__anon1.list), exp->__anon1.list = 0);
18192 }
18193 DeclareStruct(curExternal, "ecere::com::BuiltInContainer", 0, 1);
18194 ListAdd(structInitializers, MkInitializerAssignment(MkExpMember(MkExpClass(MkListOne(MkSpecifierName("BuiltInContainer")), (((void *)0))), MkIdentifier("_vTbl"))));
18195 ProcessExpressionType(((struct Initializer *)(*structInitializers).last)->__anon1.exp);
18196 ListAdd(structInitializers, MkInitializerAssignment(MkExpClass(MkListOne(MkSpecifierName("BuiltInContainer")), (((void *)0)))));
18197 ProcessExpressionType(((struct Initializer *)(*structInitializers).last)->__anon1.exp);
18198 ListAdd(structInitializers, MkInitializerAssignment(MkExpConstant("0")));
18199 ProcessExpressionType(((struct Initializer *)(*structInitializers).last)->__anon1.exp);
18200 ListAdd(structInitializers, MkInitializerAssignment(MkExpExtensionInitializer(MkTypeName(specs, MkDeclaratorArray(decl, (((void *)0)))), MkInitializerList(initializers))));
18201 ProcessExpressionType(((struct Initializer *)(*structInitializers).last)->__anon1.exp);
18202 ListAdd(structInitializers, MkInitializerAssignment(__extension__ ({
18203 struct Expression * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression);
18204
18205 __ecereInstance1->type = 2, __ecereInstance1->__anon1.__anon1.constant = __ecereNameSpace__ecere__com__PrintString(__ecereClass_int, (void *)&(*initializers).count, (void *)0), __ecereInstance1;
18206 })));
18207 ProcessExpressionType(((struct Initializer *)(*structInitializers).last)->__anon1.exp);
18208 ListAdd(structInitializers, MkInitializerAssignment(MkExpClass(CopyList(specs, (void *)(CopySpecifier)), CopyDeclarator(decl))));
18209 ProcessExpressionType(((struct Initializer *)(*structInitializers).last)->__anon1.exp);
18210 exp->expType = ProcessTypeString(templateString, 0);
18211 exp->type = 5;
18212 exp->__anon1.list = MkListOne(MkExpCast(MkTypeName(MkListOne(MkSpecifierName(templateString)), (((void *)0))), MkExpOp((((void *)0)), '&', expExt = MkExpExtensionInitializer(MkTypeName(MkListOne(MkSpecifierName("BuiltInContainer")), (((void *)0))), MkInitializerList(structInitializers)))));
18213 ProcessExpressionType(expExt);
18214 }
18215 else
18216 {
18217 exp->expType = ProcessTypeString("Container", 0);
18218 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Couldn't determine type of array elements\n", (((void *)0))));
18219 }
18220 break;
18221 }
18222 }
18223 if(exp->expType && exp->expType->kind == 21 && thisClass && (!exp->destType || exp->destType->kind != 21))
18224 {
18225 FreeType(exp->expType);
18226 exp->expType = ReplaceThisClassType(thisClass);
18227 }
18228 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)
18229 {
18230 struct Symbol * symbol = FindSymbol(exp->expType->__anon1.__anon1.enumName, curContext, globalContext, 1, 0);
18231
18232 if(symbol)
18233 {
18234 if(exp->expType->kind != 15)
18235 {
18236 struct Type * member;
18237 char * enumName = __ecereNameSpace__ecere__sys__CopyString(exp->expType->__anon1.__anon1.enumName);
18238
18239 FreeType(exp->expType);
18240 exp->expType = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
18241 exp->expType->kind = symbol->type->kind;
18242 exp->expType->refCount++;
18243 exp->expType->__anon1.__anon1.enumName = enumName;
18244 exp->expType->__anon1.__anon1.members = symbol->type->__anon1.__anon1.members;
18245 for(member = symbol->type->__anon1.__anon1.members.first; member; member = member->next)
18246 member->refCount++;
18247 }
18248 else
18249 {
18250 struct __ecereNameSpace__ecere__sys__NamedLink64 * member;
18251
18252 for(member = symbol->type->__anon1.__anon1.members.first; member; member = member->next)
18253 {
18254 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);
18255
18256 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(&exp->expType->__anon1.__anon1.members, value);
18257 }
18258 }
18259 }
18260 }
18261 yylloc = exp->loc;
18262 if(exp->destType && (exp->destType->kind == 18))
18263 ;
18264 else if(exp->destType && !exp->destType->keepCast)
18265 {
18266 if(!exp->needTemplateCast && exp->expType && (exp->expType->kind == 20 || exp->expType->passAsTemplate))
18267 exp->needTemplateCast = 1;
18268 if(exp->destType->kind == 0)
18269 ;
18270 else if(!CheckExpressionType(exp, exp->destType, 0, !exp->destType->casted))
18271 {
18272 unsigned int invalidCast = 0;
18273
18274 if(inCompiler && exp->destType->count && exp->expType)
18275 {
18276 struct __ecereNameSpace__ecere__com__Class * c1 = (exp->expType->kind == 8 && exp->expType->__anon1._class) ? exp->expType->__anon1._class->__anon1.registered : (((void *)0));
18277 struct __ecereNameSpace__ecere__com__Class * c2 = (exp->destType->kind == 8 && exp->destType->__anon1._class) ? exp->destType->__anon1._class->__anon1.registered : (((void *)0));
18278
18279 if(c1 && c1->type != 1)
18280 c1 = (((void *)0));
18281 if(c2 && c2->type != 1)
18282 c2 = (((void *)0));
18283 if((c1 && !exp->expType->byReference && !c2 && !__ecereProp_Type_Get_isPointerType(exp->destType)) || (c2 && !exp->destType->byReference && !c1 && !__ecereProp_Type_Get_isPointerType(exp->expType)))
18284 invalidCast = 1;
18285 }
18286 if(!exp->destType->count || unresolved || invalidCast)
18287 {
18288 if(!exp->expType)
18289 {
18290 yylloc = exp->loc;
18291 if(exp->destType->kind != 14)
18292 {
18293 char type2[1024];
18294
18295 type2[0] = '\0';
18296 if(inCompiler)
18297 {
18298 char expString[10240];
18299
18300 expString[0] = '\0';
18301 PrintType(exp->destType, type2, 0, 1);
18302 if(inCompiler)
18303 {
18304 PrintExpression(exp, expString);
18305 __ecereNameSpace__ecere__sys__ChangeCh(expString, '\n', ' ');
18306 }
18307 if(unresolved)
18308 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "unresolved identifier %s; expected %s\n", (((void *)0))), expString, type2);
18309 else if(exp->type != 16)
18310 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "couldn't determine type of %s; expected %s\n", (((void *)0))), expString, type2);
18311 }
18312 }
18313 else
18314 {
18315 char expString[10240];
18316
18317 expString[0] = '\0';
18318 if(inCompiler)
18319 {
18320 PrintExpression(exp, expString);
18321 __ecereNameSpace__ecere__sys__ChangeCh(expString, '\n', ' ');
18322 }
18323 if(unresolved)
18324 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "unresolved identifier %s\n", (((void *)0))), expString);
18325 else if(exp->type != 16)
18326 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "couldn't determine type of %s\n", (((void *)0))), expString);
18327 }
18328 }
18329 else
18330 {
18331 char type1[1024];
18332 char type2[1024];
18333
18334 type1[0] = '\0';
18335 type2[0] = '\0';
18336 if(inCompiler)
18337 {
18338 PrintType(exp->expType, type1, 0, 1);
18339 PrintType(exp->destType, type2, 0, 1);
18340 }
18341 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)))
18342 ;
18343 else
18344 {
18345 char expString[10240];
18346
18347 expString[0] = '\0';
18348 if(inCompiler)
18349 {
18350 PrintExpression(exp, expString);
18351 __ecereNameSpace__ecere__sys__ChangeCh(expString, '\n', ' ');
18352 }
18353 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")))
18354 {
18355 if(invalidCast)
18356 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "incompatible expression %s (%s); expected %s\n", (((void *)0))), expString, type1, type2);
18357 else
18358 Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "incompatible expression %s (%s); expected %s\n", (((void *)0))), expString, type1, type2);
18359 }
18360 if(!inCompiler)
18361 {
18362 FreeType(exp->expType);
18363 exp->destType->refCount++;
18364 exp->expType = exp->destType;
18365 }
18366 }
18367 }
18368 }
18369 }
18370 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))
18371 {
18372 struct Expression * nbExp = GetNonBracketsExp(exp);
18373
18374 if(nbExp->type != 11 || !IsVoidPtrCast(nbExp->__anon1.cast.typeName))
18375 {
18376 struct Expression * e = MoveExpContents(exp);
18377
18378 exp->__anon1.cast.exp = MkExpBrackets(MkListOne(e));
18379 exp->type = 11;
18380 exp->__anon1.cast.exp->destType = exp->destType;
18381 if(exp->destType)
18382 exp->destType->refCount++;
18383 exp->__anon1.cast.typeName = MkTypeName(MkListOne(MkSpecifier(VOID)), MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), (((void *)0))));
18384 }
18385 }
18386 }
18387 else if(unresolved)
18388 {
18389 if(exp->__anon1.__anon1.identifier->_class && exp->__anon1.__anon1.identifier->_class->__anon1.__anon1.name)
18390 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);
18391 else if(exp->__anon1.__anon1.identifier->string && exp->__anon1.__anon1.identifier->string[0])
18392 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "unresolved identifier %s\n", (((void *)0))), exp->__anon1.__anon1.identifier->string);
18393 }
18394 else if(!exp->expType && exp->type != 16)
18395 {
18396 char expString[10240];
18397
18398 expString[0] = '\0';
18399 if(inCompiler)
18400 {
18401 PrintExpression(exp, expString);
18402 __ecereNameSpace__ecere__sys__ChangeCh(expString, '\n', ' ');
18403 }
18404 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "couldn't determine type of %s\n", (((void *)0))), expString);
18405 }
18406 if(inCompiler)
18407 ApplyAnyObjectLogic(exp);
18408 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)))
18409 {
18410 exp->byReference = 1;
18411 }
18412 yylloc = oldyylloc;
18413 }
18414
18415 static void ProcessFunction(struct FunctionDefinition * function)
18416 {
18417 struct Identifier * id = GetDeclId(function->declarator);
18418 struct Symbol * symbol = function->declarator ? function->declarator->symbol : (((void *)0));
18419 struct Type * type = symbol ? symbol->type : (((void *)0));
18420 struct __ecereNameSpace__ecere__com__Class * oldThisClass = thisClass;
18421 struct Context * oldTopContext = topContext;
18422
18423 yylloc = function->loc;
18424 if(type && type->__anon1.__anon2.thisClass)
18425 {
18426 struct Symbol * classSym = type->__anon1.__anon2.thisClass;
18427 struct __ecereNameSpace__ecere__com__Class * _class = type->__anon1.__anon2.thisClass->__anon1.registered;
18428 char className[1024];
18429 char structName[1024];
18430 struct Declarator * funcDecl;
18431 struct Symbol * thisSymbol;
18432 unsigned int typedObject = 0;
18433
18434 if(_class && !_class->base)
18435 {
18436 _class = currentClass;
18437 if(_class && !_class->symbol)
18438 _class->symbol = FindClass(_class->fullName);
18439 classSym = _class ? _class->symbol : (((void *)0));
18440 typedObject = 1;
18441 }
18442 thisClass = _class;
18443 if(inCompiler && _class)
18444 {
18445 if(type->kind == 11)
18446 {
18447 if(symbol->type->__anon1.__anon2.params.count == 1 && ((struct Type *)symbol->type->__anon1.__anon2.params.first)->kind == 0)
18448 {
18449 struct Type * param = symbol->type->__anon1.__anon2.params.first;
18450
18451 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove(&symbol->type->__anon1.__anon2.params, param);
18452 FreeType(param);
18453 }
18454 if(type->classObjectType != 1)
18455 {
18456 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert(&symbol->type->__anon1.__anon2.params, (((void *)0)), MkClassType(_class->fullName));
18457 symbol->type->__anon1.__anon2.staticMethod = 1;
18458 symbol->type->__anon1.__anon2.thisClass = (((void *)0));
18459 symbol->type->extraParam = 0;
18460 }
18461 }
18462 strcpy(className, "__ecereClass_");
18463 FullClassNameCat(className, _class->fullName, 1);
18464 structName[0] = (char)0;
18465 FullClassNameCat(structName, _class->fullName, 0);
18466 funcDecl = GetFuncDecl(function->declarator);
18467 if(funcDecl)
18468 {
18469 if(funcDecl->__anon1.function.parameters && (*funcDecl->__anon1.function.parameters).count == 1)
18470 {
18471 struct TypeName * param = (*funcDecl->__anon1.function.parameters).first;
18472
18473 if(param->qualifiers && (*param->qualifiers).count == 1 && ((struct Specifier *)(*param->qualifiers).first)->__anon1.specifier == VOID && !param->declarator)
18474 {
18475 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove((&*funcDecl->__anon1.function.parameters), param);
18476 FreeTypeName(param);
18477 }
18478 }
18479 if(!function->propertyNoThis)
18480 {
18481 struct TypeName * thisParam = (((void *)0));
18482
18483 if(type->classObjectType != 1)
18484 {
18485 thisParam = QMkClass(_class->fullName, MkDeclaratorIdentifier(MkIdentifier("this")));
18486 if(!funcDecl->__anon1.function.parameters)
18487 funcDecl->__anon1.function.parameters = MkList();
18488 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*funcDecl->__anon1.function.parameters), (((void *)0)), thisParam);
18489 }
18490 if(typedObject)
18491 {
18492 if(type->classObjectType != 1)
18493 {
18494 if(type->byReference || _class->type == 3 || _class->type == 1000 || _class->type == 4 || _class->type == 2)
18495 thisParam->declarator = MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), thisParam->declarator);
18496 }
18497 thisParam = __extension__ ({
18498 struct TypeName * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_TypeName);
18499
18500 __ecereInstance1->declarator = MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), MkDeclaratorIdentifier(MkIdentifier("class"))), __ecereInstance1->qualifiers = MkListOne(MkStructOrUnion(3, MkIdentifier("__ecereNameSpace__ecere__com__Class"), (((void *)0)))), __ecereInstance1;
18501 });
18502 DeclareStruct(curExternal, "ecere::com::Class", 0, 1);
18503 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*funcDecl->__anon1.function.parameters), (((void *)0)), thisParam);
18504 }
18505 }
18506 }
18507 if(symbol && symbol->__anon2.__anon1.pointerExternal && symbol->__anon2.__anon1.pointerExternal->type == 1)
18508 {
18509 struct InitDeclarator * initDecl = (*symbol->__anon2.__anon1.pointerExternal->__anon1.declaration->__anon1.__anon1.declarators).first;
18510
18511 funcDecl = GetFuncDecl(initDecl->declarator);
18512 if(funcDecl)
18513 {
18514 if(funcDecl->__anon1.function.parameters && (*funcDecl->__anon1.function.parameters).count == 1)
18515 {
18516 struct TypeName * param = (*funcDecl->__anon1.function.parameters).first;
18517
18518 if(param->qualifiers && (*param->qualifiers).count == 1 && ((struct Specifier *)(*param->qualifiers).first)->__anon1.specifier == VOID && !param->declarator)
18519 {
18520 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove((&*funcDecl->__anon1.function.parameters), param);
18521 FreeTypeName(param);
18522 }
18523 }
18524 if(type->classObjectType != 1)
18525 {
18526 if((_class->type != 2 && _class->type != 3 && _class->type != 4) || function != (struct FunctionDefinition *)symbol->__anon2.__anon2.externalSet)
18527 {
18528 struct TypeName * thisParam = QMkClass(_class->fullName, MkDeclaratorIdentifier(MkIdentifier("this")));
18529
18530 if(!funcDecl->__anon1.function.parameters)
18531 funcDecl->__anon1.function.parameters = MkList();
18532 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*funcDecl->__anon1.function.parameters), (((void *)0)), thisParam);
18533 }
18534 }
18535 }
18536 }
18537 }
18538 if(function->body)
18539 {
18540 if(type->classObjectType != 1)
18541 {
18542 thisSymbol = __extension__ ({
18543 struct Symbol * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Symbol);
18544
18545 __ecereInstance1->string = __ecereNameSpace__ecere__sys__CopyString("this"), __ecereInstance1->type = classSym ? MkClassType(classSym->string) : (((void *)0)), __ecereInstance1;
18546 });
18547 __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Add(&function->body->__anon1.compound.context->symbols, (struct __ecereNameSpace__ecere__sys__BTNode *)thisSymbol);
18548 if(typedObject && thisSymbol->type)
18549 {
18550 thisSymbol->type->classObjectType = 2;
18551 thisSymbol->type->byReference = type->byReference;
18552 thisSymbol->type->typedByReference = type->byReference;
18553 }
18554 }
18555 }
18556 if(inCompiler && _class && _class->type == 0 && type->classObjectType != 1)
18557 {
18558 struct __ecereNameSpace__ecere__com__DataMember * member = (((void *)0));
18559
18560 {
18561 struct __ecereNameSpace__ecere__com__Class * base;
18562
18563 for(base = _class; base && base->type != 1000; base = base->next)
18564 {
18565 for(member = base->membersAndProperties.first; member; member = member->next)
18566 if(!member->isProperty)
18567 break;
18568 if(member)
18569 break;
18570 }
18571 }
18572 for(member = _class->membersAndProperties.first; member; member = member->next)
18573 if(!member->isProperty)
18574 break;
18575 if(member)
18576 {
18577 char pointerName[1024];
18578 struct Declaration * decl;
18579 struct Initializer * initializer;
18580 struct Expression * exp, * bytePtr;
18581
18582 strcpy(pointerName, "__ecerePointer_");
18583 FullClassNameCat(pointerName, _class->fullName, 0);
18584 {
18585 char className[1024];
18586
18587 strcpy(className, "__ecereClass_");
18588 FullClassNameCat(className, classSym->string, 1);
18589 DeclareClass(curExternal, classSym, className);
18590 }
18591 bytePtr = QBrackets(MkExpCast(QMkType("char", QMkPtrDecl((((void *)0)))), QMkExpId("this")));
18592 if(_class->fixed)
18593 {
18594 struct Expression * e;
18595
18596 if(_class->offset && _class->offset == _class->base->structSize)
18597 {
18598 e = MkExpClassSize(MkSpecifierName(_class->base->fullName));
18599 ProcessExpressionType(e);
18600 }
18601 else
18602 {
18603 char string[256];
18604
18605 sprintf(string, "%d", _class->offset);
18606 e = MkExpConstant(string);
18607 }
18608 exp = QBrackets(MkExpOp(bytePtr, '+', e));
18609 }
18610 else
18611 {
18612 exp = QBrackets(MkExpOp(bytePtr, '+', MkExpPointer(QMkExpId(className), MkIdentifier("offset"))));
18613 }
18614 exp = QBrackets(QMkExpCond(QMkExpId("this"), exp, MkExpConstant("0")));
18615 exp->expType = __extension__ ({
18616 struct Type * __ecereInstance2 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
18617
18618 __ecereInstance2->refCount = 1, __ecereInstance2->kind = 13, __ecereInstance2->__anon1.type = __extension__ ({
18619 struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
18620
18621 __ecereInstance1->refCount = 1, __ecereInstance1->kind = 0, __ecereInstance1;
18622 }), __ecereInstance2;
18623 });
18624 if(function->body)
18625 {
18626 yylloc = function->body->loc;
18627 initializer = MkInitializerAssignment(MkExpCast(MkTypeName(MkListOne(MkStructOrUnion(3, MkIdentifier(structName), (((void *)0)))), MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), (((void *)0)))), exp));
18628 {
18629 struct Context * prevContext = curContext;
18630 struct __ecereNameSpace__ecere__sys__OldList * list;
18631
18632 curContext = function->body->__anon1.compound.context;
18633 decl = MkDeclaration((list = MkListOne(MkStructOrUnion(3, MkIdentifier(structName), (((void *)0))))), MkListOne(MkInitDeclarator(QMkPtrDecl(pointerName), initializer)));
18634 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*list), (((void *)0)), MkSpecifierExtended(MkExtDeclAttrib(MkAttrib(ATTRIB, MkListOne(MkAttribute(__ecereNameSpace__ecere__sys__CopyString("unused"), (((void *)0))))))));
18635 curContext = prevContext;
18636 }
18637 decl->symbol = (((void *)0));
18638 if(!function->body->__anon1.compound.declarations)
18639 function->body->__anon1.compound.declarations = MkList();
18640 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*function->body->__anon1.compound.declarations), (((void *)0)), decl);
18641 }
18642 }
18643 }
18644 }
18645 else
18646 thisClass = (((void *)0));
18647 if(id)
18648 {
18649 FreeSpecifier(id->_class);
18650 id->_class = (((void *)0));
18651 if(symbol && symbol->__anon2.__anon1.pointerExternal && symbol->__anon2.__anon1.pointerExternal->type == 1)
18652 {
18653 struct InitDeclarator * initDecl = (*symbol->__anon2.__anon1.pointerExternal->__anon1.declaration->__anon1.__anon1.declarators).first;
18654
18655 id = GetDeclId(initDecl->declarator);
18656 FreeSpecifier(id->_class);
18657 id->_class = (((void *)0));
18658 }
18659 }
18660 if(function->body)
18661 topContext = function->body->__anon1.compound.context;
18662 {
18663 struct FunctionDefinition * oldFunction = curFunction;
18664
18665 curFunction = function;
18666 if(function->body)
18667 ProcessStatement(function->body);
18668 if(inCompiler && function->propSet && !function->propSet->fireWatchersDone)
18669 {
18670 struct Statement * prevCompound = curCompound;
18671 struct Context * prevContext = curContext;
18672 struct Statement * fireWatchers = MkFireWatchersStmt((((void *)0)), (((void *)0)));
18673
18674 if(!function->body->__anon1.compound.statements)
18675 function->body->__anon1.compound.statements = MkList();
18676 ListAdd(function->body->__anon1.compound.statements, fireWatchers);
18677 curCompound = function->body;
18678 curContext = function->body->__anon1.compound.context;
18679 ProcessStatement(fireWatchers);
18680 curContext = prevContext;
18681 curCompound = prevCompound;
18682 }
18683 curFunction = oldFunction;
18684 }
18685 if(function->declarator)
18686 {
18687 ProcessDeclarator(function->declarator, 1);
18688 }
18689 topContext = oldTopContext;
18690 thisClass = oldThisClass;
18691 }
18692
18693 static void ProcessClass(struct __ecereNameSpace__ecere__sys__OldList * definitions, struct Symbol * symbol)
18694 {
18695 struct ClassDef * def;
18696 struct External * external = curExternal;
18697 struct __ecereNameSpace__ecere__com__Class * regClass = symbol ? symbol->__anon1.registered : (((void *)0));
18698
18699 for(def = definitions->first; def; def = def->next)
18700 {
18701 if(def->type == 0)
18702 {
18703 if(def->__anon1.function->declarator)
18704 curExternal = def->__anon1.function->declarator->symbol->__anon2.__anon1.pointerExternal;
18705 else
18706 curExternal = external;
18707 ProcessFunction((struct FunctionDefinition *)def->__anon1.function);
18708 }
18709 else if(def->type == 2)
18710 {
18711 if(def->__anon1.decl->type == 2)
18712 {
18713 thisClass = regClass;
18714 ProcessInstantiationType(def->__anon1.decl->__anon1.inst);
18715 thisClass = (((void *)0));
18716 }
18717 else
18718 {
18719 struct __ecereNameSpace__ecere__com__Class * backThisClass = thisClass;
18720
18721 if(regClass)
18722 thisClass = regClass;
18723 ProcessDeclaration(def->__anon1.decl);
18724 thisClass = backThisClass;
18725 }
18726 }
18727 else if(def->type == 1 && def->__anon1.defProperties)
18728 {
18729 struct MemberInit * defProperty;
18730 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);
18731
18732 __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Add(&globalContext->symbols, (struct __ecereNameSpace__ecere__sys__BTNode *)thisSymbol);
18733 for(defProperty = (*def->__anon1.defProperties).first; defProperty; defProperty = defProperty->next)
18734 {
18735 thisClass = regClass;
18736 ProcessMemberInitData(defProperty, regClass, (((void *)0)), (((void *)0)), (((void *)0)), (((void *)0)));
18737 thisClass = (((void *)0));
18738 }
18739 __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Remove(&globalContext->symbols, (struct __ecereNameSpace__ecere__sys__BTNode *)thisSymbol);
18740 FreeSymbol(thisSymbol);
18741 }
18742 else if(def->type == 3 && def->__anon1.propertyDef)
18743 {
18744 struct PropertyDef * prop = def->__anon1.propertyDef;
18745
18746 thisClass = regClass;
18747 if(prop->setStmt)
18748 {
18749 if(regClass)
18750 {
18751 struct Symbol * thisSymbol = (thisSymbol = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Symbol), thisSymbol->string = __ecereNameSpace__ecere__sys__CopyString("this"), thisSymbol->type = MkClassType(regClass->fullName), thisSymbol);
18752
18753 __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Add(&prop->setStmt->__anon1.compound.context->symbols, (struct __ecereNameSpace__ecere__sys__BTNode *)thisSymbol);
18754 }
18755 curExternal = prop->symbol ? prop->symbol->__anon2.__anon2.externalSet : (((void *)0));
18756 ProcessStatement(prop->setStmt);
18757 }
18758 if(prop->getStmt)
18759 {
18760 if(regClass)
18761 {
18762 struct Symbol * thisSymbol = (thisSymbol = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Symbol), thisSymbol->string = __ecereNameSpace__ecere__sys__CopyString("this"), thisSymbol->type = MkClassType(regClass->fullName), thisSymbol);
18763
18764 __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Add(&prop->getStmt->__anon1.compound.context->symbols, (struct __ecereNameSpace__ecere__sys__BTNode *)thisSymbol);
18765 }
18766 curExternal = prop->symbol ? prop->symbol->__anon2.__anon2.externalGet : (((void *)0));
18767 ProcessStatement(prop->getStmt);
18768 }
18769 if(prop->issetStmt)
18770 {
18771 if(regClass)
18772 {
18773 struct Symbol * thisSymbol = (thisSymbol = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Symbol), thisSymbol->string = __ecereNameSpace__ecere__sys__CopyString("this"), thisSymbol->type = MkClassType(regClass->fullName), thisSymbol);
18774
18775 __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Add(&prop->issetStmt->__anon1.compound.context->symbols, (struct __ecereNameSpace__ecere__sys__BTNode *)thisSymbol);
18776 }
18777 curExternal = prop->symbol ? prop->symbol->__anon2.__anon2.externalIsSet : (((void *)0));
18778 ProcessStatement(prop->issetStmt);
18779 }
18780 thisClass = (((void *)0));
18781 }
18782 else if(def->type == 4 && def->__anon1.propertyWatch)
18783 {
18784 struct PropertyWatch * propertyWatch = def->__anon1.propertyWatch;
18785
18786 thisClass = regClass;
18787 if(propertyWatch->compound)
18788 {
18789 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);
18790
18791 __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Add(&propertyWatch->compound->__anon1.compound.context->symbols, (struct __ecereNameSpace__ecere__sys__BTNode *)thisSymbol);
18792 curExternal = (((void *)0));
18793 ProcessStatement(propertyWatch->compound);
18794 }
18795 thisClass = (((void *)0));
18796 }
18797 }
18798 }
18799
18800 static void ProcessSpecifier(struct Specifier * spec, unsigned int declareStruct)
18801 {
18802 switch(spec->type)
18803 {
18804 case 0:
18805 {
18806 if(spec->__anon1.specifier == THISCLASS)
18807 {
18808 if(thisClass)
18809 {
18810 spec->type = 1;
18811 spec->__anon1.__anon1.name = ReplaceThisClass(thisClass);
18812 spec->__anon1.__anon1.symbol = FindClass(spec->__anon1.__anon1.name);
18813 ProcessSpecifier(spec, declareStruct);
18814 }
18815 }
18816 break;
18817 }
18818 case 1:
18819 {
18820 struct Symbol * symbol = FindType(curContext, spec->__anon1.__anon1.name);
18821
18822 if(symbol)
18823 DeclareType(curExternal, symbol->type, 1, 1);
18824 else if(spec->__anon1.__anon1.symbol)
18825 {
18826 struct __ecereNameSpace__ecere__com__Class * c = spec->__anon1.__anon1.symbol->__anon1.registered;
18827
18828 DeclareStruct(curExternal, spec->__anon1.__anon1.name, c && c->type == 5, declareStruct && c && c->type == 1);
18829 }
18830 break;
18831 }
18832 case 2:
18833 {
18834 struct Enumerator * e;
18835
18836 if(spec->__anon1.__anon2.list)
18837 {
18838 for(e = (*spec->__anon1.__anon2.list).first; e; e = e->next)
18839 {
18840 if(e->exp)
18841 ProcessExpressionType(e->exp);
18842 }
18843 }
18844 if(inCompiler)
18845 break;
18846 }
18847 case 3:
18848 case 4:
18849 {
18850 if(spec->__anon1.__anon2.definitions)
18851 {
18852 struct Symbol * symbol = spec->__anon1.__anon2.id ? FindClass(spec->__anon1.__anon2.id->string) : (((void *)0));
18853
18854 ProcessClass(spec->__anon1.__anon2.definitions, symbol);
18855 }
18856 break;
18857 }
18858 }
18859 }
18860
18861 void ComputeDataTypes()
18862 {
18863 struct External * external;
18864
18865 currentClass = (((void *)0));
18866 containerClass = __ecereNameSpace__ecere__com__eSystem_FindClass(GetPrivateModule(), "Container");
18867 DeclareStruct((((void *)0)), "ecere::com::Class", 0, 1);
18868 DeclareStruct((((void *)0)), "ecere::com::Instance", 0, 1);
18869 DeclareStruct((((void *)0)), "ecere::com::Property", 0, 1);
18870 DeclareStruct((((void *)0)), "ecere::com::DataMember", 0, 1);
18871 DeclareStruct((((void *)0)), "ecere::com::Method", 0, 1);
18872 DeclareStruct((((void *)0)), "ecere::com::SerialBuffer", 0, 1);
18873 DeclareStruct((((void *)0)), "ecere::com::ClassTemplateArgument", 0, 1);
18874 DeclareFunctionUtil((((void *)0)), "eSystem_New");
18875 DeclareFunctionUtil((((void *)0)), "eSystem_New0");
18876 DeclareFunctionUtil((((void *)0)), "eSystem_Renew");
18877 DeclareFunctionUtil((((void *)0)), "eSystem_Renew0");
18878 DeclareFunctionUtil((((void *)0)), "eSystem_Delete");
18879 DeclareFunctionUtil((((void *)0)), "eClass_GetProperty");
18880 DeclareFunctionUtil((((void *)0)), "eClass_SetProperty");
18881 DeclareFunctionUtil((((void *)0)), "eInstance_FireSelfWatchers");
18882 DeclareFunctionUtil((((void *)0)), "eInstance_SetMethod");
18883 DeclareFunctionUtil((((void *)0)), "eInstance_IncRef");
18884 DeclareFunctionUtil((((void *)0)), "eInstance_StopWatching");
18885 DeclareFunctionUtil((((void *)0)), "eInstance_Watch");
18886 DeclareFunctionUtil((((void *)0)), "eInstance_FireWatchers");
18887 for(external = (*ast).first; external; external = external->next)
18888 {
18889 afterExternal = curExternal = external;
18890 if(external->type == 0)
18891 {
18892 if(memoryGuard)
18893 {
18894 DeclareFunctionUtil(external, "MemoryGuard_PushLoc");
18895 DeclareFunctionUtil(external, "MemoryGuard_PopLoc");
18896 }
18897 currentClass = external->__anon1.function->_class;
18898 ProcessFunction(external->__anon1.function);
18899 }
18900 else if(external->type == 1)
18901 {
18902 if(memoryGuard && external->__anon1.declaration && external->__anon1.declaration->type == 2)
18903 {
18904 DeclareFunctionUtil(external, "MemoryGuard_PushLoc");
18905 DeclareFunctionUtil(external, "MemoryGuard_PopLoc");
18906 }
18907 currentClass = (((void *)0));
18908 if(external->__anon1.declaration)
18909 ProcessDeclaration(external->__anon1.declaration);
18910 }
18911 else if(external->type == 2)
18912 {
18913 struct ClassDefinition * _class = external->__anon1._class;
18914
18915 currentClass = external->symbol->__anon1.registered;
18916 if(memoryGuard)
18917 {
18918 DeclareFunctionUtil(external, "MemoryGuard_PushLoc");
18919 DeclareFunctionUtil(external, "MemoryGuard_PopLoc");
18920 }
18921 if(_class->definitions)
18922 {
18923 ProcessClass(_class->definitions, _class->symbol);
18924 }
18925 if(inCompiler)
18926 {
18927 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove((&*ast), external);
18928 ((external ? (__ecereClass_External->Destructor ? __ecereClass_External->Destructor((void *)external) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(external)) : 0), external = 0);
18929 }
18930 }
18931 else if(external->type == 4)
18932 {
18933 thisNameSpace = external->__anon1.id->string;
18934 }
18935 }
18936 currentClass = (((void *)0));
18937 thisNameSpace = (((void *)0));
18938 curExternal = (((void *)0));
18939 }
18940
18941 static void ProcessDeclarator(struct Declarator * decl, unsigned int isFunction)
18942 {
18943 switch(decl->type)
18944 {
18945 case 1:
18946 if(decl->__anon1.identifier->classSym)
18947 {
18948 FreeSpecifier(decl->__anon1.identifier->_class);
18949 decl->__anon1.identifier->_class = (((void *)0));
18950 }
18951 break;
18952 case 3:
18953 if(decl->__anon1.array.exp)
18954 ProcessExpressionType(decl->__anon1.array.exp);
18955 case 0:
18956 case 2:
18957 case 4:
18958 case 5:
18959 case 6:
18960 case 7:
18961 {
18962 struct Identifier * id = (((void *)0));
18963 struct Specifier * classSpec = (((void *)0));
18964
18965 if(decl->type == 4)
18966 {
18967 id = GetDeclId(decl);
18968 if(id && id->_class)
18969 {
18970 classSpec = id->_class;
18971 id->_class = (((void *)0));
18972 }
18973 }
18974 if(decl->declarator)
18975 ProcessDeclarator(decl->declarator, isFunction);
18976 if(decl->type == 4)
18977 {
18978 if(classSpec)
18979 {
18980 struct TypeName * param = (param = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_TypeName), param->qualifiers = MkListOne(classSpec), param->declarator = (((void *)0)), param);
18981
18982 if(!decl->__anon1.function.parameters)
18983 decl->__anon1.function.parameters = MkList();
18984 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*decl->__anon1.function.parameters), (((void *)0)), param);
18985 }
18986 if(decl->__anon1.function.parameters)
18987 {
18988 struct TypeName * param;
18989
18990 for(param = (*decl->__anon1.function.parameters).first; param; param = param->next)
18991 {
18992 if(param->qualifiers)
18993 {
18994 struct Specifier * spec;
18995
18996 for(spec = (*param->qualifiers).first; spec; spec = spec->next)
18997 {
18998 if(spec->type == 0)
18999 {
19000 if(spec->__anon1.specifier == TYPED_OBJECT)
19001 {
19002 struct Declarator * d = param->declarator;
19003 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);
19004
19005 if(d->type != 5)
19006 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*newParam->qualifiers), (((void *)0)), MkSpecifier(CONST));
19007 FreeList(param->qualifiers, (void *)(FreeSpecifier));
19008 param->qualifiers = MkListOne(MkStructOrUnion(3, MkIdentifier("__ecereNameSpace__ecere__com__Class"), (((void *)0))));
19009 param->declarator = MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), MkDeclaratorIdentifier(MkIdentifier("class")));
19010 DeclareStruct(curExternal, "ecere::com::Class", 0, 1);
19011 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*decl->__anon1.function.parameters), param, newParam);
19012 param = newParam;
19013 break;
19014 }
19015 else if(spec->__anon1.specifier == ANY_OBJECT)
19016 {
19017 struct Declarator * d = param->declarator;
19018
19019 FreeList(param->qualifiers, (void *)(FreeSpecifier));
19020 param->qualifiers = MkListOne(MkSpecifier(VOID));
19021 if(d->type != 5)
19022 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*param->qualifiers), (((void *)0)), MkSpecifier(CONST));
19023 param->declarator = MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), d);
19024 break;
19025 }
19026 else if(spec->__anon1.specifier == THISCLASS)
19027 {
19028 if(thisClass)
19029 {
19030 spec->type = 1;
19031 spec->__anon1.__anon1.name = ReplaceThisClass(thisClass);
19032 spec->__anon1.__anon1.symbol = FindClass(spec->__anon1.__anon1.name);
19033 ProcessSpecifier(spec, 0);
19034 }
19035 break;
19036 }
19037 }
19038 else if(spec->type == 1)
19039 {
19040 ProcessSpecifier(spec, isFunction);
19041 }
19042 }
19043 }
19044 if(param->declarator)
19045 ProcessDeclarator(param->declarator, 0);
19046 }
19047 }
19048 }
19049 break;
19050 }
19051 }
19052 }
19053
19054 static void ProcessDeclaration(struct Declaration * decl)
19055 {
19056 yylloc = decl->loc;
19057 switch(decl->type)
19058 {
19059 case 1:
19060 {
19061 unsigned int declareStruct = 0;
19062
19063 if(decl->__anon1.__anon1.declarators)
19064 {
19065 struct InitDeclarator * d;
19066
19067 for(d = (*decl->__anon1.__anon1.declarators).first; d; d = d->next)
19068 {
19069 struct Type * type, * subType;
19070
19071 ProcessDeclarator(d->declarator, 0);
19072 type = ProcessType(decl->__anon1.__anon1.specifiers, d->declarator);
19073 if(d->initializer)
19074 {
19075 ProcessInitializer(d->initializer, type);
19076 if((*decl->__anon1.__anon1.declarators).count == 1 && d->initializer->type == 0 && d->initializer->__anon1.exp->type == 1)
19077 {
19078 if(type->kind == 8 && type->__anon1._class == d->initializer->__anon1.exp->expType->__anon1._class)
19079 {
19080 struct Instantiation * inst = d->initializer->__anon1.exp->__anon1.instance;
19081
19082 inst->exp = MkExpIdentifier(CopyIdentifier(GetDeclId(d->declarator)));
19083 d->initializer->__anon1.exp->__anon1.instance = (((void *)0));
19084 if(decl->__anon1.__anon1.specifiers)
19085 FreeList(decl->__anon1.__anon1.specifiers, (void *)(FreeSpecifier));
19086 FreeList(decl->__anon1.__anon1.declarators, (void *)(FreeInitDeclarator));
19087 d = (((void *)0));
19088 decl->type = 2;
19089 decl->__anon1.inst = inst;
19090 }
19091 }
19092 }
19093 for(subType = type; subType; )
19094 {
19095 if(subType->kind == 8)
19096 {
19097 declareStruct = 1;
19098 break;
19099 }
19100 else if(subType->kind == 13)
19101 break;
19102 else if(subType->kind == 12)
19103 subType = subType->__anon1.__anon4.arrayType;
19104 else
19105 break;
19106 }
19107 FreeType(type);
19108 if(!d)
19109 break;
19110 }
19111 }
19112 if(decl->__anon1.__anon1.specifiers)
19113 {
19114 struct Specifier * s;
19115
19116 for(s = (*decl->__anon1.__anon1.specifiers).first; s; s = s->next)
19117 {
19118 ProcessSpecifier(s, declareStruct);
19119 }
19120 }
19121 break;
19122 }
19123 case 2:
19124 {
19125 ProcessInstantiationType(decl->__anon1.inst);
19126 break;
19127 }
19128 case 0:
19129 {
19130 struct Specifier * spec;
19131 struct Declarator * d;
19132 unsigned int declareStruct = 0;
19133
19134 if(decl->__anon1.__anon1.declarators)
19135 {
19136 for(d = (*decl->__anon1.__anon1.declarators).first; d; d = d->next)
19137 {
19138 struct Type * type = ProcessType(decl->__anon1.__anon1.specifiers, d->declarator);
19139 struct Type * subType;
19140
19141 ProcessDeclarator(d, 0);
19142 for(subType = type; subType; )
19143 {
19144 if(subType->kind == 8)
19145 {
19146 declareStruct = 1;
19147 break;
19148 }
19149 else if(subType->kind == 13)
19150 break;
19151 else if(subType->kind == 12)
19152 subType = subType->__anon1.__anon4.arrayType;
19153 else
19154 break;
19155 }
19156 FreeType(type);
19157 }
19158 }
19159 if(decl->__anon1.__anon1.specifiers)
19160 {
19161 for(spec = (*decl->__anon1.__anon1.specifiers).first; spec; spec = spec->next)
19162 ProcessSpecifier(spec, declareStruct);
19163 }
19164 break;
19165 }
19166 }
19167 }
19168
19169 void __ecereRegisterModule_pass15(struct __ecereNameSpace__ecere__com__Instance * module)
19170 {
19171 struct __ecereNameSpace__ecere__com__Class __attribute__((unused)) * class;
19172
19173 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("SetYydebug", "void SetYydebug(bool b)", SetYydebug, module, 1);
19174 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("SetThisClass", "void SetThisClass(ecere::com::Class c)", SetThisClass, module, 1);
19175 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetThisClass", "ecere::com::Class GetThisClass(void)", GetThisClass, module, 1);
19176 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintExpression", "void PrintExpression(Expression exp, char * string)", PrintExpression, module, 1);
19177 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ProcessTemplateParameterType", "Type ProcessTemplateParameterType(TemplateParameter param)", ProcessTemplateParameterType, module, 2);
19178 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("NeedCast", "bool NeedCast(Type type1, Type type2)", NeedCast, module, 2);
19179 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintInt", "char * PrintInt(int64 result)", PrintInt, module, 1);
19180 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintUInt", "char * PrintUInt(uint64 result)", PrintUInt, module, 1);
19181 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintInt64", "char * PrintInt64(int64 result)", PrintInt64, module, 1);
19182 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintUInt64", "char * PrintUInt64(uint64 result)", PrintUInt64, module, 1);
19183 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintHexUInt", "char * PrintHexUInt(uint64 result)", PrintHexUInt, module, 1);
19184 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintHexUInt64", "char * PrintHexUInt64(uint64 result)", PrintHexUInt64, module, 1);
19185 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintShort", "char * PrintShort(short result)", PrintShort, module, 1);
19186 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintUShort", "char * PrintUShort(uint16 result)", PrintUShort, module, 1);
19187 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintChar", "char * PrintChar(char result)", PrintChar, module, 1);
19188 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintUChar", "char * PrintUChar(byte result)", PrintUChar, module, 1);
19189 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintFloat", "char * PrintFloat(float result)", PrintFloat, module, 1);
19190 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintDouble", "char * PrintDouble(double result)", PrintDouble, module, 1);
19191 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpInt", "bool GetOpInt(Operand op2, int * value2)", GetOpInt, module, 1);
19192 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetInt", "bool GetInt(Expression exp, int * value2)", GetInt, module, 1);
19193 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpUInt", "bool GetOpUInt(Operand op2, uint * value2)", GetOpUInt, module, 1);
19194 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetUInt", "bool GetUInt(Expression exp, uint * value2)", GetUInt, module, 1);
19195 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpInt64", "bool GetOpInt64(Operand op2, int64 * value2)", GetOpInt64, module, 1);
19196 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetInt64", "bool GetInt64(Expression exp, int64 * value2)", GetInt64, module, 1);
19197 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpUInt64", "bool GetOpUInt64(Operand op2, uint64 * value2)", GetOpUInt64, module, 1);
19198 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetUInt64", "bool GetUInt64(Expression exp, uint64 * value2)", GetUInt64, module, 1);
19199 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpIntPtr", "bool GetOpIntPtr(Operand op2, intptr * value2)", GetOpIntPtr, module, 1);
19200 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetIntPtr", "bool GetIntPtr(Expression exp, intptr * value2)", GetIntPtr, module, 1);
19201 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpUIntPtr", "bool GetOpUIntPtr(Operand op2, uintptr * value2)", GetOpUIntPtr, module, 1);
19202 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetUIntPtr", "bool GetUIntPtr(Expression exp, uintptr * value2)", GetUIntPtr, module, 1);
19203 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpIntSize", "bool GetOpIntSize(Operand op2, intsize * value2)", GetOpIntSize, module, 1);
19204 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetIntSize", "bool GetIntSize(Expression exp, intsize * value2)", GetIntSize, module, 1);
19205 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpUIntSize", "bool GetOpUIntSize(Operand op2, uintsize * value2)", GetOpUIntSize, module, 1);
19206 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetUIntSize", "bool GetUIntSize(Expression exp, uintsize * value2)", GetUIntSize, module, 1);
19207 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpShort", "bool GetOpShort(Operand op2, short * value2)", GetOpShort, module, 1);
19208 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetShort", "bool GetShort(Expression exp, short * value2)", GetShort, module, 1);
19209 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpUShort", "bool GetOpUShort(Operand op2, uint16 * value2)", GetOpUShort, module, 1);
19210 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetUShort", "bool GetUShort(Expression exp, uint16 * value2)", GetUShort, module, 1);
19211 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpChar", "bool GetOpChar(Operand op2, char * value2)", GetOpChar, module, 1);
19212 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetChar", "bool GetChar(Expression exp, char * value2)", GetChar, module, 1);
19213 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpUChar", "bool GetOpUChar(Operand op2, byte * value2)", GetOpUChar, module, 1);
19214 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetUChar", "bool GetUChar(Expression exp, byte * value2)", GetUChar, module, 1);
19215 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpFloat", "bool GetOpFloat(Operand op2, float * value2)", GetOpFloat, module, 1);
19216 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetFloat", "bool GetFloat(Expression exp, float * value2)", GetFloat, module, 1);
19217 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpDouble", "bool GetOpDouble(Operand op2, double * value2)", GetOpDouble, module, 1);
19218 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetDouble", "bool GetDouble(Expression exp, double * value2)", GetDouble, module, 1);
19219 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ComputeClassMembers", "void ComputeClassMembers(ecere::com::Class _class, bool isMember)", ComputeClassMembers, module, 2);
19220 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ComputeModuleClasses", "void ComputeModuleClasses(ecere::com::Module module)", ComputeModuleClasses, module, 1);
19221 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ComputeTypeSize", "int ComputeTypeSize(Type type)", ComputeTypeSize, module, 1);
19222 __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);
19223 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("DeclareStruct", "External DeclareStruct(External neededBy, const char * name, bool skipNoHead, bool needDereference)", DeclareStruct, module, 2);
19224 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("_DeclareStruct", "External _DeclareStruct(External neededBy, const char * name, bool skipNoHead, bool needDereference, bool fwdDecl)", _DeclareStruct, module, 2);
19225 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("DeclareProperty", "void DeclareProperty(External neededBy, ecere::com::Property prop, char * setName, char * getName)", DeclareProperty, module, 2);
19226 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("Dereference", "Type Dereference(Type source)", Dereference, module, 1);
19227 __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);
19228 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ProcessInstantiationType", "void ProcessInstantiationType(Instantiation inst)", ProcessInstantiationType, module, 2);
19229 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("DeclareType", "void DeclareType(External neededFor, Type type, bool needDereference, bool forFunctionDef)", DeclareType, module, 2);
19230 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("DeclareTypeForwardDeclare", "void DeclareTypeForwardDeclare(External neededFor, Type type, bool needDereference, bool forFunctionDef)", DeclareTypeForwardDeclare, module, 2);
19231 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("FindTemplateArg", "ecere::com::ClassTemplateArgument * FindTemplateArg(ecere::com::Class _class, TemplateParameter param)", FindTemplateArg, module, 2);
19232 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("SetupTemplatesContext", "Context SetupTemplatesContext(ecere::com::Class _class)", SetupTemplatesContext, module, 1);
19233 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("FinishTemplatesContext", "void FinishTemplatesContext(Context context)", FinishTemplatesContext, module, 1);
19234 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ProcessMethodType", "void ProcessMethodType(ecere::com::Method method)", ProcessMethodType, module, 1);
19235 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ProcessPropertyType", "void ProcessPropertyType(ecere::com::Property prop)", ProcessPropertyType, module, 1);
19236 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("DeclareMethod", "void DeclareMethod(External neededFor, ecere::com::Method method, const char * name)", DeclareMethod, module, 1);
19237 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ReplaceThisClass", "char * ReplaceThisClass(ecere::com::Class _class)", ReplaceThisClass, module, 2);
19238 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ReplaceThisClassType", "Type ReplaceThisClassType(ecere::com::Class _class)", ReplaceThisClassType, module, 2);
19239 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ReplaceThisClassSpecifiers", "void ReplaceThisClassSpecifiers(ecere::sys::OldList specs, ecere::com::Class _class)", ReplaceThisClassSpecifiers, module, 2);
19240 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("DeclareFunction", "bool DeclareFunction(External neededFor, ecere::com::GlobalFunction function, char * name)", DeclareFunction, module, 2);
19241 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("DeclareGlobalData", "void DeclareGlobalData(External neededFor, GlobalData data)", DeclareGlobalData, module, 2);
19242 class = __ecereNameSpace__ecere__com__eSystem_RegisterClass(5, "Conversion", 0, sizeof(struct Conversion), 0, (void *)0, (void *)0, module, 2, 1);
19243 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)
19244 __ecereClass_Conversion = class;
19245 __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);
19246 __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);
19247 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ModuleVisibility", "bool ModuleVisibility(ecere::com::Module searchIn, ecere::com::Module searchFor)", ModuleVisibility, module, 1);
19248 __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);
19249 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("MatchTypeExpression", "bool MatchTypeExpression(Expression sourceExp, Type dest, ecere::sys::OldList conversions, bool skipUnitBla, bool warnConst)", MatchTypeExpression, module, 2);
19250 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ReadString", "void ReadString(char * output, char * string)", ReadString, module, 1);
19251 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("UnescapeString", "int UnescapeString(char * d, char * s, int len)", UnescapeString, module, 1);
19252 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("OffsetEscapedString", "char * OffsetEscapedString(char * s, int len, int offset)", OffsetEscapedString, module, 1);
19253 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOperand", "Operand GetOperand(Expression exp)", GetOperand, module, 1);
19254 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PopulateInstance", "void PopulateInstance(Instantiation inst)", PopulateInstance, module, 1);
19255 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ComputeInstantiation", "void ComputeInstantiation(Expression exp)", ComputeInstantiation, module, 1);
19256 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("CallOperator", "void CallOperator(Expression exp, Expression exp1, Expression exp2, Operand op1, Operand op2)", CallOperator, module, 1);
19257 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ComputeExpression", "void ComputeExpression(Expression exp)", ComputeExpression, module, 1);
19258 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("CheckTemplateTypes", "void CheckTemplateTypes(Expression exp)", CheckTemplateTypes, module, 1);
19259 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("FindSymbol", "Symbol FindSymbol(const char * name, Context startContext, Context endContext, bool isStruct, bool globalNameSpace)", FindSymbol, module, 1);
19260 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintType", "void PrintType(Type type, char * string, bool printName, bool fullName)", PrintType, module, 1);
19261 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintTypeNoConst", "void PrintTypeNoConst(Type type, char * string, bool printName, bool fullName)", PrintTypeNoConst, module, 1);
19262 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("FindMemberAndOffset", "Type FindMemberAndOffset(Type type, char * string, uint * offset)", FindMemberAndOffset, module, 1);
19263 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetParseError", "bool GetParseError(void)", GetParseError, module, 1);
19264 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ParseExpressionString", "Expression ParseExpressionString(char * expression)", ParseExpressionString, module, 1);
19265 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ReplaceExpContents", "void ReplaceExpContents(Expression checkedExp, Expression newExp)", ReplaceExpContents, module, 1);
19266 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ApplyAnyObjectLogic", "void ApplyAnyObjectLogic(Expression e)", ApplyAnyObjectLogic, module, 1);
19267 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ApplyLocation", "void ApplyLocation(Expression exp, Location loc)", ApplyLocation, module, 1);
19268 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ProcessExpressionType", "void ProcessExpressionType(Expression exp)", ProcessExpressionType, module, 1);
19269 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("DeclareFunctionUtil", "void DeclareFunctionUtil(External neededBy, const String s)", DeclareFunctionUtil, module, 1);
19270 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ComputeDataTypes", "void ComputeDataTypes(void)", ComputeDataTypes, module, 1);
19271 }
19272