aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/library.js26
-rw-r--r--src/preamble.js8
-rw-r--r--src/runtime.js24
3 files changed, 34 insertions, 24 deletions
diff --git a/src/library.js b/src/library.js
index 8a77850f..b60bd07f 100644
--- a/src/library.js
+++ b/src/library.js
@@ -561,14 +561,9 @@ var Library = {
llvm_memmove_p0i8_p0i8_i32: 'memmove',
llvm_memmove_p0i8_p0i8_i64: 'memmove',
- memset: function(ptr, value, num) {
- for (var i = 0; i < num; i++) {
- {{{ makeSetValue('ptr', 'i', 'value', 'null') }}}
- }
- },
- llvm_memset_i32: 'memset',
- llvm_memset_p0i8_i32: 'memset',
- llvm_memset_p0i8_i64: 'memset',
+ llvm_memset_i32: 'Runtime.memset',
+ llvm_memset_p0i8_i32: 'Runtime.memset',
+ llvm_memset_p0i8_i64: 'Runtime.memset',
strlen: function(ptr) {
return String_len(ptr);
@@ -822,6 +817,21 @@ var Library = {
*/
},
+ llvm_bswap_i32: function(x) {
+ x = unSign(x, 32);
+ var bytes = [];
+ for (var i = 0; i < 4; i++) {
+ bytes[i] = x & 255;
+ x >>= 8;
+ }
+ var ret = 0;
+ for (i = 0; i < 4; i++) {
+ ret <<= 8;
+ ret += bytes[i];
+ }
+ return ret;
+ },
+
__assert_fail: function(condition, file, line) {
ABORT = true;
throw 'Assertion failed: ' + Pointer_stringify(condition);//JSON.stringify(arguments)//condition;
diff --git a/src/preamble.js b/src/preamble.js
index ade02496..38c18f35 100644
--- a/src/preamble.js
+++ b/src/preamble.js
@@ -221,7 +221,11 @@ var TOTAL_MEMORY = 50*1024*1024;
function __initializeRuntime__() {
// If we don't have malloc/free implemented, use a simple implementation.
Module['_malloc'] = _malloc = __Znwj = __Znaj = __Znam = __Znwm = Module['_malloc'] ? Module['_malloc'] : Runtime.staticAlloc;
- Module['_calloc'] = _calloc = Module['_calloc'] ? Module['_calloc'] : function(n, s) { return _malloc(n*s) };
+ Module['_calloc'] = _calloc = Module['_calloc'] ? Module['_calloc'] : function(n, s) {
+ var ret = _malloc(n*s);
+ Runtime.memset(ret, 0, n*s);
+ return ret;
+ };
Module['_free'] = _free = __ZdlPv = __ZdaPv = Module['_free'] ? Module['_free'] : function() { };
#if USE_TYPED_ARRAYS
@@ -252,7 +256,7 @@ function __initializeRuntime__() {
Module['FHEAP'] = FHEAP;
STACK_ROOT = STACKTOP = alignMemoryPage(10);
- if (!this['TOTAL_STACK']) TOTAL_STACK = 1024*1024; // Reserved room for stack
+ if (!this['TOTAL_STACK']) TOTAL_STACK = 1024*1024; // Reserved room for stack XXX: Changing this value can lead to bad perf on v8!
STACK_MAX = STACK_ROOT + TOTAL_STACK;
STATICTOP = alignMemoryPage(STACK_MAX);
diff --git a/src/runtime.js b/src/runtime.js
index 6b0d4be6..4de337f7 100644
--- a/src/runtime.js
+++ b/src/runtime.js
@@ -8,15 +8,10 @@ RuntimeGenerator = {
alloc: function(size, type, init) {
var ret = type + 'TOP';
if (GUARD_MEMORY) {
- ret += '; assert(' + size + ' > 0)';
+ ret += '; assert(' + size + ' > 0, "Trying to allocate 0")';
}
if (init) {
- var initMemory = 'for (var i = 0; i < ' + size + '; i++) ' + (
- USE_TYPED_ARRAYS ?
- 'IHEAP[' + type + 'TOP+i] = FHEAP[' + type + 'TOP+i] = 0' :
- 'HEAP[' + type + 'TOP+i] = 0'
- );
- ret += '; ' + initMemory;
+ ret += '; Runtime.memset(' + type + 'TOP, 0, ' + size + ')';
}
ret += '; ' + type + 'TOP += ' + size;
if (QUANTUM_SIZE > 1) {
@@ -29,7 +24,7 @@ RuntimeGenerator = {
stackAlloc: function(size) {
var ret = RuntimeGenerator.alloc(size, 'STACK', INIT_STACK);
if (GUARD_MEMORY) {
- ret += '; assert(STACKTOP < STACK_ROOT + STACK_MAX)';
+ ret += '; assert(STACKTOP < STACK_ROOT + STACK_MAX, "Ran out of stack")';
}
return ret;
},
@@ -44,13 +39,8 @@ RuntimeGenerator = {
ret += '; assert(STACKTOP < STACK_MAX)';
}
if (INIT_STACK) {
- var initMemory = 'for (var i = __stackBase__; i < STACKTOP; i++) {' + (
- USE_TYPED_ARRAYS ?
- 'IHEAP[i] = FHEAP[i] = 0' : // TODO: Benchmark this. Suboptimal due to type differences?
- 'HEAP[i] = 0'
- ) + (SAFE_HEAP ? '; SAFE_HEAP_ACCESS(i, null, true)' : '') + ' }';
+ ret += '; Runtime.memset(__stackBase__, 0, ' + initial + ')';
}
- ret += '; ' + initMemory;
return ret;
},
@@ -87,6 +77,12 @@ Runtime = {
staticAlloc: unInline('staticAlloc', ['size']),
alignMemory: unInline('alignMemory', ['size', 'quantum']),
+ memset: function(ptr, value, num) {
+ for (var i = 0; i < num; i++) {
+ {{{ makeSetValue('ptr', 'i', 'value', 'null') }}}
+ }
+ },
+
getFunctionIndex: function getFunctionIndex(func, ident) {
var key = FUNCTION_TABLE.length;
FUNCTION_TABLE[key] = func;