diff options
-rw-r--r-- | src/library.js | 7 | ||||
-rwxr-xr-x | tests/runner.py | 25 |
2 files changed, 30 insertions, 2 deletions
diff --git a/src/library.js b/src/library.js index 5071552a..9b97b795 100644 --- a/src/library.js +++ b/src/library.js @@ -4221,8 +4221,11 @@ LibraryManager.library = { memcpy__sig: 'iiii', memcpy: function (dest, src, num) { dest = dest|0; src = src|0; num = num|0; + var ret = 0; + ret = dest|0; if ((dest&3) == (src&3)) { - while (dest & 3 & num) { + while (dest & 3) { + if ((num|0) == 0) return ret|0; {{{ makeSetValueAsm('dest', 0, makeGetValueAsm('src', 0, 'i8'), 'i8') }}}; dest = (dest+1)|0; src = (src+1)|0; @@ -4241,7 +4244,7 @@ LibraryManager.library = { src = (src+1)|0; num = (num-1)|0; } - return dest|0; + return ret|0; }, wmemcpy: function() { throw 'wmemcpy not implemented' }, diff --git a/tests/runner.py b/tests/runner.py index 4c8b6379..ffac5045 100755 --- a/tests/runner.py +++ b/tests/runner.py @@ -4108,6 +4108,31 @@ The current type of b is: 9 self.do_run(src, '6c9cdfe937383b79e52ca7a2cce83a21d9f5422c', output_nicerizer = check) + def test_memcpy2(self): + src = r''' + #include <stdio.h> + #include <string.h> + #include <assert.h> + int main() { + char buffer[256]; + for (int i = 0; i < 10; i++) { + for (int j = 0; j < 10; j++) { + for (int k = 0; k < 35; k++) { + for (int t = 0; t < 256; t++) buffer[t] = t; + char *dest = buffer + i + 128; + char *src = buffer+j; + //printf("%d, %d, %d\n", i, j, k); + assert(memcpy(dest, src, k) == dest); + assert(memcmp(dest, src, k) == 0); + } + } + } + printf("ok.\n"); + return 1; + } + ''' + self.do_run(src, 'ok.'); + def test_memmove(self): src = ''' #include <stdio.h> |