aboutsummaryrefslogtreecommitdiff
path: root/src/jsifier.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/jsifier.js')
-rw-r--r--src/jsifier.js31
1 files changed, 17 insertions, 14 deletions
diff --git a/src/jsifier.js b/src/jsifier.js
index 5a92ba52..7784c1ab 100644
--- a/src/jsifier.js
+++ b/src/jsifier.js
@@ -36,9 +36,6 @@ function JSify(data, functionsOnly, givenFunctions, givenGlobalVariables) {
var GLOBAL_VARIABLES = !mainPass ? givenGlobalVariables : data.globalVariables;
Functions.currFunctions = !mainPass ? givenFunctions : {};
- if (mainPass) {
- Functions.currExternalFunctions = set(data.functionStubs.map(function(item) { return item.ident }));
- }
// Now that first-pass analysis has completed (so we have basic types, etc.), we can get around to handling unparsedFunctions
(!mainPass ? data.functions : data.unparsedFunctions.concat(data.functions)).forEach(function(func) {
@@ -127,7 +124,7 @@ function JSify(data, functionsOnly, givenFunctions, givenGlobalVariables) {
if (value.intertype in PARSABLE_LLVM_FUNCTIONS) {
return [finalizeLLVMFunctionCall(value)];
} else if (Runtime.isNumberType(type) || pointingLevels(type) >= 1) {
- return indexizeFunctions(parseNumerical(value.value));
+ return indexizeFunctions(parseNumerical(value.value), type);
} else if (value.intertype === 'emptystruct') {
return makeEmptyStruct(type);
} else if (value.intertype === 'string') {
@@ -138,23 +135,26 @@ function JSify(data, functionsOnly, givenFunctions, givenGlobalVariables) {
function handleSegments(tokens) {
// Handle a single segment (after comma separation)
function handleSegment(segment) {
+ var ret;
if (segment.intertype === 'value') {
- return segment.value.toString();
+ ret = segment.value.toString();
} else if (segment.intertype === 'emptystruct') {
- return makeEmptyStruct(segment.type);
+ ret = makeEmptyStruct(segment.type);
} else if (segment.intertype in PARSABLE_LLVM_FUNCTIONS) {
- return finalizeLLVMFunctionCall(segment);
+ ret = finalizeLLVMFunctionCall(segment);
} else if (segment.intertype in set('struct', 'list')) {
- return alignStruct(handleSegments(segment.contents), segment.type);
+ ret = alignStruct(handleSegments(segment.contents), segment.type);
} else if (segment.intertype === 'string') {
- return parseLLVMString(segment.text); // + ' /* ' + text + '*/';
+ ret = parseLLVMString(segment.text); // + ' /* ' + text + '*/';
} else if (segment.intertype === 'blockaddress') {
- return finalizeBlockAddress(segment);
+ ret = finalizeBlockAddress(segment);
} else {
throw 'Invalid segment: ' + dump(segment);
}
+ assert(segment.type, 'Missing type for constant segment: ' + dump(segment));
+ return indexizeFunctions(ret, segment.type);
};
- return tokens.map(handleSegment).map(indexizeFunctions);
+ return tokens.map(handleSegment)
}
return alignStruct(handleSegments(value.contents), type);
}
@@ -302,7 +302,7 @@ function JSify(data, functionsOnly, givenFunctions, givenGlobalVariables) {
}
item.JS = addFromLibrary(shortident);
} else {
- item.JS = '// stub for ' + item.ident;
+ item.JS = 'var ' + item.ident + '; // stub for ' + item.ident;
}
return ret;
}
@@ -730,6 +730,7 @@ function JSify(data, functionsOnly, givenFunctions, givenGlobalVariables) {
var func = Functions.currFunctions[ident];
var args = [];
+ var argsTypes = [];
var varargs = [];
var varargsTypes = [];
@@ -737,6 +738,7 @@ function JSify(data, functionsOnly, givenFunctions, givenGlobalVariables) {
var val = finalizeParam(param);
if (!func || !func.hasVarArgs || i < func.numParams-1) { // unrecognized functions (like library ones) cannot have varargs
args.push(val);
+ argsTypes.push(param.type);
} else {
varargs.push(val);
varargs = varargs.concat(zeros(getNativeFieldSize(param.type)-1));
@@ -745,8 +747,9 @@ function JSify(data, functionsOnly, givenFunctions, givenGlobalVariables) {
}
});
- args = args.map(indexizeFunctions);
- varargs = varargs.map(indexizeFunctions);
+ 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 (varargs.length === 0) {
varargs = [0];