diff options
author | Alon Zakai <alonzakai@gmail.com> | 2012-11-12 21:10:04 -0800 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2012-11-12 21:10:04 -0800 |
commit | eb6144f24f3379b6de5e59a3811dcaa1514c2b00 (patch) | |
tree | 252f711a8c8b83e43f9bd62110751fe0e8aa2dd1 /src | |
parent | 8beb2562056702c3a7b057fa17ab496758cccb1e (diff) |
handle byval varargs; fixes #705
Diffstat (limited to 'src')
-rw-r--r-- | src/jsifier.js | 26 |
1 files changed, 22 insertions, 4 deletions
diff --git a/src/jsifier.js b/src/jsifier.js index 9c022efb..feb7b74d 100644 --- a/src/jsifier.js +++ b/src/jsifier.js @@ -1148,6 +1148,7 @@ function JSify(data, functionsOnly, givenFunctions) { var argsTypes = []; var varargs = []; var varargsTypes = []; + var varargsByVals = {}; var ignoreFunctionIndexizing = []; var useJSArgs = (shortident + '__jsargs') in LibraryManager.library; var hasVarArgs = isVarArgsFunctionType(type); @@ -1159,10 +1160,18 @@ function JSify(data, functionsOnly, givenFunctions) { args.push(val); argsTypes.push(param.type); } else { + var size; + if (param.byVal) { + varargsByVals[varargs.length] = param.byVal; + size = calcAllocatedSize(removeAllPointing(param.type)); + } else { + size = Runtime.getNativeFieldSize(param.type); + } varargs.push(val); - varargs = varargs.concat(zeros(Runtime.getNativeFieldSize(param.type)-1)); + varargs = varargs.concat(zeros(size-1)); + // TODO: replace concats like this with push varargsTypes.push(param.type); - varargsTypes = varargsTypes.concat(zeros(Runtime.getNativeFieldSize(param.type)-1)); + varargsTypes = varargsTypes.concat(zeros(size-1)); } }); @@ -1182,8 +1191,17 @@ function JSify(data, functionsOnly, givenFunctions) { varargs.map(function(arg, i) { var type = varargsTypes[i]; if (type == 0) return null; - var ret = makeSetValue(getFastValue('tempInt', '+', offset), 0, arg, type, null, null, QUANTUM_SIZE, null, ','); - offset += Runtime.getNativeFieldSize(type); + var ret; + if (!varargsByVals[i]) { + ret = makeSetValue(getFastValue('tempInt', '+', offset), 0, arg, type, null, null, QUANTUM_SIZE, null, ','); + offset += Runtime.getNativeFieldSize(type); + } else { + assert(offset % 4 == 0); // varargs must be aligned + var size = calcAllocatedSize(removeAllPointing(type)); + assert(size % 4 == 0); // varargs must stay aligned + ret = makeCopyValues(getFastValue('tempInt', '+', offset), arg, size, null, null, varargsByVals[i], ','); + offset += size; + } return ret; }).filter(function(arg) { return arg !== null; |