compiler/libec: (#341, #351, #644, #771) Improved enum type matching and type handlin...
[sdk] / compiler / bootstrap / libec / bootstrap / pass15.c
index 865aabb..41ec3f3 100644 (file)
@@ -1,3 +1,4 @@
+/* Code generated from eC source file: pass15.ec */
 #if defined(__GNUC__)
 typedef long long int64;
 typedef unsigned long long uint64;
@@ -27,17 +28,20 @@ typedef unsigned __int64 uint64;
 #else
 #define __ENDIAN_PAD(x) 0
 #endif
-#ifdef __MINGW32__
-#ifdef _WIN64
-typedef unsigned long long int uintptr_t;
-typedef long long int intptr_t;
-#else
-typedef unsigned int uintptr_t;
-typedef int intptr_t;
-#endif
-#else
 #include <stdint.h>
+#include <sys/types.h>
+
+#if /*defined(_W64) || */(defined(__WORDSIZE) && __WORDSIZE == 8) || defined(__x86_64__)
+#define _64BIT 1
+#else
+#define _64BIT 0
 #endif
+
+#define arch_PointerSize                  sizeof(void *)
+#define structSize_Instance               (_64BIT ? 24 : 12)
+#define structSize_Module                 (_64BIT ? 560 : 300)
+#define structSize_NamedLink              (_64BIT ? 32 : 16)
+
 extern void *  __ecereNameSpace__ecere__com__eSystem_New(unsigned int size);
 
 extern void *  __ecereNameSpace__ecere__com__eSystem_New0(unsigned int size);
@@ -46,6 +50,8 @@ extern void *  __ecereNameSpace__ecere__com__eSystem_Renew(void *  memory, unsig
 
 extern void *  __ecereNameSpace__ecere__com__eSystem_Renew0(void *  memory, unsigned int size);
 
+extern void __ecereNameSpace__ecere__com__eSystem_Delete(void *  memory);
+
 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass___ecereNameSpace__ecere__sys__BTNode;
 
 struct __ecereNameSpace__ecere__sys__BTNode;
@@ -104,9 +110,9 @@ struct __ecereNameSpace__ecere__com__Class * _class;
 char *  dataTypeString;
 struct __ecereNameSpace__ecere__com__Class * dataTypeClass;
 struct Type * dataType;
-void (*  Set)();
-int (*  Get)();
-unsigned int (*  IsSet)();
+void (*  Set)(void * , int);
+int (*  Get)(void * );
+unsigned int (*  IsSet)(void * );
 void *  data;
 void *  symbol;
 int vid;
@@ -125,7 +131,7 @@ struct CodePosition
 int line;
 int charPos;
 int pos;
-unsigned int included;
+int included;
 } __attribute__ ((gcc_struct));
 
 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_Location;
@@ -385,7 +391,11 @@ struct Identifier * identifier;
 } __attribute__ ((gcc_struct));
 struct Statement * compound;
 struct Instantiation * instance;
+struct
+{
 char *  string;
+unsigned int intlString;
+} __attribute__ ((gcc_struct));
 struct __ecereNameSpace__ecere__sys__OldList *  list;
 struct
 {
@@ -467,7 +477,7 @@ struct TypeName * typeName;
 } __attribute__ ((gcc_struct));
 unsigned int debugValue;
 struct __ecereNameSpace__ecere__com__DataValue val;
-unsigned int address;
+uint64 address;
 unsigned int hasAddress;
 struct Type * expType;
 struct Type * destType;
@@ -478,6 +488,7 @@ unsigned int isConstant;
 unsigned int addedThis;
 unsigned int needCast;
 unsigned int thisPtr;
+unsigned int opDestType;
 } __attribute__ ((gcc_struct));
 
 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_TemplateDatatype;
@@ -669,7 +680,7 @@ char *  name;
 struct __ecereNameSpace__ecere__sys__OldList methods;
 struct __ecereNameSpace__ecere__sys__OldList properties;
 unsigned int itself;
-unsigned int isRemote;
+int isRemote;
 } __attribute__ ((gcc_struct));
 
 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_Symbol;
@@ -778,25 +789,28 @@ struct Symbol * enumClass;
 struct Type * type;
 struct TemplateParameter * templateParameter;
 } __attribute__ ((gcc_struct));
-unsigned int isSigned;
 int kind;
-unsigned int constant;
 unsigned int size;
 char *  name;
 char *  typeName;
-unsigned int count;
-unsigned int truth;
 int classObjectType;
-unsigned int byReference;
-unsigned int extraParam;
 int alignment;
-unsigned int directClassAccess;
-unsigned int computing;
-unsigned int dllExport;
 unsigned int offset;
-unsigned int keepCast;
-unsigned int passAsTemplate;
 int bitFieldCount;
+int count;
+unsigned int isSigned : 1;
+unsigned int constant : 1;
+unsigned int truth : 1;
+unsigned int byReference : 1;
+unsigned int extraParam : 1;
+unsigned int directClassAccess : 1;
+unsigned int computing : 1;
+unsigned int keepCast : 1;
+unsigned int passAsTemplate : 1;
+unsigned int dllExport : 1;
+unsigned int attrStdcall : 1;
+unsigned int declaredWithStruct : 1;
+unsigned int typedByReference : 1;
 } __attribute__ ((gcc_struct));
 
 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass___ecereNameSpace__ecere__com__Class;
@@ -838,7 +852,7 @@ unsigned int noExpansion;
 char *  defaultProperty;
 unsigned int comRedefinition;
 int count;
-unsigned int isRemote;
+int isRemote;
 unsigned int internalDecl;
 void *  data;
 unsigned int computeSize;
@@ -855,10 +869,14 @@ struct __ecereNameSpace__ecere__com__ClassTemplateArgument *  templateArgs;
 struct __ecereNameSpace__ecere__com__Class * templateClass;
 struct __ecereNameSpace__ecere__sys__OldList templatized;
 int numParams;
+unsigned int isInstanceClass;
+unsigned int byValueSystemClass;
 } __attribute__ ((gcc_struct));
 
 extern long long __ecereNameSpace__ecere__com__eClass_GetProperty(struct __ecereNameSpace__ecere__com__Class * _class, char *  name);
 
+extern void __ecereNameSpace__ecere__com__eInstance_FireSelfWatchers(struct __ecereNameSpace__ecere__com__Instance * instance, struct __ecereNameSpace__ecere__com__Property * _property);
+
 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass___ecereNameSpace__ecere__com__Instance;
 
 struct __ecereNameSpace__ecere__com__Instance
@@ -926,8 +944,6 @@ struct __ecereNameSpace__ecere__com__Method * method;
 } __attribute__ ((gcc_struct));
 } __attribute__ ((gcc_struct));
 
-typedef uintptr_t size_t;
-
 void exit(int status);
 
 void * calloc(size_t nmemb, size_t size);
@@ -946,7 +962,7 @@ unsigned long long int strtoull(const char * nptr, char ** endptr, int base);
 
 enum yytokentype
 {
-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
+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
 };
 
 typedef union YYSTYPE
@@ -1022,6 +1038,7 @@ struct AsmField * next;
 struct Location loc;
 char *  command;
 struct Expression * expression;
+struct Identifier * symbolic;
 } __attribute__ ((gcc_struct));
 
 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_Attribute;
@@ -1096,9 +1113,13 @@ struct Statement * getStmt;
 struct Statement * setStmt;
 struct Statement * issetStmt;
 struct Symbol * symbol;
-unsigned int conversion;
-unsigned int isWatchable;
 struct Expression * category;
+struct
+{
+unsigned int conversion : 1;
+unsigned int isWatchable : 1;
+unsigned int isDBProp : 1;
+} __attribute__ ((gcc_struct));
 } __attribute__ ((gcc_struct));
 
 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_PropertyWatch;
@@ -1201,16 +1222,13 @@ unsigned int thisClassParams = 0x1;
 
 unsigned int internalValueCounter;
 
-extern struct __ecereNameSpace__ecere__com__Class * __ecereClass___ecereNameSpace__ecere__sys__TempFile;
-
-struct __ecereNameSpace__ecere__sys__TempFile
-{
-char __ecere_padding[24];
-} __attribute__ ((gcc_struct));
+extern unsigned int outputLineNumbers;
 
 extern void OutputExpression(struct Expression * exp, struct __ecereNameSpace__ecere__com__Instance * f);
 
-extern int strlen(const char * );
+extern size_t strlen(const char * );
+
+extern struct __ecereNameSpace__ecere__com__Class * __ecereClass___ecereNameSpace__ecere__sys__TempFile;
 
 extern void *  __ecereNameSpace__ecere__com__eInstance_New(struct __ecereNameSpace__ecere__com__Class * _class);
 
@@ -1225,145 +1243,28 @@ void PrintExpression(struct Expression * exp, char * string)
 {
 struct __ecereNameSpace__ecere__com__Instance * f = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass___ecereNameSpace__ecere__sys__TempFile);
 int count;
+unsigned int backOutputLineNumbers = outputLineNumbers;
 
+outputLineNumbers = 0x0;
 if(exp)
 OutputExpression(exp, f);
-((unsigned int (*)(struct __ecereNameSpace__ecere__com__Instance *, int pos, int mode))f->_vTbl[__ecereVMethodID___ecereNameSpace__ecere__sys__File_Seek])(f, 0, 0);
+((unsigned int (*)(struct __ecereNameSpace__ecere__com__Instance *, int pos, int mode))__extension__ ({
+struct __ecereNameSpace__ecere__com__Instance * __internal_ClassInst = f;
+
+__internal_ClassInst ? __internal_ClassInst->_vTbl : __ecereClass___ecereNameSpace__ecere__sys__TempFile->_vTbl;
+})[__ecereVMethodID___ecereNameSpace__ecere__sys__File_Seek])(f, 0, 0);
 count = strlen(string);
-count += ((int (*)(struct __ecereNameSpace__ecere__com__Instance *, void *  buffer, unsigned int size, unsigned int count))f->_vTbl[__ecereVMethodID___ecereNameSpace__ecere__sys__File_Read])(f, string + count, 1, 1023);
+count += ((int (*)(struct __ecereNameSpace__ecere__com__Instance *, void *  buffer, unsigned int size, unsigned int count))__extension__ ({
+struct __ecereNameSpace__ecere__com__Instance * __internal_ClassInst = f;
+
+__internal_ClassInst ? __internal_ClassInst->_vTbl : __ecereClass___ecereNameSpace__ecere__sys__TempFile->_vTbl;
+})[__ecereVMethodID___ecereNameSpace__ecere__sys__File_Read])(f, string + count, 1, 1023);
 string[count] = '\0';
 (__ecereNameSpace__ecere__com__eInstance_DecRef(f), f = 0);
+outputLineNumbers = backOutputLineNumbers;
 }
 }
 
-extern int isspace(int c);
-
-long long _strtoi64(char * string, char ** endString, int base)
-{
-long long value = 0;
-int sign = 1;
-int c;
-char ch;
-
-for(c = 0; (ch = string[c]) && isspace(ch); c++)
-;
-if(ch == '+')
-c++;
-else if(ch == '-')
-{
-sign = -1;
-c++;
-}
-;
-if(!base)
-{
-if(ch == (char)0 && string[c + 1] == 'x')
-{
-base = 16;
-c += 2;
-}
-else if(ch == '0')
-{
-base = 8;
-c++;
-}
-else
-base = 10;
-}
-for(; (ch = string[c]); c++)
-{
-if(ch == '0')
-ch = (char)0;
-else if(ch >= '1' && ch <= '9')
-ch -= '1';
-else if(ch >= 'a' && ch <= 'z')
-ch -= 'a';
-else if(ch >= 'A' && ch <= 'Z')
-ch -= 'A';
-else
-{
-if(endString)
-*endString = string + c;
-break;
-}
-if(ch < base)
-{
-value *= base;
-value += ch;
-}
-else
-{
-if(endString)
-*endString = string + c;
-break;
-}
-}
-return sign * value;
-}
-
-uint64 _strtoui64(char * string, char ** endString, int base)
-{
-uint64 value = 0;
-int sign = 1;
-int c;
-char ch;
-
-for(c = 0; (ch = string[c]) && isspace(ch); c++)
-;
-if(ch == '+')
-c++;
-else if(ch == '-')
-{
-sign = -1;
-c++;
-}
-;
-if(!base)
-{
-if(ch == (char)0 && string[c + 1] == 'x')
-{
-base = 16;
-c += 2;
-}
-else if(ch == '0')
-{
-base = 8;
-c++;
-}
-else
-base = 10;
-}
-for(; (ch = string[c]); c++)
-{
-if(ch == '0')
-ch = (char)0;
-else if(ch >= '1' && ch <= '9')
-ch -= '1';
-else if(ch >= 'a' && ch <= 'z')
-ch -= 'a';
-else if(ch >= 'A' && ch <= 'Z')
-ch -= 'A';
-else
-{
-if(endString)
-*endString = string + c;
-break;
-}
-if(ch < base)
-{
-value *= base;
-value += ch;
-}
-else
-{
-if(endString)
-*endString = string + c;
-break;
-}
-}
-return sign * value;
-}
-
 extern struct Type * ProcessTypeString(char *  string, unsigned int staticMethod);
 
 extern struct Type * ProcessType(struct __ecereNameSpace__ecere__sys__OldList * specs, struct Declarator * decl);
@@ -1396,11 +1297,13 @@ if(type1->kind == type2->kind)
 {
 switch(type1->kind)
 {
+case 24:
 case 1:
 case 2:
 case 3:
 case 4:
 case 22:
+case 23:
 if(type1->passAsTemplate && !type2->passAsTemplate)
 return 0x1;
 return type1->isSigned != type2->isSigned;
@@ -1575,16 +1478,20 @@ extern int sprintf(char * , char * , ...);
 
 extern int __ecereNameSpace__ecere__com__GetRuntimePlatform(void);
 
+extern char *  strcat(char * , const char * );
+
 extern char *  __ecereNameSpace__ecere__sys__CopyString(char *  string);
 
 char * PrintInt(long long result)
 {
 char temp[100];
 
-if(result > (((long long)0x7fffffffffffffffLL)))
-sprintf(temp, ((__ecereNameSpace__ecere__com__GetRuntimePlatform() == 1) ? "0x%I64XLL" : "0x%llXLL"), result);
+if(result > (((int)0x7fffffff)))
+sprintf(temp, ((__ecereNameSpace__ecere__com__GetRuntimePlatform() == 1) ? "0x%I64X" : "0x%llX"), result);
 else
-sprintf(temp, ((__ecereNameSpace__ecere__com__GetRuntimePlatform() == 1) ? "%I64dLL" : "%lldLL"), result);
+sprintf(temp, ((__ecereNameSpace__ecere__com__GetRuntimePlatform() == 1) ? "%I64d" : "%lld"), result);
+if(result > (((int)0x7fffffff)) || result < (((int)0x80000000)))
+strcat(temp, "LL");
 return __ecereNameSpace__ecere__sys__CopyString(temp);
 }
 
@@ -1625,9 +1532,11 @@ char * PrintHexUInt(uint64 result)
 char temp[100];
 
 if(result > (0xffffffff))
-sprintf(temp, ((__ecereNameSpace__ecere__com__GetRuntimePlatform() == 1) ? "0x%I64XLL" : "0x%llXLL"), result);
+sprintf(temp, ((__ecereNameSpace__ecere__com__GetRuntimePlatform() == 1) ? "0x%I64X" : "0x%llX"), result);
 else
 sprintf(temp, ((__ecereNameSpace__ecere__com__GetRuntimePlatform() == 1) ? "0x%I64X" : "0x%llX"), result);
+if(result > (0xffffffff))
+strcat(temp, "LL");
 return __ecereNameSpace__ecere__sys__CopyString(temp);
 }
 
@@ -1657,7 +1566,7 @@ char temp[100];
 if(result > (unsigned short)32767)
 sprintf(temp, "0x%X", (int)result);
 else
-sprintf(temp, "%d", result);
+sprintf(temp, "%d", (int)result);
 return __ecereNameSpace__ecere__sys__CopyString(temp);
 }
 
@@ -1670,7 +1579,7 @@ char temp[100];
 if(result > (char)0 && isprint(result))
 sprintf(temp, "'%c'", result);
 else if(result < (char)0)
-sprintf(temp, "%d", result);
+sprintf(temp, "%d", (int)result);
 else
 sprintf(temp, "0x%X", (unsigned char)result);
 return __ecereNameSpace__ecere__sys__CopyString(temp);
@@ -1684,18 +1593,74 @@ sprintf(temp, "0x%X", result);
 return __ecereNameSpace__ecere__sys__CopyString(temp);
 }
 
+extern char *  strcpy(char * , const char * );
+
+extern unsigned int (* __ecereProp_float_Get_isInf)(float this);
+
+extern struct __ecereNameSpace__ecere__com__Property ** __ecereProp_float_isInf;
+
+extern int (* __ecereProp_float_Get_signBit)(float this);
+
+extern struct __ecereNameSpace__ecere__com__Property ** __ecereProp_float_signBit;
+
+extern unsigned int (* __ecereProp_float_Get_isNan)(float this);
+
+extern struct __ecereNameSpace__ecere__com__Property ** __ecereProp_float_isNan;
+
 char * PrintFloat(float result)
 {
 char temp[350];
 
+if(__ecereProp_float_Get_isInf(result))
+{
+if(__ecereProp_float_Get_signBit(result))
+strcpy(temp, "-inf");
+else
+strcpy(temp, "inf");
+}
+else if(__ecereProp_float_Get_isNan(result))
+{
+if(__ecereProp_float_Get_signBit(result))
+strcpy(temp, "-nan");
+else
+strcpy(temp, "nan");
+}
+else
 sprintf(temp, "%.16ff", result);
 return __ecereNameSpace__ecere__sys__CopyString(temp);
 }
 
+extern unsigned int (* __ecereProp_double_Get_isInf)(double this);
+
+extern struct __ecereNameSpace__ecere__com__Property ** __ecereProp_double_isInf;
+
+extern int (* __ecereProp_double_Get_signBit)(double this);
+
+extern struct __ecereNameSpace__ecere__com__Property ** __ecereProp_double_signBit;
+
+extern unsigned int (* __ecereProp_double_Get_isNan)(double this);
+
+extern struct __ecereNameSpace__ecere__com__Property ** __ecereProp_double_isNan;
+
 char * PrintDouble(double result)
 {
 char temp[350];
 
+if(__ecereProp_double_Get_isInf(result))
+{
+if(__ecereProp_double_Get_signBit(result))
+strcpy(temp, "-inf");
+else
+strcpy(temp, "inf");
+}
+else if(__ecereProp_double_Get_isNan(result))
+{
+if(__ecereProp_double_Get_signBit(result))
+strcpy(temp, "-nan");
+else
+strcpy(temp, "nan");
+}
+else
 sprintf(temp, "%.16f", result);
 return __ecereNameSpace__ecere__sys__CopyString(temp);
 }
@@ -1758,47 +1723,90 @@ int i;
 unsigned int ui;
 float f;
 double d;
-unsigned char *  p;
 long long i64;
 uint64 ui64;
-intptr_t iptr;
-uintptr_t uiptr;
 } __attribute__ ((gcc_struct));
 struct OpTable ops;
 } __attribute__ ((gcc_struct));
 
+unsigned int GetOpInt(struct Operand * op2, int * value2)
+{
+if(op2->kind == 3 && op2->type->isSigned)
+*value2 = op2->i;
+else if(op2->kind == 3)
+*value2 = (int)op2->ui;
+else if(op2->kind == 4 && op2->type->isSigned)
+*value2 = (int)op2->i64;
+else if(op2->kind == 4)
+*value2 = (int)op2->ui64;
+else if(op2->kind == 23 && op2->type->isSigned)
+*value2 = (int)op2->i64;
+else if(op2->kind == 23)
+*value2 = (int)op2->ui64;
+else if(op2->kind == 22 && op2->type->isSigned)
+*value2 = (int)op2->i64;
+else if(op2->kind == 22)
+*value2 = (int)op2->ui64;
+else if(op2->kind == 2 && op2->type->isSigned)
+*value2 = (int)op2->s;
+else if(op2->kind == 2)
+*value2 = (int)op2->us;
+else if(op2->kind == 1 && op2->type->isSigned)
+*value2 = (int)op2->c;
+else if(op2->kind == 24 || op2->kind == 1)
+*value2 = (int)op2->uc;
+else if(op2->kind == 6)
+*value2 = (int)op2->f;
+else if(op2->kind == 7)
+*value2 = (int)op2->d;
+else if(op2->kind == 13)
+*value2 = (int)op2->ui64;
+else
+return 0x0;
+return 0x1;
+}
+
 struct Operand GetOperand(struct Expression * exp);
 
 unsigned int GetInt(struct Expression * exp, int * value2)
 {
 struct Operand op2 = GetOperand(exp);
 
-if(op2.kind == 3 && op2.type->isSigned)
-*value2 = op2.i;
-else if(op2.kind == 3)
-*value2 = (int)op2.ui;
-if(op2.kind == 4 && op2.type->isSigned)
-*value2 = (int)op2.i64;
-else if(op2.kind == 4)
-*value2 = (int)op2.ui64;
-else if(op2.kind == 22 && op2.type->isSigned)
-*value2 = (int)op2.iptr;
-else if(op2.kind == 22)
-*value2 = (int)op2.uiptr;
-else if(op2.kind == 2 && op2.type->isSigned)
-*value2 = (int)op2.s;
-else if(op2.kind == 2)
-*value2 = (int)op2.us;
-else if(op2.kind == 1 && op2.type->isSigned)
-*value2 = (int)op2.c;
-else if(op2.kind == 1)
-*value2 = (int)op2.uc;
-else if(op2.kind == 6)
-*value2 = (int)op2.f;
-else if(op2.kind == 7)
-*value2 = (int)op2.d;
-else if(op2.kind == 13)
-*value2 = (int)op2.ui;
+return GetOpInt(&op2, value2);
+}
+
+unsigned int GetOpUInt(struct Operand * op2, unsigned int * value2)
+{
+if(op2->kind == 3 && op2->type->isSigned)
+*value2 = (unsigned int)op2->i;
+else if(op2->kind == 3)
+*value2 = op2->ui;
+else if(op2->kind == 4 && op2->type->isSigned)
+*value2 = (unsigned int)op2->i64;
+else if(op2->kind == 4)
+*value2 = (unsigned int)op2->ui64;
+else if(op2->kind == 23 && op2->type->isSigned)
+*value2 = (unsigned int)op2->i64;
+else if(op2->kind == 23)
+*value2 = (unsigned int)op2->ui64;
+else if(op2->kind == 22 && op2->type->isSigned)
+*value2 = (unsigned int)op2->i64;
+else if(op2->kind == 22)
+*value2 = (unsigned int)op2->ui64;
+else if(op2->kind == 2 && op2->type->isSigned)
+*value2 = (unsigned int)op2->s;
+else if(op2->kind == 2)
+*value2 = (unsigned int)op2->us;
+else if(op2->kind == 1 && op2->type->isSigned)
+*value2 = (unsigned int)op2->c;
+else if(op2->kind == 24 || op2->kind == 1)
+*value2 = (unsigned int)op2->uc;
+else if(op2->kind == 6)
+*value2 = (unsigned int)op2->f;
+else if(op2->kind == 7)
+*value2 = (unsigned int)op2->d;
+else if(op2->kind == 13)
+*value2 = (unsigned int)op2->ui64;
 else
 return 0x0;
 return 0x1;
@@ -1808,32 +1816,41 @@ unsigned int GetUInt(struct Expression * exp, unsigned int * value2)
 {
 struct Operand op2 = GetOperand(exp);
 
-if(op2.kind == 3 && op2.type->isSigned)
-*value2 = (unsigned int)op2.i;
-else if(op2.kind == 3)
-*value2 = op2.ui;
-if(op2.kind == 4 && op2.type->isSigned)
-*value2 = (unsigned int)op2.i64;
-else if(op2.kind == 4)
-*value2 = (unsigned int)op2.ui64;
-else if(op2.kind == 22 && op2.type->isSigned)
-*value2 = (unsigned int)op2.iptr;
-else if(op2.kind == 22)
-*value2 = (unsigned int)op2.uiptr;
-else if(op2.kind == 2 && op2.type->isSigned)
-*value2 = (unsigned int)op2.s;
-else if(op2.kind == 2)
-*value2 = (unsigned int)op2.us;
-else if(op2.kind == 1 && op2.type->isSigned)
-*value2 = (unsigned int)op2.c;
-else if(op2.kind == 1)
-*value2 = (unsigned int)op2.uc;
-else if(op2.kind == 6)
-*value2 = (unsigned int)op2.f;
-else if(op2.kind == 7)
-*value2 = (unsigned int)op2.d;
-else if(op2.kind == 13)
-*value2 = op2.ui;
+return GetOpUInt(&op2, value2);
+}
+
+unsigned int GetOpInt64(struct Operand * op2, long long * value2)
+{
+if(op2->kind == 3 && op2->type->isSigned)
+*value2 = (long long)op2->i;
+else if(op2->kind == 3)
+*value2 = (long long)op2->ui;
+else if(op2->kind == 4 && op2->type->isSigned)
+*value2 = op2->i64;
+else if(op2->kind == 4)
+*value2 = (long long)op2->ui64;
+else if(op2->kind == 23 && op2->type->isSigned)
+*value2 = op2->i64;
+else if(op2->kind == 23)
+*value2 = (long long)op2->ui64;
+else if(op2->kind == 22 && op2->type->isSigned)
+*value2 = op2->i64;
+else if(op2->kind == 22)
+*value2 = (long long)op2->ui64;
+else if(op2->kind == 2 && op2->type->isSigned)
+*value2 = (long long)op2->s;
+else if(op2->kind == 2)
+*value2 = (long long)op2->us;
+else if(op2->kind == 1 && op2->type->isSigned)
+*value2 = (long long)op2->c;
+else if(op2->kind == 24 || op2->kind == 1)
+*value2 = (long long)op2->uc;
+else if(op2->kind == 6)
+*value2 = (long long)op2->f;
+else if(op2->kind == 7)
+*value2 = (long long)op2->d;
+else if(op2->kind == 13)
+*value2 = (long long)op2->ui64;
 else
 return 0x0;
 return 0x1;
@@ -1843,32 +1860,41 @@ unsigned int GetInt64(struct Expression * exp, long long * value2)
 {
 struct Operand op2 = GetOperand(exp);
 
-if(op2.kind == 3 && op2.type->isSigned)
-*value2 = (long long)op2.i;
-else if(op2.kind == 3)
-*value2 = (long long)op2.ui;
-if(op2.kind == 4 && op2.type->isSigned)
-*value2 = op2.i64;
-else if(op2.kind == 4)
-*value2 = (long long)op2.ui64;
-else if(op2.kind == 22 && op2.type->isSigned)
-*value2 = (long long)op2.iptr;
-else if(op2.kind == 22)
-*value2 = (long long)op2.uiptr;
-else if(op2.kind == 2 && op2.type->isSigned)
-*value2 = (long long)op2.s;
-else if(op2.kind == 2)
-*value2 = (long long)op2.us;
-else if(op2.kind == 1 && op2.type->isSigned)
-*value2 = (long long)op2.c;
-else if(op2.kind == 1)
-*value2 = (long long)op2.uc;
-else if(op2.kind == 6)
-*value2 = (long long)op2.f;
-else if(op2.kind == 7)
-*value2 = (long long)op2.d;
-else if(op2.kind == 13)
-*value2 = (long long)op2.ui;
+return GetOpInt64(&op2, value2);
+}
+
+unsigned int GetOpUInt64(struct Operand * op2, uint64 * value2)
+{
+if(op2->kind == 3 && op2->type->isSigned)
+*value2 = (uint64)op2->i;
+else if(op2->kind == 3)
+*value2 = (uint64)op2->ui;
+else if(op2->kind == 4 && op2->type->isSigned)
+*value2 = (uint64)op2->i64;
+else if(op2->kind == 4)
+*value2 = op2->ui64;
+else if(op2->kind == 23 && op2->type->isSigned)
+*value2 = (uint64)op2->i64;
+else if(op2->kind == 23)
+*value2 = op2->ui64;
+else if(op2->kind == 22 && op2->type->isSigned)
+*value2 = (uint64)op2->i64;
+else if(op2->kind == 22)
+*value2 = op2->ui64;
+else if(op2->kind == 2 && op2->type->isSigned)
+*value2 = (uint64)op2->s;
+else if(op2->kind == 2)
+*value2 = (uint64)op2->us;
+else if(op2->kind == 1 && op2->type->isSigned)
+*value2 = (uint64)op2->c;
+else if(op2->kind == 24 || op2->kind == 1)
+*value2 = (uint64)op2->uc;
+else if(op2->kind == 6)
+*value2 = (uint64)op2->f;
+else if(op2->kind == 7)
+*value2 = (uint64)op2->d;
+else if(op2->kind == 13)
+*value2 = op2->ui64;
 else
 return 0x0;
 return 0x1;
@@ -1878,32 +1904,41 @@ unsigned int GetUInt64(struct Expression * exp, uint64 * value2)
 {
 struct Operand op2 = GetOperand(exp);
 
-if(op2.kind == 3 && op2.type->isSigned)
-*value2 = (uint64)op2.i;
-else if(op2.kind == 3)
-*value2 = (uint64)op2.ui;
-if(op2.kind == 4 && op2.type->isSigned)
-*value2 = (uint64)op2.i64;
-else if(op2.kind == 4)
-*value2 = op2.ui64;
-else if(op2.kind == 22 && op2.type->isSigned)
-*value2 = (uint64)op2.iptr;
-else if(op2.kind == 22)
-*value2 = (uint64)op2.uiptr;
-else if(op2.kind == 2 && op2.type->isSigned)
-*value2 = (uint64)op2.s;
-else if(op2.kind == 2)
-*value2 = (uint64)op2.us;
-else if(op2.kind == 1 && op2.type->isSigned)
-*value2 = (uint64)op2.c;
-else if(op2.kind == 1)
-*value2 = (uint64)op2.uc;
-else if(op2.kind == 6)
-*value2 = (uint64)op2.f;
-else if(op2.kind == 7)
-*value2 = (uint64)op2.d;
-else if(op2.kind == 13)
-*value2 = (uint64)op2.ui;
+return GetOpUInt64(&op2, value2);
+}
+
+unsigned int GetOpIntPtr(struct Operand * op2, intptr_t * value2)
+{
+if(op2->kind == 3 && op2->type->isSigned)
+*value2 = (intptr_t)op2->i;
+else if(op2->kind == 3)
+*value2 = (intptr_t)op2->ui;
+else if(op2->kind == 4 && op2->type->isSigned)
+*value2 = (intptr_t)op2->i64;
+else if(op2->kind == 4)
+*value2 = (intptr_t)op2->ui64;
+else if(op2->kind == 23 && op2->type->isSigned)
+*value2 = (intptr_t)op2->i64;
+else if(op2->kind == 23)
+*value2 = (intptr_t)op2->ui64;
+else if(op2->kind == 22 && op2->type->isSigned)
+*value2 = (intptr_t)op2->i64;
+else if(op2->kind == 22)
+*value2 = (intptr_t)op2->ui64;
+else if(op2->kind == 2 && op2->type->isSigned)
+*value2 = (intptr_t)op2->s;
+else if(op2->kind == 2)
+*value2 = (intptr_t)op2->us;
+else if(op2->kind == 1 && op2->type->isSigned)
+*value2 = (intptr_t)op2->c;
+else if(op2->kind == 24 || op2->kind == 1)
+*value2 = (intptr_t)op2->uc;
+else if(op2->kind == 6)
+*value2 = (intptr_t)op2->f;
+else if(op2->kind == 7)
+*value2 = (intptr_t)op2->d;
+else if(op2->kind == 13)
+*value2 = (intptr_t)op2->ui64;
 else
 return 0x0;
 return 0x1;
@@ -1913,32 +1948,41 @@ unsigned int GetIntPtr(struct Expression * exp, intptr_t * value2)
 {
 struct Operand op2 = GetOperand(exp);
 
-if(op2.kind == 3 && op2.type->isSigned)
-*value2 = (intptr_t)op2.i;
-else if(op2.kind == 3)
-*value2 = (intptr_t)op2.ui;
-if(op2.kind == 4 && op2.type->isSigned)
-*value2 = (intptr_t)op2.i64;
-else if(op2.kind == 4)
-*value2 = (intptr_t)op2.ui64;
-else if(op2.kind == 22 && op2.type->isSigned)
-*value2 = op2.iptr;
-else if(op2.kind == 22)
-*value2 = (intptr_t)op2.uiptr;
-else if(op2.kind == 2 && op2.type->isSigned)
-*value2 = (intptr_t)op2.s;
-else if(op2.kind == 2)
-*value2 = (intptr_t)op2.us;
-else if(op2.kind == 1 && op2.type->isSigned)
-*value2 = (intptr_t)op2.c;
-else if(op2.kind == 1)
-*value2 = (intptr_t)op2.uc;
-else if(op2.kind == 6)
-*value2 = (intptr_t)op2.f;
-else if(op2.kind == 7)
-*value2 = (intptr_t)op2.d;
-else if(op2.kind == 13)
-*value2 = (intptr_t)op2.ui;
+return GetOpIntPtr(&op2, value2);
+}
+
+unsigned int GetOpUIntPtr(struct Operand * op2, uintptr_t * value2)
+{
+if(op2->kind == 3 && op2->type->isSigned)
+*value2 = (uintptr_t)op2->i;
+else if(op2->kind == 3)
+*value2 = (uintptr_t)op2->ui;
+else if(op2->kind == 4 && op2->type->isSigned)
+*value2 = (uintptr_t)op2->i64;
+else if(op2->kind == 4)
+*value2 = (uintptr_t)op2->ui64;
+else if(op2->kind == 23 && op2->type->isSigned)
+*value2 = (uintptr_t)op2->i64;
+else if(op2->kind == 23)
+*value2 = (uintptr_t)op2->ui64;
+else if(op2->kind == 22 && op2->type->isSigned)
+*value2 = (uintptr_t)op2->i64;
+else if(op2->kind == 22)
+*value2 = (uintptr_t)op2->ui64;
+else if(op2->kind == 2 && op2->type->isSigned)
+*value2 = (uintptr_t)op2->s;
+else if(op2->kind == 2)
+*value2 = (uintptr_t)op2->us;
+else if(op2->kind == 1 && op2->type->isSigned)
+*value2 = (uintptr_t)op2->c;
+else if(op2->kind == 24 || op2->kind == 1)
+*value2 = (uintptr_t)op2->uc;
+else if(op2->kind == 6)
+*value2 = (uintptr_t)op2->f;
+else if(op2->kind == 7)
+*value2 = (uintptr_t)op2->d;
+else if(op2->kind == 13)
+*value2 = (uintptr_t)op2->ui64;
 else
 return 0x0;
 return 0x1;
@@ -1948,32 +1992,129 @@ unsigned int GetUIntPtr(struct Expression * exp, uintptr_t * value2)
 {
 struct Operand op2 = GetOperand(exp);
 
-if(op2.kind == 3 && op2.type->isSigned)
-*value2 = (uintptr_t)op2.i;
-else if(op2.kind == 3)
-*value2 = (uintptr_t)op2.ui;
-if(op2.kind == 4 && op2.type->isSigned)
-*value2 = (uintptr_t)op2.i64;
-else if(op2.kind == 4)
-*value2 = (uintptr_t)op2.ui64;
-else if(op2.kind == 22 && op2.type->isSigned)
-*value2 = (uintptr_t)op2.iptr;
-else if(op2.kind == 22)
-*value2 = op2.uiptr;
-else if(op2.kind == 2 && op2.type->isSigned)
-*value2 = (uintptr_t)op2.s;
-else if(op2.kind == 2)
-*value2 = (uintptr_t)op2.us;
-else if(op2.kind == 1 && op2.type->isSigned)
-*value2 = (uintptr_t)op2.c;
-else if(op2.kind == 1)
-*value2 = (uintptr_t)op2.uc;
-else if(op2.kind == 6)
-*value2 = (uintptr_t)op2.f;
-else if(op2.kind == 7)
-*value2 = (uintptr_t)op2.d;
-else if(op2.kind == 13)
-*value2 = (uintptr_t)op2.ui;
+return GetOpUIntPtr(&op2, value2);
+}
+
+unsigned int GetOpIntSize(struct Operand * op2, ssize_t * value2)
+{
+if(op2->kind == 3 && op2->type->isSigned)
+*value2 = (ssize_t)op2->i;
+else if(op2->kind == 3)
+*value2 = (ssize_t)op2->ui;
+else if(op2->kind == 4 && op2->type->isSigned)
+*value2 = (ssize_t)op2->i64;
+else if(op2->kind == 4)
+*value2 = (ssize_t)op2->ui64;
+else if(op2->kind == 23 && op2->type->isSigned)
+*value2 = (ssize_t)op2->i64;
+else if(op2->kind == 23)
+*value2 = (ssize_t)op2->ui64;
+else if(op2->kind == 22 && op2->type->isSigned)
+*value2 = (ssize_t)op2->i64;
+else if(op2->kind == 22)
+*value2 = (ssize_t)op2->ui64;
+else if(op2->kind == 2 && op2->type->isSigned)
+*value2 = (ssize_t)op2->s;
+else if(op2->kind == 2)
+*value2 = (ssize_t)op2->us;
+else if(op2->kind == 1 && op2->type->isSigned)
+*value2 = (ssize_t)op2->c;
+else if(op2->kind == 24 || op2->kind == 1)
+*value2 = (ssize_t)op2->uc;
+else if(op2->kind == 6)
+*value2 = (ssize_t)op2->f;
+else if(op2->kind == 7)
+*value2 = (ssize_t)op2->d;
+else if(op2->kind == 13)
+*value2 = (ssize_t)op2->ui64;
+else
+return 0x0;
+return 0x1;
+}
+
+unsigned int GetIntSize(struct Expression * exp, ssize_t * value2)
+{
+struct Operand op2 = GetOperand(exp);
+
+return GetOpIntSize(&op2, value2);
+}
+
+unsigned int GetOpUIntSize(struct Operand * op2, size_t * value2)
+{
+if(op2->kind == 3 && op2->type->isSigned)
+*value2 = (size_t)op2->i;
+else if(op2->kind == 3)
+*value2 = (size_t)op2->ui;
+else if(op2->kind == 4 && op2->type->isSigned)
+*value2 = (size_t)op2->i64;
+else if(op2->kind == 4)
+*value2 = (size_t)op2->ui64;
+else if(op2->kind == 23 && op2->type->isSigned)
+*value2 = (size_t)op2->i64;
+else if(op2->kind == 23)
+*value2 = (size_t)op2->ui64;
+else if(op2->kind == 22 && op2->type->isSigned)
+*value2 = (size_t)op2->i64;
+else if(op2->kind == 22)
+*value2 = (size_t)op2->ui64;
+else if(op2->kind == 2 && op2->type->isSigned)
+*value2 = (size_t)op2->s;
+else if(op2->kind == 2)
+*value2 = (size_t)op2->us;
+else if(op2->kind == 1 && op2->type->isSigned)
+*value2 = (size_t)op2->c;
+else if(op2->kind == 24 || op2->kind == 1)
+*value2 = (size_t)op2->uc;
+else if(op2->kind == 6)
+*value2 = (size_t)op2->f;
+else if(op2->kind == 7)
+*value2 = (size_t)op2->d;
+else if(op2->kind == 13)
+*value2 = (size_t)op2->ui64;
+else
+return 0x0;
+return 0x1;
+}
+
+unsigned int GetUIntSize(struct Expression * exp, size_t * value2)
+{
+struct Operand op2 = GetOperand(exp);
+
+return GetOpUIntSize(&op2, value2);
+}
+
+unsigned int GetOpShort(struct Operand * op2, short * value2)
+{
+if(op2->kind == 3 && op2->type->isSigned)
+*value2 = (short)op2->i;
+else if(op2->kind == 3)
+*value2 = (short)op2->ui;
+else if(op2->kind == 4 && op2->type->isSigned)
+*value2 = (short)op2->i64;
+else if(op2->kind == 4)
+*value2 = (short)op2->ui64;
+else if(op2->kind == 23 && op2->type->isSigned)
+*value2 = (short)op2->i64;
+else if(op2->kind == 23)
+*value2 = (short)op2->ui64;
+else if(op2->kind == 22 && op2->type->isSigned)
+*value2 = (short)op2->i64;
+else if(op2->kind == 22)
+*value2 = (short)op2->ui64;
+else if(op2->kind == 2 && op2->type->isSigned)
+*value2 = op2->s;
+else if(op2->kind == 2)
+*value2 = (short)op2->us;
+else if(op2->kind == 1 && op2->type->isSigned)
+*value2 = (short)op2->c;
+else if(op2->kind == 24 || op2->kind == 1)
+*value2 = (short)op2->uc;
+else if(op2->kind == 6)
+*value2 = (short)op2->f;
+else if(op2->kind == 7)
+*value2 = (short)op2->d;
+else if(op2->kind == 13)
+*value2 = (short)op2->ui64;
 else
 return 0x0;
 return 0x1;
@@ -1983,32 +2124,41 @@ unsigned int GetShort(struct Expression * exp, short * value2)
 {
 struct Operand op2 = GetOperand(exp);
 
-if(op2.kind == 3 && op2.type->isSigned)
-*value2 = (short)op2.i;
-else if(op2.kind == 3)
-*value2 = (short)op2.ui;
-if(op2.kind == 4 && op2.type->isSigned)
-*value2 = (short)op2.i64;
-else if(op2.kind == 4)
-*value2 = (short)op2.ui64;
-else if(op2.kind == 22 && op2.type->isSigned)
-*value2 = (short)op2.iptr;
-else if(op2.kind == 22)
-*value2 = (short)op2.uiptr;
-else if(op2.kind == 2 && op2.type->isSigned)
-*value2 = op2.s;
-else if(op2.kind == 2)
-*value2 = (short)op2.us;
-else if(op2.kind == 1 && op2.type->isSigned)
-*value2 = (short)op2.c;
-else if(op2.kind == 1)
-*value2 = (short)op2.uc;
-else if(op2.kind == 6)
-*value2 = (short)op2.f;
-else if(op2.kind == 7)
-*value2 = (short)op2.d;
-else if(op2.kind == 13)
-*value2 = (short)op2.ui;
+return GetOpShort(&op2, value2);
+}
+
+unsigned int GetOpUShort(struct Operand * op2, unsigned short * value2)
+{
+if(op2->kind == 3 && op2->type->isSigned)
+*value2 = (unsigned short)op2->i;
+else if(op2->kind == 3)
+*value2 = (unsigned short)op2->ui;
+else if(op2->kind == 4 && op2->type->isSigned)
+*value2 = (unsigned short)op2->i64;
+else if(op2->kind == 4)
+*value2 = (unsigned short)op2->ui64;
+else if(op2->kind == 23 && op2->type->isSigned)
+*value2 = (unsigned short)op2->i64;
+else if(op2->kind == 23)
+*value2 = (unsigned short)op2->ui64;
+else if(op2->kind == 22 && op2->type->isSigned)
+*value2 = (unsigned short)op2->i64;
+else if(op2->kind == 22)
+*value2 = (unsigned short)op2->ui64;
+else if(op2->kind == 2 && op2->type->isSigned)
+*value2 = (unsigned short)op2->s;
+else if(op2->kind == 2)
+*value2 = op2->us;
+else if(op2->kind == 1 && op2->type->isSigned)
+*value2 = (unsigned short)op2->c;
+else if(op2->kind == 24 || op2->kind == 1)
+*value2 = (unsigned short)op2->uc;
+else if(op2->kind == 6)
+*value2 = (unsigned short)op2->f;
+else if(op2->kind == 7)
+*value2 = (unsigned short)op2->d;
+else if(op2->kind == 13)
+*value2 = (unsigned short)op2->ui64;
 else
 return 0x0;
 return 0x1;
@@ -2018,32 +2168,41 @@ unsigned int GetUShort(struct Expression * exp, unsigned short * value2)
 {
 struct Operand op2 = GetOperand(exp);
 
-if(op2.kind == 3 && op2.type->isSigned)
-*value2 = (unsigned short)op2.i;
-else if(op2.kind == 3)
-*value2 = (unsigned short)op2.ui;
-if(op2.kind == 4 && op2.type->isSigned)
-*value2 = (unsigned short)op2.i64;
-else if(op2.kind == 4)
-*value2 = (unsigned short)op2.ui64;
-else if(op2.kind == 22 && op2.type->isSigned)
-*value2 = (unsigned short)op2.iptr;
-else if(op2.kind == 22)
-*value2 = (unsigned short)op2.uiptr;
-else if(op2.kind == 2 && op2.type->isSigned)
-*value2 = (unsigned short)op2.s;
-else if(op2.kind == 2)
-*value2 = op2.us;
-else if(op2.kind == 1 && op2.type->isSigned)
-*value2 = (unsigned short)op2.c;
-else if(op2.kind == 1)
-*value2 = (unsigned short)op2.uc;
-else if(op2.kind == 6)
-*value2 = (unsigned short)op2.f;
-else if(op2.kind == 7)
-*value2 = (unsigned short)op2.d;
-else if(op2.kind == 13)
-*value2 = (unsigned short)op2.ui;
+return GetOpUShort(&op2, value2);
+}
+
+unsigned int GetOpChar(struct Operand * op2, char * value2)
+{
+if(op2->kind == 3 && op2->type->isSigned)
+*value2 = (char)op2->i;
+else if(op2->kind == 3)
+*value2 = (char)op2->ui;
+else if(op2->kind == 4 && op2->type->isSigned)
+*value2 = (char)op2->i64;
+else if(op2->kind == 4)
+*value2 = (char)op2->ui64;
+else if(op2->kind == 23 && op2->type->isSigned)
+*value2 = (char)op2->i64;
+else if(op2->kind == 23)
+*value2 = (char)op2->ui64;
+else if(op2->kind == 22 && op2->type->isSigned)
+*value2 = (char)op2->i64;
+else if(op2->kind == 22)
+*value2 = (char)op2->ui64;
+else if(op2->kind == 2 && op2->type->isSigned)
+*value2 = (char)op2->s;
+else if(op2->kind == 2)
+*value2 = (char)op2->us;
+else if(op2->kind == 1 && op2->type->isSigned)
+*value2 = op2->c;
+else if(op2->kind == 24 || op2->kind == 1)
+*value2 = (char)op2->uc;
+else if(op2->kind == 6)
+*value2 = (char)op2->f;
+else if(op2->kind == 7)
+*value2 = (char)op2->d;
+else if(op2->kind == 13)
+*value2 = (char)op2->ui64;
 else
 return 0x0;
 return 0x1;
@@ -2053,32 +2212,41 @@ unsigned int GetChar(struct Expression * exp, char * value2)
 {
 struct Operand op2 = GetOperand(exp);
 
-if(op2.kind == 3 && op2.type->isSigned)
-*value2 = (char)op2.i;
-else if(op2.kind == 3)
-*value2 = (char)op2.ui;
-if(op2.kind == 4 && op2.type->isSigned)
-*value2 = (char)op2.i64;
-else if(op2.kind == 4)
-*value2 = (char)op2.ui64;
-else if(op2.kind == 22 && op2.type->isSigned)
-*value2 = (char)op2.iptr;
-else if(op2.kind == 22)
-*value2 = (char)op2.uiptr;
-else if(op2.kind == 2 && op2.type->isSigned)
-*value2 = (char)op2.s;
-else if(op2.kind == 2)
-*value2 = (char)op2.us;
-else if(op2.kind == 1 && op2.type->isSigned)
-*value2 = op2.c;
-else if(op2.kind == 1)
-*value2 = (char)op2.uc;
-else if(op2.kind == 6)
-*value2 = (char)op2.f;
-else if(op2.kind == 7)
-*value2 = (char)op2.d;
-else if(op2.kind == 13)
-*value2 = (char)op2.ui;
+return GetOpChar(&op2, value2);
+}
+
+unsigned int GetOpUChar(struct Operand * op2, unsigned char * value2)
+{
+if(op2->kind == 3 && op2->type->isSigned)
+*value2 = (unsigned char)op2->i;
+else if(op2->kind == 3)
+*value2 = (unsigned char)op2->ui;
+else if(op2->kind == 4 && op2->type->isSigned)
+*value2 = (unsigned char)op2->i64;
+else if(op2->kind == 4)
+*value2 = (unsigned char)op2->ui64;
+else if(op2->kind == 23 && op2->type->isSigned)
+*value2 = (unsigned char)op2->i64;
+else if(op2->kind == 23)
+*value2 = (unsigned char)op2->ui64;
+else if(op2->kind == 22 && op2->type->isSigned)
+*value2 = (unsigned char)op2->i64;
+else if(op2->kind == 22)
+*value2 = (unsigned char)op2->ui64;
+else if(op2->kind == 2 && op2->type->isSigned)
+*value2 = (unsigned char)op2->s;
+else if(op2->kind == 2)
+*value2 = (unsigned char)op2->us;
+else if(op2->kind == 1 && op2->type->isSigned)
+*value2 = (unsigned char)op2->c;
+else if(op2->kind == 24 || op2->kind == 1)
+*value2 = op2->uc;
+else if(op2->kind == 6)
+*value2 = (unsigned char)op2->f;
+else if(op2->kind == 7)
+*value2 = (unsigned char)op2->d;
+else if(op2->kind == 13)
+*value2 = (unsigned char)op2->ui64;
 else
 return 0x0;
 return 0x1;
@@ -2088,32 +2256,41 @@ unsigned int GetUChar(struct Expression * exp, unsigned char * value2)
 {
 struct Operand op2 = GetOperand(exp);
 
-if(op2.kind == 3 && op2.type->isSigned)
-*value2 = (unsigned char)op2.i;
-else if(op2.kind == 3)
-*value2 = (unsigned char)op2.ui;
-if(op2.kind == 4 && op2.type->isSigned)
-*value2 = (unsigned char)op2.i64;
-else if(op2.kind == 4)
-*value2 = (unsigned char)op2.ui64;
-else if(op2.kind == 22 && op2.type->isSigned)
-*value2 = (unsigned char)op2.iptr;
-else if(op2.kind == 22)
-*value2 = (unsigned char)op2.uiptr;
-else if(op2.kind == 2 && op2.type->isSigned)
-*value2 = (unsigned char)op2.s;
-else if(op2.kind == 2)
-*value2 = (unsigned char)op2.us;
-else if(op2.kind == 1 && op2.type->isSigned)
-*value2 = (unsigned char)op2.c;
-else if(op2.kind == 1)
-*value2 = op2.uc;
-else if(op2.kind == 6)
-*value2 = (unsigned char)op2.f;
-else if(op2.kind == 7)
-*value2 = (unsigned char)op2.d;
-else if(op2.kind == 13)
-*value2 = (unsigned char)op2.ui;
+return GetOpUChar(&op2, value2);
+}
+
+unsigned int GetOpFloat(struct Operand * op2, float * value2)
+{
+if(op2->kind == 3 && op2->type->isSigned)
+*value2 = (float)(float)op2->i;
+else if(op2->kind == 3)
+*value2 = (float)(float)op2->ui;
+else if(op2->kind == 4 && op2->type->isSigned)
+*value2 = (float)(float)op2->i64;
+else if(op2->kind == 4)
+*value2 = (float)(float)op2->ui64;
+else if(op2->kind == 23 && op2->type->isSigned)
+*value2 = (float)(float)op2->i64;
+else if(op2->kind == 23)
+*value2 = (float)(float)op2->ui64;
+else if(op2->kind == 22 && op2->type->isSigned)
+*value2 = (float)(float)op2->i64;
+else if(op2->kind == 22)
+*value2 = (float)(float)op2->ui64;
+else if(op2->kind == 2 && op2->type->isSigned)
+*value2 = (float)(float)op2->s;
+else if(op2->kind == 2)
+*value2 = (float)(float)op2->us;
+else if(op2->kind == 1 && op2->type->isSigned)
+*value2 = (float)(float)op2->c;
+else if(op2->kind == 24 || op2->kind == 1)
+*value2 = (float)(float)op2->uc;
+else if(op2->kind == 6)
+*value2 = (float)op2->f;
+else if(op2->kind == 7)
+*value2 = (float)op2->d;
+else if(op2->kind == 13)
+*value2 = (float)(float)op2->ui64;
 else
 return 0x0;
 return 0x1;
@@ -2123,32 +2300,41 @@ unsigned int GetFloat(struct Expression * exp, float * value2)
 {
 struct Operand op2 = GetOperand(exp);
 
-if(op2.kind == 3 && op2.type->isSigned)
-*value2 = (float)(float)op2.i;
-else if(op2.kind == 3)
-*value2 = (float)(float)op2.ui;
-if(op2.kind == 4 && op2.type->isSigned)
-*value2 = (float)(float)op2.i64;
-else if(op2.kind == 4)
-*value2 = (float)(float)op2.ui64;
-else if(op2.kind == 22 && op2.type->isSigned)
-*value2 = (float)op2.iptr;
-else if(op2.kind == 22)
-*value2 = (float)op2.uiptr;
-else if(op2.kind == 2 && op2.type->isSigned)
-*value2 = (float)(float)op2.s;
-else if(op2.kind == 2)
-*value2 = (float)(float)op2.us;
-else if(op2.kind == 1 && op2.type->isSigned)
-*value2 = (float)(float)op2.c;
-else if(op2.kind == 1)
-*value2 = (float)(float)op2.uc;
-else if(op2.kind == 6)
-*value2 = (float)op2.f;
-else if(op2.kind == 7)
-*value2 = (float)op2.d;
-else if(op2.kind == 13)
-*value2 = (float)(float)op2.ui;
+return GetOpFloat(&op2, value2);
+}
+
+unsigned int GetOpDouble(struct Operand * op2, double * value2)
+{
+if(op2->kind == 3 && op2->type->isSigned)
+*value2 = (double)(double)op2->i;
+else if(op2->kind == 3)
+*value2 = (double)(double)op2->ui;
+else if(op2->kind == 4 && op2->type->isSigned)
+*value2 = (double)(double)op2->i64;
+else if(op2->kind == 4)
+*value2 = (double)(double)op2->ui64;
+else if(op2->kind == 23 && op2->type->isSigned)
+*value2 = (double)(double)op2->i64;
+else if(op2->kind == 23)
+*value2 = (double)(double)op2->ui64;
+else if(op2->kind == 22 && op2->type->isSigned)
+*value2 = (double)(double)op2->i64;
+else if(op2->kind == 22)
+*value2 = (double)(double)op2->ui64;
+else if(op2->kind == 2 && op2->type->isSigned)
+*value2 = (double)(double)op2->s;
+else if(op2->kind == 2)
+*value2 = (double)(double)op2->us;
+else if(op2->kind == 1 && op2->type->isSigned)
+*value2 = (double)(double)op2->c;
+else if(op2->kind == 24 || op2->kind == 1)
+*value2 = (double)(double)op2->uc;
+else if(op2->kind == 6)
+*value2 = (double)op2->f;
+else if(op2->kind == 7)
+*value2 = (double)op2->d;
+else if(op2->kind == 13)
+*value2 = (double)(double)op2->ui64;
 else
 return 0x0;
 return 0x1;
@@ -2158,41 +2344,15 @@ unsigned int GetDouble(struct Expression * exp, double * value2)
 {
 struct Operand op2 = GetOperand(exp);
 
-if(op2.kind == 3 && op2.type->isSigned)
-*value2 = (double)(double)op2.i;
-else if(op2.kind == 3)
-*value2 = (double)(double)op2.ui;
-if(op2.kind == 4 && op2.type->isSigned)
-*value2 = (double)(double)op2.i64;
-else if(op2.kind == 4)
-*value2 = (double)(double)op2.ui64;
-else if(op2.kind == 22 && op2.type->isSigned)
-*value2 = (double)op2.iptr;
-else if(op2.kind == 22)
-*value2 = (double)op2.uiptr;
-else if(op2.kind == 2 && op2.type->isSigned)
-*value2 = (double)(double)op2.s;
-else if(op2.kind == 2)
-*value2 = (double)(double)op2.us;
-else if(op2.kind == 1 && op2.type->isSigned)
-*value2 = (double)(double)op2.c;
-else if(op2.kind == 1)
-*value2 = (double)(double)op2.uc;
-else if(op2.kind == 6)
-*value2 = (double)op2.f;
-else if(op2.kind == 7)
-*value2 = (double)op2.d;
-else if(op2.kind == 13)
-*value2 = (double)(double)op2.ui;
-else
-return 0x0;
-return 0x1;
+return GetOpDouble(&op2, value2);
 }
 
 void ComputeExpression(struct Expression * exp);
 
 struct Context * SetupTemplatesContext(struct __ecereNameSpace__ecere__com__Class * _class);
 
+extern int targetBits;
+
 int ComputeTypeSize(struct Type * type);
 
 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass___ecereNameSpace__ecere__com__BitMember;
@@ -2237,8 +2397,16 @@ int c;
 int unionMemberOffset = 0;
 int bitFields = 0;
 
-if(!member && (_class->type == 1 || _class->type == 0 || _class->type == 5) && _class->memberOffset && _class->memberOffset > _class->base->structSize)
-_class->memberOffset = (_class->base && _class->base->type != 1000) ? _class->base->structSize : 0;
+if(member)
+{
+member->memberOffset = 0;
+if(targetBits < sizeof(void *) * 8)
+member->structAlignment = 0;
+}
+else if(targetBits < sizeof(void *) * 8)
+_class->structAlignment = 0;
+if(!member && ((_class->type == 0 || _class->type == 5) || (_class->type == 1 && _class->memberOffset && _class->memberOffset > _class->base->structSize)))
+_class->memberOffset = (_class->base && _class->type == 1) ? _class->base->structSize : 0;
 if(!member && _class->destructionWatchOffset)
 _class->memberOffset += sizeof(struct __ecereNameSpace__ecere__sys__OldList);
 {
@@ -2374,24 +2542,38 @@ _class->memberOffset += size;
 }
 else
 {
+int alignment;
+
 ComputeClassMembers((struct __ecereNameSpace__ecere__com__Class *)dataMember, 0x1);
+alignment = dataMember->structAlignment;
 if(isMember)
 {
-int __simpleStruct2;
-int __simpleStruct0, __simpleStruct1;
+int __simpleStruct0;
+
+if(alignment)
+{
+int __simpleStruct0;
 
-member->structAlignment = (__simpleStruct0 = member->structAlignment, __simpleStruct1 = dataMember->structAlignment, (__simpleStruct0 > __simpleStruct1) ? __simpleStruct0 : __simpleStruct1);
+if(member->memberOffset % alignment)
+member->memberOffset += alignment - (member->memberOffset % alignment);
+member->structAlignment = (__simpleStruct0 = member->structAlignment, (__simpleStruct0 > alignment) ? __simpleStruct0 : alignment);
+}
 dataMember->offset = member->memberOffset;
 if(member->type == 1)
-unionMemberOffset = (__simpleStruct2 = dataMember->memberOffset, (unionMemberOffset > __simpleStruct2) ? unionMemberOffset : __simpleStruct2);
+unionMemberOffset = (__simpleStruct0 = dataMember->memberOffset, (unionMemberOffset > __simpleStruct0) ? unionMemberOffset : __simpleStruct0);
 else
 member->memberOffset += dataMember->memberOffset;
 }
 else
 {
-int __simpleStruct0, __simpleStruct1;
+if(alignment)
+{
+int __simpleStruct0;
 
-_class->structAlignment = (__simpleStruct0 = _class->structAlignment, __simpleStruct1 = dataMember->structAlignment, (__simpleStruct0 > __simpleStruct1) ? __simpleStruct0 : __simpleStruct1);
+if(_class->memberOffset % alignment)
+_class->memberOffset += alignment - (_class->memberOffset % alignment);
+_class->structAlignment = (__simpleStruct0 = _class->structAlignment, (__simpleStruct0 > alignment) ? __simpleStruct0 : alignment);
+}
 dataMember->offset = _class->memberOffset;
 _class->memberOffset += dataMember->memberOffset;
 }
@@ -2530,21 +2712,17 @@ void ComputeModuleClasses(struct __ecereNameSpace__ecere__com__Instance * module
 struct __ecereNameSpace__ecere__com__Class * _class;
 struct __ecereNameSpace__ecere__sys__OldLink * subModule;
 
-for(subModule = ((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + 12)))->modules.first; subModule; subModule = subModule->next)
+for(subModule = ((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + structSize_Instance)))->modules.first; subModule; subModule = subModule->next)
 ComputeModuleClasses(subModule->data);
-for(_class = ((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + 12)))->classes.first; _class; _class = _class->next)
+for(_class = ((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + structSize_Instance)))->classes.first; _class; _class = _class->next)
 ComputeClassMembers(_class, 0x0);
 }
 
-extern int targetBits;
-
 extern unsigned int inCompiler;
 
 extern void Compiler_Error(char *  format, ...);
 
-extern char *  __ecereNameSpace__ecere__GetTranslatedString(struct __ecereNameSpace__ecere__com__Instance * module, char *  string, char *  stringAndContext);
-
-extern struct __ecereNameSpace__ecere__com__Instance * __thisModule;
+extern char *  __ecereNameSpace__ecere__GetTranslatedString(char * name, char *  string, char *  stringAndContext);
 
 int ComputeTypeSize(struct Type * type)
 {
@@ -2555,6 +2733,9 @@ if(!size && type && !type->computing)
 type->computing = 0x1;
 switch(type->kind)
 {
+case 24:
+type->alignment = size = sizeof(char);
+break;
 case 1:
 type->alignment = size = sizeof(char);
 break;
@@ -2567,6 +2748,9 @@ break;
 case 22:
 type->alignment = size = targetBits / 8;
 break;
+case 23:
+type->alignment = size = targetBits / 8;
+break;
 case 5:
 type->alignment = size = sizeof(long);
 break;
@@ -2620,7 +2804,7 @@ type->arraySizeExp->expType = (((void *)0));
 yylloc = type->arraySizeExp->loc;
 if(inCompiler)
 PrintExpression(type->arraySizeExp, expression);
-Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString(__thisModule, "Array size not constant int (%s)\n", (((void *)0))), expression);
+Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Array size not constant int (%s)\n", (((void *)0))), expression);
 yylloc = oldLoc;
 }
 GetInt(type->arraySizeExp, &type->arraySize);
@@ -2639,6 +2823,7 @@ else
 type->arraySize = 0;
 }
 size = ComputeTypeSize(type->type) * type->arraySize;
+if(type->type)
 type->alignment = type->type->alignment;
 break;
 case 9:
@@ -2687,14 +2872,17 @@ struct TemplateParameter * param = type->templateParameter;
 struct Type * baseType = ProcessTemplateParameterType(param);
 
 if(baseType)
+{
 size = ComputeTypeSize(baseType);
+type->alignment = baseType->alignment;
+}
 else
-size = sizeof(uint64);
+type->alignment = size = sizeof(uint64);
 break;
 }
 case 15:
 {
-size = sizeof(enum
+type->alignment = size = sizeof(enum
 {
 test
 });
@@ -2702,7 +2890,7 @@ break;
 }
 case 21:
 {
-size = targetBits / 8;
+type->alignment = size = targetBits / 8;
 break;
 }
 }
@@ -2738,7 +2926,7 @@ extern struct Declarator * MkDeclaratorArray(struct Declarator * declarator, str
 
 extern struct Expression * MkExpConstant(char *  string);
 
-int AddMembers(struct __ecereNameSpace__ecere__sys__OldList * declarations, struct __ecereNameSpace__ecere__com__Class * _class, unsigned int isMember, unsigned int * retSize, struct __ecereNameSpace__ecere__com__Class * topClass)
+int AddMembers(struct __ecereNameSpace__ecere__sys__OldList * declarations, struct __ecereNameSpace__ecere__com__Class * _class, unsigned int isMember, unsigned int * retSize, struct __ecereNameSpace__ecere__com__Class * topClass, unsigned int * addedPadding)
 {
 struct __ecereNameSpace__ecere__com__DataMember * topMember = isMember ? (struct __ecereNameSpace__ecere__com__DataMember *)_class : (((void *)0));
 unsigned int totalSize = 0;
@@ -2747,14 +2935,23 @@ int alignment, size;
 struct __ecereNameSpace__ecere__com__DataMember * member;
 struct Context * context = isMember ? (((void *)0)) : SetupTemplatesContext(_class);
 
+if(addedPadding)
+*addedPadding = 0x0;
 if(!isMember && _class->base)
 {
 maxSize = _class->structSize;
 {
 if(_class->type == 1 || _class->type == 5)
-AddMembers(declarations, _class->base, 0x0, &totalSize, topClass);
+AddMembers(declarations, _class->base, 0x0, &totalSize, topClass, (((void *)0)));
+else
+{
+unsigned int baseSize = _class->base->templateClass ? _class->base->templateClass->structSize : _class->base->structSize;
+
+if(maxSize > baseSize)
+maxSize -= baseSize;
 else
-maxSize -= _class->base->templateClass ? _class->base->templateClass->structSize : _class->base->structSize;
+maxSize = 0;
+}
 }
 }
 for(member = isMember ? topMember->members.first : _class->membersAndProperties.first; member; member = member->next)
@@ -2800,7 +2997,7 @@ case 2:
 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList(), * list = MkList();
 
 size = 0;
-AddMembers(list, (struct __ecereNameSpace__ecere__com__Class *)member, 0x1, &size, topClass);
+AddMembers(list, (struct __ecereNameSpace__ecere__com__Class *)member, 0x1, &size, topClass, (((void *)0)));
 ListAdd(specs, MkStructOrUnion((member->type == 1) ? 4 : 3, (((void *)0)), list));
 ListAdd(declarations, MkClassDefDeclaration(MkStructDeclaration(specs, (((void *)0)), (((void *)0)))));
 alignment = member->structAlignment;
@@ -2836,6 +3033,8 @@ char sizeString[50];
 
 sprintf(sizeString, "%d", maxSize - totalSize);
 ListAdd(declarations, MkClassDefDeclaration(MkStructDeclaration(MkListOne(MkSpecifier(CHAR)), MkListOne(MkDeclaratorArray(MkDeclaratorIdentifier(MkIdentifier("__ecere_padding")), MkExpConstant(sizeString))), (((void *)0)))));
+if(addedPadding)
+*addedPadding = 0x1;
 }
 }
 if(context)
@@ -2882,18 +3081,18 @@ return topMember ? topMember->memberID : _class->memberID;
 
 extern struct Symbol * FindClass(char *  name);
 
-extern char *  strchr(char * , int);
+extern char *  strchr(const char * , int);
 
 extern void FullClassNameCat(char *  output, char *  className, unsigned int includeTemplateParams);
 
-extern void FreeList(struct __ecereNameSpace__ecere__sys__OldList * list, void (* )(void * ));
+extern void FreeList(struct __ecereNameSpace__ecere__sys__OldList * list, void (*  FreeFunction)(void * ));
+
+extern void FreeClassDef(struct ClassDef * def);
 
 extern struct External * MkExternalDeclaration(struct Declaration * declaration);
 
 extern struct Declaration * MkDeclaration(struct __ecereNameSpace__ecere__sys__OldList * specifiers, struct __ecereNameSpace__ecere__sys__OldList * initDeclarators);
 
-extern char *  strcpy(char * , const char * );
-
 extern void MangleClassName(char *  className);
 
 extern void DeclareClass(struct Symbol * classSym, char *  className);
@@ -2908,15 +3107,16 @@ struct External * external = (((void *)0));
 struct Symbol * classSym = FindClass(name);
 
 if(!inCompiler || !classSym)
-return (((void *)0));
+return ;
 if(classSym->registered && (classSym->registered->type == 2 || classSym->registered->type == 3 || classSym->registered->type == 4))
-return (((void *)0));
+return ;
 if(classSym->registered && classSym->imported && !classSym->declaredStructSym)
 {
 struct Declaration * decl;
 struct __ecereNameSpace__ecere__sys__OldList * specifiers, * declarators;
 struct __ecereNameSpace__ecere__sys__OldList * declarations = (((void *)0));
 char structName[1024];
+struct Specifier * spec = (((void *)0));
 
 external = (classSym->registered && classSym->registered->type == 1) ? classSym->pointerExternal : classSym->structExternal;
 classSym->declaring++;
@@ -2927,27 +3127,38 @@ if(classSym->registered->templateClass)
 DeclareStruct(classSym->registered->templateClass->fullName, skipNoHead);
 classSym->declaring--;
 }
-return (((void *)0));
+return ;
 }
 DeclareMembers(classSym->registered, 0x0);
 structName[0] = (char)0;
 FullClassNameCat(structName, name, 0x0);
-if(!skipNoHead)
+if(external && external->declaration && external->declaration->specifiers)
+{
+for(spec = (*external->declaration->specifiers).first; spec; spec = spec->next)
+{
+if(spec->type == 3 || spec->type == 4)
+break;
+}
+}
+if(!skipNoHead && (!spec || !spec->definitions))
 {
+unsigned int addedPadding = 0x0;
+
 classSym->declaredStructSym = 0x1;
 declarations = MkList();
-AddMembers(declarations, classSym->registered, 0x0, (((void *)0)), classSym->registered);
-if(!(*declarations).count)
+AddMembers(declarations, classSym->registered, 0x0, (((void *)0)), classSym->registered, &addedPadding);
+if(!(*declarations).count || ((*declarations).count == 1 && addedPadding))
 {
-FreeList(declarations, (((void *)0)));
+FreeList(declarations, FreeClassDef);
 declarations = (((void *)0));
 }
 }
 if(skipNoHead || declarations)
 {
-if(external && external->declaration)
+if(spec)
 {
-((struct Specifier *)(*external->declaration->specifiers).first)->definitions = declarations;
+if(declarations)
+spec->definitions = declarations;
 if(curExternal && curExternal->symbol && curExternal->symbol->idCode < classSym->id)
 {
 if(classSym->structExternal)
@@ -3015,8 +3226,6 @@ classSym->declaring--;
 }
 }
 
-extern char *  strcat(char * , const char * );
-
 extern struct ModuleImport * FindModule(struct __ecereNameSpace__ecere__com__Instance * moduleToFind);
 
 extern struct ModuleImport * mainModule;
@@ -3049,7 +3258,6 @@ void __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(struct __ecereNameS
 
 void DeclareProperty(struct __ecereNameSpace__ecere__com__Property * prop, char * setName, char * getName)
 {
-void * __ecereTemp1;
 struct Symbol * symbol = prop->symbol;
 char propName[1024];
 
@@ -3092,16 +3300,24 @@ if(prop->_class->module)
 module = FindModule(prop->_class->module);
 else
 module = mainModule;
-classSym->_import = (__ecereTemp1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_ClassImport), ((struct ClassImport *)__ecereTemp1)->name = __ecereNameSpace__ecere__sys__CopyString(prop->_class->fullName), ((struct ClassImport *)__ecereTemp1)->isRemote = prop->_class->isRemote, ((struct ClassImport *)__ecereTemp1));
+classSym->_import = __extension__ ({
+struct ClassImport * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_ClassImport);
+
+__ecereInstance1->name = __ecereNameSpace__ecere__sys__CopyString(prop->_class->fullName), __ecereInstance1->isRemote = prop->_class->isRemote, __ecereInstance1;
+});
 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(&module->classes, classSym->_import);
 }
 symbol = prop->symbol = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Symbol);
-symbol->_import = (struct ClassImport *)(__ecereTemp1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_PropertyImport), ((struct PropertyImport *)__ecereTemp1)->name = __ecereNameSpace__ecere__sys__CopyString(prop->name), ((struct PropertyImport *)__ecereTemp1)->isVirtual = 0x0, ((struct PropertyImport *)__ecereTemp1)->hasSet = prop->Set ? 0x1 : 0x0, ((struct PropertyImport *)__ecereTemp1)->hasGet = prop->Get ? 0x1 : 0x0, ((struct PropertyImport *)__ecereTemp1));
+symbol->_import = (struct ClassImport *)__extension__ ({
+struct PropertyImport * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_PropertyImport);
+
+__ecereInstance1->name = __ecereNameSpace__ecere__sys__CopyString(prop->name), __ecereInstance1->isVirtual = 0x0, __ecereInstance1->hasSet = prop->Set ? 0x1 : 0x0, __ecereInstance1->hasGet = prop->Get ? 0x1 : 0x0, __ecereInstance1;
+});
 if(classSym)
 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(&classSym->_import->properties, symbol->_import);
 }
 imported = 0x1;
-if(prop->_class->module != privateModule && ((struct __ecereNameSpace__ecere__com__Module *)(((char *)prop->_class->module + 12)))->importType != 1)
+if((prop->_class->module != privateModule || !strcmp(prop->_class->name, "float") || !strcmp(prop->_class->name, "double")) && ((struct __ecereNameSpace__ecere__com__Module *)(((char *)prop->_class->module + 24)))->importType != 1)
 dllImport = 0x1;
 }
 if(!symbol->type)
@@ -3290,7 +3506,6 @@ symbol->id = curExternal->symbol->idCode;
 
 struct Type * Dereference(struct Type * source)
 {
-void * __ecereTemp1;
 struct Type * type = (((void *)0));
 
 if(source)
@@ -3302,7 +3517,11 @@ source->type->refCount++;
 }
 else if(source->kind == 8 && !strcmp(source->_class->string, "String"))
 {
-type = (__ecereTemp1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type), ((struct Type *)__ecereTemp1)->kind = 1, ((struct Type *)__ecereTemp1)->refCount = 1, ((struct Type *)__ecereTemp1));
+type = __extension__ ({
+struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
+
+__ecereInstance1->kind = 1, __ecereInstance1->refCount = 1, __ecereInstance1;
+});
 }
 else if(source->kind == 8 && source->_class && source->_class->registered && source->_class->registered->type == 5)
 {
@@ -3310,19 +3529,22 @@ type = source;
 source->refCount++;
 }
 else
-Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString(__thisModule, "cannot dereference type\n", (((void *)0))));
+Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "cannot dereference type\n", (((void *)0))));
 }
 return type;
 }
 
 static struct Type * Reference(struct Type * source)
 {
-void * __ecereTemp1;
 struct Type * type = (((void *)0));
 
 if(source)
 {
-type = (__ecereTemp1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type), ((struct Type *)__ecereTemp1)->kind = 13, ((struct Type *)__ecereTemp1)->type = source, ((struct Type *)__ecereTemp1)->refCount = 1, ((struct Type *)__ecereTemp1));
+type = __extension__ ({
+struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
+
+__ecereInstance1->kind = 13, __ecereInstance1->type = source, __ecereInstance1->refCount = 1, __ecereInstance1;
+});
 source->refCount++;
 }
 return type;
@@ -3330,7 +3552,7 @@ return type;
 
 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);
 
-extern void *  memcpy(void * , const void * , unsigned int size);
+extern void *  memcpy(void * , const void * , size_t size);
 
 void ProcessMethodType(struct __ecereNameSpace__ecere__com__Method * method);
 
@@ -3382,7 +3604,7 @@ if(curMember && thisMember->memberAccess == 1)
 {
 *curMember = thisMember;
 *curClass = thisMember->_class;
-memcpy(subMemberStack, _subMemberStack, sizeof(int) * _subMemberStackPos);
+memcpy(subMemberStack, _subMemberStack, sizeof(struct __ecereNameSpace__ecere__com__DataMember *) * _subMemberStackPos);
 *subMemberStackPos = _subMemberStackPos;
 }
 found = 0x1;
@@ -3560,6 +3782,7 @@ struct Expression * exp;
 char * string = PrintHexUInt64(arg.expression.ui64);
 
 exp = MkExpCast(MkTypeName(specs, decl), MkExpConstant(string));
+(__ecereNameSpace__ecere__com__eSystem_Delete(string), string = 0);
 ProcessExpressionType(exp);
 ComputeExpression(exp);
 expString[0] = '\0';
@@ -3632,12 +3855,12 @@ char expString[10240];
 expString[0] = '\0';
 PrintExpression(member->initializer->exp, expString);
 __ecereNameSpace__ecere__sys__ChangeCh(expString, '\n', ' ');
-Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString(__thisModule, "unresolved symbol used as an instance method %s\n", (((void *)0))), expString);
+Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "unresolved symbol used as an instance method %s\n", (((void *)0))), expString);
 }
 }
 else if(!MatchTypes(member->initializer->exp->expType, type, (((void *)0)), (((void *)0)), _class, 0x1, 0x1, 0x0, 0x0))
 {
-Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString(__thisModule, "incompatible instance method %s\n", (((void *)0))), ident->string);
+Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "incompatible instance method %s\n", (((void *)0))), ident->string);
 }
 }
 else if(member->initializer)
@@ -3669,17 +3892,17 @@ if(ident)
 {
 if(method)
 {
-Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString(__thisModule, "couldn't find virtual method %s in class %s\n", (((void *)0))), ident->string, _class->fullName);
+Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "couldn't find virtual method %s in class %s\n", (((void *)0))), ident->string, _class->fullName);
 }
 else if(_class)
 {
-Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString(__thisModule, "couldn't find member %s in class %s\n", (((void *)0))), ident->string, _class->fullName);
+Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "couldn't find member %s in class %s\n", (((void *)0))), ident->string, _class->fullName);
 if(inCompiler)
 __ecereNameSpace__ecere__com__eClass_AddDataMember(_class, ident->string, "int", 0, 0, 1);
 }
 }
 else if(_class)
-Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString(__thisModule, "too many initializers for instantiation of class %s\n", (((void *)0))), _class->fullName);
+Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "too many initializers for instantiation of class %s\n", (((void *)0))), _class->fullName);
 }
 }
 }
@@ -3692,7 +3915,7 @@ extern void FreeSpecifier(struct Specifier * spec);
 
 static void ProcessFunction(struct FunctionDefinition * function);
 
-extern struct __ecereNameSpace__ecere__sys__OldList *  CopyList(struct __ecereNameSpace__ecere__sys__OldList *  source, void *  (* )(void * ));
+extern struct __ecereNameSpace__ecere__sys__OldList *  CopyList(struct __ecereNameSpace__ecere__sys__OldList *  source, void *  (*  CopyFunction)(void * ));
 
 extern struct Specifier * CopySpecifier(struct Specifier * spec);
 
@@ -3785,7 +4008,7 @@ DeclareType(symbol->type, 0x1, 0x1);
 }
 else if(classSym)
 {
-Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString(__thisModule, "couldn't find virtual method %s in class %s\n", (((void *)0))), unmangled, classSym->string);
+Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "couldn't find virtual method %s in class %s\n", (((void *)0))), unmangled, classSym->string);
 }
 }
 createdExternal = ProcessClassFunction(classSym ? classSym->registered : (((void *)0)), members->function, ast, afterExternal, 0x1);
@@ -3951,7 +4174,6 @@ unsigned int __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Add(struct _
 
 struct Context * SetupTemplatesContext(struct __ecereNameSpace__ecere__com__Class * _class)
 {
-void * __ecereTemp1;
 struct Context * context = PushContext();
 
 context->templateTypesOnly = 0x1;
@@ -3986,9 +4208,17 @@ struct TemplatedType * type;
 
 if(!param)
 {
-p->param = param = (__ecereTemp1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_TemplateParameter), ((struct TemplateParameter *)__ecereTemp1)->identifier = MkIdentifier(p->name), ((struct TemplateParameter *)__ecereTemp1)->type = p->type, ((struct TemplateParameter *)__ecereTemp1)->dataTypeString = p->dataTypeString, ((struct TemplateParameter *)__ecereTemp1));
+p->param = param = __extension__ ({
+struct TemplateParameter * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_TemplateParameter);
+
+__ecereInstance1->identifier = MkIdentifier(p->name), __ecereInstance1->type = p->type, __ecereInstance1->dataTypeString = p->dataTypeString, __ecereInstance1;
+});
 }
-type = (__ecereTemp1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_TemplatedType), ((struct TemplatedType *)__ecereTemp1)->key = (uintptr_t)p->name, ((struct TemplatedType *)__ecereTemp1)->param = param, ((struct TemplatedType *)__ecereTemp1));
+type = __extension__ ({
+struct TemplatedType * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_TemplatedType);
+
+__ecereInstance1->key = (uintptr_t)p->name, __ecereInstance1->param = param, __ecereInstance1;
+});
 __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Add(&curContext->templateTypes, (struct __ecereNameSpace__ecere__sys__BTNode *)type);
 }
 }
@@ -4061,7 +4291,6 @@ void __ecereMethod___ecereNameSpace__ecere__sys__OldList_Remove(struct __ecereNa
 
 void DeclareMethod(struct __ecereNameSpace__ecere__com__Method * method, char * name)
 {
-void * __ecereTemp1;
 struct Symbol * symbol = method->symbol;
 
 if(!symbol || (!symbol->pointerExternal && method->type == 1) || symbol->id > (curExternal ? curExternal->symbol->idCode : -1))
@@ -4084,11 +4313,15 @@ if(!classSym->_import)
 {
 struct ModuleImport * module;
 
-if(method->_class->module && ((struct __ecereNameSpace__ecere__com__Module *)(((char *)method->_class->module + 12)))->name)
+if(method->_class->module && ((struct __ecereNameSpace__ecere__com__Module *)(((char *)method->_class->module + structSize_Instance)))->name)
 module = FindModule(method->_class->module);
 else
 module = mainModule;
-classSym->_import = (__ecereTemp1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_ClassImport), ((struct ClassImport *)__ecereTemp1)->name = __ecereNameSpace__ecere__sys__CopyString(method->_class->fullName), ((struct ClassImport *)__ecereTemp1)->isRemote = method->_class->isRemote, ((struct ClassImport *)__ecereTemp1));
+classSym->_import = __extension__ ({
+struct ClassImport * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_ClassImport);
+
+__ecereInstance1->name = __ecereNameSpace__ecere__sys__CopyString(method->_class->fullName), __ecereInstance1->isRemote = method->_class->isRemote, __ecereInstance1;
+});
 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(&module->classes, classSym->_import);
 }
 if(!symbol)
@@ -4097,7 +4330,11 @@ symbol = method->symbol = __ecereNameSpace__ecere__com__eInstance_New(__ecereCla
 }
 if(!symbol->_import)
 {
-symbol->_import = (struct ClassImport *)(__ecereTemp1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_MethodImport), ((struct MethodImport *)__ecereTemp1)->name = __ecereNameSpace__ecere__sys__CopyString(method->name), ((struct MethodImport *)__ecereTemp1)->isVirtual = method->type == 1, ((struct MethodImport *)__ecereTemp1));
+symbol->_import = (struct ClassImport *)__extension__ ({
+struct MethodImport * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_MethodImport);
+
+__ecereInstance1->name = __ecereNameSpace__ecere__sys__CopyString(method->name), __ecereInstance1->isVirtual = method->type == 1, __ecereInstance1;
+});
 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(&classSym->_import->methods, symbol->_import);
 }
 if(!symbol)
@@ -4110,7 +4347,7 @@ symbol->type->refCount++;
 if(!method->dataType->dllExport)
 {
 imported = 0x1;
-if(method->_class->module != privateModule && ((struct __ecereNameSpace__ecere__com__Module *)(((char *)method->_class->module + 12)))->importType != 1)
+if((method->_class->module != privateModule || !strcmp(method->_class->name, "float") || !strcmp(method->_class->name, "double")) && ((struct __ecereNameSpace__ecere__com__Module *)(((char *)method->_class->module + 24)))->importType != 1)
 dllImport = 0x1;
 }
 }
@@ -4350,7 +4587,6 @@ char *  name;
 
 unsigned int DeclareFunction(struct __ecereNameSpace__ecere__com__GlobalFunction * function, char * name)
 {
-void * __ecereTemp1;
 struct Symbol * symbol = function->symbol;
 
 if(curExternal && (!symbol || symbol->id > curExternal->symbol->idCode))
@@ -4375,7 +4611,11 @@ if(module->name)
 {
 if(!function->dataType->dllExport)
 {
-symbol->_import = (struct ClassImport *)(__ecereTemp1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_FunctionImport), ((struct FunctionImport *)__ecereTemp1)->name = __ecereNameSpace__ecere__sys__CopyString(function->name), ((struct FunctionImport *)__ecereTemp1));
+symbol->_import = (struct ClassImport *)__extension__ ({
+struct FunctionImport * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_FunctionImport);
+
+__ecereInstance1->name = __ecereNameSpace__ecere__sys__CopyString(function->name), __ecereInstance1;
+});
 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(&module->functions, symbol->_import);
 }
 }
@@ -4386,7 +4626,7 @@ symbol->type->staticMethod = 0x1;
 }
 }
 imported = symbol->_import ? 0x1 : 0x0;
-if(imported && function->module != privateModule && ((struct __ecereNameSpace__ecere__com__Module *)(((char *)function->module + 12)))->importType != 1)
+if(imported && function->module != privateModule && ((struct __ecereNameSpace__ecere__com__Module *)(((char *)function->module + structSize_Instance)))->importType != 1)
 dllImport = 0x1;
 }
 DeclareType(function->dataType, 0x1, 0x1);
@@ -4407,7 +4647,7 @@ d = MkDeclaratorIdentifier(MkIdentifier(imported ? name : function->name));
 if(dllImport)
 d = MkDeclaratorBrackets(MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), d));
 d = SpecDeclFromString(function->dataTypeString, specifiers, d);
-if(((struct __ecereNameSpace__ecere__com__Module *)(((char *)function->module + 12)))->importType == 1)
+if(((struct __ecereNameSpace__ecere__com__Module *)(((char *)function->module + structSize_Instance)))->importType == 1)
 {
 struct Specifier * spec;
 
@@ -4460,7 +4700,7 @@ if(curExternal)
 symbol->id = curExternal->symbol->idCode;
 }
 }
-return (symbol && symbol->_import && function->module != privateModule && ((struct __ecereNameSpace__ecere__com__Module *)(((char *)function->module + 12)))->importType != 1) ? 0x1 : 0x0;
+return (symbol && symbol->_import && function->module != privateModule && ((struct __ecereNameSpace__ecere__com__Module *)(((char *)function->module + structSize_Instance)))->importType != 1) ? 0x1 : 0x0;
 }
 
 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass_GlobalData;
@@ -4557,12 +4797,23 @@ struct Type * type = ProcessTemplateParameterType(dest->templateParameter);
 if(type)
 dest = type;
 }
-if((dest->classObjectType == 2 && source->classObjectType != 3) || (dest->classObjectType == 3 && source->classObjectType != 2))
+if(dest->classObjectType == 2)
+{
+if(source->classObjectType != 3)
+return 0x1;
+else
+{
+if((dest->_class && strcmp(dest->_class->string, "class")) || (source->_class && strcmp(source->_class->string, "class")))
 {
 return 0x1;
 }
-if(source->classObjectType == 3 && dest->classObjectType != 2)
+}
+}
+else
 {
+if(source->classObjectType == 3)
+return 0x1;
+if(dest->classObjectType == 3 && source->classObjectType != 2)
 return 0x1;
 }
 if((dest->kind == 9 && source->kind == 9) || (dest->kind == 10 && source->kind == 10))
@@ -4601,7 +4852,7 @@ else if(source->_class && dest->_class && (dest->classObjectType == source->clas
 return 0x1;
 else
 {
-if(enumBaseType && dest->_class && dest->_class->registered && dest->_class->registered->type == 4 && source->_class && source->_class->registered && source->_class->registered->type != 4)
+if(enumBaseType && dest->_class && dest->_class->registered && dest->_class->registered->type == 4 && ((source->_class && source->_class->registered && source->_class->registered->type != 4) || source->kind == 8))
 {
 if(__ecereNameSpace__ecere__com__eClass_IsDerived(dest->_class->registered, source->_class->registered))
 {
@@ -4630,7 +4881,7 @@ struct Conversion * after = (conversions != (((void *)0))) ? conversions->last :
 
 if(!convert->dataType)
 convert->dataType = ProcessTypeString(convert->dataTypeString, 0x0);
-if(MatchTypes(convert->dataType, dest, conversions, (((void *)0)), (((void *)0)), 0x0, 0x1, 0x0, 0x1))
+if((!isConversionExploration || convert->dataType->kind == 8 || !strcmp(_class->name, "String")) && MatchTypes(convert->dataType, dest, conversions, (((void *)0)), (((void *)0)), (convert->dataType->kind == 8 && !strcmp(convert->dataTypeString, "String")) ? 0x1 : 0x0, convert->dataType->kind == 8, 0x0, 0x1))
 {
 if(!conversions && !convert->Get)
 return 0x1;
@@ -4691,7 +4942,7 @@ if(!dest->_class->registered->dataType)
 dest->_class->registered->dataType = ProcessTypeString(dest->_class->registered->dataTypeString, 0x0);
 if(dest->_class->registered->dataType->kind == 8 || source->truth || dest->truth)
 {
-if(MatchTypes(source, dest->_class->registered->dataType, conversions, (((void *)0)), (((void *)0)), 0x1, 0x1, 0x0, 0x0))
+if(MatchTypes(source, dest->_class->registered->dataType, conversions, (((void *)0)), (((void *)0)), 0x1, dest->_class->registered->dataType->kind == 8, 0x0, 0x0))
 {
 return 0x1;
 }
@@ -4714,7 +4965,7 @@ struct Conversion * after = (conversions != (((void *)0))) ? conversions->last :
 
 if(!convert->dataType)
 convert->dataType = ProcessTypeString(convert->dataTypeString, 0x0);
-if(convert->dataType != source && MatchTypes(convert->dataType, dest, conversions, (((void *)0)), (((void *)0)), 0x1, 0x1, 0x0, 0x1))
+if(convert->dataType != source && (!isConversionExploration || convert->dataType->kind == 8 || !strcmp(_class->name, "String")) && MatchTypes(convert->dataType, dest, conversions, (((void *)0)), (((void *)0)), convert->dataType->kind == 8, convert->dataType->kind == 8, 0x0, 0x1))
 {
 if(!conversions && !convert->Get)
 return 0x1;
@@ -4738,8 +4989,11 @@ if(enumBaseType && source->_class && source->_class->registered && source->_clas
 {
 if(!source->_class->registered->dataType)
 source->_class->registered->dataType = ProcessTypeString(source->_class->registered->dataTypeString, 0x0);
-if(MatchTypes(source->_class->registered->dataType, dest, conversions, (((void *)0)), (((void *)0)), 0x1, 0x1, 0x0, 0x0))
+if(!isConversionExploration || source->_class->registered->dataType->kind == 8 || !strcmp(source->_class->registered->name, "String"))
 {
+if(MatchTypes(source->_class->registered->dataType, dest, conversions, (((void *)0)), (((void *)0)), source->_class->registered->dataType->kind == 8, source->_class->registered->dataType->kind == 8, 0x0, 0x0))
+return 0x1;
+else if(MatchTypes(dest, source->_class->registered->dataType, (((void *)0)), (((void *)0)), (((void *)0)), 0x0, 0x0, 0x0, 0x0))
 return 0x1;
 }
 }
@@ -4751,17 +5005,19 @@ else if(dest->kind == source->kind && (dest->kind != 9 && dest->kind != 10 && de
 return 0x1;
 else if(dest->kind == 7 && source->kind == 6)
 return 0x1;
-else if(dest->kind == 2 && source->kind == 1)
+else if(dest->kind == 2 && (source->kind == 1 || source->kind == 24))
 return 0x1;
-else if(dest->kind == 3 && (source->kind == 2 || source->kind == 1))
+else if(dest->kind == 3 && (source->kind == 2 || source->kind == 1 || source->kind == 24 || source->kind == 23))
 return 0x1;
-else if(dest->kind == 4 && (source->kind == 2 || source->kind == 1 || source->kind == 3))
+else if(dest->kind == 4 && (source->kind == 2 || source->kind == 1 || source->kind == 24 || source->kind == 3 || source->kind == 22 || source->kind == 23))
 return 0x1;
-else if(dest->kind == 22 && (source->kind == 2 || source->kind == 1 || source->kind == 3))
+else if(dest->kind == 22 && (source->kind == 2 || source->kind == 1 || source->kind == 24 || source->kind == 3 || source->kind == 23 || source->kind == 4))
 return 0x1;
-else if(source->kind == 15 && (dest->kind == 3 || dest->kind == 2 || dest->kind == 1 || dest->kind == 5 || dest->kind == 4 || dest->kind == 22))
+else if(dest->kind == 23 && (source->kind == 2 || source->kind == 1 || source->kind == 24 || source->kind == 3 || source->kind == 4 || source->kind == 22))
 return 0x1;
-else if(dest->kind == 15 && (source->kind == 3 || source->kind == 2 || source->kind == 1 || source->kind == 5 || source->kind == 4 || source->kind == 22))
+else if(source->kind == 15 && (dest->kind == 3 || dest->kind == 2 || dest->kind == 1 || source->kind == 24 || dest->kind == 5 || dest->kind == 4 || dest->kind == 22 || dest->kind == 23))
+return 0x1;
+else if(dest->kind == 15 && !isConversionExploration && (source->kind == 3 || source->kind == 2 || source->kind == 1 || source->kind == 24 || source->kind == 5 || source->kind == 4 || source->kind == 22 || source->kind == 23))
 return 0x1;
 else if((dest->kind == 11 || (dest->kind == 13 && dest->type->kind == 11) || dest->kind == 16) && ((source->kind == 11 || (source->kind == 13 && source->type->kind == 11) || source->kind == 16)))
 {
@@ -4790,9 +5046,9 @@ if((dest->staticMethod || (!dest->thisClass && !owningClassDest)) && !(source->s
 if(!paramDest || (!(paramDest->kind == 13 && paramDest->type && paramDest->type->kind == 0) && (paramDest->kind != 8 || !__ecereNameSpace__ecere__com__eClass_IsDerived(source->thisClass ? source->thisClass->registered : owningClassSource, paramDest->_class->registered))))
 {
 if(paramDest && paramDest->kind == 8)
-Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString(__thisModule, "method class must be derived from %s\n", (((void *)0))), paramDest->_class->string);
+Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "method class must be derived from %s\n", (((void *)0))), paramDest->_class->string);
 else
-Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString(__thisModule, "method class should not take an object\n", (((void *)0))));
+Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "method class should not take an object\n", (((void *)0))));
 return 0x0;
 }
 paramDest = paramDest->next;
@@ -4805,7 +5061,7 @@ if(dest->thisClass)
 {
 if(!paramSource || paramSource->kind != 8 || !__ecereNameSpace__ecere__com__eClass_IsDerived(paramSource->_class->registered, dest->thisClass->registered))
 {
-Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString(__thisModule, "method class must be derived from %s\n", (((void *)0))), dest->thisClass->string);
+Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "method class must be derived from %s\n", (((void *)0))), dest->thisClass->string);
 return 0x0;
 }
 }
@@ -4814,9 +5070,9 @@ else
 if(!paramSource || paramSource->kind != 8 || (owningClassDest && !__ecereNameSpace__ecere__com__eClass_IsDerived(paramSource->_class->registered, owningClassDest)))
 {
 if(owningClassDest)
-Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString(__thisModule, "%s expected to be derived from method class\n", (((void *)0))), owningClassDest->fullName);
+Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "%s expected to be derived from method class\n", (((void *)0))), owningClassDest->fullName);
 else
-Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString(__thisModule, "overriding class expected to be derived from method class\n", (((void *)0))));
+Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "overriding class expected to be derived from method class\n", (((void *)0))));
 return 0x0;
 }
 }
@@ -4828,7 +5084,7 @@ if(dest->thisClass)
 {
 if(!__ecereNameSpace__ecere__com__eClass_IsDerived(source->thisClass ? source->thisClass->registered : owningClassSource, dest->thisClass->registered))
 {
-Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString(__thisModule, "method class must be derived from %s\n", (((void *)0))), dest->thisClass->string);
+Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "method class must be derived from %s\n", (((void *)0))), dest->thisClass->string);
 return 0x0;
 }
 }
@@ -4836,7 +5092,7 @@ else
 {
 if(source->thisClass && source->thisClass->registered && owningClassDest && !__ecereNameSpace__ecere__com__eClass_IsDerived(source->thisClass->registered, owningClassDest))
 {
-Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString(__thisModule, "%s expected to be derived from method class\n", (((void *)0))), source->thisClass->registered->fullName);
+Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "%s expected to be derived from method class\n", (((void *)0))), source->thisClass->registered->fullName);
 return 0x0;
 }
 }
@@ -4844,14 +5100,14 @@ return 0x0;
 }
 if(!MatchTypes(source->returnType, dest->returnType, (((void *)0)), (((void *)0)), (((void *)0)), 0x1, 0x1, 0x0, 0x0))
 {
-Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString(__thisModule, "incompatible return type for function\n", (((void *)0))));
+Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "incompatible return type for function\n", (((void *)0))));
 return 0x0;
 }
 for(; paramDest; paramDest = paramDest->next)
 {
 if(!paramSource)
 {
-Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString(__thisModule, "not enough parameters\n", (((void *)0))));
+Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "not enough parameters\n", (((void *)0))));
 return 0x0;
 }
 {
@@ -4900,7 +5156,7 @@ char type[1024];
 
 type[0] = (char)0;
 PrintType(paramDest, type, 0x0, 0x1);
-Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString(__thisModule, "incompatible parameter %s (expected %s)\n", (((void *)0))), paramSource->name, type);
+Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "incompatible parameter %s (expected %s)\n", (((void *)0))), paramSource->name, type);
 if(paramDestType != paramDest)
 FreeType(paramDestType);
 return 0x0;
@@ -4912,7 +5168,7 @@ paramSource = paramSource->next;
 }
 if(paramSource)
 {
-Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString(__thisModule, "too many parameters\n", (((void *)0))));
+Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "too many parameters\n", (((void *)0))));
 return 0x0;
 }
 return 0x1;
@@ -5027,9 +5283,9 @@ char constant[256];
 
 sourceExp->type = 2;
 if(!strcmp(baseClass->dataTypeString, "int"))
-sprintf(constant, "%d", value->data);
+sprintf(constant, "%d", (int)value->data);
 else
-sprintf(constant, "0x%X", value->data);
+sprintf(constant, "0x%X", (int)value->data);
 sourceExp->constant = __ecereNameSpace__ecere__sys__CopyString(constant);
 }
 while(converts.first)
@@ -5072,9 +5328,9 @@ struct __ecereNameSpace__ecere__com__SubModule * subModule;
 
 if(searchFor == searchIn)
 return 0x1;
-for(subModule = ((struct __ecereNameSpace__ecere__com__Module *)(((char *)searchIn + 12)))->modules.first; subModule; subModule = subModule->next)
+for(subModule = ((struct __ecereNameSpace__ecere__com__Module *)(((char *)searchIn + structSize_Instance)))->modules.first; subModule; subModule = subModule->next)
 {
-if(subModule->importMode == 1 || searchIn == ((struct __ecereNameSpace__ecere__com__Module *)(((char *)searchIn + 12)))->application)
+if(subModule->importMode == 1 || searchIn == ((struct __ecereNameSpace__ecere__com__Module *)(((char *)searchIn + structSize_Instance)))->application)
 {
 if(ModuleVisibility(subModule->module, searchFor))
 return 0x1;
@@ -5100,20 +5356,22 @@ unsigned int MatchWithEnums_Module(struct __ecereNameSpace__ecere__com__Instance
 {
 struct __ecereNameSpace__ecere__com__Instance * module;
 
-if(MatchWithEnums_NameSpace(&((struct __ecereNameSpace__ecere__com__Application *)(((char *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)mainModule + 12)))->application + 300)))->systemNameSpace, sourceExp, dest, string, conversions))
+if(MatchWithEnums_NameSpace(&((struct __ecereNameSpace__ecere__com__Application *)(((char *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)mainModule + structSize_Instance)))->application + structSize_Module)))->systemNameSpace, sourceExp, dest, string, conversions))
 return 0x1;
-if(MatchWithEnums_NameSpace(&((struct __ecereNameSpace__ecere__com__Module *)(((char *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)mainModule + 12)))->application + 12)))->privateNameSpace, sourceExp, dest, string, conversions))
+if(MatchWithEnums_NameSpace(&((struct __ecereNameSpace__ecere__com__Module *)(((char *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)mainModule + structSize_Instance)))->application + structSize_Instance)))->privateNameSpace, sourceExp, dest, string, conversions))
 return 0x1;
-if(MatchWithEnums_NameSpace(&((struct __ecereNameSpace__ecere__com__Module *)(((char *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)mainModule + 12)))->application + 12)))->publicNameSpace, sourceExp, dest, string, conversions))
+if(MatchWithEnums_NameSpace(&((struct __ecereNameSpace__ecere__com__Module *)(((char *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)mainModule + structSize_Instance)))->application + structSize_Instance)))->publicNameSpace, sourceExp, dest, string, conversions))
 return 0x1;
-for(module = ((struct __ecereNameSpace__ecere__com__Application *)(((char *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)mainModule + 12)))->application + 300)))->allModules.first; module; module = ((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + 12)))->next)
+for(module = ((struct __ecereNameSpace__ecere__com__Application *)(((char *)((struct __ecereNameSpace__ecere__com__Module *)(((char *)mainModule + structSize_Instance)))->application + structSize_Module)))->allModules.first; module; module = ((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + structSize_Instance)))->next)
 {
-if(ModuleVisibility(mainModule, module) && MatchWithEnums_NameSpace(&((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + 12)))->publicNameSpace, sourceExp, dest, string, conversions))
+if(ModuleVisibility(mainModule, module) && MatchWithEnums_NameSpace(&((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + structSize_Instance)))->publicNameSpace, sourceExp, dest, string, conversions))
 return 0x1;
 }
 return 0x0;
 }
 
+extern struct Expression * CopyExpression(struct Expression * exp);
+
 extern unsigned long strtoul(const char *  nptr, char * *  endptr, int base);
 
 void ReadString(char *  output, char *  string);
@@ -5126,12 +5384,28 @@ extern struct Expression * MkExpBrackets(struct __ecereNameSpace__ecere__sys__Ol
 
 unsigned int MatchTypeExpression(struct Expression * sourceExp, struct Type * dest, struct __ecereNameSpace__ecere__sys__OldList * conversions, unsigned int skipUnitBla)
 {
-void * __ecereTemp1;
-struct Type * source = sourceExp->expType;
+struct Type * source;
 struct Type * realDest = dest;
+struct Type * backupSourceExpType = (((void *)0));
+struct Expression * computedExp = sourceExp;
 
+dest->refCount++;
+if(sourceExp->isConstant && sourceExp->type != 2 && sourceExp->type != 0 && sourceExp->type != 11 && dest->kind == 8 && dest->_class && dest->_class->registered && dest->_class->registered->type == 4)
+{
+computedExp = CopyExpression(sourceExp);
+ComputeExpression(computedExp);
+}
+source = sourceExp->expType;
 if(dest->kind == 13 && sourceExp->type == 2 && !strtoul(sourceExp->constant, (((void *)0)), 0))
+{
+if(computedExp != sourceExp)
+{
+FreeExpression(computedExp);
+computedExp = sourceExp;
+}
+FreeType(dest);
 return 0x1;
+}
 if(!skipUnitBla && source && dest && source->kind == 8 && dest->kind == 8)
 {
 if(source->_class && source->_class->registered && source->_class->registered->type == 3)
@@ -5143,8 +5417,16 @@ for(sourceBase = source->_class->registered; sourceBase && sourceBase->base && s
 for(destBase = dest->_class->registered; destBase && destBase->base && destBase->base->type != 1000; destBase = destBase->base)
 ;
 if(sourceBase == destBase)
-return 0x1;
-}
+{
+if(computedExp != sourceExp)
+{
+FreeExpression(computedExp);
+computedExp = sourceExp;
+}
+FreeType(dest);
+return 0x1;
+}
+}
 }
 if(source)
 {
@@ -5153,25 +5435,33 @@ unsigned int flag = 0x0;
 long long value = (((int)0x7fffffff));
 
 source->refCount++;
-dest->refCount++;
-if(sourceExp->type == 2)
+if(computedExp->type == 2)
 {
 if(source->isSigned)
-value = strtoll(sourceExp->constant, (((void *)0)), 0);
+value = strtoll(computedExp->constant, (((void *)0)), 0);
 else
-value = strtoull(sourceExp->constant, (((void *)0)), 0);
+value = strtoull(computedExp->constant, (((void *)0)), 0);
 }
-else if(sourceExp->type == 4 && sourceExp->op.op == '-' && !sourceExp->op.exp1 && sourceExp->op.exp2 && sourceExp->op.exp2->type == 2)
+else if(computedExp->type == 4 && sourceExp->op.op == '-' && !computedExp->op.exp1 && computedExp->op.exp2 && computedExp->op.exp2->type == 2)
 {
 if(source->isSigned)
-value = -strtoll(sourceExp->op.exp2->constant, (((void *)0)), 0);
+value = -strtoll(computedExp->op.exp2->constant, (((void *)0)), 0);
 else
-value = -strtoull(sourceExp->op.exp2->constant, (((void *)0)), 0);
+value = -strtoull(computedExp->op.exp2->constant, (((void *)0)), 0);
+}
+if(computedExp != sourceExp)
+{
+FreeExpression(computedExp);
+computedExp = sourceExp;
 }
 if(dest->kind != 8 && source->kind == 8 && source->_class && source->_class->registered && !strcmp(source->_class->registered->fullName, "ecere::com::unichar"))
 {
 FreeType(source);
-source = (__ecereTemp1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type), ((struct Type *)__ecereTemp1)->kind = 3, ((struct Type *)__ecereTemp1)->isSigned = 0x0, ((struct Type *)__ecereTemp1)->refCount = 1, ((struct Type *)__ecereTemp1));
+source = __extension__ ({
+struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
+
+__ecereInstance1->kind = 3, __ecereInstance1->isSigned = 0x0, __ecereInstance1->refCount = 1, __ecereInstance1;
+});
 }
 if(dest->kind == 8)
 {
@@ -5195,7 +5485,7 @@ tempType->_class = _class->symbol;
 tempType->truth = dest->truth;
 if(tempType->_class)
 MatchTypes(tempSource, tempDest, conversions, (((void *)0)), (((void *)0)), 0x1, 0x1, 0x0, 0x0);
-FreeType(sourceExp->expType);
+backupSourceExpType = sourceExp->expType;
 sourceExp->expType = dest;
 dest->refCount++;
 flag = 0x1;
@@ -5224,13 +5514,15 @@ ReadString(string, sourceExp->string);
 decl = SpecDeclFromString(string, specs, (((void *)0)));
 FreeExpContents(sourceExp);
 FreeType(sourceExp->expType);
-sourceExp->type = 26;
+sourceExp->type = 24;
 sourceExp->_classExp.specifiers = specs;
 sourceExp->_classExp.decl = decl;
 sourceExp->expType = dest;
 dest->refCount++;
 FreeType(source);
 FreeType(dest);
+if(backupSourceExpType)
+FreeType(backupSourceExpType);
 return 0x1;
 }
 }
@@ -5238,7 +5530,7 @@ else if(source->kind == 8)
 {
 struct __ecereNameSpace__ecere__com__Class * _class = source->_class ? source->_class->registered : (((void *)0));
 
-if(_class && (_class->type == 3 || !strcmp(_class->fullName, "bool") || _class->type == 2))
+if(_class && (_class->type == 3 || _class->type == 2))
 {
 if(dest->kind != 8)
 {
@@ -5298,8 +5590,17 @@ return 0x1;
 if(dest->kind == 8)
 {
 struct __ecereNameSpace__ecere__com__Class * _class = dest->_class ? dest->_class->registered : (((void *)0));
+unsigned int fittingValue = 0x0;
+
+if(_class && _class->type == 4)
+{
+struct __ecereNameSpace__ecere__com__Class * enumClass = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "enum");
+struct __ecereNameSpace__ecere__com__EnumClassData * c = (_class ? ((void *)(((char *)_class->data) + enumClass->offsetClass)) : (((void *)0)));
 
-if(_class && !dest->truth && (_class->type == 3 || !strcmp(_class->fullName, "bool") || (_class->type != 1 && !value && source->kind == 3) || _class->type == 2))
+if(c && value >= 0 && value <= c->largest)
+fittingValue = 0x1;
+}
+if(_class && !dest->truth && (_class->type == 3 || fittingValue || (_class->type != 1 && !value && source->kind == 3) || _class->type == 2))
 {
 if(_class->type == 0 || _class->type == 5)
 {
@@ -5324,6 +5625,8 @@ sourceExp->expType = dest;
 FreeType(source);
 if(inCompiler)
 FreeType(dest);
+if(backupSourceExpType)
+FreeType(backupSourceExpType);
 return 0x1;
 }
 if(!_class->dataType)
@@ -5332,36 +5635,36 @@ FreeType(dest);
 dest = _class->dataType;
 dest->refCount++;
 }
-if(dest->kind == 7 && (source->kind == 7 || source->kind == 6 || dest->kind == 4 || source->kind == 3 || source->kind == 2 || source->kind == 1))
+if(dest->kind == 7 && (source->kind == 7 || source->kind == 6 || dest->kind == 4 || source->kind == 3 || source->kind == 2 || source->kind == 1 || source->kind == 24))
 {
 specs = MkListOne(MkSpecifier(DOUBLE));
 }
-else if(dest->kind == 6 && (source->kind == 6 || dest->kind == 4 || source->kind == 3 || source->kind == 2 || source->kind == 1 || source->kind == 7))
+else if(dest->kind == 6 && (source->kind == 6 || dest->kind == 4 || source->kind == 3 || source->kind == 2 || source->kind == 1 || source->kind == 24 || source->kind == 7))
 {
 specs = MkListOne(MkSpecifier(FLOAT));
 }
-else if(dest->kind == 4 && (source->kind == 4 || source->kind == 3 || source->kind == 2 || source->kind == 1 || source->kind == 6 || source->kind == 7))
+else if(dest->kind == 4 && (source->kind == 4 || source->kind == 3 || source->kind == 2 || source->kind == 1 || source->kind == 24 || source->kind == 6 || source->kind == 7))
 {
 specs = MkList();
 if(!dest->isSigned)
 ListAdd(specs, MkSpecifier(UNSIGNED));
 ListAdd(specs, MkSpecifier(INT64));
 }
-else if(dest->kind == 3 && (source->kind == 3 || source->kind == 2 || source->kind == 1 || source->kind == 6 || source->kind == 7))
+else if(dest->kind == 3 && (source->kind == 3 || source->kind == 2 || source->kind == 1 || source->kind == 24 || source->kind == 6 || source->kind == 7))
 {
 specs = MkList();
 if(!dest->isSigned)
 ListAdd(specs, MkSpecifier(UNSIGNED));
 ListAdd(specs, MkSpecifier(INT));
 }
-else if(dest->kind == 2 && (source->kind == 2 || source->kind == 1 || source->kind == 3 || source->kind == 6 || source->kind == 7))
+else if(dest->kind == 2 && (source->kind == 2 || source->kind == 1 || source->kind == 24 || source->kind == 3 || source->kind == 6 || source->kind == 7))
 {
 specs = MkList();
 if(!dest->isSigned)
 ListAdd(specs, MkSpecifier(UNSIGNED));
 ListAdd(specs, MkSpecifier(SHORT));
 }
-else if(dest->kind == 1 && (source->kind == 1 || source->kind == 2 || source->kind == 3 || source->kind == 6 || source->kind == 7))
+else if(dest->kind == 1 && (source->kind == 1 || source->kind == 24 || source->kind == 2 || source->kind == 3 || source->kind == 6 || source->kind == 7))
 {
 specs = MkList();
 if(!dest->isSigned)
@@ -5372,46 +5675,57 @@ else
 {
 FreeType(source);
 FreeType(dest);
+if(backupSourceExpType)
+{
+if(sourceExp->expType)
+FreeType(sourceExp->expType);
+sourceExp->expType = backupSourceExpType;
+}
 return 0x0;
 }
 }
-else if(dest->kind == 7 && (source->kind == 7 || source->kind == 6 || source->kind == 4 || source->kind == 3 || source->kind == 15 || source->kind == 2 || source->kind == 1))
+else if(dest->kind == 7 && (source->kind == 7 || source->kind == 6 || source->kind == 4 || source->kind == 3 || source->kind == 15 || source->kind == 2 || source->kind == 24 || source->kind == 1))
 {
 specs = MkListOne(MkSpecifier(DOUBLE));
 }
-else if(dest->kind == 6 && (source->kind == 6 || source->kind == 15 || source->kind == 4 || source->kind == 3 || source->kind == 2 || source->kind == 1))
+else if(dest->kind == 6 && (source->kind == 6 || source->kind == 15 || source->kind == 4 || source->kind == 3 || source->kind == 2 || source->kind == 24 || source->kind == 1))
 {
 specs = MkListOne(MkSpecifier(FLOAT));
 }
-else if(dest->kind == 1 && (source->kind == 1 || source->kind == 15 || source->kind == 2 || source->kind == 3) && (dest->isSigned ? (value >= -128 && value <= 127) : (value >= 0 && value <= 255)))
+else if(dest->kind == 24 && (source->kind == 24 || source->kind == 1 || source->kind == 15 || source->kind == 2 || source->kind == 3) && (value == 1 || value == 0))
+{
+specs = MkList();
+ListAdd(specs, MkSpecifier(BOOL));
+}
+else if(dest->kind == 1 && (source->kind == 24 || source->kind == 1 || source->kind == 15 || source->kind == 2 || source->kind == 3) && (dest->isSigned ? (value >= -128 && value <= 127) : (value >= 0 && value <= 255)))
 {
 specs = MkList();
 if(!dest->isSigned)
 ListAdd(specs, MkSpecifier(UNSIGNED));
 ListAdd(specs, MkSpecifier(CHAR));
 }
-else if(dest->kind == 2 && (source->kind == 15 || source->kind == 1 || source->kind == 2 || (source->kind == 3 && (dest->isSigned ? (value >= -32768 && value <= 32767) : (value >= 0 && value <= 65535)))))
+else if(dest->kind == 2 && (source->kind == 15 || source->kind == 24 || source->kind == 1 || source->kind == 2 || (source->kind == 3 && (dest->isSigned ? (value >= -32768 && value <= 32767) : (value >= 0 && value <= 65535)))))
 {
 specs = MkList();
 if(!dest->isSigned)
 ListAdd(specs, MkSpecifier(UNSIGNED));
 ListAdd(specs, MkSpecifier(SHORT));
 }
-else if(dest->kind == 3 && (source->kind == 15 || source->kind == 2 || source->kind == 1 || source->kind == 3))
+else if(dest->kind == 3 && (source->kind == 15 || source->kind == 2 || source->kind == 24 || source->kind == 1 || source->kind == 3))
 {
 specs = MkList();
 if(!dest->isSigned)
 ListAdd(specs, MkSpecifier(UNSIGNED));
 ListAdd(specs, MkSpecifier(INT));
 }
-else if(dest->kind == 4 && (source->kind == 15 || source->kind == 2 || source->kind == 1 || source->kind == 3 || source->kind == 4))
+else if(dest->kind == 4 && (source->kind == 15 || source->kind == 2 || source->kind == 24 || source->kind == 1 || source->kind == 3 || source->kind == 4))
 {
 specs = MkList();
 if(!dest->isSigned)
 ListAdd(specs, MkSpecifier(UNSIGNED));
 ListAdd(specs, MkSpecifier(INT64));
 }
-else if(dest->kind == 15 && (source->kind == 4 || source->kind == 3 || source->kind == 2 || source->kind == 1))
+else if(dest->kind == 15 && (source->kind == 4 || source->kind == 3 || source->kind == 2 || source->kind == 24 || source->kind == 1))
 {
 specs = MkListOne(MkEnum(MkIdentifier(dest->enumName), (((void *)0))));
 }
@@ -5419,9 +5733,15 @@ else
 {
 FreeType(source);
 FreeType(dest);
+if(backupSourceExpType)
+{
+if(sourceExp->expType)
+FreeType(sourceExp->expType);
+sourceExp->expType = backupSourceExpType;
+}
 return 0x0;
 }
-if(!flag)
+if(!flag && !sourceExp->opDestType)
 {
 struct Expression * newExp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression);
 
@@ -5454,11 +5774,18 @@ else
 FreeList(specs, FreeSpecifier);
 FreeType(dest);
 FreeType(source);
+if(backupSourceExpType)
+FreeType(backupSourceExpType);
 return 0x1;
 }
 else
 {
-while((sourceExp->type == 5 || sourceExp->type == 34) && sourceExp->list)
+if(computedExp != sourceExp)
+{
+FreeExpression(computedExp);
+computedExp = sourceExp;
+}
+while((sourceExp->type == 5 || sourceExp->type == 32) && sourceExp->list)
 sourceExp = (*sourceExp->list).last;
 if(sourceExp->type == 0)
 {
@@ -5494,11 +5821,12 @@ char constant[256];
 
 sourceExp->type = 2;
 if(_class->dataTypeString && !strcmp(_class->dataTypeString, "int"))
-sprintf(constant, "%d", value->data);
+sprintf(constant, "%d", (int)value->data);
 else
-sprintf(constant, "0x%X", value->data);
+sprintf(constant, "0x%X", (int)value->data);
 sourceExp->constant = __ecereNameSpace__ecere__sys__CopyString(constant);
 }
+FreeType(dest);
 return 0x1;
 }
 }
@@ -5506,9 +5834,13 @@ return 0x1;
 }
 }
 if(dest->classObjectType != 2 && dest->kind == 8 && MatchWithEnums_Module(privateModule, sourceExp, dest, id->string, conversions))
+{
+FreeType(dest);
 return 0x1;
 }
 }
+FreeType(dest);
+}
 return 0x0;
 }
 
@@ -5517,7 +5849,7 @@ static unsigned int IntAdd(struct Expression * exp, struct Operand * op1, struct
 int value2 = op2->i;
 
 exp->type = 2;
-exp->string = PrintInt(op1->i + value2);
+exp->string = PrintInt((op1->i + value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -5532,7 +5864,37 @@ static unsigned int UIntAdd(struct Expression * exp, struct Operand * op1, struc
 unsigned int value2 = op2->ui;
 
 exp->type = 2;
-exp->string = PrintUInt(op1->ui + value2);
+exp->string = PrintUInt((op1->ui + value2));
+if(!exp->expType)
+{
+exp->expType = op1->type;
+if(op1->type)
+op1->type->refCount++;
+}
+return 0x1;
+}
+
+static unsigned int Int64Add(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+{
+long long value2 = op2->i64;
+
+exp->type = 2;
+exp->string = PrintInt64((op1->i64 + value2));
+if(!exp->expType)
+{
+exp->expType = op1->type;
+if(op1->type)
+op1->type->refCount++;
+}
+return 0x1;
+}
+
+static unsigned int UInt64Add(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+{
+uint64 value2 = op2->ui64;
+
+exp->type = 2;
+exp->string = PrintUInt64((op1->ui64 + value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -5547,7 +5909,7 @@ static unsigned int ShortAdd(struct Expression * exp, struct Operand * op1, stru
 short value2 = op2->s;
 
 exp->type = 2;
-exp->string = PrintShort(op1->s + value2);
+exp->string = PrintShort((op1->s + value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -5562,7 +5924,7 @@ static unsigned int UShortAdd(struct Expression * exp, struct Operand * op1, str
 unsigned short value2 = op2->us;
 
 exp->type = 2;
-exp->string = PrintUShort(op1->us + value2);
+exp->string = PrintUShort((op1->us + value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -5577,7 +5939,7 @@ static unsigned int CharAdd(struct Expression * exp, struct Operand * op1, struc
 char value2 = op2->c;
 
 exp->type = 2;
-exp->string = PrintChar(op1->c + value2);
+exp->string = PrintChar((op1->c + value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -5592,7 +5954,7 @@ static unsigned int UCharAdd(struct Expression * exp, struct Operand * op1, stru
 unsigned char value2 = op2->uc;
 
 exp->type = 2;
-exp->string = PrintUChar(op1->uc + value2);
+exp->string = PrintUChar((op1->uc + value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -5607,7 +5969,7 @@ static unsigned int FloatAdd(struct Expression * exp, struct Operand * op1, stru
 float value2 = op2->f;
 
 exp->type = 2;
-exp->string = PrintFloat(op1->f + value2);
+exp->string = PrintFloat((float)(op1->f + value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -5622,7 +5984,7 @@ static unsigned int DoubleAdd(struct Expression * exp, struct Operand * op1, str
 double value2 = op2->d;
 
 exp->type = 2;
-exp->string = PrintDouble(op1->d + value2);
+exp->string = PrintDouble((double)(op1->d + value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -5637,7 +5999,7 @@ static unsigned int IntSub(struct Expression * exp, struct Operand * op1, struct
 int value2 = op2->i;
 
 exp->type = 2;
-exp->string = PrintInt(op1->i - value2);
+exp->string = PrintInt((op1->i - value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -5652,7 +6014,37 @@ static unsigned int UIntSub(struct Expression * exp, struct Operand * op1, struc
 unsigned int value2 = op2->ui;
 
 exp->type = 2;
-exp->string = PrintUInt(op1->ui - value2);
+exp->string = PrintUInt((op1->ui - value2));
+if(!exp->expType)
+{
+exp->expType = op1->type;
+if(op1->type)
+op1->type->refCount++;
+}
+return 0x1;
+}
+
+static unsigned int Int64Sub(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+{
+long long value2 = op2->i64;
+
+exp->type = 2;
+exp->string = PrintInt64((op1->i64 - value2));
+if(!exp->expType)
+{
+exp->expType = op1->type;
+if(op1->type)
+op1->type->refCount++;
+}
+return 0x1;
+}
+
+static unsigned int UInt64Sub(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+{
+uint64 value2 = op2->ui64;
+
+exp->type = 2;
+exp->string = PrintUInt64((op1->ui64 - value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -5667,7 +6059,7 @@ static unsigned int ShortSub(struct Expression * exp, struct Operand * op1, stru
 short value2 = op2->s;
 
 exp->type = 2;
-exp->string = PrintShort(op1->s - value2);
+exp->string = PrintShort((op1->s - value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -5682,7 +6074,7 @@ static unsigned int UShortSub(struct Expression * exp, struct Operand * op1, str
 unsigned short value2 = op2->us;
 
 exp->type = 2;
-exp->string = PrintUShort(op1->us - value2);
+exp->string = PrintUShort((op1->us - value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -5697,7 +6089,7 @@ static unsigned int CharSub(struct Expression * exp, struct Operand * op1, struc
 char value2 = op2->c;
 
 exp->type = 2;
-exp->string = PrintChar(op1->c - value2);
+exp->string = PrintChar((op1->c - value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -5712,7 +6104,7 @@ static unsigned int UCharSub(struct Expression * exp, struct Operand * op1, stru
 unsigned char value2 = op2->uc;
 
 exp->type = 2;
-exp->string = PrintUChar(op1->uc - value2);
+exp->string = PrintUChar((op1->uc - value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -5727,7 +6119,7 @@ static unsigned int FloatSub(struct Expression * exp, struct Operand * op1, stru
 float value2 = op2->f;
 
 exp->type = 2;
-exp->string = PrintFloat(op1->f - value2);
+exp->string = PrintFloat((float)(op1->f - value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -5742,7 +6134,7 @@ static unsigned int DoubleSub(struct Expression * exp, struct Operand * op1, str
 double value2 = op2->d;
 
 exp->type = 2;
-exp->string = PrintDouble(op1->d - value2);
+exp->string = PrintDouble((double)(op1->d - value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -5757,7 +6149,7 @@ static unsigned int IntMul(struct Expression * exp, struct Operand * op1, struct
 int value2 = op2->i;
 
 exp->type = 2;
-exp->string = PrintInt(op1->i * value2);
+exp->string = PrintInt((op1->i * value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -5772,7 +6164,37 @@ static unsigned int UIntMul(struct Expression * exp, struct Operand * op1, struc
 unsigned int value2 = op2->ui;
 
 exp->type = 2;
-exp->string = PrintUInt(op1->ui * value2);
+exp->string = PrintUInt((op1->ui * value2));
+if(!exp->expType)
+{
+exp->expType = op1->type;
+if(op1->type)
+op1->type->refCount++;
+}
+return 0x1;
+}
+
+static unsigned int Int64Mul(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+{
+long long value2 = op2->i64;
+
+exp->type = 2;
+exp->string = PrintInt64((op1->i64 * value2));
+if(!exp->expType)
+{
+exp->expType = op1->type;
+if(op1->type)
+op1->type->refCount++;
+}
+return 0x1;
+}
+
+static unsigned int UInt64Mul(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+{
+uint64 value2 = op2->ui64;
+
+exp->type = 2;
+exp->string = PrintUInt64((op1->ui64 * value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -5787,7 +6209,7 @@ static unsigned int ShortMul(struct Expression * exp, struct Operand * op1, stru
 short value2 = op2->s;
 
 exp->type = 2;
-exp->string = PrintShort(op1->s * value2);
+exp->string = PrintShort((op1->s * value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -5802,7 +6224,7 @@ static unsigned int UShortMul(struct Expression * exp, struct Operand * op1, str
 unsigned short value2 = op2->us;
 
 exp->type = 2;
-exp->string = PrintUShort(op1->us * value2);
+exp->string = PrintUShort((op1->us * value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -5817,7 +6239,7 @@ static unsigned int CharMul(struct Expression * exp, struct Operand * op1, struc
 char value2 = op2->c;
 
 exp->type = 2;
-exp->string = PrintChar(op1->c * value2);
+exp->string = PrintChar((op1->c * value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -5832,7 +6254,7 @@ static unsigned int UCharMul(struct Expression * exp, struct Operand * op1, stru
 unsigned char value2 = op2->uc;
 
 exp->type = 2;
-exp->string = PrintUChar(op1->uc * value2);
+exp->string = PrintUChar((op1->uc * value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -5847,7 +6269,7 @@ static unsigned int FloatMul(struct Expression * exp, struct Operand * op1, stru
 float value2 = op2->f;
 
 exp->type = 2;
-exp->string = PrintFloat(op1->f * value2);
+exp->string = PrintFloat((float)(op1->f * value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -5862,7 +6284,7 @@ static unsigned int DoubleMul(struct Expression * exp, struct Operand * op1, str
 double value2 = op2->d;
 
 exp->type = 2;
-exp->string = PrintDouble(op1->d * value2);
+exp->string = PrintDouble((double)(op1->d * value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -5902,6 +6324,36 @@ op1->type->refCount++;
 return 0x1;
 }
 
+static unsigned int Int64Div(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+{
+long long value2 = op2->i64;
+
+exp->type = 2;
+exp->string = PrintInt64(value2 ? (op1->i64 / value2) : 0);
+if(!exp->expType)
+{
+exp->expType = op1->type;
+if(op1->type)
+op1->type->refCount++;
+}
+return 0x1;
+}
+
+static unsigned int UInt64Div(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+{
+uint64 value2 = op2->ui64;
+
+exp->type = 2;
+exp->string = PrintUInt64(value2 ? (op1->ui64 / value2) : 0);
+if(!exp->expType)
+{
+exp->expType = op1->type;
+if(op1->type)
+op1->type->refCount++;
+}
+return 0x1;
+}
+
 static unsigned int ShortDiv(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
 short value2 = op2->s;
@@ -5967,7 +6419,7 @@ static unsigned int FloatDiv(struct Expression * exp, struct Operand * op1, stru
 float value2 = op2->f;
 
 exp->type = 2;
-exp->string = PrintFloat(value2 ? (op1->f / value2) : (float)0);
+exp->string = PrintFloat(op1->f / value2);
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -5982,7 +6434,7 @@ static unsigned int DoubleDiv(struct Expression * exp, struct Operand * op1, str
 double value2 = op2->d;
 
 exp->type = 2;
-exp->string = PrintDouble(value2 ? (op1->d / value2) : (double)0);
+exp->string = PrintDouble(op1->d / value2);
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -6022,6 +6474,36 @@ op1->type->refCount++;
 return 0x1;
 }
 
+static unsigned int Int64Mod(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+{
+long long value2 = op2->i64;
+
+exp->type = 2;
+exp->string = PrintInt64(value2 ? (op1->i64 % value2) : 0);
+if(!exp->expType)
+{
+exp->expType = op1->type;
+if(op1->type)
+op1->type->refCount++;
+}
+return 0x1;
+}
+
+static unsigned int UInt64Mod(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+{
+uint64 value2 = op2->ui64;
+
+exp->type = 2;
+exp->string = PrintUInt64(value2 ? (op1->ui64 % value2) : 0);
+if(!exp->expType)
+{
+exp->expType = op1->type;
+if(op1->type)
+op1->type->refCount++;
+}
+return 0x1;
+}
+
 static unsigned int ShortMod(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
 short value2 = op2->s;
@@ -6085,7 +6567,7 @@ return 0x1;
 static unsigned int IntNeg(struct Expression * exp, struct Operand * op1)
 {
 exp->type = 2;
-exp->string = PrintInt(-op1->i);
+exp->string = PrintInt((-op1->i));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -6098,7 +6580,7 @@ return 0x1;
 static unsigned int UIntNeg(struct Expression * exp, struct Operand * op1)
 {
 exp->type = 2;
-exp->string = PrintUInt(-op1->ui);
+exp->string = PrintUInt((unsigned int)(-op1->ui));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -6108,10 +6590,10 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int ShortNeg(struct Expression * exp, struct Operand * op1)
+static unsigned int Int64Neg(struct Expression * exp, struct Operand * op1)
 {
 exp->type = 2;
-exp->string = PrintShort(-op1->s);
+exp->string = PrintInt64((-op1->i64));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -6121,10 +6603,10 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int UShortNeg(struct Expression * exp, struct Operand * op1)
+static unsigned int UInt64Neg(struct Expression * exp, struct Operand * op1)
 {
 exp->type = 2;
-exp->string = PrintUShort(-op1->us);
+exp->string = PrintUInt64((uint64)(-op1->ui64));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -6134,10 +6616,10 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int CharNeg(struct Expression * exp, struct Operand * op1)
+static unsigned int ShortNeg(struct Expression * exp, struct Operand * op1)
 {
 exp->type = 2;
-exp->string = PrintChar(-op1->c);
+exp->string = PrintShort((-op1->s));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -6147,10 +6629,10 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int UCharNeg(struct Expression * exp, struct Operand * op1)
+static unsigned int UShortNeg(struct Expression * exp, struct Operand * op1)
 {
 exp->type = 2;
-exp->string = PrintUChar(-op1->uc);
+exp->string = PrintUShort((unsigned short)(-op1->us));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -6160,10 +6642,10 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int FloatNeg(struct Expression * exp, struct Operand * op1)
+static unsigned int CharNeg(struct Expression * exp, struct Operand * op1)
 {
 exp->type = 2;
-exp->string = PrintFloat(-op1->f);
+exp->string = PrintChar((-op1->c));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -6173,10 +6655,10 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int DoubleNeg(struct Expression * exp, struct Operand * op1)
+static unsigned int UCharNeg(struct Expression * exp, struct Operand * op1)
 {
 exp->type = 2;
-exp->string = PrintDouble(-op1->d);
+exp->string = PrintUChar((unsigned char)(-op1->uc));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -6186,10 +6668,10 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int IntInc(struct Expression * exp, struct Operand * op1)
+static unsigned int FloatNeg(struct Expression * exp, struct Operand * op1)
 {
 exp->type = 2;
-exp->string = PrintInt(++op1->i);
+exp->string = PrintFloat((float)(-op1->f));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -6199,10 +6681,10 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int UIntInc(struct Expression * exp, struct Operand * op1)
+static unsigned int DoubleNeg(struct Expression * exp, struct Operand * op1)
 {
 exp->type = 2;
-exp->string = PrintUInt(++op1->ui);
+exp->string = PrintDouble((double)(-op1->d));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -6212,10 +6694,10 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int ShortInc(struct Expression * exp, struct Operand * op1)
+static unsigned int IntInc(struct Expression * exp, struct Operand * op1)
 {
 exp->type = 2;
-exp->string = PrintShort(++op1->s);
+exp->string = PrintInt((++op1->i));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -6225,10 +6707,10 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int UShortInc(struct Expression * exp, struct Operand * op1)
+static unsigned int UIntInc(struct Expression * exp, struct Operand * op1)
 {
 exp->type = 2;
-exp->string = PrintUShort(++op1->us);
+exp->string = PrintUInt((++op1->ui));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -6238,10 +6720,10 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int CharInc(struct Expression * exp, struct Operand * op1)
+static unsigned int Int64Inc(struct Expression * exp, struct Operand * op1)
 {
 exp->type = 2;
-exp->string = PrintChar(++op1->c);
+exp->string = PrintInt64((++op1->i64));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -6251,10 +6733,10 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int UCharInc(struct Expression * exp, struct Operand * op1)
+static unsigned int UInt64Inc(struct Expression * exp, struct Operand * op1)
 {
 exp->type = 2;
-exp->string = PrintUChar(++op1->uc);
+exp->string = PrintUInt64((++op1->ui64));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -6264,10 +6746,10 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int FloatInc(struct Expression * exp, struct Operand * op1)
+static unsigned int ShortInc(struct Expression * exp, struct Operand * op1)
 {
 exp->type = 2;
-exp->string = PrintFloat(++op1->f);
+exp->string = PrintShort((++op1->s));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -6277,10 +6759,10 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int DoubleInc(struct Expression * exp, struct Operand * op1)
+static unsigned int UShortInc(struct Expression * exp, struct Operand * op1)
 {
 exp->type = 2;
-exp->string = PrintDouble(++op1->d);
+exp->string = PrintUShort((++op1->us));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -6290,10 +6772,10 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int IntDec(struct Expression * exp, struct Operand * op1)
+static unsigned int CharInc(struct Expression * exp, struct Operand * op1)
 {
 exp->type = 2;
-exp->string = PrintInt(--op1->i);
+exp->string = PrintChar((++op1->c));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -6303,10 +6785,10 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int UIntDec(struct Expression * exp, struct Operand * op1)
+static unsigned int UCharInc(struct Expression * exp, struct Operand * op1)
 {
 exp->type = 2;
-exp->string = PrintUInt(--op1->ui);
+exp->string = PrintUChar((++op1->uc));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -6316,10 +6798,10 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int ShortDec(struct Expression * exp, struct Operand * op1)
+static unsigned int FloatInc(struct Expression * exp, struct Operand * op1)
 {
 exp->type = 2;
-exp->string = PrintShort(--op1->s);
+exp->string = PrintFloat((float)(++op1->f));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -6329,10 +6811,10 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int UShortDec(struct Expression * exp, struct Operand * op1)
+static unsigned int DoubleInc(struct Expression * exp, struct Operand * op1)
 {
 exp->type = 2;
-exp->string = PrintUShort(--op1->us);
+exp->string = PrintDouble((double)(++op1->d));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -6342,10 +6824,10 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int CharDec(struct Expression * exp, struct Operand * op1)
+static unsigned int IntDec(struct Expression * exp, struct Operand * op1)
 {
 exp->type = 2;
-exp->string = PrintChar(--op1->c);
+exp->string = PrintInt((--op1->i));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -6355,10 +6837,10 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int UCharDec(struct Expression * exp, struct Operand * op1)
+static unsigned int UIntDec(struct Expression * exp, struct Operand * op1)
 {
 exp->type = 2;
-exp->string = PrintUChar(--op1->uc);
+exp->string = PrintUInt((--op1->ui));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -6368,10 +6850,10 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int FloatDec(struct Expression * exp, struct Operand * op1)
+static unsigned int Int64Dec(struct Expression * exp, struct Operand * op1)
 {
 exp->type = 2;
-exp->string = PrintFloat(--op1->f);
+exp->string = PrintInt64((--op1->i64));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -6381,10 +6863,10 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int DoubleDec(struct Expression * exp, struct Operand * op1)
+static unsigned int UInt64Dec(struct Expression * exp, struct Operand * op1)
 {
 exp->type = 2;
-exp->string = PrintDouble(--op1->d);
+exp->string = PrintUInt64((--op1->ui64));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -6394,12 +6876,10 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int IntAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int ShortDec(struct Expression * exp, struct Operand * op1)
 {
-int value2 = op2->i;
-
 exp->type = 2;
-exp->string = PrintInt(op1->i = value2);
+exp->string = PrintShort((--op1->s));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -6409,12 +6889,10 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int UIntAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int UShortDec(struct Expression * exp, struct Operand * op1)
 {
-unsigned int value2 = op2->ui;
-
 exp->type = 2;
-exp->string = PrintUInt(op1->ui = value2);
+exp->string = PrintUShort((--op1->us));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -6424,12 +6902,10 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int ShortAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int CharDec(struct Expression * exp, struct Operand * op1)
 {
-short value2 = op2->s;
-
 exp->type = 2;
-exp->string = PrintShort(op1->s = value2);
+exp->string = PrintChar((--op1->c));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -6439,12 +6915,10 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int UShortAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int UCharDec(struct Expression * exp, struct Operand * op1)
 {
-unsigned short value2 = op2->us;
-
 exp->type = 2;
-exp->string = PrintUShort(op1->us = value2);
+exp->string = PrintUChar((--op1->uc));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -6454,12 +6928,10 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int CharAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int FloatDec(struct Expression * exp, struct Operand * op1)
 {
-char value2 = op2->c;
-
 exp->type = 2;
-exp->string = PrintChar(op1->c = value2);
+exp->string = PrintFloat((float)(--op1->f));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -6469,12 +6941,10 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int UCharAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int DoubleDec(struct Expression * exp, struct Operand * op1)
 {
-unsigned char value2 = op2->uc;
-
 exp->type = 2;
-exp->string = PrintUChar(op1->uc = value2);
+exp->string = PrintDouble((double)(--op1->d));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -6484,12 +6954,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int FloatAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int IntAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
-float value2 = op2->f;
+int value2 = op2->i;
 
 exp->type = 2;
-exp->string = PrintFloat(op1->f = value2);
+exp->string = PrintInt((op1->i = value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -6499,12 +6969,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int DoubleAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int UIntAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
-double value2 = op2->d;
+unsigned int value2 = op2->ui;
 
 exp->type = 2;
-exp->string = PrintDouble(op1->d = value2);
+exp->string = PrintUInt((op1->ui = value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -6514,12 +6984,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int IntAddAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int Int64Asign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
-int value2 = op2->i;
+long long value2 = op2->i64;
 
 exp->type = 2;
-exp->string = PrintInt(op1->i += value2);
+exp->string = PrintInt64((op1->i64 = value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -6529,12 +6999,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int UIntAddAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int UInt64Asign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
-unsigned int value2 = op2->ui;
+uint64 value2 = op2->ui64;
 
 exp->type = 2;
-exp->string = PrintUInt(op1->ui += value2);
+exp->string = PrintUInt64((op1->ui64 = value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -6544,12 +7014,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int ShortAddAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int ShortAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
 short value2 = op2->s;
 
 exp->type = 2;
-exp->string = PrintShort(op1->s += value2);
+exp->string = PrintShort((op1->s = value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -6559,12 +7029,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int UShortAddAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int UShortAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
 unsigned short value2 = op2->us;
 
 exp->type = 2;
-exp->string = PrintUShort(op1->us += value2);
+exp->string = PrintUShort((op1->us = value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -6574,12 +7044,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int CharAddAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int CharAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
 char value2 = op2->c;
 
 exp->type = 2;
-exp->string = PrintChar(op1->c += value2);
+exp->string = PrintChar((op1->c = value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -6589,12 +7059,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int UCharAddAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int UCharAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
 unsigned char value2 = op2->uc;
 
 exp->type = 2;
-exp->string = PrintUChar(op1->uc += value2);
+exp->string = PrintUChar((op1->uc = value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -6604,12 +7074,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int FloatAddAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int FloatAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
 float value2 = op2->f;
 
 exp->type = 2;
-exp->string = PrintFloat(op1->f += value2);
+exp->string = PrintFloat((float)(op1->f = value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -6619,12 +7089,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int DoubleAddAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int DoubleAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
 double value2 = op2->d;
 
 exp->type = 2;
-exp->string = PrintDouble(op1->d += value2);
+exp->string = PrintDouble((double)(op1->d = value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -6634,12 +7104,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int IntSubAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int IntAddAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
 int value2 = op2->i;
 
 exp->type = 2;
-exp->string = PrintInt(op1->i -= value2);
+exp->string = PrintInt((op1->i += value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -6649,12 +7119,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int UIntSubAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int UIntAddAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
 unsigned int value2 = op2->ui;
 
 exp->type = 2;
-exp->string = PrintUInt(op1->ui -= value2);
+exp->string = PrintUInt((op1->ui += value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -6664,12 +7134,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int ShortSubAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int Int64AddAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
-short value2 = op2->s;
+long long value2 = op2->i64;
 
 exp->type = 2;
-exp->string = PrintShort(op1->s -= value2);
+exp->string = PrintInt64((op1->i64 += value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -6679,12 +7149,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int UShortSubAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int UInt64AddAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
-unsigned short value2 = op2->us;
+uint64 value2 = op2->ui64;
 
 exp->type = 2;
-exp->string = PrintUShort(op1->us -= value2);
+exp->string = PrintUInt64((op1->ui64 += value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -6694,12 +7164,192 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int CharSubAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int ShortAddAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
-char value2 = op2->c;
+short value2 = op2->s;
 
 exp->type = 2;
-exp->string = PrintChar(op1->c -= value2);
+exp->string = PrintShort((op1->s += value2));
+if(!exp->expType)
+{
+exp->expType = op1->type;
+if(op1->type)
+op1->type->refCount++;
+}
+return 0x1;
+}
+
+static unsigned int UShortAddAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+{
+unsigned short value2 = op2->us;
+
+exp->type = 2;
+exp->string = PrintUShort((op1->us += value2));
+if(!exp->expType)
+{
+exp->expType = op1->type;
+if(op1->type)
+op1->type->refCount++;
+}
+return 0x1;
+}
+
+static unsigned int CharAddAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+{
+char value2 = op2->c;
+
+exp->type = 2;
+exp->string = PrintChar((op1->c += value2));
+if(!exp->expType)
+{
+exp->expType = op1->type;
+if(op1->type)
+op1->type->refCount++;
+}
+return 0x1;
+}
+
+static unsigned int UCharAddAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+{
+unsigned char value2 = op2->uc;
+
+exp->type = 2;
+exp->string = PrintUChar((op1->uc += value2));
+if(!exp->expType)
+{
+exp->expType = op1->type;
+if(op1->type)
+op1->type->refCount++;
+}
+return 0x1;
+}
+
+static unsigned int FloatAddAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+{
+float value2 = op2->f;
+
+exp->type = 2;
+exp->string = PrintFloat((float)(op1->f += value2));
+if(!exp->expType)
+{
+exp->expType = op1->type;
+if(op1->type)
+op1->type->refCount++;
+}
+return 0x1;
+}
+
+static unsigned int DoubleAddAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+{
+double value2 = op2->d;
+
+exp->type = 2;
+exp->string = PrintDouble((double)(op1->d += value2));
+if(!exp->expType)
+{
+exp->expType = op1->type;
+if(op1->type)
+op1->type->refCount++;
+}
+return 0x1;
+}
+
+static unsigned int IntSubAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+{
+int value2 = op2->i;
+
+exp->type = 2;
+exp->string = PrintInt((op1->i -= value2));
+if(!exp->expType)
+{
+exp->expType = op1->type;
+if(op1->type)
+op1->type->refCount++;
+}
+return 0x1;
+}
+
+static unsigned int UIntSubAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+{
+unsigned int value2 = op2->ui;
+
+exp->type = 2;
+exp->string = PrintUInt((op1->ui -= value2));
+if(!exp->expType)
+{
+exp->expType = op1->type;
+if(op1->type)
+op1->type->refCount++;
+}
+return 0x1;
+}
+
+static unsigned int Int64SubAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+{
+long long value2 = op2->i64;
+
+exp->type = 2;
+exp->string = PrintInt64((op1->i64 -= value2));
+if(!exp->expType)
+{
+exp->expType = op1->type;
+if(op1->type)
+op1->type->refCount++;
+}
+return 0x1;
+}
+
+static unsigned int UInt64SubAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+{
+uint64 value2 = op2->ui64;
+
+exp->type = 2;
+exp->string = PrintUInt64((op1->ui64 -= value2));
+if(!exp->expType)
+{
+exp->expType = op1->type;
+if(op1->type)
+op1->type->refCount++;
+}
+return 0x1;
+}
+
+static unsigned int ShortSubAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+{
+short value2 = op2->s;
+
+exp->type = 2;
+exp->string = PrintShort((op1->s -= value2));
+if(!exp->expType)
+{
+exp->expType = op1->type;
+if(op1->type)
+op1->type->refCount++;
+}
+return 0x1;
+}
+
+static unsigned int UShortSubAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+{
+unsigned short value2 = op2->us;
+
+exp->type = 2;
+exp->string = PrintUShort((op1->us -= value2));
+if(!exp->expType)
+{
+exp->expType = op1->type;
+if(op1->type)
+op1->type->refCount++;
+}
+return 0x1;
+}
+
+static unsigned int CharSubAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+{
+char value2 = op2->c;
+
+exp->type = 2;
+exp->string = PrintChar((op1->c -= value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -6714,7 +7364,457 @@ static unsigned int UCharSubAsign(struct Expression * exp, struct Operand * op1,
 unsigned char value2 = op2->uc;
 
 exp->type = 2;
-exp->string = PrintUChar(op1->uc -= value2);
+exp->string = PrintUChar((op1->uc -= value2));
+if(!exp->expType)
+{
+exp->expType = op1->type;
+if(op1->type)
+op1->type->refCount++;
+}
+return 0x1;
+}
+
+static unsigned int FloatSubAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+{
+float value2 = op2->f;
+
+exp->type = 2;
+exp->string = PrintFloat((float)(op1->f -= value2));
+if(!exp->expType)
+{
+exp->expType = op1->type;
+if(op1->type)
+op1->type->refCount++;
+}
+return 0x1;
+}
+
+static unsigned int DoubleSubAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+{
+double value2 = op2->d;
+
+exp->type = 2;
+exp->string = PrintDouble((double)(op1->d -= value2));
+if(!exp->expType)
+{
+exp->expType = op1->type;
+if(op1->type)
+op1->type->refCount++;
+}
+return 0x1;
+}
+
+static unsigned int IntMulAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+{
+int value2 = op2->i;
+
+exp->type = 2;
+exp->string = PrintInt((op1->i *= value2));
+if(!exp->expType)
+{
+exp->expType = op1->type;
+if(op1->type)
+op1->type->refCount++;
+}
+return 0x1;
+}
+
+static unsigned int UIntMulAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+{
+unsigned int value2 = op2->ui;
+
+exp->type = 2;
+exp->string = PrintUInt((op1->ui *= value2));
+if(!exp->expType)
+{
+exp->expType = op1->type;
+if(op1->type)
+op1->type->refCount++;
+}
+return 0x1;
+}
+
+static unsigned int Int64MulAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+{
+long long value2 = op2->i64;
+
+exp->type = 2;
+exp->string = PrintInt64((op1->i64 *= value2));
+if(!exp->expType)
+{
+exp->expType = op1->type;
+if(op1->type)
+op1->type->refCount++;
+}
+return 0x1;
+}
+
+static unsigned int UInt64MulAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+{
+uint64 value2 = op2->ui64;
+
+exp->type = 2;
+exp->string = PrintUInt64((op1->ui64 *= value2));
+if(!exp->expType)
+{
+exp->expType = op1->type;
+if(op1->type)
+op1->type->refCount++;
+}
+return 0x1;
+}
+
+static unsigned int ShortMulAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+{
+short value2 = op2->s;
+
+exp->type = 2;
+exp->string = PrintShort((op1->s *= value2));
+if(!exp->expType)
+{
+exp->expType = op1->type;
+if(op1->type)
+op1->type->refCount++;
+}
+return 0x1;
+}
+
+static unsigned int UShortMulAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+{
+unsigned short value2 = op2->us;
+
+exp->type = 2;
+exp->string = PrintUShort((op1->us *= value2));
+if(!exp->expType)
+{
+exp->expType = op1->type;
+if(op1->type)
+op1->type->refCount++;
+}
+return 0x1;
+}
+
+static unsigned int CharMulAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+{
+char value2 = op2->c;
+
+exp->type = 2;
+exp->string = PrintChar((op1->c *= value2));
+if(!exp->expType)
+{
+exp->expType = op1->type;
+if(op1->type)
+op1->type->refCount++;
+}
+return 0x1;
+}
+
+static unsigned int UCharMulAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+{
+unsigned char value2 = op2->uc;
+
+exp->type = 2;
+exp->string = PrintUChar((op1->uc *= value2));
+if(!exp->expType)
+{
+exp->expType = op1->type;
+if(op1->type)
+op1->type->refCount++;
+}
+return 0x1;
+}
+
+static unsigned int FloatMulAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+{
+float value2 = op2->f;
+
+exp->type = 2;
+exp->string = PrintFloat((float)(op1->f *= value2));
+if(!exp->expType)
+{
+exp->expType = op1->type;
+if(op1->type)
+op1->type->refCount++;
+}
+return 0x1;
+}
+
+static unsigned int DoubleMulAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+{
+double value2 = op2->d;
+
+exp->type = 2;
+exp->string = PrintDouble((double)(op1->d *= value2));
+if(!exp->expType)
+{
+exp->expType = op1->type;
+if(op1->type)
+op1->type->refCount++;
+}
+return 0x1;
+}
+
+static unsigned int IntDivAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+{
+int value2 = op2->i;
+
+exp->type = 2;
+exp->string = PrintInt(value2 ? (op1->i /= value2) : 0);
+if(!exp->expType)
+{
+exp->expType = op1->type;
+if(op1->type)
+op1->type->refCount++;
+}
+return 0x1;
+}
+
+static unsigned int UIntDivAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+{
+unsigned int value2 = op2->ui;
+
+exp->type = 2;
+exp->string = PrintUInt(value2 ? (op1->ui /= value2) : 0);
+if(!exp->expType)
+{
+exp->expType = op1->type;
+if(op1->type)
+op1->type->refCount++;
+}
+return 0x1;
+}
+
+static unsigned int Int64DivAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+{
+long long value2 = op2->i64;
+
+exp->type = 2;
+exp->string = PrintInt64(value2 ? (op1->i64 /= value2) : 0);
+if(!exp->expType)
+{
+exp->expType = op1->type;
+if(op1->type)
+op1->type->refCount++;
+}
+return 0x1;
+}
+
+static unsigned int UInt64DivAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+{
+uint64 value2 = op2->ui64;
+
+exp->type = 2;
+exp->string = PrintUInt64(value2 ? (op1->ui64 /= value2) : 0);
+if(!exp->expType)
+{
+exp->expType = op1->type;
+if(op1->type)
+op1->type->refCount++;
+}
+return 0x1;
+}
+
+static unsigned int ShortDivAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+{
+short value2 = op2->s;
+
+exp->type = 2;
+exp->string = PrintShort(value2 ? (op1->s /= value2) : (short)0);
+if(!exp->expType)
+{
+exp->expType = op1->type;
+if(op1->type)
+op1->type->refCount++;
+}
+return 0x1;
+}
+
+static unsigned int UShortDivAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+{
+unsigned short value2 = op2->us;
+
+exp->type = 2;
+exp->string = PrintUShort(value2 ? (op1->us /= value2) : (unsigned short)0);
+if(!exp->expType)
+{
+exp->expType = op1->type;
+if(op1->type)
+op1->type->refCount++;
+}
+return 0x1;
+}
+
+static unsigned int CharDivAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+{
+char value2 = op2->c;
+
+exp->type = 2;
+exp->string = PrintChar(value2 ? (op1->c /= value2) : (char)0);
+if(!exp->expType)
+{
+exp->expType = op1->type;
+if(op1->type)
+op1->type->refCount++;
+}
+return 0x1;
+}
+
+static unsigned int UCharDivAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+{
+unsigned char value2 = op2->uc;
+
+exp->type = 2;
+exp->string = PrintUChar(value2 ? (op1->uc /= value2) : (unsigned char)0);
+if(!exp->expType)
+{
+exp->expType = op1->type;
+if(op1->type)
+op1->type->refCount++;
+}
+return 0x1;
+}
+
+static unsigned int FloatDivAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+{
+float value2 = op2->f;
+
+exp->type = 2;
+exp->string = PrintFloat(op1->f /= value2);
+if(!exp->expType)
+{
+exp->expType = op1->type;
+if(op1->type)
+op1->type->refCount++;
+}
+return 0x1;
+}
+
+static unsigned int DoubleDivAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+{
+double value2 = op2->d;
+
+exp->type = 2;
+exp->string = PrintDouble(op1->d /= value2);
+if(!exp->expType)
+{
+exp->expType = op1->type;
+if(op1->type)
+op1->type->refCount++;
+}
+return 0x1;
+}
+
+static unsigned int IntModAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+{
+int value2 = op2->i;
+
+exp->type = 2;
+exp->string = PrintInt(value2 ? (op1->i %= value2) : 0);
+if(!exp->expType)
+{
+exp->expType = op1->type;
+if(op1->type)
+op1->type->refCount++;
+}
+return 0x1;
+}
+
+static unsigned int UIntModAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+{
+unsigned int value2 = op2->ui;
+
+exp->type = 2;
+exp->string = PrintUInt(value2 ? (op1->ui %= value2) : 0);
+if(!exp->expType)
+{
+exp->expType = op1->type;
+if(op1->type)
+op1->type->refCount++;
+}
+return 0x1;
+}
+
+static unsigned int Int64ModAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+{
+long long value2 = op2->i64;
+
+exp->type = 2;
+exp->string = PrintInt64(value2 ? (op1->i64 %= value2) : 0);
+if(!exp->expType)
+{
+exp->expType = op1->type;
+if(op1->type)
+op1->type->refCount++;
+}
+return 0x1;
+}
+
+static unsigned int UInt64ModAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+{
+uint64 value2 = op2->ui64;
+
+exp->type = 2;
+exp->string = PrintUInt64(value2 ? (op1->ui64 %= value2) : 0);
+if(!exp->expType)
+{
+exp->expType = op1->type;
+if(op1->type)
+op1->type->refCount++;
+}
+return 0x1;
+}
+
+static unsigned int ShortModAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+{
+short value2 = op2->s;
+
+exp->type = 2;
+exp->string = PrintShort(value2 ? (op1->s %= value2) : (short)0);
+if(!exp->expType)
+{
+exp->expType = op1->type;
+if(op1->type)
+op1->type->refCount++;
+}
+return 0x1;
+}
+
+static unsigned int UShortModAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+{
+unsigned short value2 = op2->us;
+
+exp->type = 2;
+exp->string = PrintUShort(value2 ? (op1->us %= value2) : (unsigned short)0);
+if(!exp->expType)
+{
+exp->expType = op1->type;
+if(op1->type)
+op1->type->refCount++;
+}
+return 0x1;
+}
+
+static unsigned int CharModAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+{
+char value2 = op2->c;
+
+exp->type = 2;
+exp->string = PrintChar(value2 ? (op1->c %= value2) : (char)0);
+if(!exp->expType)
+{
+exp->expType = op1->type;
+if(op1->type)
+op1->type->refCount++;
+}
+return 0x1;
+}
+
+static unsigned int UCharModAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+{
+unsigned char value2 = op2->uc;
+
+exp->type = 2;
+exp->string = PrintUChar(value2 ? (op1->uc %= value2) : (unsigned char)0);
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -6724,12 +7824,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int FloatSubAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int IntBitAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
-float value2 = op2->f;
+int value2 = op2->i;
 
 exp->type = 2;
-exp->string = PrintFloat(op1->f -= value2);
+exp->string = PrintInt((op1->i & value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -6739,12 +7839,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int DoubleSubAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int UIntBitAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
-double value2 = op2->d;
+unsigned int value2 = op2->ui;
 
 exp->type = 2;
-exp->string = PrintDouble(op1->d -= value2);
+exp->string = PrintUInt((op1->ui & value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -6754,12 +7854,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int IntMulAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int Int64BitAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
-int value2 = op2->i;
+long long value2 = op2->i64;
 
 exp->type = 2;
-exp->string = PrintInt(op1->i *= value2);
+exp->string = PrintInt64((op1->i64 & value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -6769,12 +7869,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int UIntMulAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int UInt64BitAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
-unsigned int value2 = op2->ui;
+uint64 value2 = op2->ui64;
 
 exp->type = 2;
-exp->string = PrintUInt(op1->ui *= value2);
+exp->string = PrintUInt64((op1->ui64 & value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -6784,12 +7884,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int ShortMulAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int ShortBitAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
 short value2 = op2->s;
 
 exp->type = 2;
-exp->string = PrintShort(op1->s *= value2);
+exp->string = PrintShort((op1->s & value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -6799,12 +7899,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int UShortMulAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int UShortBitAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
 unsigned short value2 = op2->us;
 
 exp->type = 2;
-exp->string = PrintUShort(op1->us *= value2);
+exp->string = PrintUShort((op1->us & value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -6814,12 +7914,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int CharMulAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int CharBitAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
 char value2 = op2->c;
 
 exp->type = 2;
-exp->string = PrintChar(op1->c *= value2);
+exp->string = PrintChar((op1->c & value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -6829,12 +7929,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int UCharMulAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int UCharBitAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
 unsigned char value2 = op2->uc;
 
 exp->type = 2;
-exp->string = PrintUChar(op1->uc *= value2);
+exp->string = PrintUChar((op1->uc & value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -6844,12 +7944,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int FloatMulAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int IntBitOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
-float value2 = op2->f;
+int value2 = op2->i;
 
 exp->type = 2;
-exp->string = PrintFloat(op1->f *= value2);
+exp->string = PrintInt((op1->i | value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -6859,12 +7959,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int DoubleMulAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int UIntBitOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
-double value2 = op2->d;
+unsigned int value2 = op2->ui;
 
 exp->type = 2;
-exp->string = PrintDouble(op1->d *= value2);
+exp->string = PrintUInt((op1->ui | value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -6874,12 +7974,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int IntDivAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int Int64BitOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
-int value2 = op2->i;
+long long value2 = op2->i64;
 
 exp->type = 2;
-exp->string = PrintInt(value2 ? (op1->i /= value2) : 0);
+exp->string = PrintInt64((op1->i64 | value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -6889,12 +7989,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int UIntDivAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int UInt64BitOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
-unsigned int value2 = op2->ui;
+uint64 value2 = op2->ui64;
 
 exp->type = 2;
-exp->string = PrintUInt(value2 ? (op1->ui /= value2) : 0);
+exp->string = PrintUInt64((op1->ui64 | value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -6904,12 +8004,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int ShortDivAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int ShortBitOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
 short value2 = op2->s;
 
 exp->type = 2;
-exp->string = PrintShort(value2 ? (op1->s /= value2) : (short)0);
+exp->string = PrintShort((op1->s | value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -6919,12 +8019,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int UShortDivAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int UShortBitOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
 unsigned short value2 = op2->us;
 
 exp->type = 2;
-exp->string = PrintUShort(value2 ? (op1->us /= value2) : (unsigned short)0);
+exp->string = PrintUShort((op1->us | value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -6934,12 +8034,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int CharDivAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int CharBitOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
 char value2 = op2->c;
 
 exp->type = 2;
-exp->string = PrintChar(value2 ? (op1->c /= value2) : (char)0);
+exp->string = PrintChar((op1->c | value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -6949,12 +8049,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int UCharDivAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int UCharBitOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
 unsigned char value2 = op2->uc;
 
 exp->type = 2;
-exp->string = PrintUChar(value2 ? (op1->uc /= value2) : (unsigned char)0);
+exp->string = PrintUChar((op1->uc | value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -6964,12 +8064,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int FloatDivAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int IntBitXor(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
-float value2 = op2->f;
+int value2 = op2->i;
 
 exp->type = 2;
-exp->string = PrintFloat(value2 ? (op1->f /= value2) : (float)0);
+exp->string = PrintInt((op1->i ^ value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -6979,12 +8079,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int DoubleDivAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int UIntBitXor(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
-double value2 = op2->d;
+unsigned int value2 = op2->ui;
 
 exp->type = 2;
-exp->string = PrintDouble(value2 ? (op1->d /= value2) : (double)0);
+exp->string = PrintUInt((op1->ui ^ value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -6994,12 +8094,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int IntModAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int Int64BitXor(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
-int value2 = op2->i;
+long long value2 = op2->i64;
 
 exp->type = 2;
-exp->string = PrintInt(value2 ? (op1->i %= value2) : 0);
+exp->string = PrintInt64((op1->i64 ^ value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -7009,12 +8109,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int UIntModAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int UInt64BitXor(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
-unsigned int value2 = op2->ui;
+uint64 value2 = op2->ui64;
 
 exp->type = 2;
-exp->string = PrintUInt(value2 ? (op1->ui %= value2) : 0);
+exp->string = PrintUInt64((op1->ui64 ^ value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -7024,12 +8124,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int ShortModAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int ShortBitXor(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
 short value2 = op2->s;
 
 exp->type = 2;
-exp->string = PrintShort(value2 ? (op1->s %= value2) : (short)0);
+exp->string = PrintShort((op1->s ^ value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -7039,12 +8139,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int UShortModAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int UShortBitXor(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
 unsigned short value2 = op2->us;
 
 exp->type = 2;
-exp->string = PrintUShort(value2 ? (op1->us %= value2) : (unsigned short)0);
+exp->string = PrintUShort((op1->us ^ value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -7054,12 +8154,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int CharModAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int CharBitXor(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
 char value2 = op2->c;
 
 exp->type = 2;
-exp->string = PrintChar(value2 ? (op1->c %= value2) : (char)0);
+exp->string = PrintChar((op1->c ^ value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -7069,12 +8169,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int UCharModAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int UCharBitXor(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
 unsigned char value2 = op2->uc;
 
 exp->type = 2;
-exp->string = PrintUChar(value2 ? (op1->uc %= value2) : (unsigned char)0);
+exp->string = PrintUChar((op1->uc ^ value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -7084,12 +8184,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int IntBitAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int IntLShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
 int value2 = op2->i;
 
 exp->type = 2;
-exp->string = PrintInt(op1->i & value2);
+exp->string = PrintInt((op1->i << value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -7099,12 +8199,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int UIntBitAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int UIntLShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
 unsigned int value2 = op2->ui;
 
 exp->type = 2;
-exp->string = PrintUInt(op1->ui & value2);
+exp->string = PrintUInt((op1->ui << value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -7114,12 +8214,42 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int ShortBitAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int Int64LShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+{
+long long value2 = op2->i64;
+
+exp->type = 2;
+exp->string = PrintInt64((op1->i64 << value2));
+if(!exp->expType)
+{
+exp->expType = op1->type;
+if(op1->type)
+op1->type->refCount++;
+}
+return 0x1;
+}
+
+static unsigned int UInt64LShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+{
+uint64 value2 = op2->ui64;
+
+exp->type = 2;
+exp->string = PrintUInt64((op1->ui64 << value2));
+if(!exp->expType)
+{
+exp->expType = op1->type;
+if(op1->type)
+op1->type->refCount++;
+}
+return 0x1;
+}
+
+static unsigned int ShortLShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
 short value2 = op2->s;
 
 exp->type = 2;
-exp->string = PrintShort(op1->s & value2);
+exp->string = PrintShort((op1->s << value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -7129,12 +8259,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int UShortBitAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int UShortLShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
 unsigned short value2 = op2->us;
 
 exp->type = 2;
-exp->string = PrintUShort(op1->us & value2);
+exp->string = PrintUShort((op1->us << value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -7144,12 +8274,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int CharBitAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int CharLShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
 char value2 = op2->c;
 
 exp->type = 2;
-exp->string = PrintChar(op1->c & value2);
+exp->string = PrintChar((op1->c << value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -7159,12 +8289,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int UCharBitAnd(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int UCharLShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
 unsigned char value2 = op2->uc;
 
 exp->type = 2;
-exp->string = PrintUChar(op1->uc & value2);
+exp->string = PrintUChar((op1->uc << value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -7174,12 +8304,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int IntBitOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int IntRShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
 int value2 = op2->i;
 
 exp->type = 2;
-exp->string = PrintInt(op1->i | value2);
+exp->string = PrintInt((op1->i >> value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -7189,12 +8319,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int UIntBitOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int UIntRShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
 unsigned int value2 = op2->ui;
 
 exp->type = 2;
-exp->string = PrintUInt(op1->ui | value2);
+exp->string = PrintUInt((op1->ui >> value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -7204,12 +8334,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int ShortBitOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int Int64RShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
-short value2 = op2->s;
+long long value2 = op2->i64;
 
 exp->type = 2;
-exp->string = PrintShort(op1->s | value2);
+exp->string = PrintInt64((op1->i64 >> value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -7219,12 +8349,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int UShortBitOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int UInt64RShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
-unsigned short value2 = op2->us;
+uint64 value2 = op2->ui64;
 
 exp->type = 2;
-exp->string = PrintUShort(op1->us | value2);
+exp->string = PrintUInt64((op1->ui64 >> value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -7234,12 +8364,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int CharBitOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int ShortRShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
-char value2 = op2->c;
+short value2 = op2->s;
 
 exp->type = 2;
-exp->string = PrintChar(op1->c | value2);
+exp->string = PrintShort((op1->s >> value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -7249,12 +8379,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int UCharBitOr(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int UShortRShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
-unsigned char value2 = op2->uc;
+unsigned short value2 = op2->us;
 
 exp->type = 2;
-exp->string = PrintUChar(op1->uc | value2);
+exp->string = PrintUShort((op1->us >> value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -7264,12 +8394,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int IntBitXor(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int CharRShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
-int value2 = op2->i;
+char value2 = op2->c;
 
 exp->type = 2;
-exp->string = PrintInt(op1->i ^ value2);
+exp->string = PrintChar((op1->c >> value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -7279,12 +8409,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int UIntBitXor(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int UCharRShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
-unsigned int value2 = op2->ui;
+unsigned char value2 = op2->uc;
 
 exp->type = 2;
-exp->string = PrintUInt(op1->ui ^ value2);
+exp->string = PrintUChar((op1->uc >> value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -7294,12 +8424,10 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int ShortBitXor(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int IntBitNot(struct Expression * exp, struct Operand * op1)
 {
-short value2 = op2->s;
-
 exp->type = 2;
-exp->string = PrintShort(op1->s ^ value2);
+exp->string = PrintInt((~op1->i));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -7309,12 +8437,10 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int UShortBitXor(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int UIntBitNot(struct Expression * exp, struct Operand * op1)
 {
-unsigned short value2 = op2->us;
-
 exp->type = 2;
-exp->string = PrintUShort(op1->us ^ value2);
+exp->string = PrintUInt((unsigned int)(~op1->ui));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -7324,12 +8450,10 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int CharBitXor(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int Int64BitNot(struct Expression * exp, struct Operand * op1)
 {
-char value2 = op2->c;
-
 exp->type = 2;
-exp->string = PrintChar(op1->c ^ value2);
+exp->string = PrintInt64((long long)(~op1->i64));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -7339,12 +8463,10 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int UCharBitXor(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int UInt64BitNot(struct Expression * exp, struct Operand * op1)
 {
-unsigned char value2 = op2->uc;
-
 exp->type = 2;
-exp->string = PrintUChar(op1->uc ^ value2);
+exp->string = PrintUInt64((uint64)(~op1->ui64));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -7354,12 +8476,10 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int IntLShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int ShortBitNot(struct Expression * exp, struct Operand * op1)
 {
-int value2 = op2->i;
-
 exp->type = 2;
-exp->string = PrintInt(op1->i << value2);
+exp->string = PrintShort((short)(~op1->s));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -7369,12 +8489,10 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int UIntLShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int UShortBitNot(struct Expression * exp, struct Operand * op1)
 {
-unsigned int value2 = op2->ui;
-
 exp->type = 2;
-exp->string = PrintUInt(op1->ui << value2);
+exp->string = PrintUShort((unsigned short)(~op1->us));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -7384,12 +8502,10 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int ShortLShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int CharBitNot(struct Expression * exp, struct Operand * op1)
 {
-short value2 = op2->s;
-
 exp->type = 2;
-exp->string = PrintShort(op1->s << value2);
+exp->string = PrintChar((char)(~op1->c));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -7399,12 +8515,10 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int UShortLShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int UCharBitNot(struct Expression * exp, struct Operand * op1)
 {
-unsigned short value2 = op2->us;
-
 exp->type = 2;
-exp->string = PrintUShort(op1->us << value2);
+exp->string = PrintUChar((unsigned char)(~op1->uc));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -7414,12 +8528,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int CharLShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int IntAndAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
-char value2 = op2->c;
+int value2 = op2->i;
 
 exp->type = 2;
-exp->string = PrintChar(op1->c << value2);
+exp->string = PrintInt((op1->i &= value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -7429,12 +8543,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int UCharLShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int UIntAndAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
-unsigned char value2 = op2->uc;
+unsigned int value2 = op2->ui;
 
 exp->type = 2;
-exp->string = PrintUChar(op1->uc << value2);
+exp->string = PrintUInt((op1->ui &= value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -7444,12 +8558,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int IntRShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int Int64AndAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
-int value2 = op2->i;
+long long value2 = op2->i64;
 
 exp->type = 2;
-exp->string = PrintInt(op1->i >> value2);
+exp->string = PrintInt64((op1->i64 &= value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -7459,12 +8573,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int UIntRShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int UInt64AndAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
-unsigned int value2 = op2->ui;
+uint64 value2 = op2->ui64;
 
 exp->type = 2;
-exp->string = PrintUInt(op1->ui >> value2);
+exp->string = PrintUInt64((op1->ui64 &= value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -7474,12 +8588,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int ShortRShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int ShortAndAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
 short value2 = op2->s;
 
 exp->type = 2;
-exp->string = PrintShort(op1->s >> value2);
+exp->string = PrintShort((op1->s &= value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -7489,12 +8603,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int UShortRShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int UShortAndAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
 unsigned short value2 = op2->us;
 
 exp->type = 2;
-exp->string = PrintUShort(op1->us >> value2);
+exp->string = PrintUShort((op1->us &= value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -7504,12 +8618,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int CharRShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int CharAndAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
 char value2 = op2->c;
 
 exp->type = 2;
-exp->string = PrintChar(op1->c >> value2);
+exp->string = PrintChar((op1->c &= value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -7519,12 +8633,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int UCharRShift(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int UCharAndAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
 unsigned char value2 = op2->uc;
 
 exp->type = 2;
-exp->string = PrintUChar(op1->uc >> value2);
+exp->string = PrintUChar((op1->uc &= value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -7534,10 +8648,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int IntBitNot(struct Expression * exp, struct Operand * op1)
+static unsigned int IntOrAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
+int value2 = op2->i;
+
 exp->type = 2;
-exp->string = PrintInt(~op1->i);
+exp->string = PrintInt((op1->i |= value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -7547,10 +8663,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int UIntBitNot(struct Expression * exp, struct Operand * op1)
+static unsigned int UIntOrAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
+unsigned int value2 = op2->ui;
+
 exp->type = 2;
-exp->string = PrintUInt(~op1->ui);
+exp->string = PrintUInt((op1->ui |= value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -7560,10 +8678,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int ShortBitNot(struct Expression * exp, struct Operand * op1)
+static unsigned int Int64OrAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
+long long value2 = op2->i64;
+
 exp->type = 2;
-exp->string = PrintShort(~op1->s);
+exp->string = PrintInt64((op1->i64 |= value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -7573,10 +8693,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int UShortBitNot(struct Expression * exp, struct Operand * op1)
+static unsigned int UInt64OrAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
+uint64 value2 = op2->ui64;
+
 exp->type = 2;
-exp->string = PrintUShort(~op1->us);
+exp->string = PrintUInt64((op1->ui64 |= value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -7586,10 +8708,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int CharBitNot(struct Expression * exp, struct Operand * op1)
+static unsigned int ShortOrAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
+short value2 = op2->s;
+
 exp->type = 2;
-exp->string = PrintChar(~op1->c);
+exp->string = PrintShort((op1->s |= value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -7599,10 +8723,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int UCharBitNot(struct Expression * exp, struct Operand * op1)
+static unsigned int UShortOrAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
+unsigned short value2 = op2->us;
+
 exp->type = 2;
-exp->string = PrintUChar(~op1->uc);
+exp->string = PrintUShort((op1->us |= value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -7612,12 +8738,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int IntAndAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int CharOrAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
-int value2 = op2->i;
+char value2 = op2->c;
 
 exp->type = 2;
-exp->string = PrintInt(op1->i &= value2);
+exp->string = PrintChar((op1->c |= value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -7627,12 +8753,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int UIntAndAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int UCharOrAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
-unsigned int value2 = op2->ui;
+unsigned char value2 = op2->uc;
 
 exp->type = 2;
-exp->string = PrintUInt(op1->ui &= value2);
+exp->string = PrintUChar((op1->uc |= value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -7642,12 +8768,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int ShortAndAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int IntXorAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
-short value2 = op2->s;
+int value2 = op2->i;
 
 exp->type = 2;
-exp->string = PrintShort(op1->s &= value2);
+exp->string = PrintInt((op1->i ^= value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -7657,12 +8783,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int UShortAndAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int UIntXorAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
-unsigned short value2 = op2->us;
+unsigned int value2 = op2->ui;
 
 exp->type = 2;
-exp->string = PrintUShort(op1->us &= value2);
+exp->string = PrintUInt((op1->ui ^= value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -7672,12 +8798,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int CharAndAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int Int64XorAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
-char value2 = op2->c;
+long long value2 = op2->i64;
 
 exp->type = 2;
-exp->string = PrintChar(op1->c &= value2);
+exp->string = PrintInt64((op1->i64 ^= value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -7687,12 +8813,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int UCharAndAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int UInt64XorAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
-unsigned char value2 = op2->uc;
+uint64 value2 = op2->ui64;
 
 exp->type = 2;
-exp->string = PrintUChar(op1->uc &= value2);
+exp->string = PrintUInt64((op1->ui64 ^= value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -7702,12 +8828,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int IntOrAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int ShortXorAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
-int value2 = op2->i;
+short value2 = op2->s;
 
 exp->type = 2;
-exp->string = PrintInt(op1->i |= value2);
+exp->string = PrintShort((op1->s ^= value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -7717,12 +8843,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int UIntOrAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int UShortXorAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
-unsigned int value2 = op2->ui;
+unsigned short value2 = op2->us;
 
 exp->type = 2;
-exp->string = PrintUInt(op1->ui |= value2);
+exp->string = PrintUShort((op1->us ^= value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -7732,12 +8858,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int ShortOrAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int CharXorAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
-short value2 = op2->s;
+char value2 = op2->c;
 
 exp->type = 2;
-exp->string = PrintShort(op1->s |= value2);
+exp->string = PrintChar((op1->c ^= value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -7747,12 +8873,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int UShortOrAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int UCharXorAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
-unsigned short value2 = op2->us;
+unsigned char value2 = op2->uc;
 
 exp->type = 2;
-exp->string = PrintUShort(op1->us |= value2);
+exp->string = PrintUChar((op1->uc ^= value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -7762,12 +8888,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int CharOrAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int IntLShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
-char value2 = op2->c;
+int value2 = op2->i;
 
 exp->type = 2;
-exp->string = PrintChar(op1->c |= value2);
+exp->string = PrintInt((op1->i <<= value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -7777,12 +8903,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int UCharOrAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int UIntLShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
-unsigned char value2 = op2->uc;
+unsigned int value2 = op2->ui;
 
 exp->type = 2;
-exp->string = PrintUChar(op1->uc |= value2);
+exp->string = PrintUInt((op1->ui <<= value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -7792,12 +8918,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int IntXorAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int Int64LShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
-int value2 = op2->i;
+long long value2 = op2->i64;
 
 exp->type = 2;
-exp->string = PrintInt(op1->i ^= value2);
+exp->string = PrintInt64((op1->i64 <<= value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -7807,12 +8933,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int UIntXorAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int UInt64LShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
-unsigned int value2 = op2->ui;
+uint64 value2 = op2->ui64;
 
 exp->type = 2;
-exp->string = PrintUInt(op1->ui ^= value2);
+exp->string = PrintUInt64((op1->ui64 <<= value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -7822,12 +8948,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int ShortXorAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int ShortLShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
 short value2 = op2->s;
 
 exp->type = 2;
-exp->string = PrintShort(op1->s ^= value2);
+exp->string = PrintShort((op1->s <<= value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -7837,12 +8963,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int UShortXorAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int UShortLShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
 unsigned short value2 = op2->us;
 
 exp->type = 2;
-exp->string = PrintUShort(op1->us ^= value2);
+exp->string = PrintUShort((op1->us <<= value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -7852,12 +8978,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int CharXorAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int CharLShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
 char value2 = op2->c;
 
 exp->type = 2;
-exp->string = PrintChar(op1->c ^= value2);
+exp->string = PrintChar((op1->c <<= value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -7867,12 +8993,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int UCharXorAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int UCharLShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
 unsigned char value2 = op2->uc;
 
 exp->type = 2;
-exp->string = PrintUChar(op1->uc ^= value2);
+exp->string = PrintUChar((op1->uc <<= value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -7882,12 +9008,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int IntLShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int IntRShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
 int value2 = op2->i;
 
 exp->type = 2;
-exp->string = PrintInt(op1->i <<= value2);
+exp->string = PrintInt((op1->i >>= value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -7897,12 +9023,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int UIntLShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int UIntRShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
 unsigned int value2 = op2->ui;
 
 exp->type = 2;
-exp->string = PrintUInt(op1->ui <<= value2);
+exp->string = PrintUInt((op1->ui >>= value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -7912,12 +9038,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int ShortLShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int Int64RShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
-short value2 = op2->s;
+long long value2 = op2->i64;
 
 exp->type = 2;
-exp->string = PrintShort(op1->s <<= value2);
+exp->string = PrintInt64((op1->i64 >>= value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -7927,12 +9053,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int UShortLShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int UInt64RShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
-unsigned short value2 = op2->us;
+uint64 value2 = op2->ui64;
 
 exp->type = 2;
-exp->string = PrintUShort(op1->us <<= value2);
+exp->string = PrintUInt64((op1->ui64 >>= value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -7942,12 +9068,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int CharLShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int ShortRShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
-char value2 = op2->c;
+short value2 = op2->s;
 
 exp->type = 2;
-exp->string = PrintChar(op1->c <<= value2);
+exp->string = PrintShort((op1->s >>= value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -7957,12 +9083,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int UCharLShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int UShortRShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
-unsigned char value2 = op2->uc;
+unsigned short value2 = op2->us;
 
 exp->type = 2;
-exp->string = PrintUChar(op1->uc <<= value2);
+exp->string = PrintUShort((op1->us >>= value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -7972,12 +9098,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int IntRShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int CharRShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
-int value2 = op2->i;
+char value2 = op2->c;
 
 exp->type = 2;
-exp->string = PrintInt(op1->i >>= value2);
+exp->string = PrintChar((op1->c >>= value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -7987,12 +9113,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int UIntRShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int UCharRShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
-unsigned int value2 = op2->ui;
+unsigned char value2 = op2->uc;
 
 exp->type = 2;
-exp->string = PrintUInt(op1->ui >>= value2);
+exp->string = PrintUChar((op1->uc >>= value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -8002,12 +9128,10 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int ShortRShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int IntNot(struct Expression * exp, struct Operand * op1)
 {
-short value2 = op2->s;
-
 exp->type = 2;
-exp->string = PrintShort(op1->s >>= value2);
+exp->string = PrintInt((int)(!op1->i));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -8017,12 +9141,10 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int UShortRShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int UIntNot(struct Expression * exp, struct Operand * op1)
 {
-unsigned short value2 = op2->us;
-
 exp->type = 2;
-exp->string = PrintUShort(op1->us >>= value2);
+exp->string = PrintUInt((unsigned int)(!op1->ui));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -8032,12 +9154,10 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int CharRShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int Int64Not(struct Expression * exp, struct Operand * op1)
 {
-char value2 = op2->c;
-
 exp->type = 2;
-exp->string = PrintChar(op1->c >>= value2);
+exp->string = PrintInt64((long long)(!op1->i64));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -8047,12 +9167,10 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int UCharRShiftAsign(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int UInt64Not(struct Expression * exp, struct Operand * op1)
 {
-unsigned char value2 = op2->uc;
-
 exp->type = 2;
-exp->string = PrintUChar(op1->uc >>= value2);
+exp->string = PrintUInt64((uint64)(!op1->ui64));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -8062,10 +9180,10 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int IntNot(struct Expression * exp, struct Operand * op1)
+static unsigned int ShortNot(struct Expression * exp, struct Operand * op1)
 {
 exp->type = 2;
-exp->string = PrintInt(!op1->i);
+exp->string = PrintShort((short)(!op1->s));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -8075,10 +9193,10 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int UIntNot(struct Expression * exp, struct Operand * op1)
+static unsigned int UShortNot(struct Expression * exp, struct Operand * op1)
 {
 exp->type = 2;
-exp->string = PrintUInt(!op1->ui);
+exp->string = PrintUShort((unsigned short)(!op1->us));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -8088,10 +9206,10 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int ShortNot(struct Expression * exp, struct Operand * op1)
+static unsigned int CharNot(struct Expression * exp, struct Operand * op1)
 {
 exp->type = 2;
-exp->string = PrintShort(!op1->s);
+exp->string = PrintChar((char)(!op1->c));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -8101,10 +9219,10 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int UShortNot(struct Expression * exp, struct Operand * op1)
+static unsigned int UCharNot(struct Expression * exp, struct Operand * op1)
 {
 exp->type = 2;
-exp->string = PrintUShort(!op1->us);
+exp->string = PrintUChar((unsigned char)(!op1->uc));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -8114,10 +9232,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int CharNot(struct Expression * exp, struct Operand * op1)
+static unsigned int IntEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
+int value2 = op2->i;
+
 exp->type = 2;
-exp->string = PrintChar(!op1->c);
+exp->string = PrintInt((int)(op1->i == value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -8127,10 +9247,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int UCharNot(struct Expression * exp, struct Operand * op1)
+static unsigned int UIntEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
+unsigned int value2 = op2->ui;
+
 exp->type = 2;
-exp->string = PrintUChar(!op1->uc);
+exp->string = PrintUInt((unsigned int)(op1->ui == value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -8140,12 +9262,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int IntEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int Int64Equ(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
-int value2 = op2->i;
+long long value2 = op2->i64;
 
 exp->type = 2;
-exp->string = PrintInt(op1->i == value2);
+exp->string = PrintInt64((long long)(op1->i64 == value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -8155,12 +9277,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int UIntEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int UInt64Equ(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
-unsigned int value2 = op2->ui;
+uint64 value2 = op2->ui64;
 
 exp->type = 2;
-exp->string = PrintUInt(op1->ui == value2);
+exp->string = PrintUInt64((uint64)(op1->ui64 == value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -8175,7 +9297,7 @@ static unsigned int ShortEqu(struct Expression * exp, struct Operand * op1, stru
 short value2 = op2->s;
 
 exp->type = 2;
-exp->string = PrintShort(op1->s == value2);
+exp->string = PrintShort((short)(op1->s == value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -8190,7 +9312,7 @@ static unsigned int UShortEqu(struct Expression * exp, struct Operand * op1, str
 unsigned short value2 = op2->us;
 
 exp->type = 2;
-exp->string = PrintUShort(op1->us == value2);
+exp->string = PrintUShort((unsigned short)(op1->us == value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -8205,7 +9327,7 @@ static unsigned int CharEqu(struct Expression * exp, struct Operand * op1, struc
 char value2 = op2->c;
 
 exp->type = 2;
-exp->string = PrintChar(op1->c == value2);
+exp->string = PrintChar((char)(op1->c == value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -8220,7 +9342,7 @@ static unsigned int UCharEqu(struct Expression * exp, struct Operand * op1, stru
 unsigned char value2 = op2->uc;
 
 exp->type = 2;
-exp->string = PrintUChar(op1->uc == value2);
+exp->string = PrintUChar((unsigned char)(op1->uc == value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -8235,7 +9357,7 @@ static unsigned int FloatEqu(struct Expression * exp, struct Operand * op1, stru
 float value2 = op2->f;
 
 exp->type = 2;
-exp->string = PrintFloat(op1->f == value2);
+exp->string = PrintFloat((float)(op1->f == value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -8250,7 +9372,7 @@ static unsigned int DoubleEqu(struct Expression * exp, struct Operand * op1, str
 double value2 = op2->d;
 
 exp->type = 2;
-exp->string = PrintDouble(op1->d == value2);
+exp->string = PrintDouble((double)(op1->d == value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -8265,7 +9387,7 @@ static unsigned int IntNqu(struct Expression * exp, struct Operand * op1, struct
 int value2 = op2->i;
 
 exp->type = 2;
-exp->string = PrintInt(op1->i != value2);
+exp->string = PrintInt((int)(op1->i != value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -8280,7 +9402,37 @@ static unsigned int UIntNqu(struct Expression * exp, struct Operand * op1, struc
 unsigned int value2 = op2->ui;
 
 exp->type = 2;
-exp->string = PrintUInt(op1->ui != value2);
+exp->string = PrintUInt((unsigned int)(op1->ui != value2));
+if(!exp->expType)
+{
+exp->expType = op1->type;
+if(op1->type)
+op1->type->refCount++;
+}
+return 0x1;
+}
+
+static unsigned int Int64Nqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+{
+long long value2 = op2->i64;
+
+exp->type = 2;
+exp->string = PrintInt64((long long)(op1->i64 != value2));
+if(!exp->expType)
+{
+exp->expType = op1->type;
+if(op1->type)
+op1->type->refCount++;
+}
+return 0x1;
+}
+
+static unsigned int UInt64Nqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+{
+uint64 value2 = op2->ui64;
+
+exp->type = 2;
+exp->string = PrintUInt64((uint64)(op1->ui64 != value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -8295,7 +9447,7 @@ static unsigned int ShortNqu(struct Expression * exp, struct Operand * op1, stru
 short value2 = op2->s;
 
 exp->type = 2;
-exp->string = PrintShort(op1->s != value2);
+exp->string = PrintShort((short)(op1->s != value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -8310,7 +9462,7 @@ static unsigned int UShortNqu(struct Expression * exp, struct Operand * op1, str
 unsigned short value2 = op2->us;
 
 exp->type = 2;
-exp->string = PrintUShort(op1->us != value2);
+exp->string = PrintUShort((unsigned short)(op1->us != value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -8325,7 +9477,7 @@ static unsigned int CharNqu(struct Expression * exp, struct Operand * op1, struc
 char value2 = op2->c;
 
 exp->type = 2;
-exp->string = PrintChar(op1->c != value2);
+exp->string = PrintChar((char)(op1->c != value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -8340,7 +9492,7 @@ static unsigned int UCharNqu(struct Expression * exp, struct Operand * op1, stru
 unsigned char value2 = op2->uc;
 
 exp->type = 2;
-exp->string = PrintUChar(op1->uc != value2);
+exp->string = PrintUChar((unsigned char)(op1->uc != value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -8355,7 +9507,7 @@ static unsigned int FloatNqu(struct Expression * exp, struct Operand * op1, stru
 float value2 = op2->f;
 
 exp->type = 2;
-exp->string = PrintFloat(op1->f != value2);
+exp->string = PrintFloat((float)(op1->f != value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -8370,7 +9522,7 @@ static unsigned int DoubleNqu(struct Expression * exp, struct Operand * op1, str
 double value2 = op2->d;
 
 exp->type = 2;
-exp->string = PrintDouble(op1->d != value2);
+exp->string = PrintDouble((double)(op1->d != value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -8385,7 +9537,7 @@ static unsigned int IntAnd(struct Expression * exp, struct Operand * op1, struct
 int value2 = op2->i;
 
 exp->type = 2;
-exp->string = PrintInt(op1->i && value2);
+exp->string = PrintInt((int)(op1->i && value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -8400,7 +9552,37 @@ static unsigned int UIntAnd(struct Expression * exp, struct Operand * op1, struc
 unsigned int value2 = op2->ui;
 
 exp->type = 2;
-exp->string = PrintUInt(op1->ui && value2);
+exp->string = PrintUInt((unsigned int)(op1->ui && value2));
+if(!exp->expType)
+{
+exp->expType = op1->type;
+if(op1->type)
+op1->type->refCount++;
+}
+return 0x1;
+}
+
+static unsigned int Int64And(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+{
+long long value2 = op2->i64;
+
+exp->type = 2;
+exp->string = PrintInt64((long long)(op1->i64 && value2));
+if(!exp->expType)
+{
+exp->expType = op1->type;
+if(op1->type)
+op1->type->refCount++;
+}
+return 0x1;
+}
+
+static unsigned int UInt64And(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+{
+uint64 value2 = op2->ui64;
+
+exp->type = 2;
+exp->string = PrintUInt64((uint64)(op1->ui64 && value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -8415,7 +9597,7 @@ static unsigned int ShortAnd(struct Expression * exp, struct Operand * op1, stru
 short value2 = op2->s;
 
 exp->type = 2;
-exp->string = PrintShort(op1->s && value2);
+exp->string = PrintShort((short)(op1->s && value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -8430,7 +9612,7 @@ static unsigned int UShortAnd(struct Expression * exp, struct Operand * op1, str
 unsigned short value2 = op2->us;
 
 exp->type = 2;
-exp->string = PrintUShort(op1->us && value2);
+exp->string = PrintUShort((unsigned short)(op1->us && value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -8445,7 +9627,7 @@ static unsigned int CharAnd(struct Expression * exp, struct Operand * op1, struc
 char value2 = op2->c;
 
 exp->type = 2;
-exp->string = PrintChar(op1->c && value2);
+exp->string = PrintChar((char)(op1->c && value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -8460,7 +9642,7 @@ static unsigned int UCharAnd(struct Expression * exp, struct Operand * op1, stru
 unsigned char value2 = op2->uc;
 
 exp->type = 2;
-exp->string = PrintUChar(op1->uc && value2);
+exp->string = PrintUChar((unsigned char)(op1->uc && value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -8475,7 +9657,7 @@ static unsigned int FloatAnd(struct Expression * exp, struct Operand * op1, stru
 float value2 = op2->f;
 
 exp->type = 2;
-exp->string = PrintFloat(op1->f && value2);
+exp->string = PrintFloat((float)(op1->f && value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -8490,7 +9672,7 @@ static unsigned int DoubleAnd(struct Expression * exp, struct Operand * op1, str
 double value2 = op2->d;
 
 exp->type = 2;
-exp->string = PrintDouble(op1->d && value2);
+exp->string = PrintDouble((double)(op1->d && value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -8505,7 +9687,7 @@ static unsigned int IntOr(struct Expression * exp, struct Operand * op1, struct
 int value2 = op2->i;
 
 exp->type = 2;
-exp->string = PrintInt(op1->i || value2);
+exp->string = PrintInt((int)(op1->i || value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -8520,7 +9702,37 @@ static unsigned int UIntOr(struct Expression * exp, struct Operand * op1, struct
 unsigned int value2 = op2->ui;
 
 exp->type = 2;
-exp->string = PrintUInt(op1->ui || value2);
+exp->string = PrintUInt((unsigned int)(op1->ui || value2));
+if(!exp->expType)
+{
+exp->expType = op1->type;
+if(op1->type)
+op1->type->refCount++;
+}
+return 0x1;
+}
+
+static unsigned int Int64Or(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+{
+long long value2 = op2->i64;
+
+exp->type = 2;
+exp->string = PrintInt64((long long)(op1->i64 || value2));
+if(!exp->expType)
+{
+exp->expType = op1->type;
+if(op1->type)
+op1->type->refCount++;
+}
+return 0x1;
+}
+
+static unsigned int UInt64Or(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+{
+uint64 value2 = op2->ui64;
+
+exp->type = 2;
+exp->string = PrintUInt64((uint64)(op1->ui64 || value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -8535,7 +9747,7 @@ static unsigned int ShortOr(struct Expression * exp, struct Operand * op1, struc
 short value2 = op2->s;
 
 exp->type = 2;
-exp->string = PrintShort(op1->s || value2);
+exp->string = PrintShort((short)(op1->s || value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -8550,7 +9762,7 @@ static unsigned int UShortOr(struct Expression * exp, struct Operand * op1, stru
 unsigned short value2 = op2->us;
 
 exp->type = 2;
-exp->string = PrintUShort(op1->us || value2);
+exp->string = PrintUShort((unsigned short)(op1->us || value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -8565,7 +9777,7 @@ static unsigned int CharOr(struct Expression * exp, struct Operand * op1, struct
 char value2 = op2->c;
 
 exp->type = 2;
-exp->string = PrintChar(op1->c || value2);
+exp->string = PrintChar((char)(op1->c || value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -8580,7 +9792,7 @@ static unsigned int UCharOr(struct Expression * exp, struct Operand * op1, struc
 unsigned char value2 = op2->uc;
 
 exp->type = 2;
-exp->string = PrintUChar(op1->uc || value2);
+exp->string = PrintUChar((unsigned char)(op1->uc || value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -8595,7 +9807,7 @@ static unsigned int FloatOr(struct Expression * exp, struct Operand * op1, struc
 float value2 = op2->f;
 
 exp->type = 2;
-exp->string = PrintFloat(op1->f || value2);
+exp->string = PrintFloat((float)(op1->f || value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -8610,7 +9822,7 @@ static unsigned int DoubleOr(struct Expression * exp, struct Operand * op1, stru
 double value2 = op2->d;
 
 exp->type = 2;
-exp->string = PrintDouble(op1->d || value2);
+exp->string = PrintDouble((double)(op1->d || value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -8625,7 +9837,7 @@ static unsigned int IntGrt(struct Expression * exp, struct Operand * op1, struct
 int value2 = op2->i;
 
 exp->type = 2;
-exp->string = PrintInt(op1->i > value2);
+exp->string = PrintInt((int)(op1->i > value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -8640,7 +9852,37 @@ static unsigned int UIntGrt(struct Expression * exp, struct Operand * op1, struc
 unsigned int value2 = op2->ui;
 
 exp->type = 2;
-exp->string = PrintUInt(op1->ui > value2);
+exp->string = PrintUInt((unsigned int)(op1->ui > value2));
+if(!exp->expType)
+{
+exp->expType = op1->type;
+if(op1->type)
+op1->type->refCount++;
+}
+return 0x1;
+}
+
+static unsigned int Int64Grt(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+{
+long long value2 = op2->i64;
+
+exp->type = 2;
+exp->string = PrintInt64((long long)(op1->i64 > value2));
+if(!exp->expType)
+{
+exp->expType = op1->type;
+if(op1->type)
+op1->type->refCount++;
+}
+return 0x1;
+}
+
+static unsigned int UInt64Grt(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+{
+uint64 value2 = op2->ui64;
+
+exp->type = 2;
+exp->string = PrintUInt64((uint64)(op1->ui64 > value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -8655,7 +9897,7 @@ static unsigned int ShortGrt(struct Expression * exp, struct Operand * op1, stru
 short value2 = op2->s;
 
 exp->type = 2;
-exp->string = PrintShort(op1->s > value2);
+exp->string = PrintShort((short)(op1->s > value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -8670,7 +9912,7 @@ static unsigned int UShortGrt(struct Expression * exp, struct Operand * op1, str
 unsigned short value2 = op2->us;
 
 exp->type = 2;
-exp->string = PrintUShort(op1->us > value2);
+exp->string = PrintUShort((unsigned short)(op1->us > value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -8685,7 +9927,7 @@ static unsigned int CharGrt(struct Expression * exp, struct Operand * op1, struc
 char value2 = op2->c;
 
 exp->type = 2;
-exp->string = PrintChar(op1->c > value2);
+exp->string = PrintChar((char)(op1->c > value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -8700,7 +9942,7 @@ static unsigned int UCharGrt(struct Expression * exp, struct Operand * op1, stru
 unsigned char value2 = op2->uc;
 
 exp->type = 2;
-exp->string = PrintUChar(op1->uc > value2);
+exp->string = PrintUChar((unsigned char)(op1->uc > value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -8715,7 +9957,7 @@ static unsigned int FloatGrt(struct Expression * exp, struct Operand * op1, stru
 float value2 = op2->f;
 
 exp->type = 2;
-exp->string = PrintFloat(op1->f > value2);
+exp->string = PrintFloat((float)(op1->f > value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -8730,7 +9972,7 @@ static unsigned int DoubleGrt(struct Expression * exp, struct Operand * op1, str
 double value2 = op2->d;
 
 exp->type = 2;
-exp->string = PrintDouble(op1->d > value2);
+exp->string = PrintDouble((double)(op1->d > value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -8745,7 +9987,7 @@ static unsigned int IntSma(struct Expression * exp, struct Operand * op1, struct
 int value2 = op2->i;
 
 exp->type = 2;
-exp->string = PrintInt(op1->i < value2);
+exp->string = PrintInt((int)(op1->i < value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -8760,7 +10002,37 @@ static unsigned int UIntSma(struct Expression * exp, struct Operand * op1, struc
 unsigned int value2 = op2->ui;
 
 exp->type = 2;
-exp->string = PrintUInt(op1->ui < value2);
+exp->string = PrintUInt((unsigned int)(op1->ui < value2));
+if(!exp->expType)
+{
+exp->expType = op1->type;
+if(op1->type)
+op1->type->refCount++;
+}
+return 0x1;
+}
+
+static unsigned int Int64Sma(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+{
+long long value2 = op2->i64;
+
+exp->type = 2;
+exp->string = PrintInt64((long long)(op1->i64 < value2));
+if(!exp->expType)
+{
+exp->expType = op1->type;
+if(op1->type)
+op1->type->refCount++;
+}
+return 0x1;
+}
+
+static unsigned int UInt64Sma(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+{
+uint64 value2 = op2->ui64;
+
+exp->type = 2;
+exp->string = PrintUInt64((uint64)(op1->ui64 < value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -8775,7 +10047,7 @@ static unsigned int ShortSma(struct Expression * exp, struct Operand * op1, stru
 short value2 = op2->s;
 
 exp->type = 2;
-exp->string = PrintShort(op1->s < value2);
+exp->string = PrintShort((short)(op1->s < value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -8790,7 +10062,7 @@ static unsigned int UShortSma(struct Expression * exp, struct Operand * op1, str
 unsigned short value2 = op2->us;
 
 exp->type = 2;
-exp->string = PrintUShort(op1->us < value2);
+exp->string = PrintUShort((unsigned short)(op1->us < value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -8805,7 +10077,7 @@ static unsigned int CharSma(struct Expression * exp, struct Operand * op1, struc
 char value2 = op2->c;
 
 exp->type = 2;
-exp->string = PrintChar(op1->c < value2);
+exp->string = PrintChar((char)(op1->c < value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -8820,7 +10092,7 @@ static unsigned int UCharSma(struct Expression * exp, struct Operand * op1, stru
 unsigned char value2 = op2->uc;
 
 exp->type = 2;
-exp->string = PrintUChar(op1->uc < value2);
+exp->string = PrintUChar((unsigned char)(op1->uc < value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -8835,7 +10107,7 @@ static unsigned int FloatSma(struct Expression * exp, struct Operand * op1, stru
 float value2 = op2->f;
 
 exp->type = 2;
-exp->string = PrintFloat(op1->f < value2);
+exp->string = PrintFloat((float)(op1->f < value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -8850,7 +10122,7 @@ static unsigned int DoubleSma(struct Expression * exp, struct Operand * op1, str
 double value2 = op2->d;
 
 exp->type = 2;
-exp->string = PrintDouble(op1->d < value2);
+exp->string = PrintDouble((double)(op1->d < value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -8865,7 +10137,7 @@ static unsigned int IntGrtEqu(struct Expression * exp, struct Operand * op1, str
 int value2 = op2->i;
 
 exp->type = 2;
-exp->string = PrintInt(op1->i >= value2);
+exp->string = PrintInt((int)(op1->i >= value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -8880,7 +10152,37 @@ static unsigned int UIntGrtEqu(struct Expression * exp, struct Operand * op1, st
 unsigned int value2 = op2->ui;
 
 exp->type = 2;
-exp->string = PrintUInt(op1->ui >= value2);
+exp->string = PrintUInt((unsigned int)(op1->ui >= value2));
+if(!exp->expType)
+{
+exp->expType = op1->type;
+if(op1->type)
+op1->type->refCount++;
+}
+return 0x1;
+}
+
+static unsigned int Int64GrtEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+{
+long long value2 = op2->i64;
+
+exp->type = 2;
+exp->string = PrintInt64((long long)(op1->i64 >= value2));
+if(!exp->expType)
+{
+exp->expType = op1->type;
+if(op1->type)
+op1->type->refCount++;
+}
+return 0x1;
+}
+
+static unsigned int UInt64GrtEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+{
+uint64 value2 = op2->ui64;
+
+exp->type = 2;
+exp->string = PrintUInt64((uint64)(op1->ui64 >= value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -8895,7 +10197,7 @@ static unsigned int ShortGrtEqu(struct Expression * exp, struct Operand * op1, s
 short value2 = op2->s;
 
 exp->type = 2;
-exp->string = PrintShort(op1->s >= value2);
+exp->string = PrintShort((short)(op1->s >= value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -8907,10 +10209,40 @@ return 0x1;
 
 static unsigned int UShortGrtEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
-unsigned short value2 = op2->us;
+unsigned short value2 = op2->us;
+
+exp->type = 2;
+exp->string = PrintUShort((unsigned short)(op1->us >= value2));
+if(!exp->expType)
+{
+exp->expType = op1->type;
+if(op1->type)
+op1->type->refCount++;
+}
+return 0x1;
+}
+
+static unsigned int CharGrtEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+{
+char value2 = op2->c;
+
+exp->type = 2;
+exp->string = PrintChar((char)(op1->c >= value2));
+if(!exp->expType)
+{
+exp->expType = op1->type;
+if(op1->type)
+op1->type->refCount++;
+}
+return 0x1;
+}
+
+static unsigned int UCharGrtEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+{
+unsigned char value2 = op2->uc;
 
 exp->type = 2;
-exp->string = PrintUShort(op1->us >= value2);
+exp->string = PrintUChar((unsigned char)(op1->uc >= value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -8920,12 +10252,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int CharGrtEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int FloatGrtEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
-char value2 = op2->c;
+float value2 = op2->f;
 
 exp->type = 2;
-exp->string = PrintChar(op1->c >= value2);
+exp->string = PrintFloat((float)(op1->f >= value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -8935,12 +10267,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int UCharGrtEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int DoubleGrtEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
-unsigned char value2 = op2->uc;
+double value2 = op2->d;
 
 exp->type = 2;
-exp->string = PrintUChar(op1->uc >= value2);
+exp->string = PrintDouble((double)(op1->d >= value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -8950,12 +10282,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int FloatGrtEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int IntSmaEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
-float value2 = op2->f;
+int value2 = op2->i;
 
 exp->type = 2;
-exp->string = PrintFloat(op1->f >= value2);
+exp->string = PrintInt((int)(op1->i <= value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -8965,12 +10297,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int DoubleGrtEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int UIntSmaEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
-double value2 = op2->d;
+unsigned int value2 = op2->ui;
 
 exp->type = 2;
-exp->string = PrintDouble(op1->d >= value2);
+exp->string = PrintUInt((unsigned int)(op1->ui <= value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -8980,12 +10312,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int IntSmaEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int Int64SmaEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
-int value2 = op2->i;
+long long value2 = op2->i64;
 
 exp->type = 2;
-exp->string = PrintInt(op1->i <= value2);
+exp->string = PrintInt64((long long)(op1->i64 <= value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -8995,12 +10327,12 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int UIntSmaEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
+static unsigned int UInt64SmaEqu(struct Expression * exp, struct Operand * op1, struct Operand * op2)
 {
-unsigned int value2 = op2->ui;
+uint64 value2 = op2->ui64;
 
 exp->type = 2;
-exp->string = PrintUInt(op1->ui <= value2);
+exp->string = PrintUInt64((uint64)(op1->ui64 <= value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -9015,7 +10347,7 @@ static unsigned int ShortSmaEqu(struct Expression * exp, struct Operand * op1, s
 short value2 = op2->s;
 
 exp->type = 2;
-exp->string = PrintShort(op1->s <= value2);
+exp->string = PrintShort((short)(op1->s <= value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -9030,7 +10362,7 @@ static unsigned int UShortSmaEqu(struct Expression * exp, struct Operand * op1,
 unsigned short value2 = op2->us;
 
 exp->type = 2;
-exp->string = PrintUShort(op1->us <= value2);
+exp->string = PrintUShort((unsigned short)(op1->us <= value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -9045,7 +10377,7 @@ static unsigned int CharSmaEqu(struct Expression * exp, struct Operand * op1, st
 char value2 = op2->c;
 
 exp->type = 2;
-exp->string = PrintChar(op1->c <= value2);
+exp->string = PrintChar((char)(op1->c <= value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -9060,7 +10392,7 @@ static unsigned int UCharSmaEqu(struct Expression * exp, struct Operand * op1, s
 unsigned char value2 = op2->uc;
 
 exp->type = 2;
-exp->string = PrintUChar(op1->uc <= value2);
+exp->string = PrintUChar((unsigned char)(op1->uc <= value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -9075,7 +10407,7 @@ static unsigned int FloatSmaEqu(struct Expression * exp, struct Operand * op1, s
 float value2 = op2->f;
 
 exp->type = 2;
-exp->string = PrintFloat(op1->f <= value2);
+exp->string = PrintFloat((float)(op1->f <= value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -9090,7 +10422,7 @@ static unsigned int DoubleSmaEqu(struct Expression * exp, struct Operand * op1,
 double value2 = op2->d;
 
 exp->type = 2;
-exp->string = PrintDouble(op1->d <= value2);
+exp->string = PrintDouble((double)(op1->d <= value2));
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -9126,10 +10458,10 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int ShortCond(struct Expression * exp, struct Operand * op1, struct Operand * op2, struct Operand * op3)
+static unsigned int Int64Cond(struct Expression * exp, struct Operand * op1, struct Operand * op2, struct Operand * op3)
 {
 exp->type = 2;
-exp->string = PrintShort(op1->s ? op2->s : op3->s);
+exp->string = PrintInt64(op1->i64 ? op2->i64 : op3->i64);
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -9139,10 +10471,10 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int UShortCond(struct Expression * exp, struct Operand * op1, struct Operand * op2, struct Operand * op3)
+static unsigned int UInt64Cond(struct Expression * exp, struct Operand * op1, struct Operand * op2, struct Operand * op3)
 {
 exp->type = 2;
-exp->string = PrintUShort(op1->us ? op2->us : op3->us);
+exp->string = PrintUInt64(op1->ui64 ? op2->ui64 : op3->ui64);
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -9152,10 +10484,10 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int CharCond(struct Expression * exp, struct Operand * op1, struct Operand * op2, struct Operand * op3)
+static unsigned int ShortCond(struct Expression * exp, struct Operand * op1, struct Operand * op2, struct Operand * op3)
 {
 exp->type = 2;
-exp->string = PrintChar(op1->c ? op2->c : op3->c);
+exp->string = PrintShort(op1->s ? op2->s : op3->s);
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -9165,10 +10497,10 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int UCharCond(struct Expression * exp, struct Operand * op1, struct Operand * op2, struct Operand * op3)
+static unsigned int UShortCond(struct Expression * exp, struct Operand * op1, struct Operand * op2, struct Operand * op3)
 {
 exp->type = 2;
-exp->string = PrintUChar(op1->uc ? op2->uc : op3->uc);
+exp->string = PrintUShort(op1->us ? op2->us : op3->us);
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -9178,10 +10510,10 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int FloatCond(struct Expression * exp, struct Operand * op1, struct Operand * op2, struct Operand * op3)
+static unsigned int CharCond(struct Expression * exp, struct Operand * op1, struct Operand * op2, struct Operand * op3)
 {
 exp->type = 2;
-exp->string = PrintFloat(op1->f ? op2->f : op3->f);
+exp->string = PrintChar(op1->c ? op2->c : op3->c);
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -9191,10 +10523,10 @@ op1->type->refCount++;
 return 0x1;
 }
 
-static unsigned int DoubleCond(struct Expression * exp, struct Operand * op1, struct Operand * op2, struct Operand * op3)
+static unsigned int UCharCond(struct Expression * exp, struct Operand * op1, struct Operand * op2, struct Operand * op3)
 {
 exp->type = 2;
-exp->string = PrintDouble(op1->d ? op2->d : op3->d);
+exp->string = PrintUChar(op1->uc ? op2->uc : op3->uc);
 if(!exp->expType)
 {
 exp->expType = op1->type;
@@ -9214,6 +10546,16 @@ struct OpTable uintOps =
 UIntAdd, UIntSub, UIntMul, UIntDiv, UIntMod, UIntNeg, UIntInc, UIntDec, UIntAsign, UIntAddAsign, UIntSubAsign, UIntMulAsign, UIntDivAsign, UIntModAsign, UIntBitAnd, UIntBitOr, UIntBitXor, UIntLShift, UIntRShift, UIntBitNot, UIntAndAsign, UIntOrAsign, UIntXorAsign, UIntLShiftAsign, UIntRShiftAsign, UIntNot, UIntEqu, UIntNqu, UIntAnd, UIntOr, UIntGrt, UIntSma, UIntGrtEqu, UIntSmaEqu, UIntCond
 };
 
+struct OpTable int64Ops = 
+{
+Int64Add, Int64Sub, Int64Mul, Int64Div, Int64Mod, Int64Neg, Int64Inc, Int64Dec, Int64Asign, Int64AddAsign, Int64SubAsign, Int64MulAsign, Int64DivAsign, Int64ModAsign, Int64BitAnd, Int64BitOr, Int64BitXor, Int64LShift, Int64RShift, Int64BitNot, Int64AndAsign, Int64OrAsign, Int64XorAsign, Int64LShiftAsign, Int64RShiftAsign, Int64Not, Int64Equ, Int64Nqu, Int64And, Int64Or, Int64Grt, Int64Sma, Int64GrtEqu, Int64SmaEqu, Int64Cond
+};
+
+struct OpTable uint64Ops = 
+{
+UInt64Add, UInt64Sub, UInt64Mul, UInt64Div, UInt64Mod, UInt64Neg, UInt64Inc, UInt64Dec, UInt64Asign, UInt64AddAsign, UInt64SubAsign, UInt64MulAsign, UInt64DivAsign, UInt64ModAsign, UInt64BitAnd, UInt64BitOr, UInt64BitXor, UInt64LShift, UInt64RShift, UInt64BitNot, UInt64AndAsign, UInt64OrAsign, UInt64XorAsign, UInt64LShiftAsign, UInt64RShiftAsign, UInt64Not, UInt64Equ, UInt64Nqu, UInt64And, UInt64Or, UInt64Grt, UInt64Sma, UInt64GrtEqu, UInt64SmaEqu, UInt64Cond
+};
+
 struct OpTable shortOps = 
 {
 ShortAdd, ShortSub, ShortMul, ShortDiv, ShortMod, ShortNeg, ShortInc, ShortDec, ShortAsign, ShortAddAsign, ShortSubAsign, ShortMulAsign, ShortDivAsign, ShortModAsign, ShortBitAnd, ShortBitOr, ShortBitXor, ShortLShift, ShortRShift, ShortBitNot, ShortAndAsign, ShortOrAsign, ShortXorAsign, ShortLShiftAsign, ShortRShiftAsign, ShortNot, ShortEqu, ShortNqu, ShortAnd, ShortOr, ShortGrt, ShortSma, ShortGrtEqu, ShortSmaEqu, ShortCond
@@ -9285,8 +10627,10 @@ break;
 case '\"':
 output[d] = '\"';
 break;
+case '\'':
+output[d] = '\'';
+break;
 default:
-output[d++] = '\\';
 output[d] = ch;
 }
 d++;
@@ -9308,8 +10652,90 @@ output[d++] = ch;
 output[d] = '\0';
 }
 
+int UnescapeString(char * d, char * s, int len)
+{
+int j = 0, k = 0;
+char ch;
+
+while(j < len && (ch = s[j]))
+{
+switch(ch)
+{
+case '\\':
+switch((ch = s[++j]))
+{
+case 'n':
+d[k] = '\n';
+break;
+case 't':
+d[k] = '\t';
+break;
+case 'a':
+d[k] = '\a';
+break;
+case 'b':
+d[k] = '\b';
+break;
+case 'f':
+d[k] = '\f';
+break;
+case 'r':
+d[k] = '\r';
+break;
+case 'v':
+d[k] = '\v';
+break;
+case '\\':
+d[k] = '\\';
+break;
+case '\"':
+d[k] = '\"';
+break;
+case '\'':
+d[k] = '\'';
+break;
+default:
+d[k] = '\\';
+d[k] = ch;
+}
+break;
+default:
+d[k] = ch;
+}
+j++, k++;
+}
+d[k] = '\0';
+return k;
+}
+
+char * OffsetEscapedString(char * s, int len, int offset)
+{
+char ch;
+int j = 0, k = 0;
+
+while(j < len && k < offset && (ch = s[j]))
+{
+if(ch == '\\')
+++j;
+j++, k++;
+}
+return (k == offset) ? s + j : (((void *)0));
+}
+
+extern long long __ecereNameSpace__ecere__com___strtoi64(char *  string, char * *  endString, int base);
+
+extern uint64 __ecereNameSpace__ecere__com___strtoui64(char *  string, char * *  endString, int base);
+
 extern double strtod(char * , char * * );
 
+extern float (* __ecereMethod_float_inf)(void);
+
+extern float (* __ecereMethod_float_nan)(void);
+
+extern double (* __ecereMethod_double_inf)(void);
+
+extern double (* __ecereMethod_double_nan)(void);
+
 struct Operand GetOperand(struct Expression * exp)
 {
 struct Operand op = 
@@ -9329,16 +10755,26 @@ if(!type->_class->registered->dataType)
 type->_class->registered->dataType = ProcessTypeString(type->_class->registered->dataTypeString, 0x0);
 type = type->_class->registered->dataType;
 }
+if(exp->type == 3 && op.kind == 13)
+{
+op.ui64 = (uint64)exp->string;
+op.kind = 13;
+op.ops = uint64Ops;
+}
+else if(exp->isConstant && exp->type == 2)
+{
 op.kind = type->kind;
 op.type = exp->expType;
-if(exp->isConstant && exp->type == 2)
-{
 switch(op.kind)
 {
+case 24:
 case 1:
 {
 if(exp->constant[0] == '\'')
+{
 op.c = exp->constant[1];
+op.ops = charOps;
+}
 else if(type->isSigned)
 {
 op.c = (char)strtol(exp->constant, (((void *)0)), 0);
@@ -9380,43 +10816,74 @@ break;
 case 4:
 if(type->isSigned)
 {
-op.i64 = _strtoi64(exp->constant, (((void *)0)), 0);
-op.ops = intOps;
+op.i64 = __ecereNameSpace__ecere__com___strtoi64(exp->constant, (((void *)0)), 0);
+op.ops = int64Ops;
 }
 else
 {
-op.ui64 = _strtoui64(exp->constant, (((void *)0)), 0);
-op.ops = uintOps;
+op.ui64 = __ecereNameSpace__ecere__com___strtoui64(exp->constant, (((void *)0)), 0);
+op.ops = uint64Ops;
 }
-op.kind = 3;
+op.kind = 4;
 break;
 case 22:
 if(type->isSigned)
 {
-op.iptr = (intptr_t)_strtoi64(exp->constant, (((void *)0)), 0);
-op.ops = intOps;
+op.i64 = __ecereNameSpace__ecere__com___strtoi64(exp->constant, (((void *)0)), 0);
+op.ops = int64Ops;
 }
 else
 {
-op.uiptr = (uintptr_t)_strtoui64(exp->constant, (((void *)0)), 0);
-op.ops = uintOps;
+op.ui64 = __ecereNameSpace__ecere__com___strtoui64(exp->constant, (((void *)0)), 0);
+op.ops = uint64Ops;
 }
-op.kind = 3;
+op.kind = 4;
+break;
+case 23:
+if(type->isSigned)
+{
+op.i64 = __ecereNameSpace__ecere__com___strtoi64(exp->constant, (((void *)0)), 0);
+op.ops = int64Ops;
+}
+else
+{
+op.ui64 = __ecereNameSpace__ecere__com___strtoui64(exp->constant, (((void *)0)), 0);
+op.ops = uint64Ops;
+}
+op.kind = 4;
 break;
 case 6:
+if(!strcmp(exp->constant, "inf"))
+op.f = __ecereMethod_float_inf();
+else if(!strcmp(exp->constant, "-inf"))
+op.f = -__ecereMethod_float_inf();
+else if(!strcmp(exp->constant, "nan"))
+op.f = __ecereMethod_float_nan();
+else if(!strcmp(exp->constant, "-nan"))
+op.f = -__ecereMethod_float_nan();
+else
 op.f = (float)strtod(exp->constant, (((void *)0)));
 op.ops = floatOps;
 break;
 case 7:
+if(!strcmp(exp->constant, "inf"))
+op.d = __ecereMethod_double_inf();
+else if(!strcmp(exp->constant, "-inf"))
+op.d = -__ecereMethod_double_inf();
+else if(!strcmp(exp->constant, "nan"))
+op.d = __ecereMethod_double_nan();
+else if(!strcmp(exp->constant, "-nan"))
+op.d = -__ecereMethod_double_nan();
+else
 op.d = (double)strtod(exp->constant, (((void *)0)));
 op.ops = doubleOps;
 break;
 case 12:
 case 13:
 case 8:
-op.p = (unsigned char *)strtoul(exp->constant, (((void *)0)), 0);
+op.ui64 = __ecereNameSpace__ecere__com___strtoui64(exp->constant, (((void *)0)), 0);
 op.kind = 13;
-op.ops = uintOps;
+op.ops = uint64Ops;
 break;
 }
 }
@@ -9534,8 +11001,15 @@ exp->constant = PrintInt64((long long)*(intptr_t *)ptr);
 exp->type = 2;
 break;
 }
+case 23:
+{
+FreeExpContents(exp);
+exp->constant = PrintInt64((long long)*(intptr_t *)ptr);
+exp->type = 2;
+break;
+}
 default:
-Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString(__thisModule, "Unhandled type populating instance\n", (((void *)0))));
+Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Unhandled type populating instance\n", (((void *)0))));
 }
 }
 ListAdd(memberList, member);
@@ -9554,7 +11028,10 @@ struct __ecereNameSpace__ecere__com__Class * _class = classSym->registered;
 struct __ecereNameSpace__ecere__com__DataMember * dataMember;
 struct __ecereNameSpace__ecere__sys__OldList * memberList = MkList();
 
+if(!inst->members)
 inst->members = MkListOne(MkMembersInitList(memberList));
+else
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Add((&*inst->members), MkMembersInitList(memberList));
 for(dataMember = _class->membersAndProperties.first; dataMember; dataMember = dataMember->next)
 {
 if(!dataMember->isProperty)
@@ -9646,7 +11123,7 @@ exp->type = 2;
 break;
 }
 default:
-Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString(__thisModule, "Unhandled type populating instance\n", (((void *)0))));
+Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Unhandled type populating instance\n", (((void *)0))));
 }
 }
 ListAdd(memberList, member);
@@ -9676,7 +11153,11 @@ if(_class && (_class->type == 1 || _class->type == 0 || _class->type == 5))
 if(inst->data)
 return ;
 if(_class->type == 0 || _class->type == 5)
+{
 inst->data = (unsigned char *)__ecereNameSpace__ecere__com__eInstance_New(_class);
+if(_class->type == 0)
+((struct __ecereNameSpace__ecere__com__Instance *)(char *)((struct __ecereNameSpace__ecere__com__Instance *)inst->data))->_refCount++;
+}
 else
 inst->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize));
 }
@@ -9712,6 +11193,8 @@ else
 {
 dataMember = curMember;
 __ecereNameSpace__ecere__com__eClass_FindDataMemberAndOffset(_class, dataMember->name, &dataMemberOffset, privateModule, (((void *)0)), (((void *)0)));
+if(_class->type == 0)
+dataMemberOffset += _class->base->structSize;
 }
 found = 0x1;
 }
@@ -9741,7 +11224,7 @@ if(dataMember->memberAccess == 1)
 {
 curMember = dataMember;
 curClass = dataMember->_class;
-memcpy(subMemberStack, _subMemberStack, sizeof(int) * _subMemberStackPos);
+memcpy(subMemberStack, _subMemberStack, sizeof(struct __ecereNameSpace__ecere__com__DataMember *) * _subMemberStackPos);
 subMemberStackPos = _subMemberStackPos;
 }
 }
@@ -9751,6 +11234,7 @@ if(found && member->initializer && member->initializer->type == 0)
 {
 struct Expression * value = member->initializer->exp;
 struct Type * type = (((void *)0));
+unsigned int deepMember = 0x0;
 
 if(prop)
 {
@@ -9764,6 +11248,7 @@ type = dataMember->dataType;
 }
 if(ident && ident->next)
 {
+deepMember = 0x1;
 for(ident = ident->next; ident && type; ident = ident->next)
 {
 if(type->kind == 8)
@@ -9801,7 +11286,7 @@ if(type)
 type->refCount++;
 ComputeExpression(value);
 }
-if(value && (_class->type == 1 || _class->type == 0 || _class->type == 5))
+if(!deepMember && type && value && (_class->type == 1 || _class->type == 0 || _class->type == 5))
 {
 if(type->kind == 8)
 {
@@ -9837,6 +11322,11 @@ case 22:
 GetIntPtr(value, (intptr_t *)ptr);
 break;
 }
+case 23:
+{
+GetIntSize(value, (ssize_t *)ptr);
+break;
+}
 case 6:
 {
 GetFloat(value, (float *)ptr);
@@ -9868,11 +11358,19 @@ else if(prop)
 {
 if(value->type == 1 && value->instance->data)
 {
+if(type->kind == 8)
+{
+struct __ecereNameSpace__ecere__com__Class * _class = type->_class->registered;
+
+if(_class && (_class->type != 0 || __ecereNameSpace__ecere__com__eClass_IsDerived(((struct __ecereNameSpace__ecere__com__Instance *)(char *)((struct __ecereNameSpace__ecere__com__Instance *)value->instance->data))->_class, _class)))
+{
 void (* Set)(void *, void *) = (void *)prop->Set;
 
 Set(inst->data, value->instance->data);
 PopulateInstance(inst);
 }
+}
+}
 else if(value->type == 2)
 {
 switch(type->kind)
@@ -9902,14 +11400,21 @@ case 4:
 {
 void (* Set)(void *, long long) = (void *)prop->Set;
 
-Set(inst->data, _strtoi64(value->constant, (((void *)0)), 0));
+Set(inst->data, __ecereNameSpace__ecere__com___strtoi64(value->constant, (((void *)0)), 0));
 break;
 }
 case 22:
 {
 void (* Set)(void *, intptr_t) = (void *)prop->Set;
 
-Set(inst->data, (intptr_t)_strtoi64(value->constant, (((void *)0)), 0));
+Set(inst->data, (intptr_t)__ecereNameSpace__ecere__com___strtoi64(value->constant, (((void *)0)), 0));
+break;
+}
+case 23:
+{
+void (* Set)(void *, ssize_t) = (void *)prop->Set;
+
+Set(inst->data, (ssize_t)__ecereNameSpace__ecere__com___strtoi64(value->constant, (((void *)0)), 0));
 break;
 }
 }
@@ -9919,11 +11424,11 @@ else if(value->type == 3)
 char temp[1024];
 
 ReadString(temp, value->string);
-prop->Set(inst->data, temp);
+((void (*)(void *, void *))(void *)prop->Set)(inst->data, temp);
 }
 }
 }
-else if(_class->type == 3)
+else if(!deepMember && type && _class->type == 3)
 {
 if(prop)
 {
@@ -9966,7 +11471,7 @@ break;
 }
 }
 }
-else if(_class->type == 2)
+else if(!deepMember && type && _class->type == 2)
 {
 if(prop)
 {
@@ -9984,9 +11489,8 @@ else if(dataMember)
 {
 struct __ecereNameSpace__ecere__com__BitMember * bitMember = (struct __ecereNameSpace__ecere__com__BitMember *)dataMember;
 struct Type * type;
-int part = 0;
+uint64 part;
 
-GetInt(value, &part);
 bits = (bits & ~bitMember->mask);
 if(!bitMember->dataType)
 bitMember->dataType = ProcessTypeString(bitMember->dataTypeString, 0x0);
@@ -9999,39 +11503,59 @@ type = type->_class->registered->dataType;
 }
 switch(type->kind)
 {
+case 24:
 case 1:
-if(type->isSigned)
-bits |= ((char)part << bitMember->pos);
-else
-bits |= ((unsigned char)part << bitMember->pos);
+{
+unsigned char v;
+
+type->isSigned ? GetChar(value, &v) : GetUChar(value, &v);
+part = (uint64)v;
 break;
+}
 case 2:
-if(type->isSigned)
-bits |= ((short)part << bitMember->pos);
-else
-bits |= ((unsigned short)part << bitMember->pos);
+{
+unsigned short v;
+
+type->isSigned ? GetShort(value, &v) : GetUShort(value, &v);
+part = (uint64)v;
 break;
+}
 case 3:
 case 5:
-if(type->isSigned)
-bits |= (part << bitMember->pos);
-else
-bits |= ((unsigned int)part << bitMember->pos);
+{
+unsigned int v;
+
+type->isSigned ? GetInt(value, &v) : GetUInt(value, &v);
+part = (uint64)v;
 break;
+}
 case 4:
-if(type->isSigned)
-bits |= ((long long)part << bitMember->pos);
-else
-bits |= ((uint64)part << bitMember->pos);
+{
+uint64 v;
+
+type->isSigned ? GetInt64(value, &v) : GetUInt64(value, &v);
+part = v;
 break;
+}
 case 22:
-if(type->isSigned)
-bits |= ((intptr_t)part << bitMember->pos);
-else
-bits |= ((uintptr_t)part << bitMember->pos);
+{
+intptr_t v;
+
+type->isSigned ? GetIntPtr(value, &v) : GetUIntPtr(value, &v);
+part = (uint64)v;
+break;
+}
+case 23:
+{
+ssize_t v;
+
+type->isSigned ? GetIntSize(value, &v) : GetUIntSize(value, &v);
+part = (uint64)v;
 break;
 }
 }
+bits += part << bitMember->pos;
+}
 }
 }
 else
@@ -10062,6 +11586,53 @@ FreeInstance(inst);
 }
 }
 
+static unsigned int Promote(struct Operand * op, int kind, unsigned int isSigned)
+{
+unsigned int result = 0x0;
+
+switch(kind)
+{
+case 2:
+if(op->kind == 1 || op->kind == 15 || op->kind == 24)
+result = isSigned ? GetOpShort(op, &op->s) : GetOpUShort(op, &op->us);
+break;
+case 3:
+case 5:
+if(op->kind == 1 || op->kind == 2 || op->kind == 15 || op->kind == 24)
+result = isSigned ? GetOpInt(op, &op->i) : GetOpUInt(op, &op->ui);
+break;
+case 4:
+if(op->kind == 1 || op->kind == 2 || op->kind == 3 || op->kind == 4 || op->kind == 5 || op->kind == 6 || op->kind == 7 || op->kind == 13 || op->kind == 15 || op->kind == 22 || op->kind == 23 || op->kind == 24)
+result = isSigned ? GetOpInt64(op, &op->i64) : GetOpUInt64(op, &op->ui64);
+break;
+case 6:
+if(op->kind == 1 || op->kind == 2 || op->kind == 3 || op->kind == 4 || op->kind == 5 || op->kind == 15 || op->kind == 22 || op->kind == 23 || op->kind == 24)
+result = GetOpFloat(op, &op->f);
+break;
+case 7:
+if(op->kind == 1 || op->kind == 2 || op->kind == 3 || op->kind == 4 || op->kind == 5 || op->kind == 6 || op->kind == 15 || op->kind == 22 || op->kind == 23 || op->kind == 24)
+result = GetOpDouble(op, &op->d);
+break;
+case 13:
+if(op->kind == 1 || op->kind == 2 || op->kind == 3 || op->kind == 4 || op->kind == 5 || op->kind == 6 || op->kind == 7 || op->kind == 13 || op->kind == 15 || op->kind == 22 || op->kind == 23 || op->kind == 24)
+result = GetOpUIntPtr(op, &op->ui64);
+break;
+case 15:
+if(op->kind == 1 || op->kind == 2 || op->kind == 3 || op->kind == 4 || op->kind == 5 || op->kind == 6 || op->kind == 7 || op->kind == 13 || op->kind == 15 || op->kind == 22 || op->kind == 23 || op->kind == 24)
+result = isSigned ? GetOpInt(op, &op->i) : GetOpUInt(op, &op->ui);
+break;
+case 22:
+if(op->kind == 1 || op->kind == 2 || op->kind == 3 || op->kind == 5 || op->kind == 15 || op->kind == 24)
+result = isSigned ? GetOpIntPtr(op, &op->i64) : GetOpUIntPtr(op, &op->i64);
+break;
+case 23:
+if(op->kind == 1 || op->kind == 2 || op->kind == 3 || op->kind == 5 || op->kind == 15 || op->kind == 24)
+result = isSigned ? GetOpIntSize(op, &op->ui64) : GetOpUIntSize(op, &op->ui64);
+break;
+}
+return result;
+}
+
 void CallOperator(struct Expression * exp, struct Expression * exp1, struct Expression * exp2, struct Operand * op1, struct Operand * op2)
 {
 if(exp->op.op == SIZEOF)
@@ -10113,6 +11684,13 @@ break;
 }
 else
 {
+if(op1 && op2 && op1->type && op2->type && op1->kind != op2->kind)
+{
+if(Promote(op2, op1->kind, op1->type->isSigned))
+op2->kind = op1->kind, op2->ops = op1->ops;
+else if(Promote(op1, op2->kind, op2->type->isSigned))
+op1->kind = op2->kind, op1->ops = op2->ops;
+}
 switch(exp->op.op)
 {
 case '+':
@@ -10249,6 +11827,8 @@ break;
 }
 }
 
+void PrintTypeNoConst(struct Type * type, char *  string, unsigned int printName, unsigned int fullName);
+
 extern struct Expression * MkExpIdentifier(struct Identifier * id);
 
 void ComputeExpression(struct Expression * exp)
@@ -10282,7 +11862,48 @@ struct Operand op2 =
 };
 
 if(exp->op.exp2)
+{
+struct Expression * e = exp->op.exp2;
+
+while((e->type == 5 || e->type == 32 || e->type == 23) && e->list)
+{
+if(e->type == 5 || e->type == 32 || e->type == 23)
+{
+if(e->type == 23)
+e = (*((struct Statement *)(*e->compound->compound.statements).last)->expressions).last;
+else
+e = (*e->list).last;
+}
+}
+if(exp->op.op == 261 && e && e->expType)
+{
+if(e->type == 3 && e->string)
+{
+char * string = e->string;
+int len = strlen(string);
+char * tmp = __ecereNameSpace__ecere__com__eSystem_New(sizeof(char) * (len - 2 + 1));
+
+len = UnescapeString(tmp, string + 1, len - 2);
+(__ecereNameSpace__ecere__com__eSystem_Delete(tmp), tmp = 0);
+FreeExpContents(exp);
+exp->type = 2;
+exp->constant = PrintUInt(len + 1);
+}
+else
+{
+struct Type * type = e->expType;
+
+type->refCount++;
+FreeExpContents(exp);
+exp->type = 2;
+exp->constant = PrintUInt(ComputeTypeSize(type));
+FreeType(type);
+}
+break;
+}
+else
 ComputeExpression(exp->op.exp2);
+}
 if(exp->op.exp1)
 {
 ComputeExpression(exp->op.exp1);
@@ -10313,7 +11934,7 @@ FreeType(op2.type);
 break;
 }
 case 5:
-case 34:
+case 32:
 {
 struct Expression * e, * n;
 
@@ -10323,11 +11944,15 @@ n = e->next;
 if(!n)
 {
 struct __ecereNameSpace__ecere__sys__OldList * list = exp->list;
+struct Expression * prev = exp->prev;
+struct Expression * next = exp->next;
 
 ComputeExpression(e);
 FreeType(exp->expType);
 FreeType(exp->destType);
 *exp = *e;
+exp->prev = prev;
+exp->next = next;
 ((e ? (__ecereClass_Expression->Destructor ? __ecereClass_Expression->Destructor(e) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(e)) : 0), e = 0);
 (__ecereNameSpace__ecere__com__eSystem_Delete(list), list = 0);
 }
@@ -10353,7 +11978,7 @@ struct __ecereNameSpace__ecere__com__Property * prop = (((void *)0));
 struct __ecereNameSpace__ecere__com__DataMember * member = (((void *)0));
 struct __ecereNameSpace__ecere__com__Class * convertTo = (((void *)0));
 
-if(type->kind == 19 && exp->member.exp->type == 26)
+if(type->kind == 19 && exp->member.exp->type == 24)
 _class = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "ecere::com::Class");
 if(!_class)
 {
@@ -10361,7 +11986,7 @@ char string[256];
 struct Symbol * classSym;
 
 string[0] = '\0';
-PrintType(type, string, 0x0, 0x1);
+PrintTypeNoConst(type, string, 0x0, 0x1);
 classSym = FindClass(string);
 _class = classSym ? classSym->registered : (((void *)0));
 }
@@ -10491,18 +12116,48 @@ Set(exp->instance->data, intValue);
 PopulateInstance(exp->instance);
 break;
 }
-case 22:
+case 22:
+{
+intptr_t intValue;
+void (* Set)(void *, intptr_t) = (void *)prop->Set;
+
+exp->instance = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Instantiation);
+exp->instance->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize));
+exp->instance->_class = MkSpecifierName(_class->fullName);
+exp->instance->loc = exp->loc;
+exp->type = 1;
+GetIntPtr(value, &intValue);
+Set(exp->instance->data, intValue);
+PopulateInstance(exp->instance);
+break;
+}
+case 23:
+{
+ssize_t intValue;
+void (* Set)(void *, ssize_t) = (void *)prop->Set;
+
+exp->instance = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Instantiation);
+exp->instance->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize));
+exp->instance->_class = MkSpecifierName(_class->fullName);
+exp->instance->loc = exp->loc;
+exp->type = 1;
+GetIntSize(value, &intValue);
+Set(exp->instance->data, intValue);
+PopulateInstance(exp->instance);
+break;
+}
+case 6:
 {
-intptr_t intValue;
-void (* Set)(void *, intptr_t) = (void *)prop->Set;
+float floatValue;
+void (* Set)(void *, float) = (void *)prop->Set;
 
 exp->instance = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Instantiation);
 exp->instance->data = __ecereNameSpace__ecere__com__eSystem_New0(sizeof(unsigned char) * (_class->structSize));
 exp->instance->_class = MkSpecifierName(_class->fullName);
 exp->instance->loc = exp->loc;
 exp->type = 1;
-GetIntPtr(value, &intValue);
-Set(exp->instance->data, intValue);
+GetFloat(value, &floatValue);
+Set(exp->instance->data, floatValue);
 PopulateInstance(exp->instance);
 break;
 }
@@ -10666,6 +12321,7 @@ char className[1024];
 strcpy(className, "__ecereClass_");
 FullClassNameCat(className, classSym->string, 0x1);
 MangleClassName(className);
+DeclareClass(classSym, className);
 FreeExpContents(exp);
 exp->type = 9;
 exp->member.exp = MkExpIdentifier(MkIdentifier(className));
@@ -10701,124 +12357,173 @@ type = _class->dataType;
 }
 switch(type->kind)
 {
+case 24:
 case 1:
 if(type->isSigned)
 {
-char value;
+char value = (char)0;
 
-GetChar(e, &value);
+if(GetChar(e, &value))
+{
 FreeExpContents(exp);
 exp->constant = PrintChar(value);
 exp->type = 2;
 }
+}
 else
 {
-unsigned char value;
+unsigned char value = (unsigned char)0;
 
-GetUChar(e, &value);
+if(GetUChar(e, &value))
+{
 FreeExpContents(exp);
 exp->constant = PrintUChar(value);
 exp->type = 2;
 }
+}
 break;
 case 2:
 if(type->isSigned)
 {
-short value;
+short value = (short)0;
 
-GetShort(e, &value);
+if(GetShort(e, &value))
+{
 FreeExpContents(exp);
 exp->constant = PrintShort(value);
 exp->type = 2;
 }
+}
 else
 {
-unsigned short value;
+unsigned short value = (unsigned short)0;
 
-GetUShort(e, &value);
+if(GetUShort(e, &value))
+{
 FreeExpContents(exp);
 exp->constant = PrintUShort(value);
 exp->type = 2;
 }
+}
 break;
 case 3:
 if(type->isSigned)
 {
-int value;
+int value = 0;
 
-GetInt(e, &value);
+if(GetInt(e, &value))
+{
 FreeExpContents(exp);
 exp->constant = PrintInt(value);
 exp->type = 2;
 }
+}
 else
 {
-unsigned int value;
+unsigned int value = 0;
 
-GetUInt(e, &value);
+if(GetUInt(e, &value))
+{
 FreeExpContents(exp);
 exp->constant = PrintUInt(value);
 exp->type = 2;
 }
+}
 break;
 case 4:
 if(type->isSigned)
 {
-long long value;
+long long value = 0;
 
-GetInt64(e, &value);
+if(GetInt64(e, &value))
+{
 FreeExpContents(exp);
 exp->constant = PrintInt64(value);
 exp->type = 2;
 }
+}
 else
 {
-uint64 value;
+uint64 value = 0;
 
-GetUInt64(e, &value);
+if(GetUInt64(e, &value))
+{
 FreeExpContents(exp);
 exp->constant = PrintUInt64(value);
 exp->type = 2;
 }
+}
 break;
 case 22:
 if(type->isSigned)
 {
-intptr_t value;
+intptr_t value = 0;
+
+if(GetIntPtr(e, &value))
+{
+FreeExpContents(exp);
+exp->constant = PrintInt64((long long)value);
+exp->type = 2;
+}
+}
+else
+{
+uintptr_t value = 0;
+
+if(GetUIntPtr(e, &value))
+{
+FreeExpContents(exp);
+exp->constant = PrintUInt64((uint64)value);
+exp->type = 2;
+}
+}
+break;
+case 23:
+if(type->isSigned)
+{
+ssize_t value = 0;
 
-GetIntPtr(e, &value);
+if(GetIntSize(e, &value))
+{
 FreeExpContents(exp);
 exp->constant = PrintInt64((long long)value);
 exp->type = 2;
 }
+}
 else
 {
-uintptr_t value;
+size_t value = 0;
 
-GetUIntPtr(e, &value);
+if(GetUIntSize(e, &value))
+{
 FreeExpContents(exp);
 exp->constant = PrintUInt64((uint64)value);
 exp->type = 2;
 }
+}
 break;
 case 6:
 {
-float value;
+float value = 0;
 
-GetFloat(e, &value);
+if(GetFloat(e, &value))
+{
 FreeExpContents(exp);
 exp->constant = PrintFloat(value);
 exp->type = 2;
+}
 break;
 }
 case 7:
 {
-double value;
+double value = 0;
 
-GetDouble(e, &value);
+if(GetDouble(e, &value))
+{
 FreeExpContents(exp);
 exp->constant = PrintDouble(value);
 exp->type = 2;
+}
 break;
 }
 }
@@ -10912,6 +12617,8 @@ struct Expression * newExp = __ecereNameSpace__ecere__com__eInstance_New(__ecere
 int objectType = exp->expType ? exp->expType->classObjectType : 0;
 
 *newExp = *exp;
+newExp->prev = (((void *)0));
+newExp->next = (((void *)0));
 newExp->destType = (((void *)0));
 if(convert->isGet)
 {
@@ -11036,7 +12743,7 @@ context = PushContext();
 ListAdd(unionDefs, MkClassDefDeclaration(MkStructDeclaration(MkListOne(MkSpecifier(DOUBLE)), MkListOne(MkDeclaratorIdentifier(MkIdentifier("d"))), (((void *)0)))));
 ListAdd(unionDefs, MkClassDefDeclaration(MkStructDeclaration(MkListOne(MkSpecifierName("uint64")), MkListOne(MkDeclaratorIdentifier(MkIdentifier("i"))), (((void *)0)))));
 specs = MkListOne(MkStructOrUnion(4, (((void *)0)), unionDefs));
-exp->type = 25;
+exp->type = 23;
 exp->compound = MkCompoundStmt(MkListOne(MkDeclaration(specs, MkListOne(MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier("__internal_union")), (((void *)0)))))), statements);
 ListAdd(statements, MkExpressionStmt(MkListOne(MkExpOp(MkExpMember(MkExpIdentifier(MkIdentifier("__internal_union")), MkIdentifier("d")), '=', newExp))));
 ListAdd(statements, MkExpressionStmt(MkListOne(MkExpMember(MkExpIdentifier(MkIdentifier("__internal_union")), MkIdentifier("i")))));
@@ -11085,7 +12792,7 @@ context = PushContext();
 ListAdd(unionDefs, MkClassDefDeclaration(MkStructDeclaration(MkListOne(MkSpecifier(DOUBLE)), MkListOne(MkDeclaratorIdentifier(MkIdentifier("d"))), (((void *)0)))));
 ListAdd(unionDefs, MkClassDefDeclaration(MkStructDeclaration(MkListOne(MkSpecifierName("uint64")), MkListOne(MkDeclaratorIdentifier(MkIdentifier("i"))), (((void *)0)))));
 specs = MkListOne(MkStructOrUnion(4, (((void *)0)), unionDefs));
-exp->type = 25;
+exp->type = 23;
 exp->compound = MkCompoundStmt(MkListOne(MkDeclaration(specs, MkListOne(MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier("__internal_union")), (((void *)0)))))), statements);
 ListAdd(statements, MkExpressionStmt(MkListOne(MkExpOp(MkExpMember(MkExpIdentifier(MkIdentifier("__internal_union")), MkIdentifier("i")), '=', newExp))));
 ListAdd(statements, MkExpressionStmt(MkListOne(MkExpMember(MkExpIdentifier(MkIdentifier("__internal_union")), MkIdentifier("d")))));
@@ -11152,7 +12859,7 @@ break;
 }
 }
 
-extern int strncmp(const char * , const char * , int n);
+extern int strncmp(const char * , const char * , size_t n);
 
 struct __ecereNameSpace__ecere__sys__BTNode * __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_FindPrefix(struct __ecereNameSpace__ecere__sys__BinaryTree * this, char *  key);
 
@@ -11284,7 +12991,7 @@ return symbol;
 
 static void GetTypeSpecs(struct Type * type, struct __ecereNameSpace__ecere__sys__OldList * specs)
 {
-if(!type->isSigned && type->kind != 22)
+if(!type->isSigned && type->kind != 22 && type->kind != 23)
 ListAdd(specs, MkSpecifier(UNSIGNED));
 switch(type->kind)
 {
@@ -11307,6 +13014,9 @@ break;
 case 1:
 ListAdd(specs, MkSpecifier(CHAR));
 break;
+case 24:
+ListAdd(specs, MkSpecifier(_BOOL));
+break;
 case 2:
 ListAdd(specs, MkSpecifier(SHORT));
 break;
@@ -11316,6 +13026,9 @@ break;
 case 22:
 ListAdd(specs, MkSpecifierName(type->isSigned ? "intptr" : "uintptr"));
 break;
+case 23:
+ListAdd(specs, MkSpecifierName(type->isSigned ? "intsize" : "uintsize"));
+break;
 case 3:
 default:
 ListAdd(specs, MkSpecifier(INT));
@@ -11323,36 +13036,43 @@ break;
 }
 }
 
-extern char *  __ecereNameSpace__ecere__sys__RSearchString(char *  buffer, char *  subStr, int maxLen, unsigned int matchCase, unsigned int matchWord);
+static void PrintArraySize(struct Type * arrayType, char * string)
+{
+char size[256];
+
+size[0] = '\0';
+strcat(size, "[");
+if(arrayType->enumClass)
+strcat(size, arrayType->enumClass->string);
+else if(arrayType->arraySizeExp)
+PrintExpression(arrayType->arraySizeExp, size);
+strcat(size, "]");
+strcat(string, size);
+}
 
-static void _PrintType(struct Type * type, char * string, unsigned int printName, unsigned int printFunction, unsigned int fullName)
+static void PrintTypeSpecs(struct Type * type, char * string, unsigned int fullName, unsigned int printConst)
 {
 if(type)
 {
+if(printConst && type->constant)
+strcat(string, "const ");
 switch(type->kind)
 {
 case 8:
-if(type->_class && type->_class->string)
 {
+struct Symbol * c = type->_class;
+
 if(type->classObjectType == 2)
 strcat(string, "typed_object");
-else if(fullName)
-strcat(string, type->_class->string);
-else
-{
-if(type->_class->registered)
-strcat(string, type->_class->registered->name);
+else if(type->classObjectType == 3)
+strcat(string, "any_object");
 else
-strcat(string, type->_class->string);
-}
-}
-break;
-case 13:
 {
-{
-_PrintType(type->type, string, 0x0, printFunction, fullName);
-strcat(string, " *");
+if(c && c->string)
+strcat(string, (fullName || !c->registered) ? c->string : c->registered->name);
 }
+if(type->byReference)
+strcat(string, " &");
 break;
 }
 case 0:
@@ -11367,9 +13087,15 @@ break;
 case 22:
 strcat(string, type->isSigned ? "intptr" : "uintptr");
 break;
+case 23:
+strcat(string, type->isSigned ? "intsize" : "uintsize");
+break;
 case 1:
 strcat(string, type->isSigned ? "char" : "byte");
 break;
+case 24:
+strcat(string, "_Bool");
+break;
 case 2:
 strcat(string, type->isSigned ? "short" : "uint16");
 break;
@@ -11386,14 +13112,12 @@ strcat(string, "struct ");
 strcat(string, type->enumName);
 }
 else if(type->typeName)
-{
 strcat(string, type->typeName);
-}
 else
 {
 struct Type * member;
 
-strcat(string, "struct {");
+strcat(string, "struct { ");
 for(member = type->members.first; member; member = member->next)
 {
 PrintType(member, string, 0x1, fullName);
@@ -11409,9 +13133,7 @@ strcat(string, "union ");
 strcat(string, type->enumName);
 }
 else if(type->typeName)
-{
 strcat(string, type->typeName);
-}
 else
 {
 strcat(string, "union ");
@@ -11425,24 +13147,36 @@ strcat(string, "enum ");
 strcat(string, type->enumName);
 }
 else if(type->typeName)
-{
 strcat(string, type->typeName);
-}
 else
-strcat(string, "enum");
+strcat(string, "int");
 break;
-case 11:
-{
-if(printFunction)
-{
-if(type->dllExport)
-strcat(string, "dllexport ");
-PrintType(type->returnType, string, 0x0, fullName);
-strcat(string, " ");
+case 14:
+strcat(string, "...");
+break;
+case 19:
+strcat(string, "subclass(");
+strcat(string, type->_class ? type->_class->string : "int");
+strcat(string, ")");
+break;
+case 20:
+strcat(string, type->templateParameter->identifier->string);
+break;
+case 21:
+strcat(string, "thisclass");
+break;
+case 17:
+strcat(string, "__builtin_va_list");
+break;
+}
 }
-if(printName)
+}
+
+extern char *  __ecereNameSpace__ecere__sys__RSearchString(char *  buffer, char *  subStr, int maxLen, unsigned int matchCase, unsigned int matchWord);
+
+static void PrintName(struct Type * type, char * string, unsigned int fullName)
 {
-if(type->name)
+if(type->name && type->name[0])
 {
 if(fullName)
 strcat(string, type->name);
@@ -11458,92 +13192,62 @@ strcat(string, name);
 }
 }
 }
-if(printFunction)
-{
-struct Type * param;
 
-strcat(string, "(");
-for(param = type->params.first; param; param = param->next)
+static void PrintAttribs(struct Type * type, char * string)
 {
-PrintType(param, string, 0x1, fullName);
-if(param->next)
-strcat(string, ", ");
-}
-strcat(string, ")");
+if(type)
+{
+if(type->dllExport)
+strcat(string, "dllexport ");
+if(type->attrStdcall)
+strcat(string, "stdcall ");
 }
-break;
 }
-case 12:
+
+static void PrePrintType(struct Type * type, char * string, unsigned int fullName, struct Type * parentType, unsigned int printConst)
 {
+if(type->kind == 12 || type->kind == 13 || type->kind == 11 || type->kind == 16)
 {
-char baseType[1024], size[256];
-struct Type * arrayType = type;
+struct Type * attrType = (((void *)0));
 
-baseType[0] = '\0';
-size[0] = '\0';
-while(arrayType->kind == 12)
+if((type->kind == 11 || type->kind == 16) && (!parentType || parentType->kind != 13))
+PrintAttribs(type, string);
+if(printConst && type->constant && (type->kind == 11 || type->kind == 16))
+strcat(string, " const");
+PrePrintType(type->kind == 16 ? type->method->dataType : type->type, string, fullName, type, printConst);
+if(type->kind == 13 && (type->type->kind == 12 || type->type->kind == 11 || type->type->kind == 16))
+strcat(string, " (");
+if(type->kind == 13)
 {
-strcat(size, "[");
-if(arrayType->enumClass)
-strcat(size, arrayType->enumClass->string);
-else if(arrayType->arraySizeExp)
-PrintExpression(arrayType->arraySizeExp, size);
-strcat(size, "]");
-arrayType = arrayType->arrayType;
-}
-_PrintType(arrayType, baseType, printName, printFunction, fullName);
-strcat(string, baseType);
-strcat(string, size);
-}
-printName = 0x0;
-break;
-}
-case 14:
-strcat(string, "...");
-break;
-case 16:
-_PrintType(type->method->dataType, string, 0x0, printFunction, fullName);
-break;
-case 19:
-strcat(string, "subclass(");
-strcat(string, type->_class ? type->_class->string : "int");
-strcat(string, ")");
-break;
-case 20:
-strcat(string, type->templateParameter->identifier->string);
-break;
-case 21:
-strcat(string, "thisclass");
-break;
-case 17:
-strcat(string, "__builtin_va_list");
-break;
+if(type->type->kind == 11 || type->type->kind == 16)
+PrintAttribs(type->type, string);
 }
-if(type->name && printName && type->kind != 11 && (type->kind != 13 || type->type->kind != 11))
+if(type->kind == 13)
 {
-strcat(string, " ");
-strcat(string, type->name);
+if(type->type->kind == 11 || type->type->kind == 16 || type->type->kind == 12)
+strcat(string, "*");
+else
+strcat(string, " *");
 }
+if(printConst && type->constant && type->kind == 13)
+strcat(string, " const");
 }
+else
+PrintTypeSpecs(type, string, fullName, printConst);
 }
 
-void PrintType(struct Type * type, char * string, unsigned int printName, unsigned int fullName)
+static void PostPrintType(struct Type * type, char * string, unsigned int fullName)
 {
-struct Type * funcType;
-
-for(funcType = type; funcType && (funcType->kind == 13 || funcType->kind == 12); funcType = funcType->type)
-;
-if(funcType && funcType->kind == 11 && type != funcType)
+if(type->kind == 13 && (type->type->kind == 12 || type->type->kind == 11 || type->type->kind == 16))
+strcat(string, ")");
+if(type->kind == 12)
+PrintArraySize(type, string);
+else if(type->kind == 11)
 {
-char typeString[1024];
 struct Type * param;
 
-PrintType(funcType->returnType, string, 0x0, fullName);
-strcat(string, "(");
-_PrintType(type, string, printName, 0x0, fullName);
-strcat(string, ")");
 strcat(string, "(");
-for(param = funcType->params.first; param; param = param->next)
+for(param = type->params.first; param; param = param->next)
 {
 PrintType(param, string, 0x1, fullName);
 if(param->next)
@@ -11551,8 +13255,48 @@ strcat(string, ", ");
 }
 strcat(string, ")");
 }
+if(type->kind == 12 || type->kind == 13 || type->kind == 11 || type->kind == 16)
+PostPrintType(type->kind == 16 ? type->method->dataType : type->type, string, fullName);
+}
+
+static void _PrintType(struct Type * type, char * string, unsigned int printName, unsigned int fullName, unsigned int printConst)
+{
+PrePrintType(type, string, fullName, (((void *)0)), printConst);
+if(type->thisClass || (printName && type->name && type->name[0]))
+strcat(string, " ");
+if((type->thisClass || type->staticMethod))
+{
+struct Symbol * _class = type->thisClass;
+
+if((type->classObjectType == 2 || type->classObjectType == 1) || (_class && !strcmp(_class->string, "class")))
+{
+if(type->classObjectType == 1)
+strcat(string, "class");
+else
+strcat(string, type->byReference ? "typed_object&" : "typed_object");
+}
+else if(_class && _class->string)
+{
+char * s = _class->string;
+
+if(fullName)
+strcat(string, s);
+else
+{
+char * name = __ecereNameSpace__ecere__sys__RSearchString(s, "::", strlen(s), 0x1, 0x0);
+
+if(name)
+name += 2;
 else
-_PrintType(type, string, printName, 0x1, fullName);
+name = s;
+strcat(string, name);
+}
+}
+strcat(string, "::");
+}
+if(printName && type->name)
+PrintName(type, string, fullName);
+PostPrintType(type, string, fullName);
 if(type->bitFieldCount)
 {
 char count[100];
@@ -11562,6 +13306,16 @@ strcat(string, count);
 }
 }
 
+void PrintType(struct Type * type, char * string, unsigned int printName, unsigned int fullName)
+{
+_PrintType(type, string, printName, fullName, 0x1);
+}
+
+void PrintTypeNoConst(struct Type * type, char * string, unsigned int printName, unsigned int fullName)
+{
+_PrintType(type, string, printName, fullName, 0x0);
+}
+
 static struct Type * FindMember(struct Type * type, char * string)
 {
 struct Type * memberType;
@@ -11606,15 +13360,33 @@ return memberType;
 return (((void *)0));
 }
 
+extern unsigned int parseError;
+
+unsigned int GetParseError()
+{
+return parseError;
+}
+
 extern struct __ecereNameSpace__ecere__com__Instance * fileInput;
 
 int __ecereVMethodID___ecereNameSpace__ecere__sys__File_Write;
 
+extern struct __ecereNameSpace__ecere__com__Class * __ecereClass___ecereNameSpace__ecere__sys__File;
+
 struct Expression * ParseExpressionString(char * expression)
 {
+parseError = 0x0;
 fileInput = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass___ecereNameSpace__ecere__sys__TempFile);
-((int (*)(struct __ecereNameSpace__ecere__com__Instance *, void *  buffer, unsigned int size, unsigned int count))fileInput->_vTbl[__ecereVMethodID___ecereNameSpace__ecere__sys__File_Write])(fileInput, expression, 1, strlen(expression));
-((unsigned int (*)(struct __ecereNameSpace__ecere__com__Instance *, int pos, int mode))fileInput->_vTbl[__ecereVMethodID___ecereNameSpace__ecere__sys__File_Seek])(fileInput, 0, 0);
+((int (*)(struct __ecereNameSpace__ecere__com__Instance *, void *  buffer, unsigned int size, unsigned int count))__extension__ ({
+struct __ecereNameSpace__ecere__com__Instance * __internal_ClassInst = fileInput;
+
+__internal_ClassInst ? __internal_ClassInst->_vTbl : __ecereClass___ecereNameSpace__ecere__sys__File->_vTbl;
+})[__ecereVMethodID___ecereNameSpace__ecere__sys__File_Write])(fileInput, expression, 1, strlen(expression));
+((unsigned int (*)(struct __ecereNameSpace__ecere__com__Instance *, int pos, int mode))__extension__ ({
+struct __ecereNameSpace__ecere__com__Instance * __internal_ClassInst = fileInput;
+
+__internal_ClassInst ? __internal_ClassInst->_vTbl : __ecereClass___ecereNameSpace__ecere__sys__File->_vTbl;
+})[__ecereVMethodID___ecereNameSpace__ecere__sys__File_Seek])(fileInput, 0, 0);
 echoOn = 0x0;
 parsedExpression = (((void *)0));
 resetScanner();
@@ -11627,7 +13399,6 @@ extern char *  QMkString(char *  source);
 
 static unsigned int ResolveIdWithClass(struct Expression * exp, struct __ecereNameSpace__ecere__com__Class * _class, unsigned int skipIDClassCheck)
 {
-void * __ecereTemp1;
 struct Identifier * id = exp->identifier;
 struct __ecereNameSpace__ecere__com__Method * method = (((void *)0));
 struct __ecereNameSpace__ecere__com__Property * prop = (((void *)0));
@@ -11660,9 +13431,9 @@ FreeExpContents(exp);
 exp->type = 2;
 exp->isConstant = 0x1;
 if(!strcmp(baseClass->dataTypeString, "int"))
-sprintf(constant, "%d", value->data);
+sprintf(constant, "%d", (int)value->data);
 else
-sprintf(constant, "0x%X", value->data);
+sprintf(constant, "0x%X", (int)value->data);
 exp->constant = __ecereNameSpace__ecere__sys__CopyString(constant);
 exp->expType = MkClassType(baseClass->fullName);
 break;
@@ -11675,7 +13446,11 @@ return 0x1;
 if((method = __ecereNameSpace__ecere__com__eClass_FindMethod(_class, id->string, privateModule)))
 {
 ProcessMethodType(method);
-exp->expType = (__ecereTemp1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type), ((struct Type *)__ecereTemp1)->refCount = 1, ((struct Type *)__ecereTemp1)->kind = 16, ((struct Type *)__ecereTemp1)->method = method, ((struct Type *)__ecereTemp1)->methodClass = (skipIDClassCheck || (id && id->_class)) ? _class : (((void *)0)), ((struct Type *)__ecereTemp1));
+exp->expType = __extension__ ({
+struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
+
+__ecereInstance1->refCount = 1, __ecereInstance1->kind = 16, __ecereInstance1->method = method, __ecereInstance1->methodClass = (skipIDClassCheck || (id && id->_class)) ? _class : (((void *)0)), __ecereInstance1;
+});
 return 0x1;
 }
 else if((prop = __ecereNameSpace__ecere__com__eClass_FindProperty(_class, id->string, privateModule)))
@@ -11714,7 +13489,7 @@ else
 char constant[256];
 
 exp->type = 2;
-sprintf(constant, "%d", classProp->Get(_class));
+sprintf(constant, "%d", (int)classProp->Get(_class));
 exp->constant = __ecereNameSpace__ecere__sys__CopyString(constant);
 }
 }
@@ -11749,7 +13524,7 @@ return data;
 
 extern struct __ecereNameSpace__ecere__com__NameSpace *  globalData;
 
-extern char *  strncpy(char * , const char * , int n);
+extern char *  strncpy(char * , const char * , size_t n);
 
 static struct GlobalData * FindGlobalData(char * name)
 {
@@ -11830,22 +13605,22 @@ else
 char string[1024] = "";
 struct Symbol * classSym;
 
-PrintType(type, string, 0x0, 0x1);
+PrintTypeNoConst(type, string, 0x0, 0x1);
 classSym = FindClass(string);
 if(classSym)
 _class = classSym->registered;
 }
-if((_class && (_class->type == 4 || _class->type == 3 || _class->type == 2 || _class->type == 1000) && strcmp(_class->fullName, "class") && strcmp(_class->fullName, "ecere::com::Class")) || (!e->expType->classObjectType && (((type->kind != 13 && type->kind != 19 && (type->kind != 8 || !type->_class || !type->_class->registered || type->_class->registered->type == 1))) || destType->byReference)))
+if((_class && (_class->type == 4 || _class->type == 3 || _class->type == 2 || _class->type == 1000) && strcmp(_class->fullName, "class") && strcmp(_class->fullName, "uintptr") && strcmp(_class->fullName, "intptr")) || (!e->expType->classObjectType && (((type->kind != 13 && type->kind != 22 && type->kind != 19 && (type->kind != 8 || !type->_class || !type->_class->registered || type->_class->registered->type == 1))) || destType->byReference)))
 {
 if(!_class || strcmp(_class->fullName, "char *"))
 {
 struct Expression * checkedExp = e, * newExp;
 
-while(((checkedExp->type == 5 || checkedExp->type == 34 || checkedExp->type == 25) && checkedExp->list) || checkedExp->type == 11)
+while(((checkedExp->type == 5 || checkedExp->type == 32 || checkedExp->type == 23) && checkedExp->list) || checkedExp->type == 11)
 {
-if(checkedExp->type == 5 || checkedExp->type == 34 || checkedExp->type == 25)
+if(checkedExp->type == 5 || checkedExp->type == 32 || checkedExp->type == 23)
 {
-if(checkedExp->type == 25)
+if(checkedExp->type == 23)
 {
 checkedExp = (*((struct Statement *)(*checkedExp->compound->compound.statements).last)->expressions).last;
 }
@@ -11891,16 +13666,16 @@ typeString[0] = '\0';
 newExp->prev = (((void *)0));
 newExp->next = (((void *)0));
 newExp->expType = (((void *)0));
-PrintType(e->expType, typeString, 0x0, 0x1);
+PrintTypeNoConst(e->expType, typeString, 0x0, 0x1);
 decl = SpecDeclFromString(typeString, specs, (((void *)0)));
 newExp->destType = ProcessType(specs, decl);
 curContext = context;
-e->type = 25;
 if(curCompound)
 {
 char name[100];
 struct __ecereNameSpace__ecere__sys__OldList * stmts = MkList();
 
+e->type = 23;
 sprintf(name, "__internalValue%03X", internalValueCounter++);
 if(!curCompound->compound.declarations)
 curCompound->compound.declarations = MkList();
@@ -11926,11 +13701,11 @@ curContext = context->parent;
 }
 }
 checkedExp = e;
-while(((checkedExp->type == 5 || checkedExp->type == 34 || checkedExp->type == 25) && checkedExp->list) || checkedExp->type == 11)
+while(((checkedExp->type == 5 || checkedExp->type == 32 || checkedExp->type == 23) && checkedExp->list) || checkedExp->type == 11)
 {
-if(checkedExp->type == 5 || checkedExp->type == 34 || checkedExp->type == 25)
+if(checkedExp->type == 5 || checkedExp->type == 32 || checkedExp->type == 23)
 {
-if(checkedExp->type == 25)
+if(checkedExp->type == 23)
 {
 checkedExp = (*((struct Statement *)(*checkedExp->compound->compound.statements).last)->expressions).last;
 }
@@ -11961,7 +13736,7 @@ checkedExp->op.exp2 = operand;
 }
 if((!destType || destType->kind == 14 || destType->kind == 0) && e->expType && (e->expType->classObjectType == 3 || e->expType->classObjectType == 2) && (e->expType->byReference || (e->expType->kind == 8 && e->expType->_class && e->expType->_class->registered && (e->expType->_class->registered->type == 2 || e->expType->_class->registered->type == 4 || e->expType->_class->registered->type == 3))))
 {
-if(e->expType->kind == 8 && e->expType->_class && e->expType->_class->registered && !strcmp(e->expType->_class->registered->name, "class"))
+if(e->expType->classObjectType && destType && destType->classObjectType)
 {
 return ;
 }
@@ -11974,7 +13749,7 @@ thisExp->prev = (((void *)0));
 thisExp->next = (((void *)0));
 __ecereMethod_Expression_Clear(e);
 e->type = 5;
-e->list = MkListOne(MkExpOp((((void *)0)), '*', MkExpBrackets(MkListOne(thisExp))));
+e->list = MkListOne(MkExpOp((((void *)0)), '*', thisExp->type == 0 ? thisExp : MkExpBrackets(MkListOne(thisExp))));
 if(thisExp->expType->kind == 8 && thisExp->expType->_class && thisExp->expType->_class->registered && thisExp->expType->_class->registered->type == 5)
 ((struct Expression *)(*e->list).first)->byReference = 0x1;
 {
@@ -11993,7 +13768,7 @@ else if(destType && e->expType && (e->expType->classObjectType == 3 || e->expTyp
 {
 if(destType->kind == 14)
 {
-Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString(__thisModule, "Unspecified type\n", (((void *)0))));
+Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Unspecified type\n", (((void *)0))));
 }
 else if(!(destType->truth && e->expType->kind == 8 && e->expType->_class && e->expType->_class->registered && e->expType->_class->registered->type == 1))
 {
@@ -12004,27 +13779,35 @@ struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
 char typeString[1024];
 struct Type * type;
 int backupClassObjectType;
+unsigned int backupByReference;
 
 if(e->expType->kind == 8 && e->expType->_class && e->expType->_class->registered && strcmp(e->expType->_class->registered->name, "class"))
 type = e->expType;
 else
 type = destType;
 backupClassObjectType = type->classObjectType;
+backupByReference = type->byReference;
 type->classObjectType = 0;
+type->byReference = 0x0;
 typeString[0] = '\0';
 PrintType(type, typeString, 0x0, 0x1);
 decl = SpecDeclFromString(typeString, specs, (((void *)0)));
 type->classObjectType = backupClassObjectType;
+type->byReference = backupByReference;
 *thisExp = *e;
 thisExp->prev = (((void *)0));
 thisExp->next = (((void *)0));
 __ecereMethod_Expression_Clear(e);
-if((type->kind == 8 && type->_class && type->_class->registered && strcmp(type->_class->registered->fullName, "ecere::com::Instance") && (type->_class->registered->type == 1000 || type->_class->registered->type == 2 || type->_class->registered->type == 4 || type->_class->registered->type == 3)) || (type->kind != 13 && type->kind != 12 && type->kind != 8) || (!destType->byReference && byReference && (destType->kind != 13 || type->kind != 13)))
+if((type->kind == 8 && type->_class && type->_class->registered && (type->_class->registered->type == 1000 || type->_class->registered->type == 2 || type->_class->registered->type == 4 || type->_class->registered->type == 3)) || (type->kind != 13 && type->kind != 22 && type->kind != 12 && type->kind != 8) || (!destType->byReference && byReference && (destType->kind != 13 || type->kind != 13)))
 {
 e->type = 4;
 e->op.op = '*';
 e->op.exp1 = (((void *)0));
 e->op.exp2 = MkExpCast(MkTypeName(specs, MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), decl)), thisExp);
+e->expType = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
+CopyTypeInto(e->expType, type);
+e->expType->byReference = 0x0;
+e->expType->refCount = 1;
 }
 else
 {
@@ -12032,16 +13815,16 @@ e->type = 11;
 e->cast.typeName = MkTypeName(specs, decl);
 e->cast.exp = thisExp;
 e->byReference = 0x1;
-}
 e->expType = type;
-e->destType = destType;
 type->refCount++;
+}
+e->destType = destType;
 destType->refCount++;
 }
 }
 }
 
-extern char *  strstr(char * , const char * );
+extern char *  strstr(const char * , const char * );
 
 extern struct __ecereNameSpace__ecere__com__Class * __ecereClass___ecereNameSpace__ecere__com__DefinedExpression;
 
@@ -12064,8 +13847,6 @@ extern struct Expression * GetTemplateArgExp(struct TemplateParameter * param, s
 
 extern struct Expression * MkExpCondition(struct Expression * cond, struct __ecereNameSpace__ecere__sys__OldList * expressions, struct Expression * elseExp);
 
-extern struct Expression * CopyExpression(struct Expression * exp);
-
 extern struct Expression * MkExpTypeSize(struct TypeName * typeName);
 
 extern struct Expression * MkExpClass(struct __ecereNameSpace__ecere__sys__OldList *  specifiers, struct Declarator * decl);
@@ -12084,8 +13865,6 @@ void __ecereMethod___ecereNameSpace__ecere__sys__OldList_Clear(struct __ecereNam
 
 void ProcessExpressionType(struct Expression * exp)
 {
-void * __ecereTemp2;
-void * __ecereTemp1;
 unsigned int unresolved = 0x0;
 struct Location oldyylloc = yylloc;
 unsigned int notByReference = 0x0;
@@ -12099,7 +13878,7 @@ case 0:
 {
 struct Identifier * id = exp->identifier;
 
-if(!id)
+if(!id || !topContext)
 return ;
 if(id->_class && id->_class->name)
 {
@@ -12170,11 +13949,11 @@ id->classSym = (((void *)0));
 exp->expType = type;
 if(type)
 type->refCount++;
-if(type && (type->kind == 15 || (_class && _class->type == 4)))
+if(type && (type->kind == 15))
 exp->isConstant = 0x1;
 if(symbol->isParam || !strcmp(id->string, "this"))
 {
-if(_class && _class->type == 1)
+if(_class && _class->type == 1 && !type->declaredWithStruct)
 exp->byReference = 0x1;
 }
 if(symbol->isIterator)
@@ -12221,19 +14000,30 @@ int c;
 for(c = 0; c < definedExpStackPos; c++)
 if(definedExpStack[c] == definedExp)
 break;
-if(c == definedExpStackPos && c < sizeof definedExpStack / sizeof(void *))
+if(c == definedExpStackPos && c < sizeof (definedExpStack) / sizeof(void *))
 {
 struct Location backupYylloc = yylloc;
+struct __ecereNameSpace__ecere__com__Instance * backInput = fileInput;
 
 definedExpStack[definedExpStackPos++] = definedExp;
 fileInput = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass___ecereNameSpace__ecere__sys__TempFile);
-((int (*)(struct __ecereNameSpace__ecere__com__Instance *, void *  buffer, unsigned int size, unsigned int count))fileInput->_vTbl[__ecereVMethodID___ecereNameSpace__ecere__sys__File_Write])(fileInput, definedExp->value, 1, strlen(definedExp->value));
-((unsigned int (*)(struct __ecereNameSpace__ecere__com__Instance *, int pos, int mode))fileInput->_vTbl[__ecereVMethodID___ecereNameSpace__ecere__sys__File_Seek])(fileInput, 0, 0);
+((int (*)(struct __ecereNameSpace__ecere__com__Instance *, void *  buffer, unsigned int size, unsigned int count))__extension__ ({
+struct __ecereNameSpace__ecere__com__Instance * __internal_ClassInst = fileInput;
+
+__internal_ClassInst ? __internal_ClassInst->_vTbl : __ecereClass___ecereNameSpace__ecere__sys__File->_vTbl;
+})[__ecereVMethodID___ecereNameSpace__ecere__sys__File_Write])(fileInput, definedExp->value, 1, strlen(definedExp->value));
+((unsigned int (*)(struct __ecereNameSpace__ecere__com__Instance *, int pos, int mode))__extension__ ({
+struct __ecereNameSpace__ecere__com__Instance * __internal_ClassInst = fileInput;
+
+__internal_ClassInst ? __internal_ClassInst->_vTbl : __ecereClass___ecereNameSpace__ecere__sys__File->_vTbl;
+})[__ecereVMethodID___ecereNameSpace__ecere__sys__File_Seek])(fileInput, 0, 0);
 echoOn = 0x0;
 parsedExpression = (((void *)0));
 resetScanner();
 expression_yyparse();
 (__ecereNameSpace__ecere__com__eInstance_DecRef(fileInput), fileInput = 0);
+if(backInput)
+fileInput = backInput;
 yylloc = backupYylloc;
 if(parsedExpression)
 {
@@ -12251,7 +14041,7 @@ else
 {
 if(inCompiler)
 {
-Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString(__thisModule, "Recursion in defined expression %s\n", (((void *)0))), id->string);
+Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Recursion in defined expression %s\n", (((void *)0))), id->string);
 }
 }
 }
@@ -12304,7 +14094,7 @@ char name[1024];
 (__ecereNameSpace__ecere__com__eSystem_Delete(id->string), id->string = 0);
 id->string = __ecereNameSpace__ecere__sys__CopyString(function->name);
 name[0] = (char)0;
-if(((struct __ecereNameSpace__ecere__com__Module *)(((char *)function->module + 12)))->importType != 1 && (!function->dataType || !function->dataType->dllExport))
+if(((struct __ecereNameSpace__ecere__com__Module *)(((char *)function->module + structSize_Instance)))->importType != 1 && (!function->dataType || !function->dataType->dllExport))
 strcpy(name, "__ecereFunction_");
 FullClassNameCat(name, id->string, 0x0);
 if(DeclareFunction(function, name))
@@ -12349,19 +14139,20 @@ case 2:
 {
 if(!exp->expType)
 {
+char * constant = exp->constant;
 struct Type * type = (type = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type), type->refCount = 1, type->constant = 0x1, type);
 
 exp->expType = type;
-if(exp->constant[0] == '\'')
+if(constant[0] == '\'')
 {
-if((int)((unsigned char *)exp->constant)[1] > 127)
+if((int)((unsigned char *)constant)[1] > 127)
 {
 int nb;
-unsigned int ch = __ecereNameSpace__ecere__sys__UTF8GetChar(exp->constant + 1, &nb);
+unsigned int ch = __ecereNameSpace__ecere__sys__UTF8GetChar(constant + 1, &nb);
 
 if(nb < 2)
-ch = exp->constant[1];
-(__ecereNameSpace__ecere__com__eSystem_Delete(exp->constant), exp->constant = 0);
+ch = constant[1];
+(__ecereNameSpace__ecere__com__eSystem_Delete(constant), constant = 0);
 exp->constant = PrintUInt(ch);
 type->kind = 8;
 type->_class = FindClass("unichar");
@@ -12373,11 +14164,27 @@ type->kind = 1;
 type->isSigned = 0x1;
 }
 }
-else if(strchr(exp->constant, '.'))
+else
 {
-char ch = exp->constant[strlen(exp->constant) - 1];
+char * dot = strchr(constant, '.');
+unsigned int isHex = (constant[0] == '0' && (constant[1] == 'x' || constant[1] == 'X'));
+char * exponent;
 
-if(ch == 'f')
+if(isHex)
+{
+exponent = strchr(constant, 'p');
+if(!exponent)
+exponent = strchr(constant, 'P');
+}
+else
+{
+exponent = strchr(constant, 'e');
+if(!exponent)
+exponent = strchr(constant, 'E');
+}
+if(dot || exponent)
+{
+if(strchr(constant, 'f') || strchr(constant, 'F'))
 type->kind = 6;
 else
 type->kind = 7;
@@ -12385,37 +14192,78 @@ type->isSigned = 0x1;
 }
 else
 {
-if(exp->constant[0] == '0' && exp->constant[1])
-type->isSigned = 0x0;
-else if(strchr(exp->constant, 'L') || strchr(exp->constant, 'l'))
-type->isSigned = 0x0;
-else if(strtoll(exp->constant, (((void *)0)), 0) > (((int)0x7fffffff)))
-type->isSigned = 0x0;
+unsigned int isSigned = constant[0] == '-';
+char * endP = (((void *)0));
+long long i64 = strtoll(constant, &endP, 0);
+uint64 ui64 = strtoull(constant, &endP, 0);
+unsigned int is64Bit = endP && (!strcmp(endP, "LL") || !strcmp(endP, "ll"));
+
+if(isSigned)
+{
+if(i64 < (((int)0x80000000)))
+is64Bit = 0x1;
+}
 else
-type->isSigned = 0x1;
-type->kind = 3;
+{
+if(ui64 > (((int)0x7fffffff)))
+{
+if(ui64 > (0xffffffff))
+{
+is64Bit = 0x1;
+if(ui64 <= (((long long)0x7fffffffffffffffLL)) && (constant[0] != '0' || !constant[1]))
+isSigned = 0x1;
+}
+}
+else if(constant[0] != '0' || !constant[1])
+isSigned = 0x1;
+}
+type->kind = is64Bit ? 4 : 3;
+type->isSigned = isSigned;
+}
 }
 exp->isConstant = 0x1;
+if(exp->destType && exp->destType->kind == 7)
+type->kind = 7;
+else if(exp->destType && exp->destType->kind == 6)
+type->kind = 6;
+else if(exp->destType && exp->destType->kind == 4)
+type->kind = 4;
 }
 break;
 }
 case 3:
 {
 exp->isConstant = 0x1;
-exp->expType = (__ecereTemp2 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type), ((struct Type *)__ecereTemp2)->refCount = 1, ((struct Type *)__ecereTemp2)->kind = 13, ((struct Type *)__ecereTemp2)->type = (__ecereTemp1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type), ((struct Type *)__ecereTemp1)->refCount = 1, ((struct Type *)__ecereTemp1)->kind = 1, ((struct Type *)__ecereTemp1)->constant = 0x1, ((struct Type *)__ecereTemp1)), ((struct Type *)__ecereTemp2));
+exp->expType = __extension__ ({
+struct Type * __ecereInstance2 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
+
+__ecereInstance2->refCount = 1, __ecereInstance2->kind = 13, __ecereInstance2->type = __extension__ ({
+struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
+
+__ecereInstance1->refCount = 1, __ecereInstance1->kind = 1, __ecereInstance1->constant = 0x1, __ecereInstance1->isSigned = 0x1, __ecereInstance1;
+}), __ecereInstance2;
+});
 break;
 }
 case 13:
-case 28:
+case 26:
 ProcessExpressionType(exp->_new.size);
-exp->expType = (__ecereTemp1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type), ((struct Type *)__ecereTemp1)->refCount = 1, ((struct Type *)__ecereTemp1)->kind = 13, ((struct Type *)__ecereTemp1)->type = ProcessType(exp->_new.typeName->qualifiers, exp->_new.typeName->declarator), ((struct Type *)__ecereTemp1));
+exp->expType = __extension__ ({
+struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
+
+__ecereInstance1->refCount = 1, __ecereInstance1->kind = 13, __ecereInstance1->type = ProcessType(exp->_new.typeName->qualifiers, exp->_new.typeName->declarator), __ecereInstance1;
+});
 DeclareType(exp->expType->type, 0x0, 0x0);
 break;
 case 14:
-case 29:
+case 27:
 ProcessExpressionType(exp->_renew.size);
 ProcessExpressionType(exp->_renew.exp);
-exp->expType = (__ecereTemp1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type), ((struct Type *)__ecereTemp1)->refCount = 1, ((struct Type *)__ecereTemp1)->kind = 13, ((struct Type *)__ecereTemp1)->type = ProcessType(exp->_renew.typeName->qualifiers, exp->_renew.typeName->declarator), ((struct Type *)__ecereTemp1));
+exp->expType = __extension__ ({
+struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
+
+__ecereInstance1->refCount = 1, __ecereInstance1->kind = 13, __ecereInstance1->type = ProcessType(exp->_renew.typeName->qualifiers, exp->_renew.typeName->declarator), __ecereInstance1;
+});
 DeclareType(exp->expType->type, 0x0, 0x0);
 break;
 case 4:
@@ -12425,7 +14273,8 @@ struct Type * type1 = (((void *)0)), * type2 = (((void *)0));
 unsigned int useDestType = 0x0, useSideType = 0x0;
 struct Location oldyylloc = yylloc;
 unsigned int useSideUnit = 0x0;
-struct Type * dummy = (dummy = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type), dummy->count = (unsigned int)1, dummy->refCount = 1, dummy);
+struct __ecereNameSpace__ecere__com__Class * destClass = (exp->destType && exp->destType->kind == 8 && exp->destType->_class) ? exp->destType->_class->registered : (((void *)0));
+struct Type * dummy = (dummy = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type), dummy->count = 1, dummy->refCount = 1, dummy);
 
 switch(exp->op.op)
 {
@@ -12461,13 +14310,27 @@ break;
 case '+':
 case '-':
 useSideUnit = 0x1;
+useSideType = 0x1;
+useDestType = 0x1;
+break;
+case LEFT_OP:
+case RIGHT_OP:
+useSideType = 0x1;
+useDestType = 0x1;
+break;
 case '|':
-case '&':
 case '^':
+useSideType = 0x1;
+useDestType = 0x1;
+break;
 case '/':
 case '%':
+useSideType = 0x1;
+useDestType = 0x1;
+break;
+case '&':
 case '*':
-if(exp->op.op != '*' || exp->op.exp1)
+if(exp->op.exp1)
 {
 useSideType = 0x1;
 useDestType = 0x1;
@@ -12497,11 +14360,14 @@ break;
 }
 if(exp->op.exp1)
 {
-if(exp->destType && exp->destType->kind == 8 && exp->destType->_class && exp->destType->_class->registered && useDestType && ((exp->destType->_class->registered->type == 3 && useSideUnit) || exp->destType->_class->registered->type == 4 || exp->destType->_class->registered->type == 2))
+if(exp->op.exp2 && useSideUnit && useDestType && destClass && destClass->type == 3 && destClass->base->type != 3)
+useDestType = 0x0;
+if(destClass && useDestType && ((destClass->type == 3 && useSideUnit) || destClass->type == 4 || destClass->type == 2))
 {
 if(exp->op.exp1->destType)
 FreeType(exp->op.exp1->destType);
 exp->op.exp1->destType = exp->destType;
+exp->op.exp1->opDestType = 0x1;
 if(exp->destType)
 exp->destType->refCount++;
 }
@@ -12517,6 +14383,13 @@ exp->op.exp1->destType->count++;
 ProcessExpressionType(exp->op.exp1);
 if(exp->op.exp1->destType && exp->op.op != '=')
 exp->op.exp1->destType->count--;
+exp->op.exp1->opDestType = 0x0;
+if(!exp->op.exp2 && (exp->op.op == INC_OP || exp->op.op == DEC_OP) && exp->op.exp1->expType && exp->op.exp1->expType->kind == 8 && exp->op.exp1->expType->_class && exp->op.exp1->expType->_class->registered && exp->op.exp1->expType->_class->registered->type == 3)
+{
+exp->op.exp2 = MkExpConstant("1");
+exp->op.op = exp->op.op == INC_OP ? ADD_ASSIGN : SUB_ASSIGN;
+assign = 0x1;
+}
 if(exp->op.exp1->destType == dummy)
 {
 FreeType(dummy);
@@ -12540,6 +14413,8 @@ exp->op.exp1->expType->refCount++;
 else
 {
 exp->op.exp2->destType = exp->destType;
+if(!exp->op.exp1 || exp->op.op != '&')
+exp->op.exp2->opDestType = 0x1;
 if(exp->destType)
 exp->destType->refCount++;
 }
@@ -12554,7 +14429,7 @@ PrintExpression(exp->op.exp2, expString);
 if(type1 && type1->kind == 13)
 {
 if(exp->op.op == MUL_ASSIGN || exp->op.op == DIV_ASSIGN || exp->op.op == MOD_ASSIGN || exp->op.op == LEFT_ASSIGN || exp->op.op == RIGHT_ASSIGN || exp->op.op == AND_ASSIGN || exp->op.op == OR_ASSIGN)
-Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString(__thisModule, "operator %s illegal on pointer\n", (((void *)0))), exp->op.op);
+Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "operator %s illegal on pointer\n", (((void *)0))), exp->op.op);
 else if(exp->op.op == '=')
 {
 if(exp->op.exp2->destType)
@@ -12581,11 +14456,13 @@ if(type1)
 type1->refCount++;
 exp->expType = type1;
 }
-else if(exp->destType && exp->destType->kind == 8 && exp->destType->_class && exp->destType->_class->registered && ((exp->destType->_class->registered->type == 3 && useDestType && useSideUnit) || (exp->destType->_class->registered->type == 4 && useDestType)))
+else if(destClass && ((destClass->type == 3 && useDestType && useSideUnit) || (destClass->type == 4 && useDestType)))
 {
 if(exp->op.exp2->destType)
 FreeType(exp->op.exp2->destType);
 exp->op.exp2->destType = exp->destType;
+if(exp->op.op != '&')
+exp->op.exp2->opDestType = 0x1;
 if(exp->destType)
 exp->destType->refCount++;
 }
@@ -12604,25 +14481,43 @@ type1->refCount++;
 }
 if(exp->op.exp2->destType && exp->op.op != '=')
 exp->op.exp2->destType->count++;
+if(exp->op.op == SIZEOF)
+{
+struct Expression * e = exp->op.exp2;
+
+while((e->type == 5 || e->type == 32 || e->type == 23) && e->list)
+{
+if(e->type == 5 || e->type == 32 || e->type == 23)
+{
+if(e->type == 23)
+e = (*((struct Statement *)(*e->compound->compound.statements).last)->expressions).last;
+else
+e = (*e->list).last;
+}
+}
+if(e->type == 11 && e->cast.exp)
+e->cast.exp->needCast = 0x1;
+}
 ProcessExpressionType(exp->op.exp2);
+exp->op.exp2->opDestType = 0x0;
 if(exp->op.exp2->destType && exp->op.op != '=')
 exp->op.exp2->destType->count--;
 if(assign && type1 && type1->kind == 13 && exp->op.exp2->expType)
 {
-if(exp->op.exp2->expType->kind == 22 || exp->op.exp2->expType->kind == 4 || exp->op.exp2->expType->kind == 3 || exp->op.exp2->expType->kind == 2 || exp->op.exp2->expType->kind == 1)
+if(exp->op.exp2->expType->kind == 23 || exp->op.exp2->expType->kind == 22 || exp->op.exp2->expType->kind == 4 || exp->op.exp2->expType->kind == 3 || exp->op.exp2->expType->kind == 2 || exp->op.exp2->expType->kind == 1)
 {
 if(exp->op.op != '=' && type1->type->kind == 0)
-Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString(__thisModule, "void *: unknown size\n", (((void *)0))));
+Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "void *: unknown size\n", (((void *)0))));
 }
 else if(exp->op.exp2->expType->kind == 13 || exp->op.exp2->expType->kind == 12 || exp->op.exp2->expType->kind == 11 || exp->op.exp2->expType->kind == 16 || (type1->type->kind == 0 && exp->op.exp2->expType->kind == 8 && exp->op.exp2->expType->_class->registered && (exp->op.exp2->expType->_class->registered->type == 0 || exp->op.exp2->expType->_class->registered->type == 1 || exp->op.exp2->expType->_class->registered->type == 5)))
 {
 if(exp->op.op == ADD_ASSIGN)
-Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString(__thisModule, "cannot add two pointers\n", (((void *)0))));
+Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "cannot add two pointers\n", (((void *)0))));
 }
 else if((exp->op.exp2->expType->kind == 8 && type1->kind == 13 && type1->type->kind == 8 && type1->type->_class == exp->op.exp2->expType->_class && exp->op.exp2->expType->_class->registered && exp->op.exp2->expType->_class->registered->type == 1))
 {
 if(exp->op.op == ADD_ASSIGN)
-Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString(__thisModule, "cannot add two pointers\n", (((void *)0))));
+Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "cannot add two pointers\n", (((void *)0))));
 }
 else if(inCompiler)
 {
@@ -12634,7 +14529,7 @@ type2String[0] = '\0';
 PrintType(exp->op.exp2->expType, type1String, 0x0, 0x1);
 PrintType(type1, type2String, 0x0, 0x1);
 __ecereNameSpace__ecere__sys__ChangeCh(expString, '\n', ' ');
-Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString(__thisModule, "incompatible expression %s (%s); expected %s\n", (((void *)0))), expString, type1String, type2String);
+Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "incompatible expression %s (%s); expected %s\n", (((void *)0))), expString, type1String, type2String);
 }
 }
 if(exp->op.exp2->destType == dummy)
@@ -12642,12 +14537,38 @@ if(exp->op.exp2->destType == dummy)
 FreeType(dummy);
 exp->op.exp2->destType = (((void *)0));
 }
+if(exp->op.op == '-' && !exp->op.exp1 && exp->op.exp2->expType && !exp->op.exp2->expType->isSigned)
+{
+type2 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
+type2->refCount = 1;
+CopyTypeInto(type2, exp->op.exp2->expType);
+type2->isSigned = 0x1;
+}
+else if(exp->op.op == '~' && !exp->op.exp1 && exp->op.exp2->expType && (!exp->op.exp2->expType->isSigned || exp->op.exp2->expType->kind != 3))
+{
+type2 = __extension__ ({
+struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
+
+__ecereInstance1->kind = 3, __ecereInstance1;
+});
+type2->refCount = 1;
+type2->isSigned = 0x1;
+}
+else
+{
 type2 = exp->op.exp2->expType;
+if(type2)
+type2->refCount++;
+}
 }
 dummy->kind = 0;
 if(exp->op.op == SIZEOF)
 {
-exp->expType = (__ecereTemp1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type), ((struct Type *)__ecereTemp1)->refCount = 1, ((struct Type *)__ecereTemp1)->kind = 3, ((struct Type *)__ecereTemp1));
+exp->expType = __extension__ ({
+struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
+
+__ecereInstance1->refCount = 1, __ecereInstance1->kind = 3, __ecereInstance1;
+});
 exp->isConstant = 0x1;
 }
 else if(exp->op.op == '*' && !exp->op.exp1)
@@ -12695,6 +14616,25 @@ else if(exp->op.exp1 && exp->op.exp2 && ((useSideType) || ((!type1 || type1->kin
 {
 if(type1 && type2 && ((type1->kind == 8 && type1->_class && strcmp(type1->_class->string, "String")) == (type2->kind == 8 && type2->_class && strcmp(type2->_class->string, "String"))))
 {
+if(exp->op.op == '-' && ((type1->kind == 8 && type1->_class->registered && type1->_class->registered->type == 4) || (type2->kind == 8 && type2->_class->registered && type2->_class->registered->type == 4)))
+{
+struct Type * intType;
+
+if(!type1->_class->registered->dataType)
+type1->_class->registered->dataType = ProcessTypeString(type1->_class->registered->dataTypeString, 0x0);
+if(!type2->_class->registered->dataType)
+type2->_class->registered->dataType = ProcessTypeString(type2->_class->registered->dataTypeString, 0x0);
+intType = ProcessTypeString((type1->_class->registered->dataType->kind == 4 || type2->_class->registered->dataType->kind == 4) ? "int64" : "int", 0x0);
+if(exp->op.exp1->destType)
+FreeType(exp->op.exp1->destType);
+if(exp->op.exp2->destType)
+FreeType(exp->op.exp2->destType);
+exp->op.exp1->destType = intType;
+exp->op.exp2->destType = intType;
+intType->refCount++;
+}
+else
+{
 if(exp->op.exp2->destType)
 FreeType(exp->op.exp2->destType);
 exp->op.exp2->destType = type1;
@@ -12703,8 +14643,9 @@ if(exp->op.exp1->destType)
 FreeType(exp->op.exp1->destType);
 exp->op.exp1->destType = type2;
 type2->refCount++;
+}
 if(!boolResult && type1->kind == 8 && (!exp->destType || exp->destType->kind != 8) && type1->_class->registered && type1->_class->registered->type == 3 && type2->_class->registered && type2->_class->registered->type == 3 && type1->_class->registered != type2->_class->registered)
-Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString(__thisModule, "operating on %s and %s with an untyped result, assuming %s\n", (((void *)0))), type1->_class->string, type2->_class->string, type1->_class->string);
+Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "operating on %s and %s with an untyped result, assuming %s\n", (((void *)0))), type1->_class->string, type2->_class->string, type1->_class->string);
 if(type1->kind == 13 && type1->type->kind == 20 && type2->kind != 13)
 {
 struct Expression * argExp = GetTemplateArgExp(type1->type->templateParameter, thisClass, 0x1);
@@ -12720,30 +14661,35 @@ if(type2->kind != 13)
 ProcessExpressionType(classExp);
 exp->op.exp2 = MkExpBrackets(MkListOne(MkExpOp(exp->op.exp2, '*', MkExpBrackets(MkListOne(MkExpCondition(MkExpBrackets(MkListOne(MkExpOp(MkExpOp(MkExpMember(CopyExpression(classExp), MkIdentifier("type")), EQ_OP, MkExpConstant("5")), OR_OP, MkExpOp(MkExpMember(CopyExpression(classExp), MkIdentifier("type")), EQ_OP, MkExpConstant("0"))))), MkListOne(MkExpTypeSize(MkTypeName(MkListOne(MkSpecifier(VOID)), MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), (((void *)0)))))), MkExpMember(classExp, MkIdentifier("typeSize"))))))));
 if(!exp->op.exp2->expType)
+{
+if(type2)
+FreeType(type2);
 type2 = exp->op.exp2->expType = ProcessTypeString("int", 0x0);
+type2->refCount++;
+}
 ProcessExpressionType(exp->op.exp2);
 }
 }
 }
-if(!boolResult && ((type1->kind == 13 || type1->kind == 12 || (type1->kind == 8 && !strcmp(type1->_class->string, "String"))) && (type2->kind == 22 || type2->kind == 4 || type2->kind == 3 || type2->kind == 2 || type2->kind == 1)))
+if(!boolResult && ((type1->kind == 13 || type1->kind == 12 || (type1->kind == 8 && !strcmp(type1->_class->string, "String"))) && (type2->kind == 23 || type2->kind == 22 || type2->kind == 4 || type2->kind == 3 || type2->kind == 2 || type2->kind == 1)))
 {
 if(type1->kind != 8 && type1->type->kind == 0)
-Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString(__thisModule, "void *: unknown size\n", (((void *)0))));
+Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "void *: unknown size\n", (((void *)0))));
 exp->expType = type1;
 if(type1)
 type1->refCount++;
 }
-else if(!boolResult && ((type2->kind == 13 || type2->kind == 12 || (type2->kind == 8 && !strcmp(type2->_class->string, "String"))) && (type1->kind == 22 || type1->kind == 4 || type1->kind == 3 || type1->kind == 2 || type1->kind == 1)))
+else if(!boolResult && ((type2->kind == 13 || type2->kind == 12 || (type2->kind == 8 && !strcmp(type2->_class->string, "String"))) && (type1->kind == 23 || type1->kind == 22 || type1->kind == 4 || type1->kind == 3 || type1->kind == 2 || type1->kind == 1)))
 {
 if(type2->kind != 8 && type2->type->kind == 0)
-Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString(__thisModule, "void *: unknown size\n", (((void *)0))));
+Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "void *: unknown size\n", (((void *)0))));
 exp->expType = type2;
 if(type2)
 type2->refCount++;
 }
 else if((type1->kind == 13 && type2->kind != 13 && type2->kind != 12 && type2->kind != 11 && type2->kind != 16 && type2->kind != 8 && type2->kind != 19) || (type2->kind == 13 && type1->kind != 13 && type1->kind != 12 && type1->kind != 11 && type1->kind != 16 && type1->kind != 8 && type1->kind != 19))
 {
-Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString(__thisModule, "different levels of indirection\n", (((void *)0))));
+Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "different levels of indirection\n", (((void *)0))));
 }
 else
 {
@@ -12752,12 +14698,16 @@ unsigned int success = 0x0;
 if(type1->kind == 13 && type2->kind == 13)
 {
 if(exp->op.op == '+')
-Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString(__thisModule, "cannot add two pointers\n", (((void *)0))));
+Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "cannot add two pointers\n", (((void *)0))));
 else if(exp->op.op == '-')
 {
 if(MatchTypes(type1->type, type2->type, (((void *)0)), (((void *)0)), (((void *)0)), 0x0, 0x0, 0x0, 0x0))
 {
-exp->expType = (__ecereTemp1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type), ((struct Type *)__ecereTemp1)->kind = 3, ((struct Type *)__ecereTemp1)->refCount = 1, ((struct Type *)__ecereTemp1));
+exp->expType = __extension__ ({
+struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
+
+__ecereInstance1->kind = 3, __ecereInstance1->refCount = 1, __ecereInstance1;
+});
 success = 0x1;
 if(type1->type->kind == 20)
 {
@@ -12840,7 +14790,7 @@ __ecereNameSpace__ecere__sys__ChangeCh(expString2, '\n', ' ');
 PrintType(exp->op.exp1->expType, type1, 0x0, 0x1);
 PrintType(exp->op.exp2->expType, type2, 0x0, 0x1);
 }
-Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString(__thisModule, "incompatible expressions %s (%s) and %s (%s)\n", (((void *)0))), expString1, type1, expString2, type2);
+Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "incompatible expressions %s (%s) and %s (%s)\n", (((void *)0))), expString1, type1, expString2, type2);
 }
 }
 }
@@ -12881,7 +14831,11 @@ type1->_class->registered->dataType = ProcessTypeString(type1->_class->registere
 exp->op.exp2->destType = type1->_class->registered->dataType;
 exp->op.exp2->destType->refCount++;
 CheckExpressionType(exp->op.exp2, exp->op.exp2->destType, 0x0);
+if(type2)
+FreeType(type2);
 type2 = exp->op.exp2->destType;
+if(type2)
+type2->refCount++;
 exp->expType = type2;
 type2->refCount++;
 }
@@ -12898,21 +14852,53 @@ type1 = exp->op.exp1->destType;
 exp->expType = type1;
 type1->refCount++;
 }
-if(!boolResult || exp->op.op == '>' || exp->op.op == '<')
+if(!boolResult || exp->op.op == '>' || exp->op.op == '<' || exp->op.op == GE_OP || exp->op.op == LE_OP)
+{
+unsigned int op1IsEnum = type1 && type1->kind == 8 && type1->_class && type1->_class->registered && type1->_class->registered->type == 4;
+unsigned int op2IsEnum = type2 && type2->kind == 8 && type2->_class && type2->_class->registered && type2->_class->registered->type == 4;
+
+if(exp->op.op == '*' || exp->op.op == '/' || exp->op.op == '-' || exp->op.op == '|' || exp->op.op == '^')
 {
-if(type1->kind == 8 && type1->_class && type1->_class->registered && type1->_class->registered->type == 4 && exp->op.exp2->expType)
+if(op1IsEnum && exp->op.exp2->expType)
 {
 if(CheckExpressionType(exp->op.exp1, exp->op.exp2->expType, 0x0))
 {
 if(exp->expType)
 FreeType(exp->expType);
-exp->expType = exp->op.exp1->expType;
+exp->expType = exp->op.exp2->expType;
 if(exp->op.exp2->expType)
+exp->op.exp2->expType->refCount++;
+valid = 0x1;
+}
+}
+else if(op2IsEnum && exp->op.exp1->expType)
+{
+if(CheckExpressionType(exp->op.exp2, exp->op.exp1->expType, 0x0))
+{
+if(exp->expType)
+FreeType(exp->expType);
+exp->expType = exp->op.exp1->expType;
+if(exp->op.exp1->expType)
+exp->op.exp1->expType->refCount++;
+valid = 0x1;
+}
+}
+}
+else
+{
+if(op1IsEnum && exp->op.exp2->expType)
+{
+if(CheckExpressionType(exp->op.exp1, exp->op.exp2->expType, 0x0))
+{
+if(exp->expType)
+FreeType(exp->expType);
+exp->expType = exp->op.exp1->expType;
+if(exp->op.exp1->expType)
 exp->op.exp1->expType->refCount++;
 valid = 0x1;
 }
 }
-else if(type2 && (type2->kind == 8 && type2->_class && type2->_class->registered && type2->_class->registered->type == 4 && exp->op.exp1->expType))
+else if(op2IsEnum && exp->op.exp1->expType)
 {
 if(CheckExpressionType(exp->op.exp2, exp->op.exp1->expType, 0x0))
 {
@@ -12925,8 +14911,26 @@ valid = 0x1;
 }
 }
 }
+}
 if(!valid)
 {
+if(type2 && type2->kind == 8 && type2->_class && type2->_class->registered && type2->_class->registered->type == 3 && (type1->kind != 8 || !type1->_class || !type1->_class->registered || type1->_class->registered->type != 3))
+{
+if(exp->op.exp1->destType)
+FreeType(exp->op.exp1->destType);
+exp->op.exp1->destType = type2;
+type2->refCount++;
+if(CheckExpressionType(exp->op.exp1, exp->op.exp1->destType, 0x0))
+{
+if(exp->expType)
+FreeType(exp->expType);
+exp->expType = exp->op.exp1->destType;
+if(exp->op.exp1->destType)
+exp->op.exp1->destType->refCount++;
+}
+}
+else
+{
 if(exp->op.exp2->destType)
 FreeType(exp->op.exp2->destType);
 exp->op.exp2->destType = type1;
@@ -12959,7 +14963,7 @@ __ecereNameSpace__ecere__sys__ChangeCh(expString2, '\n', ' ');
 PrintType(exp->op.exp1->expType, type1String, 0x0, 0x1);
 PrintType(exp->op.exp2->expType, type2String, 0x0, 0x1);
 }
-Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString(__thisModule, "incompatible expressions %s (%s) and %s (%s)\n", (((void *)0))), expString1, type1String, expString2, type2String);
+Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "incompatible expressions %s (%s) and %s (%s)\n", (((void *)0))), expString1, type1String, expString2, type2String);
 if(type1->kind == 8 && type1->_class && type1->_class->registered && type1->_class->registered->type == 4)
 {
 exp->expType = exp->op.exp1->expType;
@@ -12975,6 +14979,7 @@ exp->op.exp2->expType->refCount++;
 }
 }
 }
+}
 else if(type2)
 {
 if(type2->kind == 8 && type2->_class && type2->_class->registered && type2->_class->registered->type == 4)
@@ -13052,7 +15057,7 @@ PrintExpression(exp->op.exp1, expString);
 __ecereNameSpace__ecere__sys__ChangeCh(expString, '\n', ' ');
 }
 if(expString[0])
-Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString(__thisModule, "couldn't determine type of %s\n", (((void *)0))), expString);
+Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "couldn't determine type of %s\n", (((void *)0))), expString);
 }
 if(exp->op.exp2 && !exp->op.exp2->expType)
 {
@@ -13065,7 +15070,7 @@ PrintExpression(exp->op.exp2, expString);
 __ecereNameSpace__ecere__sys__ChangeCh(expString, '\n', ' ');
 }
 if(expString[0])
-Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString(__thisModule, "couldn't determine type of %s\n", (((void *)0))), expString);
+Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "couldn't determine type of %s\n", (((void *)0))), expString);
 }
 if(boolResult)
 {
@@ -13081,10 +15086,12 @@ DeclareType(exp->op.exp2->expType, 0x0, 0x0);
 }
 yylloc = oldyylloc;
 FreeType(dummy);
+if(type2)
+FreeType(type2);
 break;
 }
 case 5:
-case 34:
+case 32:
 {
 struct Expression * e;
 
@@ -13096,6 +15103,7 @@ unsigned int inced = 0x0;
 if(!e->next)
 {
 FreeType(e->destType);
+e->opDestType = exp->opDestType;
 e->destType = exp->destType;
 if(e->destType)
 {
@@ -13144,10 +15152,13 @@ if(exp->index.exp->expType)
 {
 struct Type * source = exp->index.exp->expType;
 
-if(source->kind == 8 && source->_class && source->_class->registered && source->_class->registered != containerClass && __ecereNameSpace__ecere__com__eClass_IsDerived(source->_class->registered, containerClass) && source->_class->registered->templateArgs)
+if(source->kind == 8 && source->_class && source->_class->registered)
 {
 struct __ecereNameSpace__ecere__com__Class * _class = source->_class->registered;
+struct __ecereNameSpace__ecere__com__Class * c = _class->templateClass ? _class->templateClass : _class;
 
+if(_class != containerClass && __ecereNameSpace__ecere__com__eClass_IsDerived(c, containerClass) && _class->templateArgs)
+{
 exp->expType = ProcessTypeString(_class->templateArgs[2].dataTypeString, 0x0);
 if(exp->index.index && (*exp->index.index).last)
 {
@@ -13155,6 +15166,7 @@ if(exp->index.index && (*exp->index.index).last)
 }
 }
 }
+}
 for(e = (*exp->index.index).first; e; e = e->next)
 {
 if(!e->next && exp->index.exp->expType && exp->index.exp->expType->kind == 12 && exp->index.exp->expType->enumClass)
@@ -13197,7 +15209,14 @@ if(exp->call.exp->type == 0)
 struct Expression * idExp = exp->call.exp;
 struct Identifier * id = idExp->identifier;
 
-if(!strcmp(id->string, "__ENDIAN_PAD"))
+if(!strcmp(id->string, "__builtin_frame_address"))
+{
+exp->expType = ProcessTypeString("void *", 0x1);
+if(exp->call.arguments && (*exp->call.arguments).first)
+ProcessExpressionType((*exp->call.arguments).first);
+break;
+}
+else if(!strcmp(id->string, "__ENDIAN_PAD"))
 {
 exp->expType = ProcessTypeString("int", 0x1);
 if(exp->call.arguments && (*exp->call.arguments).first)
@@ -13301,7 +15320,7 @@ break;
 }
 }
 {
-struct Type * dummy = (dummy = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type), dummy->count = (unsigned int)1, dummy->refCount = 1, dummy);
+struct Type * dummy = (dummy = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type), dummy->count = 1, dummy->refCount = 1, dummy);
 
 if(!exp->call.exp->destType)
 {
@@ -13326,7 +15345,13 @@ if(exp->call.exp->expType->usedClass)
 char typeString[1024];
 
 typeString[0] = '\0';
+{
+struct Symbol * back = functionType->thisClass;
+
+functionType->thisClass = (((void *)0));
 PrintType(functionType, typeString, 0x1, 0x1);
+functionType->thisClass = back;
+}
 if(strstr(typeString, "thisclass"))
 {
 struct __ecereNameSpace__ecere__sys__OldList * specs = MkList();
@@ -13369,7 +15394,7 @@ functionType = type;
 }
 if(functionType && functionType->kind != 11)
 {
-Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString(__thisModule, "called object %s is not a function\n", (((void *)0))), name);
+Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "called object %s is not a function\n", (((void *)0))), name);
 }
 else if(functionType)
 {
@@ -13382,12 +15407,12 @@ struct Location oldyylloc = yylloc;
 
 if(!type)
 emptyParams = 0x1;
-if(functionType->extraParam && e)
+if(functionType->extraParam && e && functionType->thisClass)
 {
 e->destType = MkClassType(functionType->thisClass->string);
 e = e->next;
 }
-if(!functionType->staticMethod)
+if(!functionType->staticMethod && !functionType->extraParam)
 {
 if(memberExp && memberExp->member.exp && memberExp->member.exp->expType && memberExp->member.exp->expType->kind == 19 && memberExp->member.exp->expType->_class)
 {
@@ -13404,8 +15429,12 @@ type->refCount = 0;
 else if(!memberExp && (functionType->thisClass || (methodType && methodType->methodClass)))
 {
 type = MkClassType(functionType->thisClass ? functionType->thisClass->string : (methodType ? methodType->methodClass->fullName : (((void *)0))));
+type->byReference = functionType->byReference;
+type->typedByReference = functionType->typedByReference;
 if(e)
 {
+if(e->next && type->kind == 8 && (functionType && functionType->thisClass) && functionType->classObjectType == 2)
+e = e->next;
 e->destType = type;
 e = e->next;
 type = functionType->params.first;
@@ -13427,9 +15456,9 @@ if(!type && !emptyParams)
 {
 yylloc = e->loc;
 if(methodType && methodType->methodClass)
-Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString(__thisModule, "too many arguments for method %s::%s (%d given, expected %d)\n", (((void *)0))), methodType->methodClass->fullName, methodType->method->name, (*exp->call.arguments).count, noParams ? 0 : functionType->params.count);
+Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "too many arguments for method %s::%s (%d given, expected %d)\n", (((void *)0))), methodType->methodClass->fullName, methodType->method->name, (*exp->call.arguments).count, noParams ? 0 : functionType->params.count);
 else
-Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString(__thisModule, "too many arguments for function %s (%d given, expected %d)\n", (((void *)0))), name, (*exp->call.arguments).count, noParams ? 0 : functionType->params.count);
+Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "too many arguments for function %s (%d given, expected %d)\n", (((void *)0))), name, (*exp->call.arguments).count, noParams ? 0 : functionType->params.count);
 break;
 }
 if(methodType && type && type->kind == 20 && type->templateParameter->type == 0)
@@ -13493,10 +15522,18 @@ type->refCount++;
 }
 else
 {
+if(type && type->kind == 14 && type->prev && type->prev->kind == 8 && type->prev->classObjectType)
+{
+e->destType = type->prev;
+e->destType->refCount++;
+}
+else
+{
 e->destType = type;
 if(type)
 type->refCount++;
 }
+}
 if(type && type->kind != 14)
 {
 struct Type * next = type->next;
@@ -13509,9 +15546,9 @@ type = next;
 if(type && type->kind != 14)
 {
 if(methodType && methodType->methodClass)
-Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString(__thisModule, "not enough arguments for method %s::%s (%d given, expected %d)\n", (((void *)0))), methodType->methodClass->fullName, methodType->method->name, exp->call.arguments ? (*exp->call.arguments).count : 0, functionType->params.count + extra);
+Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "not enough arguments for method %s::%s (%d given, expected %d)\n", (((void *)0))), methodType->methodClass->fullName, methodType->method->name, exp->call.arguments ? (*exp->call.arguments).count : 0, functionType->params.count + extra);
 else
-Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString(__thisModule, "not enough arguments for function %s (%d given, expected %d)\n", (((void *)0))), name, exp->call.arguments ? (*exp->call.arguments).count : 0, functionType->params.count + extra);
+Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "not enough arguments for function %s (%d given, expected %d)\n", (((void *)0))), name, exp->call.arguments ? (*exp->call.arguments).count : 0, functionType->params.count + extra);
 }
 yylloc = oldyylloc;
 if(type && !type->refCount)
@@ -13519,7 +15556,11 @@ FreeType(type);
 }
 else
 {
-functionType = (__ecereTemp1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type), ((struct Type *)__ecereTemp1)->refCount = 0, ((struct Type *)__ecereTemp1)->kind = 11, ((struct Type *)__ecereTemp1));
+functionType = __extension__ ({
+struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
+
+__ecereInstance1->refCount = 0, __ecereInstance1->kind = 11, __ecereInstance1;
+});
 if(exp->call.exp->type == 0)
 {
 char * string = exp->call.exp->identifier->string;
@@ -13531,10 +15572,20 @@ struct Location oldyylloc = yylloc;
 
 yylloc = exp->call.exp->identifier->loc;
 if(strstr(string, "__builtin_") == string)
-;
+{
+if(exp->destType)
+{
+functionType->returnType = exp->destType;
+exp->destType->refCount++;
+}
+}
 else
-Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString(__thisModule, "%s undefined; assuming extern returning int\n", (((void *)0))), string);
-symbol = (__ecereTemp1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Symbol), ((struct Symbol *)__ecereTemp1)->string = __ecereNameSpace__ecere__sys__CopyString(string), ((struct Symbol *)__ecereTemp1)->type = ProcessTypeString("int()", 0x1), ((struct Symbol *)__ecereTemp1));
+Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "%s undefined; assuming extern returning int\n", (((void *)0))), string);
+symbol = __extension__ ({
+struct Symbol * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Symbol);
+
+__ecereInstance1->string = __ecereNameSpace__ecere__sys__CopyString(string), __ecereInstance1->type = ProcessTypeString("int()", 0x1), __ecereInstance1;
+});
 __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Add(&globalContext->symbols, (struct __ecereNameSpace__ecere__sys__BTNode *)symbol);
 if(strstr(symbol->string, "::"))
 globalContext->hasNameSpace = 0x1;
@@ -13545,10 +15596,14 @@ else if(exp->call.exp->type == 8)
 {
 }
 else
-Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString(__thisModule, "callable object undefined; extern assuming returning int\n", (((void *)0))));
+Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "callable object undefined; extern assuming returning int\n", (((void *)0))));
 if(!functionType->returnType)
 {
-functionType->returnType = (__ecereTemp1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type), ((struct Type *)__ecereTemp1)->refCount = 1, ((struct Type *)__ecereTemp1)->kind = 3, ((struct Type *)__ecereTemp1));
+functionType->returnType = __extension__ ({
+struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
+
+__ecereInstance1->refCount = 1, __ecereInstance1->kind = 3, __ecereInstance1;
+});
 }
 }
 if(functionType && functionType->kind == 11)
@@ -13574,8 +15629,19 @@ case 8:
 {
 struct Type * type;
 struct Location oldyylloc = yylloc;
-unsigned int thisPtr = (exp->member.exp && exp->member.exp->type == 0 && !strcmp(exp->member.exp->identifier->string, "this"));
+unsigned int thisPtr;
+struct Expression * checkExp = exp->member.exp;
 
+while(checkExp)
+{
+if(checkExp->type == 11)
+checkExp = checkExp->cast.exp;
+else if(checkExp->type == 5)
+checkExp = checkExp->list ? (*checkExp->list).first : (((void *)0));
+else
+break;
+}
+thisPtr = (checkExp && checkExp->type == 0 && !strcmp(checkExp->identifier->string, "this"));
 exp->thisPtr = thisPtr;
 if(exp->member.member && exp->member.member->_class && exp->member.member->_class->name)
 {
@@ -13692,6 +15758,7 @@ struct Expression * exp;
 char * string = PrintHexUInt64(arg.expression.ui64);
 
 exp = MkExpCast(MkTypeName(specs, decl), MkExpConstant(string));
+(__ecereNameSpace__ecere__com__eSystem_Delete(string), string = 0);
 ProcessExpressionType(exp);
 ComputeExpression(exp);
 expString[0] = '\0';
@@ -13761,19 +15828,50 @@ type = ProcessTemplateParameterType(type->templateParameter);
 }
 if(type && (type->kind == 20))
 ;
-else if(type && (type->kind == 8 || type->kind == 19 || type->kind == 3 || type->kind == 15))
+else if(type && (type->kind == 8 || type->kind == 19 || type->kind == 3 || type->kind == 15 || type->kind == 4 || type->kind == 2 || type->kind == 5 || type->kind == 1 || type->kind == 24 || type->kind == 22 || type->kind == 23 || type->kind == 6 || type->kind == 7 || (type->kind == 13 && type->type->kind == 1)))
 {
 struct Identifier * id = exp->member.member;
 int typeKind = type->kind;
 struct __ecereNameSpace__ecere__com__Class * _class = (id && (!id->_class || id->_class->name)) ? (id->classSym ? id->classSym->registered : (type->_class ? type->_class->registered : (((void *)0)))) : (((void *)0));
 
-if(typeKind == 19 && exp->member.exp->type == 26)
+if(typeKind == 19 && exp->member.exp->type == 24)
 {
 _class = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "ecere::com::Class");
 typeKind = 8;
 }
-if(id && (typeKind == 3 || typeKind == 15))
+if(id)
+{
+if(typeKind == 3 || typeKind == 15)
 _class = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "int");
+else if(!_class)
+{
+if(type->kind == 8 && type->_class && type->_class->registered)
+{
+_class = type->_class->registered;
+}
+else if((type->kind == 12 || type->kind == 13) && type->type && type->type->kind == 1)
+{
+_class = FindClass("char *")->registered;
+}
+else if(type->kind == 13)
+{
+_class = __ecereNameSpace__ecere__com__eSystem_FindClass(privateModule, "uintptr");
+FreeType(exp->expType);
+exp->expType = ProcessTypeString("uintptr", 0x0);
+exp->byReference = 0x1;
+}
+else
+{
+char string[1024] = "";
+struct Symbol * classSym;
+
+PrintTypeNoConst(type, string, 0x0, 0x1);
+classSym = FindClass(string);
+if(classSym)
+_class = classSym->registered;
+}
+}
+}
 if(_class && id)
 {
 struct __ecereNameSpace__ecere__com__Property * prop = (((void *)0));
@@ -13785,7 +15883,7 @@ struct __ecereNameSpace__ecere__com__ClassProperty * classProp = (((void *)0));
 if(id && id->_class && id->_class->name && !strcmp(id->_class->name, "property"))
 exp->member.memberType = 1;
 if(id && id->_class && type->_class && !__ecereNameSpace__ecere__com__eClass_IsDerived(type->_class->registered, _class))
-Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString(__thisModule, "invalid class specifier %s for object of class %s\n", (((void *)0))), _class->fullName, type->_class->string);
+Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "invalid class specifier %s for object of class %s\n", (((void *)0))), _class->fullName, type->_class->string);
 if(typeKind != 19)
 {
 if((exp->member.memberType == 0 && thisPtr) || exp->member.memberType == 3)
@@ -13829,7 +15927,7 @@ member = (((void *)0));
 }
 }
 }
-if(!prop && !member)
+if(!prop && !member && !method)
 method = __ecereNameSpace__ecere__com__eClass_FindMethod(_class, id->string, privateModule);
 if(!prop && !member && !method)
 {
@@ -13912,13 +16010,16 @@ exp->expType = MkClassType(revConvert->_class->fullName);
 }
 else if(method)
 {
-if(inCompiler)
 {
 exp->member.memberType = 2;
 }
 if(!method->dataType)
 ProcessMethodType(method);
-exp->expType = (__ecereTemp1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type), ((struct Type *)__ecereTemp1)->refCount = 1, ((struct Type *)__ecereTemp1)->kind = 16, ((struct Type *)__ecereTemp1)->method = method, ((struct Type *)__ecereTemp1));
+exp->expType = __extension__ ({
+struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
+
+__ecereInstance1->refCount = 1, __ecereInstance1->kind = 16, __ecereInstance1->method = method, __ecereInstance1;
+});
 exp->expType->methodClass = (id && id->_class) ? _class : (((void *)0));
 exp->expType->usedClass = _class;
 }
@@ -13929,11 +16030,12 @@ if(exp->member.exp->expType->classObjectType == 2 && !strcmp(exp->member.member-
 FreeExpContents(exp);
 exp->type = 0;
 exp->identifier = MkIdentifier("class");
-ProcessExpressionType(exp);
+FreeType(exp->expType);
+exp->expType = MkClassType("ecere::com::Class");
 return ;
 }
 yylloc = exp->member.member->loc;
-Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString(__thisModule, "couldn't find member %s in class %s\n", (((void *)0))), id->string, _class->fullName);
+Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "couldn't find member %s in class %s\n", (((void *)0))), id->string, _class->fullName);
 if(inCompiler)
 __ecereNameSpace__ecere__com__eClass_AddDataMember(_class, id->string, "int", 0, 0, 1);
 }
@@ -14036,7 +16138,11 @@ FreeType(basicType);
 basicType = ReplaceThisClassType(_class);
 }
 FreeType(exp->expType);
-exp->expType = (__ecereTemp1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type), ((struct Type *)__ecereTemp1)->refCount = 1, ((struct Type *)__ecereTemp1)->kind = 13, ((struct Type *)__ecereTemp1)->type = basicType, ((struct Type *)__ecereTemp1));
+exp->expType = __extension__ ({
+struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
+
+__ecereInstance1->refCount = 1, __ecereInstance1->kind = 13, __ecereInstance1->type = basicType, __ecereInstance1;
+});
 if(!exp->destType)
 {
 exp->destType = exp->expType;
@@ -14126,6 +16232,7 @@ struct Expression * exp;
 char * string = PrintHexUInt64(arg.expression.ui64);
 
 exp = MkExpCast(MkTypeName(specs, decl), MkExpConstant(string));
+(__ecereNameSpace__ecere__com__eSystem_Delete(string), string = 0);
 ProcessExpressionType(exp);
 ComputeExpression(exp);
 expString[0] = '\0';
@@ -14183,7 +16290,7 @@ FinishTemplatesContext(context);
 }
 }
 else
-Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString(__thisModule, "undefined class %s\n", (((void *)0))), (id && (!id->_class || id->_class->name)) ? (id->classSym ? id->classSym->string : (type->_class ? type->_class->string : (((void *)0)))) : "(null)");
+Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "undefined class %s\n", (((void *)0))), (id && (!id->_class || id->_class->name)) ? (id->classSym ? id->classSym->string : (type->_class ? type->_class->string : (((void *)0)))) : "(null)");
 }
 else if(type && (type->kind == 9 || type->kind == 10))
 {
@@ -14206,7 +16313,7 @@ if(inCompiler)
 PrintExpression(exp, expString);
 __ecereNameSpace__ecere__sys__ChangeCh(expString, '\n', ' ');
 }
-Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString(__thisModule, "member operator on non-structure type expression %s\n", (((void *)0))), expString);
+Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "member operator on non-structure type expression %s\n", (((void *)0))), expString);
 }
 if(exp->expType && exp->expType->kind == 21 && (!exp->destType || exp->destType->kind != 21))
 {
@@ -14282,14 +16389,22 @@ exp->member.member = MkIdentifier("structSize");
 }
 }
 }
-exp->expType = (__ecereTemp1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type), ((struct Type *)__ecereTemp1)->refCount = 1, ((struct Type *)__ecereTemp1)->kind = 3, ((struct Type *)__ecereTemp1));
+exp->expType = __extension__ ({
+struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
+
+__ecereInstance1->refCount = 1, __ecereInstance1->kind = 3, __ecereInstance1;
+});
 break;
 }
 case 10:
 {
 struct Type * type = ProcessType(exp->typeName->qualifiers, exp->typeName->declarator);
 
-exp->expType = (__ecereTemp1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type), ((struct Type *)__ecereTemp1)->refCount = 1, ((struct Type *)__ecereTemp1)->kind = 3, ((struct Type *)__ecereTemp1));
+exp->expType = __extension__ ({
+struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
+
+__ecereInstance1->refCount = 1, __ecereInstance1->kind = 3, __ecereInstance1;
+});
 exp->isConstant = 0x1;
 DeclareType(type, 0x0, 0x0);
 FreeType(type);
@@ -14299,12 +16414,12 @@ case 11:
 {
 struct Type * type = ProcessType(exp->cast.typeName->qualifiers, exp->cast.typeName->declarator);
 
-type->count = (unsigned int)1;
+type->count = 1;
 FreeType(exp->cast.exp->destType);
 exp->cast.exp->destType = type;
 type->refCount++;
 ProcessExpressionType(exp->cast.exp);
-type->count = (unsigned int)0;
+type->count = 0;
 exp->expType = type;
 if(!exp->cast.exp->needCast && !NeedCast(exp->cast.exp->expType, type))
 {
@@ -14332,20 +16447,18 @@ exp->isConstant = exp->cast.exp->isConstant;
 }
 break;
 }
-case 35:
+case 33:
 {
 struct Type * type = ProcessType(exp->initializer.typeName->qualifiers, exp->initializer.typeName->declarator);
 
-type->refCount++;
 exp->expType = type;
 break;
 }
-case 36:
+case 34:
 {
 struct Type * type = ProcessType(exp->vaArg.typeName->qualifiers, exp->vaArg.typeName->declarator);
 
 ProcessExpressionType(exp->vaArg.exp);
-type->refCount++;
 exp->expType = type;
 break;
 }
@@ -14388,7 +16501,7 @@ if(!exp->cond.elseExp->isConstant)
 exp->isConstant = 0x0;
 break;
 }
-case 25:
+case 23:
 {
 if(exp->compound && exp->compound->compound.statements && (*exp->compound->compound.statements).last)
 {
@@ -14401,13 +16514,13 @@ if(exp->destType)
 exp->destType->refCount++;
 }
 ProcessStatement(exp->compound);
-exp->expType = ((struct Expression *)(*last->expressions).last)->expType;
-if(((struct Expression *)(*last->expressions).last)->expType)
+exp->expType = (last->expressions && (*last->expressions).last) ? ((struct Expression *)(*last->expressions).last)->expType : (((void *)0));
+if(exp->expType)
 exp->expType->refCount++;
 }
 break;
 }
-case 26:
+case 24:
 {
 struct Specifier * spec = (*exp->_classExp.specifiers).first;
 
@@ -14424,7 +16537,7 @@ exp->byReference = 0x1;
 }
 break;
 }
-case 27:
+case 25:
 {
 struct __ecereNameSpace__ecere__com__Class * _class = thisClass ? thisClass : currentClass;
 
@@ -14448,7 +16561,7 @@ return ;
 }
 break;
 }
-case 37:
+case 35:
 {
 struct Type * type = (((void *)0));
 char * typeString = (((void *)0));
@@ -14506,7 +16619,7 @@ e->expType = (((void *)0));
 if(type)
 {
 typeStringBuf[0] = '\0';
-PrintType(type, typeStringBuf, 0x0, 0x1);
+PrintTypeNoConst(type, typeStringBuf, 0x0, 0x1);
 typeString = typeStringBuf;
 FreeType(type);
 type = (((void *)0));
@@ -14547,7 +16660,11 @@ ListAdd(structInitializers, MkInitializerAssignment(MkExpConstant("0")));
 ProcessExpressionType(((struct Initializer *)(*structInitializers).last)->exp);
 ListAdd(structInitializers, MkInitializerAssignment(MkExpExtensionInitializer(MkTypeName(specs, MkDeclaratorArray(decl, (((void *)0)))), MkInitializerList(initializers))));
 ProcessExpressionType(((struct Initializer *)(*structInitializers).last)->exp);
-ListAdd(structInitializers, MkInitializerAssignment((__ecereTemp1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression), ((struct Expression *)__ecereTemp1)->type = 2, ((struct Expression *)__ecereTemp1)->constant = __ecereNameSpace__ecere__com__PrintString(__ecereClass_int, &(*initializers).count, (void *)0), ((struct Expression *)__ecereTemp1))));
+ListAdd(structInitializers, MkInitializerAssignment(__extension__ ({
+struct Expression * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Expression);
+
+__ecereInstance1->type = 2, __ecereInstance1->constant = __ecereNameSpace__ecere__com__PrintString(__ecereClass_int, &(*initializers).count, (void *)0), __ecereInstance1;
+})));
 ProcessExpressionType(((struct Initializer *)(*structInitializers).last)->exp);
 ListAdd(structInitializers, MkInitializerAssignment(MkExpClass(CopyList(specs, CopySpecifier), CopyDeclarator(decl))));
 ProcessExpressionType(((struct Initializer *)(*structInitializers).last)->exp);
@@ -14559,7 +16676,7 @@ ProcessExpressionType(expExt);
 else
 {
 exp->expType = ProcessTypeString("Container", 0x0);
-Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString(__thisModule, "Couldn't determine type of array elements\n", (((void *)0))));
+Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Couldn't determine type of array elements\n", (((void *)0))));
 }
 break;
 }
@@ -14595,7 +16712,7 @@ struct __ecereNameSpace__ecere__sys__NamedLink * member;
 
 for(member = symbol->type->members.first; member; member = member->next)
 {
-struct __ecereNameSpace__ecere__sys__NamedLink * value = (value = __ecereNameSpace__ecere__com__eSystem_New0(16), value->name = __ecereNameSpace__ecere__sys__CopyString(member->name), value);
+struct __ecereNameSpace__ecere__sys__NamedLink * value = (value = __ecereNameSpace__ecere__com__eSystem_New0(structSize_NamedLink), value->name = __ecereNameSpace__ecere__sys__CopyString(member->name), value);
 
 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Add(&exp->expType->members, value);
 }
@@ -14631,9 +16748,9 @@ PrintExpression(exp, expString);
 __ecereNameSpace__ecere__sys__ChangeCh(expString, '\n', ' ');
 }
 if(unresolved)
-Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString(__thisModule, "unresolved identifier %s; expected %s\n", (((void *)0))), expString, type2);
+Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "unresolved identifier %s; expected %s\n", (((void *)0))), expString, type2);
 else if(exp->type != 16)
-Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString(__thisModule, "couldn't determine type of %s; expected %s\n", (((void *)0))), expString, type2);
+Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "couldn't determine type of %s; expected %s\n", (((void *)0))), expString, type2);
 }
 }
 else
@@ -14647,9 +16764,9 @@ PrintExpression(exp, expString);
 __ecereNameSpace__ecere__sys__ChangeCh(expString, '\n', ' ');
 }
 if(unresolved)
-Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString(__thisModule, "unresolved identifier %s\n", (((void *)0))), expString);
+Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "unresolved identifier %s\n", (((void *)0))), expString);
 else if(exp->type != 16)
-Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString(__thisModule, "couldn't determine type of %s\n", (((void *)0))), expString);
+Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "couldn't determine type of %s\n", (((void *)0))), expString);
 }
 }
 else
@@ -14677,7 +16794,7 @@ PrintExpression(exp, expString);
 __ecereNameSpace__ecere__sys__ChangeCh(expString, '\n', ' ');
 }
 if(!sourceFile || (strcmp(sourceFile, "src\\lexer.ec") && strcmp(sourceFile, "src/lexer.ec") && strcmp(sourceFile, "src\\grammar.ec") && strcmp(sourceFile, "src/grammar.ec")))
-Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString(__thisModule, "incompatible expression %s (%s); expected %s\n", (((void *)0))), expString, type1, type2);
+Compiler_Warning(__ecereNameSpace__ecere__GetTranslatedString("ec", "incompatible expression %s (%s); expected %s\n", (((void *)0))), expString, type1, type2);
 FreeType(exp->expType);
 exp->destType->refCount++;
 exp->expType = exp->destType;
@@ -14709,9 +16826,9 @@ exp->cast.exp = newExp;
 else if(unresolved)
 {
 if(exp->identifier->_class && exp->identifier->_class->name)
-Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString(__thisModule, "unresolved identifier %s::%s\n", (((void *)0))), exp->identifier->_class->name, exp->identifier->string);
+Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "unresolved identifier %s::%s\n", (((void *)0))), exp->identifier->_class->name, exp->identifier->string);
 else if(exp->identifier->string && exp->identifier->string[0])
-Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString(__thisModule, "unresolved identifier %s\n", (((void *)0))), exp->identifier->string);
+Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "unresolved identifier %s\n", (((void *)0))), exp->identifier->string);
 }
 else if(!exp->expType && exp->type != 16)
 {
@@ -14723,10 +16840,11 @@ if(inCompiler)
 PrintExpression(exp, expString);
 __ecereNameSpace__ecere__sys__ChangeCh(expString, '\n', ' ');
 }
-Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString(__thisModule, "couldn't determine type of %s\n", (((void *)0))), expString);
+Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "couldn't determine type of %s\n", (((void *)0))), expString);
 }
+if(inCompiler)
 ApplyAnyObjectLogic(exp);
-if(!notByReference && exp->expType && exp->expType->kind == 8 && exp->expType->_class && exp->expType->_class->registered && exp->expType->_class->registered->type == 5)
+if(!notByReference && exp->expType && exp->expType->kind == 8 && exp->expType->_class && exp->expType->_class->registered && exp->expType->_class->registered->type == 5 && (!exp->destType || (exp->destType->kind != 3 && exp->destType->kind != 4 && exp->destType->kind != 22 && exp->destType->kind != 23 && exp->destType->kind != 5 && exp->destType->kind != 2 && exp->destType->kind != 1 && exp->destType->kind != 24)))
 {
 exp->byReference = 0x1;
 }
@@ -14873,7 +16991,7 @@ if(type && type->kind == 12)
 FreeType(initializerType);
 if(type && type->kind != 12 && type->kind != 9 && type->kind != 10 && (type->kind != 8 || !type->_class->registered || type->_class->registered->type != 1))
 {
-Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString(__thisModule, "Assigning list initializer to non list\n", (((void *)0))));
+Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Assigning list initializer to non list\n", (((void *)0))));
 }
 break;
 }
@@ -15235,10 +17353,8 @@ struct Statement * prevCompound = curCompound;
 struct Context * prevContext = curContext;
 
 if(!stmt->compound.isSwitch)
-{
 curCompound = stmt;
 curContext = stmt->compound.context;
-}
 if(stmt->compound.declarations)
 {
 for(decl = (*stmt->compound.declarations).first; decl; decl = decl->next)
@@ -15375,7 +17491,7 @@ struct Statement * block = stmt->forEachStmt.stmt;
 char iteratorType[1024];
 struct Type * source;
 struct Expression * e;
-unsigned int isBuiltin = exp && (*exp).last && (((struct Expression *)(*exp).last)->type == 37 || (((struct Expression *)(*exp).last)->type == 11 && ((struct Expression *)(*exp).last)->cast.exp->type == 37));
+unsigned int isBuiltin = exp && (*exp).last && (((struct Expression *)(*exp).last)->type == 35 || (((struct Expression *)(*exp).last)->type == 11 && ((struct Expression *)(*exp).last)->cast.exp->type == 35));
 struct Expression * arrayExp;
 char * typeString = (((void *)0));
 int builtinCount = 0;
@@ -15439,7 +17555,7 @@ else if(isBuiltin)
 struct Type * type = (((void *)0));
 char typeStringBuf[1024];
 
-arrayExp = (((struct Expression *)(*exp).last)->type == 37) ? (struct Expression *)(*exp).last : ((struct Expression *)(*exp).last)->cast.exp;
+arrayExp = (((struct Expression *)(*exp).last)->type == 35) ? (struct Expression *)(*exp).last : ((struct Expression *)(*exp).last)->cast.exp;
 if(((struct Expression *)(*exp).last)->type == 11)
 {
 struct TypeName * typeName = ((struct Expression *)(*exp).last)->cast.typeName;
@@ -15529,13 +17645,13 @@ FreeType(type);
 }
 decl = SpecDeclFromString(typeString, specs, MkDeclaratorIdentifier(id));
 stmt->compound.declarations = MkListOne(MkDeclaration(CopyList(specs, CopySpecifier), MkListOne(MkInitDeclarator(MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), decl), (((void *)0))))));
-ListAdd(stmt->compound.declarations, MkDeclaration(specs, MkListOne(MkInitDeclarator(MkDeclaratorArray(PlugDeclarator(decl, MkDeclaratorIdentifier(MkIdentifier("__internalArray"))), (((void *)0))), MkInitializerList(initializers)))));
+ListAdd(stmt->compound.declarations, MkDeclaration(specs, MkListOne(MkInitDeclarator(PlugDeclarator(decl, MkDeclaratorArray(MkDeclaratorIdentifier(MkIdentifier("__internalArray")), (((void *)0)))), MkInitializerList(initializers)))));
 FreeList(exp, FreeExpression);
 }
 else
 {
 arrayExp->expType = ProcessTypeString("Container", 0x0);
-Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString(__thisModule, "Couldn't determine type of array elements\n", (((void *)0))));
+Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Couldn't determine type of array elements\n", (((void *)0))));
 }
 }
 else if(isLinkList && !isList)
@@ -15556,9 +17672,41 @@ sprintf(iteratorType, "Iterator<%s, %s >", _class->templateArgs[2].dataTypeStrin
 stmt->compound.declarations = MkListOne(MkDeclarationInst(MkInstantiationNamed(MkListOne(MkSpecifierName(iteratorType)), MkExpIdentifier(id), MkListOne(MkMembersInitList(MkListOne(MkMemberInit(isMap ? MkListOne(MkIdentifier("map")) : (((void *)0)), MkInitializerAssignment(MkExpBrackets(exp)))))))));
 }
 symbol = FindSymbol(id->string, curContext, curContext, 0x0, 0x0);
-if(block && block->type == 2 && block->compound.context)
+if(block)
 {
+switch(block->type)
+{
+case 2:
+if(block->compound.context)
 block->compound.context->parent = stmt->compound.context;
+break;
+case 4:
+if(block->ifStmt.stmt && block->ifStmt.stmt->type == 2 && block->ifStmt.stmt->compound.context)
+block->ifStmt.stmt->compound.context->parent = stmt->compound.context;
+if(block->ifStmt.elseStmt && block->ifStmt.elseStmt->type == 2 && block->ifStmt.elseStmt->compound.context)
+block->ifStmt.elseStmt->compound.context->parent = stmt->compound.context;
+break;
+case 5:
+if(block->switchStmt.stmt && block->switchStmt.stmt->type == 2 && block->switchStmt.stmt->compound.context)
+block->switchStmt.stmt->compound.context->parent = stmt->compound.context;
+break;
+case 6:
+if(block->whileStmt.stmt && block->whileStmt.stmt->type == 2 && block->whileStmt.stmt->compound.context)
+block->whileStmt.stmt->compound.context->parent = stmt->compound.context;
+break;
+case 7:
+if(block->doWhile.stmt && block->doWhile.stmt->type == 2 && block->doWhile.stmt->compound.context)
+block->doWhile.stmt->compound.context->parent = stmt->compound.context;
+break;
+case 8:
+if(block->forStmt.stmt && block->forStmt.stmt->type == 2 && block->forStmt.stmt->compound.context)
+block->forStmt.stmt->compound.context->parent = stmt->compound.context;
+break;
+case 18:
+if(block->forEachStmt.stmt && block->forEachStmt.stmt->type == 2 && block->forEachStmt.stmt->compound.context)
+block->forEachStmt.stmt->compound.context->parent = stmt->compound.context;
+break;
+}
 }
 if(filter)
 {
@@ -15616,7 +17764,7 @@ break;
 }
 else
 {
-Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString(__thisModule, "Expression is not a container\n", (((void *)0))));
+Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Expression is not a container\n", (((void *)0))));
 }
 break;
 }
@@ -15774,12 +17922,12 @@ ListAdd(args, MkExpIdentifier(MkIdentifier(watcherName)));
 ListAdd(stmt->expressions, MkExpCall(MkExpIdentifier(MkIdentifier("ecere::com::eInstance_Watch")), args));
 }
 else
-Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString(__thisModule, "Property %s not found in class %s\n", (((void *)0))), prop->name, _class->fullName);
+Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Property %s not found in class %s\n", (((void *)0))), propID->string, _class->fullName);
 }
 }
 }
 else
-Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString(__thisModule, "Invalid watched object\n", (((void *)0))));
+Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Invalid watched object\n", (((void *)0))));
 }
 curExternal = external;
 curContext = context;
@@ -15790,7 +17938,7 @@ FreeExpression(object);
 FreeList(watches, FreePropertyWatch);
 }
 else
-Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString(__thisModule, "No observer specified and not inside a _class\n", (((void *)0))));
+Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "No observer specified and not inside a _class\n", (((void *)0))));
 }
 else
 {
@@ -15836,7 +17984,7 @@ if(prop)
 CreateFireWatcher(prop, object, stmt);
 }
 else
-Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString(__thisModule, "Property %s not found in class %s\n", (((void *)0))), propID->string, _class->fullName);
+Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Property %s not found in class %s\n", (((void *)0))), propID->string, _class->fullName);
 }
 }
 else
@@ -15860,7 +18008,7 @@ FreeExpression(object);
 FreeList(watches, FreeIdentifier);
 }
 else
-Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString(__thisModule, "Invalid object specified and not inside a class\n", (((void *)0))));
+Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Invalid object specified and not inside a class\n", (((void *)0))));
 }
 break;
 }
@@ -15920,7 +18068,7 @@ ListAdd(args, watcher ? CopyExpression(watcher) : MkExpIdentifier(MkIdentifier("
 ListAdd(stmt->expressions, MkExpCall(MkExpIdentifier(MkIdentifier("ecere::com::eInstance_StopWatching")), args));
 }
 else
-Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString(__thisModule, "Property %s not found in class %s\n", (((void *)0))), prop->name, _class->fullName);
+Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Property %s not found in class %s\n", (((void *)0))), propID->string, _class->fullName);
 }
 }
 if(object)
@@ -15930,10 +18078,10 @@ FreeExpression(watcher);
 FreeList(watches, FreeIdentifier);
 }
 else
-Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString(__thisModule, "Invalid object specified and not inside a class\n", (((void *)0))));
+Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "Invalid object specified and not inside a class\n", (((void *)0))));
 }
 else
-Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString(__thisModule, "No observer specified and not inside a class\n", (((void *)0))));
+Compiler_Error(__ecereNameSpace__ecere__GetTranslatedString("ec", "No observer specified and not inside a class\n", (((void *)0))));
 }
 break;
 }
@@ -15954,8 +18102,6 @@ extern struct Statement * MkFireWatchersStmt(struct Expression * object, struct
 
 static void ProcessFunction(struct FunctionDefinition * function)
 {
-void * __ecereTemp2;
-void * __ecereTemp1;
 struct Identifier * id = GetDeclId(function->declarator);
 struct Symbol * symbol = function->declarator ? function->declarator->symbol : (((void *)0));
 struct Type * type = symbol ? symbol->type : (((void *)0));
@@ -16037,7 +18183,11 @@ if(type->classObjectType != 1)
 if(type->byReference || _class->type == 3 || _class->type == 1000 || _class->type == 4 || _class->type == 2)
 thisParam->declarator = MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), thisParam->declarator);
 }
-thisParam = (__ecereTemp1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_TypeName), ((struct TypeName *)__ecereTemp1)->declarator = MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), MkDeclaratorIdentifier(MkIdentifier("class"))), ((struct TypeName *)__ecereTemp1)->qualifiers = MkListOne(MkStructOrUnion(3, MkIdentifier("__ecereNameSpace__ecere__com__Class"), (((void *)0)))), ((struct TypeName *)__ecereTemp1));
+thisParam = __extension__ ({
+struct TypeName * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_TypeName);
+
+__ecereInstance1->declarator = MkDeclaratorPointer(MkPointer((((void *)0)), (((void *)0))), MkDeclaratorIdentifier(MkIdentifier("class"))), __ecereInstance1->qualifiers = MkListOne(MkStructOrUnion(3, MkIdentifier("__ecereNameSpace__ecere__com__Class"), (((void *)0)))), __ecereInstance1;
+});
 __ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*funcDecl->function.parameters), (((void *)0)), thisParam);
 }
 }
@@ -16077,12 +18227,17 @@ if(function->body)
 {
 if(type->classObjectType != 1)
 {
-thisSymbol = (__ecereTemp1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Symbol), ((struct Symbol *)__ecereTemp1)->string = __ecereNameSpace__ecere__sys__CopyString("this"), ((struct Symbol *)__ecereTemp1)->type = classSym ? MkClassType(classSym->string) : (((void *)0)), ((struct Symbol *)__ecereTemp1));
+thisSymbol = __extension__ ({
+struct Symbol * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Symbol);
+
+__ecereInstance1->string = __ecereNameSpace__ecere__sys__CopyString("this"), __ecereInstance1->type = classSym ? MkClassType(classSym->string) : (((void *)0)), __ecereInstance1;
+});
 __ecereMethod___ecereNameSpace__ecere__sys__BinaryTree_Add(&function->body->compound.context->symbols, (struct __ecereNameSpace__ecere__sys__BTNode *)thisSymbol);
 if(typedObject && thisSymbol->type)
 {
 thisSymbol->type->classObjectType = 2;
 thisSymbol->type->byReference = type->byReference;
+thisSymbol->type->typedByReference = type->byReference;
 }
 }
 }
@@ -16135,7 +18290,15 @@ else
 exp = QBrackets(MkExpOp(bytePtr, '+', MkExpPointer(QMkExpId(className), MkIdentifier("offset"))));
 }
 exp = QBrackets(QMkExpCond(QMkExpId("this"), exp, MkExpConstant("0")));
-exp->expType = (__ecereTemp2 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type), ((struct Type *)__ecereTemp2)->refCount = 1, ((struct Type *)__ecereTemp2)->kind = 13, ((struct Type *)__ecereTemp2)->type = (__ecereTemp1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type), ((struct Type *)__ecereTemp1)->refCount = 1, ((struct Type *)__ecereTemp1)->kind = 0, ((struct Type *)__ecereTemp1)), ((struct Type *)__ecereTemp2));
+exp->expType = __extension__ ({
+struct Type * __ecereInstance2 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
+
+__ecereInstance2->refCount = 1, __ecereInstance2->kind = 13, __ecereInstance2->type = __extension__ ({
+struct Type * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Type);
+
+__ecereInstance1->refCount = 1, __ecereInstance1->kind = 0, __ecereInstance1;
+}), __ecereInstance2;
+});
 if(function->body)
 {
 yylloc = function->body->loc;
@@ -16323,7 +18486,7 @@ if(function)
 char name[1024];
 
 name[0] = (char)0;
-if(((struct __ecereNameSpace__ecere__com__Module *)(((char *)function->module + 12)))->importType != 1 && (!function->dataType || !function->dataType->dllExport))
+if(((struct __ecereNameSpace__ecere__com__Module *)(((char *)function->module + structSize_Instance)))->importType != 1 && (!function->dataType || !function->dataType->dllExport))
 strcpy(name, "__ecereFunction_");
 FullClassNameCat(name, s, 0x0);
 DeclareFunction(function, name);
@@ -16334,20 +18497,62 @@ extern struct __ecereNameSpace__ecere__com__Instance * GetPrivateModule(void);
 
 void ComputeDataTypes()
 {
-void * __ecereTemp1;
 struct External * external;
 struct External * temp = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_External);
+struct External * after = (((void *)0));
 
 currentClass = (((void *)0));
 containerClass = __ecereNameSpace__ecere__com__eSystem_FindClass(GetPrivateModule(), "Container");
-temp->symbol = (__ecereTemp1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Symbol), ((struct Symbol *)__ecereTemp1)->id = -1000, ((struct Symbol *)__ecereTemp1)->idCode = -1000, ((struct Symbol *)__ecereTemp1));
-__ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*ast), (((void *)0)), temp);
+for(external = (*ast).first; external; external = external->next)
+{
+if(external->type == 1)
+{
+struct Declaration * decl = external->declaration;
+
+if(decl)
+{
+struct __ecereNameSpace__ecere__sys__OldList * decls = decl->declarators;
+
+if(decls)
+{
+struct InitDeclarator * initDecl = (*decls).first;
+
+if(initDecl)
+{
+struct Declarator * declarator = initDecl->declarator;
+
+if(declarator && declarator->type == 1)
+{
+struct Identifier * id = declarator->identifier;
+
+if(id && id->string)
+{
+if(!strcmp(id->string, "uintptr_t") || !strcmp(id->string, "intptr_t") || !strcmp(id->string, "size_t") || !strcmp(id->string, "ssize_t"))
+{
+external->symbol->id = -1001, external->symbol->idCode = -1001;
+after = external;
+}
+}
+}
+}
+}
+}
+}
+}
+temp->symbol = __extension__ ({
+struct Symbol * __ecereInstance1 = __ecereNameSpace__ecere__com__eInstance_New(__ecereClass_Symbol);
+
+__ecereInstance1->id = -1000, __ecereInstance1->idCode = -1000, __ecereInstance1;
+});
+__ecereMethod___ecereNameSpace__ecere__sys__OldList_Insert((&*ast), after, temp);
 curExternal = temp;
 DeclareFunctionUtil("eSystem_New");
 DeclareFunctionUtil("eSystem_New0");
 DeclareFunctionUtil("eSystem_Renew");
 DeclareFunctionUtil("eSystem_Renew0");
+DeclareFunctionUtil("eSystem_Delete");
 DeclareFunctionUtil("eClass_GetProperty");
+DeclareFunctionUtil("eInstance_FireSelfWatchers");
 DeclareStruct("ecere::com::Class", 0x0);
 DeclareStruct("ecere::com::Instance", 0x0);
 DeclareStruct("ecere::com::Property", 0x0);
@@ -16367,6 +18572,7 @@ ProcessFunction(external->function);
 else if(external->type == 1)
 {
 currentClass = (((void *)0));
+if(external->declaration)
 ProcessDeclaration(external->declaration);
 }
 else if(external->type == 2)
@@ -16391,13 +18597,16 @@ thisNameSpace = external->id->string;
 }
 currentClass = (((void *)0));
 thisNameSpace = (((void *)0));
+curExternal = (((void *)0));
 ((temp->symbol ? (__ecereClass_Symbol->Destructor ? __ecereClass_Symbol->Destructor(temp->symbol) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(temp->symbol)) : 0), temp->symbol = 0);
 ((temp ? (__ecereClass_External->Destructor ? __ecereClass_External->Destructor(temp) : 0, __ecereNameSpace__ecere__com__eSystem_Delete(temp)) : 0), temp = 0);
 }
 
 extern struct __ecereNameSpace__ecere__com__GlobalFunction * __ecereNameSpace__ecere__com__eSystem_RegisterFunction(char *  name, char *  type, void *  func, struct __ecereNameSpace__ecere__com__Instance * module, int declMode);
 
-extern struct __ecereNameSpace__ecere__com__Class * __ecereNameSpace__ecere__com__eSystem_RegisterClass(int type, char *  name, char *  baseName, int size, int sizeClass, unsigned int (* )(void * ), void (* )(void * ), struct __ecereNameSpace__ecere__com__Instance * module, int declMode, int inheritanceAccess);
+extern struct __ecereNameSpace__ecere__com__Class * __ecereNameSpace__ecere__com__eSystem_RegisterClass(int type, char *  name, char *  baseName, int size, int sizeClass, unsigned int (*  Constructor)(void * ), void (*  Destructor)(void * ), struct __ecereNameSpace__ecere__com__Instance * module, int declMode, int inheritanceAccess);
+
+extern struct __ecereNameSpace__ecere__com__Instance * __thisModule;
 
 void __ecereRegisterModule_pass15(struct __ecereNameSpace__ecere__com__Instance * module)
 {
@@ -16407,8 +18616,6 @@ __ecereNameSpace__ecere__com__eSystem_RegisterFunction("SetYydebug", "void SetYy
 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("SetThisClass", "void SetThisClass(ecere::com::Class c)", SetThisClass, module, 1);
 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetThisClass", "ecere::com::Class GetThisClass(void)", GetThisClass, module, 1);
 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintExpression", "void PrintExpression(Expression exp, char * string)", PrintExpression, module, 1);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("_strtoi64", "int64 _strtoi64(char * string, char * * endString, int base)", _strtoi64, module, 2);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("_strtoui64", "uint64 _strtoui64(char * string, char * * endString, int base)", _strtoui64, module, 2);
 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ProcessTemplateParameterType", "Type ProcessTemplateParameterType(TemplateParameter param)", ProcessTemplateParameterType, module, 2);
 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("NeedCast", "bool NeedCast(Type type1, Type type2)", NeedCast, module, 2);
 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintInt", "char * PrintInt(int64 result)", PrintInt, module, 1);
@@ -16423,22 +18630,38 @@ __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintChar", "char * Prin
 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintUChar", "char * PrintUChar(byte result)", PrintUChar, module, 1);
 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintFloat", "char * PrintFloat(float result)", PrintFloat, module, 1);
 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintDouble", "char * PrintDouble(double result)", PrintDouble, module, 1);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpInt", "bool GetOpInt(Operand op2, int * value2)", GetOpInt, module, 1);
 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetInt", "bool GetInt(Expression exp, int * value2)", GetInt, module, 1);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpUInt", "bool GetOpUInt(Operand op2, uint * value2)", GetOpUInt, module, 1);
 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetUInt", "bool GetUInt(Expression exp, uint * value2)", GetUInt, module, 1);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpInt64", "bool GetOpInt64(Operand op2, int64 * value2)", GetOpInt64, module, 1);
 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetInt64", "bool GetInt64(Expression exp, int64 * value2)", GetInt64, module, 1);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpUInt64", "bool GetOpUInt64(Operand op2, uint64 * value2)", GetOpUInt64, module, 1);
 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetUInt64", "bool GetUInt64(Expression exp, uint64 * value2)", GetUInt64, module, 1);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpIntPtr", "bool GetOpIntPtr(Operand op2, intptr * value2)", GetOpIntPtr, module, 1);
 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetIntPtr", "bool GetIntPtr(Expression exp, intptr * value2)", GetIntPtr, module, 1);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpUIntPtr", "bool GetOpUIntPtr(Operand op2, uintptr * value2)", GetOpUIntPtr, module, 1);
 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetUIntPtr", "bool GetUIntPtr(Expression exp, uintptr * value2)", GetUIntPtr, module, 1);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpIntSize", "bool GetOpIntSize(Operand op2, intsize * value2)", GetOpIntSize, module, 1);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetIntSize", "bool GetIntSize(Expression exp, intsize * value2)", GetIntSize, module, 1);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpUIntSize", "bool GetOpUIntSize(Operand op2, uintsize * value2)", GetOpUIntSize, module, 1);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetUIntSize", "bool GetUIntSize(Expression exp, uintsize * value2)", GetUIntSize, module, 1);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpShort", "bool GetOpShort(Operand op2, short * value2)", GetOpShort, module, 1);
 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetShort", "bool GetShort(Expression exp, short * value2)", GetShort, module, 1);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpUShort", "bool GetOpUShort(Operand op2, uint16 * value2)", GetOpUShort, module, 1);
 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetUShort", "bool GetUShort(Expression exp, uint16 * value2)", GetUShort, module, 1);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpChar", "bool GetOpChar(Operand op2, char * value2)", GetOpChar, module, 1);
 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetChar", "bool GetChar(Expression exp, char * value2)", GetChar, module, 1);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpUChar", "bool GetOpUChar(Operand op2, byte * value2)", GetOpUChar, module, 1);
 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetUChar", "bool GetUChar(Expression exp, byte * value2)", GetUChar, module, 1);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpFloat", "bool GetOpFloat(Operand op2, float * value2)", GetOpFloat, module, 1);
 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetFloat", "bool GetFloat(Expression exp, float * value2)", GetFloat, module, 1);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOpDouble", "bool GetOpDouble(Operand op2, double * value2)", GetOpDouble, module, 1);
 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetDouble", "bool GetDouble(Expression exp, double * value2)", GetDouble, module, 1);
 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ComputeClassMembers", "void ComputeClassMembers(ecere::com::Class _class, bool isMember)", ComputeClassMembers, module, 2);
 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ComputeModuleClasses", "void ComputeModuleClasses(ecere::com::Module module)", ComputeModuleClasses, module, 1);
 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ComputeTypeSize", "int ComputeTypeSize(Type type)", ComputeTypeSize, module, 1);
-__ecereNameSpace__ecere__com__eSystem_RegisterFunction("AddMembers", "int AddMembers(ecere::sys::OldList * declarations, ecere::com::Class _class, bool isMember, uint * retSize, ecere::com::Class topClass)", AddMembers, module, 2);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("AddMembers", "int AddMembers(ecere::sys::OldList * declarations, ecere::com::Class _class, bool isMember, uint * retSize, ecere::com::Class topClass, bool * addedPadding)", AddMembers, module, 2);
 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("DeclareStruct", "void DeclareStruct(char * name, bool skipNoHead)", DeclareStruct, module, 2);
 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("DeclareProperty", "void DeclareProperty(ecere::com::Property prop, char * setName, char * getName)", DeclareProperty, module, 2);
 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("Dereference", "Type Dereference(Type source)", Dereference, module, 1);
@@ -16456,7 +18679,7 @@ __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ReplaceThisClassSpecifie
 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("DeclareFunction", "bool DeclareFunction(ecere::com::GlobalFunction function, char * name)", DeclareFunction, module, 2);
 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("DeclareGlobalData", "void DeclareGlobalData(GlobalData data)", DeclareGlobalData, module, 2);
 class = __ecereNameSpace__ecere__com__eSystem_RegisterClass(5, "Conversion", 0, sizeof(struct Conversion), 0, 0, 0, module, 2, 1);
-if(((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + 12)))->application == ((struct __ecereNameSpace__ecere__com__Module *)(((char *)__thisModule + 12)))->application && class)
+if(((struct __ecereNameSpace__ecere__com__Module *)(((char *)module + structSize_Instance)))->application == ((struct __ecereNameSpace__ecere__com__Module *)(((char *)__thisModule + structSize_Instance)))->application && class)
 __ecereClass_Conversion = class;
 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("MatchTypes", "bool MatchTypes(Type source, Type dest, ecere::sys::OldList conversions, ecere::com::Class owningClassSource, ecere::com::Class owningClassDest, bool doConversion, bool enumBaseType, bool acceptReversedParams, bool isConversionExploration)", MatchTypes, module, 1);
 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("MatchWithEnums_NameSpace", "bool MatchWithEnums_NameSpace(ecere::com::NameSpace nameSpace, Expression sourceExp, Type dest, char * string, ecere::sys::OldList conversions)", MatchWithEnums_NameSpace, module, 2);
@@ -16464,6 +18687,8 @@ __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ModuleVisibility", "bool
 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("MatchWithEnums_Module", "bool MatchWithEnums_Module(ecere::com::Module mainModule, Expression sourceExp, Type dest, char * string, ecere::sys::OldList conversions)", MatchWithEnums_Module, module, 2);
 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("MatchTypeExpression", "bool MatchTypeExpression(Expression sourceExp, Type dest, ecere::sys::OldList conversions, bool skipUnitBla)", MatchTypeExpression, module, 2);
 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ReadString", "void ReadString(char * output, char * string)", ReadString, module, 1);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("UnescapeString", "int UnescapeString(char * d, char * s, int len)", UnescapeString, module, 1);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("OffsetEscapedString", "char * OffsetEscapedString(char * s, int len, int offset)", OffsetEscapedString, module, 1);
 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetOperand", "Operand GetOperand(Expression exp)", GetOperand, module, 1);
 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PopulateInstance", "void PopulateInstance(Instantiation inst)", PopulateInstance, module, 1);
 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ComputeInstantiation", "void ComputeInstantiation(Expression exp)", ComputeInstantiation, module, 1);
@@ -16472,7 +18697,9 @@ __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ComputeExpression", "voi
 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("CheckTemplateTypes", "void CheckTemplateTypes(Expression exp)", CheckTemplateTypes, module, 1);
 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("FindSymbol", "Symbol FindSymbol(char * name, Context startContext, Context endContext, bool isStruct, bool globalNameSpace)", FindSymbol, module, 1);
 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintType", "void PrintType(Type type, char * string, bool printName, bool fullName)", PrintType, module, 1);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("PrintTypeNoConst", "void PrintTypeNoConst(Type type, char * string, bool printName, bool fullName)", PrintTypeNoConst, module, 1);
 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("FindMemberAndOffset", "Type FindMemberAndOffset(Type type, char * string, uint * offset)", FindMemberAndOffset, module, 1);
+__ecereNameSpace__ecere__com__eSystem_RegisterFunction("GetParseError", "bool GetParseError(void)", GetParseError, module, 1);
 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ParseExpressionString", "Expression ParseExpressionString(char * expression)", ParseExpressionString, module, 1);
 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ReplaceExpContents", "void ReplaceExpContents(Expression checkedExp, Expression newExp)", ReplaceExpContents, module, 1);
 __ecereNameSpace__ecere__com__eSystem_RegisterFunction("ApplyAnyObjectLogic", "void ApplyAnyObjectLogic(Expression e)", ApplyAnyObjectLogic, module, 1);