Mercurial > repos > tabletprog
diff cbackend.js @ 336:2a0463c46913
Add hash method to float types and make hash always return a 32-bit int
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Fri, 03 Apr 2015 23:07:06 -0700 |
parents | 61f5b794d939 |
children | 7279e21dad68 |
line wrap: on
line diff
--- a/cbackend.js Mon Mar 30 19:12:51 2015 -0700 +++ b/cbackend.js Fri Apr 03 23:07:06 2015 -0700 @@ -822,12 +822,25 @@ 'return ' + toplevel.moduleVar('true') + ';' ] }); - intObj.addMessage('hash', { - vars: {}, - lines: [ - 'return &(self->header);' - ] - }); + if (bits == 32 && !unsigned) { + intObj.addMessage('hash', { + vars: {}, + lines: [ + 'return &(self->header);' + ] + }); + } else { + intObj.addMessage('hash', { + vars: { + int32ret: 'obj_int32 *' + }, + lines: [ + 'int32ret = make_object(&obj_int32_meta, NULL, 0);', + bits < 64 ? 'int32ret->num = self->num;' : 'int32ret->num = self->num ^ (self->num >> 32);', + 'return &(int32ret->header);' + ] + }); + } intObj.addMessage('signed?', { vars: {}, lines: [ @@ -901,6 +914,20 @@ 'return &(str->header);' ] }); + + floatObj.addMessage('hash', { + vars: { + intptr: 'int32_t *', + int32ret: 'obj_int32 *' + }, + lines: [ + 'intptr = (int32_t *)&self->num;', + 'int32ret = make_object(&obj_int32_meta, NULL, 0);', + 'int32ret->num = *intptr' + (size == 64 ? ' ^ intptr[1];' : ';'), + 'return &(int32ret->header);' + ] + }); + floatObj.addMessage('f' + bits, { vars: {}, lines: [