diff options
-rw-r--r-- | src/library.js | 4 | ||||
-rwxr-xr-x | tests/runner.py | 29 |
2 files changed, 31 insertions, 2 deletions
diff --git a/src/library.js b/src/library.js index 6c2702ba..1e026937 100644 --- a/src/library.js +++ b/src/library.js @@ -4259,11 +4259,11 @@ LibraryManager.library = { memmove__deps: ['memcpy'], memmove: function(dest, src, num) { dest = dest|0; src = src|0; num = num|0; - if ((src|0 < (dest|0)) & (dest|0 < ((src + num)|0))) { + if (((src|0) < (dest|0)) & ((dest|0) < ((src + num)|0))) { // Unlikely case: Copy backwards in a safe manner src = (src + num)|0; dest = (dest + num)|0; - while (num|0 > 0) { + while ((num|0) > 0) { dest = (dest - 1)|0; src = (src - 1)|0; num = (num - 1)|0; diff --git a/tests/runner.py b/tests/runner.py index 62600830..b6980933 100755 --- a/tests/runner.py +++ b/tests/runner.py @@ -4168,6 +4168,35 @@ The current type of b is: 9 ''' self.do_run(src, 'memmove can be very very useful') + def test_memmove2(self): + if Settings.USE_TYPED_ARRAYS != 2: return self.skip('need ta2') + + src = r''' + #include <stdio.h> + #include <string.h> + #include <assert.h> + int main() { + int sum = 0; + 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; + char *src = buffer + j; + if (dest == src) continue; + //printf("%d, %d, %d\n", i, j, k); + assert(memmove(dest, src, k) == dest); + for (int t = 0; t < 256; t++) sum += buffer[t]; + } + } + } + printf("final: %d.\n", sum); + return 1; + } + ''' + self.do_run(src, 'final: -403200.'); + def test_bsearch(self): if Settings.QUANTUM_SIZE == 1: return self.skip('Test cannot work with q1') |