diff options
author | alon@honor <none@none> | 2010-11-02 20:59:52 -0700 |
---|---|---|
committer | alon@honor <none@none> | 2010-11-02 20:59:52 -0700 |
commit | 5a0ba08854750045fd801e536ff49aacc7d2394e (patch) | |
tree | 2a2121e81e0cae9c5dafc16086ded7d62bb9f014 /src/jsifier.js | |
parent | c07e83131ea1f5138d645f39d0ba724fe370ccc1 (diff) |
support for struct/aggregate values in load&store; all tests pass
Diffstat (limited to 'src/jsifier.js')
-rw-r--r-- | src/jsifier.js | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/src/jsifier.js b/src/jsifier.js index 2f79b18c..3b878efe 100644 --- a/src/jsifier.js +++ b/src/jsifier.js @@ -57,6 +57,15 @@ function JSify(data) { } function makeGetValue(ptr, pos, noNeedFirst, type) { + if (isStructType(type)) { + var typeData = TYPES[type]; + var ret = []; + for (var i = 0; i < typeData.fields.length; i++) { + ret.push('f' + i + ': ' + makeGetValue(ptr, pos + typeData.flatIndexes[i], noNeedFirst, typeData.fields[i])); + } + return '{ ' + ret.join(', ') + ' }'; + } + return makeGetSlab(ptr, type) + '[' + calcFastOffset(ptr, pos, noNeedFirst) + ']'; } @@ -68,6 +77,15 @@ function JSify(data) { } function makeSetValue(ptr, pos, value, noNeedFirst, type) { + if (isStructType(type)) { + var typeData = TYPES[type]; + var ret = []; + for (var i = 0; i < typeData.fields.length; i++) { + ret.push(makeSetValue(ptr, pos + typeData.flatIndexes[i], value[i], noNeedFirst, typeData.fields[i])); + } + return ret.join('; '); + } + value = indexizeFunctions(value); var offset = calcFastOffset(ptr, pos, noNeedFirst); if (SAFE_HEAP) { @@ -808,8 +826,12 @@ function JSify(data) { function finalizeLLVMParameter(param) { if (param.intertype in PARSABLE_LLVM_FUNCTIONS) { return finalizeLLVMFunctionCall(param); - } else { + } else if (param.intertype == 'value') { return parseNumerical(param.ident); + } else if (param.intertype == 'structvalue') { + return param.values.map(finalizeLLVMParameter); + } else { + throw 'invalid llvm parameter: ' + param.intertype; } } |