aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/library.js7
-rwxr-xr-xtests/runner.py25
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>