diff options
author | Alon Zakai <azakai@mozilla.com> | 2010-11-25 15:39:08 -0800 |
---|---|---|
committer | Alon Zakai <azakai@mozilla.com> | 2010-11-25 15:39:08 -0800 |
commit | 66d539dbe657aef413d05cdd8e69ee9768a5cb37 (patch) | |
tree | 2b526ad02c7c603e3ecf5fdcb31a39c6126b5a69 /src | |
parent | b5eea6060f32c1be666fd52ba8b337701f8723dc (diff) |
improve lua test + fixes
Diffstat (limited to 'src')
-rw-r--r-- | src/library.js | 37 | ||||
-rw-r--r-- | src/preamble.js | 36 | ||||
-rw-r--r-- | src/runtime.js | 4 |
3 files changed, 53 insertions, 24 deletions
diff --git a/src/library.js b/src/library.js index e39d5a1e..6e41b547 100644 --- a/src/library.js +++ b/src/library.js @@ -11,6 +11,12 @@ var Library = { __print__(Pointer_stringify(__formatString.apply(null, args))); }, + sprintf: function() { + var str = arguments[0]; + var args = Array.prototype.slice.call(arguments, 1); + _strcpy(str, __formatString.apply(null, args)); // not terribly efficient + }, + fflush: function(file) { __print__(null); }, @@ -96,6 +102,37 @@ var Library = { return 0; // TODO }, + strtod: function(str, endptr) { + // XXX handles only whitespace + |[0-9]+(.[0.9]+)?|, no e+ + while (_isspace(str)) str++; + var chr; + var ret = 0; + while(1) { + chr = IHEAP[str]; + if (!_isdigit(chr)) break; + ret = ret*10 + chr - '0'.charCodeAt(0); + str++; + } + if (IHEAP[str] == '.'.charCodeAt(0)) { + str++; + var mul=1/10; + while(1) { + chr = IHEAP[str]; + if (!_isdigit(chr)) break; + ret += mul*(chr - '0'.charCodeAt(0)); + mul /= 10; + str++; + } + } + if (endptr) { + IHEAP[endptr] = str; +#if SAFE_HEAP + SAFE_HEAP_ACCESS(endptr, null, true); +#endif + } + return ret; + }, + // string.h strspn: function(pstr, pset) { diff --git a/src/preamble.js b/src/preamble.js index 53463c1a..d70ec570 100644 --- a/src/preamble.js +++ b/src/preamble.js @@ -14,8 +14,6 @@ var __THREW__ = false; // Used in checking for thrown exceptions. var __ATEXIT__ = []; #if SAFE_HEAP -var MAX_WARNINGS = 10; -var WARNINGS = 0; // Semi-manual memory corruption debugging var HEAP_WATCHED = {}; @@ -270,22 +268,21 @@ function __formatString() { var ret = []; var curr = -1; while (curr) { // Note: should be curr != 0, technically. But this helps catch bugs with undefineds -#if USE_TYPED_ARRAYS curr = IHEAP[textIndex]; next = IHEAP[textIndex+1]; -#else - curr = HEAP[textIndex]; - next = HEAP[textIndex+1]; -#endif if (curr == '%'.charCodeAt(0) && ['d', 'u', 'f', '.'].indexOf(String.fromCharCode(next)) != -1) { var argText = String(+arguments[argIndex]); // +: boolean=>int // Handle very very simply formatting, namely only %.Xf if (next == '.'.charCodeAt(0)) { -#if USE_TYPED_ARRAYS - var limit = parseInt(String.fromCharCode(IHEAP[textIndex+2])); -#else - var limit = parseInt(String.fromCharCode(HEAP[textIndex+2])); -#endif + var limit = 0; + while(1) { + var limitChr = IHEAP[textIndex+2]; + if (!(limitChr >= '0'.charCodeAt(0) && limitChr <= '9'.charCodeAt(0))) break; + limit *= 10; + limit += limitChr - '0'.charCodeAt(0); + textIndex++; + } + textIndex--; var dotIndex = argText.indexOf('.'); if (dotIndex == -1) { dotIndex = argText.length; @@ -342,21 +339,14 @@ function _atoi(s) { } function _llvm_memcpy_i32(dest, src, num, idunno) { + var curr; for (var i = 0; i < num; i++) { + curr = HEAP[src + i] || 0; // memcpy sometimes copies uninitialized areas XXX: Investigate why initializing alloc'ed memory does not fix that too #if SAFE_HEAP - var curr = HEAP[src + i]; - if (!curr && curr !== 0 && curr !== false) { - curr = 0; // memcpy can sometimes copy invalid areas, like copying an entire struct with some uninitialized parts - WARNINGS++; - if (WARNINGS < MAX_WARNINGS) { - print('WARNING: memcpy copying from ' + (src+i) + ' where there is no valid value; copying 0 instead'); - } else if (WARNINGS == MAX_WARNINGS) { - print('WARNING: Not showing further warnings'); - } - } SAFE_HEAP_STORE(dest + i, curr, null); #else - HEAP[dest + i] = HEAP[src + i]; + HEAP[dest + i] = curr; +#endif #if USE_TYPED_ARRAYS // TODO: optimize somehow - this is slower than without typed arrays IHEAP[dest + i] = IHEAP[src + i]; diff --git a/src/runtime.js b/src/runtime.js index 3b7ab23c..2e76af39 100644 --- a/src/runtime.js +++ b/src/runtime.js @@ -5,8 +5,10 @@ RuntimeGenerator = { alloc: function(size, type) { var ret = type + 'TOP'; - //ret += '; for (var i = 0; i < ' + size + '; i++) HEAP[' + type + 'TOP+i] = 0'; // No need for typed arrays - per the spec, initialized to 0 anyhow if (GUARD_MEMORY) { + //if (!USE_TYPED_ARRAYS) { // No need for typed arrays - per the spec, initialized to 0 anyhow + // ret += '; for (var i = 0; i < ' + size + '; i++) HEAP[' + type + 'TOP+i] = 0'; + //} ret += '; assert(' + size + ' > 0)'; } ret += '; ' + type + 'TOP += ' + size; |