--- !ditz.rubyforge.org,2008-03-06/issue title: (0 % 4) evals to NaN with emscriptenduktest, DUK_OP_MOD arguments are 0 and 0 for some reason desc: "\"eval(0) % eval(4)\" works correctly, and DUK_OP_MOD arguments are then correct." type: :bugfix component: duk release: v0.10 reporter: sva status: :closed disposition: :fixed creation_time: 2014-02-13 22:30:57.472253 Z references: [] id: 0c76522d334118c0c3c41a8abcea50e975934fcd log_events: - - 2014-02-13 22:30:57.632080 Z - sva - created - "" - - 2014-02-13 23:00:40.538998 Z - sva - commented - |- The ultimate cause seems to be that Emscripten requires alignment to be 8 for duk_tval. When this is not the case, DUK_TVAL_SET_TVAL() for example will not work correctly. In the (0 % 4) expression this causes the constant 4 to be written into the constants table incorrectly, so that the bytecode executor ends up computing 0 % 0 instead. After forcing hobject alignment to 8, there is still a misalignment with at least function 'data' area whose starting address may not be divisible by 8. When this is the case, the constant gets corrupted again in the final function-to-template conversion step of the compiler. The general fix for this is to ensure alignment by 8 for buffer data, even for fixed buffers. - - 2014-02-13 23:08:57.904735 Z - sva - commented - |- Minimal hacky test fixes are: * Force DUK_USE_UNALIGNED_ACCESSES_POSSIBLE in duk_features.h. This may be difficult to detect automatically, because emcc target may look like x86 but still not allow unaligned accesses. * Add a dummy 'double dummy' member to struct duk_hbuffer_fixed in duk_hbuffer.h. This forces the fixed data area to be 8-byte aligned which is not true by default as the struct doesn't contain any 8-byte members which would force the struct to pad out to an 8-byte multiple. * Change DUK_HOBJECT_ALIGN_TARGET from 4 to 8. With these hacks, 'make emscriptenduktest' works as expected, as does the expression "0 % 4", etc. These should be fixed automatically when alignment fixes are done in general. - - 2014-02-15 02:05:57.231921 Z - sva - closed with disposition fixed - Caused by lack of alignment (by 8).