diff options
author | Alon Zakai <alonzakai@gmail.com> | 2011-09-15 20:06:12 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2011-09-15 20:06:12 -0700 |
commit | 734b1450b5dc644065bd8705a5f1a7b8074cbc61 (patch) | |
tree | 2ddfabe609c907a3729e716407e8d1156bbff43c /src/jsifier.js | |
parent | 534cc7f05846daa88f2d3f2d149d9768262033e9 (diff) | |
parent | 76c15819b22aca811e70127d82e146afa33036f4 (diff) |
Merge pull request #79 from max99x/master
Additions needed for emscripting Ruby
Diffstat (limited to 'src/jsifier.js')
-rw-r--r-- | src/jsifier.js | 28 |
1 files changed, 26 insertions, 2 deletions
diff --git a/src/jsifier.js b/src/jsifier.js index c19eda3a..9a2a82c4 100644 --- a/src/jsifier.js +++ b/src/jsifier.js @@ -207,6 +207,28 @@ function JSify(data, functionsOnly, givenFunctions, givenGlobalVariables) { } var constant = null; if (item.external) { + // Import external global variables from the library if available. + var shortident = item.ident.slice(1); + if (LibraryManager.library[shortident] && + LibraryManager.library[shortident].length && + !BUILD_AS_SHARED_LIB) { + var val = LibraryManager.library[shortident]; + var padding; + if (Runtime.isNumberType(item.type) || isPointerType(item.type)) { + padding = [item.type].concat(zeros(getNativeFieldSize(item.type))); + } else { + padding = makeEmptyStruct(item.type); + } + var padded = val.concat(padding.slice(val.length)); + var js = item.ident + '=' + makePointer(JSON.stringify(padded), null, 'ALLOC_STATIC', item.type) + ';' + if (LibraryManager.library[shortident + '__postset']) { + js += '\n' + LibraryManager.library[shortident + '__postset']; + } + ret.push({ + intertype: 'GlobalVariablePostSet', + JS: js + }); + } return ret; } else { function needsPostSet(value) { @@ -714,6 +736,7 @@ function JSify(data, functionsOnly, givenFunctions, givenGlobalVariables) { var ret = '(function() { try { __THREW__ = false; return ' + call_ + ' ' + '} catch(e) { ' + + 'if (typeof e != "number") throw e; ' + 'if (ABORT) throw e; __THREW__ = true; ' + (EXCEPTION_DEBUG ? 'print("Exception: " + e + ", currently at: " + (new Error().stack)); ' : '') + 'return null } })(); if (!__THREW__) { ' + branch @@ -784,10 +807,11 @@ function JSify(data, functionsOnly, givenFunctions, givenGlobalVariables) { var argsTypes = []; var varargs = []; var varargsTypes = []; + var useJSArgs = (ident.slice(1) + '__jsargs') in LibraryManager.library; params.forEach(function(param, i) { var val = finalizeParam(param); - if (!func || !func.hasVarArgs || i < func.numParams-1) { + if (!func || !func.hasVarArgs || i < func.numParams-1 || useJSArgs) { args.push(val); argsTypes.push(param.type); } else { @@ -801,7 +825,7 @@ function JSify(data, functionsOnly, givenFunctions, givenGlobalVariables) { args = args.map(function(arg, i) { return indexizeFunctions(arg, argsTypes[i]) }); varargs = varargs.map(function(vararg, i) { return vararg === 0 ? 0 : indexizeFunctions(vararg, varargsTypes[i]) }); - if (func && func.hasVarArgs) { + if (func && func.hasVarArgs && !useJSArgs) { if (varargs.length === 0) { varargs = [0]; varargsTypes = ['i32']; |