memset_tester.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. //-------------------------------------------------------------------------------------------------------
  2. // Copyright (C) Microsoft. All rights reserved.
  3. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
  4. //-------------------------------------------------------------------------------------------------------
  5. function* makeValueGen(a, b) {
  6. // return a for profiling
  7. yield a;
  8. // return b to bailout
  9. yield b;
  10. // return b again to compare with non jit function
  11. yield b;
  12. }
  13. function* makeStartGen() {
  14. yield 0; // for interpreter
  15. yield 32; // for jitted version
  16. yield 32; // for jitted version
  17. }
  18. const global = this;
  19. function RunMemsetTest(tests, arrayTypes, allTypes) {
  20. function makeTest(name, config) {
  21. const f1 = `function ${name}(arr) {
  22. for(var i = 0; i < 15; ++i) {arr[i] = ${config.stringValue};}
  23. return arr;
  24. }`;
  25. const f2 = customName => `function ${customName}P(arr, v) {
  26. for(var i = 1; i < 8; ++i) {arr[i] = v;}
  27. return arr;
  28. }`;
  29. const f3 = `function ${name}V(arr) {
  30. const v = ${config.stringValue};
  31. for(var i = -2; i < 17; ++i) {arr[i] = v;}
  32. return arr;
  33. }`;
  34. const f4 = customName => `function ${customName}Z(arr, start) {
  35. const v = ${config.stringValue};
  36. for(var i = start; i < 5; ++i) {arr[i] = v;}
  37. return arr;
  38. }`;
  39. const extraTests = allTypes.map((diffType, i) => {
  40. const difValue = {f: f2(`${name}W${i}`), compare: f2(`${name}WC${i}`)};
  41. const genValue = makeValueGen(config.stringValue, diffType);
  42. Reflect.defineProperty(difValue, "v", {
  43. get: () => genValue.next().value
  44. });
  45. return difValue;
  46. });
  47. const negativeLengthTest = {f: f4(name), compare: f4(`${name}C`), newForCompare: true};
  48. const genIndex = makeStartGen();
  49. Reflect.defineProperty(negativeLengthTest, "v", {
  50. get: () => genIndex.next().value
  51. });
  52. const tests = [
  53. {f: f1},
  54. {f: f2(name), v: config.v2 !== undefined ? config.v2 : config.stringValue},
  55. {f: f3},
  56. negativeLengthTest
  57. ].concat(extraTests);
  58. const convertTest = function(fnText) {
  59. var fn;
  60. eval(`fn = ${fnText}`);
  61. return fn;
  62. };
  63. for(const t of tests) {
  64. t.f = convertTest(t.f);
  65. t.compare = t.compare && convertTest(t.compare);
  66. }
  67. return tests;
  68. }
  69. let passed = true;
  70. for(const test of tests) {
  71. for(const t of arrayTypes) {
  72. const set1 = makeTest(`${test.name}${t}`, test);
  73. const testSets = [{
  74. set: set1,
  75. getArray() {return new global[t](10);}
  76. }].concat(allTypes.map((diffType, iType) => {
  77. return {
  78. set: makeTest(`${test.name}${t}${iType}`, test).slice(0, 1),
  79. getArray() {const arr = new global[t](10); for(let i = 0; i < 10; ++i) arr[i] = diffType; return arr;}
  80. };
  81. }));
  82. for(const testSet of testSets) {
  83. for(const detail of testSet.set) {
  84. const fn = detail.f;
  85. try {
  86. let a1 = fn(testSet.getArray(), detail.v);
  87. const a2 = fn(testSet.getArray(), detail.v);
  88. if(detail.compare) {
  89. // the optimized version ran with a different value. Run again with a clean function to compare=
  90. a1 = detail.compare(detail.newForCompare ? testSet.getArray() : a1, detail.v);
  91. }
  92. if(a1.length !== a2.length) {
  93. passed = false;
  94. print(`${fn.name} (${t}) didn't return arrays with same length`);
  95. continue;
  96. }
  97. for(let i = 0; i < a1.length; ++i) {
  98. if(a1[i] !== a2[i] && !(isNaN(a1[i]) && isNaN(a2[i]))) {
  99. passed = false;
  100. print(`${fn.name} (${t}): a1[${i}](${a1[i]}) != a2[${i}](${a2[i]})`);
  101. break;
  102. }
  103. }
  104. } catch(e) {
  105. if (e.message.indexOf("Number Expected") !== -1) {
  106. print(e.message);
  107. passed = false;
  108. }
  109. }
  110. }
  111. }
  112. }
  113. }
  114. return passed;
  115. }