aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/library.js35
-rw-r--r--src/library_sdl.js4
-rw-r--r--src/parseTools.js42
3 files changed, 44 insertions, 37 deletions
diff --git a/src/library.js b/src/library.js
index 794b270c..6562ff1c 100644
--- a/src/library.js
+++ b/src/library.js
@@ -229,7 +229,7 @@ var Library = {
var text = __formatString(-src, ptr); // |-|src tells formatstring to use C-style params (typically they are from varargs)
var i;
for (i = 0; i < num; i++) {
- {{{ makeCopyValue('dst', 'i', 'text', 'i', 'i8') }}}
+ {{{ makeCopyValue('dst+i', 'text+i', 1, 'i8') }}}
if ({{{ makeGetValue('dst', 'i', 'i8') }}} == 0) break;
}
return i; // Actually, should return how many *would* have been written, if the |num| had not stopped us.
@@ -622,28 +622,9 @@ var Library = {
#if ASSERTIONS
assert(num % 1 === 0, 'memcpy given ' + num + ' bytes to copy. Problem with QUANTUM_SIZE=1 corrections perhaps?');
#endif
- var curr;
-#if USE_TYPED_ARRAYS == 2
- var stop = src + num;
- var fast = dest%4 === src%4;
- while (src%4 !== 0 && src < stop) {
- HEAP8[dest++] = HEAP8[src++];
- }
- while (src+4 <= stop && fast) {
- HEAP32[dest] = HEAP32[src];
- src += 4;
- dest += 4;
- }
- while (src < stop) {
- HEAP8[dest++] = HEAP8[src++];
- }
-#else
- for (var i = 0; i < num; i++) {
- // TODO: optimize for the typed arrays case
- // || 0, since memcpy sometimes copies uninitialized areas XXX: Investigate why initializing alloc'ed memory does not fix that too
- {{{ makeCopyValue('dest', 'i', 'src', 'i', 'null', ' || 0') }}};
- }
-#endif
+ // TODO: optimize for the typed arrays case
+ // || 0, since memcpy sometimes copies uninitialized areas XXX: Investigate why initializing alloc'ed memory does not fix that too
+ {{{ makeCopyValue('dest', 'src', 'num', 'null', ' || 0') }}};
},
llvm_memcpy_i32: 'memcpy',
llvm_memcpy_i64: 'memcpy',
@@ -696,7 +677,7 @@ var Library = {
strcpy: function(pdest, psrc) {
var i = 0;
do {
- {{{ makeCopyValue('pdest', 'i', 'psrc', 'i', 'i8') }}}
+ {{{ makeCopyValue('pdest+i', 'psrc+i', 1, 'i8') }}}
i ++;
} while ({{{ makeGetValue('psrc', 'i-1', 'i8') }}} != 0);
},
@@ -714,7 +695,7 @@ var Library = {
var len = Pointer_stringify(pdest).length; // TODO: use strlen, but need dependencies system
var i = 0;
do {
- {{{ makeCopyValue('pdest', 'len+i', 'psrc', 'i', 'i8') }}}
+ {{{ makeCopyValue('pdest+len+i', 'psrc+i', 1, 'i8') }}}
i ++;
} while ({{{ makeGetValue('psrc', 'i-1', 'i8') }}} != 0);
return pdest;
@@ -724,7 +705,7 @@ var Library = {
var len = Pointer_stringify(pdest).length; // TODO: use strlen, but need dependencies system
var i = 0;
while(1) {
- {{{ makeCopyValue('pdest', 'len+i', 'psrc', 'i', 'i8') }}}
+ {{{ makeCopyValue('pdest+len+i', 'psrc+i', 1, 'i8') }}}
if ({{{ makeGetValue('pdest', 'len+i', 'i8') }}} == 0) break;
i ++;
if (i == num) {
@@ -934,7 +915,7 @@ var Library = {
// LLVM specifics
llvm_va_copy: function(ppdest, ppsrc) {
- {{{ makeCopyValue('ppdest', 0, 'ppsrc', 0, 'null') }}}
+ {{{ makeCopyValue('ppdest', 'ppsrc', QUANTUM_SIZE, 'null') }}}
/* Alternate implementation that copies the actual DATA; it assumes the va_list is prefixed by its size
var psrc = IHEAP[ppsrc]-1;
var num = IHEAP[psrc]; // right before the data, is the number of (flattened) values
diff --git a/src/library_sdl.js b/src/library_sdl.js
index 8c7667ba..abff2cab 100644
--- a/src/library_sdl.js
+++ b/src/library_sdl.js
@@ -288,9 +288,7 @@ mergeInto(Library, {
var srcData = SDL.surfaces[src];
var dstData = SDL.surfaces[dst];
assert(srcData.width === dstData.width && srcData.height === dstData.height);
- for (var i = 0; i < srcData.width*srcData.height*4; i++) {
- {{{ makeCopyValue('dstData.buffer', 'i', 'srcData.buffer', 'i', 'i8') }}}
- }
+ {{{ makeCopyValue('dstData.buffer', 'srcData.buffer', 'srcData.width*srcData.height*4', 'i8') }}}
return 0;
},
diff --git a/src/parseTools.js b/src/parseTools.js
index aa18a010..40f97fdd 100644
--- a/src/parseTools.js
+++ b/src/parseTools.js
@@ -725,14 +725,42 @@ function makeSetValue(ptr, pos, value, type, noNeedFirst, ignore) {
}
}
-function makeCopyValue(dest, destPos, src, srcPos, type, modifier) {
- if (type !== 'null') {
- return makeSetValue(dest, destPos, makeGetValue(src, srcPos, type) + (modifier || ''), type);
+function makeCopyValue(dest, src, num, type, modifier) {
+ function safety() {
+ return ';' + (SAFE_HEAP ? 'SAFE_HEAP_COPY_HISTORY(' + dest + '+$mcpi$, ' + src + '+$mcpi$)' : '');
+ }
+ if (USE_TYPED_ARRAYS in set(0, 1)) {
+ return 'for (var $mcpi$ = 0; $mcpi$ < ' + num + '; $mcpi$++) {\n' +
+ (type !== 'null' ? makeSetValue(dest, '$mcpi$', makeGetValue(src, '$mcpi$', type) + (modifier || ''), type)
+ : // Null is special-cased: We copy over all heaps
+ makeGetSlabs(dest, 'null', true).map(function(slab) {
+ return slab + '[' + dest + '+$mcpi$]=' + slab + '[' + src + '+$mcpi$]'
+ }).join('; ') + safety()
+ ) + '\n' + '}';
+ } else { // USE_TYPED_ARRAYS == 2
+ return 'for (var $mcpi$ = 0; $mcpi$ < ' + num + '; $mcpi$++) {\n' +
+ ' HEAP8[' + dest + '+$mcpi$] = HEAP8[' + src + '+$mcpi$]; ' + safety() + ';\n';
+ '}';
+/* TODO: rework something like this potential optimizing code
+ if (isNumber(num) && num < 12) {
+ } else { // num >= 12 or unknown
+ }
+ var stop = src + num;
+ var fast = dest%4 === src%4;
+ while (src%4 !== 0 && src < stop) {
+ HEAP8[dest++] = HEAP8[src++];
+ }
+ while (src+4 <= stop && fast) {
+ HEAP32[dest] = HEAP32[src];
+ src += 4;
+ dest += 4;
+ }
+ while (src < stop) {
+ HEAP8[dest++] = HEAP8[src++];
+ }
+ }
+*/
}
- // Null is special-cased: We copy over all heaps
- return makeGetSlabs(dest, 'null', true).map(function(slab) {
- return slab + '[' + dest + ' + ' + destPos + ']=' + slab + '[' + src + ' + ' + srcPos + ']'
- }).join('; ') + ';' + (SAFE_HEAP ? 'SAFE_HEAP_COPY_HISTORY(' + dest + ' + ' + destPos + ', ' + src + ' + ' + srcPos + ')' : '');
}
// Given two values and an operation, returns the result of that operation.