diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/intertyper.js | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/src/intertyper.js b/src/intertyper.js index 5432b1ca..ddb93d71 100644 --- a/src/intertyper.js +++ b/src/intertyper.js @@ -707,18 +707,24 @@ function intertyper(data, sidePass, baseLineNums) { var tokensLeft = item.tokens.slice(2); item.ident = eatLLVMIdent(tokensLeft); if (item.ident == 'asm') { + if (ASM_JS) { + warnOnce('inline JS in asm.js mode can cause the code to no longer fall in the asm.js subset of JavaScript'); + } + assert(TARGET_LE32, 'inline js is only supported in le32'); // Inline assembly is just JavaScript that we paste into the code item.intertype = 'value'; if (tokensLeft[0].text == 'sideeffect') tokensLeft.splice(0, 1); item.ident = tokensLeft[0].text.substr(1, tokensLeft[0].text.length-2) || ';'; // use ; for empty inline assembly var i = 0; - if (tokensLeft[3].item) { // not present in x86 inline asm - splitTokenList(tokensLeft[3].item.tokens).map(function(element) { - var ident = toNiceIdent(element[1].text); - var type = element[0].text; - item.ident = item.ident.replace(new RegExp('\\$' + i++, 'g'), ident); - }); - } + var params = [], args = []; + splitTokenList(tokensLeft[3].item.tokens).map(function(element) { + var ident = toNiceIdent(element[1].text); + var type = element[0].text; + params.push('$' + (i++)); + args.push(ident); + }); + if (item.assignTo) item.ident = 'return ' + item.ident; + item.ident = '(function(' + params + ') { ' + item.ident + ' })(' + args + ');'; return { forward: null, ret: [item], item: item }; } if (item.ident.substr(-2) == '()') { |