var f = asmLink(asmCompile('global','imp', USE_ASM + 'var ffi=imp.ffi; function g() { return 1 } function f() { var i=0; i=g()|0; return ((ffi(4,5,6,7)|0)+i)|0 } return f'), null, {ffi:ffi});
assertEq(f(1), 23);
var counter = 0; function inc() { return counter++ } function add1(x) { return x+1 } function add2(x,y) { return x+y } function add3(x,y,z) { return x+y+z } function addN() { var sum = 0; for (var i = 0; i < arguments.length; i++)
sum += arguments[i]; return sum;
} var imp = { inc:inc, add1:add1, add2:add2, add3:add3, addN:addN, identity: x => x };
assertAsmTypeFail('glob', 'imp', USE_ASM + 'var inc=imp.inc; function f() { incc() } return f');
assertAsmTypeFail('glob', 'imp', USE_ASM + 'var inc=imp.inc; function f() { var i = 0; return (i + inc)|0 } return f');
assertAsmTypeFail('glob', 'imp', USE_ASM + 'var inc=imp.inc; function f() { inc = 0 } return f');
assertAsmTypeFail('glob', 'imp', USE_ASM + 'var inc=imp.inc; function f() { return (inc() + 1)|0 } return f');
assertAsmTypeFail('glob', 'imp', USE_ASM + 'var inc=imp.inc; function f() { return +((inc()|0) + 1.1) } return f');
assertAsmTypeFail('glob', 'imp', USE_ASM + 'var inc=imp.inc; function f() { return +(inc() + 1.1) } return f');
assertAsmTypeFail('glob', 'imp', USE_ASM + 'var inc=imp.inc; function f() { return (+inc() + 1)|0 } return f');
assertAsmTypeFail('glob', 'imp', USE_ASM + 'var inc=imp.inc; function f() { var i = 0; inc(i>>>0) } return f');
assertAsmTypeFail('glob', 'imp', USE_ASM + 'var inc=imp.inc; function f() { if (0) return inc(); return } return f');
assertAsmTypeFail('glob', 'imp', USE_ASM + 'var inc=imp.inc; function f() { inc(inc()) } return f');
assertAsmTypeFail('glob', 'imp', USE_ASM + 'var inc=imp.inc; function f() { g(inc()) } function g() {} return f');
assertAsmTypeFail('glob', 'imp', USE_ASM + 'var inc=imp.inc; function f() { inc()|inc() } return f');
// Test asm.js => ion paths
setJitCompilerOption("ion.warmup.trigger", 10);
setJitCompilerOption("baseline.warmup.trigger", 0);
setJitCompilerOption("offthread-compilation.enable", 0);
// In registers on x64 and ARM, on the stack for x86 function ffiIntFew(a,b,c,d) { return d+1 } var f = asmLink(asmCompile('glob', 'imp', USE_ASM + 'var ffi=imp.ffi; function f(i) { i=i|0; return ffi(i|0,(i+1)|0,(i+2)|0,(i+3)|0)|0 } return f'), null, {ffi:ffiIntFew}); for (var i = 0; i < 40; i++)
assertEq(f(i), i+4);
// Stack and registers for x64 and ARM, stack for x86 function ffiIntMany(a,b,c,d,e,f,g,h,i,j) { return j+1 } var f = asmLink(asmCompile('glob', 'imp', USE_ASM + 'var ffi=imp.ffi; function f(i) { i=i|0; return ffi(i|0,(i+1)|0,(i+2)|0,(i+3)|0,(i+4)|0,(i+5)|0,(i+6)|0,(i+7)|0,(i+8)|0,(i+9)|0)|0 } return f'), null, {ffi:ffiIntMany}); for (var i = 0; i < 15; i++)
assertEq(f(i), i+10);
// In registers on x64 and ARM, on the stack for x86 function ffiDoubleFew(a,b,c,d) { return d+1 } var f = asmLink(asmCompile('glob', 'imp', USE_ASM + 'var ffi=imp.ffi; function f(i) { i=+i; return +ffi(i,i+1.0,i+2.0,i+3.0) } return f'), null, {ffi:ffiDoubleFew}); for (var i = 0; i < 15; i++)
assertEq(f(i), i+4);
// Stack and registers for x64 and ARM, stack for x86 function ffiDoubleMany(a,b,c,d,e,f,g,h,i,j) { return j+1 } var f = asmLink(asmCompile('glob', 'imp', USE_ASM + 'var ffi=imp.ffi; function f(i) { i=+i; return +ffi(i,i+1.0,i+2.0,i+3.0,i+4.0,i+5.0,i+6.0,i+7.0,i+8.0,i+9.0) } return f'), null, {ffi:ffiDoubleMany}); for (var i = 0; i < 15; i++)
assertEq(f(i), i+10);
// Test the throw path function ffiThrow(n) { if (n == 14) thrownew Error('yolo'); } var f = asmLink(asmCompile('glob', 'imp', USE_ASM + 'var ffi=imp.ffi; function f(i) { i=i|0; ffi(i >> 0); } return f'), null, {ffi:ffiThrow}); var i = 0; try { for (; i < 15; i++)
f(i); throw'assume unreachable';
} catch (e) {
assertEq(e.message, 'yolo');
assertEq(i, 14);
}
// OOL conversion paths var INT32_MAX = Math.pow(2, 31) - 1; function ffiOOLConvertInt(n) { if (n == 40) return valueToConvert; return 42; } var f = asmLink(asmCompile('glob', 'imp', USE_ASM + 'var ffi=imp.ffi; function f(i) { i=i|0; return ffi(i >> 0) | 0; } return f'), null, {ffi:ffiOOLConvertInt}); for (var i = 0; i < 40; i++)
assertEq(f(i), 42);
valueToConvert = INT32_MAX + 1;
assertEq(f(40), INT32_MAX + 1 | 0); function testBadConversions(f) {
valueToConvert = {valueOf: function () { thrownew Error("FAIL"); }};
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.