forwarded 323792 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=23458 thanks
Oops, forgot to attach the test case. PS: I also submitted the bug upstream. -- Kind regards, +--------------------------------------------------------------------+ | Bas Zoetekouw | GPG key: 0644fab7 | |----------------------------| Fingerprint: c1f5 f24c d514 3fec 8bf6 | | [EMAIL PROTECTED], [EMAIL PROTECTED] | a2b1 2bae e41f 0644 fab7 | +--------------------------------------------------------------------+
typedef unsigned char byte; typedef signed short gint16; typedef unsigned int size_t; typedef struct _resource_struct { unsigned char *data; unsigned int size; } resource_t; int sciprintf(char *fmt, ...); int sci_hexdump(byte *data, int length, int offsetplus); static inline gint16 getInt16(byte *d) { return (gint16)(*d | (d[1] << 8)); } static void script_dump_class(char *data, int seeker, int objsize, char **snames, int snames_nr) { int selectors, overloads, selectorsize; sci_hexdump((unsigned char *) data + seeker, objsize -4, seeker); selectors = (selectorsize = getInt16((unsigned char *) data + seeker + 6)); seeker += 8; selectorsize <<= 1; while (selectors--) { int selector = getInt16((unsigned char *) data + (seeker) + selectorsize); sciprintf(" [%03x] %s = 0x%x\n", 0xffff & selector, (snames && selector >= 0 && selector < snames_nr)? snames[selector] : "<?>", getInt16((unsigned char *) data + seeker) & 0xffff); seeker += 2; } overloads = getInt16((unsigned char *) data + seeker); while (overloads--) { sciprintf("%04x\n", getInt16((unsigned char *) data + seeker + selectors*2 + 2) & 0xffff); } } void script_dissect(void *resmgr, int res_no, char **snames, int snames_nr) { int objectctr[11] = {0,0,0,0,0,0,0,0,0,0,0}; unsigned int _seeker = 0; resource_t *script = 0; void **words; words=0; while (_seeker < script->size) { int objtype = getInt16(script->data + _seeker); int objsize; unsigned int seeker = _seeker + 4; if (!objtype) { sciprintf("Classes: %i, Objects: %i, Export: %i,\n Var: %i (all base 10)", objectctr[6], objectctr[1], objectctr[7], objectctr[10]); return; } objsize = getInt16(script->data + _seeker + 2); _seeker += objsize; objectctr[objtype]++; switch (objtype) { case 1: sci_hexdump(script->data + seeker, objsize -4, seeker); break; case 2: script_dump_class ((char *) script->data, seeker, objsize, snames, snames_nr); break; } } }