aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlon Zakai <azakai@mozilla.com>2010-11-25 15:39:08 -0800
committerAlon Zakai <azakai@mozilla.com>2010-11-25 15:39:08 -0800
commit66d539dbe657aef413d05cdd8e69ee9768a5cb37 (patch)
tree2b526ad02c7c603e3ecf5fdcb31a39c6126b5a69 /src
parentb5eea6060f32c1be666fd52ba8b337701f8723dc (diff)
improve lua test + fixes
Diffstat (limited to 'src')
-rw-r--r--src/library.js37
-rw-r--r--src/preamble.js36
-rw-r--r--src/runtime.js4
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;