aboutsummaryrefslogtreecommitdiff
path: root/src/jsifier.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/jsifier.js')
-rw-r--r--src/jsifier.js26
1 files changed, 16 insertions, 10 deletions
diff --git a/src/jsifier.js b/src/jsifier.js
index fb813e30..4720798c 100644
--- a/src/jsifier.js
+++ b/src/jsifier.js
@@ -76,7 +76,12 @@ function JSify(data, functionsOnly, givenTypes, givenFunctions) {
return '{ ' + ret.join(', ') + ' }';
}
- return makeGetSlab(ptr, type) + '[' + calcFastOffset(ptr, pos, noNeedFirst) + ']';
+ var offset = calcFastOffset(ptr, pos, noNeedFirst);
+ if (SAFE_HEAP) {
+ return 'SAFE_HEAP_LOAD(' + offset + ', "' + safeQuote(type) + '")';
+ } else {
+ return makeGetSlab(ptr, type) + '[' + offset + ']';
+ }
}
function indexizeFunctions(value) { // TODO: Also check for other functions (externals, library, etc.)
@@ -99,15 +104,13 @@ function JSify(data, functionsOnly, givenTypes, givenFunctions) {
value = indexizeFunctions(value);
var offset = calcFastOffset(ptr, pos, noNeedFirst);
if (SAFE_HEAP) {
- return 'SAFE_HEAP_STORE(' + offset + ', ' + value + ')';
+ return 'SAFE_HEAP_STORE(' + offset + ', ' + value + ', "' + safeQuote(type) + '")';
} else {
return makeGetSlab(ptr, type) + '[' + offset + '] = ' + value;
}
}
function makeEmptyStruct(type) {
- dprint('types', '??makeemptystruct?? ' + dump(type));
- // XXX hardcoded ptr impl
var ret = [];
var typeData = TYPES[type];
assertTrue(typeData);
@@ -218,13 +221,16 @@ function JSify(data, functionsOnly, givenTypes, givenFunctions) {
item.JS = '\n__globalConstructor__ = function() {\n' +
item.ctors.map(function(ctor) { return ' ' + toNiceIdent(ctor) + '();' }).join('\n') +
'\n}\n';
- } else if (item.type == 'external') {
- item.JS = 'var ' + item.ident + ' = ' + '0; /* external value? */';
} else {
item.JS = 'var ' + item.ident + ';';
return [item, {
intertype: 'GlobalVariable',
- JS: 'globalFuncs.push(function() { return ' + item.ident + ' = ' + parseConst(item.value, item.type) + ' });',
+ JS: 'globalFuncs.push(function() { return ' + item.ident + ' = ' + (
+ item.external ?
+ makePointer(JSON.stringify(makeEmptyStruct(item.type)), null, 'ALLOC_STATIC', item.type) + ' /* external value? */'
+ :
+ parseConst(item.value, item.type)
+ ) + ' });',
__result__: true,
}];
}
@@ -868,10 +874,11 @@ function JSify(data, functionsOnly, givenTypes, givenFunctions) {
function makeFunctionCall(ident, params, funcData) {
// Special cases
if (ident == '_llvm_va_start') {
+ // varargs
var args = 'Array.prototype.slice.call(arguments, __numArgs__)';
var data = 'Pointer_make([' + args + '.length].concat(' + args + '), 0)';
if (SAFE_HEAP) {
- return 'SAFE_HEAP_STORE(' + params[0].ident + ', ' + data + ', 0)';
+ return 'SAFE_HEAP_STORE(' + params[0].ident + ', ' + data + ', null)';
} else {
return 'IHEAP[' + params[0].ident + '] = ' + data;
}
@@ -927,8 +934,7 @@ function JSify(data, functionsOnly, givenTypes, givenFunctions) {
if (functionsOnly) return ret;
- var params = { 'QUANTUM_SIZE': QUANTUM_SIZE };
- var body = preprocess(read('preamble.js').replace('{{RUNTIME}}', getRuntime()) + ret + read('postamble.js'), params);
+ var body = preprocess(read('preamble.js').replace('{{RUNTIME}}', getRuntime()) + ret + read('postamble.js'), CONSTANTS);
function reverse_(x) {
if (LLVM_STYLE === 'old') {
return x.reverse();