compiler/libec: Fixed null pointer compiler crashes
[sdk] / compiler / bootstrap / libec / bootstrap / pass16.c
1 /* Code generated from eC source file: pass16.ec */
2 #if defined(_WIN32)
3 #define __runtimePlatform 1
4 #elif defined(__APPLE__)
5 #define __runtimePlatform 3
6 #else
7 #define __runtimePlatform 2
8 #endif
9 #if defined(__GNUC__)
10 typedef long long int64;
11 typedef unsigned long long uint64;
12 #ifndef _WIN32
13 #define __declspec(x)
14 #endif
15 #elif defined(__TINYC__)
16 #include <stdarg.h>
17 #define __builtin_va_list va_list
18 #define __builtin_va_start va_start
19 #define __builtin_va_end va_end
20 #ifdef _WIN32
21 #define strcasecmp stricmp
22 #define strncasecmp strnicmp
23 #define __declspec(x) __attribute__((x))
24 #else
25 #define __declspec(x)
26 #endif
27 typedef long long int64;
28 typedef unsigned long long uint64;
29 #else
30 typedef __int64 int64;
31 typedef unsigned __int64 uint64;
32 #endif
33 #ifdef __BIG_ENDIAN__
34 #define __ENDIAN_PAD(x) (8 - (x))
35 #else
36 #define __ENDIAN_PAD(x) 0
37 #endif
38 #if defined(_WIN32)
39 #   if defined(__GNUC__) || defined(__TINYC__)
40 #      define ecere_stdcall __attribute__((__stdcall__))
41 #      define ecere_gcc_struct __attribute__((gcc_struct))
42 #   else
43 #      define ecere_stdcall __stdcall
44 #      define ecere_gcc_struct
45 #   endif
46 #else
47 #   define ecere_stdcall
48 #   define ecere_gcc_struct
49 #endif
50 #include <stdint.h>
51 #include <sys/types.h>
52 enum yytokentype
53 {
54 IDENTIFIER = 258, CONSTANT = 259, STRING_LITERAL = 260, SIZEOF = 261, PTR_OP = 262, INC_OP = 263, DEC_OP = 264, LEFT_OP = 265, RIGHT_OP = 266, LE_OP = 267, GE_OP = 268, EQ_OP = 269, NE_OP = 270, AND_OP = 271, OR_OP = 272, MUL_ASSIGN = 273, DIV_ASSIGN = 274, MOD_ASSIGN = 275, ADD_ASSIGN = 276, SUB_ASSIGN = 277, LEFT_ASSIGN = 278, RIGHT_ASSIGN = 279, AND_ASSIGN = 280, XOR_ASSIGN = 281, OR_ASSIGN = 282, TYPE_NAME = 283, TYPEDEF = 284, EXTERN = 285, STATIC = 286, AUTO = 287, REGISTER = 288, CHAR = 289, SHORT = 290, INT = 291, UINT = 292, INT64 = 293, LONG = 294, SIGNED = 295, UNSIGNED = 296, FLOAT = 297, DOUBLE = 298, CONST = 299, VOLATILE = 300, VOID = 301, VALIST = 302, STRUCT = 303, UNION = 304, ENUM = 305, ELLIPSIS = 306, CASE = 307, DEFAULT = 308, IF = 309, SWITCH = 310, WHILE = 311, DO = 312, FOR = 313, GOTO = 314, CONTINUE = 315, BREAK = 316, RETURN = 317, IFX = 318, ELSE = 319, CLASS = 320, THISCLASS = 321, CLASS_NAME = 322, PROPERTY = 323, SETPROP = 324, GETPROP = 325, NEWOP = 326, RENEW = 327, DELETE = 328, EXT_DECL = 329, EXT_STORAGE = 330, IMPORT = 331, DEFINE = 332, VIRTUAL = 333, ATTRIB = 334, PUBLIC = 335, PRIVATE = 336, TYPED_OBJECT = 337, ANY_OBJECT = 338, _INCREF = 339, EXTENSION = 340, ASM = 341, TYPEOF = 342, WATCH = 343, STOPWATCHING = 344, FIREWATCHERS = 345, WATCHABLE = 346, CLASS_DESIGNER = 347, CLASS_NO_EXPANSION = 348, CLASS_FIXED = 349, ISPROPSET = 350, CLASS_DEFAULT_PROPERTY = 351, PROPERTY_CATEGORY = 352, CLASS_DATA = 353, CLASS_PROPERTY = 354, SUBCLASS = 355, NAMESPACE = 356, NEW0OP = 357, RENEW0 = 358, VAARG = 359, DBTABLE = 360, DBFIELD = 361, DBINDEX = 362, DATABASE_OPEN = 363, ALIGNOF = 364, ATTRIB_DEP = 365, __ATTRIB = 366, BOOL = 367, _BOOL = 368, _COMPLEX = 369, _IMAGINARY = 370, RESTRICT = 371, THREAD = 372, WIDE_STRING_LITERAL = 373, BUILTIN_OFFSETOF = 374
55 };
56
57 extern unsigned int inCompiler;
58
59 extern const char *  outputFile;
60
61 static int declTempCount;
62
63 struct __ecereNameSpace__ecere__sys__OldList
64 {
65 void *  first;
66 void *  last;
67 int count;
68 unsigned int offset;
69 unsigned int circ;
70 } ecere_gcc_struct;
71
72 struct __ecereNameSpace__ecere__sys__BTNode;
73
74 struct __ecereNameSpace__ecere__com__DataValue
75 {
76 union
77 {
78 char c;
79 unsigned char uc;
80 short s;
81 unsigned short us;
82 int i;
83 unsigned int ui;
84 void *  p;
85 float f;
86 double d;
87 long long i64;
88 uint64 ui64;
89 } ecere_gcc_struct __anon1;
90 } ecere_gcc_struct;
91
92 struct __ecereNameSpace__ecere__com__SerialBuffer
93 {
94 unsigned char *  _buffer;
95 unsigned int count;
96 unsigned int _size;
97 unsigned int pos;
98 } ecere_gcc_struct;
99
100 extern void *  __ecereNameSpace__ecere__com__eSystem_New(unsigned int size);
101
102 extern void *  __ecereNameSpace__ecere__com__eSystem_New0(unsigned int size);
103
104 extern void *  __ecereNameSpace__ecere__com__eSystem_Renew(void *  memory, unsigned int size);
105
106 extern void *  __ecereNameSpace__ecere__com__eSystem_Renew0(void *  memory, unsigned int size);
107
108 extern void __ecereNameSpace__ecere__com__eSystem_Delete(void *  memory);
109
110 struct Pointer;
111
112 struct TypeName;
113
114 struct Attrib;
115
116 struct ExtDecl;
117
118 struct Attribute;
119
120 struct TemplateParameter;
121
122 struct TemplateArgument;
123
124 struct TemplateDatatype;
125
126 struct DBTableEntry;
127
128 struct DBIndexItem;
129
130 struct DBTableDef;
131
132 struct CodePosition
133 {
134 int line;
135 int charPos;
136 int pos;
137 int included;
138 } ecere_gcc_struct;
139
140 extern char *  __ecereNameSpace__ecere__sys__GetLastDirectory(const char *  string, char *  output);
141
142 extern unsigned int __ecereNameSpace__ecere__sys__StripExtension(char *  string);
143
144 extern void FixModuleName(char *  moduleName);
145
146 extern int sprintf(char * , const char * , ...);
147
148 extern void *  memcpy(void * , const void * , size_t size);
149
150 extern char *  __ecereNameSpace__ecere__sys__CopyString(const char *  string);
151
152 extern char *  strcpy(char * , const char * );
153
154 extern void FullClassNameCat(char *  output, const char *  className, unsigned int includeTemplateParams);
155
156 struct __ecereNameSpace__ecere__com__LinkList
157 {
158 void * first;
159 void * last;
160 int count;
161 } ecere_gcc_struct;
162
163 extern int strcmp(const char * , const char * );
164
165 extern void Compiler_Error(const char *  format, ...);
166
167 extern const char *  __ecereNameSpace__ecere__GetTranslatedString(const char * name, const char *  string, const char *  stringAndContext);
168
169 struct __ecereNameSpace__ecere__com__LinkElement
170 {
171 void * prev;
172 void * next;
173 } ecere_gcc_struct;
174
175 struct __ecereNameSpace__ecere__com__GlobalFunction;
176
177 struct __ecereNameSpace__ecere__com__IteratorPointer;
178
179 extern struct __ecereNameSpace__ecere__sys__OldList *  MkList(void);
180
181 extern void ListAdd(struct __ecereNameSpace__ecere__sys__OldList * list, void *  item);
182
183 extern struct __ecereNameSpace__ecere__sys__OldList *  ast;
184
185 extern struct __ecereNameSpace__ecere__sys__OldList *  MkListOne(void *  item);
186
187 extern void FreeList(struct __ecereNameSpace__ecere__sys__OldList * list, void (*  FreeFunction)(void * ));
188
189 extern void ListAddFront(struct __ecereNameSpace__ecere__sys__OldList * list, void *  item);
190
191 void __ecereMethod___ecereNameSpace__ecere__sys__OldList_Clear(struct __ecereNameSpace__ecere__sys__OldList * this);
192
193 void __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(struct __ecereNameSpace__ecere__sys__OldList * this, void *  item);
194
195 void __ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove(struct __ecereNameSpace__ecere__sys__OldList * this, void *  item);
196
197 unsigned int __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert(struct __ecereNameSpace__ecere__sys__OldList * this, void *  prevItem, void *  item);
198
199 void __ecereMethod___ecereNameSpace__ecere__sys__OldList_Free(struct __ecereNameSpace__ecere__sys__OldList * this, void (*  freeFn)(void * ));
200
201 extern struct Pointer * MkPointer(struct __ecereNameSpace__ecere__sys__OldList * qualifiers, struct Pointer * pointer);
202
203 struct Location
204 {
205 struct CodePosition start;
206 struct CodePosition end;
207 } ecere_gcc_struct;
208
209 extern struct Location yylloc;
210
211 struct External;
212
213 extern struct External * curExternal;
214
215 static struct External * createInstancesExternal;
216
217 static struct External * destroyInstancesExternal;
218
219 extern struct External * DeclareStruct(struct External * neededBy, const char *  name, unsigned int skipNoHead, unsigned int needDereference);
220
221 struct TopoEdge
222 {
223 struct __ecereNameSpace__ecere__com__LinkElement in;
224 struct __ecereNameSpace__ecere__com__LinkElement out;
225 struct External * from;
226 struct External * to;
227 unsigned int breakable;
228 } ecere_gcc_struct;
229
230 struct Statement;
231
232 static struct Statement * curCompound;
233
234 static struct Statement * createInstancesBody;
235
236 static struct Statement * destroyInstancesBody;
237
238 extern struct Statement * MkCompoundStmt(struct __ecereNameSpace__ecere__sys__OldList * declarations, struct __ecereNameSpace__ecere__sys__OldList * statements);
239
240 extern struct Statement * MkExpressionStmt(struct __ecereNameSpace__ecere__sys__OldList * expressions);
241
242 struct Context;
243
244 extern struct Context * globalContext;
245
246 extern struct Context * curContext;
247
248 extern struct Context * PushContext(void);
249
250 extern void PopContext(struct Context * ctx);
251
252 struct ModuleImport;
253
254 extern struct ModuleImport * mainModule;
255
256 struct ModuleImport
257 {
258 struct ModuleImport * prev;
259 struct ModuleImport * next;
260 char *  name;
261 struct __ecereNameSpace__ecere__sys__OldList classes;
262 struct __ecereNameSpace__ecere__sys__OldList functions;
263 int importType;
264 int importAccess;
265 } ecere_gcc_struct;
266
267 struct Expression;
268
269 extern struct Expression * CopyExpression(struct Expression * exp);
270
271 extern struct Expression * MkExpConstant(const char *  string);
272
273 extern struct Expression * MkExpOp(struct Expression * exp1, int op, struct Expression * exp2);
274
275 extern void ProcessExpressionType(struct Expression * exp);
276
277 extern struct Expression * MkExpBrackets(struct __ecereNameSpace__ecere__sys__OldList * expressions);
278
279 extern struct Expression * MkExpCast(struct TypeName * typeName, struct Expression * expression);
280
281 extern struct Expression * MkExpCall(struct Expression * expression, struct __ecereNameSpace__ecere__sys__OldList * arguments);
282
283 extern void FreeExpression(struct Expression * exp);
284
285 extern struct Expression * QMkExpId(const char *  id);
286
287 extern void CheckTemplateTypes(struct Expression * exp);
288
289 static void ProcessExpression(struct Expression *  exp);
290
291 void ProcessExpressionInstPass(struct Expression * exp)
292 {
293 ProcessExpression(exp);
294 }
295
296 struct Declaration;
297
298 extern struct Declaration * MkDeclaration(struct __ecereNameSpace__ecere__sys__OldList * specifiers, struct __ecereNameSpace__ecere__sys__OldList * initDeclarators);
299
300 extern struct External * MkExternalDeclaration(struct Declaration * declaration);
301
302 static struct Declaration * curDecl;
303
304 struct __ecereNameSpace__ecere__com__Class;
305
306 struct __ecereNameSpace__ecere__com__Instance
307 {
308 void * *  _vTbl;
309 struct __ecereNameSpace__ecere__com__Class * _class;
310 int _refCount;
311 } ecere_gcc_struct;
312
313 extern long long __ecereNameSpace__ecere__com__eClass_GetProperty(struct __ecereNameSpace__ecere__com__Class * _class, const char *  name);
314
315 extern void __ecereNameSpace__ecere__com__eClass_SetProperty(struct __ecereNameSpace__ecere__com__Class * _class, const char *  name, long long value);
316
317 extern unsigned int __ecereNameSpace__ecere__com__eClass_IsDerived(struct __ecereNameSpace__ecere__com__Class * _class, struct __ecereNameSpace__ecere__com__Class * from);
318
319 extern void *  __ecereNameSpace__ecere__com__eInstance_New(struct __ecereNameSpace__ecere__com__Class * _class);
320
321 extern void __ecereNameSpace__ecere__com__eInstance_SetMethod(struct __ecereNameSpace__ecere__com__Instance * instance, const char *  name, void *  function);
322
323 extern void __ecereNameSpace__ecere__com__eInstance_IncRef(struct __ecereNameSpace__ecere__com__Instance * instance);
324
325 int __ecereVMethodID___ecereNameSpace__ecere__com__Container_Remove;
326
327 int __ecereVMethodID___ecereNameSpace__ecere__com__Container_GetNext;
328
329 int __ecereVMethodID___ecereNameSpace__ecere__com__Container_Add;
330
331 struct __ecereNameSpace__ecere__com__Property;
332
333 extern void __ecereNameSpace__ecere__com__eInstance_FireSelfWatchers(struct __ecereNameSpace__ecere__com__Instance * instance, struct __ecereNameSpace__ecere__com__Property * _property);
334
335 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);
336
337 extern void __ecereNameSpace__ecere__com__eInstance_Watch(void *  instance, struct __ecereNameSpace__ecere__com__Property * _property, void *  object, void (*  callback)(void * , void * ));
338
339 extern void __ecereNameSpace__ecere__com__eInstance_FireWatchers(struct __ecereNameSpace__ecere__com__Instance * instance, struct __ecereNameSpace__ecere__com__Property * _property);
340
341 extern void DeclareProperty(struct External * neededBy, struct __ecereNameSpace__ecere__com__Property * prop, char *  setName, char *  getName);
342
343 struct Specifier;
344
345 extern struct Specifier * MkSpecifier(int specifier);
346
347 extern struct Specifier * MkSpecifierName(const char *  name);
348
349 extern struct Specifier * CopySpecifier(struct Specifier * spec);
350
351 extern struct Expression * MkExpClassSize(struct Specifier * _class);
352
353 struct Identifier;
354
355 struct Statement
356 {
357 struct Statement * prev;
358 struct Statement * next;
359 struct Location loc;
360 int type;
361 union
362 {
363 struct __ecereNameSpace__ecere__sys__OldList *  expressions;
364 struct
365 {
366 struct Identifier * id;
367 struct Statement * stmt;
368 } ecere_gcc_struct labeled;
369 struct
370 {
371 struct Expression * exp;
372 struct Statement * stmt;
373 } ecere_gcc_struct caseStmt;
374 struct
375 {
376 struct __ecereNameSpace__ecere__sys__OldList * declarations;
377 struct __ecereNameSpace__ecere__sys__OldList * statements;
378 struct Context * context;
379 unsigned int isSwitch;
380 } ecere_gcc_struct compound;
381 struct
382 {
383 struct __ecereNameSpace__ecere__sys__OldList * exp;
384 struct Statement * stmt;
385 struct Statement * elseStmt;
386 } ecere_gcc_struct ifStmt;
387 struct
388 {
389 struct __ecereNameSpace__ecere__sys__OldList * exp;
390 struct Statement * stmt;
391 } ecere_gcc_struct switchStmt;
392 struct
393 {
394 struct __ecereNameSpace__ecere__sys__OldList * exp;
395 struct Statement * stmt;
396 } ecere_gcc_struct whileStmt;
397 struct
398 {
399 struct __ecereNameSpace__ecere__sys__OldList * exp;
400 struct Statement * stmt;
401 } ecere_gcc_struct doWhile;
402 struct
403 {
404 struct Statement * init;
405 struct Statement * check;
406 struct __ecereNameSpace__ecere__sys__OldList * increment;
407 struct Statement * stmt;
408 } ecere_gcc_struct forStmt;
409 struct
410 {
411 struct Identifier * id;
412 } ecere_gcc_struct gotoStmt;
413 struct
414 {
415 struct Specifier * spec;
416 char * statements;
417 struct __ecereNameSpace__ecere__sys__OldList * inputFields;
418 struct __ecereNameSpace__ecere__sys__OldList * outputFields;
419 struct __ecereNameSpace__ecere__sys__OldList * clobberedFields;
420 } ecere_gcc_struct asmStmt;
421 struct
422 {
423 struct Expression * watcher;
424 struct Expression * object;
425 struct __ecereNameSpace__ecere__sys__OldList * watches;
426 } ecere_gcc_struct _watch;
427 struct
428 {
429 struct Identifier * id;
430 struct __ecereNameSpace__ecere__sys__OldList * exp;
431 struct __ecereNameSpace__ecere__sys__OldList * filter;
432 struct Statement * stmt;
433 } ecere_gcc_struct forEachStmt;
434 struct Declaration * decl;
435 } ecere_gcc_struct __anon1;
436 } ecere_gcc_struct;
437
438 extern struct Identifier * MkIdentifier(const char *  string);
439
440 extern struct Expression * MkExpMember(struct Expression * expression, struct Identifier * member);
441
442 extern struct Expression * MkExpIdentifier(struct Identifier * id);
443
444 extern struct Specifier * MkStructOrUnion(int type, struct Identifier * id, struct __ecereNameSpace__ecere__sys__OldList * definitions);
445
446 extern struct Identifier * CopyIdentifier(struct Identifier * id);
447
448 extern void FreeIdentifier(struct Identifier * id);
449
450 struct Type;
451
452 struct __ecereNameSpace__ecere__com__Property
453 {
454 struct __ecereNameSpace__ecere__com__Property * prev;
455 struct __ecereNameSpace__ecere__com__Property * next;
456 const char *  name;
457 unsigned int isProperty;
458 int memberAccess;
459 int id;
460 struct __ecereNameSpace__ecere__com__Class * _class;
461 const char *  dataTypeString;
462 struct __ecereNameSpace__ecere__com__Class * dataTypeClass;
463 struct Type * dataType;
464 void (*  Set)(void * , int);
465 int (*  Get)(void * );
466 unsigned int (*  IsSet)(void * );
467 void *  data;
468 void *  symbol;
469 int vid;
470 unsigned int conversion;
471 unsigned int watcherOffset;
472 const char *  category;
473 unsigned int compiled;
474 unsigned int selfWatchable;
475 unsigned int isWatchable;
476 } ecere_gcc_struct;
477
478 extern void FreeType(struct Type * type);
479
480 extern struct Type * MkClassType(const char *  name);
481
482 extern void CopyTypeInto(struct Type * type, struct Type * src);
483
484 extern struct Type * ProcessTypeString(const char *  string, unsigned int staticMethod);
485
486 struct Initializer;
487
488 struct Initializer
489 {
490 struct Initializer * prev;
491 struct Initializer * next;
492 struct Location loc;
493 int type;
494 union
495 {
496 struct Expression * exp;
497 struct __ecereNameSpace__ecere__sys__OldList *  list;
498 } ecere_gcc_struct __anon1;
499 unsigned int isConstant;
500 struct Identifier * id;
501 } ecere_gcc_struct;
502
503 extern void FreeInitializer(struct Initializer * initializer);
504
505 extern struct Initializer * MkInitializerList(struct __ecereNameSpace__ecere__sys__OldList * list);
506
507 extern struct Initializer * MkInitializerAssignment(struct Expression * exp);
508
509 struct Symbol;
510
511 struct Specifier
512 {
513 struct Specifier * prev;
514 struct Specifier * next;
515 struct Location loc;
516 int type;
517 union
518 {
519 int specifier;
520 struct
521 {
522 struct ExtDecl * extDecl;
523 char *  name;
524 struct Symbol * symbol;
525 struct __ecereNameSpace__ecere__sys__OldList *  templateArgs;
526 struct Specifier * nsSpec;
527 } ecere_gcc_struct __anon1;
528 struct
529 {
530 struct Identifier * id;
531 struct __ecereNameSpace__ecere__sys__OldList *  list;
532 struct __ecereNameSpace__ecere__sys__OldList *  baseSpecs;
533 struct __ecereNameSpace__ecere__sys__OldList *  definitions;
534 unsigned int addNameSpace;
535 struct Context * ctx;
536 struct ExtDecl * extDeclStruct;
537 } ecere_gcc_struct __anon2;
538 struct Expression * expression;
539 struct Specifier * _class;
540 struct TemplateParameter * templateParameter;
541 } ecere_gcc_struct __anon1;
542 } ecere_gcc_struct;
543
544 struct Identifier
545 {
546 struct Identifier * prev;
547 struct Identifier * next;
548 struct Location loc;
549 struct Symbol * classSym;
550 struct Specifier * _class;
551 char *  string;
552 struct Identifier * badID;
553 } ecere_gcc_struct;
554
555 extern struct Symbol * FindClass(const char *  name);
556
557 extern struct Specifier * _MkSpecifierName(const char *  name, struct Symbol * symbol, struct __ecereNameSpace__ecere__sys__OldList * templateArgs);
558
559 extern struct Type * MkClassTypeSymbol(struct Symbol * symbol);
560
561 extern void FreeSymbol(struct Symbol * symbol);
562
563 struct Instantiation;
564
565 struct Instantiation
566 {
567 struct Instantiation * prev;
568 struct Instantiation * next;
569 struct Location loc;
570 struct Specifier * _class;
571 struct Expression * exp;
572 struct __ecereNameSpace__ecere__sys__OldList *  members;
573 struct Symbol * symbol;
574 unsigned int fullSet;
575 unsigned int isConstant;
576 unsigned char *  data;
577 struct Location nameLoc;
578 struct Location insideLoc;
579 unsigned int built;
580 } ecere_gcc_struct;
581
582 struct Declaration
583 {
584 struct Declaration * prev;
585 struct Declaration * next;
586 struct Location loc;
587 int type;
588 union
589 {
590 struct
591 {
592 struct __ecereNameSpace__ecere__sys__OldList *  specifiers;
593 struct __ecereNameSpace__ecere__sys__OldList *  declarators;
594 } ecere_gcc_struct __anon1;
595 struct Instantiation * inst;
596 struct
597 {
598 struct Identifier * id;
599 struct Expression * exp;
600 } ecere_gcc_struct __anon2;
601 } ecere_gcc_struct __anon1;
602 struct Specifier * extStorage;
603 struct Symbol * symbol;
604 int declMode;
605 } ecere_gcc_struct;
606
607 extern struct Declaration * MkDeclarationInst(struct Instantiation * inst);
608
609 extern struct Instantiation * MkInstantiation(struct Specifier * _class, struct Expression * exp, struct __ecereNameSpace__ecere__sys__OldList * members);
610
611 extern void FreeInstance(struct Instantiation * inst);
612
613 extern struct Expression * MkExpInstance(struct Instantiation * inst);
614
615 struct __ecereNameSpace__ecere__com__Method;
616
617 struct __ecereNameSpace__ecere__com__Method
618 {
619 const char *  name;
620 struct __ecereNameSpace__ecere__com__Method * parent;
621 struct __ecereNameSpace__ecere__com__Method * left;
622 struct __ecereNameSpace__ecere__com__Method * right;
623 int depth;
624 int (*  function)();
625 int vid;
626 int type;
627 struct __ecereNameSpace__ecere__com__Class * _class;
628 void *  symbol;
629 const char *  dataTypeString;
630 struct Type * dataType;
631 int memberAccess;
632 } ecere_gcc_struct;
633
634 struct Type
635 {
636 struct Type * prev;
637 struct Type * next;
638 int refCount;
639 union
640 {
641 struct Symbol * _class;
642 struct
643 {
644 struct __ecereNameSpace__ecere__sys__OldList members;
645 char *  enumName;
646 } ecere_gcc_struct __anon1;
647 struct
648 {
649 struct Type * returnType;
650 struct __ecereNameSpace__ecere__sys__OldList params;
651 struct Symbol * thisClass;
652 unsigned int staticMethod;
653 struct TemplateParameter * thisClassTemplate;
654 } ecere_gcc_struct __anon2;
655 struct
656 {
657 struct __ecereNameSpace__ecere__com__Method * method;
658 struct __ecereNameSpace__ecere__com__Class * methodClass;
659 struct __ecereNameSpace__ecere__com__Class * usedClass;
660 } ecere_gcc_struct __anon3;
661 struct
662 {
663 struct Type * arrayType;
664 int arraySize;
665 struct Expression * arraySizeExp;
666 unsigned int freeExp;
667 struct Symbol * enumClass;
668 } ecere_gcc_struct __anon4;
669 struct Type * type;
670 struct TemplateParameter * templateParameter;
671 } ecere_gcc_struct __anon1;
672 int kind;
673 unsigned int size;
674 char *  name;
675 char *  typeName;
676 struct __ecereNameSpace__ecere__com__Class * thisClassFrom;
677 int promotedFrom;
678 int classObjectType;
679 int alignment;
680 unsigned int offset;
681 int bitFieldCount;
682 int count;
683 int bitMemberSize;
684 unsigned int isSigned : 1;
685 unsigned int constant : 1;
686 unsigned int truth : 1;
687 unsigned int byReference : 1;
688 unsigned int extraParam : 1;
689 unsigned int directClassAccess : 1;
690 unsigned int computing : 1;
691 unsigned int keepCast : 1;
692 unsigned int passAsTemplate : 1;
693 unsigned int dllExport : 1;
694 unsigned int attrStdcall : 1;
695 unsigned int declaredWithStruct : 1;
696 unsigned int typedByReference : 1;
697 unsigned int casted : 1;
698 unsigned int pointerAlignment : 1;
699 unsigned int isLong : 1;
700 unsigned int signedBeforePromotion : 1;
701 } ecere_gcc_struct;
702
703 extern void ProcessMethodType(struct __ecereNameSpace__ecere__com__Method * method);
704
705 struct Declarator;
706
707 extern struct Declarator * MkDeclaratorFunction(struct Declarator * declarator, struct __ecereNameSpace__ecere__sys__OldList * parameters);
708
709 extern struct Declarator * MkDeclaratorIdentifier(struct Identifier * id);
710
711 struct Expression
712 {
713 struct Expression * prev;
714 struct Expression * next;
715 struct Location loc;
716 int type;
717 union
718 {
719 struct
720 {
721 char *  constant;
722 struct Identifier * identifier;
723 } ecere_gcc_struct __anon1;
724 struct Statement * compound;
725 struct Instantiation * instance;
726 struct
727 {
728 char *  string;
729 unsigned int intlString;
730 unsigned int wideString;
731 } ecere_gcc_struct __anon2;
732 struct __ecereNameSpace__ecere__sys__OldList *  list;
733 struct
734 {
735 struct __ecereNameSpace__ecere__sys__OldList * specifiers;
736 struct Declarator * decl;
737 } ecere_gcc_struct _classExp;
738 struct
739 {
740 struct Identifier * id;
741 } ecere_gcc_struct classData;
742 struct
743 {
744 struct Expression * exp;
745 struct __ecereNameSpace__ecere__sys__OldList * arguments;
746 struct Location argLoc;
747 } ecere_gcc_struct call;
748 struct
749 {
750 struct Expression * exp;
751 struct __ecereNameSpace__ecere__sys__OldList * index;
752 } ecere_gcc_struct index;
753 struct
754 {
755 struct Expression * exp;
756 struct Identifier * member;
757 int memberType;
758 unsigned int thisPtr;
759 } ecere_gcc_struct member;
760 struct
761 {
762 int op;
763 struct Expression * exp1;
764 struct Expression * exp2;
765 } ecere_gcc_struct op;
766 struct TypeName * typeName;
767 struct Specifier * _class;
768 struct
769 {
770 struct TypeName * typeName;
771 struct Expression * exp;
772 } ecere_gcc_struct cast;
773 struct
774 {
775 struct Expression * cond;
776 struct __ecereNameSpace__ecere__sys__OldList * exp;
777 struct Expression * elseExp;
778 } ecere_gcc_struct cond;
779 struct
780 {
781 struct TypeName * typeName;
782 struct Expression * size;
783 } ecere_gcc_struct _new;
784 struct
785 {
786 struct TypeName * typeName;
787 struct Expression * size;
788 struct Expression * exp;
789 } ecere_gcc_struct _renew;
790 struct
791 {
792 char * table;
793 struct Identifier * id;
794 } ecere_gcc_struct db;
795 struct
796 {
797 struct Expression * ds;
798 struct Expression * name;
799 } ecere_gcc_struct dbopen;
800 struct
801 {
802 struct TypeName * typeName;
803 struct Initializer * initializer;
804 } ecere_gcc_struct initializer;
805 struct
806 {
807 struct Expression * exp;
808 struct TypeName * typeName;
809 } ecere_gcc_struct vaArg;
810 struct
811 {
812 struct TypeName * typeName;
813 struct Identifier * id;
814 } ecere_gcc_struct offset;
815 } ecere_gcc_struct __anon1;
816 unsigned int debugValue;
817 struct __ecereNameSpace__ecere__com__DataValue val;
818 uint64 address;
819 unsigned int hasAddress;
820 struct Type * expType;
821 struct Type * destType;
822 unsigned int usage;
823 int tempCount;
824 unsigned int byReference;
825 unsigned int isConstant;
826 unsigned int addedThis;
827 unsigned int needCast;
828 unsigned int thisPtr;
829 unsigned int opDestType;
830 unsigned int needTemplateCast;
831 } ecere_gcc_struct;
832
833 extern struct Declarator * SpecDeclFromString(const char *  string, struct __ecereNameSpace__ecere__sys__OldList *  specs, struct Declarator * baseDecl);
834
835 extern struct TypeName * MkTypeName(struct __ecereNameSpace__ecere__sys__OldList * qualifiers, struct Declarator * declarator);
836
837 extern struct TypeName * QMkClass(const char *  spec, struct Declarator * decl);
838
839 extern struct Declarator * MkDeclaratorPointer(struct Pointer * pointer, struct Declarator * declarator);
840
841 struct Declarator
842 {
843 struct Declarator * prev;
844 struct Declarator * next;
845 struct Location loc;
846 int type;
847 struct Symbol * symbol;
848 struct Declarator * declarator;
849 union
850 {
851 struct Identifier * identifier;
852 struct
853 {
854 struct Expression * exp;
855 struct Expression * posExp;
856 struct Attrib * attrib;
857 } ecere_gcc_struct structDecl;
858 struct
859 {
860 struct Expression * exp;
861 struct Specifier * enumClass;
862 } ecere_gcc_struct array;
863 struct
864 {
865 struct __ecereNameSpace__ecere__sys__OldList * parameters;
866 } ecere_gcc_struct function;
867 struct
868 {
869 struct Pointer * pointer;
870 } ecere_gcc_struct pointer;
871 struct
872 {
873 struct ExtDecl * extended;
874 } ecere_gcc_struct extended;
875 } ecere_gcc_struct __anon1;
876 } ecere_gcc_struct;
877
878 static void ProcessInitializer(struct Initializer * init)
879 {
880 switch(init->type)
881 {
882 case 0:
883 init->__anon1.exp->usage = (init->__anon1.exp->usage & ~0x1) | (((unsigned int)(1)) << 0);
884 ProcessExpression(init->__anon1.exp);
885 break;
886 case 1:
887 {
888 struct Initializer * i;
889
890 for(i = (*init->__anon1.list).first; i; i = i->next)
891 ProcessInitializer(i);
892 break;
893 }
894 }
895 }
896
897 struct ClassImport;
898
899 struct Symbol
900 {
901 char *  string;
902 struct Symbol * parent;
903 struct Symbol * left;
904 struct Symbol * right;
905 int depth;
906 struct Type * type;
907 union
908 {
909 struct __ecereNameSpace__ecere__com__Method * method;
910 struct __ecereNameSpace__ecere__com__Property * _property;
911 struct __ecereNameSpace__ecere__com__Class * registered;
912 } ecere_gcc_struct __anon1;
913 unsigned int notYetDeclared;
914 union
915 {
916 struct
917 {
918 struct External * pointerExternal;
919 struct External * structExternal;
920 } ecere_gcc_struct __anon1;
921 struct
922 {
923 struct External * externalGet;
924 struct External * externalSet;
925 struct External * externalPtr;
926 struct External * externalIsSet;
927 } ecere_gcc_struct __anon2;
928 struct
929 {
930 struct External * methodExternal;
931 struct External * methodCodeExternal;
932 } ecere_gcc_struct __anon3;
933 } ecere_gcc_struct __anon2;
934 unsigned int imported;
935 unsigned int declaredStructSym;
936 struct __ecereNameSpace__ecere__com__Class * _class;
937 unsigned int declaredStruct;
938 unsigned int needConstructor;
939 unsigned int needDestructor;
940 char *  constructorName;
941 char *  structName;
942 char *  className;
943 char *  destructorName;
944 struct ModuleImport * module;
945 struct ClassImport * _import;
946 struct Location nameLoc;
947 unsigned int isParam;
948 unsigned int isRemote;
949 unsigned int isStruct;
950 unsigned int fireWatchersDone;
951 int declaring;
952 unsigned int classData;
953 unsigned int isStatic;
954 char *  shortName;
955 struct __ecereNameSpace__ecere__sys__OldList *  templateParams;
956 struct __ecereNameSpace__ecere__sys__OldList templatedClasses;
957 struct Context * ctx;
958 int isIterator;
959 struct Expression * propCategory;
960 unsigned int mustRegister;
961 } ecere_gcc_struct;
962
963 struct ClassImport
964 {
965 struct ClassImport * prev;
966 struct ClassImport * next;
967 char *  name;
968 struct __ecereNameSpace__ecere__sys__OldList methods;
969 struct __ecereNameSpace__ecere__sys__OldList properties;
970 unsigned int itself;
971 int isRemote;
972 } ecere_gcc_struct;
973
974 struct MembersInit;
975
976 extern struct MembersInit * MkMembersInitList(struct __ecereNameSpace__ecere__sys__OldList * dataMembers);
977
978 struct __ecereNameSpace__ecere__sys__BinaryTree;
979
980 struct __ecereNameSpace__ecere__sys__BinaryTree
981 {
982 struct __ecereNameSpace__ecere__sys__BTNode * root;
983 int count;
984 int (*  CompareKey)(struct __ecereNameSpace__ecere__sys__BinaryTree * tree, uintptr_t a, uintptr_t b);
985 void (*  FreeKey)(void *  key);
986 } ecere_gcc_struct;
987
988 unsigned int __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Add(struct __ecereNameSpace__ecere__sys__BinaryTree * this, struct __ecereNameSpace__ecere__sys__BTNode * node);
989
990 void __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Remove(struct __ecereNameSpace__ecere__sys__BinaryTree * this, struct __ecereNameSpace__ecere__sys__BTNode * node);
991
992 struct FunctionDefinition;
993
994 extern struct FunctionDefinition * _MkFunction(struct __ecereNameSpace__ecere__sys__OldList * specifiers, struct Declarator * declarator, struct __ecereNameSpace__ecere__sys__OldList * declarationList, unsigned int errorOnOmit);
995
996 extern void ProcessFunctionBody(struct FunctionDefinition * func, struct Statement * body);
997
998 extern struct External * MkExternalFunction(struct FunctionDefinition * function);
999
1000 struct FunctionDefinition
1001 {
1002 struct FunctionDefinition * prev;
1003 struct FunctionDefinition * next;
1004 struct Location loc;
1005 struct __ecereNameSpace__ecere__sys__OldList *  specifiers;
1006 struct Declarator * declarator;
1007 struct __ecereNameSpace__ecere__sys__OldList *  declarations;
1008 struct Statement * body;
1009 struct __ecereNameSpace__ecere__com__Class * _class;
1010 struct __ecereNameSpace__ecere__sys__OldList attached;
1011 int declMode;
1012 struct Type * type;
1013 struct Symbol * propSet;
1014 int tempCount;
1015 unsigned int propertyNoThis;
1016 } ecere_gcc_struct;
1017
1018 struct PropertyWatch;
1019
1020 struct PropertyWatch
1021 {
1022 struct PropertyWatch * prev;
1023 struct PropertyWatch * next;
1024 struct Location loc;
1025 struct Statement * compound;
1026 struct __ecereNameSpace__ecere__sys__OldList *  properties;
1027 unsigned int deleteWatch;
1028 } ecere_gcc_struct;
1029
1030 struct InitDeclarator;
1031
1032 extern struct InitDeclarator * MkInitDeclarator(struct Declarator * declarator, struct Initializer * initializer);
1033
1034 extern struct Declaration * QMkDeclaration(const char *  name, struct InitDeclarator * initDecl);
1035
1036 struct InitDeclarator
1037 {
1038 struct InitDeclarator * prev;
1039 struct InitDeclarator * next;
1040 struct Location loc;
1041 struct Declarator * declarator;
1042 struct Initializer * initializer;
1043 } ecere_gcc_struct;
1044
1045 struct __ecereNameSpace__ecere__com__DataMember;
1046
1047 struct __ecereNameSpace__ecere__com__ClassTemplateArgument
1048 {
1049 union
1050 {
1051 struct
1052 {
1053 const char *  dataTypeString;
1054 struct __ecereNameSpace__ecere__com__Class * dataTypeClass;
1055 } ecere_gcc_struct __anon1;
1056 struct __ecereNameSpace__ecere__com__DataValue expression;
1057 struct
1058 {
1059 const char *  memberString;
1060 union
1061 {
1062 struct __ecereNameSpace__ecere__com__DataMember * member;
1063 struct __ecereNameSpace__ecere__com__Property * prop;
1064 struct __ecereNameSpace__ecere__com__Method * method;
1065 } ecere_gcc_struct __anon1;
1066 } ecere_gcc_struct __anon2;
1067 } ecere_gcc_struct __anon1;
1068 } ecere_gcc_struct;
1069
1070 struct __ecereNameSpace__ecere__com__DataMember
1071 {
1072 struct __ecereNameSpace__ecere__com__DataMember * prev;
1073 struct __ecereNameSpace__ecere__com__DataMember * next;
1074 const char *  name;
1075 unsigned int isProperty;
1076 int memberAccess;
1077 int id;
1078 struct __ecereNameSpace__ecere__com__Class * _class;
1079 const char *  dataTypeString;
1080 struct __ecereNameSpace__ecere__com__Class * dataTypeClass;
1081 struct Type * dataType;
1082 int type;
1083 int offset;
1084 int memberID;
1085 struct __ecereNameSpace__ecere__sys__OldList members;
1086 struct __ecereNameSpace__ecere__sys__BinaryTree membersAlpha;
1087 int memberOffset;
1088 short structAlignment;
1089 short pointerAlignment;
1090 } ecere_gcc_struct;
1091
1092 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);
1093
1094 struct __ecereNameSpace__ecere__com__Module;
1095
1096 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);
1097
1098 extern struct __ecereNameSpace__ecere__com__Instance * privateModule;
1099
1100 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);
1101
1102 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);
1103
1104 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);
1105
1106 struct Enumerator;
1107
1108 struct Enumerator
1109 {
1110 struct Enumerator * prev;
1111 struct Enumerator * next;
1112 struct Location loc;
1113 struct Identifier * id;
1114 struct Expression * exp;
1115 } ecere_gcc_struct;
1116
1117 struct AsmField;
1118
1119 struct AsmField
1120 {
1121 struct AsmField * prev;
1122 struct AsmField * next;
1123 struct Location loc;
1124 char *  command;
1125 struct Expression * expression;
1126 struct Identifier * symbolic;
1127 } ecere_gcc_struct;
1128
1129 struct __ecereNameSpace__ecere__com__BitMember;
1130
1131 struct __ecereNameSpace__ecere__com__BitMember
1132 {
1133 struct __ecereNameSpace__ecere__com__BitMember * prev;
1134 struct __ecereNameSpace__ecere__com__BitMember * next;
1135 const char *  name;
1136 unsigned int isProperty;
1137 int memberAccess;
1138 int id;
1139 struct __ecereNameSpace__ecere__com__Class * _class;
1140 const char *  dataTypeString;
1141 struct __ecereNameSpace__ecere__com__Class * dataTypeClass;
1142 struct Type * dataType;
1143 int type;
1144 int size;
1145 int pos;
1146 uint64 mask;
1147 } ecere_gcc_struct;
1148
1149 struct MemberInit;
1150
1151 struct MemberInit
1152 {
1153 struct MemberInit * prev;
1154 struct MemberInit * next;
1155 struct Location loc;
1156 struct Location realLoc;
1157 struct __ecereNameSpace__ecere__sys__OldList *  identifiers;
1158 struct Initializer * initializer;
1159 unsigned int used;
1160 unsigned int variable;
1161 unsigned int takeOutExp;
1162 } ecere_gcc_struct;
1163
1164 extern struct MemberInit * MkMemberInit(struct __ecereNameSpace__ecere__sys__OldList * ids, struct Initializer * initializer);
1165
1166 static void ProcessMemberInitData(struct MemberInit * member)
1167 {
1168 if(member->initializer)
1169 ProcessInitializer(member->initializer);
1170 }
1171
1172 struct ClassDefinition;
1173
1174 struct Context
1175 {
1176 struct Context * parent;
1177 struct __ecereNameSpace__ecere__sys__BinaryTree types;
1178 struct __ecereNameSpace__ecere__sys__BinaryTree classes;
1179 struct __ecereNameSpace__ecere__sys__BinaryTree symbols;
1180 struct __ecereNameSpace__ecere__sys__BinaryTree structSymbols;
1181 int nextID;
1182 int simpleID;
1183 struct __ecereNameSpace__ecere__sys__BinaryTree templateTypes;
1184 struct ClassDefinition * classDef;
1185 unsigned int templateTypesOnly;
1186 unsigned int hasNameSpace;
1187 } ecere_gcc_struct;
1188
1189 struct External
1190 {
1191 struct External * prev;
1192 struct External * next;
1193 struct Location loc;
1194 int type;
1195 struct Symbol * symbol;
1196 union
1197 {
1198 struct FunctionDefinition * function;
1199 struct ClassDefinition * _class;
1200 struct Declaration * declaration;
1201 char *  importString;
1202 struct Identifier * id;
1203 struct DBTableDef * table;
1204 } ecere_gcc_struct __anon1;
1205 int importType;
1206 struct External * fwdDecl;
1207 struct __ecereNameSpace__ecere__com__Instance * outgoing;
1208 struct __ecereNameSpace__ecere__com__Instance * incoming;
1209 int nonBreakableIncoming;
1210 } ecere_gcc_struct;
1211
1212 struct ClassDefinition
1213 {
1214 struct ClassDefinition * prev;
1215 struct ClassDefinition * next;
1216 struct Location loc;
1217 struct Specifier * _class;
1218 struct __ecereNameSpace__ecere__sys__OldList *  baseSpecs;
1219 struct __ecereNameSpace__ecere__sys__OldList *  definitions;
1220 struct Symbol * symbol;
1221 struct Location blockStart;
1222 struct Location nameLoc;
1223 int declMode;
1224 unsigned int deleteWatchable;
1225 } ecere_gcc_struct;
1226
1227 void __ecereMethod_External_CreateUniqueEdge(struct External * this, struct External * from, unsigned int soft);
1228
1229 void __ecereMethod_External_CreateEdge(struct External * this, struct External * from, unsigned int soft);
1230
1231 struct ClassFunction;
1232
1233 struct MembersInit
1234 {
1235 struct MembersInit * prev;
1236 struct MembersInit * next;
1237 struct Location loc;
1238 int type;
1239 union
1240 {
1241 struct __ecereNameSpace__ecere__sys__OldList *  dataMembers;
1242 struct ClassFunction * function;
1243 } ecere_gcc_struct __anon1;
1244 } ecere_gcc_struct;
1245
1246 struct ClassFunction
1247 {
1248 struct ClassFunction * prev;
1249 struct ClassFunction * next;
1250 struct Location loc;
1251 struct __ecereNameSpace__ecere__sys__OldList *  specifiers;
1252 struct Declarator * declarator;
1253 struct __ecereNameSpace__ecere__sys__OldList *  declarations;
1254 struct Statement * body;
1255 struct __ecereNameSpace__ecere__com__Class * _class;
1256 struct __ecereNameSpace__ecere__sys__OldList attached;
1257 int declMode;
1258 struct Type * type;
1259 struct Symbol * propSet;
1260 unsigned int isVirtual;
1261 unsigned int isConstructor;
1262 unsigned int isDestructor;
1263 unsigned int dontMangle;
1264 int id;
1265 int idCode;
1266 } ecere_gcc_struct;
1267
1268 static unsigned int ProcessInstMembers_SimpleMemberEnsure(struct __ecereNameSpace__ecere__com__DataMember * parentMember, struct Instantiation * inst, struct Expression * instExp, struct __ecereNameSpace__ecere__sys__OldList * list, unsigned int zeroOut)
1269 {
1270 struct Symbol * classSym = inst->_class->__anon1.__anon1.symbol;
1271 unsigned int fullSet = 1;
1272 struct __ecereNameSpace__ecere__com__DataMember * dataMember;
1273
1274 for(dataMember = parentMember->members.first; dataMember; dataMember = dataMember->next)
1275 {
1276 if(!dataMember->isProperty)
1277 {
1278 if(!dataMember->name && (dataMember->type == 1 || dataMember->type == 2))
1279 {
1280 if(!ProcessInstMembers_SimpleMemberEnsure(dataMember, inst, instExp, list, zeroOut))
1281 fullSet = 0;
1282 }
1283 else
1284 {
1285 unsigned int memberFilled = 0;
1286
1287 if(inst->members && (*inst->members).first)
1288 {
1289 struct __ecereNameSpace__ecere__com__Class * curClass = (((void *)0));
1290 struct __ecereNameSpace__ecere__com__DataMember * curMember = (((void *)0));
1291 struct __ecereNameSpace__ecere__com__DataMember * subMemberStack[256];
1292 int subMemberStackPos = 0;
1293 struct MembersInit * members;
1294
1295 for(members = (*inst->members).first; members; members = members->next)
1296 {
1297 if(members->type == 0)
1298 {
1299 struct MemberInit * member = (((void *)0));
1300
1301 for(member = (*members->__anon1.dataMembers).first; member; member = member->next)
1302 {
1303 if(member->identifiers)
1304 {
1305 struct Identifier * firstID = (*member->identifiers).first;
1306 struct __ecereNameSpace__ecere__com__DataMember * _subMemberStack[256];
1307 int _subMemberStackPos = 0;
1308 struct __ecereNameSpace__ecere__com__DataMember * thisMember = (struct __ecereNameSpace__ecere__com__DataMember *)__ecereNameSpace__ecere__com__eClass_FindProperty(classSym->__anon1.registered, firstID->string, privateModule);
1309
1310 if(!thisMember)
1311 thisMember = __ecereNameSpace__ecere__com__eClass_FindDataMember(classSym->__anon1.registered, firstID->string, privateModule, _subMemberStack, &_subMemberStackPos);
1312 if(thisMember)
1313 {
1314 if(thisMember && thisMember->memberAccess == 1)
1315 {
1316 curMember = thisMember;
1317 curClass = curMember->_class;
1318 memcpy(subMemberStack, _subMemberStack, sizeof(struct __ecereNameSpace__ecere__com__DataMember *) * _subMemberStackPos);
1319 subMemberStackPos = _subMemberStackPos;
1320 }
1321 if(!firstID->next && thisMember == dataMember)
1322 {
1323 memberFilled = 1;
1324 break;
1325 }
1326 }
1327 }
1328 else
1329 {
1330 __ecereNameSpace__ecere__com__eClass_FindNextMember(classSym->__anon1.registered, &curClass, &curMember, subMemberStack, &subMemberStackPos);
1331 if(curMember == dataMember)
1332 {
1333 memberFilled = 1;
1334 break;
1335 }
1336 }
1337 }
1338 if(memberFilled)
1339 break;
1340 }
1341 if(memberFilled)
1342 break;
1343 }
1344 }
1345 if(!memberFilled)
1346 {
1347 if(zeroOut)
1348 {
1349 struct Expression * instExpCopy = CopyExpression(instExp);
1350 struct Expression * memberExp;
1351 struct Expression * setExp;
1352 struct Expression * value = MkExpConstant("0");
1353
1354 memberExp = MkExpMember(instExpCopy, MkIdentifier(dataMember->name));
1355 memberExp->__anon1.member.memberType = 3;
1356 value->usage = (value->usage & ~0x1) | (((unsigned int)(1)) << 0);
1357 setExp = MkExpOp(memberExp, '=', value);
1358 value->loc = inst->loc;
1359 setExp->loc = inst->loc;
1360 FreeType(instExpCopy->expType);
1361 instExpCopy->expType = instExp->expType;
1362 if(instExp->expType)
1363 instExp->expType->refCount++;
1364 ProcessExpressionType(setExp);
1365 ProcessExpression(setExp);
1366 ListAdd(list, setExp);
1367 }
1368 fullSet = 0;
1369 }
1370 }
1371 }
1372 }
1373 return fullSet;
1374 }
1375
1376 struct PropertyDef;
1377
1378 struct PropertyDef
1379 {
1380 struct PropertyDef * prev;
1381 struct PropertyDef * next;
1382 struct Location loc;
1383 struct __ecereNameSpace__ecere__sys__OldList *  specifiers;
1384 struct Declarator * declarator;
1385 struct Identifier * id;
1386 struct Statement * getStmt;
1387 struct Statement * setStmt;
1388 struct Statement * issetStmt;
1389 struct Symbol * symbol;
1390 struct Expression * category;
1391 struct
1392 {
1393 unsigned int conversion : 1;
1394 unsigned int isWatchable : 1;
1395 unsigned int isDBProp : 1;
1396 } ecere_gcc_struct __anon1;
1397 } ecere_gcc_struct;
1398
1399 struct __ecereNameSpace__ecere__com__NameSpace;
1400
1401 struct __ecereNameSpace__ecere__com__NameSpace
1402 {
1403 const char *  name;
1404 struct __ecereNameSpace__ecere__com__NameSpace *  btParent;
1405 struct __ecereNameSpace__ecere__com__NameSpace *  left;
1406 struct __ecereNameSpace__ecere__com__NameSpace *  right;
1407 int depth;
1408 struct __ecereNameSpace__ecere__com__NameSpace *  parent;
1409 struct __ecereNameSpace__ecere__sys__BinaryTree nameSpaces;
1410 struct __ecereNameSpace__ecere__sys__BinaryTree classes;
1411 struct __ecereNameSpace__ecere__sys__BinaryTree defines;
1412 struct __ecereNameSpace__ecere__sys__BinaryTree functions;
1413 } ecere_gcc_struct;
1414
1415 struct __ecereNameSpace__ecere__com__Class
1416 {
1417 struct __ecereNameSpace__ecere__com__Class * prev;
1418 struct __ecereNameSpace__ecere__com__Class * next;
1419 const char *  name;
1420 int offset;
1421 int structSize;
1422 void * *  _vTbl;
1423 int vTblSize;
1424 unsigned int (*  Constructor)(void * );
1425 void (*  Destructor)(void * );
1426 int offsetClass;
1427 int sizeClass;
1428 struct __ecereNameSpace__ecere__com__Class * base;
1429 struct __ecereNameSpace__ecere__sys__BinaryTree methods;
1430 struct __ecereNameSpace__ecere__sys__BinaryTree members;
1431 struct __ecereNameSpace__ecere__sys__BinaryTree prop;
1432 struct __ecereNameSpace__ecere__sys__OldList membersAndProperties;
1433 struct __ecereNameSpace__ecere__sys__BinaryTree classProperties;
1434 struct __ecereNameSpace__ecere__sys__OldList derivatives;
1435 int memberID;
1436 int startMemberID;
1437 int type;
1438 struct __ecereNameSpace__ecere__com__Instance * module;
1439 struct __ecereNameSpace__ecere__com__NameSpace *  nameSpace;
1440 const char *  dataTypeString;
1441 struct Type * dataType;
1442 int typeSize;
1443 int defaultAlignment;
1444 void (*  Initialize)();
1445 int memberOffset;
1446 struct __ecereNameSpace__ecere__sys__OldList selfWatchers;
1447 const char *  designerClass;
1448 unsigned int noExpansion;
1449 const char *  defaultProperty;
1450 unsigned int comRedefinition;
1451 int count;
1452 int isRemote;
1453 unsigned int internalDecl;
1454 void *  data;
1455 unsigned int computeSize;
1456 short structAlignment;
1457 short pointerAlignment;
1458 int destructionWatchOffset;
1459 unsigned int fixed;
1460 struct __ecereNameSpace__ecere__sys__OldList delayedCPValues;
1461 int inheritanceAccess;
1462 const char *  fullName;
1463 void *  symbol;
1464 struct __ecereNameSpace__ecere__sys__OldList conversions;
1465 struct __ecereNameSpace__ecere__sys__OldList templateParams;
1466 struct __ecereNameSpace__ecere__com__ClassTemplateArgument *  templateArgs;
1467 struct __ecereNameSpace__ecere__com__Class * templateClass;
1468 struct __ecereNameSpace__ecere__sys__OldList templatized;
1469 int numParams;
1470 unsigned int isInstanceClass;
1471 unsigned int byValueSystemClass;
1472 } ecere_gcc_struct;
1473
1474 struct __ecereNameSpace__ecere__com__Application
1475 {
1476 int argc;
1477 const char * *  argv;
1478 int exitCode;
1479 unsigned int isGUIApp;
1480 struct __ecereNameSpace__ecere__sys__OldList allModules;
1481 char *  parsedCommand;
1482 struct __ecereNameSpace__ecere__com__NameSpace systemNameSpace;
1483 } ecere_gcc_struct;
1484
1485 static unsigned int ProcessInstMembers(struct Instantiation * inst, struct Expression * instExp, struct __ecereNameSpace__ecere__sys__OldList * list, unsigned int zeroOut)
1486 {
1487 struct MembersInit * members;
1488 struct Symbol * classSym = inst->_class->__anon1.__anon1.symbol;
1489 unsigned int fullSet = 1, convert = 0;
1490
1491 if(classSym && classSym->__anon1.registered && classSym->__anon1.registered->type == 2)
1492 {
1493 struct Expression * exp = (((void *)0));
1494
1495 if(inst->members && (*inst->members).first)
1496 {
1497 struct __ecereNameSpace__ecere__com__Class * _class = (((void *)0));
1498
1499 while(_class != classSym->__anon1.registered)
1500 {
1501 struct __ecereNameSpace__ecere__com__BitMember * bitMember = (((void *)0));
1502 struct __ecereNameSpace__ecere__com__Class * lastClass = _class;
1503
1504 for(_class = classSym->__anon1.registered; _class->base != lastClass && _class->base->type != 1000; _class = _class->base)
1505 ;
1506 for(bitMember = _class->membersAndProperties.first; bitMember; bitMember = bitMember->next)
1507 {
1508 struct __ecereNameSpace__ecere__com__BitMember * curMember = (((void *)0));
1509 struct __ecereNameSpace__ecere__com__Class * curClass = (((void *)0));
1510 struct __ecereNameSpace__ecere__com__DataMember * subMemberStack[256];
1511 int subMemberStackPos = 0;
1512 struct MemberInit * member = (((void *)0));
1513 unsigned int found = 0;
1514
1515 for(members = (*inst->members).first; members; members = members->next)
1516 {
1517 if(members->type == 0)
1518 {
1519 for(member = (*members->__anon1.dataMembers).first; member; member = member->next)
1520 {
1521 if(member->identifiers)
1522 {
1523 struct Identifier * firstID = (*member->identifiers).first;
1524 struct __ecereNameSpace__ecere__com__DataMember * _subMemberStack[256];
1525 int _subMemberStackPos = 0;
1526 struct __ecereNameSpace__ecere__com__BitMember * thisMember = (struct __ecereNameSpace__ecere__com__BitMember *)__ecereNameSpace__ecere__com__eClass_FindDataMember(_class, firstID->string, privateModule, _subMemberStack, &_subMemberStackPos);
1527
1528 if(!thisMember)
1529 {
1530 thisMember = (struct __ecereNameSpace__ecere__com__BitMember *)__ecereNameSpace__ecere__com__eClass_FindProperty(_class, firstID->string, privateModule);
1531 }
1532 if(thisMember && thisMember->memberAccess == 1)
1533 {
1534 curMember = thisMember;
1535 curClass = curMember->_class;
1536 memcpy(subMemberStack, _subMemberStack, sizeof(struct __ecereNameSpace__ecere__com__DataMember *) * _subMemberStackPos);
1537 subMemberStackPos = _subMemberStackPos;
1538 }
1539 if(thisMember == bitMember)
1540 {
1541 found = 1;
1542 break;
1543 }
1544 }
1545 else
1546 {
1547 __ecereNameSpace__ecere__com__eClass_FindNextMember(classSym->__anon1.registered, &curClass, (struct __ecereNameSpace__ecere__com__DataMember **)&curMember, subMemberStack, &subMemberStackPos);
1548 if(curMember == bitMember)
1549 {
1550 found = 1;
1551 break;
1552 }
1553 }
1554 }
1555 }
1556 if(found)
1557 break;
1558 }
1559 if(member)
1560 {
1561 if(!bitMember->isProperty)
1562 {
1563 struct Expression * part = (((void *)0));
1564 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
1565 struct Declarator * decl;
1566
1567 decl = SpecDeclFromString(_class->dataTypeString, specs, (((void *)0)));
1568 ProcessInitializer(member->initializer);
1569 if(member->initializer && member->initializer->type == 0)
1570 {
1571 if(bitMember->pos)
1572 {
1573 char pos[10];
1574
1575 sprintf(pos, "%d", bitMember->pos);
1576 part = MkExpBrackets(MkListOne(MkExpOp(MkExpBrackets(MkListOne(MkExpCast(MkTypeName(specs, decl), MkExpBrackets(MkListOne(member->initializer->__anon1.exp))))), LEFT_OP, MkExpConstant(pos))));
1577 }
1578 else
1579 part = MkExpBrackets(MkListOne(MkExpCast(MkTypeName(specs, decl), MkExpBrackets(MkListOne(member->initializer->__anon1.exp)))));
1580 member->initializer->__anon1.exp = (((void *)0));
1581 FreeInitializer(member->initializer);
1582 member->initializer = (((void *)0));
1583 }
1584 if(exp)
1585 exp = MkExpOp(exp, '|', part);
1586 else
1587 exp = part;
1588 }
1589 else
1590 {
1591 char setName[1024], getName[1024];
1592
1593 DeclareProperty(curExternal, (struct __ecereNameSpace__ecere__com__Property *)bitMember, setName, getName);
1594 if(member->initializer && member->initializer->type == 0)
1595 {
1596 exp = MkExpCall(MkExpIdentifier(MkIdentifier(setName)), MkListOne(member->initializer->__anon1.exp));
1597 member->initializer->__anon1.exp = (((void *)0));
1598 FreeInitializer(member->initializer);
1599 member->initializer = (((void *)0));
1600 }
1601 }
1602 }
1603 }
1604 }
1605 }
1606 if(exp)
1607 exp = MkExpBrackets(MkListOne(exp));
1608 else
1609 exp = MkExpConstant("0");
1610 exp->expType = MkClassType(classSym->string);
1611 ProcessExpression(exp);
1612 ListAdd(list, exp);
1613 }
1614 else if(classSym && classSym->__anon1.registered && classSym->__anon1.registered->type == 3)
1615 {
1616 struct __ecereNameSpace__ecere__com__Class * _class = classSym->__anon1.registered;
1617 struct Expression * exp = (((void *)0));
1618
1619 if(inst->members && (*inst->members).first)
1620 {
1621 struct MemberInit * member = (((void *)0));
1622 struct __ecereNameSpace__ecere__com__Property * prop = (((void *)0));
1623 unsigned int found = 0;
1624
1625 for(members = (*inst->members).first; members; members = members->next)
1626 {
1627 if(members->type == 0)
1628 {
1629 for(member = (*members->__anon1.dataMembers).first; member; member = member->next)
1630 {
1631 if(member->identifiers)
1632 {
1633 struct Identifier * firstID = (*member->identifiers).first;
1634
1635 prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, firstID->string, privateModule);
1636 if(prop)
1637 {
1638 found = 1;
1639 break;
1640 }
1641 prop = (((void *)0));
1642 }
1643 else
1644 {
1645 found = 1;
1646 break;
1647 }
1648 }
1649 }
1650 if(found)
1651 break;
1652 }
1653 if(member)
1654 {
1655 if(prop)
1656 {
1657 char setName[1024], getName[1024];
1658
1659 DeclareProperty(curExternal, prop, setName, getName);
1660 if(member->initializer && member->initializer->type == 0)
1661 {
1662 exp = MkExpCall(MkExpIdentifier(MkIdentifier(setName)), MkListOne(member->initializer->__anon1.exp));
1663 member->initializer->__anon1.exp = (((void *)0));
1664 FreeInitializer(member->initializer);
1665 member->initializer = (((void *)0));
1666 }
1667 }
1668 else
1669 {
1670 ProcessInitializer(member->initializer);
1671 if(member->initializer && member->initializer->type == 0)
1672 {
1673 exp = MkExpCast(QMkClass(_class->fullName, (((void *)0))), MkExpBrackets(MkListOne(member->initializer->__anon1.exp)));
1674 member->initializer->__anon1.exp = (((void *)0));
1675 FreeInitializer(member->initializer);
1676 member->initializer = (((void *)0));
1677 }
1678 }
1679 }
1680 }
1681 if(exp)
1682 exp = MkExpBrackets(MkListOne(exp));
1683 else
1684 exp = MkExpConstant("0");
1685 ProcessExpression(exp);
1686 ListAdd(list, exp);
1687 }
1688 else if(classSym && classSym->__anon1.registered)
1689 {
1690 if(classSym->__anon1.registered->type == 1)
1691 {
1692 struct __ecereNameSpace__ecere__com__Class * _class = (((void *)0));
1693
1694 while(_class != classSym->__anon1.registered)
1695 {
1696 struct __ecereNameSpace__ecere__com__DataMember * dataMember;
1697 struct __ecereNameSpace__ecere__com__Class * lastClass = _class;
1698
1699 for(_class = classSym->__anon1.registered; _class->base != lastClass && _class->base->type != 1000; _class = _class->base)
1700 ;
1701 if(_class->structSize != _class->memberOffset)
1702 fullSet = 0;
1703 for(dataMember = _class->membersAndProperties.first; dataMember; dataMember = dataMember->next)
1704 {
1705 if(!dataMember->isProperty)
1706 {
1707 if(!dataMember->name && (dataMember->type == 1 || dataMember->type == 2))
1708 {
1709 if(!ProcessInstMembers_SimpleMemberEnsure(dataMember, inst, instExp, list, zeroOut))
1710 fullSet = 0;
1711 }
1712 else
1713 {
1714 unsigned int memberFilled = 0;
1715
1716 if(inst->members && (*inst->members).first)
1717 {
1718 struct __ecereNameSpace__ecere__com__Class * curClass = (((void *)0));
1719 struct __ecereNameSpace__ecere__com__DataMember * curMember = (((void *)0));
1720 struct __ecereNameSpace__ecere__com__DataMember * subMemberStack[256];
1721 int subMemberStackPos = 0;
1722
1723 for(members = (*inst->members).first; members; members = members->next)
1724 {
1725 if(members->type == 0 && members->__anon1.dataMembers)
1726 {
1727 struct MemberInit * member = (((void *)0));
1728
1729 for(member = (*members->__anon1.dataMembers).first; member; member = member->next)
1730 {
1731 if(member->identifiers)
1732 {
1733 struct __ecereNameSpace__ecere__com__DataMember * _subMemberStack[256];
1734 int _subMemberStackPos = 0;
1735 struct Identifier * firstID = (*member->identifiers).first;
1736 struct __ecereNameSpace__ecere__com__DataMember * thisMember = (struct __ecereNameSpace__ecere__com__DataMember *)__ecereNameSpace__ecere__com__eClass_FindProperty(classSym->__anon1.registered, firstID->string, privateModule);
1737
1738 if(!thisMember)
1739 thisMember = __ecereNameSpace__ecere__com__eClass_FindDataMember(classSym->__anon1.registered, firstID->string, privateModule, _subMemberStack, &_subMemberStackPos);
1740 if(thisMember)
1741 {
1742 if(thisMember->memberAccess == 1)
1743 {
1744 curMember = thisMember;
1745 curClass = curMember->_class;
1746 memcpy(subMemberStack, _subMemberStack, sizeof(struct __ecereNameSpace__ecere__com__DataMember *) * _subMemberStackPos);
1747 subMemberStackPos = _subMemberStackPos;
1748 }
1749 if(!firstID->next && curMember == dataMember)
1750 {
1751 memberFilled = 1;
1752 break;
1753 }
1754 }
1755 }
1756 else
1757 {
1758 __ecereNameSpace__ecere__com__eClass_FindNextMember(classSym->__anon1.registered, &curClass, &curMember, subMemberStack, &subMemberStackPos);
1759 if(curMember == dataMember)
1760 {
1761 memberFilled = 1;
1762 break;
1763 }
1764 }
1765 }
1766 if(memberFilled)
1767 break;
1768 }
1769 if(memberFilled)
1770 break;
1771 }
1772 }
1773 if(!memberFilled)
1774 {
1775 if(zeroOut)
1776 {
1777 struct Expression * instExpCopy = CopyExpression(instExp);
1778 struct Expression * memberExp;
1779 struct Expression * setExp;
1780 struct Expression * value = MkExpConstant("0");
1781
1782 memberExp = MkExpMember(instExpCopy, MkIdentifier(dataMember->name));
1783 memberExp->__anon1.member.memberType = 3;
1784 value->usage = (value->usage & ~0x1) | (((unsigned int)(1)) << 0);
1785 setExp = MkExpOp(memberExp, '=', value);
1786 value->loc = inst->loc;
1787 setExp->loc = inst->loc;
1788 FreeType(instExpCopy->expType);
1789 instExpCopy->expType = instExp->expType;
1790 if(instExp->expType)
1791 instExp->expType->refCount++;
1792 ProcessExpressionType(setExp);
1793 ProcessExpression(setExp);
1794 ListAdd(list, setExp);
1795 }
1796 fullSet = 0;
1797 }
1798 }
1799 }
1800 }
1801 }
1802 }
1803 if(inst->members && (*inst->members).first)
1804 {
1805 struct __ecereNameSpace__ecere__com__Class * curClass = (((void *)0));
1806 struct __ecereNameSpace__ecere__com__DataMember * curMember = (((void *)0));
1807 struct __ecereNameSpace__ecere__com__DataMember * subMemberStack[256];
1808 int subMemberStackPos = 0;
1809
1810 for(members = (*inst->members).first; members; members = members->next)
1811 {
1812 if(members->type == 0 && members->__anon1.dataMembers)
1813 {
1814 struct MemberInit * member = (((void *)0));
1815 struct __ecereNameSpace__ecere__com__Method * method = (((void *)0));
1816
1817 for(member = (*members->__anon1.dataMembers).first; member; member = member->next)
1818 {
1819 struct Identifier * ident = (((void *)0));
1820 struct __ecereNameSpace__ecere__com__DataMember * thisMember = (((void *)0));
1821
1822 if(member->identifiers && (*member->identifiers).first)
1823 {
1824 struct __ecereNameSpace__ecere__com__DataMember * _subMemberStack[256];
1825 int _subMemberStackPos = 0;
1826 struct Identifier * firstID = (*member->identifiers).first;
1827
1828 thisMember = (struct __ecereNameSpace__ecere__com__DataMember *)__ecereNameSpace__ecere__com__eClass_FindProperty(classSym->__anon1.registered, firstID->string, privateModule);
1829 if(!thisMember)
1830 thisMember = __ecereNameSpace__ecere__com__eClass_FindDataMember(classSym->__anon1.registered, firstID->string, privateModule, _subMemberStack, &_subMemberStackPos);
1831 ident = firstID;
1832 if(thisMember)
1833 {
1834 if(thisMember->memberAccess == 1)
1835 {
1836 curMember = thisMember;
1837 curClass = curMember->_class;
1838 memcpy(subMemberStack, _subMemberStack, sizeof(struct __ecereNameSpace__ecere__com__DataMember *) * _subMemberStackPos);
1839 subMemberStackPos = _subMemberStackPos;
1840 }
1841 }
1842 else if(classSym->__anon1.registered->type != 1)
1843 {
1844 method = __ecereNameSpace__ecere__com__eClass_FindMethod(classSym->__anon1.registered, ident->string, privateModule);
1845 if(!method || method->type != 1)
1846 method = (((void *)0));
1847 }
1848 }
1849 else
1850 {
1851 __ecereNameSpace__ecere__com__eClass_FindNextMember(classSym->__anon1.registered, &curClass, &curMember, subMemberStack, &subMemberStackPos);
1852 thisMember = curMember;
1853 }
1854 if(instExp && (thisMember || method))
1855 {
1856 struct Expression * instExpCopy = CopyExpression(instExp);
1857 struct Expression * setExp = (((void *)0));
1858
1859 instExpCopy->tempCount = instExp->tempCount;
1860 if(!ident)
1861 ident = MkIdentifier(thisMember->name);
1862 if(ident)
1863 {
1864 struct Expression * memberExp;
1865 unsigned int freeMemberExp = 0;
1866
1867 if(thisMember && thisMember->isProperty && ((struct __ecereNameSpace__ecere__com__Property *)thisMember)->conversion)
1868 convert = 1;
1869 if(member->identifiers && (*member->identifiers).count > 1)
1870 {
1871 struct Identifier * id = (*member->identifiers).first;
1872
1873 memberExp = MkExpMember(instExpCopy, id);
1874 for(id = id->next; id; id = id->next)
1875 memberExp = MkExpMember(memberExp, id);
1876 }
1877 else
1878 memberExp = MkExpMember(instExpCopy, ident);
1879 if(member->initializer && member->initializer->type == 0 && member->initializer->__anon1.exp)
1880 {
1881 member->initializer->__anon1.exp->usage = (member->initializer->__anon1.exp->usage & ~0x1) | (((unsigned int)(1)) << 0);
1882 setExp = MkExpOp(memberExp, '=', member->initializer->__anon1.exp);
1883 member->initializer->__anon1.exp = (((void *)0));
1884 FreeInitializer(member->initializer);
1885 member->initializer = (((void *)0));
1886 }
1887 else
1888 {
1889 freeMemberExp = 1;
1890 }
1891 memberExp->loc = inst->loc;
1892 if(member->identifiers)
1893 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Clear((&*member->identifiers));
1894 if(setExp)
1895 setExp->loc = inst->loc;
1896 FreeType(instExpCopy->expType);
1897 instExpCopy->expType = instExp->expType;
1898 if(instExp->expType)
1899 instExp->expType->refCount++;
1900 if(setExp)
1901 {
1902 ProcessExpressionType(setExp);
1903 ProcessExpression(setExp);
1904 ListAdd(list, setExp);
1905 }
1906 if(freeMemberExp)
1907 FreeExpression(memberExp);
1908 }
1909 }
1910 }
1911 }
1912 }
1913 }
1914 }
1915 return fullSet || convert;
1916 }
1917
1918 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_Context;
1919
1920 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_ClassImport;
1921
1922 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_Type;
1923
1924 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_Initializer;
1925
1926 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_Symbol;
1927
1928 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_Expression;
1929
1930 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_Declaration;
1931
1932 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass___ecereNameSpace__ecere__com__LinkList;
1933
1934 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_TopoEdge;
1935
1936 struct __ecereNameSpace__ecere__com__Module
1937 {
1938 struct __ecereNameSpace__ecere__com__Instance * application;
1939 struct __ecereNameSpace__ecere__sys__OldList classes;
1940 struct __ecereNameSpace__ecere__sys__OldList defines;
1941 struct __ecereNameSpace__ecere__sys__OldList functions;
1942 struct __ecereNameSpace__ecere__sys__OldList modules;
1943 struct __ecereNameSpace__ecere__com__Instance * prev;
1944 struct __ecereNameSpace__ecere__com__Instance * next;
1945 const char *  name;
1946 void *  library;
1947 void *  Unload;
1948 int importType;
1949 int origImportType;
1950 struct __ecereNameSpace__ecere__com__NameSpace privateNameSpace;
1951 struct __ecereNameSpace__ecere__com__NameSpace publicNameSpace;
1952 } ecere_gcc_struct;
1953
1954 static void CreateInstancesBody()
1955 {
1956 if(inCompiler && !createInstancesBody)
1957 {
1958 char registerName[1024], moduleName[274];
1959 struct __ecereNameSpace__ecere__sys__OldList * specifiers;
1960 struct Declarator * declarator;
1961
1962 createInstancesBody = MkCompoundStmt((((void *)0)), MkList());
1963 createInstancesBody->__anon1.compound.context = __extension__ ({
1964 struct Context * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Context);
1965
1966 __ecereInstance1->parent = globalContext, __ecereInstance1;
1967 });
1968 specifiers = MkList();
1969 ListAdd(specifiers, MkSpecifier(VOID));
1970 __ecereNameSpace__ecere__sys__GetLastDirectory(outputFile, moduleName);
1971 __ecereNameSpace__ecere__sys__StripExtension(moduleName);
1972 FixModuleName(moduleName);
1973 sprintf(registerName, "__ecereCreateModuleInstances_%s", moduleName);
1974 declarator = MkDeclaratorFunction(MkDeclaratorIdentifier(MkIdentifier(registerName)), (((void *)0)));
1975 {
1976 struct FunctionDefinition * function = _MkFunction(specifiers, declarator, (((void *)0)), 0);
1977
1978 ProcessFunctionBody(function, createInstancesBody);
1979 ListAdd(ast, createInstancesExternal = MkExternalFunction(function));
1980 }
1981 destroyInstancesBody = MkCompoundStmt((((void *)0)), MkList());
1982 destroyInstancesBody->__anon1.compound.context = __extension__ ({
1983 struct Context * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Context);
1984
1985 __ecereInstance1->parent = globalContext, __ecereInstance1;
1986 });
1987 specifiers = MkList();
1988 ListAdd(specifiers, MkSpecifier(VOID));
1989 sprintf(registerName, "__ecereDestroyModuleInstances_%s", moduleName);
1990 declarator = MkDeclaratorFunction(MkDeclaratorIdentifier(MkIdentifier(registerName)), (((void *)0)));
1991 {
1992 struct FunctionDefinition * function = _MkFunction(specifiers, declarator, (((void *)0)), 0);
1993
1994 ProcessFunctionBody(function, destroyInstancesBody);
1995 ListAdd(ast, destroyInstancesExternal = MkExternalFunction(function));
1996 }
1997 }
1998 }
1999
2000 void DeclareClass(struct External * neededFor, struct Symbol * classSym, const char * className)
2001 {
2002 if(classSym && classSym->notYetDeclared)
2003 {
2004 if(!classSym->mustRegister)
2005 {
2006 if(!classSym->_import)
2007 {
2008 if(!classSym->module)
2009 classSym->module = mainModule;
2010 if(!classSym->module)
2011 return ;
2012 classSym->_import = __extension__ ({
2013 struct ClassImport * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_ClassImport);
2014
2015 __ecereInstance1->isRemote = classSym->__anon1.registered ? classSym->__anon1.registered->isRemote : 0, __ecereInstance1->name = __ecereNameSpace__ecere__sys__CopyString(classSym->string), __ecereInstance1;
2016 });
2017 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(&classSym->module->classes, classSym->_import);
2018 }
2019 classSym->_import->itself = 1;
2020 }
2021 classSym->notYetDeclared = 0;
2022 if(!classSym->__anon2.__anon1.pointerExternal && inCompiler)
2023 {
2024 struct Declaration * decl;
2025 struct __ecereNameSpace__ecere__sys__OldList * specifiers, * declarators;
2026 struct Declarator * d;
2027
2028 specifiers = MkList();
2029 declarators = MkList();
2030 ListAdd(specifiers, MkSpecifier(EXTERN));
2031 ListAdd(specifiers, MkStructOrUnion(3, MkIdentifier("__ecereNameSpace__ecere__com__Class"), (((void *)0))));
2032 d = MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), MkDeclaratorIdentifier(MkIdentifier(className)));
2033 ListAdd(declarators, MkInitDeclarator(d, (((void *)0))));
2034 decl = MkDeclaration(specifiers, declarators);
2035 classSym->__anon2.__anon1.pointerExternal = MkExternalDeclaration(decl);
2036 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add((&*ast), classSym->__anon2.__anon1.pointerExternal);
2037 DeclareStruct(classSym->__anon2.__anon1.pointerExternal, "ecere::com::Class", 0, 1);
2038 }
2039 }
2040 if(inCompiler && classSym && classSym->__anon2.__anon1.pointerExternal && neededFor)
2041 __ecereMethod_External_CreateUniqueEdge(neededFor, classSym->__anon2.__anon1.pointerExternal, 0);
2042 }
2043
2044 void __ecereUnregisterModule_pass16(struct __ecereNameSpace__ecere__com__Instance * module)
2045 {
2046
2047 }
2048
2049 static void ProcessStatement(struct Statement *  stmt);
2050
2051 static void ProcessFunction(struct FunctionDefinition * function)
2052 {
2053 if(function->body)
2054 {
2055 yylloc = function->loc;
2056 ProcessStatement(function->body);
2057 }
2058 }
2059
2060 static void ProcessInstantiation(struct Instantiation * inst)
2061 {
2062 if(inst->members && (*inst->members).first)
2063 {
2064 struct MembersInit * members;
2065
2066 for(members = (*inst->members).first; members; members = members->next)
2067 {
2068 if(members->type == 0)
2069 {
2070 if(members->__anon1.dataMembers)
2071 {
2072 struct MemberInit * member;
2073
2074 for(member = (*members->__anon1.dataMembers).first; member; member = member->next)
2075 ProcessMemberInitData(member);
2076 }
2077 }
2078 else if(members->type == 1)
2079 {
2080 ProcessFunction((struct FunctionDefinition *)members->__anon1.function);
2081 }
2082 }
2083 }
2084 }
2085
2086 static void ProcessDeclaration(struct Declaration *  decl);
2087
2088 static void ProcessStatement(struct Statement * stmt)
2089 {
2090 yylloc = stmt->loc;
2091 switch(stmt->type)
2092 {
2093 case 0:
2094 if(stmt->__anon1.labeled.stmt)
2095 ProcessStatement(stmt->__anon1.labeled.stmt);
2096 break;
2097 case 1:
2098 if(stmt->__anon1.caseStmt.exp)
2099 ProcessExpression(stmt->__anon1.caseStmt.exp);
2100 if(stmt->__anon1.caseStmt.stmt)
2101 ProcessStatement(stmt->__anon1.caseStmt.stmt);
2102 break;
2103 case 2:
2104 {
2105 if(stmt->__anon1.compound.context)
2106 {
2107 struct Declaration * decl;
2108 struct Statement * s;
2109 struct Statement * prevCompound = curCompound;
2110 struct Context * prevContext = curContext;
2111
2112 if(!stmt->__anon1.compound.isSwitch)
2113 {
2114 curCompound = stmt;
2115 curContext = stmt->__anon1.compound.context;
2116 }
2117 if(stmt->__anon1.compound.declarations)
2118 {
2119 for(decl = (*stmt->__anon1.compound.declarations).first; decl; decl = decl->next)
2120 ProcessDeclaration(decl);
2121 }
2122 if(stmt->__anon1.compound.statements)
2123 {
2124 for(s = (*stmt->__anon1.compound.statements).first; s; s = s->next)
2125 {
2126 ProcessStatement(s);
2127 }
2128 }
2129 curCompound = prevCompound;
2130 curContext = prevContext;
2131 }
2132 break;
2133 }
2134 case 3:
2135 {
2136 struct Expression * exp;
2137
2138 if(stmt->__anon1.expressions)
2139 {
2140 for(exp = (*stmt->__anon1.expressions).first; exp; exp = exp->next)
2141 {
2142 ProcessExpression(exp);
2143 }
2144 }
2145 break;
2146 }
2147 case 4:
2148 {
2149 struct Expression * exp;
2150
2151 ((struct Expression *)(*stmt->__anon1.ifStmt.exp).last)->usage = (((struct Expression *)(*stmt->__anon1.ifStmt.exp).last)->usage & ~0x1) | (((unsigned int)(1)) << 0);
2152 for(exp = (*stmt->__anon1.ifStmt.exp).first; exp; exp = exp->next)
2153 {
2154 ProcessExpression(exp);
2155 }
2156 if(stmt->__anon1.ifStmt.stmt)
2157 ProcessStatement(stmt->__anon1.ifStmt.stmt);
2158 if(stmt->__anon1.ifStmt.elseStmt)
2159 ProcessStatement(stmt->__anon1.ifStmt.elseStmt);
2160 break;
2161 }
2162 case 5:
2163 {
2164 struct Expression * exp;
2165
2166 ((struct Expression *)(*stmt->__anon1.switchStmt.exp).last)->usage = (((struct Expression *)(*stmt->__anon1.switchStmt.exp).last)->usage & ~0x1) | (((unsigned int)(1)) << 0);
2167 for(exp = (*stmt->__anon1.switchStmt.exp).first; exp; exp = exp->next)
2168 ProcessExpression(exp);
2169 ProcessStatement(stmt->__anon1.switchStmt.stmt);
2170 break;
2171 }
2172 case 6:
2173 {
2174 if(stmt->__anon1.whileStmt.exp)
2175 {
2176 struct Expression * exp;
2177
2178 ((struct Expression *)(*stmt->__anon1.whileStmt.exp).last)->usage = (((struct Expression *)(*stmt->__anon1.whileStmt.exp).last)->usage & ~0x1) | (((unsigned int)(1)) << 0);
2179 for(exp = (*stmt->__anon1.whileStmt.exp).first; exp; exp = exp->next)
2180 {
2181 ProcessExpression(exp);
2182 }
2183 }
2184 if(stmt->__anon1.whileStmt.stmt)
2185 ProcessStatement(stmt->__anon1.whileStmt.stmt);
2186 break;
2187 }
2188 case 7:
2189 {
2190 if(stmt->__anon1.doWhile.exp)
2191 {
2192 struct Expression * exp;
2193
2194 ((struct Expression *)(*stmt->__anon1.doWhile.exp).last)->usage = (((struct Expression *)(*stmt->__anon1.doWhile.exp).last)->usage & ~0x1) | (((unsigned int)(1)) << 0);
2195 for(exp = (*stmt->__anon1.doWhile.exp).first; exp; exp = exp->next)
2196 {
2197 ProcessExpression(exp);
2198 }
2199 }
2200 if(stmt->__anon1.doWhile.stmt)
2201 ProcessStatement(stmt->__anon1.doWhile.stmt);
2202 break;
2203 }
2204 case 8:
2205 {
2206 struct Expression * exp;
2207
2208 if(stmt->__anon1.forStmt.init)
2209 ProcessStatement(stmt->__anon1.forStmt.init);
2210 if(stmt->__anon1.forStmt.check && stmt->__anon1.forStmt.check->__anon1.expressions)
2211 {
2212 ((struct Expression *)(*stmt->__anon1.forStmt.check->__anon1.expressions).last)->usage = (((struct Expression *)(*stmt->__anon1.forStmt.check->__anon1.expressions).last)->usage & ~0x1) | (((unsigned int)(1)) << 0);
2213 }
2214 if(stmt->__anon1.forStmt.check)
2215 ProcessStatement(stmt->__anon1.forStmt.check);
2216 if(stmt->__anon1.forStmt.increment)
2217 {
2218 for(exp = (*stmt->__anon1.forStmt.increment).first; exp; exp = exp->next)
2219 ProcessExpression(exp);
2220 }
2221 if(stmt->__anon1.forStmt.stmt)
2222 ProcessStatement(stmt->__anon1.forStmt.stmt);
2223 break;
2224 }
2225 case 9:
2226 break;
2227 case 10:
2228 break;
2229 case 11:
2230 break;
2231 case 12:
2232 {
2233 struct Expression * exp;
2234
2235 if(stmt->__anon1.expressions && (*stmt->__anon1.expressions).last)
2236 {
2237 ((struct Expression *)(*stmt->__anon1.expressions).last)->usage = (((struct Expression *)(*stmt->__anon1.expressions).last)->usage & ~0x1) | (((unsigned int)(1)) << 0);
2238 for(exp = (*stmt->__anon1.expressions).first; exp; exp = exp->next)
2239 {
2240 ProcessExpression(exp);
2241 }
2242 }
2243 break;
2244 }
2245 case 14:
2246 {
2247 ProcessDeclaration(stmt->__anon1.decl);
2248 break;
2249 }
2250 case 13:
2251 {
2252 struct AsmField * field;
2253
2254 if(stmt->__anon1.asmStmt.inputFields)
2255 {
2256 for(field = (*stmt->__anon1.asmStmt.inputFields).first; field; field = field->next)
2257 if(field->expression)
2258 ProcessExpression(field->expression);
2259 }
2260 if(stmt->__anon1.asmStmt.outputFields)
2261 {
2262 for(field = (*stmt->__anon1.asmStmt.outputFields).first; field; field = field->next)
2263 if(field->expression)
2264 ProcessExpression(field->expression);
2265 }
2266 if(stmt->__anon1.asmStmt.clobberedFields)
2267 {
2268 for(field = (*stmt->__anon1.asmStmt.clobberedFields).first; field; field = field->next)
2269 if(field->expression)
2270 ProcessExpression(field->expression);
2271 }
2272 break;
2273 }
2274 }
2275 }
2276
2277 struct ClassDef;
2278
2279 typedef union YYSTYPE
2280 {
2281 int specifierType;
2282 int i;
2283 int declMode;
2284 struct Identifier * id;
2285 struct Expression * exp;
2286 struct Specifier * specifier;
2287 struct __ecereNameSpace__ecere__sys__OldList * list;
2288 struct Enumerator * enumerator;
2289 struct Declarator * declarator;
2290 struct Pointer * pointer;
2291 struct Initializer * initializer;
2292 struct InitDeclarator * initDeclarator;
2293 struct TypeName * typeName;
2294 struct Declaration * declaration;
2295 struct Statement * stmt;
2296 struct FunctionDefinition * function;
2297 struct External * external;
2298 struct Context * context;
2299 struct AsmField * asmField;
2300 struct Attrib * attrib;
2301 struct ExtDecl * extDecl;
2302 struct Attribute * attribute;
2303 struct Instantiation * instance;
2304 struct MembersInit * membersInit;
2305 struct MemberInit * memberInit;
2306 struct ClassFunction * classFunction;
2307 struct ClassDefinition * _class;
2308 struct ClassDef * classDef;
2309 struct PropertyDef * prop;
2310 char * string;
2311 struct Symbol * symbol;
2312 struct PropertyWatch * propertyWatch;
2313 struct TemplateParameter * templateParameter;
2314 struct TemplateArgument * templateArgument;
2315 struct TemplateDatatype * templateDatatype;
2316 struct DBTableEntry * dbtableEntry;
2317 struct DBIndexItem * dbindexItem;
2318 struct DBTableDef * dbtableDef;
2319 } ecere_gcc_struct YYSTYPE;
2320
2321 extern YYSTYPE yylval;
2322
2323 struct ClassDef
2324 {
2325 struct ClassDef * prev;
2326 struct ClassDef * next;
2327 struct Location loc;
2328 int type;
2329 union
2330 {
2331 struct Declaration * decl;
2332 struct ClassFunction * function;
2333 struct __ecereNameSpace__ecere__sys__OldList *  defProperties;
2334 struct PropertyDef * propertyDef;
2335 struct PropertyWatch * propertyWatch;
2336 char *  designer;
2337 struct Identifier * defaultProperty;
2338 struct
2339 {
2340 struct Identifier * id;
2341 struct Initializer * initializer;
2342 } ecere_gcc_struct __anon1;
2343 } ecere_gcc_struct __anon1;
2344 int memberAccess;
2345 void *  object;
2346 } ecere_gcc_struct;
2347
2348 static void ProcessSpecifier(struct Specifier * spec)
2349 {
2350 switch(spec->type)
2351 {
2352 case 0:
2353 break;
2354 case 1:
2355 {
2356 break;
2357 }
2358 case 2:
2359 {
2360 struct Enumerator * e;
2361
2362 if(spec->__anon1.__anon2.list)
2363 {
2364 for(e = (*spec->__anon1.__anon2.list).first; e; e = e->next)
2365 {
2366 if(e->exp)
2367 ProcessExpression(e->exp);
2368 }
2369 }
2370 break;
2371 }
2372 case 3:
2373 case 4:
2374 {
2375 if(spec->__anon1.__anon2.definitions)
2376 {
2377 struct ClassDef * def;
2378
2379 for(def = (*spec->__anon1.__anon2.definitions).first; def; def = def->next)
2380 {
2381 if(def->type == 2 && def->__anon1.decl && def->__anon1.decl->type == 0)
2382 ProcessDeclaration(def->__anon1.decl);
2383 }
2384 }
2385 break;
2386 }
2387 }
2388 }
2389
2390 void ProcessInstantiations()
2391 {
2392 struct External * external;
2393
2394 for(external = (*ast).first; external; external = external->next)
2395 {
2396 curExternal = external;
2397 if(external->type == 1)
2398 {
2399 if(external->__anon1.declaration)
2400 {
2401 unsigned int isInstance = external->__anon1.declaration->type == 2;
2402 struct Symbol * sym = isInstance ? FindClass(external->__anon1.declaration->__anon1.inst->_class->__anon1.__anon1.name) : (((void *)0));
2403
2404 ProcessDeclaration(external->__anon1.declaration);
2405 if(isInstance)
2406 {
2407 struct TopoEdge * e, * next;
2408
2409 for(e = ((struct __ecereNameSpace__ecere__com__LinkList *)(((char *)external->incoming + 0 + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->first; e; e = next)
2410 {
2411 struct External * from = e->from;
2412
2413 next = e->in.next;
2414 if(((struct __ecereNameSpace__ecere__com__LinkList *)(((char *)from->incoming + 0 + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->count)
2415 {
2416 unsigned int reroute = 1;
2417
2418 if(sym && sym->__anon1.registered && sym->__anon1.registered->type == 1)
2419 reroute = 0;
2420 else if(from->type == 1 && from->__anon1.declaration && (!from->__anon1.declaration->__anon1.__anon1.declarators || !(*from->__anon1.declaration->__anon1.__anon1.declarators).count) && from->__anon1.declaration->__anon1.__anon1.specifiers)
2421 {
2422 struct Specifier * spec = (((void *)0));
2423
2424 for(spec = (*from->__anon1.declaration->__anon1.__anon1.specifiers).first; spec; spec = spec->next)
2425 {
2426 if(spec->type == 3 || spec->type == 4)
2427 break;
2428 }
2429 if(sym->__anon1.registered && spec && spec->__anon1.__anon2.id && spec->__anon1.__anon2.id->string)
2430 {
2431 char className[1024];
2432 struct __ecereNameSpace__ecere__com__Class * c = sym->__anon1.registered;
2433
2434 strcpy(className, "__ecereClass_");
2435 if(c->type == 5 && c->templateClass)
2436 FullClassNameCat(className, c->templateClass->name, 1);
2437 else
2438 FullClassNameCat(className, c->name, 1);
2439 if(!strcmp(c->name, spec->__anon1.__anon2.id->string))
2440 reroute = 0;
2441 }
2442 }
2443 if(reroute)
2444 {
2445 unsigned int skip = 0;
2446
2447 e->to = createInstancesExternal;
2448 ((void (*)(struct __ecereNameSpace__ecere__com__Instance *, struct __ecereNameSpace__ecere__com__IteratorPointer * it))__extension__ ({
2449 struct __ecereNameSpace__ecere__com__Instance * __internal_ClassInst = external->incoming;
2450
2451 __internal_ClassInst ? __internal_ClassInst->_vTbl : __ecereClass___ecereNameSpace__ecere__com__LinkList->_vTbl;
2452 })[__ecereVMethodID___ecereNameSpace__ecere__com__Container_Remove])(external->incoming, (struct __ecereNameSpace__ecere__com__IteratorPointer *)e);
2453 {
2454 struct TopoEdge * i;
2455 struct __ecereNameSpace__ecere__com__Instance * __internalLinkList = createInstancesExternal->incoming;
2456
2457 for(i = ((struct __ecereNameSpace__ecere__com__LinkList *)(((char *)__internalLinkList + 0 + sizeof(struct __ecereNameSpace__ecere__com__Instance))))->first; i; i = (struct TopoEdge *)((struct __ecereNameSpace__ecere__com__IteratorPointer * (*)(struct __ecereNameSpace__ecere__com__Instance *, struct __ecereNameSpace__ecere__com__IteratorPointer * pointer))__extension__ ({
2458 struct __ecereNameSpace__ecere__com__Instance * __internal_ClassInst = __internalLinkList;
2459
2460 __internal_ClassInst ? __internal_ClassInst->_vTbl : __ecereClass___ecereNameSpace__ecere__com__LinkList->_vTbl;
2461 })[__ecereVMethodID___ecereNameSpace__ecere__com__Container_GetNext])(__internalLinkList, (struct __ecereNameSpace__ecere__com__IteratorPointer *)i))
2462 {
2463 if(i->from == from)
2464 {
2465 skip = 1;
2466 if(i->breakable && !e->breakable)
2467 {
2468 i->breakable = 1;
2469 createInstancesExternal->nonBreakableIncoming++;
2470 }
2471 break;
2472 }
2473 }
2474 }
2475 if(skip)
2476 {
2477 external->nonBreakableIncoming--;
2478 ((void (*)(struct __ecereNameSpace__ecere__com__Instance *, struct __ecereNameSpace__ecere__com__IteratorPointer * it))__extension__ ({
2479 struct __ecereNameSpace__ecere__com__Instance * __internal_ClassInst = e->from->outgoing;
2480
2481 __internal_ClassInst ? __internal_ClassInst->_vTbl : __ecereClass___ecereNameSpace__ecere__com__LinkList->_vTbl;
2482 })[__ecereVMethodID___ecereNameSpace__ecere__com__Container_Remove])(e->from->outgoing, (struct __ecereNameSpace__ecere__com__IteratorPointer *)e);
2483 ((e ? __extension__ ({
2484 void * __ecerePtrToDelete = (e);
2485
2486 __ecereClass_TopoEdge->Destructor ? __ecereClass_TopoEdge->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete);
2487 }) : 0), e = 0);
2488 }
2489 else
2490 {
2491 ((struct __ecereNameSpace__ecere__com__IteratorPointer * (*)(struct __ecereNameSpace__ecere__com__Instance *, uint64 value))__extension__ ({
2492 struct __ecereNameSpace__ecere__com__Instance * __internal_ClassInst = createInstancesExternal->incoming;
2493
2494 __internal_ClassInst ? __internal_ClassInst->_vTbl : __ecereClass___ecereNameSpace__ecere__com__LinkList->_vTbl;
2495 })[__ecereVMethodID___ecereNameSpace__ecere__com__Container_Add])(createInstancesExternal->incoming, (uint64)(uintptr_t)(e));
2496 if(!e->breakable)
2497 {
2498 external->nonBreakableIncoming--;
2499 createInstancesExternal->nonBreakableIncoming++;
2500 }
2501 }
2502 }
2503 }
2504 }
2505 }
2506 }
2507 }
2508 else if(external->type == 0)
2509 {
2510 ProcessFunction(external->__anon1.function);
2511 }
2512 else if(external->type == 2)
2513 {
2514 struct ClassDefinition * _class = external->__anon1._class;
2515
2516 if(_class->definitions)
2517 {
2518 struct ClassDef * def;
2519
2520 for(def = (*_class->definitions).first; def; def = def->next)
2521 {
2522 if(def->type == 0)
2523 {
2524 curExternal = def->__anon1.function->declarator ? def->__anon1.function->declarator->symbol->__anon2.__anon1.pointerExternal : external;
2525 ProcessFunction((struct FunctionDefinition *)def->__anon1.function);
2526 }
2527 else if(def->type == 2 && def->__anon1.decl->type == 2)
2528 {
2529 ProcessInstantiation(def->__anon1.decl->__anon1.inst);
2530 }
2531 else if(def->type == 1 && def->__anon1.defProperties)
2532 {
2533 struct MemberInit * defProperty;
2534 struct Symbol * thisSymbol = (thisSymbol = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Symbol), thisSymbol->string = __ecereNameSpace__ecere__sys__CopyString("this"), thisSymbol->type = MkClassTypeSymbol(_class->symbol), thisSymbol);
2535
2536 __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Add(&globalContext->symbols, (struct __ecereNameSpace__ecere__sys__BTNode *)thisSymbol);
2537 for(defProperty = (*def->__anon1.defProperties).first; defProperty; defProperty = defProperty->next)
2538 {
2539 ProcessMemberInitData(defProperty);
2540 }
2541 __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Remove(&globalContext->symbols, (struct __ecereNameSpace__ecere__sys__BTNode *)thisSymbol);
2542 FreeSymbol(thisSymbol);
2543 }
2544 else if(def->type == 3 && def->__anon1.propertyDef)
2545 {
2546 struct PropertyDef * prop = def->__anon1.propertyDef;
2547 struct Symbol * thisSymbol = (thisSymbol = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Symbol), thisSymbol->string = __ecereNameSpace__ecere__sys__CopyString("this"), thisSymbol->type = MkClassTypeSymbol(_class->symbol), thisSymbol);
2548
2549 __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Add(&globalContext->symbols, (struct __ecereNameSpace__ecere__sys__BTNode *)thisSymbol);
2550 if(prop->setStmt)
2551 {
2552 curExternal = prop->symbol ? prop->symbol->__anon2.__anon2.externalSet : (((void *)0));
2553 ProcessStatement(prop->setStmt);
2554 }
2555 if(prop->getStmt)
2556 {
2557 curExternal = prop->symbol ? prop->symbol->__anon2.__anon2.externalGet : (((void *)0));
2558 ProcessStatement(prop->getStmt);
2559 }
2560 if(prop->issetStmt)
2561 {
2562 curExternal = prop->symbol ? prop->symbol->__anon2.__anon2.externalIsSet : (((void *)0));
2563 ProcessStatement(prop->issetStmt);
2564 }
2565 __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Remove(&globalContext->symbols, (struct __ecereNameSpace__ecere__sys__BTNode *)thisSymbol);
2566 FreeSymbol(thisSymbol);
2567 }
2568 else if(def->type == 4 && def->__anon1.propertyWatch)
2569 {
2570 struct PropertyWatch * propertyWatch = def->__anon1.propertyWatch;
2571 struct Symbol * thisSymbol = (thisSymbol = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Symbol), thisSymbol->string = __ecereNameSpace__ecere__sys__CopyString("this"), thisSymbol->type = MkClassTypeSymbol(_class->symbol), thisSymbol);
2572
2573 __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Add(&globalContext->symbols, (struct __ecereNameSpace__ecere__sys__BTNode *)thisSymbol);
2574 if(propertyWatch->compound)
2575 {
2576 __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Add(&propertyWatch->compound->__anon1.compound.context->symbols, (struct __ecereNameSpace__ecere__sys__BTNode *)thisSymbol);
2577 curExternal = (((void *)0));
2578 ProcessStatement(propertyWatch->compound);
2579 }
2580 __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Remove(&globalContext->symbols, (struct __ecereNameSpace__ecere__sys__BTNode *)thisSymbol);
2581 FreeSymbol(thisSymbol);
2582 }
2583 }
2584 }
2585 }
2586 }
2587 }
2588
2589 void __ecereRegisterModule_pass16(struct __ecereNameSpace__ecere__com__Instance * module)
2590 {
2591 struct __ecereNameSpace__ecere__com__Class __attribute__((unused)) * class;
2592
2593 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("DeclareClass", "void DeclareClass(External neededFor, Symbol classSym, const char * className)", DeclareClass, module, 1);
2594 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ProcessExpressionInstPass", "void ProcessExpressionInstPass(Expression exp)", ProcessExpressionInstPass, module, 2);
2595 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ProcessInstantiations", "void ProcessInstantiations(void)", ProcessInstantiations, module, 1);
2596 }
2597
2598 static unsigned int ProcessBracketInst_DataMember(struct __ecereNameSpace__ecere__com__DataMember *  parentMember, struct Instantiation *  inst, struct __ecereNameSpace__ecere__sys__OldList *  list, struct __ecereNameSpace__ecere__com__DataMember *  namedParentMember, unsigned int parentMemberSet);
2599
2600 static unsigned int ProcessBracketInst(struct Instantiation * inst, struct __ecereNameSpace__ecere__sys__OldList * list)
2601 {
2602 static int recursionCount = 0;
2603 struct Symbol * classSym = inst->_class->__anon1.__anon1.symbol;
2604 struct __ecereNameSpace__ecere__com__Class * _class = (((void *)0));
2605 int anonID = 1;
2606
2607 if(recursionCount > 500)
2608 return 0;
2609 recursionCount++;
2610 while(_class != classSym->__anon1.registered)
2611 {
2612 struct __ecereNameSpace__ecere__com__DataMember * dataMember;
2613 struct __ecereNameSpace__ecere__com__Class * lastClass = _class;
2614
2615 for(_class = classSym->__anon1.registered; _class->base != lastClass && _class->base->type != 1000; _class = _class->base)
2616 ;
2617 for(dataMember = _class->membersAndProperties.first; dataMember; dataMember = dataMember->next)
2618 {
2619 if(!dataMember->isProperty && !dataMember->name && (dataMember->type == 1 || dataMember->type == 2))
2620 {
2621 struct __ecereNameSpace__ecere__sys__OldList * subList = MkList();
2622
2623 if(!ProcessBracketInst_DataMember(dataMember, inst, subList ? subList : list, dataMember, 0))
2624 {
2625 if(subList)
2626 FreeList(subList, (void *)(FreeInitializer));
2627 recursionCount--;
2628 return 0;
2629 }
2630 if(dataMember->type == 2 || (subList && (*subList).count))
2631 {
2632 struct Initializer * init = MkInitializerList(subList);
2633 char id[100];
2634
2635 sprintf(id, "__anon%d", anonID);
2636 init->id = MkIdentifier(id);
2637 ListAdd(list, init);
2638 }
2639 else
2640 (__ecereNameSpace__ecere__com__eSystem_Delete(subList), subList = 0);
2641 anonID++;
2642 }
2643 else
2644 {
2645 struct MembersInit * members;
2646 struct MemberInit * member = (((void *)0));
2647 unsigned int found = 0;
2648
2649 if(inst->members && (*inst->members).first)
2650 {
2651 struct __ecereNameSpace__ecere__com__DataMember * curMember = (((void *)0));
2652 struct __ecereNameSpace__ecere__com__Class * curClass = (((void *)0));
2653 struct __ecereNameSpace__ecere__com__DataMember * subMemberStack[256];
2654 int subMemberStackPos = 0;
2655
2656 for(members = (*inst->members).first; members; members = members->next)
2657 {
2658 if(members->type == 0)
2659 {
2660 for(member = (*members->__anon1.dataMembers).first; member; member = member->next)
2661 {
2662 struct Identifier * firstID = member->identifiers ? (*member->identifiers).first : (((void *)0));
2663
2664 if(firstID)
2665 {
2666 struct __ecereNameSpace__ecere__com__DataMember * _subMemberStack[256];
2667 int _subMemberStackPos = 0;
2668 struct __ecereNameSpace__ecere__com__DataMember * thisMember = (struct __ecereNameSpace__ecere__com__DataMember *)__ecereNameSpace__ecere__com__eClass_FindProperty(classSym->__anon1.registered, firstID->string, privateModule);
2669
2670 if(!thisMember)
2671 thisMember = __ecereNameSpace__ecere__com__eClass_FindDataMember(classSym->__anon1.registered, firstID->string, privateModule, _subMemberStack, &_subMemberStackPos);
2672 if(thisMember)
2673 {
2674 curMember = thisMember;
2675 curClass = curMember->_class;
2676 memcpy(subMemberStack, _subMemberStack, sizeof(struct __ecereNameSpace__ecere__com__DataMember *) * _subMemberStackPos);
2677 subMemberStackPos = _subMemberStackPos;
2678 }
2679 if(curMember == dataMember)
2680 {
2681 if(dataMember->isProperty)
2682 {
2683 if(!((struct __ecereNameSpace__ecere__com__Property *)dataMember)->Set)
2684 {
2685 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "No set defined for property %s\n", (((void *)0))), dataMember->name);
2686 continue;
2687 }
2688 recursionCount--;
2689 return 0;
2690 }
2691 if((*member->identifiers).count > 1 && member->initializer && member->initializer->type == 0)
2692 {
2693 struct __ecereNameSpace__ecere__sys__OldList * partList = MkList();
2694 struct Specifier * spec;
2695 struct MembersInit * nextMembers;
2696 struct MemberInit * next = member->next;
2697 struct Symbol * symbol;
2698
2699 if(!dataMember->dataType)
2700 dataMember->dataType = ProcessTypeString(dataMember->dataTypeString, 0);
2701 symbol = (dataMember->dataType && dataMember->dataType->kind == 8) ? dataMember->dataType->__anon1._class : (((void *)0));
2702 spec = _MkSpecifierName(dataMember->dataTypeString, symbol, (((void *)0)));
2703 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove((&*member->identifiers), firstID);
2704 ListAdd(partList, MkMemberInit(member->identifiers, MkInitializerAssignment(member->initializer->__anon1.exp)));
2705 for(nextMembers = members; nextMembers; nextMembers = nextMembers->next)
2706 {
2707 if(!nextMembers->__anon1.dataMembers)
2708 continue;
2709 if(members != nextMembers)
2710 next = (*nextMembers->__anon1.dataMembers).first;
2711 if(nextMembers->type == 0)
2712 {
2713 struct MemberInit * nextMember;
2714
2715 for(nextMember = next; nextMember; nextMember = next, next = nextMember ? nextMember->next : (((void *)0)))
2716 {
2717 struct Identifier * nextID = (*nextMember->identifiers).first;
2718
2719 if(nextMember->identifiers && (*nextMember->identifiers).count > 1 && !strcmp(firstID->string, nextID->string))
2720 {
2721 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove((&*nextMembers->__anon1.dataMembers), nextMember);
2722 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove((&*nextMember->identifiers), nextID);
2723 ListAdd(partList, nextMember);
2724 FreeIdentifier(nextID);
2725 }
2726 }
2727 }
2728 }
2729 member->initializer->__anon1.exp = MkExpInstance(MkInstantiation(spec, (((void *)0)), MkListOne(MkMembersInitList(partList))));
2730 FreeIdentifier(firstID);
2731 member->identifiers = (((void *)0));
2732 }
2733 found = 1;
2734 break;
2735 }
2736 }
2737 else
2738 {
2739 __ecereNameSpace__ecere__com__eClass_FindNextMember(classSym->__anon1.registered, &curClass, &curMember, subMemberStack, &subMemberStackPos);
2740 if(curMember == dataMember)
2741 {
2742 if(dataMember->isProperty)
2743 {
2744 if(!((struct __ecereNameSpace__ecere__com__Property *)dataMember)->Set)
2745 {
2746 Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "No set defined for property %s\n", (((void *)0))), dataMember->name);
2747 continue;
2748 }
2749 recursionCount--;
2750 return 0;
2751 }
2752 found = 1;
2753 break;
2754 }
2755 }
2756 }
2757 }
2758 if(found)
2759 break;
2760 }
2761 }
2762 if(dataMember->isProperty)
2763 continue;
2764 if(member && member->initializer && member->initializer->type == 0)
2765 {
2766 if(member->initializer->__anon1.exp->type == 1 && member->initializer->__anon1.exp->expType && member->initializer->__anon1.exp->expType->__anon1._class && member->initializer->__anon1.exp->expType->__anon1._class->__anon1.registered && member->initializer->__anon1.exp->expType->__anon1._class->__anon1.registered->type == 1)
2767 {
2768 struct __ecereNameSpace__ecere__sys__OldList * subList = MkList();
2769
2770 ProcessBracketInst(member->initializer->__anon1.exp->__anon1.instance, subList);
2771 FreeExpression(member->initializer->__anon1.exp);
2772 member->initializer->__anon1.exp = (((void *)0));
2773 ListAdd(list, MkInitializerList(subList));
2774 }
2775 else
2776 {
2777 member->initializer->__anon1.exp->usage = (member->initializer->__anon1.exp->usage & ~0x1) | (((unsigned int)(1)) << 0);
2778 ProcessExpression(member->initializer->__anon1.exp);
2779 ListAdd(list, MkInitializerAssignment(CopyExpression(member->initializer->__anon1.exp)));
2780 }
2781 member->takeOutExp = 1;
2782 }
2783 else if(member && member->initializer && member->initializer->type == 1)
2784 {
2785 ListAdd(list, member->initializer);
2786 member->initializer = (((void *)0));
2787 }
2788 else if(dataMember && dataMember->dataTypeString)
2789 {
2790 struct Symbol * classSym;
2791
2792 if(!dataMember->dataType)
2793 dataMember->dataType = ProcessTypeString(dataMember->dataTypeString, 0);
2794 classSym = (dataMember->dataType && dataMember->dataType->kind == 8) ? dataMember->dataType->__anon1._class : (((void *)0));
2795 if(classSym && classSym->__anon1.registered && classSym->__anon1.registered->type == 1)
2796 {
2797 struct __ecereNameSpace__ecere__sys__OldList * subList = MkList();
2798 struct Specifier * spec = _MkSpecifierName(dataMember->dataTypeString, classSym, (((void *)0)));
2799 struct Instantiation * inst = MkInstantiation(spec, (((void *)0)), (((void *)0)));
2800
2801 ProcessBracketInst(inst, subList);
2802 FreeInstance(inst);
2803 ListAdd(list, MkInitializerList(subList));
2804 }
2805 else if(dataMember->dataType->kind == 12)
2806 {
2807 struct Type * t = dataMember->dataType->__anon1.type;
2808 struct Initializer * inner = MkInitializerAssignment((((void *)0))), * i = inner;
2809
2810 while(t && t->kind == 12)
2811 {
2812 i = MkInitializerList(MkListOne(i));
2813 t = t->__anon1.type;
2814 }
2815 if(t && t->kind == 8 && t->__anon1._class && t->__anon1._class->__anon1.registered && t->__anon1._class->__anon1.registered->type == 1)
2816 {
2817 struct __ecereNameSpace__ecere__sys__OldList * subList = MkList();
2818 struct Specifier * spec = _MkSpecifierName(t->__anon1._class->__anon1.registered->name, classSym, (((void *)0)));
2819 struct Instantiation * inst = MkInstantiation(spec, (((void *)0)), (((void *)0)));
2820
2821 ProcessBracketInst(inst, subList);
2822 FreeInstance(inst);
2823 inner->type = 1;
2824 inner->__anon1.list = subList;
2825 }
2826 else
2827 inner->__anon1.exp = MkExpConstant("0");
2828 ListAdd(list, MkInitializerList(MkListOne(i)));
2829 }
2830 else
2831 ListAdd(list, MkInitializerAssignment(MkExpConstant("0")));
2832 }
2833 }
2834 }
2835 }
2836 if(inst->members && (*inst->members).first)
2837 {
2838 struct MembersInit * members;
2839 struct MemberInit * member = (((void *)0));
2840
2841 for(members = (*inst->members).first; members; members = members->next)
2842 {
2843 if(members->type == 0)
2844 {
2845 for(member = (*members->__anon1.dataMembers).first; member; member = member->next)
2846 {
2847 if(member->takeOutExp)
2848 {
2849 FreeInitializer(member->initializer);
2850 member->initializer = (((void *)0));
2851 }
2852 }
2853 }
2854 }
2855 }
2856 recursionCount--;
2857 return 1;
2858 }
2859
2860 static void ProcessExpression(struct Expression * exp)
2861 {
2862 switch(exp->type)
2863 {
2864 case 0:
2865 break;
2866 case 1:
2867 {
2868 struct Instantiation * inst = exp->__anon1.instance;
2869
2870 if(inCompiler && inst->_class)
2871 {
2872 char className[1024];
2873 struct Symbol * classSym = inst->_class->__anon1.__anon1.symbol;
2874 struct Expression * instExp;
2875
2876 if(classSym && classSym->__anon1.registered && classSym->__anon1.registered->type == 2)
2877 {
2878 if(inst->exp)
2879 {
2880 struct __ecereNameSpace__ecere__sys__OldList list =
2881 {
2882 0
2883 };
2884
2885 ProcessInstMembers(inst, (((void *)0)), &list, 0);
2886 ProcessExpression(inst->exp);
2887 exp->type = 4;
2888 exp->__anon1.op.op = '=';
2889 exp->__anon1.op.exp1 = inst->exp;
2890 exp->__anon1.op.exp2 = list.first;
2891 inst->exp = (((void *)0));
2892 }
2893 else
2894 {
2895 struct Type * expType = exp->expType;
2896 struct Expression * prev = exp->prev, * next = exp->next;
2897 struct __ecereNameSpace__ecere__sys__OldList list =
2898 {
2899 0, 0, 0, 0, 0
2900 };
2901
2902 ProcessInstMembers(inst, (((void *)0)), &list, 0);
2903 FreeType(exp->destType);
2904 *exp = *(struct Expression *)list.first;
2905 {
2906 struct Expression * firstExp = list.first;
2907
2908 ((firstExp ? __extension__ ({
2909 void * __ecerePtrToDelete = (firstExp);
2910
2911 __ecereClass_Expression->Destructor ? __ecereClass_Expression->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete);
2912 }) : 0), firstExp = 0);
2913 }
2914 FreeType(exp->destType);
2915 exp->destType = expType;
2916 exp->prev = prev;
2917 exp->next = next;
2918 }
2919 }
2920 else if(classSym && classSym->__anon1.registered && (classSym->__anon1.registered->type == 3 || classSym->__anon1.registered->type == 4))
2921 {
2922 if(inst->exp)
2923 {
2924 struct __ecereNameSpace__ecere__sys__OldList list =
2925 {
2926 0
2927 };
2928 struct Expression * e;
2929
2930 ProcessInstMembers(inst, (((void *)0)), &list, 0);
2931 ProcessExpression(inst->exp);
2932 exp->type = 4;
2933 exp->__anon1.op.op = '=';
2934 exp->__anon1.op.exp1 = inst->exp;
2935 exp->__anon1.op.exp2 = list.first;
2936 inst->exp = (((void *)0));
2937 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove(&list, list.first);
2938 while((e = list.first))
2939 {
2940 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove(&list, e);
2941 FreeExpression(e);
2942 }
2943 }
2944 else
2945 {
2946 struct Expression * prev = exp->prev, * next = exp->next;
2947 struct Type * expType = exp->expType;
2948 struct __ecereNameSpace__ecere__sys__OldList list =
2949 {
2950 0
2951 };
2952
2953 ProcessInstMembers(inst, (((void *)0)), &list, 0);
2954 if(list.first)
2955 {
2956 struct Expression * e = list.first;
2957
2958 FreeType(exp->destType);
2959 *exp = *e;
2960 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove(&list, e);
2961 ((e ? __extension__ ({
2962 void * __ecerePtrToDelete = (e);
2963
2964 __ecereClass_Expression->Destructor ? __ecereClass_Expression->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete);
2965 }) : 0), e = 0);
2966 exp->expType = expType;
2967 exp->prev = prev;
2968 exp->next = next;
2969 while((e = list.first))
2970 {
2971 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove(&list, e);
2972 FreeExpression(e);
2973 }
2974 }
2975 else
2976 {
2977 exp->type = 2;
2978 exp->__anon1.__anon1.constant = __ecereNameSpace__ecere__sys__CopyString("0");
2979 }
2980 }
2981 }
2982 else if(classSym && classSym->__anon1.registered && classSym->__anon1.registered->type == 1)
2983 {
2984 if(inst->exp)
2985 {
2986 exp->type = 5;
2987 exp->__anon1.list = MkList();
2988 ProcessInstMembers(inst, inst->exp, exp->__anon1.list, 0);
2989 ProcessExpression(inst->exp);
2990 if(!(*exp->__anon1.list).count)
2991 {
2992 exp->type = 16;
2993 (__ecereNameSpace__ecere__com__eSystem_Delete(exp->__anon1.list), exp->__anon1.list = 0);
2994 }
2995 }
2996 else
2997 {
2998 struct Declaration * decl;
2999 struct Declaration * dummyDecl;
3000
3001 {
3002 dummyDecl = MkDeclaration((((void *)0)), (((void *)0)));
3003 if(curCompound)
3004 {
3005 if(!curCompound->__anon1.compound.declarations)
3006 curCompound->__anon1.compound.declarations = MkList();
3007 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*curCompound->__anon1.compound.declarations), (((void *)0)), dummyDecl);
3008 }
3009 sprintf(className, "__simpleStruct%d", curContext->simpleID++);
3010 {
3011 struct __ecereNameSpace__ecere__sys__OldList * list = MkList();
3012
3013 if(inst->isConstant && ProcessBracketInst(inst, list))
3014 {
3015 decl = MkDeclaration(MkList(), MkList());
3016 ListAdd(decl->__anon1.__anon1.specifiers, MkSpecifierName(inst->_class->__anon1.__anon1.name));
3017 ListAdd(decl->__anon1.__anon1.declarators, MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier(className)), MkInitializerList(list)));
3018 exp->type = 0;
3019 exp->__anon1.__anon1.identifier = MkIdentifier(className);
3020 }
3021 else
3022 {
3023 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Free((&*list), (((void *)0)));
3024 (__ecereNameSpace__ecere__com__eSystem_Delete(list), list = 0);
3025 decl = MkDeclarationInst(MkInstantiation(CopySpecifier(inst->_class), MkExpIdentifier(MkIdentifier(className)), (((void *)0))));
3026 exp->type = 5;
3027 exp->__anon1.list = MkList();
3028 instExp = QMkExpId(className);
3029 instExp->loc = exp->loc;
3030 instExp->expType = MkClassType(inst->_class->__anon1.__anon1.name);
3031 decl->__anon1.inst->fullSet = ProcessInstMembers(inst, instExp, exp->__anon1.list, 0);
3032 ListAdd(exp->__anon1.list, instExp);
3033 }
3034 }
3035 FreeType(exp->expType);
3036 exp->expType = MkClassType(inst->_class->__anon1.__anon1.name);
3037 {
3038 void * prev = dummyDecl->prev, * next = dummyDecl->next;
3039
3040 *dummyDecl = *decl;
3041 dummyDecl->prev = prev;
3042 dummyDecl->next = next;
3043 ((decl ? __extension__ ({
3044 void * __ecerePtrToDelete = (decl);
3045
3046 __ecereClass_Declaration->Destructor ? __ecereClass_Declaration->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete);
3047 }) : 0), decl = 0);
3048 decl = dummyDecl;
3049 }
3050 ProcessDeclaration(decl);
3051 }
3052 }
3053 }
3054 else
3055 {
3056 struct Expression * newCall;
3057
3058 if(classSym && classSym->__anon1.registered && classSym->__anon1.registered->type == 5 && (classSym->__anon1.registered->templateClass ? classSym->__anon1.registered->templateClass->fixed : classSym->__anon1.registered->fixed))
3059 {
3060 char size[256];
3061 struct __ecereNameSpace__ecere__com__Class * c = classSym->__anon1.registered->templateClass ? classSym->__anon1.registered->templateClass : classSym->__anon1.registered;
3062 struct Expression * e = MkExpClassSize(MkSpecifierName(c->name));
3063
3064 ProcessExpressionType(e);
3065 sprintf(size, "%d", c->structSize);
3066 newCall = MkExpCall(QMkExpId("ecere::com::eSystem_New0"), MkListOne(e));
3067 newCall->byReference = 1;
3068 }
3069 else
3070 {
3071 strcpy(className, "__ecereClass_");
3072 if(classSym && classSym->__anon1.registered && classSym->__anon1.registered->type == 5 && classSym->__anon1.registered->templateClass)
3073 {
3074 classSym = FindClass(classSym->__anon1.registered->templateClass->fullName);
3075 FullClassNameCat(className, classSym->string, 1);
3076 }
3077 else
3078 FullClassNameCat(className, inst->_class->__anon1.__anon1.name, 1);
3079 DeclareClass(curExternal, classSym, className);
3080 newCall = MkExpCall(QMkExpId("ecere::com::eInstance_New"), MkListOne(QMkExpId(className)));
3081 newCall->usage = exp->usage;
3082 ProcessExpressionType(newCall);
3083 if(newCall->expType && exp->expType)
3084 newCall->expType->passAsTemplate = exp->expType->passAsTemplate;
3085 newCall->byReference = 1;
3086 }
3087 if(inst->exp)
3088 {
3089 if(inst->members && (*inst->members).first)
3090 {
3091 exp->type = 5;
3092 exp->__anon1.list = MkList();
3093 if(!inst->built)
3094 {
3095 ListAdd(exp->__anon1.list, MkExpOp(inst->exp, '=', newCall));
3096 }
3097 else
3098 FreeExpression(newCall);
3099 ProcessInstMembers(inst, inst->exp, exp->__anon1.list, 0);
3100 if(inst->built)
3101 FreeExpression(inst->exp);
3102 }
3103 else
3104 {
3105 exp->type = 4;
3106 exp->__anon1.op.op = '=';
3107 exp->__anon1.op.exp1 = inst->exp;
3108 exp->__anon1.op.exp2 = newCall;
3109 ProcessExpression(inst->exp);
3110 }
3111 inst->exp = (((void *)0));
3112 }
3113 else
3114 {
3115 if(inst->members && (*inst->members).first)
3116 {
3117 int __simpleStruct0;
3118 char ecereTemp[100];
3119 struct MembersInit * members;
3120 int tempCount = exp->tempCount;
3121 struct __ecereNameSpace__ecere__sys__OldList * expList;
3122
3123 for(members = (*inst->members).first; members; members = members->next)
3124 {
3125 if(members->type == 0 && members->__anon1.dataMembers)
3126 {
3127 struct MemberInit * member;
3128
3129 for(member = (*members->__anon1.dataMembers).first; member; member = member->next)
3130 {
3131 if(member->initializer && member->initializer->type == 0)
3132 {
3133 int __simpleStruct0;
3134
3135 ProcessMemberInitData(member);
3136 tempCount = (__simpleStruct0 = member->initializer->__anon1.exp->tempCount, (tempCount > __simpleStruct0) ? tempCount : __simpleStruct0);
3137 }
3138 }
3139 }
3140 }
3141 if(curDecl)
3142 tempCount = ((tempCount > declTempCount) ? tempCount : declTempCount);
3143 tempCount++;
3144 curExternal->__anon1.function->tempCount = (__simpleStruct0 = curExternal->__anon1.function->tempCount, (__simpleStruct0 > tempCount) ? __simpleStruct0 : tempCount);
3145 sprintf(ecereTemp, "__ecereInstance%d", tempCount);
3146 exp->type = 23;
3147 exp->__anon1.compound = MkCompoundStmt((((void *)0)), (((void *)0)));
3148 exp->__anon1.compound->__anon1.compound.context = PushContext();
3149 exp->__anon1.compound->__anon1.compound.context->simpleID = exp->__anon1.compound->__anon1.compound.context->parent->simpleID;
3150 exp->__anon1.compound->__anon1.compound.declarations = MkListOne(QMkDeclaration(inst->_class->__anon1.__anon1.name, MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier(ecereTemp)), MkInitializerAssignment(newCall))));
3151 exp->__anon1.compound->__anon1.compound.statements = MkListOne(MkExpressionStmt((expList = MkList())));
3152 instExp = QMkExpId(ecereTemp);
3153 instExp->tempCount = tempCount;
3154 instExp->expType = MkClassType(inst->_class->__anon1.__anon1.name);
3155 instExp->byReference = 1;
3156 ProcessInstMembers(inst, instExp, expList, 0);
3157 FreeExpression(instExp);
3158 if(exp->usage)
3159 {
3160 struct Expression * tmpExp = QMkExpId(ecereTemp);
3161
3162 tmpExp->byReference = 1;
3163 ListAdd(expList, tmpExp);
3164 }
3165 exp->tempCount = tempCount;
3166 if(curDecl)
3167 declTempCount = ((declTempCount > tempCount) ? declTempCount : tempCount);
3168 PopContext(exp->__anon1.compound->__anon1.compound.context);
3169 }
3170 else
3171 {
3172 struct Expression * prev = exp->prev, * next = exp->next;
3173
3174 FreeType(newCall->destType);
3175 FreeType(newCall->expType);
3176 newCall->destType = exp->destType;
3177 newCall->expType = exp->expType;
3178 *exp = *newCall;
3179 exp->prev = prev;
3180 exp->next = next;
3181 ((newCall ? __extension__ ({
3182 void * __ecerePtrToDelete = (newCall);
3183
3184 __ecereClass_Expression->Destructor ? __ecereClass_Expression->Destructor((void *)__ecerePtrToDelete) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(__ecerePtrToDelete);
3185 }) : 0), newCall = 0);
3186 }
3187 }
3188 }
3189 if(exp->type != 1)
3190 FreeInstance(inst);
3191 }
3192 else
3193 ProcessInstantiation(inst);
3194 break;
3195 }
3196 case 2:
3197 break;
3198 case 3:
3199 break;
3200 case 13:
3201 case 26:
3202 ProcessExpression(exp->__anon1._new.size);
3203 break;
3204 case 14:
3205 case 27:
3206 ProcessExpression(exp->__anon1._renew.size);
3207 ProcessExpression(exp->__anon1._renew.exp);
3208 break;
3209 case 4:
3210 {
3211 switch(exp->__anon1.op.op)
3212 {
3213 case '=':
3214 if(exp->__anon1.op.exp2)
3215 exp->__anon1.op.exp2->usage = (exp->__anon1.op.exp2->usage & ~0x1) | (((unsigned int)(1)) << 0);
3216 if(exp->__anon1.op.exp1)
3217 exp->__anon1.op.exp1->usage = (exp->__anon1.op.exp1->usage & ~0x2) | (((unsigned int)(1)) << 1);
3218 break;
3219 case MUL_ASSIGN:
3220 case DIV_ASSIGN:
3221 case MOD_ASSIGN:
3222 case ADD_ASSIGN:
3223 case SUB_ASSIGN:
3224 case LEFT_ASSIGN:
3225 case RIGHT_ASSIGN:
3226 case AND_ASSIGN:
3227 case XOR_ASSIGN:
3228 case OR_ASSIGN:
3229 if(exp->__anon1.op.exp2)
3230 exp->__anon1.op.exp2->usage = (exp->__anon1.op.exp2->usage & ~0x1) | (((unsigned int)(1)) << 0);
3231 if(exp->__anon1.op.exp1)
3232 exp->__anon1.op.exp1->usage = (exp->__anon1.op.exp1->usage & ~0x2) | (((unsigned int)(1)) << 1);
3233 break;
3234 case INC_OP:
3235 case DEC_OP:
3236 if(exp->__anon1.op.exp1)
3237 exp->__anon1.op.exp1->usage = (exp->__anon1.op.exp1->usage & ~0x2) | (((unsigned int)(1)) << 1);
3238 case '&':
3239 if(exp->__anon1.op.exp1 && exp->__anon1.op.exp2)
3240 {
3241 exp->__anon1.op.exp1->usage = (exp->__anon1.op.exp1->usage & ~0x1) | (((unsigned int)(1)) << 0);
3242 exp->__anon1.op.exp2->usage = (exp->__anon1.op.exp2->usage & ~0x1) | (((unsigned int)(1)) << 0);
3243 }
3244 break;
3245 case '*':
3246 case '+':
3247 case '-':
3248 if(exp->__anon1.op.exp1)
3249 {
3250 exp->__anon1.op.exp1->usage = (exp->__anon1.op.exp1->usage & ~0x1) | (((unsigned int)(1)) << 0);
3251 }
3252 case '~':
3253 case '!':
3254 if(exp->__anon1.op.exp2)
3255 exp->__anon1.op.exp2->usage = (exp->__anon1.op.exp2->usage & ~0x1) | (((unsigned int)(1)) << 0);
3256 break;
3257 case '/':
3258 case '%':
3259 case LEFT_OP:
3260 case RIGHT_OP:
3261 case '<':
3262 case '>':
3263 case LE_OP:
3264 case GE_OP:
3265 case EQ_OP:
3266 case NE_OP:
3267 case '|':
3268 case '^':
3269 case AND_OP:
3270 case OR_OP:
3271 if(exp->__anon1.op.exp1)
3272 exp->__anon1.op.exp1->usage = (exp->__anon1.op.exp1->usage & ~0x1) | (((unsigned int)(1)) << 0);
3273 if(exp->__anon1.op.exp2)
3274 exp->__anon1.op.exp2->usage = (exp->__anon1.op.exp2->usage & ~0x1) | (((unsigned int)(1)) << 0);
3275 break;
3276 }
3277 if(exp->__anon1.op.exp1)
3278 {
3279 if(exp->__anon1.op.exp1 && exp->__anon1.op.exp2 && exp->__anon1.op.exp1->destType && exp->__anon1.op.exp1->destType->passAsTemplate && exp->__anon1.op.exp1->expType && !exp->__anon1.op.exp1->expType->passAsTemplate && !((unsigned int)((exp->__anon1.op.exp1->usage & 0x2) >> 1)))
3280 {
3281 struct Type * type = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
3282
3283 CopyTypeInto(type, exp->__anon1.op.exp1->destType);
3284 type->passAsTemplate = 0;
3285 FreeType(exp->__anon1.op.exp1->destType);
3286 exp->__anon1.op.exp1->destType = type;
3287 }
3288 ProcessExpression(exp->__anon1.op.exp1);
3289 }
3290 if(exp->__anon1.op.exp2)
3291 {
3292 if(exp->__anon1.op.exp1 && exp->__anon1.op.exp2 && exp->__anon1.op.exp2->destType && exp->__anon1.op.exp2->destType->passAsTemplate && exp->__anon1.op.exp2->expType && !exp->__anon1.op.exp2->expType->passAsTemplate && !((unsigned int)((exp->__anon1.op.exp1->usage & 0x2) >> 1)))
3293 {
3294 struct Type * type = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
3295
3296 CopyTypeInto(type, exp->__anon1.op.exp2->destType);
3297 type->passAsTemplate = 0;
3298 FreeType(exp->__anon1.op.exp2->destType);
3299 exp->__anon1.op.exp2->destType = type;
3300 }
3301 if(exp->__anon1.op.exp1)
3302 exp->__anon1.op.exp2->tempCount = exp->__anon1.op.exp1->tempCount;
3303 ProcessExpression(exp->__anon1.op.exp2);
3304 }
3305 break;
3306 }
3307 case 32:
3308 case 5:
3309 {
3310 struct Expression * e;
3311
3312 for(e = (*exp->__anon1.list).first; e; e = e->next)
3313 {
3314 int __simpleStruct2, __simpleStruct3;
3315 int __simpleStruct0, __simpleStruct1;
3316
3317 e->tempCount = (__simpleStruct0 = e->tempCount, __simpleStruct1 = exp->tempCount, (__simpleStruct0 > __simpleStruct1) ? __simpleStruct0 : __simpleStruct1);
3318 if(!e->next)
3319 {
3320 e->usage |= (exp->usage & ((((unsigned int)(1)) | (((unsigned int)(1)) << 2))));
3321 }
3322 ProcessExpression(e);
3323 exp->tempCount = (__simpleStruct2 = exp->tempCount, __simpleStruct3 = e->tempCount, (__simpleStruct2 > __simpleStruct3) ? __simpleStruct2 : __simpleStruct3);
3324 }
3325 break;
3326 }
3327 case 6:
3328 {
3329 struct Expression * e;
3330
3331 exp->__anon1.index.exp->usage = (exp->__anon1.index.exp->usage & ~0x1) | (((unsigned int)(1)) << 0);
3332 ProcessExpression(exp->__anon1.index.exp);
3333 for(e = (*exp->__anon1.index.index).first; e; e = e->next)
3334 {
3335 if(!e->next)
3336 e->usage = (e->usage & ~0x1) | (((unsigned int)(1)) << 0);
3337 ProcessExpression(e);
3338 }
3339 exp->tempCount = exp->__anon1.index.exp->tempCount;
3340 break;
3341 }
3342 case 7:
3343 {
3344 struct Expression * e;
3345
3346 ProcessExpression(exp->__anon1.call.exp);
3347 if(exp->__anon1.call.arguments)
3348 {
3349 for(e = (*exp->__anon1.call.arguments).first; e; e = e->next)
3350 {
3351 e->usage = (e->usage & ~0x1) | (((unsigned int)(1)) << 0);
3352 e->usage = (e->usage & ~0x4) | (((unsigned int)(1)) << 2);
3353 ProcessExpression(e);
3354 }
3355 }
3356 break;
3357 }
3358 case 8:
3359 {
3360 exp->__anon1.member.exp->usage = (exp->__anon1.member.exp->usage & ~0x1) | (((unsigned int)(1)) << 0);
3361 if(exp->__anon1.member.memberType == 3 && exp->__anon1.member.exp->expType && exp->__anon1.member.exp->expType->thisClassFrom && exp->__anon1.member.exp->expType->kind == 8 && exp->__anon1.member.exp->expType->__anon1._class && exp->__anon1.member.exp->expType->__anon1._class->__anon1.registered && !__ecereNameSpace__ecere__com__eClass_IsDerived(exp->__anon1.member.exp->expType->thisClassFrom, exp->__anon1.member.exp->expType->__anon1._class->__anon1.registered))
3362 exp->__anon1.member.exp->expType->passAsTemplate = 1;
3363 ProcessExpression(exp->__anon1.member.exp);
3364 if(!exp->__anon1.member.memberType)
3365 {
3366 struct Type * type = exp->__anon1.member.exp->expType;
3367
3368 if((type && type->kind == 8 && exp->__anon1.member.member))
3369 {
3370 struct __ecereNameSpace__ecere__com__Class * _class = (exp->__anon1.member.member->_class && exp->__anon1.member.member->classSym) ? exp->__anon1.member.member->classSym->__anon1.registered : (type->__anon1._class ? type->__anon1._class->__anon1.registered : (((void *)0)));
3371 struct __ecereNameSpace__ecere__com__Property * prop = (((void *)0));
3372 struct __ecereNameSpace__ecere__com__Method * method = (((void *)0));
3373 struct __ecereNameSpace__ecere__com__DataMember * member = (((void *)0));
3374 struct __ecereNameSpace__ecere__com__Property * revConvert = (((void *)0));
3375
3376 if(exp->__anon1.member.thisPtr)
3377 {
3378 member = __ecereNameSpace__ecere__com__eClass_FindDataMember(_class, exp->__anon1.member.member->string, privateModule, (((void *)0)), (((void *)0)));
3379 if(!member)
3380 prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, exp->__anon1.member.member->string, privateModule);
3381 }
3382 else
3383 {
3384 prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, exp->__anon1.member.member->string, (((void *)0)));
3385 if(!prop)
3386 member = __ecereNameSpace__ecere__com__eClass_FindDataMember(_class, exp->__anon1.member.member->string, (((void *)0)), (((void *)0)), (((void *)0)));
3387 if(!prop && !member)
3388 {
3389 method = __ecereNameSpace__ecere__com__eClass_FindMethod(_class, exp->__anon1.member.member->string, (((void *)0)));
3390 if(!method)
3391 {
3392 prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, exp->__anon1.member.member->string, privateModule);
3393 if(!prop)
3394 member = __ecereNameSpace__ecere__com__eClass_FindDataMember(_class, exp->__anon1.member.member->string, privateModule, (((void *)0)), (((void *)0)));
3395 }
3396 }
3397 }
3398 if(!prop && !member && !method)
3399 method = __ecereNameSpace__ecere__com__eClass_FindMethod(_class, exp->__anon1.member.member->string, privateModule);
3400 if(!prop && !member && !method)
3401 {
3402 struct Symbol * classSym = FindClass(exp->__anon1.member.member->string);
3403
3404 if(classSym)
3405 {
3406 struct __ecereNameSpace__ecere__com__Class * convertClass = classSym->__anon1.registered;
3407
3408 if(convertClass)
3409 revConvert = __ecereNameSpace__ecere__com__eClass_FindProperty(convertClass, _class->fullName, privateModule);
3410 }
3411 }
3412 if(prop)
3413 {
3414 exp->__anon1.member.memberType = 1;
3415 if(!prop->dataType)
3416 prop->dataType = ProcessTypeString(prop->dataTypeString, 0);
3417 FreeType(exp->expType);
3418 exp->expType = prop->dataType;
3419 if(prop->dataType)
3420 prop->dataType->refCount++;
3421 }
3422 else if(method)
3423 {
3424 exp->__anon1.member.memberType = 2;
3425 if(!method->dataType)
3426 ProcessMethodType(method);
3427 FreeType(exp->expType);
3428 exp->expType = method->dataType;
3429 if(method->dataType)
3430 method->dataType->refCount++;
3431 }
3432 else if(member)
3433 {
3434 exp->__anon1.member.memberType = 3;
3435 DeclareStruct(curExternal, _class->fullName, 0, 1);
3436 if(!member->dataType)
3437 member->dataType = ProcessTypeString(member->dataTypeString, 0);
3438 FreeType(exp->expType);
3439 exp->expType = member->dataType;
3440 if(member->dataType)
3441 member->dataType->refCount++;
3442 }
3443 else if(revConvert)
3444 {
3445 exp->__anon1.member.memberType = 4;
3446 FreeType(exp->expType);
3447 exp->expType = MkClassType(revConvert->_class->fullName);
3448 }
3449 }
3450 }
3451 break;
3452 }
3453 case 10:
3454 break;
3455 case 11:
3456 {
3457 exp->__anon1.cast.exp->usage |= exp->usage;
3458 ProcessExpression(exp->__anon1.cast.exp);
3459 break;
3460 }
3461 case 12:
3462 {
3463 struct Expression * e;
3464
3465 if(((unsigned int)((exp->usage & 0x1) >> 0)))
3466 exp->__anon1.cond.cond->usage = (exp->__anon1.cond.cond->usage & ~0x1) | (((unsigned int)(1)) << 0);
3467 ProcessExpression(exp->__anon1.cond.cond);
3468 for(e = (*exp->__anon1.cond.exp).first; e; e = e->next)
3469 {
3470 if(!e->next && ((unsigned int)((exp->usage & 0x1) >> 0)))
3471 e->usage = (e->usage & ~0x1) | (((unsigned int)(1)) << 0);
3472 ProcessExpression(e);
3473 }
3474 if(exp->__anon1.cond.elseExp)
3475 {
3476 if(((unsigned int)((exp->usage & 0x1) >> 0)))
3477 exp->__anon1.cond.elseExp->usage = (exp->__anon1.cond.elseExp->usage & ~0x1) | (((unsigned int)(1)) << 0);
3478 ProcessExpression(exp->__anon1.cond.elseExp);
3479 }
3480 break;
3481 }
3482 case 23:
3483 {
3484 if(exp->__anon1.compound->__anon1.compound.statements && ((struct Statement *)(*exp->__anon1.compound->__anon1.compound.statements).last)->type == 3 && ((struct Statement *)(*exp->__anon1.compound->__anon1.compound.statements).last)->__anon1.expressions && (*((struct Statement *)(*exp->__anon1.compound->__anon1.compound.statements).last)->__anon1.expressions).last)
3485 {
3486 ((struct Expression *)(*((struct Statement *)(*exp->__anon1.compound->__anon1.compound.statements).last)->__anon1.expressions).last)->usage = exp->usage;
3487 }
3488 ProcessStatement(exp->__anon1.compound);
3489 break;
3490 }
3491 case 34:
3492 {
3493 ProcessExpression(exp->__anon1.vaArg.exp);
3494 break;
3495 }
3496 case 33:
3497 {
3498 ProcessInitializer(exp->__anon1.initializer.initializer);
3499 break;
3500 }
3501 }
3502 CheckTemplateTypes(exp);
3503 }
3504
3505 static unsigned int ProcessBracketInst_DataMember(struct __ecereNameSpace__ecere__com__DataMember * parentMember, struct Instantiation * inst, struct __ecereNameSpace__ecere__sys__OldList * list, struct __ecereNameSpace__ecere__com__DataMember * namedParentMember, unsigned int parentMemberSet)
3506 {
3507 struct Symbol * classSym = inst->_class->__anon1.__anon1.symbol;
3508 struct __ecereNameSpace__ecere__com__DataMember * dataMember = (((void *)0));
3509 unsigned int someMemberSet = 0;
3510 int anonID = 1;
3511
3512 for(dataMember = parentMember->members.first; dataMember; dataMember = dataMember->next)
3513 {
3514 struct MembersInit * members;
3515 struct MemberInit * member = (((void *)0));
3516
3517 if(!dataMember->name && (dataMember->type == 1 || dataMember->type == 2))
3518 {
3519 struct __ecereNameSpace__ecere__sys__OldList * subList = MkList();
3520
3521 if(!ProcessBracketInst_DataMember(dataMember, inst, subList ? subList : list, dataMember->name ? dataMember : namedParentMember, someMemberSet || parentMemberSet || dataMember->prev))
3522 {
3523 if(subList)
3524 FreeList(subList, (void *)(FreeInitializer));
3525 return 0;
3526 }
3527 if(subList && (*subList).count)
3528 {
3529 struct Initializer * init = MkInitializerList(subList);
3530 char id[100];
3531
3532 sprintf(id, "__anon%d", anonID);
3533 init->id = MkIdentifier(id);
3534 ListAdd(list, init);
3535 someMemberSet = 1;
3536 }
3537 else
3538 {
3539 if(list->count)
3540 someMemberSet = 1;
3541 (__ecereNameSpace__ecere__com__eSystem_Delete(subList), subList = 0);
3542 }
3543 anonID++;
3544 }
3545 else
3546 {
3547 struct __ecereNameSpace__ecere__com__Class * curClass = (((void *)0));
3548 struct __ecereNameSpace__ecere__com__DataMember * curMember = (((void *)0));
3549 struct __ecereNameSpace__ecere__com__DataMember * subMemberStack[256];
3550 int subMemberStackPos = 0;
3551 unsigned int found = 0;
3552
3553 if(inst->members && (*inst->members).first)
3554 {
3555 for(members = (*inst->members).first; members; members = members->next)
3556 {
3557 if(members->type == 0)
3558 {
3559 for(member = (*members->__anon1.dataMembers).first; member; member = member->next)
3560 {
3561 if(member->identifiers)
3562 {
3563 struct Identifier * firstID = (*member->identifiers).first;
3564 struct __ecereNameSpace__ecere__com__DataMember * _subMemberStack[256];
3565 int _subMemberStackPos = 0;
3566 struct __ecereNameSpace__ecere__com__DataMember * thisMember;
3567
3568 thisMember = firstID ? (struct __ecereNameSpace__ecere__com__DataMember *)__ecereNameSpace__ecere__com__eClass_FindProperty(classSym->__anon1.registered, firstID->string, privateModule) : (((void *)0));
3569 if(!thisMember && firstID)
3570 thisMember = __ecereNameSpace__ecere__com__eClass_FindDataMember(classSym->__anon1.registered, firstID->string, privateModule, _subMemberStack, &_subMemberStackPos);
3571 if(thisMember && thisMember->memberAccess == 1)
3572 {
3573 curMember = thisMember;
3574 curClass = curMember->_class;
3575 memcpy(subMemberStack, _subMemberStack, sizeof(struct __ecereNameSpace__ecere__com__DataMember *) * _subMemberStackPos);
3576 subMemberStackPos = _subMemberStackPos;
3577 }
3578 if(dataMember == thisMember)
3579 {
3580 if((*member->identifiers).count > 1 && member->initializer && member->initializer->type == 0)
3581 {
3582 struct __ecereNameSpace__ecere__sys__OldList * partList = MkList();
3583 struct Symbol * symbol;
3584 struct Specifier * spec;
3585 struct MembersInit * nextMembers;
3586 struct MemberInit * next = member->next;
3587
3588 if(!dataMember->dataType)
3589 dataMember->dataType = ProcessTypeString(dataMember->dataTypeString, 0);
3590 symbol = (dataMember->dataType && dataMember->dataType->kind == 8) ? dataMember->dataType->__anon1._class : (((void *)0));
3591 spec = _MkSpecifierName(dataMember->dataTypeString, symbol, (((void *)0)));
3592 {
3593 struct __ecereNameSpace__ecere__sys__OldList * identifiers = MkList();
3594 struct Identifier * id;
3595
3596 for(id = ((struct Identifier *)(*member->identifiers).first)->next; id; id = id->next)
3597 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add((&*identifiers), CopyIdentifier(id));
3598 ListAdd(partList, MkMemberInit(identifiers, MkInitializerAssignment(member->initializer->__anon1.exp)));
3599 }
3600 for(nextMembers = members; nextMembers; nextMembers = nextMembers->next)
3601 {
3602 if(!nextMembers->__anon1.dataMembers)
3603 continue;
3604 if(members != nextMembers)
3605 next = (*nextMembers->__anon1.dataMembers).first;
3606 if(nextMembers->type == 0)
3607 {
3608 struct MemberInit * nextMember;
3609
3610 for(nextMember = next; nextMember; nextMember = next, next = nextMember ? nextMember->next : (((void *)0)))
3611 {
3612 struct Identifier * nextID = (*nextMember->identifiers).first;
3613
3614 if(nextMember->identifiers && (*nextMember->identifiers).count > 1 && !strcmp(firstID->string, nextID->string))
3615 {
3616 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove((&*nextMembers->__anon1.dataMembers), nextMember);
3617 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove((&*nextMember->identifiers), nextID);
3618 ListAdd(partList, nextMember);
3619 FreeIdentifier(nextID);
3620 }
3621 }
3622 }
3623 }
3624 member->initializer->__anon1.exp = MkExpInstance(MkInstantiation(spec, (((void *)0)), MkListOne(MkMembersInitList(partList))));
3625 }
3626 found = 1;
3627 break;
3628 }
3629 }
3630 else
3631 {
3632 __ecereNameSpace__ecere__com__eClass_FindNextMember(classSym->__anon1.registered, &curClass, &curMember, subMemberStack, &subMemberStackPos);
3633 if(curMember == dataMember)
3634 {
3635 found = 1;
3636 break;
3637 }
3638 }
3639 }
3640 }
3641 if(found)
3642 break;
3643 }
3644 }
3645 if(member && member->initializer && member->initializer->type == 0)
3646 {
3647 struct Initializer * init = (init = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Initializer), init->loc = yylloc, init);
3648
3649 if(namedParentMember->type == 1 && dataMember->name)
3650 init->id = MkIdentifier(dataMember->name);
3651 if(member->initializer->__anon1.exp->type == 1 && member->initializer->__anon1.exp->expType && member->initializer->__anon1.exp->expType->__anon1._class->__anon1.registered->type == 1)
3652 {
3653 struct __ecereNameSpace__ecere__sys__OldList * subList = MkList();
3654
3655 ProcessBracketInst(member->initializer->__anon1.exp->__anon1.instance, subList);
3656 FreeExpression(member->initializer->__anon1.exp);
3657 if((*subList).count)
3658 {
3659 init->type = 1;
3660 init->__anon1.list = subList;
3661 }
3662 else
3663 {
3664 FreeInitializer(init);
3665 init = (((void *)0));
3666 }
3667 }
3668 else
3669 {
3670 member->initializer->__anon1.exp->usage = (member->initializer->__anon1.exp->usage & ~0x1) | (((unsigned int)(1)) << 0);
3671 ProcessExpression(member->initializer->__anon1.exp);
3672 init->type = 0;
3673 init->__anon1.exp = member->initializer->__anon1.exp;
3674 }
3675 if(init)
3676 ListAdd(list, init);
3677 member->initializer->__anon1.exp = (((void *)0));
3678 FreeInitializer(member->initializer);
3679 member->initializer = (((void *)0));
3680 someMemberSet = 1;
3681 }
3682 else if(member && member->initializer && member->initializer->type == 1)
3683 {
3684 if(namedParentMember->type == 1 && dataMember->name)
3685 member->initializer->id = MkIdentifier(dataMember->name);
3686 ListAdd(list, member->initializer);
3687 member->initializer = (((void *)0));
3688 someMemberSet = 1;
3689 }
3690 else if(dataMember && dataMember->dataTypeString && parentMember->type != 1 && namedParentMember->type != 1)
3691 {
3692 struct Symbol * classSym;
3693 struct Initializer * init = (init = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Initializer), init->loc = yylloc, init);
3694
3695 if(namedParentMember->type == 1 && dataMember->name)
3696 init->id = MkIdentifier(dataMember->name);
3697 if(!dataMember->dataType)
3698 dataMember->dataType = ProcessTypeString(dataMember->dataTypeString, 0);
3699 classSym = (dataMember->dataType && dataMember->dataType->kind == 8) ? dataMember->dataType->__anon1._class : (((void *)0));
3700 if(classSym && classSym->__anon1.registered && classSym->__anon1.registered->type == 1)
3701 {
3702 struct __ecereNameSpace__ecere__sys__OldList * subList = MkList();
3703 struct Specifier * spec = _MkSpecifierName(dataMember->dataTypeString, classSym, (((void *)0)));
3704 struct Instantiation * inst = MkInstantiation(spec, (((void *)0)), (((void *)0)));
3705
3706 ProcessBracketInst(inst, subList);
3707 FreeInstance(inst);
3708 if((*subList).count)
3709 {
3710 init->type = 1;
3711 init->__anon1.list = subList;
3712 }
3713 else
3714 {
3715 FreeInitializer(init);
3716 init = (((void *)0));
3717 }
3718 }
3719 else
3720 {
3721 init->type = 0;
3722 init->__anon1.exp = MkExpConstant("0");
3723 }
3724 someMemberSet = 1;
3725 if(init)
3726 ListAdd(list, init);
3727 }
3728 }
3729 }
3730 if(!someMemberSet && !parentMemberSet)
3731 {
3732 struct Symbol * classSym;
3733 struct Initializer * init = (init = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Initializer), init->loc = yylloc, init);
3734
3735 dataMember = parentMember->members.first;
3736 if(namedParentMember->type == 1 && dataMember->name)
3737 init->id = MkIdentifier(dataMember->name);
3738 if(!dataMember->dataType && dataMember->dataTypeString)
3739 dataMember->dataType = ProcessTypeString(dataMember->dataTypeString, 0);
3740 classSym = (dataMember->dataType && dataMember->dataType->kind == 8) ? dataMember->dataType->__anon1._class : (((void *)0));
3741 if(classSym && classSym->__anon1.registered && classSym->__anon1.registered->type == 1)
3742 {
3743 struct __ecereNameSpace__ecere__sys__OldList * subList = MkList();
3744 struct Specifier * spec = _MkSpecifierName(dataMember->dataTypeString, classSym, (((void *)0)));
3745 struct Instantiation * inst = MkInstantiation(spec, (((void *)0)), (((void *)0)));
3746
3747 ProcessBracketInst(inst, subList);
3748 FreeInstance(inst);
3749 init->type = 1;
3750 init->__anon1.list = subList;
3751 }
3752 else if(dataMember->dataType && (dataMember->dataType->kind == 12 || dataMember->dataType->kind == 9))
3753 {
3754 struct Type * t = dataMember->dataType->kind == 12 ? dataMember->dataType->__anon1.type : dataMember->dataType->__anon1.__anon1.members.first;
3755 struct Initializer * i = MkInitializerAssignment(MkExpConstant("0"));
3756
3757 while(t && (t->kind == 12 || t->kind == 9))
3758 {
3759 i = MkInitializerList(MkListOne(i));
3760 if(t->kind == 12)
3761 t = t->__anon1.type;
3762 else if(t->kind == 9)
3763 t = t->__anon1.__anon1.members.first;
3764 }
3765 init->type = 1;
3766 init->__anon1.list = MkListOne(i);
3767 }
3768 else
3769 {
3770 init->type = 0;
3771 init->__anon1.exp = MkExpConstant("0");
3772 }
3773 ListAdd(list, init);
3774 }
3775 return 1;
3776 }
3777
3778 static void ProcessDeclaration(struct Declaration * decl)
3779 {
3780 yylloc = decl->loc;
3781 switch(decl->type)
3782 {
3783 case 1:
3784 {
3785 if(!curDecl)
3786 {
3787 curDecl = decl;
3788 declTempCount = 0;
3789 }
3790 if(decl->__anon1.__anon1.specifiers)
3791 {
3792 struct Specifier * s;
3793
3794 for(s = (*decl->__anon1.__anon1.specifiers).first; s; s = s->next)
3795 {
3796 ProcessSpecifier(s);
3797 }
3798 }
3799 if(decl->__anon1.__anon1.declarators)
3800 {
3801 struct InitDeclarator * d;
3802
3803 for(d = (*decl->__anon1.__anon1.declarators).first; d; d = d->next)
3804 {
3805 if(d->initializer)
3806 ProcessInitializer(d->initializer);
3807 }
3808 }
3809 if(curDecl == decl)
3810 {
3811 curDecl = (((void *)0));
3812 declTempCount = 0;
3813 }
3814 break;
3815 }
3816 case 2:
3817 {
3818 struct Instantiation * inst = decl->__anon1.inst;
3819
3820 if(inCompiler)
3821 {
3822 struct Symbol * classSym = inst->_class->__anon1.__anon1.symbol;
3823
3824 if(!curCompound)
3825 {
3826 struct Statement * stmt;
3827
3828 if(!inst->isConstant || (classSym && classSym->__anon1.registered && (classSym->__anon1.registered->type == 0 || classSym->__anon1.registered->type == 5)))
3829 {
3830 decl->type = 1;
3831 decl->__anon1.__anon1.specifiers = MkListOne(MkSpecifierName(inst->_class->__anon1.__anon1.name));
3832 if(decl->declMode == 3)
3833 {
3834 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*decl->__anon1.__anon1.specifiers), (((void *)0)), MkSpecifier(STATIC));
3835 }
3836 decl->__anon1.__anon1.declarators = MkListOne(MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier(inst->exp->__anon1.__anon1.identifier->string)), (((void *)0))));
3837 ProcessDeclaration(decl);
3838 CreateInstancesBody();
3839 {
3840 struct Expression * exp = MkExpInstance(inst);
3841
3842 stmt = MkExpressionStmt(MkListOne(exp));
3843 ListAdd(createInstancesBody->__anon1.compound.statements, stmt);
3844 ProcessExpressionType(exp);
3845 }
3846 if(classSym && classSym->__anon1.registered && (classSym->__anon1.registered->type == 0))
3847 {
3848 ListAdd(createInstancesBody->__anon1.compound.statements, MkExpressionStmt(MkListOne(MkExpCall(MkExpIdentifier(MkIdentifier("ecere::com::eInstance_IncRef")), MkListOne(CopyExpression(inst->exp))))));
3849 {
3850 struct Expression * exp = MkExpOp((((void *)0)), DELETE, CopyExpression(inst->exp));
3851
3852 ListAddFront(destroyInstancesBody->__anon1.compound.statements, MkExpressionStmt(MkListOne(exp)));
3853 ProcessExpressionType(exp);
3854 }
3855 }
3856 else if(classSym && classSym->__anon1.registered && (classSym->__anon1.registered->type == 5))
3857 {
3858 struct Expression * exp = MkExpOp((((void *)0)), DELETE, CopyExpression(inst->exp));
3859
3860 ListAddFront(destroyInstancesBody->__anon1.compound.statements, MkExpressionStmt(MkListOne(exp)));
3861 ProcessExpressionType(exp);
3862 }
3863 __ecereMethod_External_CreateEdge(createInstancesExternal, curExternal, 0);
3864 __ecereMethod_External_CreateEdge(destroyInstancesExternal, curExternal, 0);
3865 break;
3866 }
3867 else
3868 {
3869 CreateInstancesBody();
3870 }
3871 }
3872 {
3873 char className[1024];
3874
3875 className[0] = 0;
3876 decl->type = 1;
3877 decl->__anon1.__anon1.specifiers = MkList();
3878 decl->__anon1.__anon1.declarators = MkList();
3879 if(classSym && classSym->__anon1.registered && classSym->__anon1.registered->type == 2)
3880 {
3881 struct __ecereNameSpace__ecere__sys__OldList list =
3882 {
3883 0
3884 };
3885
3886 ProcessInstMembers(inst, inst->exp, &list, 0);
3887 ProcessExpression(inst->exp);
3888 ListAdd(decl->__anon1.__anon1.specifiers, MkSpecifierName(inst->_class->__anon1.__anon1.name));
3889 ListAdd(decl->__anon1.__anon1.declarators, MkInitDeclarator(MkDeclaratorIdentifier(inst->exp->__anon1.__anon1.identifier), MkInitializerAssignment(list.first)));
3890 inst->exp->__anon1.__anon1.identifier = (((void *)0));
3891 }
3892 else if(classSym && classSym->__anon1.registered && classSym->__anon1.registered->type == 3)
3893 {
3894 struct __ecereNameSpace__ecere__sys__OldList list =
3895 {
3896 0
3897 };
3898
3899 ProcessInstMembers(inst, inst->exp, &list, 0);
3900 ProcessExpression(inst->exp);
3901 ListAdd(decl->__anon1.__anon1.specifiers, MkSpecifierName(inst->_class->__anon1.__anon1.name));
3902 ListAdd(decl->__anon1.__anon1.declarators, MkInitDeclarator(MkDeclaratorIdentifier(inst->exp->__anon1.__anon1.identifier), MkInitializerAssignment(list.first)));
3903 inst->exp->__anon1.__anon1.identifier = (((void *)0));
3904 }
3905 else if(classSym && classSym->__anon1.registered && classSym->__anon1.registered->type == 1)
3906 {
3907 struct Expression * exp;
3908
3909 DeclareStruct(curExternal, inst->_class->__anon1.__anon1.name, 0, 1);
3910 ProcessExpression(inst->exp);
3911 {
3912 if(inst->fullSet)
3913 {
3914 ListAdd(decl->__anon1.__anon1.specifiers, MkSpecifierName(inst->_class->__anon1.__anon1.name));
3915 ListAdd(decl->__anon1.__anon1.declarators, MkInitDeclarator(MkDeclaratorIdentifier(inst->exp->__anon1.__anon1.identifier), (((void *)0))));
3916 inst->exp->__anon1.__anon1.identifier = (((void *)0));
3917 }
3918 else
3919 {
3920 struct __ecereNameSpace__ecere__sys__OldList * list = MkList();
3921
3922 if(ProcessBracketInst(inst, list))
3923 {
3924 ListAdd(decl->__anon1.__anon1.specifiers, MkSpecifierName(inst->_class->__anon1.__anon1.name));
3925 ListAdd(decl->__anon1.__anon1.declarators, MkInitDeclarator(MkDeclaratorIdentifier(inst->exp->__anon1.__anon1.identifier), MkInitializerList(list)));
3926 inst->exp->__anon1.__anon1.identifier = (((void *)0));
3927 }
3928 else
3929 {
3930 FreeList(list, (void *)(FreeInitializer));
3931 exp = MkExpBrackets(MkList());
3932 ProcessInstMembers(inst, inst->exp, exp->__anon1.list, 1);
3933 ListAdd(exp->__anon1.list, CopyExpression(inst->exp));
3934 ListAdd(decl->__anon1.__anon1.specifiers, MkSpecifierName(inst->_class->__anon1.__anon1.name));
3935 ListAdd(decl->__anon1.__anon1.declarators, MkInitDeclarator(MkDeclaratorIdentifier(inst->exp->__anon1.__anon1.identifier), MkInitializerAssignment(exp)));
3936 inst->exp->__anon1.__anon1.identifier = (((void *)0));
3937 }
3938 }
3939 }
3940 }
3941 else
3942 {
3943 struct Expression * newCall;
3944
3945 strcpy(className, "__ecereClass_");
3946 if(classSym && classSym->__anon1.registered && classSym->__anon1.registered->type == 5 && classSym->__anon1.registered->templateClass)
3947 {
3948 classSym = FindClass(classSym->__anon1.registered->templateClass->fullName);
3949 FullClassNameCat(className, classSym->string, 1);
3950 }
3951 else
3952 FullClassNameCat(className, inst->_class->__anon1.__anon1.name, 1);
3953 if(classSym)
3954 DeclareClass(curExternal, classSym, className);
3955 if(classSym && classSym->__anon1.registered && classSym->__anon1.registered->type == 5 && (classSym->__anon1.registered->templateClass ? classSym->__anon1.registered->templateClass->fixed : classSym->__anon1.registered->fixed))
3956 {
3957 char size[256];
3958 struct __ecereNameSpace__ecere__com__Class * c = classSym->__anon1.registered->templateClass ? classSym->__anon1.registered->templateClass : classSym->__anon1.registered;
3959 struct Expression * e = MkExpClassSize(MkSpecifierName(c->name));
3960
3961 ProcessExpressionType(e);
3962 sprintf(size, "%d", c->structSize);
3963 newCall = MkExpCall(QMkExpId("ecere::com::eSystem_New0"), MkListOne(e));
3964 }
3965 else
3966 {
3967 newCall = MkExpCall(QMkExpId("ecere::com::eInstance_New"), MkListOne(QMkExpId(className)));
3968 ProcessExpressionType(newCall);
3969 newCall->byReference = 1;
3970 }
3971 if(inst->exp)
3972 {
3973 struct Expression * exp, * newExp;
3974 struct Identifier * id = CopyIdentifier(inst->exp->__anon1.__anon1.identifier);
3975
3976 if(inst->members && (*inst->members).first)
3977 {
3978 newExp = MkExpOp(CopyExpression(inst->exp), '=', newCall);
3979 exp = MkExpBrackets(MkList());
3980 ListAdd(exp->__anon1.list, newExp);
3981 ProcessInstMembers(inst, inst->exp, exp->__anon1.list, 0);
3982 ListAdd(exp->__anon1.list, inst->exp);
3983 ProcessExpression(inst->exp);
3984 inst->exp = (((void *)0));
3985 }
3986 else
3987 exp = newCall;
3988 ListAdd(decl->__anon1.__anon1.specifiers, MkSpecifierName(inst->_class->__anon1.__anon1.name));
3989 ListAdd(decl->__anon1.__anon1.declarators, MkInitDeclarator(MkDeclaratorIdentifier(id), MkInitializerAssignment(exp)));
3990 }
3991 else
3992 FreeExpression(newCall);
3993 }
3994 }
3995 FreeInstance(inst);
3996 }
3997 else
3998 ProcessInstantiation(inst);
3999 break;
4000 }
4001 case 0:
4002 {
4003 if(decl->__anon1.__anon1.specifiers)
4004 {
4005 struct Specifier * spec;
4006
4007 for(spec = (*decl->__anon1.__anon1.specifiers).first; spec; spec = spec->next)
4008 ProcessSpecifier(spec);
4009 }
4010 break;
4011 }
4012 }
4013 }
4014