aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/library.js37
-rw-r--r--src/preamble.js36
-rw-r--r--src/runtime.js4
-rw-r--r--tests/runner.py4
4 files changed, 55 insertions, 26 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;
diff --git a/tests/runner.py b/tests/runner.py
index 69b58672..41be87e8 100644
--- a/tests/runner.py
+++ b/tests/runner.py
@@ -1060,8 +1060,8 @@ if 'benchmark' not in sys.argv:
def test_lua(self):
self.do_ll_test(path_from_root(['tests', 'lua', 'lua.ll']),
- 'hello lua world!',
- args=['-e', '''print("hello lua world!")'''],
+ 'hello lua world!\n17\n*',
+ args=['-e', '''print("hello lua world!");print(17)'''],
f_opt_ll_file=path_from_root(['tests', 'lua', 'lua.Os.ll']),
js_engines=[SPIDERMONKEY_ENGINE])