aboutsummaryrefslogtreecommitdiff
path: root/src/jsifier.js
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2011-09-15 20:06:12 -0700
committerAlon Zakai <alonzakai@gmail.com>2011-09-15 20:06:12 -0700
commit734b1450b5dc644065bd8705a5f1a7b8074cbc61 (patch)
tree2ddfabe609c907a3729e716407e8d1156bbff43c /src/jsifier.js
parent534cc7f05846daa88f2d3f2d149d9768262033e9 (diff)
parent76c15819b22aca811e70127d82e146afa33036f4 (diff)
Merge pull request #79 from max99x/master
Additions needed for emscripting Ruby
Diffstat (limited to 'src/jsifier.js')
-rw-r--r--src/jsifier.js28
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'];