diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/library.js | 35 | ||||
-rw-r--r-- | src/library_sdl.js | 4 | ||||
-rw-r--r-- | src/parseTools.js | 42 |
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. |