mru.js 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  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. var verifyMemoryReclaiming = false;
  6. var forceGc = this.CollectGarbage && !verifyMemoryReclaiming;
  7. var nextIndex = 0;
  8. function runTest(numRegexes) {
  9. var k, s, r;
  10. for(var i = 0; i < 2; ++i) {
  11. for(var j = 0; j < numRegexes; ++j) {
  12. if(verifyMemoryReclaiming && nextIndex & 1)
  13. k = nextIndex;
  14. else
  15. k = j;
  16. ++nextIndex;
  17. k = verifyMemoryReclaiming ? nextIndex++ : j;
  18. s = "a\u0100acdef" + k + " aaababc" + k;
  19. r = new RegExp("a[a\\u0100](?:ab|ac)(?:abc|def|ghi|jkl)" + k, "g");
  20. if(verifyMemoryReclaiming)
  21. s.match(r);
  22. else
  23. match(r, s);
  24. }
  25. if(forceGc)
  26. CollectGarbage();
  27. }
  28. }
  29. do {
  30. runTest(8);
  31. runTest(16);
  32. runTest(32);
  33. runTest(64);
  34. } while(verifyMemoryReclaiming);
  35. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  36. function myToString(o, quoteStrings) {
  37. switch(o) {
  38. case null:
  39. case undefined:
  40. case -Infinity:
  41. case Infinity:
  42. return "" + o;
  43. }
  44. switch(typeof o) {
  45. case "boolean":
  46. return "" + o;
  47. case "number":
  48. {
  49. if(o === 0 && 1 / o < 0)
  50. return "-0";
  51. var s = "" + o;
  52. var i = s.indexOf("e");
  53. var end = i === -1 ? s.length : e;
  54. i = s.indexOf(".");
  55. var start = i === -1 ? 0 : i + 1;
  56. if(start !== 0) {
  57. if((end - start) % 3 !== 0)
  58. end += 3 - (end - start) % 3;
  59. for(i = end - 3; i > start; i -= 3)
  60. s = s.substring(0, i) + "," + s.substring(i);
  61. end = start - 1;
  62. start = 0;
  63. }
  64. for(i = end - 3; i > start; i -= 3)
  65. s = s.substring(0, i) + "," + s.substring(i);
  66. return s;
  67. }
  68. case "string":
  69. {
  70. var hex = "0123456789abcdef";
  71. var s = "";
  72. for(var i = 0; i < o.length; ++i) {
  73. var c = o.charCodeAt(i);
  74. switch(c) {
  75. case 0x0:
  76. s += "\\0";
  77. continue;
  78. case 0x8:
  79. s += "\\b";
  80. continue;
  81. case 0xb:
  82. s += "\\v";
  83. continue;
  84. case 0xc:
  85. s += "\\f";
  86. continue;
  87. }
  88. if(quoteStrings) {
  89. switch(c) {
  90. case 0x9:
  91. s += "\\t";
  92. continue;
  93. case 0xa:
  94. s += "\\n";
  95. continue;
  96. case 0xd:
  97. s += "\\r";
  98. continue;
  99. case 0x22:
  100. s += "\\\"";
  101. continue;
  102. case 0x5c:
  103. s += "\\\\";
  104. continue;
  105. }
  106. }
  107. if(c >= 0x20 && c < 0x7f)
  108. s += o.charAt(i);
  109. else if(c <= 0xff)
  110. s += "\\x" + hex.charAt((c >> 4) & 0xf) + hex.charAt(c & 0xf);
  111. else
  112. s += "\\u" + hex.charAt((c >> 12) & 0xf) + hex.charAt((c >> 8) & 0xf) + hex.charAt((c >> 4) & 0xf) + hex.charAt(c & 0xf);
  113. }
  114. if(quoteStrings)
  115. s = "\"" + s + "\"";
  116. return s;
  117. }
  118. case "object":
  119. case "function":
  120. break;
  121. default:
  122. return "<unknown type '" + typeof o + "'>";
  123. }
  124. if(o instanceof Array) {
  125. var s = "[";
  126. for(var i = 0; i < o.length; ++i) {
  127. if(i)
  128. s += ", ";
  129. s += myToString(o[i], true);
  130. }
  131. return s + "]";
  132. }
  133. if(o instanceof Error)
  134. return o.name + ": " + o.message;
  135. if(o instanceof RegExp)
  136. return o.toString() + (o.lastIndex === 0 ? "" : " (lastIndex: " + o.lastIndex + ")");
  137. if(o instanceof Object && !(o instanceof Function)) {
  138. var s = "";
  139. for(var p in o)
  140. s += myToString(p) + ": " + myToString(o[p], true) + ", ";
  141. if(s.length !== 0)
  142. s = s.substring(0, s.length - ", ".length);
  143. return "{" + s + "}";
  144. }
  145. return "" + o;
  146. }
  147. function echo() {
  148. var doEcho;
  149. if(this.WScript)
  150. doEcho = function (s) { this.WScript.Echo(s); };
  151. else if(this.document)
  152. doEcho = function (s) {
  153. var div = this.document.createElement("div");
  154. div.innerText = s;
  155. this.document.body.appendChild(div);
  156. };
  157. else
  158. doEcho = function (s) { this.print(s); };
  159. echo = function () {
  160. var s = "";
  161. for(var i = 0; i < arguments.length; ++i)
  162. s += myToString(arguments[i]);
  163. doEcho(s);
  164. };
  165. echo.apply(this, arguments);
  166. }
  167. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  168. function exec(r, s) {
  169. echo("exec(", r, ", ", myToString(s, true), ");");
  170. var result = r.exec(s);
  171. echo(result);
  172. return result;
  173. }
  174. function test(r, s) {
  175. echo("test(", r, ", ", myToString(s, true), ");");
  176. var result = r.test(s);
  177. echo(result);
  178. return result;
  179. }
  180. function match(r, s) {
  181. echo("match(", r, ", ", myToString(s, true), ");");
  182. var result = s.match(r);
  183. echo(result);
  184. return result;
  185. }
  186. function replace(r, s, w) {
  187. echo("replace(", myToString(r, true), ", ", myToString(s, true), ", ", myToString(w, true), ");");
  188. var result = s.replace(r, w);
  189. echo(result);
  190. return result;
  191. }
  192. function split(r, s) {
  193. echo("split(", r, ", ", myToString(s, true), ");");
  194. var result = s.split(r);
  195. echo(result);
  196. return result;
  197. }
  198. function search(r, s) {
  199. echo("search(", r, ", ", myToString(s, true), ");");
  200. var result = s.search(r);
  201. echo(result);
  202. return result;
  203. }