Mercurial > repos > tabletprog
changeset 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 | 79a14e41b79a |
children | b8f721bde066 |
files | cbackend.js samples/hash.tp |
diffstat | 2 files changed, 36 insertions(+), 6 deletions(-) [+] |
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: [
--- a/samples/hash.tp Mon Mar 30 19:12:51 2015 -0700 +++ b/samples/hash.tp Fri Apr 03 23:07:06 2015 -0700 @@ -6,5 +6,8 @@ print: "hash of 1 is " . (1 hash) . "\n" print: "hash of 2 is " . (2 hash) . "\n" print: "hash of 3 is " . (3 hash) . "\n" + print: "hash of 1u32 is " . (1u32 hash) . "\n" + print: "hash of 2.0 is " . (2.0 hash) . "\n" + print: "hash of 3f32 is " . (3.0f32 hash) . "\n" } }